commit 271bad1bec6fa0913adad3cdf492528440794d2a Author: Aryankc2 Date: Thu Feb 20 10:49:24 2025 +0530 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f01fbe6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Gradle files +.gradle/ +build/ +out/ +local.properties + +# Android Studio specific +.idea/ +*.iml +*.iws +*.ipr + +# OS-specific files +.DS_Store +Thumbs.db + +# Android specific +*.apk +*.ap_ +*.dex +*.class +*.jar +*.keystore +*.jks + +# Proguard folder +proguard/ + +# Android Studio + Kotlin +.caches/ +.kotlinc/ + +# IntelliJ +.idea/ +*.iml + +# Log files +*.log +*.out + +# Temporary files +*.swp +*.swo + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/alipay/alipaySdk-15.7.4.aar b/alipay/alipaySdk-15.7.4.aar new file mode 100644 index 0000000..11115e1 Binary files /dev/null and b/alipay/alipaySdk-15.7.4.aar differ diff --git a/alipay/build.gradle b/alipay/build.gradle new file mode 100644 index 0000000..c0512e2 --- /dev/null +++ b/alipay/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('alipaySdk-15.7.4.aar')) \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/InfoApp b/app/InfoApp new file mode 100644 index 0000000..7e7a0a0 --- /dev/null +++ b/app/InfoApp @@ -0,0 +1,8 @@ +//Things to Follow + +1) Add Product Flavour For New App +2) For Facebook Login Change keys in string file +3) Add new json file and change corresponding in string file +4) Make colors accordingly +5) Check link urls from string file update new ons +6) diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..6e44eb6 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,455 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +apply plugin: 'kotlin-kapt' + + +android { + compileSdk 34 + //compileSdk 34 + defaultConfig { + applicationId "com.consultantapp" + minSdkVersion 24 + targetSdkVersion 34 + versionCode 14 + versionName "1.0.13" + multiDexEnabled true + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + renderscriptTargetApi 21 + renderscriptSupportModeEnabled true + + } + + signingConfigs { + debug { + storeFile file("consultapp.jks") + keyAlias "consultapp" + keyPassword "codebrew" + storePassword "codebrew" + } + release { + storeFile file("consultapp.jks") + keyAlias "consultapp" + keyPassword "codebrew" + storePassword "codebrew" + } + } + + /* lovenavigator creds */ + +// storeFile file("lovenavigator") +// keyAlias "lovenavigatoruser" +// keyPassword "lovenavigatoruser" +// storePassword "lovenavigatoruser" + + flavorDimensions "app" + productFlavors { + consult { + dimension "app" + applicationId "com.lovenavigatoruser" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"a59ef14422c898df221e0f4da0ed85611\"" + buildConfigField 'String', 'BASE_URL', "\"https://peercation.netsolutionindia.com/\"" + } + + } + + flavorDimensions "app" + productFlavors { + consult { + dimension "app" + applicationId "com.consultantapp" + versionCode 6 + versionName "1.0.5" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"a59ef14422c898df221e0f4da0ed85611\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + } + + homeDoctor { + dimension "app" + applicationId "com.homeDoctor.user" + versionCode 17 + versionName "1.1.7" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"cee2fff85b65c53502034e689c65001611\"" + buildConfigField 'String', 'BASE_URL', "\"https://calladmin.inhomed.com/\"" + } + nurseLynx { + dimension "app" + applicationId "com.nurseLynx.user" + versionCode 14 + versionName "1.0.13" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"c6b484d83fb21425453dcd0af6c1f01b15\"" + // buildConfigField 'String', 'BASE_URL', "\"https://nurselynx.royoconsult.com/\"" + buildConfigField 'String', 'BASE_URL', "\"https://nurselynx.netsolutionindia.com/\"" + } + taradoc { + dimension "app" + applicationId "com.taradoc.user" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"bb4722d01caf2daca69bde408f3829c917\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + } + clouddoc { + dimension "app" + applicationId "com.clouddoc.user" + versionCode 2 + versionName "1.0.1" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"eee7f84ccfb6ef2223ec464ab4e9309318\"" + // buildConfigField 'String', 'BASE_URL', "\"https://api.clouddoconline.com/\"" + buildConfigField 'String', 'BASE_URL', "\"https://nurselynxx.dmlabs.in/\"" + } + meetMd { + dimension "app" + applicationId "com.meetmd.user" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"69ad7d22541dba7a2f9e739bd117f93420\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + } + + /*airdoc { + dimension "app" + applicationId "com.airdoc.user" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"97cbe68ed1c26aaf7ac5b64659da6b9c14\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + }*/ + + /*heal { + dimension "app" + applicationId "com.heal.user" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"27e6f7e43e86c5d9f73ad41dab4cba2210\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + }*/ + + /* edu { + dimension "app" + applicationId "com.edu.user" + versionCode 2 + versionName "1.0.1" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"a3a6ed3c5f13b4221bb36348cee600e29\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + } + marketplace { + dimension "app" + applicationId "com.marketplace.user" + versionCode 2 + versionName "1.0.1" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"f5f12e693a14390512c43c4664218d3a8\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + } + healthcare { + dimension "app" + applicationId "com.healthcare.app" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"4f0aef8585d484ec98e4e7d0d302a6205\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + }*/ + + hexalud { + dimension "app" + applicationId "com.hexalud.user" + versionCode 1 + versionName "1.0.0" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"1c4c61782ee23458ee9b679e6c75d30330\"" + buildConfigField 'String', 'BASE_URL', "\"https://royoconsult.com/\"" + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled false + debuggable false + shrinkResources false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + signingConfig signingConfigs.debug + debuggable true + minifyEnabled false + shrinkResources false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + configurations { + all { // You should exclude one of them not both of them + exclude group: "com.android.support", module: "support-core-ui" + exclude group: "com.android.support", module: "support-compat" + } + } + + lintOptions { + checkReleaseBuilds false + abortOnError false + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = "11" + } + dataBinding { + enabled = true + } + + bundle { + language { + // Specifies that the app bundle should not support + // configuration APKs for language resources. These + // resources are instead packaged with each base and + // dynamic feature APK. + enableSplit = false + } + } + + packagingOptions { + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/LICENSE' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/license.txt' + exclude 'META-INF/NOTICE' + exclude 'META-INF/NOTICE.txt' + exclude 'META-INF/notice.txt' + exclude 'META-INF/ASL2.0' + exclude("META-INF/*.kotlin_module") + } +} + + +allprojects { + repositories { + /* maven { url "https://jcenter.bintray.com"} + maven { url 'https://jitpack.io' }*/ + maven { url 'https://jitpack.io' } + maven { url "https://jcenter.bintray.com"} + maven { url "https://repo.spring.io/libs-release" } + google() + jcenter() + } + + /* kapt { + generateStubs = true + correctErrorTypes = true + }*/ +} + + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" + // implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20" + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + implementation 'com.google.android.gms:play-services-maps:17.0.1' + testImplementation 'junit:junit:4.13.2' + implementation 'com.github.aabhasr1:OtpView:v1.1.2-ktx' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +// implementation 'com.whiteelephant:monthandyearpicker:1.3.0' +// implementation 'com.github.smarteist:autoimageslider:1.3.9' + implementation "com.github.bumptech.glide:glide:4.11.0" + + /*LIFECYCLE COMPONENTS*/ + implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0" + + /*COUNTRY CODE PICKER*/ + implementation 'com.hbb20:ccp:2.4.7' + + /*ANDROID SUPPORT*/ + implementation 'androidx.recyclerview:recyclerview:1.2.1' + + /*MATERIAL COMPONENTS*/ + implementation 'com.google.android.material:material:1.4.0' + + /*KOTLIN*/ + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8' + implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' + + /*PIN VIEW*/ + //implementation "com.chaos.view:pinview:1.4.3" + implementation 'io.github.chaosleung:pinview:1.4.4' + + /*RETROFIT*/ + def retrofitVersion = '2.9.0' + implementation "com.squareup.retrofit2:retrofit:$retrofitVersion" + implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion" + implementation "com.squareup.retrofit2:converter-scalars:$retrofitVersion" + implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion" + + /*OK HTTP*/ + implementation "com.squareup.okhttp3:okhttp:4.9.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.9.0" + + /*DAGGER*/ + implementation "com.google.dagger:dagger-android:2.37" + implementation "com.google.dagger:dagger-android-support:2.37" + kapt "com.google.dagger:dagger-android-processor:2.37" + kapt "com.google.dagger:dagger-compiler:2.37" + + /*TIMBER*/ + implementation "com.jakewharton.timber:timber:4.7.1" + + /*Firebase*/ + implementation 'com.google.firebase:firebase-messaging:22.0.0' + implementation 'com.google.firebase:firebase-core:19.0.1' + implementation 'com.google.firebase:firebase-analytics-ktx:19.0.1' + implementation 'com.google.firebase:firebase-dynamic-links-ktx:20.1.1' + + // Add the Firebase crashlytics dependency. + implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.1' + + /*ROUNDED IMAGE VIEW*/ + implementation 'com.makeramen:roundedimageview:2.3.0' + + /*FACEBOOK*/ + // implementation 'com.facebook.android:facebook-android-sdk:8.1.0' + + //Google sign in dependency + implementation 'com.google.android.gms:play-services-auth:19.2.0' + implementation 'com.google.firebase:firebase-auth:21.0.1' + implementation 'com.google.android.gms:play-services-location:18.0.0' + implementation 'com.google.android.libraries.places:places:2.2.0' + implementation "androidx.exifinterface:exifinterface:1.3.6" + + /*Image Doc Picker*/ + // implementation 'com.droidninja:filepicker:2.2.5' + + /*GLIDE*/ + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + + /*PERMISSION DISPATCHER*/ + /* implementation "com.github.hotchemi:permissionsdispatcher:4.8.0" + kapt "com.github.hotchemi:permissionsdispatcher-processor:4.8.0"*/ + + implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.8.0" + kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.8.0" + + /*Socket*/ + implementation('io.socket:socket.io-client:1.0.0') { + exclude group: 'org.json', module: 'json' + } + + /*Compress image*/ + // implementation 'id.zelory:compressor:2.1.0' + implementation 'id.zelory:compressor:3.0.1' + + /*View full image*/ + /*need to replace code show full image*/ + // implementation 'com.github.stfalcon:frescoimageviewer:0.5.0' + // implementation 'com.facebook.fresco:fresco:2.4.0' + + // Jitsi Meet +// implementation('org.jitsi.react:jitsi-meet-sdk:2.9.3') { transitive = true } + implementation('org.jitsi.react:jitsi-meet-sdk:5.1.0') { transitive = true } + + /*PAGER INDICATOR*/ + // implementation 'me.relex:circleindicator:2.1.4' + implementation 'me.relex:circleindicator:2.1.6' + + /*Razor Pay*/ + /*Crash in latest version*/ + implementation 'com.razorpay:checkout:1.6.7' + + /*Card Form*/ + implementation 'com.braintreepayments:card-form:5.0.0' + + /*Animations*/ + implementation "com.airbnb.android:lottie:3.4.4" + + /*Date Picker*/ + // implementation 'com.github.florent37:singledateandtimepicker:2.2.6' + implementation 'com.github.florent37:singledateandtimepicker:2.2.7' + + /*Read More TextView*/ + //implementation 'com.borjabravo:readmoretextview:2.1.0' + + /*Bmi*/ + //implementation 'com.ekn.gruzer.gaugelibrary:gaugelibrary:0.1.0' + implementation 'com.github.Gruzer:simple-gauge-android:0.3.1' + + // implementation 'pl.pawelkleczkowski.customgauge:CustomGauge:1.0.3' + + + //recordView + // implementation 'com.devlomi.record-view:record-view:2.0.1' + + //for AndroidX use: + implementation 'com.github.3llomi:RecordView:3.1.3' + + //Hyper Pay + implementation 'com.google.android.gms:play-services-wallet:18.1.3' + implementation 'io.card:android-sdk:5.5.1' + implementation project(path: ':alipay') + implementation project(path: ':oppwa.mobile') + + //Snap-Kit + implementation([ + 'com.snapchat.kit.sdk:login:1.12.0', + 'com.snapchat.kit.sdk:core:1.12.0' + ]) + + /*Contact Picker*/ + // implementation 'com.github.broakenmedia:MultiContactPicker:1.8.5' + // implementation 'com.l4digital.fastscroll:fastscroll:1.1.2' + // implementation "io.github.l4digital:fastscroll:2.1.0" + + //Twitter +// implementation('com.twitter.sdk.android:twitter:3.3.0@aar') { +// transitive = true +// } + + //AppsFlyer + implementation 'com.appsflyer:af-android-sdk:6.3.2' + + //Pdf Viewer + /*comment for now*/ + // implementation 'com.github.barteksc:android-pdf-viewer:2.8.2' + + implementation 'de.hdodenhof:circleimageview:3.1.0' + implementation 'com.karumi:dexter:6.2.3' + implementation 'androidx.work:work-runtime-ktx:2.7.1' + + + //Volley + implementation 'com.android.volley:volley:1.2.1' + + //Country code picker + implementation 'io.michaelrocks:libphonenumber-android:8.13.35' + + // implementation "io.github.l4digital:fastscroll:1.1.2" + //implementation 'com.miguelcatalan:materialsearchview:1.3.0' + + implementation 'com.facebook.soloader:soloader:0.11.0' + + implementation 'com.1gravity:android-contactpicker:1.4.0' + +} + +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' + +//api key Q4dvLX3kpCax6Qbm7iZHt6buJ +//api secret key FZZtKKLhFajOUFcDuHG869ty3f50F5JB0KHStHdGNBDde4wTfR + + diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..094e0f3 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,114 @@ +{ + "project_info": { + "project_number": "1032811457113", + "project_id": "nurselynx-2fb1c", + "storage_bucket": "nurselynx-2fb1c.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1032811457113:android:6101978baed2c4e5f7df48", + "android_client_info": { + "package_name": "com.nurseLynx.expert" + } + }, + "oauth_client": [ + { + "client_id": "1032811457113-07iuipiq574b2kptmhgs29466m4039va.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.expert", + "certificate_hash": "3361f698a0d60d6d3eac4f81ff039897e1550f00" + } + }, + { + "client_id": "1032811457113-ledsgoe1si7i3g8tnv8ttfsrnd0pufkb.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1032811457113-b8nur4jtaoql7s7k8rl4cpe2qoh67r24.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDYOYmjHI3DXYrWpmfmD4Ekg3YXVcwiZOg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1032811457113-8564gftp1oes9s415mva42ch6di8njkj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1032811457113-l5u532a9ppl05h2vl6k4hs59393i5h99.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.nurseLynx.user" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1032811457113:android:8985de8c8a94813df7df48", + "android_client_info": { + "package_name": "com.nurseLynx.user" + } + }, + "oauth_client": [ + { + "client_id": "1032811457113-f9gkf2vvpgoo67sgnilnii2hojte2ugf.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.user", + "certificate_hash": "5f9881411557ba40bc3bf7ec8967f0750b1d55b2" + } + }, + { + "client_id": "1032811457113-u2qflc4bogl7mne10cg6ukv3nqkit4ee.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1032811457113-b8nur4jtaoql7s7k8rl4cpe2qoh67r24.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDYOYmjHI3DXYrWpmfmD4Ekg3YXVcwiZOg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1032811457113-8564gftp1oes9s415mva42ch6di8njkj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1032811457113-l5u532a9ppl05h2vl6k4hs59393i5h99.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.nurseLynx.user" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/homeDoctor/release/app-homeDoctor-user.aab b/app/homeDoctor/release/app-homeDoctor-user.aab new file mode 100644 index 0000000..840a24e Binary files /dev/null and b/app/homeDoctor/release/app-homeDoctor-user.aab differ diff --git a/app/nurseLynx/release/nurseLynx-user@30jan24-release.aab b/app/nurseLynx/release/nurseLynx-user@30jan24-release.aab new file mode 100644 index 0000000..3910d46 Binary files /dev/null and b/app/nurseLynx/release/nurseLynx-user@30jan24-release.aab differ diff --git a/app/nurseLynx/release/output-metadata.json b/app/nurseLynx/release/output-metadata.json new file mode 100644 index 0000000..5d29c5e --- /dev/null +++ b/app/nurseLynx/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.nurseLynx.user", + "variantName": "nurseLynxRelease", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 12, + "versionName": "1.0.11", + "outputFile": "app-nurseLynx-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/private_key.pepk b/app/private_key.pepk new file mode 100644 index 0000000..0fe8764 Binary files /dev/null and b/app/private_key.pepk differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..42f6789 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,273 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + + + +-dontwarn android.databinding.** +-keep class android.databinding.** { *; } + + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +-keepclassmembers class fqcn.of.javascript.interface.for.webview {public *;} + + +##---------------Begin: proguard configuration for Retrofit ---------- + +# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and +# EnclosingMethod is required to use InnerClasses. +-keepattributes Signature, InnerClasses, EnclosingMethod + +# Retrofit does reflection on method and parameter annotations. +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations + +# Retain service method parameters when optimizing. +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} + +# Ignore annotation used for build tooling. +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement + +# Ignore JSR 305 annotations for embedding nullability information. +-dontwarn javax.annotation.** + +# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath. +-dontwarn kotlin.Unit + +# Top-level functions that can only be used by Kotlin. +-dontwarn retrofit2.KotlinExtensions + +# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy +# and replaces all potential values with null. Explicitly keeping the interfaces prevents this. +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +##---------------End: proguard configuration for Retrofit ---------- + + + + +##---------------Begin: proguard configuration for Gson ---------- +# Gson uses generic type information stored in a class file when working with fields. Proguard +# removes such information by default, so configure it to keep all of it. +-keepattributes Signature + +# For using GSON @Expose annotation +-keepattributes Annotation + +# Gson specific classes +-dontwarn sun.misc.** +-keep class com.google.gson.stream.** { *; } + +# Application classes that will be serialized/deserialized over Gson +-keep class com.coaching.data.** { *; } + +# Prevent proguard from stripping interface information from TypeAdapterFactory, +# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) +-keep class * implements com.google.gson.TypeAdapterFactory +-keep class * implements com.google.gson.JsonSerializer +-keep class * implements com.google.gson.JsonDeserializer + +##---------------End: proguard configuration for Gson ---------- + + + +# JSR 305 annotations are for embedding nullability information. +-dontwarn javax.annotation.** + +# A resource is loaded with a relative path so the package of this class must be preserved. +-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase + +# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. +-dontwarn org.codehaus.mojo.animal_sniffer.* + +# OkHttp platform used only on JVM and when Conscrypt dependency is available. +-dontwarn okhttp3.internal.platform.ConscryptPlatform + + +##---------------Begin: proguard configuration for Glide ---------- +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +##---------------End: proguard configuration for Glide ---------- + + +##---------------Begin: proguard configuration for Jitsi ---------- + +-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip +-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters +-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip + +# Do not strip any method/class that is annotated with @DoNotStrip +-keep @com.facebook.proguard.annotations.DoNotStrip class * +-keep @com.facebook.common.internal.DoNotStrip class * +-keepclassmembers class * { + @com.facebook.proguard.annotations.DoNotStrip *; + @com.facebook.common.internal.DoNotStrip *; +} + +-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { + void set*(***); + *** get*(); +} + +-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } +-keep class * extends com.facebook.react.bridge.NativeModule { *; } +-keepclassmembers,includedescriptorclasses class * { native ; } +-keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } + +-dontwarn com.facebook.react.** +-keep,includedescriptorclasses class com.facebook.react.bridge.** { *; } + +# okhttp + +-keepattributes Signature +-keepattributes *Annotation* +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-dontwarn okhttp3.** + +# okio + +-keep class sun.misc.Unsafe { *; } +-dontwarn java.nio.file.* +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-keep class okio.** { *; } +-dontwarn okio.** + +# WebRTC + +-keep class org.webrtc.** { *; } +-dontwarn org.chromium.build.BuildHooksAndroid + +# Jisti Meet SDK + +-keep class org.jitsi.meet.** { *; } +-keep class org.jitsi.meet.sdk.** { *; } + +# We added the following when we switched minifyEnabled on. Probably because we +# ran the app and hit problems... + +-keep class com.facebook.react.bridge.CatalystInstanceImpl { *; } +-keep class com.facebook.react.bridge.ExecutorToken { *; } +-keep class com.facebook.react.bridge.JavaScriptExecutor { *; } +-keep class com.facebook.react.bridge.ModuleRegistryHolder { *; } +-keep class com.facebook.react.bridge.ReadableType { *; } +-keep class com.facebook.react.bridge.queue.NativeRunnable { *; } +-keep class com.facebook.react.devsupport.** { *; } + +-dontwarn com.facebook.react.devsupport.** +-dontwarn com.google.appengine.** +-dontwarn com.squareup.okhttp.** +-dontwarn javax.servlet.** + +# ^^^ We added the above when we switched minifyEnabled on. + +# Rule to avoid build errors related to SVGs. +-keep public class com.horcrux.svg.** {*;} + +# Hermes +-keep class com.facebook.hermes.unicode.** { *; } + +##---------------End: proguard configuration for Jitsi ---------- + + +##---------------Begin: proguard configuration for RazorPay ---------- +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +-keepattributes JavascriptInterface +-keepattributes *Annotation* + +-dontwarn com.razorpay.** +-keep class com.razorpay.** {*;} + +-optimizations !method/inlining/* + +-keepclasseswithmembers class * { + public void onPayment*(...); +} +##---------------End: proguard configuration for RazorPay ---------- + +##---------------Start: proguard configuration for picker ---------- +# Glide +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +# support-v7-appcompat +-keep public class android.support.v7.widget.** { *; } +-keep public class android.support.v7.internal.widget.** { *; } +-keep public class android.support.v7.internal.view.menu.** { *; } +-keep public class * extends android.support.v4.view.ActionProvider { + public (android.content.Context); +} +# support-design +-dontwarn android.support.design.** +-keep class android.support.design.** { *; } +-keep interface android.support.design.** { *; } +-keep public class android.support.design.R$* { *; } +##---------------End: proguard configuration for Picker ---------- + +##---------------Begin: proguard configuration for image picker ---------- +# Glide +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# Uncomment for DexGuard only +#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule + +##---------------End: proguard configuration for image picker ---------- + +##---------------Begin: proguard configuration for threetenabp ---------- + +# Keep class members used for serialization +# https://www.guardsquare.com/en/products/proguard/manual/examples#serializable +-keepclassmembers class org.threeten.bp.** implements java.io.Serializable { + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); + +} +##---------------End: proguard configuration for threetenabp ---------- + + diff --git a/app/src/airdoc/Info b/app/src/airdoc/Info new file mode 100644 index 0000000..aca38f3 --- /dev/null +++ b/app/src/airdoc/Info @@ -0,0 +1,11 @@ +//Server Key +AAAA38hjuQs:APA91bGYEl4yefDaRpe0yv9w4Pc7HYrSZL413WW0pJB5-YqkwCKr3zNFvTvm3xZI4LlJMwDor6XJcl5Wn8ctwaY62_vSvwlCrFVrHhL2el-h4Z1tZEmSQ1KiacR8cgV944thVNl8X2Co + +//Google + +//Facebook +developer.codebrew@gmail.com +developer@facebook +//Fb Ids +680508489286924 +816fc4b097ea81a5784e4cec2a4dc84e \ No newline at end of file diff --git a/app/src/airdoc/google-services.json b/app/src/airdoc/google-services.json new file mode 100644 index 0000000..2b9910b --- /dev/null +++ b/app/src/airdoc/google-services.json @@ -0,0 +1,54 @@ +{ + "project_info": { + "project_number": "961139685643", + "project_id": "airdoc-37725", + "storage_bucket": "airdoc-37725.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:961139685643:android:d9d2ca2e47e15152d20a0e", + "android_client_info": { + "package_name": "com.airdoc.user" + } + }, + "oauth_client": [ + { + "client_id": "961139685643-42lt5fvg94u6eu5e6vq34em502olbdkg.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.airdoc.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDRIdPYeDPzQ2FuWZMvqnnKzPBTu8PL_yQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "961139685643-2rg4aq24vesm5quvs80nifgug3a43k51.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.airdoc.user" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/airdoc/ic_launcher-playstore.png b/app/src/airdoc/ic_launcher-playstore.png new file mode 100644 index 0000000..e07d5c6 Binary files /dev/null and b/app/src/airdoc/ic_launcher-playstore.png differ diff --git a/app/src/airdoc/res/drawable-hdpi/ic_logo_home.png b/app/src/airdoc/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..56c9c6e Binary files /dev/null and b/app/src/airdoc/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/airdoc/res/drawable-hdpi/ic_push.png b/app/src/airdoc/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..c2ce7a6 Binary files /dev/null and b/app/src/airdoc/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-hdpi/ic_splash.png b/app/src/airdoc/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..f821fbd Binary files /dev/null and b/app/src/airdoc/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-mdpi/ic_logo_home.png b/app/src/airdoc/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..7629654 Binary files /dev/null and b/app/src/airdoc/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/airdoc/res/drawable-mdpi/ic_push.png b/app/src/airdoc/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..67b45a3 Binary files /dev/null and b/app/src/airdoc/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-mdpi/ic_splash.png b/app/src/airdoc/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..36fc3e4 Binary files /dev/null and b/app/src/airdoc/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-xhdpi/ic_logo_home.png b/app/src/airdoc/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..d06625d Binary files /dev/null and b/app/src/airdoc/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/airdoc/res/drawable-xhdpi/ic_push.png b/app/src/airdoc/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..b12a2d3 Binary files /dev/null and b/app/src/airdoc/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-xhdpi/ic_splash.png b/app/src/airdoc/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..2b94629 Binary files /dev/null and b/app/src/airdoc/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-xxhdpi/ic_logo_home.png b/app/src/airdoc/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..afa82a9 Binary files /dev/null and b/app/src/airdoc/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/airdoc/res/drawable-xxhdpi/ic_push.png b/app/src/airdoc/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..86045a8 Binary files /dev/null and b/app/src/airdoc/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-xxhdpi/ic_splash.png b/app/src/airdoc/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..5004564 Binary files /dev/null and b/app/src/airdoc/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/airdoc/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..5223a2a Binary files /dev/null and b/app/src/airdoc/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/airdoc/res/drawable-xxxhdpi/ic_push.png b/app/src/airdoc/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..f3d5eed Binary files /dev/null and b/app/src/airdoc/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-xxxhdpi/ic_splash.png b/app/src/airdoc/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..a04e05f Binary files /dev/null and b/app/src/airdoc/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable/ic_launcher_foreground.xml b/app/src/airdoc/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/airdoc/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/airdoc/res/mipmap-hdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..2c02a5c Binary files /dev/null and b/app/src/airdoc/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..b98344d Binary files /dev/null and b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-hdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..ff68407 Binary files /dev/null and b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-mdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..e6cc811 Binary files /dev/null and b/app/src/airdoc/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3fbbe0f Binary files /dev/null and b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-mdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..9682abe Binary files /dev/null and b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-xhdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e662e66 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..e8d04de Binary files /dev/null and b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..91b3402 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..855623b Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..dc10ed1 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5fdf85e Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..616a3a3 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d2f07b9 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..a0e6189 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/values/colors.xml b/app/src/airdoc/res/values/colors.xml new file mode 100644 index 0000000..d50346a --- /dev/null +++ b/app/src/airdoc/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #0BC3D4 + #0BC3D4 + #0BC3D4 + + #330BC3D4 + diff --git a/app/src/airdoc/res/values/ic_launcher_background.xml b/app/src/airdoc/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..f1d5df0 --- /dev/null +++ b/app/src/airdoc/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #F1F0F0 + \ No newline at end of file diff --git a/app/src/airdoc/res/values/strings.xml b/app/src/airdoc/res/values/strings.xml new file mode 100644 index 0000000..041adb8 --- /dev/null +++ b/app/src/airdoc/res/values/strings.xml @@ -0,0 +1,278 @@ + + AirDoc + + + 816694742513784 + fb816694742513784 + + + airdocapp.page.link + com.airdoc.user + + + AIzaSyDRIdPYeDPzQ2FuWZMvqnnKzPBTu8PL_yQ + 961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + With Experts + Meet + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + Login + Facebook + Google + Login using Email + Sign Up using Email + Continue for %s + New user? + Sign Up + Let’s Get Started ! + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + Clients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Already Register? + Edit + Age: + Enter Phone Number + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + No Slot available + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + Cancel + Available balance + Pay out + Add Money + Add + Please enter amount + Added to wallet + Add Card + Type your message… + Photo + Enter message + Today + Yesterday + Transaction History + Paid to\n%s + Refund from\n%s + Select card + New Request + Accepted + In progress + No show + Cancelled + %s Card ending with %s + NA + Write down your reviews + Submit + Please give Feedback + please select rating + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + years + Rating + %s · %s Reviews + Request completed + Insufficient amount + You need to maintain sufficient balance of %s to create request + Schedule Request + Request Now + Select date + Select time + + Search for %s + Profile + %s/%s + Set Filter + Choose date & time + Tomorrow + Clear All + Booking Details + Appointment date & timings + Confirm Booking + %s · %s + %s-%s + Add Coupon Code + Price Detail + Sub-Total + Total + Promo Applied + By Booking this appointment, you agree to\nthe terms & conditions + Schedule a meeting + Consult + Consult for %s \n at %s + Edit Slot + Sign Up with Phone Number + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Already have an account? + Apply + Minute + Input amount + Pay + Cancel appointment + Re-Schedule + Consult a Doctor + %s ]]> + %s User Remaining ]]> + %s Discount on booking a %s till %s ]]> + Please add valid coupon + Are you sure you want to cancel appointment? + Transaction failed + Delete + Are you sure you want to delete this card? + Edit card + Rate + Morning + Evening + Afternoon + Book again + Connecting… + Disconnecting… + Transaction Success + Transaction Failed + + + No Category! + Categories will shown here once added. + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + Recharge your wallet to create booking! + Once you add money or any deduction will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No appointments history! + No Appointments scheduled. + No experts yet! + Currently not any expert registered under \'%s\', so come back later. + + + + Share + Checkout this post + Hey, Here is app for Online Consultancy Platform. You should try it. + Payment + Address + + View all + View Prescription + All + Details + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login With + + + Consult Online + Home Care Appointment + Clinic Appointment + + + Estimate Time of Arrival : %s + Status : + On the way + Reached Destination + Arrived + Started + Completed + Track Status + Quit + Are you sure you want to quit? It will stop your tracking + We will need your call permission to give you better experience + Service completed + Give Feedback + Cancelled Service + + + Language + Please choose your language + English + عربى + Account Setting + + + Request Sent successfully! + Your password changed successfully! + Patient added successfully! + + + View map + Google map application not found + Distance + Date + Time + Service Type + + Slide To Cancel + View Details + Price + Prescription detail + Downloading… + diff --git a/app/src/androidTest/java/com/consultantapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/consultantapp/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..ade531f --- /dev/null +++ b/app/src/androidTest/java/com/consultantapp/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.consultantapp + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.consultantapp", appContext.packageName) + } +} diff --git a/app/src/clouddoc/Info b/app/src/clouddoc/Info new file mode 100644 index 0000000..999b5de --- /dev/null +++ b/app/src/clouddoc/Info @@ -0,0 +1,15 @@ +//Server Key +AAAAfuO3mJo:APA91bEWlsEv80Wi5oeTMc4xg9eA9X6JKf6yZD1rTwHJvtHDZd2w4sO8bcNUev73_1mDEr7KA-6A6cIYdiBIgHf8INI39tRDimzYD399whE0dawW5bEuXpFE0T_IlcDagkhHBmEDRYZ9 + +//Google + +//Facebook +developer.codebrew@gmail.com +developer@facebook +//Fb Ids +879961852793008 +4db61a5432be3ddfe7fcaab6cb90b9f7 + + +D6:F4:D3:47:5D:60:97:99:79:B7:5C:D0:1B:72:D1:0A:F0:DE:44:5A +23:E8:E2:19:1E:70:1A:8F:23:2E:A6:92:58:91:6E:9D:92:6D:A1:5C:ED:D1:B7:5B:25:C9:2E:4C:1C:EC:90:9B \ No newline at end of file diff --git a/app/src/clouddoc/google-services.json b/app/src/clouddoc/google-services.json new file mode 100644 index 0000000..d27d790 --- /dev/null +++ b/app/src/clouddoc/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "544986339482", + "project_id": "clouddoc-93eee", + "storage_bucket": "clouddoc-93eee.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:544986339482:android:8f3596d8487b396b64e723", + "android_client_info": { + "package_name": "com.clouddoc.user" + } + }, + "oauth_client": [ + { + "client_id": "544986339482-p2n3164tumimvt5mr2kv5bl9pptf2kml.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.clouddoc.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD6xTauBy54YTN2pvv0ScEOSnLRqO1YPhk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/clouddoc/ic_launcher-playstore.png b/app/src/clouddoc/ic_launcher-playstore.png new file mode 100644 index 0000000..de64599 Binary files /dev/null and b/app/src/clouddoc/ic_launcher-playstore.png differ diff --git a/app/src/clouddoc/res/drawable-hdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-hdpi/ic_splash.jpg new file mode 100644 index 0000000..fff4234 Binary files /dev/null and b/app/src/clouddoc/res/drawable-hdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-mdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-mdpi/ic_splash.jpg new file mode 100644 index 0000000..5c8c558 Binary files /dev/null and b/app/src/clouddoc/res/drawable-mdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-xhdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-xhdpi/ic_splash.jpg new file mode 100644 index 0000000..8cb0ba6 Binary files /dev/null and b/app/src/clouddoc/res/drawable-xhdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-xxhdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-xxhdpi/ic_splash.jpg new file mode 100644 index 0000000..3f5f50d Binary files /dev/null and b/app/src/clouddoc/res/drawable-xxhdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-xxxhdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-xxxhdpi/ic_splash.jpg new file mode 100644 index 0000000..4266736 Binary files /dev/null and b/app/src/clouddoc/res/drawable-xxxhdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable/ic_launcher_foreground.xml b/app/src/clouddoc/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/clouddoc/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/clouddoc/res/drawable/ic_logo_home.xml b/app/src/clouddoc/res/drawable/ic_logo_home.xml new file mode 100644 index 0000000..2d64995 --- /dev/null +++ b/app/src/clouddoc/res/drawable/ic_logo_home.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/clouddoc/res/drawable/ic_push.xml b/app/src/clouddoc/res/drawable/ic_push.xml new file mode 100644 index 0000000..48ec99a --- /dev/null +++ b/app/src/clouddoc/res/drawable/ic_push.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/clouddoc/res/mipmap-hdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..9966c5f Binary files /dev/null and b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..fe73f77 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..3b95d34 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-mdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..f180614 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..4b9e2f6 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..46687bc Binary files /dev/null and b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..70c9e90 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..78847d1 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..1858c10 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..bf4beba Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5d3e7c1 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..036125e Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..e4c6116 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2fab603 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..db30155 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/values/colors.xml b/app/src/clouddoc/res/values/colors.xml new file mode 100644 index 0000000..9fe6fb5 --- /dev/null +++ b/app/src/clouddoc/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #2A5C30 + #2A5C30 + #2A5C30 + + #3839C6C0 + #332A5C30 + diff --git a/app/src/clouddoc/res/values/ic_launcher_background.xml b/app/src/clouddoc/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..32686f2 --- /dev/null +++ b/app/src/clouddoc/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #36E201 + \ No newline at end of file diff --git a/app/src/clouddoc/res/values/strings.xml b/app/src/clouddoc/res/values/strings.xml new file mode 100644 index 0000000..0cb161e --- /dev/null +++ b/app/src/clouddoc/res/values/strings.xml @@ -0,0 +1,290 @@ + + CloudDoc + + + 879961852793008 + fb879961852793008 + + + clouddoc.page.link + com.clouddoc.user + + + AIzaSyD6xTauBy54YTN2pvv0ScEOSnLRqO1YPhk + 544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + With Experts + Meet + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + Login + Facebook + Google + Login using Email + Sign Up using Email + Continue for %s + New user? + Sign Up + Let’s Get Started ! + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + Clients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Already Register? + Edit + Age: + Enter Phone Number + Phone Number + Phone + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + No Slot available + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + Cancel + Available balance + Pay out + Add Money + Add + Please enter amount + Added to wallet + Add Card + Type your message… + Photo + Enter message + Today + Yesterday + Transaction History + Paid to\n%s + Refund from\n%s + Select card + New Request + Accepted + In progress + No show + Cancelled + %s Card ending with %s + NA + Write down your reviews + Submit + Please give Feedback + please select rating + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + years + Rating + %s · %s Reviews + Request completed + Insufficient amount + You need to maintain sufficient balance of %s to create request + Schedule Request + Request Now + Select date + Select time + + Search for %s + Profile + %s/%s + Set Filter + Choose date & time + Tomorrow + Clear All + Booking Details + Appointment date & timings + Confirm Booking + %s · %s + %s-%s + Add Coupon Code + Price Detail + Sub-Total + Total + Promo Applied + By Booking this appointment, you agree to\nthe terms & conditions + Schedule a meeting + Consult + Consult for %s \n at %s + Edit Slot + Sign Up with Phone Number + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Already have an account? + Apply + Minute + Input amount + Pay + Cancel appointment + Re-Schedule + Consult a Doctor + %s ]]> + %s User Remaining ]]> + %s Discount on booking a %s till %s ]]> + Please add valid coupon + Are you sure you want to cancel appointment? + Transaction failed + Delete + Are you sure you want to delete this card? + Edit card + Rate + Morning + Evening + Afternoon + Book again + Connecting… + Disconnecting… + Transaction Success + Transaction Failed + + + No Category! + Categories will shown here once added. + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + Recharge your wallet to create booking! + Once you add money or any deduction will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No appointments history! + No Appointments scheduled. + No experts yet! + Currently not any expert registered under \'%s\', so come back later. + + + + Share + Checkout this post + Hey, Here is app for Online Consultancy Platform for Doctors, Physiotherapists, Accountants, Lawyers, Consultants etc. You should try it. + Payment + Address + + View all + View Prescription + All + Details + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login With + + + Consult Online + Home Care Appointment + Clinic Appointment + + + Estimate Time of Arrival : %s + Status : + On the way + Reached Destination + Arrived + Started + Completed + Track Status + Quit + Are you sure you want to quit? It will stop your tracking + We will need your call permission to give you better experience + Service completed + Give Feedback + Cancelled Service + + + Language + Please choose your language + English + عربى + Account Setting + + + Request Sent successfully! + Your password changed successfully! + Patient added successfully! + + + View map + Google map application not found + Distance + Date + Time + Service Type + + Slide To Cancel + View Details + Price + Prescription detail + Downloading… + Completing your payment\nPlease wait… + Address for %s + Tax + Extra Payment + Amount: %s + Pay Extra + Are you sure you want to proceed payment? + Please agree to Terms + Id Card + Not Available + You should be subscribed to use this feature! + diff --git a/app/src/consult/google-services.json b/app/src/consult/google-services.json new file mode 100644 index 0000000..884a3fd --- /dev/null +++ b/app/src/consult/google-services.json @@ -0,0 +1,85 @@ +{ + "project_info": { + "project_number": "952614479078", + "firebase_url": "https://consultapp.firebaseio.com", + "project_id": "consultapp", + "storage_bucket": "consultapp.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:952614479078:android:77477a94af611ccccd0727", + "android_client_info": { + "package_name": "com.consultantapp" + } + }, + "oauth_client": [ + { + "client_id": "952614479078-jj3832iq42ni0sg7jn7vrser54micjuv.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.consultantapp", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "952614479078-n4emu848uscnrpp3ntnuu54ss616if1m.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCZ6vYaavuJ1AqqVZqacmSZWwYp8SrNDnE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "952614479078-n4emu848uscnrpp3ntnuu54ss616if1m.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:273447074175:android:4f3ea4d8bfe93c8c9c424a", + "android_client_info": { + "package_name": "com.healthcare.app" + } + }, + "oauth_client": [ + { + "client_id": "273447074175-9sfbp981pnmadb9eeo4i97pibc7q6ogt.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.healthcare.app", + "certificate_hash": "235a8e14d427d901a89ac40f61605b5ad83794cc" + } + }, + { + "client_id": "273447074175-s11b0iajssv3aj87auqrtnc81r4b2k10.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAzqUOhMtoUuUrG7lwv2rCvWVb-g4ZiLfk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "273447074175-iog9kg7n8dlsbp0a3r46bvsi1ltca7e5.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/consult/ic_launcher-playstore.png b/app/src/consult/ic_launcher-playstore.png new file mode 100644 index 0000000..2ddb764 Binary files /dev/null and b/app/src/consult/ic_launcher-playstore.png differ diff --git a/app/src/consult/res/drawable-hdpi/ic_logo_home.png b/app/src/consult/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..71e42c7 Binary files /dev/null and b/app/src/consult/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/consult/res/drawable-hdpi/ic_push.png b/app/src/consult/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..41ed403 Binary files /dev/null and b/app/src/consult/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-hdpi/ic_splash.png b/app/src/consult/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..269f1d3 Binary files /dev/null and b/app/src/consult/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-mdpi/ic_logo_home.png b/app/src/consult/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..f7e54ae Binary files /dev/null and b/app/src/consult/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/consult/res/drawable-mdpi/ic_push.png b/app/src/consult/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..41ed403 Binary files /dev/null and b/app/src/consult/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-mdpi/ic_splash.png b/app/src/consult/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..2b0bae4 Binary files /dev/null and b/app/src/consult/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-xhdpi/ic_logo_home.png b/app/src/consult/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..d33b94f Binary files /dev/null and b/app/src/consult/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/consult/res/drawable-xhdpi/ic_push.png b/app/src/consult/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..ce3a1aa Binary files /dev/null and b/app/src/consult/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-xhdpi/ic_splash.png b/app/src/consult/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..3fd8802 Binary files /dev/null and b/app/src/consult/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-xxhdpi/ic_logo_home.png b/app/src/consult/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..56ade8c Binary files /dev/null and b/app/src/consult/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/consult/res/drawable-xxhdpi/ic_push.png b/app/src/consult/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..e28aadc Binary files /dev/null and b/app/src/consult/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-xxhdpi/ic_splash.png b/app/src/consult/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..f96038d Binary files /dev/null and b/app/src/consult/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/consult/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..05b6b04 Binary files /dev/null and b/app/src/consult/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/consult/res/drawable-xxxhdpi/ic_push.png b/app/src/consult/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..3541d74 Binary files /dev/null and b/app/src/consult/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-xxxhdpi/ic_splash.png b/app/src/consult/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..340ee58 Binary files /dev/null and b/app/src/consult/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable/ic_launcher_foreground.xml b/app/src/consult/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/consult/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/consult/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/consult/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/consult/res/mipmap-hdpi/ic_launcher.png b/app/src/consult/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..93dbc70 Binary files /dev/null and b/app/src/consult/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..17acc8a Binary files /dev/null and b/app/src/consult/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-hdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..4012ce2 Binary files /dev/null and b/app/src/consult/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-mdpi/ic_launcher.png b/app/src/consult/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..53d858b Binary files /dev/null and b/app/src/consult/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..ed4d639 Binary files /dev/null and b/app/src/consult/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-mdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..2871bfc Binary files /dev/null and b/app/src/consult/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-xhdpi/ic_launcher.png b/app/src/consult/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..d1563b4 Binary files /dev/null and b/app/src/consult/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0e93ce4 Binary files /dev/null and b/app/src/consult/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..628fe27 Binary files /dev/null and b/app/src/consult/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-xxhdpi/ic_launcher.png b/app/src/consult/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..778dc33 Binary files /dev/null and b/app/src/consult/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a0e1217 Binary files /dev/null and b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..a25517c Binary files /dev/null and b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..65571df Binary files /dev/null and b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..44bed44 Binary files /dev/null and b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..42212b7 Binary files /dev/null and b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/values/colors.xml b/app/src/consult/res/values/colors.xml new file mode 100644 index 0000000..c2cde29 --- /dev/null +++ b/app/src/consult/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #0491FF + #0491FF + #0491FF + + #330491FF + diff --git a/app/src/consult/res/values/ic_launcher_background.xml b/app/src/consult/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/src/consult/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/consult/res/values/strings.xml b/app/src/consult/res/values/strings.xml new file mode 100644 index 0000000..d1dcca9 --- /dev/null +++ b/app/src/consult/res/values/strings.xml @@ -0,0 +1,21 @@ + + Royo Consult + + + 614826522700049 + fb614826522700049 + + + royoconsult.page.link + com.codebrew.RoyoConsultant + + + AIzaSyCZ6vYaavuJ1AqqVZqacmSZWwYp8SrNDnE + 952614479078-892v5fage0p4pguerkht8krnpoo55dq3.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + Classes + + diff --git a/app/src/edu/google-services.json b/app/src/edu/google-services.json new file mode 100644 index 0000000..a0b5da9 --- /dev/null +++ b/app/src/edu/google-services.json @@ -0,0 +1,55 @@ +{ + "project_info": { + "project_number": "985496364415", + "firebase_url": "https://royo-education.firebaseio.com", + "project_id": "royo-education", + "storage_bucket": "royo-education.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:985496364415:android:0830dfcb3a8b49b814264a", + "android_client_info": { + "package_name": "com.edu.user" + } + }, + "oauth_client": [ + { + "client_id": "985496364415-bep6m3c8iaovpdfi855ljhvhuj3j6vt9.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.edu.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "985496364415-0kv0l82pe2hr12s6ep66etcls77i8481.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBb2uXkk9gZp-oPIS0aP7bRu1ByDB4q1OE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "985496364415-f1jhbr1f65tfqrbdddfcuodqmc3fldgu.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "985496364415-hbo403nmok8chuhihq2c2uk0kmvf2hj9.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.codebrew.RoyoEducation" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/edu/ic_launcher-playstore.png b/app/src/edu/ic_launcher-playstore.png new file mode 100644 index 0000000..2f914d9 Binary files /dev/null and b/app/src/edu/ic_launcher-playstore.png differ diff --git a/app/src/edu/res/drawable-hdpi/ic_logo_home.png b/app/src/edu/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..9c822af Binary files /dev/null and b/app/src/edu/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/edu/res/drawable-hdpi/ic_push.png b/app/src/edu/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..97515ac Binary files /dev/null and b/app/src/edu/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-hdpi/ic_splash.png b/app/src/edu/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..c5e8520 Binary files /dev/null and b/app/src/edu/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-mdpi/ic_logo_home.png b/app/src/edu/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..3fd2d23 Binary files /dev/null and b/app/src/edu/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/edu/res/drawable-mdpi/ic_push.png b/app/src/edu/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..cfd2413 Binary files /dev/null and b/app/src/edu/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-mdpi/ic_splash.png b/app/src/edu/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..b8d61fc Binary files /dev/null and b/app/src/edu/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-xhdpi/ic_logo_home.png b/app/src/edu/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..b1ad6ea Binary files /dev/null and b/app/src/edu/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/edu/res/drawable-xhdpi/ic_push.png b/app/src/edu/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..753577e Binary files /dev/null and b/app/src/edu/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-xhdpi/ic_splash.png b/app/src/edu/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..8f68dcf Binary files /dev/null and b/app/src/edu/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-xxhdpi/ic_logo_home.png b/app/src/edu/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..be8c3d8 Binary files /dev/null and b/app/src/edu/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/edu/res/drawable-xxhdpi/ic_push.png b/app/src/edu/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..7379c2a Binary files /dev/null and b/app/src/edu/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-xxhdpi/ic_splash.png b/app/src/edu/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..aa63f73 Binary files /dev/null and b/app/src/edu/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/edu/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..9d4e449 Binary files /dev/null and b/app/src/edu/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/edu/res/drawable-xxxhdpi/ic_push.png b/app/src/edu/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..7bdb3a8 Binary files /dev/null and b/app/src/edu/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-xxxhdpi/ic_splash.png b/app/src/edu/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..63625b5 Binary files /dev/null and b/app/src/edu/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable/ic_launcher_foreground.xml b/app/src/edu/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/edu/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/edu/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/edu/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/edu/res/mipmap-hdpi/ic_launcher.png b/app/src/edu/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a6b2f98 Binary files /dev/null and b/app/src/edu/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5735d2a Binary files /dev/null and b/app/src/edu/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-hdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1138b23 Binary files /dev/null and b/app/src/edu/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-mdpi/ic_launcher.png b/app/src/edu/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..31adcc3 Binary files /dev/null and b/app/src/edu/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c05d165 Binary files /dev/null and b/app/src/edu/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-mdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..d83b282 Binary files /dev/null and b/app/src/edu/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-xhdpi/ic_launcher.png b/app/src/edu/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..80eff09 Binary files /dev/null and b/app/src/edu/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..ea04899 Binary files /dev/null and b/app/src/edu/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b80eb93 Binary files /dev/null and b/app/src/edu/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-xxhdpi/ic_launcher.png b/app/src/edu/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8408413 Binary files /dev/null and b/app/src/edu/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7d7f32b Binary files /dev/null and b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..cc286ca Binary files /dev/null and b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..63ea749 Binary files /dev/null and b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..de201ea Binary files /dev/null and b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5ea9836 Binary files /dev/null and b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/values/colors.xml b/app/src/edu/res/values/colors.xml new file mode 100644 index 0000000..c2cde29 --- /dev/null +++ b/app/src/edu/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #0491FF + #0491FF + #0491FF + + #330491FF + diff --git a/app/src/edu/res/values/ic_launcher_background.xml b/app/src/edu/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..a16dc43 --- /dev/null +++ b/app/src/edu/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #0491FF + \ No newline at end of file diff --git a/app/src/edu/res/values/strings.xml b/app/src/edu/res/values/strings.xml new file mode 100644 index 0000000..2e4002b --- /dev/null +++ b/app/src/edu/res/values/strings.xml @@ -0,0 +1,19 @@ + + Royo Education + + + 757819374777114 + fb757819374777114 + + + royoeducation.page.link + com.codebrew.RoyoEducation + + + AIzaSyBb2uXkk9gZp-oPIS0aP7bRu1ByDB4q1OE + 985496364415-f1jhbr1f65tfqrbdddfcuodqmc3fldgu.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + diff --git a/app/src/heal/google-services.json b/app/src/heal/google-services.json new file mode 100644 index 0000000..f815282 --- /dev/null +++ b/app/src/heal/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "1001624543225", + "firebase_url": "https://heal-f1922.firebaseio.com", + "project_id": "heal-f1922", + "storage_bucket": "heal-f1922.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1001624543225:android:90d5886827d1a10a4ea728", + "android_client_info": { + "package_name": "com.heal.user" + } + }, + "oauth_client": [ + { + "client_id": "1001624543225-cfq6m3j6p13uqie1khs6qgfm3rll1b2b.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.heal.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD8H-xaJhni0iozyRdTG3pDmrQHQJYkF_M" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/heal/ic_launcher-playstore.png b/app/src/heal/ic_launcher-playstore.png new file mode 100644 index 0000000..dddb427 Binary files /dev/null and b/app/src/heal/ic_launcher-playstore.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_1.png b/app/src/heal/res/drawable-hdpi/ic_1.png new file mode 100644 index 0000000..c272b43 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_2.png b/app/src/heal/res/drawable-hdpi/ic_2.png new file mode 100644 index 0000000..e78d418 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_4.png b/app/src/heal/res/drawable-hdpi/ic_4.png new file mode 100644 index 0000000..1b780f8 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_5.png b/app/src/heal/res/drawable-hdpi/ic_5.png new file mode 100644 index 0000000..ca5412c Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_6.png b/app/src/heal/res/drawable-hdpi/ic_6.png new file mode 100644 index 0000000..a970d3c Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_1.png new file mode 100644 index 0000000..0d538c2 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_2.png new file mode 100644 index 0000000..af06585 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_3.png new file mode 100644 index 0000000..654370d Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_4.png new file mode 100644 index 0000000..9aae6c5 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_logo_home.png b/app/src/heal/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..1274c01 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_push.png b/app/src/heal/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..b6c2e4f Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_splash.png b/app/src/heal/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..37cdd28 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_1.png b/app/src/heal/res/drawable-mdpi/ic_1.png new file mode 100644 index 0000000..5130da2 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_2.png b/app/src/heal/res/drawable-mdpi/ic_2.png new file mode 100644 index 0000000..77a3411 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_4.png b/app/src/heal/res/drawable-mdpi/ic_4.png new file mode 100644 index 0000000..15bce86 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_5.png b/app/src/heal/res/drawable-mdpi/ic_5.png new file mode 100644 index 0000000..026f703 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_6.png b/app/src/heal/res/drawable-mdpi/ic_6.png new file mode 100644 index 0000000..e533dc2 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_1.png new file mode 100644 index 0000000..04be829 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_2.png new file mode 100644 index 0000000..740f7b1 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_3.png new file mode 100644 index 0000000..845732f Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_4.png new file mode 100644 index 0000000..e85165d Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_logo_home.png b/app/src/heal/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..5bbe94d Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_push.png b/app/src/heal/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..d327d52 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_splash.png b/app/src/heal/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..7f5e79b Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_1.png b/app/src/heal/res/drawable-xhdpi/ic_1.png new file mode 100644 index 0000000..946daa1 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_2.png b/app/src/heal/res/drawable-xhdpi/ic_2.png new file mode 100644 index 0000000..8e3e382 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_4.png b/app/src/heal/res/drawable-xhdpi/ic_4.png new file mode 100644 index 0000000..75fbd5d Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_5.png b/app/src/heal/res/drawable-xhdpi/ic_5.png new file mode 100644 index 0000000..0a30ea6 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_6.png b/app/src/heal/res/drawable-xhdpi/ic_6.png new file mode 100644 index 0000000..484ccdc Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_1.png new file mode 100644 index 0000000..a46c0f8 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_2.png new file mode 100644 index 0000000..cbfc99d Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_3.png new file mode 100644 index 0000000..d2f6102 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_4.png new file mode 100644 index 0000000..e102161 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_logo_home.png b/app/src/heal/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..1d235cc Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_push.png b/app/src/heal/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..a616d95 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_splash.png b/app/src/heal/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..3e23fd9 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_1.png b/app/src/heal/res/drawable-xxhdpi/ic_1.png new file mode 100644 index 0000000..c4f7cba Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_2.png b/app/src/heal/res/drawable-xxhdpi/ic_2.png new file mode 100644 index 0000000..9bcd68a Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_4.png b/app/src/heal/res/drawable-xxhdpi/ic_4.png new file mode 100644 index 0000000..7c318ee Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_5.png b/app/src/heal/res/drawable-xxhdpi/ic_5.png new file mode 100644 index 0000000..b32a351 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_6.png b/app/src/heal/res/drawable-xxhdpi/ic_6.png new file mode 100644 index 0000000..691f071 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_1.png new file mode 100644 index 0000000..df38e73 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_2.png new file mode 100644 index 0000000..a8f7a4a Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_3.png new file mode 100644 index 0000000..ac5010f Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_4.png new file mode 100644 index 0000000..65a8b2f Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_logo_home.png b/app/src/heal/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..0899872 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_push.png b/app/src/heal/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..c599ed7 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_splash.png b/app/src/heal/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..aa3eaac Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_1.png b/app/src/heal/res/drawable-xxxhdpi/ic_1.png new file mode 100644 index 0000000..d0e240a Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_2.png b/app/src/heal/res/drawable-xxxhdpi/ic_2.png new file mode 100644 index 0000000..20c4446 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_4.png b/app/src/heal/res/drawable-xxxhdpi/ic_4.png new file mode 100644 index 0000000..60d803f Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_5.png b/app/src/heal/res/drawable-xxxhdpi/ic_5.png new file mode 100644 index 0000000..3d83282 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_6.png b/app/src/heal/res/drawable-xxxhdpi/ic_6.png new file mode 100644 index 0000000..a6b4327 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_1.png new file mode 100644 index 0000000..a1b1a66 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_2.png new file mode 100644 index 0000000..26a07c4 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_3.png new file mode 100644 index 0000000..4b42694 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_4.png new file mode 100644 index 0000000..b2d5ce4 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/heal/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..c0c027d Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_push.png b/app/src/heal/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..a122db0 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_splash.png b/app/src/heal/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..3d6e765 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable/ic_launcher_foreground.xml b/app/src/heal/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/heal/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/heal/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/heal/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/heal/res/mipmap-hdpi/ic_launcher.png b/app/src/heal/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..847aeab Binary files /dev/null and b/app/src/heal/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..8436ce3 Binary files /dev/null and b/app/src/heal/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-hdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..d2143b9 Binary files /dev/null and b/app/src/heal/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-mdpi/ic_launcher.png b/app/src/heal/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..e39c6ae Binary files /dev/null and b/app/src/heal/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..6aa578c Binary files /dev/null and b/app/src/heal/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-mdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..ece0846 Binary files /dev/null and b/app/src/heal/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-xhdpi/ic_launcher.png b/app/src/heal/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..a7435c5 Binary files /dev/null and b/app/src/heal/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..fb7882d Binary files /dev/null and b/app/src/heal/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..7458635 Binary files /dev/null and b/app/src/heal/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-xxhdpi/ic_launcher.png b/app/src/heal/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..746bada Binary files /dev/null and b/app/src/heal/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..4b40279 Binary files /dev/null and b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..a0a513c Binary files /dev/null and b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..372c6ac Binary files /dev/null and b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d73af7d Binary files /dev/null and b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..3fcc6be Binary files /dev/null and b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/values/colors.xml b/app/src/heal/res/values/colors.xml new file mode 100644 index 0000000..bb05757 --- /dev/null +++ b/app/src/heal/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #8CCD38 + #8CCD38 + #8CCD38 + + #1A8CCD38 + #338CCD38 + + diff --git a/app/src/heal/res/values/ic_launcher_background.xml b/app/src/heal/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/src/heal/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/heal/res/values/strings.xml b/app/src/heal/res/values/strings.xml new file mode 100644 index 0000000..fc6a97d --- /dev/null +++ b/app/src/heal/res/values/strings.xml @@ -0,0 +1,539 @@ + + Heal + + + 347523059865896 + fb347523059865896 + + + healConsult.page.link + com.heal.user + + + com.heal.expert + + + AIzaSyD8H-xaJhni0iozyRdTG3pDmrQHQJYkF_M + 1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + + Login + Facebook + Google + Login using Email + Sign Up using Email + Continue for %s + New user? + Sign Up + Let’s Get Started ! + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + Clients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Re-Enter Password + Bio + Already Register? + Edit + Age: + Enter Age + Enter Phone Number + Enter Correct Phone Number + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + No Slot available + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + Cancel + Available balance + Pay out + Add Money + Add + + Add + Please enter amount + Added to wallet + Closing Balance: %s + Add Card + Type your message… + Photo + Active now + Offline + Enter message + Typing… + Today + Yesterday + Transaction History + Paid to\n%s + Refund from\n%s + Added Packages + Select card + New Request + Accepted + In progress + No show + Cancelled + %s Card ending with %s + NA + Write down your reviews + Submit + Please give Feedback + please select rating + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + years + Rating + %s · %s Reviews + Request completed + Insufficient amount + You need to maintain sufficient balance of %s to create request + Schedule Later + Request Now + Select date + Select time + + + Online Programs + Program Name + Program Time + Program Price + Start Program + Join Program + Occupy Program + Categories + Category + You will be able to join program once it get started. + To occupy this Program you need to pay this Program price. Are you sure yo want to proceed by making payment from wallet? + + With Experts + Meet + Search for %s + Profile + %s/%s + Set Filter + Choose date & time + Tomorrow + Clear All + Booking Details + Appointment date & timings + Confirm Booking + %s · %s + %s-%s + Add Coupon Code + Price Detail + Sub-Total + Total + Promo Applied + By Booking this appointment, you agree to\nthe terms & conditions + Schedule a meeting + Consult + Consult for %s \n at %s + Edit Slot + Sign Up with Phone Number + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Already have an account? + Apply + Minute + Input amount + Pay + Cancel appointment + Re-Schedule + Consult a Doctor + %s ]]> + %s User Remaining ]]> + %s Discount on booking a %s till %s ]]> + Please add valid coupon + Are you sure you want to cancel appointment? + Transaction failed + Delete + Are you sure you want to delete this card? + Edit card + Rate + Morning + Evening + Afternoon + Book again + Connecting… + Disconnecting… + Transaction Success + Transaction Failed + + + No Category! + Categories will shown here once added. + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + Recharge your wallet to create booking! + Once you add money or any deduction will appear here. + No Program yet! + All Programs from Experts will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No appointments history! + No Appointments scheduled. + No experts yet! + Currently not any expert registered under \'%s\', so come back later. + No Expert Advise Found! + Your expert advise will be shown here, You can ask your first Expert advise by tappinng on + Ask. + No Answers Yet! + Your Expert advice will be answered soon. + No Health Tips! + Health Tips will appear here once added + + + + Share + Checkout this post + Hey, Here is Heal Arabia app for health Online Consultancy find the best Doctors, Physiotherapists, physicians, therapists, nurses, and Consultants and get in touch with them . You should try it. + Payment + + + Start Your Journey now + Address + City + State + Zip Code + I agree to the Terms of Service, Privacy Policy, Cookies Policy and Fee Schedules. + I understand that the service providers and other professionals that I am connected to on app, and understand the service is a communication tool only. + I understand that each service provider may have their own fee schedule and billing rates. + Do you have insurance + If \'Yes\' what Insurance + Select Insurance + Please check all terms + Select State + Select City + Insurance information + Expiry date + Insurance number + Insurance no : %s + Expiry Date : %s + + + Latest Health Tips + Health Tips + Nationality + Select Nationality + + View Prescription + All + + + + Are you a Doctor or Patient? + Doctor + Patient + + + Chat with Doctor + Choose a speciality and have your doubts resolved through a Live chat made with Doctors + + Video/Audio Appointments + Get appointments in seconds from the best leading doctors around you and get prescriptions + + Online programs + Enroll to our best in class health improvement programs that vary in categories + + Add Sub-Accounts + You can add accounts for elderly and children and then fill the details defining their relationship with you + + Home Visits + Start scheduling your appointment to your home at your ease + + Get Started + Skip + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login With + + + Online Dr. + Emergency Consultation + Free Expert Advice + Tip of the day + Home Visit + Online Programs + + All comments + show more + show less + Type here… + Testimonials + + Gender + Select Gender + + + Health Tools + BMI Calculator + BMI Calculator + Water Intake Calculator + Water Intake Calculator + Protein Intake Calculator + Protein Intake Calculator + Pregnancy Calculator + Pregnancy Calculator + + Calculation Method + Calculate My Due Date + Last Period + Ultrasound + IVF + Conception Date + + The first day of your last period + Cycle Length + Date of Conception + Date of Transfer + IVF Transfer Date + Date of Ultrasound + Congratulations! + Your due date is %s + Your are %s weeks and %s days pregnant + + I don\'t know + days + day + weeks + week + Your Pregnancy Timeline + 1st Trimester + 2nd Trimester + 3rd Trimester + Your baby will be a %s + to + ♈ Aries + ♋ Cancer + ♉ Taurus + ♌ Leo + ♊ Gemini + ♍ Virgo + ♎ Libra + ♑ Capricorn + ♏ Scorpio + ♒ Aquarius + ♐ Sagittarius + ♓ Pisces + + + @string/last_period + @string/conception_date + @string/ivf + @string/ultrasound + + + Drink Water + Select amount of water + Set your daily water limit + Water Intake (Literes) + Set daily limit + Lt + ml + Water Intake + Daily Limit + Days Completed + + + Weight + Height + Your BMI + Please enter weight + Please enter weight + Please enter height + UNDERWEIGHT + NORMAL + OVERWEIGHT + 0 - 18.5 + 18.5 - 25 + \>25 + Male + Female + + + + Estimate Time of Arrival : %s + Status : + On the way + Reached Destination + Arrived + Started + Completed + Track Status + Quit + Are you sure you want to quit? It will stop your tracking + We will need your call permission to give you better experience + Service completed + Give Feedback + Cancelled Service + + + Ask Free Questions + Free Questions + Questions + + Ask + My Questions + Question + Description + You can ask only one question per week. + + + Language + Please choose your language + English + عربى + Account Setting + Change Password + Old Password + New Password + Confirm New Password + Elderly + Children + + + + Add Patients + Add Patients + Add a patient + Relationship + Do you have any medical allergies? + Any chronic diseases? + Any previous surgeries? + Are you taking any previous medication? + Choose chronic disease + Medication name + + + Success! + Request Sent successfully! + Your password changed successfully! + Patient added successfully! + Pdf + Audio + Retry + + + Father + Mother + Grand Father + Grand Mother + Son + Daughter + Other + + + @string/father + @string/mother + @string/grand_father + @string/grand_mother + @string/other + + + + @string/son + @string/daughter + @string/other + + + + Asthma + Cancer + Diabetes + + + @string/asthma + @string/cancer + @string/diabetes + @string/other + + + + View map + Google map application not found + Distance + Date + Time + Service Type + + + Please Select your card type + Master/Visa Card + Mada Card + + Select from the following Category + View symptoms + Following are the symptoms + Tell us your symptom or health problem + eg. Fever Cough + Symptoms + + Slide To Cancel + View Details + Price + Prescription detail + Downloading… + Completing your payment. Please wait… + diff --git a/app/src/healthcare/ic_launcher-playstore.png b/app/src/healthcare/ic_launcher-playstore.png new file mode 100644 index 0000000..5ac1f5b Binary files /dev/null and b/app/src/healthcare/ic_launcher-playstore.png differ diff --git a/app/src/healthcare/res/drawable-hdpi/ic_logo_home.png b/app/src/healthcare/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..85a6a60 Binary files /dev/null and b/app/src/healthcare/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/healthcare/res/drawable-hdpi/ic_push.png b/app/src/healthcare/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..1c460d5 Binary files /dev/null and b/app/src/healthcare/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/healthcare/res/drawable-hdpi/ic_splash.png b/app/src/healthcare/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..c5e8520 Binary files /dev/null and b/app/src/healthcare/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-mdpi/ic_logo_home.png b/app/src/healthcare/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..cb35275 Binary files /dev/null and b/app/src/healthcare/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/healthcare/res/drawable-mdpi/ic_push.png b/app/src/healthcare/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..f4c3c97 Binary files /dev/null and b/app/src/healthcare/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/healthcare/res/drawable-mdpi/ic_splash.png b/app/src/healthcare/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..b8d61fc Binary files /dev/null and b/app/src/healthcare/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-xhdpi/ic_logo_home.png b/app/src/healthcare/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..57e1f5c Binary files /dev/null and b/app/src/healthcare/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/healthcare/res/drawable-xhdpi/ic_push.png b/app/src/healthcare/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..4af7e95 Binary files /dev/null and b/app/src/healthcare/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/healthcare/res/drawable-xhdpi/ic_splash.png b/app/src/healthcare/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..8f68dcf Binary files /dev/null and b/app/src/healthcare/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-xxhdpi/ic_logo_home.png b/app/src/healthcare/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..3f3ec09 Binary files /dev/null and b/app/src/healthcare/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/healthcare/res/drawable-xxhdpi/ic_push.png b/app/src/healthcare/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..023679a Binary files /dev/null and b/app/src/healthcare/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/healthcare/res/drawable-xxhdpi/ic_splash.png b/app/src/healthcare/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..aa63f73 Binary files /dev/null and b/app/src/healthcare/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/healthcare/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..967bacc Binary files /dev/null and b/app/src/healthcare/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/healthcare/res/drawable-xxxhdpi/ic_push.png b/app/src/healthcare/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..2829f3e Binary files /dev/null and b/app/src/healthcare/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/healthcare/res/drawable-xxxhdpi/ic_splash.png b/app/src/healthcare/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..63625b5 Binary files /dev/null and b/app/src/healthcare/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable/ic_launcher_foreground.xml b/app/src/healthcare/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/healthcare/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/healthcare/res/mipmap-hdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..322e445 Binary files /dev/null and b/app/src/healthcare/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3ea979c Binary files /dev/null and b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-hdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61f5b8e Binary files /dev/null and b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-mdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..bfa0fc0 Binary files /dev/null and b/app/src/healthcare/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..4e5b7ce Binary files /dev/null and b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-mdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..16b4896 Binary files /dev/null and b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-xhdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..eb46cf7 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7a18526 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..bc374cc Binary files /dev/null and b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..60879bd Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..45430a9 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..50f84c0 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..6784123 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7e49bc2 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..6cea6fa Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/values/colors.xml b/app/src/healthcare/res/values/colors.xml new file mode 100644 index 0000000..c2cde29 --- /dev/null +++ b/app/src/healthcare/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #0491FF + #0491FF + #0491FF + + #330491FF + diff --git a/app/src/healthcare/res/values/ic_launcher_background.xml b/app/src/healthcare/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..a16dc43 --- /dev/null +++ b/app/src/healthcare/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #0491FF + \ No newline at end of file diff --git a/app/src/healthcare/res/values/strings.xml b/app/src/healthcare/res/values/strings.xml new file mode 100644 index 0000000..b502f43 --- /dev/null +++ b/app/src/healthcare/res/values/strings.xml @@ -0,0 +1,19 @@ + + HealthCare User + + + 3597982143546228 + fb3597982143546228 + + + royohealthcare.page.link + + + + AIzaSyAzqUOhMtoUuUrG7lwv2rCvWVb-g4ZiLfk + 273447074175-iog9kg7n8dlsbp0a3r46bvsi1ltca7e5.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + diff --git a/app/src/hexalud/Info b/app/src/hexalud/Info new file mode 100644 index 0000000..040519b --- /dev/null +++ b/app/src/hexalud/Info @@ -0,0 +1,11 @@ +//Server Key +AAAAGuScgqs:APA91bH_b_K5N7efge8dmA-pwsCbmxLiAcZOXHHQrNnkc_VT2OPtw3JXz2DJzj0n6J5qoVpzEIaqdV1WqYTUI9k1kI5LK85UEIdAA4u2fn10p_JdOt4mXp39d9foPgZ6jHmHcOAv3CG_ + +//Google + +//Facebook +developer.codebrew@gmail.com +developer@facebook +//Fb Ids +680508489286924 +816fc4b097ea81a5784e4cec2a4dc84e \ No newline at end of file diff --git a/app/src/hexalud/google-services.json b/app/src/hexalud/google-services.json new file mode 100644 index 0000000..143c9a5 --- /dev/null +++ b/app/src/hexalud/google-services.json @@ -0,0 +1,68 @@ +{ + "project_info": { + "project_number": "847724593128", + "project_id": "hexalud-c3d45", + "storage_bucket": "hexalud-c3d45.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:847724593128:android:4669a0f7f987ad42edee5d", + "android_client_info": { + "package_name": "com.hexalud.agent" + } + }, + "oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCl7H8Jj01KGnUNEw3ppfOZ2OL31ytgcsM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:847724593128:android:e8f69badb5688c9bedee5d", + "android_client_info": { + "package_name": "com.hexalud.user" + } + }, + "oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCl7H8Jj01KGnUNEw3ppfOZ2OL31ytgcsM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/hexalud/ic_launcher-playstore.png b/app/src/hexalud/ic_launcher-playstore.png new file mode 100644 index 0000000..baed671 Binary files /dev/null and b/app/src/hexalud/ic_launcher-playstore.png differ diff --git a/app/src/hexalud/res/color/color_theme_60.xml b/app/src/hexalud/res/color/color_theme_60.xml new file mode 100644 index 0000000..8caab66 --- /dev/null +++ b/app/src/hexalud/res/color/color_theme_60.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable-hdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..38e883f Binary files /dev/null and b/app/src/hexalud/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-hdpi/ic_splash.png b/app/src/hexalud/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..03fc6e0 Binary files /dev/null and b/app/src/hexalud/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-mdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..1d34849 Binary files /dev/null and b/app/src/hexalud/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-mdpi/ic_splash.png b/app/src/hexalud/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..dc60ed3 Binary files /dev/null and b/app/src/hexalud/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-xhdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..6f2031a Binary files /dev/null and b/app/src/hexalud/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-xhdpi/ic_splash.png b/app/src/hexalud/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..63373ad Binary files /dev/null and b/app/src/hexalud/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-xxhdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..1b675ec Binary files /dev/null and b/app/src/hexalud/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-xxhdpi/ic_splash.png b/app/src/hexalud/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..991a6cc Binary files /dev/null and b/app/src/hexalud/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..f84473f Binary files /dev/null and b/app/src/hexalud/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-xxxhdpi/ic_splash.png b/app/src/hexalud/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..412898c Binary files /dev/null and b/app/src/hexalud/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable/drawable_alternate_button.xml b/app/src/hexalud/res/drawable/drawable_alternate_button.xml new file mode 100644 index 0000000..bd2bbcd --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_alternate_button.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme.xml b/app/src/hexalud/res/drawable/drawable_theme.xml new file mode 100644 index 0000000..560f6d9 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_60.xml b/app/src/hexalud/res/drawable/drawable_theme_60.xml new file mode 100644 index 0000000..caf42f1 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_60.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_8.xml b/app/src/hexalud/res/drawable/drawable_theme_8.xml new file mode 100644 index 0000000..9f0504d --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_8.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_rounded_4.xml b/app/src/hexalud/res/drawable/drawable_theme_rounded_4.xml new file mode 100644 index 0000000..cbff00d --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_rounded_4.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_stroke.xml b/app/src/hexalud/res/drawable/drawable_theme_stroke.xml new file mode 100644 index 0000000..83ff4b0 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_stroke.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_stroke_4.xml b/app/src/hexalud/res/drawable/drawable_theme_stroke_4.xml new file mode 100644 index 0000000..2245d9e --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_stroke_4.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_stroke_60.xml b/app/src/hexalud/res/drawable/drawable_theme_stroke_60.xml new file mode 100644 index 0000000..cbaadb5 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_stroke_60.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/ic_launcher_foreground.xml b/app/src/hexalud/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/hexalud/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/ic_push.xml b/app/src/hexalud/res/drawable/ic_push.xml new file mode 100644 index 0000000..de55efd --- /dev/null +++ b/app/src/hexalud/res/drawable/ic_push.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/mipmap-hdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..2cada52 Binary files /dev/null and b/app/src/hexalud/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..08cdc8a Binary files /dev/null and b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-hdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1d463f1 Binary files /dev/null and b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-mdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..aaa72a6 Binary files /dev/null and b/app/src/hexalud/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7a380ec Binary files /dev/null and b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-mdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..34ccf00 Binary files /dev/null and b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-xhdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..eb2052c Binary files /dev/null and b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c918954 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..aab8c08 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d1964fa Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5bdb0ab Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..80dd8bb Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..33e142d Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2ec1396 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..3264b53 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/values-ar/strings.xml b/app/src/hexalud/res/values-ar/strings.xml new file mode 100644 index 0000000..61e85e3 --- /dev/null +++ b/app/src/hexalud/res/values-ar/strings.xml @@ -0,0 +1,271 @@ + + Inhomed + + لديك تحديث جديد لبرنامج %s! + أنت بحاجة إلى حساب %s\n للمتابعة + + الطبيب الآن + اطلب + + السماح + أنكر + إعدادات + تحتاج هذه الميزة إلى إذن لاستخدام الكاميرا ووحدة التخزين الخارجية. + تحتاج هذه الميزة إلى إذن لاستخدام تسجيل الصوت والتخزين الخارجي. + + الإنترنت + الرجاء التحقق من اتصال الانترنت الخاص بك + حسنا + إنذار + تسجيل الدخول + موقع التواصل الاجتماعي الفيسبوك + جوجل + تسجيل الدخول باستخدام البريد الإلكتروني + سجل باستخدام البريد الإلكتروني + استمر في %s + مستخدم جديد؟ + سجل + هيا بنا نبدأ! + نحتاج إلى رقم هاتفك للتعرف عليك. + تم إرسال الرمز إلى %s + أعد إرسال الرمز + ألم تتلق الرمز بعد؟ + التحقق + لقد أرسلنا لك رمزًا إلى %s + الرجاء إدخال otp + موقعك + دردشة + العملاء + تجربة + المراجعات + حول + + الصفحة الرئيسية + التاريخ + تنبيه + تسجيل خروج + الأحكام والشروط + ادعو الناس + الإصدار %s + أنت تقوم بتشغيل أحدث إصدار + تعيينات + اسم + البريد الإلكتروني + تاريخ الولادة + كلمه السر + السيرة الذاتية + التسجيل بالفعل؟ + تعديل + عمر: + أدخل رقم الهاتف + رقم الهاتف + DOB + نحتاج إلى بريدك الإلكتروني & ؛ كلمة مرور للتعرف عليك. + ليس لديك حساب؟ + هل نسيت كلمة المرور + محفظة نقود + الرجاء إدخال الاسم + الرجاء تحديد DOB + الرجاء إدخال البريد الإلكتروني + الرجاء إدخال البريد الإلكتروني الصحيح + يجب ألا يقل طول كلمة المرور عن 8 أحرف + الرجاء إدخال السيرة الذاتية + + هل أنت متأكد أنك تريد تسجيل الخروج? + نعم + لا + لاتوجد بيانات + لا توجد فتحة متاحة + اختر صورة + حدد الوثيقة + تحديث + نحتاج إلى بريدك الإلكتروني المسجل للوصول إليك + لقد أرسلنا كلمة مرور مؤقتة في بريدك الإلكتروني. تفقد بريدك الالكتروني من فضلك. + إلغاء + الرصيد المتوفر + سيصرف + إضافة المال + أضف + الرجاء إدخال المبلغ + يضاف إلى المحفظة + إضافة بطاقة + اكتب رسالتك… + صورة فوتوغرافية + أدخل رسالة + اليوم + في الامس + تاريخ المعاملات + دفع الثمن ل\n%s + استرداد من\n%s + اختر البطاقة + طلب جديد + وافقت + في تقدم + عدم الحضور + ألغيت + %s بطاقة تنتهي بـ %s + على + اكتب تعليقاتك + إرسال + يرجى تقديم ملاحظات + الرجاء تحديد التصنيف + نهاية المحادثة + إنهاء \n الدردشة + هذا سينهي الدردشة. لن تتمكن من الدردشة بعد الآن + سنوات + تقييم + %s · %s المراجعات + اكتمل الطلب + كمية غير كافية + تحتاج إلى الاحتفاظ برصيد كافٍ من %s لإنشاء الطلب + طلب جدولة + اطلب الآن + حدد تاريخ + حدد الوقت + + البحث عن %s + الملف الشخصي + %s/%s + تعيين عامل التصفية + اختر التاريخ & ؛ زمن + غدا + امسح الكل + تفاصيل الحجز + تاريخ التعيين & ؛ توقيت + تأكيد الحجز + %s · %s + %s-%s + أضف رمز القسيمة + تفاصيل السعر + المجموع الفرعي + مجموع + تم تطبيق العرض الترويجي + بحجز هذا الموعد ، فإنك توافق على \n الشروط & ؛ الظروف + جدولة اجتماع + شاور + استشارة ل %s \n في %s + تحرير الفتحة + قم بالتسجيل باستخدام رقم الهاتف + بالمتابعة ، أنت توافق على\n + شروط الخدمة + شروط الخدمة + و + سياسة الخصوصية + هل لديك حساب؟ + تطبيق + دقيقة + كمية المدخلات + دفع + إلغاء التعيين + إعادة الجدولة + استشر الطبيب + %s ]]> + %s مستخدم متبقي ]]> + %s خصم على الحجز أ %s إلى %s ]]> + الرجاء إضافة قسيمة صالحة + هل أنت متأكد أنك تريد إلغاء الموعد؟ + فشل الاجراء + حذف + هل أنت متأكد أنك تريد حذف هذه البطاقة؟ + تحرير البطاقة + معدل + صباح + مساء + بعد الظهر + احجز مرة أخرى + توصيل… + جاري قطع الاتصال … + نجاح الصفقة + فشل الاجراء + + + لا تصنيف! + ستظهر الفئات هنا بمجرد إضافتها. + لا طلبات! + ليس لديك أي طلبات تم إنشاؤها في الوقت الحالي. + لم تبدأ أي محادثة بعد! + بمجرد قبول طلبات الدردشة الخاصة بك & ؛ تبدأ المحادثة ، ستظهر المواضيع هنا. + أعد شحن محفظتك لإنشاء حجز! + بمجرد إضافة الأموال أو أي خصم سيظهر هنا. + لا إخطارات حتى الآن! + ستظهر هنا جميع الإخطارات المتعلقة بأنشطتك. + لا يوجد تاريخ للمواعيد! + لا توجد مواعيد مجدولة. + لا خبراء حتى الان! + لم يتم حاليًا تسجيل أي خبير ضمن \'%s\' ، لذا عد لاحقًا. + + + + شارك + تحقق من هذا المنصب + مرحبًا ، هنا تطبيق لمنصة الاستشارات عبر الإنترنت للأطباء وأخصائيي العلاج الطبيعي والمحاسبين والمحامين والاستشاريين وما إلى ذلك ، يجب عليك تجربته. + دفع + عنوان + + مشاهدة الكل + مشاهدة الوصفة الطبية + الكل + تفاصيل + + + تخطي في الوقت الراهن + استخدم موقعي + سنحتاج إلى موقعك لنمنحك تجربة أفضل + اسمح لموقعك + + + انخفاض + إجابة + تسجيل الدخول مع + + + استشر عبر الإنترنت + استشارة طارئة + موعد الرعاية المنزلية + موعد العيادة + + + تقدير وقت الوصول : %s + الحالة : + فى الطريق + وصلت إلى الوجهة + وصل + بدأت + منجز + تتبع الحالة + استقال + هل أنت متأكد من أنك تريد الخروج؟ سوف يوقف التتبع الخاص بك + سنحتاج إلى إذن الاتصال الخاص بك لمنحك تجربة أفضل + اكتملت الخدمة + إعطاء ردود الفعل + الخدمة الملغاة + + + لغة + الرجاء اختيار لغتك + English + عربى + إعدادات الحساب + + + تم إرسال الطلب بنجاح! + تم تغيير كلمة المرور الخاصة بك بنجاح! + تمت إضافة المريض بنجاح! + + + إعرض الخريطة + تطبيق خرائط جوجل غير موجود + مسافة + تاريخ + زمن + نوع الخدمة + + حرك للإلغاء + عرض التفاصيل + السعر + تفاصيل الوصفة + جارى التحميل… + إتمام الدفع \nالرجاء الانتظار + Address for %s + Tax + diff --git a/app/src/hexalud/res/values/colors.xml b/app/src/hexalud/res/values/colors.xml new file mode 100644 index 0000000..a63746e --- /dev/null +++ b/app/src/hexalud/res/values/colors.xml @@ -0,0 +1,11 @@ + + + #00C46B + #00C46B + #00C46B + + #3839C6C0 + #33F48D9F + #F48D9F + #e7d27c + diff --git a/app/src/hexalud/res/values/ic_launcher_background.xml b/app/src/hexalud/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..145f446 --- /dev/null +++ b/app/src/hexalud/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FDFDFE + \ No newline at end of file diff --git a/app/src/hexalud/res/values/strings.xml b/app/src/hexalud/res/values/strings.xml new file mode 100644 index 0000000..c90a234 --- /dev/null +++ b/app/src/hexalud/res/values/strings.xml @@ -0,0 +1,285 @@ + + Hexalud + + + 137024514882030 + fb137024514882030 + + + taradoc.page.link + com.taradoc.user + + + + + + AIzaSyCBNV9wVtN32IeE1xzo1In45t4fePJGvBs + 115504612011-72l19995tb28l6t44mkeu05rame3305r.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + With Experts + Meet + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + Login + Facebook + Google + Login using Email + Sign Up using Email + Continue for %s + New user? + Sign Up + Let’s Get Started ! + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + Clients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Already Registered? + Edit + Age: + Enter Phone Number + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + No Slot available + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + Cancel + Available balance + Pay out + Add Money + Add + Please enter amount + Added to wallet + Add Card + Type your message… + Photo + Enter message + Today + Yesterday + Transaction History + Paid to\n%s + Refund from\n%s + Select card + New Request + Accepted + In progress + No show + Cancelled + %s Card ending with %s + NA + Write down your reviews + Submit + Please give Feedback + please select rating + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + years + Rating + %s · %s Reviews + Request completed + Insufficient amount + You need to maintain sufficient balance of %s to create request + Schedule Request + Request Now + Select date + Select time + + Search for %s + Profile + %s/%s + Set Filter + Choose date & time + Tomorrow + Clear All + Booking Details + Appointment date & timings + Confirm Booking + %s · %s + %s-%s + Add Coupon Code + Price Detail + Sub-Total + Total + Promo Applied + By Booking this appointment, you agree to\nthe terms & conditions + Schedule a meeting + Consult + Consult for %s \n at %s + Edit Slot + Sign Up with Phone Number + By continue, you agree to our\n + Terms of service + Terms Of Use + and + Privacy Policy + Already have an account? + Apply + Minute + Input amount + Pay + Cancel appointment + Re-Schedule + Consult a Doctor + %s ]]> + %s User Remaining ]]> + %s Discount on booking a %s till %s ]]> + Please add valid coupon + Are you sure you want to cancel appointment? + Transaction failed + Delete + Are you sure you want to delete this card? + Edit card + Rate + Morning + Evening + Afternoon + Book again + Connecting… + Disconnecting… + Transaction Success + Transaction Failed + + + No Category! + Categories will shown here once added. + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + Recharge your wallet to create booking! + Once you add money or any deduction will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No appointments history! + No Appointments scheduled. + No experts yet! + Currently not any expert registered under \'%s\', so come back later. + + + + Share + Checkout this post + Hey, Here is app for Online Consultancy Platform for Doctors, Physiotherapists, Accountants, Lawyers, Consultants etc. You should try it. + Payment + Address + + View all + View Prescription + All + Details + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login With + + + Consult Online + Home Care Appointment + Clinic Appointment + + + Estimate Time of Arrival : %s + Status : + On the way + Reached Destination + Arrived + Started + Completed + Track Status + Quit + Are you sure you want to quit? It will stop your tracking + We will need your call permission to give you better experience + Service completed + Give Feedback + Cancelled Service + + + Language + Please choose your language + English + عربى + Account Setting + + + Request Sent successfully! + Your password changed successfully! + Patient added successfully! + + + View map + Google map application not found + Distance + Date + Time + Service Type + + Slide To Cancel + View Details + Price + Prescription detail + Downloading… + Completing your payment\nPlease wait… + Address for %s + Tax + diff --git a/app/src/homeDoctor/google-services.json b/app/src/homeDoctor/google-services.json new file mode 100644 index 0000000..dc2de92 --- /dev/null +++ b/app/src/homeDoctor/google-services.json @@ -0,0 +1,85 @@ +{ + "project_info": { + "project_number": "226777979953", + "firebase_url": "https://home-doctor-54468.firebaseio.com", + "project_id": "home-doctor-54468", + "storage_bucket": "home-doctor-54468.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:226777979953:android:d9cea3c28b968cd5f40910", + "android_client_info": { + "package_name": "com.homeDoctor.expert" + } + }, + "oauth_client": [ + { + "client_id": "226777979953-1btcgm53odl932dj8ue76fg6s6bjf1mf.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.homeDoctor.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDCVqemLb263wtS1eU2qiueV5AP9ME0F_A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:226777979953:android:fc7df9e16ad5d8ddf40910", + "android_client_info": { + "package_name": "com.homeDoctor.user" + } + }, + "oauth_client": [ + { + "client_id": "226777979953-q1595mocupa9lsh66cbvs0hafmkj9kb7.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.homeDoctor.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDCVqemLb263wtS1eU2qiueV5AP9ME0F_A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/homeDoctor/ic_launcher-playstore.png b/app/src/homeDoctor/ic_launcher-playstore.png new file mode 100644 index 0000000..b5ae070 Binary files /dev/null and b/app/src/homeDoctor/ic_launcher-playstore.png differ diff --git a/app/src/homeDoctor/res/drawable-hdpi/ic_logo_home.png b/app/src/homeDoctor/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..c206c71 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/homeDoctor/res/drawable-hdpi/ic_push.png b/app/src/homeDoctor/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-hdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..602bfe3 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-mdpi/ic_logo_home.png b/app/src/homeDoctor/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..aabcfac Binary files /dev/null and b/app/src/homeDoctor/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/homeDoctor/res/drawable-mdpi/ic_push.png b/app/src/homeDoctor/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-mdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..42d3b58 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-xhdpi/ic_logo_home.png b/app/src/homeDoctor/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..1475ce5 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/homeDoctor/res/drawable-xhdpi/ic_push.png b/app/src/homeDoctor/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-xhdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..70fc4c2 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-xxhdpi/ic_logo_home.png b/app/src/homeDoctor/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..78715cc Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/homeDoctor/res/drawable-xxhdpi/ic_push.png b/app/src/homeDoctor/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-xxhdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..70fc4c2 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..176aa58 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/homeDoctor/res/drawable-xxxhdpi/ic_push.png b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-xxxhdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..abf9302 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable/ic_launcher_foreground.xml b/app/src/homeDoctor/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/homeDoctor/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..6641b23 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0a7d56f Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..a6a914e Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..19707eb Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..85bdf76 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..8c4e9c7 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..f3e7a06 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5ca4389 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..f4a6e68 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..5b4ed39 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..e9a3f6e Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..ccffcc3 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..a376bf1 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..f6144f0 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..79b9fd1 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/values-ar/strings.xml b/app/src/homeDoctor/res/values-ar/strings.xml new file mode 100644 index 0000000..f445e68 --- /dev/null +++ b/app/src/homeDoctor/res/values-ar/strings.xml @@ -0,0 +1,290 @@ + + Inhomed + + لديك تحديث جديد لبرنامج %s! + %sفضلاً إنشاء حساب للمتابعة + + طبيبك الآن + اطلب + + سماح + رفض + إعدادات + تحتاج هذه الميزة إلى إذن لاستخدام الكاميرا. + تحتاج هذه الميزة إلى إذن لاستخدام تسجيل الصوت. + + الإنترنت + الرجاء التحقق من اتصال الانترنت الخاص بك + حسناً + تنبيه + تسجيل الدخول + فيسبوك + جوجل + تسجيل الدخول باستخدام البريد الإلكتروني + سجل باستخدام البريد الإلكتروني + استمر في %s + مستخدم جديد؟ + سجل + لنبدأ! + نحتاج إلى رقم هاتفك للتعرف عليك. + تم إرسال الرمز إلى %s + أعد إرسال الرمز + لم يصلك الرمز بعد؟ + التحقق + لقد أرسلنا لك رمزًا إلى %s + الرجاء إدخال otp + موقعك + المحادثات + العملاء + تجربة + المراجعات + نبذة عن التطبيق + + الصفحة الرئيسية + السجل + التنبيهات + تسجيل خروج + الأحكام والشروط + شارك مع أصدقائك + الإصدار %s + أنت تقوم بتشغيل أحدث إصدار + المواعيد + اسم + البريد الإلكتروني + تاريخ الميلاد + كلمه المرور + السيرة الذاتية + لديك حساب سابق؟ + تعديل + العمر: + أدخل رقم الهاتف + رقم الهاتف + تاريخ الميلاد + نحتاج إلى بريدك الإلكتروني و كلمة مرور للتعرف عليك. + ليس لديك حساب؟ + هل نسيت كلمة المرور + محفظة نقود + الرجاء إدخال الاسم + الرجاء تحديد تاريخ الميلاد + الرجاء إدخال البريد الإلكتروني + الرجاء إدخال البريد الإلكتروني الصحيح + يجب ألا يقل طول كلمة المرور عن 8 أحرف + الرجاء كتابة السيرة الذاتية + + تأكيد تسجيل الخروج ؟ + نعم + لا + لايوجد بيانات + لايوجد فترة زمنية متاحة + اختر صورة + حدد الوثيقة + تحديث + نحتاج إلى بريدك الإلكتروني المسجل للوصول إليك + لقد أرسلنا كلمة مرور مؤقتة في بريدك الإلكتروني. تفقد بريدك الالكتروني من فضلك. + إلغاء + الرصيد المتوفر + طلب الدفع + إضافة رصيد + أضف + الرجاء إدخال المبلغ + يضاف إلى المحفظة + إضافة بطاقة + اكتب رسالتك… + مكتبة الصور + أدخل رسالة + اليوم + أمس + تاريخ المعاملات + دفع الثمن ل\n%s + استرداد من\n%s + اختر البطاقة + الجديدة + تمت الموافقة + جاري العمل + عدم الحضور + الملغاة + %s بطاقة تنتهي بـ %s + على + اكتب تعليقاتك + إرسال + يرجى تقديم ملاحظات + الرجاء تحديد التصنيف + نهاية المحادثة + إنهاء \n الدردشة + سيتم إنهاء الدردشة ولايمكنك متابعة الدردشة بعد الآن + سنوات + تقييم + %s · %s المراجعات + اكتمل الطلب + رصيد غير كافي + تحتاج إلى الاحتفاظ برصيد كافٍ من %s لإنشاء الطلب + جدولة الموعد + احجز الآن + حدد تاريخ + حدد الوقت + + البحث عن %s + الملف الشخصي + %s/%s + تعيين عامل التصفية + اختر التاريخ و زمن + غداً + مسح الكل + تفاصيل الحجز + تاريخ التعيين و توقيت + تأكيد الحجز + %s · %s + %s-%s + إضافة كوبون خصم + تفاصيل السعر + المجموع الفرعي + الإجمالي + كوبون الخصم + بحجز هذا الموعد ، فإنك توافق على \n الشروط و الظروف + جدولة موعد + شاور + استشارة ل %s \n في %s + تعديل الوقت + قم بالتسجيل باستخدام رقم الهاتف + بالمتابعة ، أنت توافق على\n + شروط الخدمة + و + سياسة الخصوصية + هل لديك حساب؟ + تطبيق + دقيقة + المبلغ المدخل + دفع + إلغاء التعيين + إعادة الجدولة + استشر الطبيب + %s ]]> + %s مستخدم متبقي ]]> + %s خصم على الحجز أ %s إلى %s ]]> + الرجاء إضافة قسيمة صالحة + هل أنت متأكد من إلغاء الموعد؟ + فشل الاجراء + حذف + هل أنت متأكد من حذف هذه البطاقة؟ + تحرير البطاقة + تقييم + صباح + مساء + بعد الظهر + احجز مرة أخرى + توصيل… + جاري قطع الاتصال … + نجاح العملية + فشل الاجراء + + + لا تصنيف! + ستظهر الفئات هنا بمجرد إضافتها. + لا يوجد طلبات حالياً! + ليس لديك أي طلبات حالية. + لايوجد أي محادثات بعد! + بمجرد قبول طلبات الدردشة الخاصة بك و تبدأ المحادثة ، ستظهر المواضيع هنا. + أعد شحن محفظتك لإنشاء حجز! + بمجرد إضافة الأموال أو أي خصم سيظهر هنا. + لا إخطارات حتى الآن! + ستظهر هنا جميع الإخطارات المتعلقة بأنشطتك. + لا يوجد تاريخ للمواعيد! + لا توجد مواعيد مجدولة. + لا خبراء حتى الان! + لم يتم حاليًا تسجيل أي خبير ضمن \'%s\' ، لذا عد لاحقًا. + لم يتم العثور على تاريخ طبي! + كن أول طبيب يكتب عن هذا المريض. + + + + مشاركة + تحقق من المنصب + مرحباً، +تطبيق إنهوميد لتقديم الاستشارات عبر الإنترنت للأطباء وأخصائيي العلاج الطبيعي وما إلى ذلك، جربّه الآن. + دفع + العنوان + + مشاهدة الكل + مشاهدة الوصفة الطبية + الكل + تفاصيل + + + تخطي حالياً + استخدم موقعي + سنحتاج إلى موقعك لنمنحك تجربة أفضل + السماح بمشاركة موقعك معنا + + + رفض + رد + تسجيل الدخول مع + + + استشارة أونلاين + استشارة طارئة + حجز موعد رعاية منزلية + حجز موعد في العيادة + + + تقدير وقت الوصول : %s + الحالة : + فى الطريق + وصلت إلى الوجهة + وصل + بدأت الخدمة + المكتملة + تتبع الحالة + إنهاء + هل أنت متأكد من طلب الخروج؟ سيتوقف التتبع الخاص بك + سنحتاج إلى إذن الاتصال الخاص بك لمنحك تجربة أفضل + اكتملت الخدمة + كتابة مراجعة للخدمة + الخدمة الملغاة + + + اللغة + فضلاً اختر اللغة + English + عربي + إعدادات الحساب + تغيير كلمة المرور + كلمة المرور القديمة + كلمة المرور الجديدة + تأكيد كلمة المرور الجديدة + + + تم إرسال الطلب بنجاح! + تم تغيير كلمة المرور الخاصة بك بنجاح! + تمت إضافة المريض بنجاح! + + + عرض الخريطة + تطبيق خرائط جوجل غير موجود + مسافة + التاريخ + الوقت + نوع الخدمة + + اسحب للإلغاء + عرض التفاصيل + السعر + تفاصيل الوصفة + جارى التحميل… + إتمام الدفع \nالرجاء الانتظار + عنوان %s + ضريبة + خدمات + كمية: %s + قبول الدفع الإضافي + هل أنت متأكد من متابعة الدفع؟ + التفاصيل البنكية + اسم البنك + رقم الحساب بصيغة IBAN + التاريخ الطبي + تاريخ الموعد: %s + + سبب + سبب : %s + رقم الهوية الوطنية + diff --git a/app/src/homeDoctor/res/values/colors.xml b/app/src/homeDoctor/res/values/colors.xml new file mode 100644 index 0000000..a0dbb53 --- /dev/null +++ b/app/src/homeDoctor/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #80325A + #80325A + #80325A + + #3839C6C0 + #3380325A + diff --git a/app/src/homeDoctor/res/values/ic_launcher_background.xml b/app/src/homeDoctor/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..000499d --- /dev/null +++ b/app/src/homeDoctor/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #E6E6E6 + \ No newline at end of file diff --git a/app/src/homeDoctor/res/values/strings.xml b/app/src/homeDoctor/res/values/strings.xml new file mode 100644 index 0000000..428a115 --- /dev/null +++ b/app/src/homeDoctor/res/values/strings.xml @@ -0,0 +1,308 @@ + + Inhomed + + + 1304056943287310 + fb1304056943287310 + + + inhomed.page.link + com.homeDoctor.Khalid + + + AIzaSyDCVqemLb263wtS1eU2qiueV5AP9ME0F_A + 226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com + + You have new update for %s! + Create an account to continue%s + + Physician\'s now + Request your + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + Login + Facebook + Google + Login using Email + Sign Up using Email + Continue for %s + New user? + Sign Up + Let’s Get Started ! + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + Clients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Already Register? + Edit + Age: + Enter Phone Number + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + No Slot available + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + Cancel + Available balance + Pay out + Add Money + Add + Please enter amount + Added to wallet + Add Card + Type your message… + Photo + Enter message + Today + Yesterday + Transaction History + Paid to\n%s + Refund from\n%s + Select card + New Request + Accepted + In progress + No show + Cancelled + %s Card ending with %s + NA + Write down your reviews + Submit + Please give Feedback + please select rating + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + years + Rating + %s · %s Reviews + Request completed + Insufficient amount + You need to maintain sufficient balance of %s to create request + Schedule Request + Request Now + Select date + Select time + + Search for %s + Profile + %s/%s + Set Filter + Choose date & time + Tomorrow + Clear All + Booking Details + Appointment date & timings + Confirm Booking + %s · %s + %s-%s + Add Coupon Code + Price Detail + Sub-Total + Total + Promo Applied + By Booking this appointment, you agree to\nthe terms & conditions + Schedule a meeting + Consult + Consult for %s \n at %s + Edit Slot + Sign Up with Phone Number + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Already have an account? + Apply + Minute + Input amount + Pay + Cancel appointment + Re-Schedule + Consult a Doctor + %s ]]> + %s User Remaining ]]> + %s Discount on booking a %s till %s ]]> + Please add valid coupon + Are you sure you want to cancel appointment? + Transaction failed + Delete + Are you sure you want to delete this card? + Edit card + Rate + Morning + Evening + Afternoon + Book again + Connecting… + Disconnecting… + Transaction Success + Transaction Failed + + + No Category! + Categories will shown here once added. + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + Recharge your wallet to create booking! + Once you add money or any deduction will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No appointments history! + No Appointments scheduled. + No experts yet! + Currently not any expert registered under \'%s\', so come back later. + No medical history found! + Be the first doctor to write about this patient. + + + + Share + Checkout this post + Hey, Here is app for Online Consultancy Platform for Doctors, Physiotherapists, Accountants, Lawyers, Consultants etc. You should try it. + Payment + Address + + View all + View Prescription + All + Details + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login With + + + Consult Online + Home Care Appointment + Clinic Appointment + + + Estimate Time of Arrival : %s + Status : + On the way + Reached Destination + Arrived + Started + Completed + Track Status + Quit + Are you sure you want to quit? It will stop your tracking + We will need your call permission to give you better experience + Service completed + Give Feedback + Cancelled Service + + + Language + Please choose your language + English + عربى + Account Setting + Change Password + Old Password + New Password + Confirm New Password + + + Request Sent successfully! + Your password changed successfully! + Patient added successfully! + + + View map + Google map application not found + Distance + Date + Time + Service Type + + Slide To Cancel + View Details + Price + Prescription detail + Downloading… + Completing your payment\nPlease wait… + Address for %s + Tax + Services + Amount: %s + Pay services + Are you sure you want to proceed payment? + Bank details + Bank name + IBAN + Medical History + Appointment Date: %s + + + @string/all + @string/new_request + @string/completed + @string/canceled + + + Reason + Reason : %s + National ID Number + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d555ee2 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/description_of_service_recommended.pdf b/app/src/main/assets/description_of_service_recommended.pdf new file mode 100644 index 0000000..4112b8f Binary files /dev/null and b/app/src/main/assets/description_of_service_recommended.pdf differ diff --git a/app/src/main/assets/line_progress.json b/app/src/main/assets/line_progress.json new file mode 100644 index 0000000..b46c63c --- /dev/null +++ b/app/src/main/assets/line_progress.json @@ -0,0 +1 @@ +{"v":"5.6.3","fr":25,"ip":0,"op":75,"w":450,"h":5,"nm":"Refresh_btle","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Livello forma 1","sr":1.5,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-6.296,2.436,0],"to":[38.532,0,0],"ti":[-77.292,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[224.897,2.436,0],"to":[77.292,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37.5,"s":[457.454,2.436,0],"to":[0,0,0],"ti":[77.292,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55.5,"s":[224.897,2.436,0],"to":[-77.292,0,0],"ti":[38.533,0,0]},{"t":73.5,"s":[-6.3,2.436,0]}],"ix":2},"a":{"a":0,"k":[-162.512,-0.375,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":18,"s":[225,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37.5,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.5,"s":[225,100,100]},{"t":73.5,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[50,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Tracciato rettangolo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.21568627450980393,0.1843137254901961,0.5098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Traccia 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21568627450980393,0.1843137254901961,0.5098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Riempimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-162.467,-0.311],"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":"Trasformazione"}],"nm":"Rettangolo 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Livello forma 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[377.17,2.376,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":[{"ty":"rc","d":1,"s":{"a":0,"k":[450,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Tracciato rettangolo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.21568627450980393,0.1843137254901961,0.5098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Traccia 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8156862745098039,0.9019607843137255,1,1],"ix":4},"o":{"a":0,"k":8,"ix":5},"r":1,"bm":0,"nm":"Riempimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.17,0.124],"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":"Trasformazione"}],"nm":"Rettangolo 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/network_error.json b/app/src/main/assets/network_error.json new file mode 100644 index 0000000..a984809 --- /dev/null +++ b/app/src/main/assets/network_error.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":74,"ip":0,"op":193,"w":141,"h":112,"nm":"Comp 1","ddd":0,"assets":[],"fonts":{"list":[{"fName":"Lato-Bold","fFamily":"Lato","fStyle":"Bold","ascent":74.2996215820313}]},"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2/error2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81.75,74,0],"ix":2},"a":{"a":0,"k":[2.5,40,0],"ix":1},"s":{"a":0,"k":[38.062,46.611,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],[-1.145,0],[0,-1.144]],"o":[[0,0],[0,0],[0,-1.144],[1.145,0],[0,0]],"v":[[2.073,39.624],[-2.073,39.624],[-2.073,-37.553],[0,-39.624],[2.073,-37.553]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.323,39.875],"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":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Network Error","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[76.25,42,0],"ix":2},"a":{"a":0,"k":[46.5,-4,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":147,"s":[0,0,100],"e":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":152,"s":[105,105,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":155,"s":[100,100,100],"e":[105,105,100]},{"t":157}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"Lato-Bold","t":"Network Error","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.96,0.12,0.12]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":147,"op":194,"st":147,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 1/error2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":81,"s":[0],"e":[-26]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":94,"s":[-26],"e":[26]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p833_1_0p333_0"],"t":106,"s":[26],"e":[319]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":124,"s":[319],"e":[414]},{"t":147}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":107,"s":[82.25,47,0],"e":[96,78.5,0],"to":[2.29166674613953,5.25,0],"ti":[-4.375,-4.41666650772095,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":124,"s":[96,78.5,0],"e":[108.5,73.5,0],"to":[4.375,4.41666650772095,0],"ti":[-3.625,-1.41666662693024,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":137,"s":[108.5,73.5,0],"e":[117.75,87,0],"to":[3.625,1.41666662693024,0],"ti":[-1.54166662693024,-2.25,0]},{"t":147}],"ix":2},"a":{"a":0,"k":[29,25.5,0],"ix":1},"s":{"a":0,"k":[35.293,35.293,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],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.037,-8.539],[0.54,8.538],[-0.541,8.538],[-1.038,-8.539]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.23,-0.237],[-0.009,-0.329],[0,0],[-0.669,0],[0,0],[-0.02,0.669],[0,0],[0.23,0.236],[0.33,0],[0,0]],"o":[[-0.23,0.236],[0,0],[0.02,0.668],[0,0],[0.669,0],[0,0],[0.01,-0.329],[-0.23,-0.237],[0,0],[-0.33,0]],"v":[[-2.317,-9.781],[-2.664,-8.892],[-2.145,8.962],[-0.917,10.154],[0.916,10.154],[2.144,8.962],[2.663,-8.892],[2.316,-9.781],[1.436,-10.154],[-1.436,-10.154]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,26.116],"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":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,0.946],[-0.877,0],[0,-0.992]],"o":[[0,0],[-0.854,0],[0,-0.947],[0.919,0],[0,0.741]],"v":[[0,1.607],[-0.04,1.607],[-1.49,0.001],[0,-1.607],[1.49,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.828,0],[0,-1.837],[-1.748,0],[0,0],[0,1.867]],"o":[[-1.771,0],[0,1.836],[0,0],[1.799,0],[0,-1.898]],"v":[[0,-3.222],[-3.105,0.001],[-0.04,3.222],[0,3.222],[3.105,0.001]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,40.443],"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":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.034,-0.061],[0.017,0],[0,0],[0.034,0.06],[-0.009,0.015],[0,0],[-0.069,0],[-0.008,-0.014],[0,0]],"o":[[-0.035,0.06],[0,0],[-0.017,0],[-0.035,-0.061],[0,0],[0.009,-0.014],[0.07,0],[0,0],[0.009,0.015]],"v":[[20.035,17.319],[19.931,17.379],[-19.93,17.379],[-20.034,17.319],[-20.034,17.199],[-0.104,-17.319],[0,-17.378],[0.104,-17.319],[20.035,17.199]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.628,0],[0.314,-0.544],[0,0],[-0.314,-0.544],[-0.628,0],[0,0],[-0.313,0.543],[0.314,0.543],[0,0]],"o":[[-0.627,0],[0,0],[-0.314,0.543],[0.314,0.543],[0,0],[0.626,0],[0.314,-0.544],[0,0],[-0.314,-0.543]],"v":[[0,-18.994],[-1.503,-18.125],[-21.433,16.391],[-21.433,18.127],[-19.93,18.994],[19.931,18.994],[21.433,18.127],[21.433,16.391],[1.503,-18.126]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.702,26.987],"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 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.386,-0.224],[-0.223,0.387],[0,0],[-0.07,0],[-0.008,-0.015],[0,0],[-0.28,0],[-0.127,0.073],[0.222,0.387],[0,0],[0.628,0],[0.314,-0.544],[0,0]],"o":[[0.386,0.223],[0,0],[0.008,-0.014],[0.07,0],[0,0],[0.15,0.26],[0.136,0],[0.387,-0.223],[0,0],[-0.314,-0.544],[-0.627,0],[0,0],[-0.224,0.387]],"v":[[-15.91,13.605],[-14.807,13.309],[-0.105,-12.152],[-0.001,-12.212],[0.104,-12.152],[14.807,13.312],[15.508,13.716],[15.911,13.608],[16.206,12.504],[1.503,-12.959],[-0.001,-13.828],[-1.504,-12.959],[-16.204,12.501]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,14.078],"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 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.313,0.543],[0,0],[0.387,-0.222],[-0.224,-0.387],[0,0],[0.034,-0.06],[0.018,0],[0,0],[0.035,0.06],[-0.009,0.014],[0,0],[0.386,0.223],[0.223,-0.386],[0,0],[-0.313,-0.543],[-0.628,0],[0,0],[-0.313,0.544]],"o":[[0,0],[-0.223,-0.386],[-0.386,0.224],[0,0],[0.007,0.014],[-0.036,0.06],[0,0],[-0.017,0],[-0.035,-0.06],[0,0],[0.224,-0.386],[-0.386,-0.223],[0,0],[-0.313,0.543],[0.314,0.544],[0,0],[0.628,0],[0.313,-0.543]],"v":[[28.139,7.882],[17.833,-9.967],[16.73,-10.264],[16.436,-9.16],[26.742,8.689],[26.742,8.809],[26.636,8.87],[-26.637,8.87],[-26.74,8.809],[-26.74,8.689],[-16.441,-9.148],[-16.736,-10.251],[-17.839,-9.956],[-28.139,7.882],[-28.139,9.617],[-26.635,10.486],[26.636,10.486],[28.139,9.617]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,39.368],"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 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.007,-0.236],[0,0],[0.228,0],[0,0],[0.006,0.228],[0,0],[-0.237,0]],"o":[[0.236,0],[0,0],[-0.007,0.228],[0,0],[-0.228,0],[0,0],[-0.007,-0.236],[0,0]],"v":[[1.436,-9.346],[1.856,-8.914],[1.337,8.938],[0.916,9.346],[-0.917,9.346],[-1.337,8.938],[-1.856,-8.914],[-1.436,-9.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,26.116],"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 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.325,0],[0,-1.402],[1.402,0],[0,0],[0,1.362]],"o":[[1.402,0],[0,1.362],[0,0],[-1.323,0],[0,-1.402]],"v":[[0,-2.415],[2.298,0.001],[0,2.415],[-0.04,2.415],[-2.298,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,40.443],"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 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.357,0.619],[0,0],[0.357,-0.618],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.358,-0.618],[0,0],[0,0],[0,0],[0.714,-0.001]],"v":[[11.125,16.871],[-8.805,-17.646],[-10.413,-17.646],[-11.482,-15.792],[8.241,18.264],[10.321,18.264]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.312,26.911],"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 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.357,0.619],[0,0],[-0.357,-0.618],[0,0],[0.714,0],[0,0]],"o":[[0,0],[0.357,-0.618],[0,0],[0.357,0.619],[0,0],[-0.715,0]],"v":[[-20.734,16.871],[-0.804,-17.646],[0.803,-17.646],[20.734,16.871],[19.93,18.264],[-19.93,18.264]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,26.91],"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 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.357,0.619],[0,0],[0.357,-0.618],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.358,-0.618],[0,0],[0,0],[0,0],[0.714,0]],"v":[[14.426,22.678],[-12.21,-23.453],[-13.818,-23.453],[-14.783,-21.778],[11.689,24.071],[13.622,24.071]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.716,24.975],"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 10","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.357,0.619],[0,0],[-0.357,-0.618],[0,0],[0.714,0],[0,0]],"o":[[0,0],[0.357,-0.618],[0,0],[0.357,0.619],[0,0],[-0.715,0]],"v":[[-27.44,22.678],[-0.804,-23.453],[0.803,-23.453],[27.44,22.678],[26.636,24.071],[-26.636,24.071]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,24.975],"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 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.75,85.5,0],"ix":2},"a":{"a":0,"k":[12,6.5,0],"ix":1},"s":{"a":0,"k":[127.544,127.544,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],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.253,1.788],[4.333,1.723],[2.872,1.617],[-5.253,1.027],[0.05,-1.788],[5.077,1.378]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.773000021542,0.764999988032,0.791999966491,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.665,5.949],"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":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"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":[[5.253,3.732],[4.333,3.667],[2.872,3.561],[-5.253,2.971],[-3.313,-2.133],[-3.004,-2.949],[-2.704,-3.732],[0.05,0.156],[5.077,3.322]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.532999973671,0.525,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.665,4.005],"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":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"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":[[7.549,1.607],[7.374,1.195],[2.346,-1.971],[-0.408,-5.859],[-0.426,-5.88],[-7.803,-3.622],[-8.195,-1.245],[-8.475,0.452],[-9.146,4.503],[-9.262,5.193],[-9.376,5.88],[9.376,5.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670999983245,0.666999966491,0.689999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.369,6.131],"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 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.115,-3.643],[-1.07,-1.469],[-3.115,3.643],[2.984,3.643]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.46699999641,0.497999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.364,8.369],"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 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 4/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[1800]},{"t":81}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[-14.5,84,0],"e":[73.75,83.25,0],"to":[14.7083330154419,-0.125,0],"ti":[-14.7083330154419,0.125,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":81,"s":[73.75,83.25,0],"e":[73.75,83.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":92}],"ix":2},"a":{"a":0,"k":[13.5,13.5,0],"ix":1},"s":{"a":0,"k":[68.362,68.362,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.149,0],[0,-7.152],[-7.152,0],[-2.224,1.795],[0,0],[2.516,0],[0,6.02],[-6.023,0],[0,-6.024],[1.701,-1.925],[0,0],[0,3.328]],"o":[[-7.152,0],[0,7.149],[3.078,0],[0,0],[-1.849,1.433],[-6.023,0],[0,-6.024],[6.021,0],[0,2.765],[0,0],[2.067,-2.295],[0,-7.152]],"v":[[0.002,-12.947],[-12.947,0.001],[0.002,12.947],[8.13,10.077],[6.687,8.633],[0.002,10.924],[-10.924,0.001],[0.002,-10.921],[10.923,0.001],[8.189,7.221],[9.624,8.658],[12.947,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.647058823529,0.105882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.196,13.196],"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":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.427,0.022],[0.022,-0.426],[1.04,-0.906],[1.785,0.153],[0.036,-0.426],[-0.427,-0.036],[-0.28,0],[-1.214,1.055],[-0.114,2.16]],"o":[[-0.437,-0.023],[-0.092,1.731],[-1.074,0.933],[-0.438,-0.049],[-0.037,0.427],[0.291,0.027],[1.851,0],[1.365,-1.188],[0.023,-0.426]],"v":[[3.519,-3.755],[2.705,-3.023],[0.975,1.007],[-3.398,2.197],[-4.236,2.902],[-3.531,3.74],[-2.675,3.777],[1.99,2.176],[4.25,-2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117647059,0.447058823529,0.094117647059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.519,17.092],"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":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[1800]},{"t":81}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[-42.75,84.5,0],"e":[51.5,83.75,0],"to":[15.7083330154419,-0.125,0],"ti":[-15.75,0.75000107288361,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":81,"s":[51.5,83.75,0],"e":[51.75,80,0],"to":[3.14999581974007e-10,-1.50000012411056e-11,0],"ti":[-0.04166666790843,-0.04166666790843,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":88,"s":[51.75,80,0],"e":[51.75,84,0],"to":[0.04166666790843,0.04166666790843,0],"ti":[0,-0.66666668653488,0]},{"t":98}],"ix":2},"a":{"a":0,"k":[13.5,13.5,0],"ix":1},"s":{"a":0,"k":[68.362,68.362,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.073,0.933],[0.091,1.73],[0.412,-0.024],[-0.023,-0.427],[-1.364,-1.188],[-1.851,0],[-0.291,0.027],[0.038,0.426],[0.428,-0.048]],"o":[[-1.04,-0.905],[-0.022,-0.427],[-0.428,0.023],[0.113,2.159],[1.215,1.056],[0.28,0],[0.427,-0.036],[-0.037,-0.426],[-1.788,0.154]],"v":[[-0.974,1.007],[-2.703,-3.021],[-3.517,-3.754],[-4.25,-2.939],[-1.991,2.176],[2.675,3.778],[3.531,3.74],[4.235,2.903],[3.398,2.198]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117647059,0.447533760819,0.095271046956,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.931,17.091],"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":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.149,0],[2.261,-1.926],[0,0],[-2.64,0],[0,-6.024],[6.023,0],[0,6.02],[-1.568,1.89],[0,0],[0,-3.209],[-7.149,0],[0,7.149]],"o":[[-3.2,0],[0,0],[1.891,-1.562],[6.023,0],[0,6.02],[-6.023,0],[0,-2.645],[0,0],[-1.932,2.261],[0,7.149],[7.149,0],[0,-7.152]],"v":[[0,-12.947],[-8.392,-9.859],[-6.952,-8.419],[0,-10.921],[10.922,0.001],[0,10.924],[-10.922,0.001],[-8.409,-6.962],[-9.849,-8.402],[-12.948,0.001],[0,12.947],[12.948,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.647751393038,0.105051900826,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.198,13.196],"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":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 2/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":81,"s":[0],"e":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":89,"s":[7],"e":[0]},{"t":98}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[-28,74.25,0],"e":[63.693,73.5,0],"to":[13.6936912536621,0,0],"ti":[-18.0084609985352,0,0]},{"t":81}],"ix":2},"a":{"a":0,"k":[22,14,0],"ix":1},"s":{"a":0,"k":[68.362,68.362,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.454],[-0.454,0],[0,0],[0,-0.455],[0.454,0],[0,0]],"o":[[0,-0.454],[0,0],[0.454,0],[0,0.454],[0,0],[-0.454,0]],"v":[[-19.628,-10.889],[-18.805,-11.713],[-10.779,-11.713],[-9.956,-10.889],[-10.779,-10.065],[-18.805,-10.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.023,-0.044],[0,0],[-0.442,0.221],[0.221,0.442],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.648,-0.875],[1.12,0],[0,-0.494],[-0.495,0],[-0.794,1.073],[0.04,0.131],[0.393,0],[0,0],[0.11,-0.384],[0,0],[0,0],[0,0],[0,0],[0,1.441],[1.442,0],[0,0],[0,-1.443],[-1.442,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.484,-0.097],[-0.059,0],[-0.084,0.425],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0.016,0.049],[0,0],[0.22,0.443],[0.442,-0.221],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.138,0.799],[-0.443,0.599],[-0.495,0],[0,0.494],[1.702,0],[1.5,-2.026],[-0.115,-0.376],[0,0],[-0.399,0],[0,0],[0,0],[0,0],[0,0],[1.441,0],[0,-1.442],[0,0],[-1.442,0],[0,1.441],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.097,0.485],[0.059,0.012],[0.418,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.684,3.214],[11.861,7.136],[11.917,7.278],[14.21,11.864],[15.411,12.265],[15.811,11.064],[13.553,6.548],[12.346,2.523],[11.833,0.807],[10.214,-4.59],[12.247,-11.713],[18.88,-11.713],[18.482,-8.663],[16.158,-7.772],[15.262,-6.877],[16.158,-5.982],[19.921,-7.598],[20.452,-12.871],[19.596,-13.505],[11.572,-13.505],[10.712,-12.856],[8.604,-5.481],[-12.971,-5.481],[-13.77,-8.276],[-10.781,-8.276],[-8.165,-10.89],[-10.781,-13.506],[-18.805,-13.506],[-21.421,-10.89],[-18.805,-8.276],[-15.633,-8.276],[-14.566,-4.548],[-15.548,0.357],[-15.898,2.114],[-17.962,12.435],[-17.262,13.488],[-17.085,13.506],[-16.208,12.786],[-14.145,2.467],[-13.792,0.712],[-12.911,-3.688],[8.615,-3.688],[10.165,1.481]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.647058823529,0.105882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.671,13.756],"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":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"N","size":13,"style":"Bold","w":75.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.6,0],[0,0],[0,0],[0,0],[0,0],[0.05,1.05],[0.1,1.067],[0,0],[-0.7,-0.333],[-1.067,0],[0,0],[0,0],[0,0],[0,0],[-0.05,-1.116],[-0.134,-1.166],[0,0],[0.3,0.284],[0.316,0.15],[0.4,0.05]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-0.866],[-0.05,-1.05],[0,0],[0.666,0.867],[0.7,0.334],[0,0],[0,0],[0,0],[0,0],[0,0.967],[0.05,1.117],[0,0],[-0.367,-0.466],[-0.3,-0.283],[-0.317,-0.15],[-0.4,-0.05]],"v":[[14.35,-72.3],[7.3,-72.3],[7.3,0],[19.15,0],[19.15,-44.4],[19.075,-47.275],[18.85,-50.45],[56.65,-2.3],[58.7,-0.5],[61.35,0],[68.3,0],[68.3,-72.3],[56.45,-72.3],[56.45,-28.35],[56.525,-25.225],[56.8,-21.8],[18.85,-70.15],[17.85,-71.275],[16.925,-71.925],[15.85,-72.225]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"N","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"e","size":13,"style":"Bold","w":53.45,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.05,-1.333],[2.116,-2.283],[1.133,-3.083],[0,-3.5],[-1.3,-3.416],[-2.267,-2.316],[-3.067,-1.183],[-3.567,0],[-1.917,0.266],[-1.85,0.65],[-1.7,1.084],[-1.367,1.6],[0,0],[0.366,0.2],[0.5,0],[0.816,-0.466],[1.083,-0.566],[1.45,-0.466],[2,0],[2.466,2.467],[0.366,5.267],[0,0],[-0.367,0.15],[-0.217,0.35],[-0.084,0.617],[0,0.934],[1.1,2.884],[1.966,1.984],[2.716,1.034],[3.233,0]],"o":[[-3.05,1.334],[-2.117,2.284],[-1.134,3.084],[0,4.5],[1.3,3.417],[2.266,2.317],[3.066,1.183],[1.8,0],[1.916,-0.267],[1.85,-0.65],[1.7,-1.083],[0,0],[-0.267,-0.366],[-0.367,-0.2],[-0.767,0],[-0.817,0.467],[-1.084,0.567],[-1.45,0.467],[-4.067,0],[-2.467,-2.466],[0,0],[0.566,0],[0.366,-0.15],[0.216,-0.35],[0.083,-0.616],[0,-3.7],[-1.1,-2.883],[-1.967,-1.983],[-2.717,-1.033],[-3.834,0]],"v":[[17.475,-50.1],[9.725,-44.675],[4.85,-36.625],[3.15,-26.75],[5.1,-14.875],[10.45,-6.275],[18.45,-1.025],[28.4,0.75],[33.975,0.35],[39.625,-1.025],[44.95,-3.625],[49.55,-7.65],[45.95,-12.15],[45,-13],[43.7,-13.3],[41.325,-12.6],[38.475,-11.05],[34.675,-9.5],[29.5,-8.8],[19.7,-12.5],[15.45,-24.1],[47.15,-24.1],[48.55,-24.325],[49.425,-25.075],[49.875,-26.525],[50,-28.85],[48.35,-38.725],[43.75,-46.025],[36.725,-50.55],[27.8,-52.1]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.367,-0.616],[-0.9,-1.066],[-0.434,-1.416],[0,-1.6],[0,0],[-2.034,2.034],[-3.6,0]],"o":[[1.366,0.617],[0.9,1.067],[0.433,1.417],[0,0],[0.566,-3.733],[2.033,-2.033],[1.833,0]],"v":[[32.85,-42.325],[36.25,-39.8],[38.25,-36.075],[38.9,-31.55],[15.7,-31.55],[19.6,-40.2],[28.05,-43.25]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"t","size":13,"style":"Bold","w":38.7,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.334,0.766],[-1.8,1.5],[0,0],[0.233,0.184],[0.366,0],[0.3,-0.183],[0.383,-0.2],[0.516,-0.183],[0.766,0],[0.8,0.9],[0,1.6],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.483,-0.366],[0.133,-0.666],[0,0],[0,0],[0,0],[-0.484,-0.433],[-0.667,0],[0,0],[0,0],[-2.4,-2.516],[-4.434,0]],"o":[[2.333,-0.766],[0,0],[-0.267,-0.366],[-0.234,-0.183],[-0.3,0],[-0.3,0.184],[-0.384,0.2],[-0.517,0.184],[-1.334,0],[-0.8,-0.9],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.734,0],[-0.484,0.367],[0,0],[0,0],[0,0],[0,0.867],[0.483,0.434],[0,0],[0,0],[0,4.434],[2.4,2.517],[2.5,0]],"v":[[30.7,-0.35],[36.9,-3.75],[33.2,-9.75],[32.45,-10.575],[31.55,-10.85],[30.65,-10.575],[29.625,-10],[28.275,-9.425],[26.35,-9.15],[23.15,-10.5],[21.95,-14.25],[21.95,-42.05],[35.45,-42.05],[35.45,-50.85],[21.95,-50.85],[21.95,-67],[15.55,-67],[13.725,-66.45],[12.8,-64.9],[10.2,-50.9],[1.95,-49.55],[1.95,-44.65],[2.675,-42.7],[4.4,-42.05],[9.6,-42.05],[9.6,-13.4],[13.2,-2.975],[23.45,0.8]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"w","size":13,"style":"Bold","w":79.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.467,1.467],[0,0],[-0.234,0.984],[-0.2,1],[-0.25,-0.983],[-0.3,-0.966],[0,0],[-1.067,0],[0,0],[0,0],[0,0],[0.633,-0.433],[0.166,-0.666],[0,0],[0.283,-1.433],[0.233,-1.433],[0.35,1.35],[0.433,1.434],[0,0],[0.6,0.434],[0.9,0],[0,0],[0.6,-0.433],[0.2,-0.666],[0,0],[0.416,-1.433],[0.366,-1.433],[0.25,1.434],[0.4,1.5],[0,0],[0.633,0.434],[0.933,0],[0,0]],"o":[[0,0],[1.333,0],[0,0],[0.3,-1],[0.233,-0.983],[0.166,0.967],[0.25,0.984],[0,0],[0.466,1.467],[0,0],[0,0],[0,0],[-0.834,0],[-0.634,0.434],[0,0],[-0.434,1.534],[-0.284,1.434],[-0.334,-1.366],[-0.35,-1.35],[0,0],[-0.2,-0.666],[-0.6,-0.433],[0,0],[-0.8,0],[-0.6,0.434],[0,0],[-0.467,1.5],[-0.417,1.434],[-0.234,-1.433],[-0.25,-1.433],[0,0],[-0.167,-0.666],[-0.634,-0.433],[0,0],[0,0]],"v":[[16.6,0],[26.05,0],[28.75,-2.2],[38.1,-31.75],[38.9,-34.725],[39.55,-37.7],[40.175,-34.775],[41,-31.85],[50.25,-2.2],[52.55,0],[62.5,0],[78.75,-51.3],[69.4,-51.3],[67.2,-50.65],[66,-49],[58.4,-21.6],[57.325,-17.15],[56.55,-12.85],[55.525,-16.925],[54.35,-21.1],[45.95,-49.1],[44.75,-50.75],[42.5,-51.4],[37.05,-51.4],[34.95,-50.75],[33.75,-49.1],[25.25,-21.6],[23.925,-17.2],[22.75,-12.9],[22.025,-17.2],[21.05,-21.6],[13.7,-49],[12.5,-50.65],[10.15,-51.3],[0.35,-51.3]],"c":true},"ix":2},"nm":"w","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"w","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"o","size":13,"style":"Bold","w":56.85,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.133,-1.233],[2.216,-2.266],[1.216,-3.266],[0,-4.033],[-1.217,-3.266],[-2.217,-2.3],[-3.134,-1.233],[-3.834,0],[-3.117,1.233],[-2.2,2.3],[-1.2,3.267],[0,4.067],[1.2,3.267],[2.2,2.267],[3.116,1.234],[3.833,0]],"o":[[-3.134,1.234],[-2.217,2.267],[-1.217,3.267],[0,4.067],[1.216,3.267],[2.216,2.3],[3.133,1.233],[3.833,0],[3.116,-1.233],[2.2,-2.3],[1.2,-3.266],[0,-4.033],[-1.2,-3.266],[-2.2,-2.266],[-3.117,-1.233],[-3.834,0]],"v":[[18.05,-50.25],[10.025,-45],[4.875,-36.7],[3.05,-25.75],[4.875,-14.75],[10.025,-6.4],[18.05,-1.1],[28.5,0.75],[38.925,-1.1],[46.9,-6.4],[52,-14.75],[53.8,-25.75],[52,-36.7],[46.9,-45],[38.925,-50.25],[28.5,-52.1]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.066,2.884],[0,5.5],[-2.067,2.917],[-4.334,0],[-2.05,-2.9],[0,-5.533],[2.05,-2.866],[4.266,0]],"o":[[-2.067,-2.883],[0,-5.5],[2.066,-2.916],[4.266,0],[2.05,2.9],[0,5.534],[-2.05,2.867],[-4.334,0]],"v":[[18.9,-13.075],[15.8,-25.65],[18.9,-38.275],[28.5,-42.65],[37.975,-38.3],[41.05,-25.65],[37.975,-13.05],[28.5,-8.75]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"r","size":13,"style":"Bold","w":40.85,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.834,1.417],[-2.567,0],[-0.867,-0.233],[-0.5,0],[-0.334,0.25],[-0.1,0.6],[0,0],[2.533,0],[2.466,-1.833],[1.833,-3.166],[0,0],[0.5,0.467],[1.266,0],[0,0],[0,0]],"o":[[0,0],[1.266,-2.733],[1.833,-1.416],[1.433,0],[0.866,0.234],[0.566,0],[0.333,-0.25],[0,0],[-1.667,-1.166],[-3.067,0],[-2.467,1.834],[0,0],[-0.167,-1.133],[-0.5,-0.466],[0,0],[0,0],[0,0]],"v":[[18.95,0],[18.95,-31.95],[23.6,-38.175],[30.2,-40.3],[33.65,-39.95],[35.7,-39.6],[37.05,-39.975],[37.7,-41.25],[39.3,-50.5],[33,-52.25],[24.7,-49.5],[18.25,-42],[17.5,-48.2],[16.5,-50.6],[13.85,-51.3],[6.6,-51.3],[6.6,0]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"k","size":13,"style":"Bold","w":55.15,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.5,-0.233],[-0.5,-0.766],[0,0],[-0.667,-0.333],[-0.967,0],[0,0],[0,0],[0.533,0.667],[0.7,0.5],[-0.6,0.584],[-0.567,0.7],[0,0],[0,0],[0.633,-0.383],[0.566,-0.666],[0,0],[0.466,-0.233],[0.833,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1,0],[0.5,0.234],[0,0],[0.533,0.8],[0.666,0.334],[0,0],[0,0],[-0.534,-0.766],[-0.534,-0.666],[0.7,-0.433],[0.6,-0.583],[0,0],[0,0],[-1.034,0],[-0.634,0.384],[0,0],[-0.534,0.634],[-0.467,0.234],[0,0],[0,0],[0,0]],"v":[[6.75,-74.3],[6.75,0],[19.1,0],[19.1,-23.5],[21.9,-23.5],[24.15,-23.15],[25.65,-21.65],[38.7,-2.2],[40.5,-0.5],[42.95,0],[54.1,0],[37,-24.9],[35.4,-27.05],[33.55,-28.8],[35.5,-30.325],[37.25,-32.25],[53.2,-51.3],[41.9,-51.3],[39.4,-50.725],[37.6,-49.15],[24.85,-33.4],[23.35,-32.1],[21.4,-31.75],[19.1,-31.75],[19.1,-74.3]],"c":true},"ix":2},"nm":"k","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"k","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":" ","size":13,"style":"Bold","w":19.3,"data":{},"fFamily":"Lato"},{"ch":"E","size":13,"style":"Bold","w":57.25,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"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":[[7.3,-72.3],[7.3,0],[52.9,0],[52.9,-10.75],[20.85,-10.75],[20.85,-31.2],[46.1,-31.2],[46.1,-41.55],[20.85,-41.55],[20.85,-61.6],[52.9,-61.6],[52.9,-72.3]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"E","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"}]} \ No newline at end of file diff --git a/app/src/main/assets/pregnant_women.json b/app/src/main/assets/pregnant_women.json new file mode 100644 index 0000000..109cde5 --- /dev/null +++ b/app/src/main/assets/pregnant_women.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.14","a":"G. S. ","k":"embarazada","d":"embarazada feliz","tc":""},"fr":24,"ip":0,"op":48,"w":500,"h":500,"nm":"embarazada","ddd":0,"assets":[],"fonts":{"list":[{"fName":"Verdana","fFamily":"Verdana","fStyle":"Regular","ascent":75.9994506835938}]},"layers":[{"ddd":0,"ind":1,"ty":5,"nm":"Slider Control label","parent":3,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"t":47,"s":[0,23,0]}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[50,50,100]},{"t":47,"s":[50,50,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"s":50,"f":"Verdana","t":"Ojos","j":2,"tr":0,"lh":60,"ls":0,"fc":[0.886,0.243,0.243]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":1,"nm":"Slider Control","parent":3,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":9,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[-7.333]},"o":{"x":[0.167],"y":[-8.333]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.951]},"o":{"x":[0.167],"y":[0.083]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.798]},"o":{"x":[0.167],"y":[-0.119]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.142]},"t":14,"s":[58.73]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-4.894]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":33,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-8.333]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]}},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"t":47,"s":[37,75,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[100,100,100]},{"t":47,"s":[100,100,100]}]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[62.5,50.5],[9.5,50.5],[37,76]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 1"},{"inv":false,"mode":"i","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,34],[0,75],[75,75],[75,34]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 2"}],"ef":[{"ty":5,"nm":"Slider Options","np":7,"mn":"Pseudo/fL3c11baf7UVr","ix":1,"en":1,"ef":[{"ty":7,"nm":"Orientation","mn":"Pseudo/fL3c11baf7UVr-0001","ix":1,"v":{"a":0,"k":0}},{"ty":0,"nm":"Slider Limit","mn":"Pseudo/fL3c11baf7UVr-0002","ix":2,"v":{"a":0,"k":100}},{"ty":7,"nm":"Slider Scale","mn":"Pseudo/fL3c11baf7UVr-0003","ix":3,"v":{"a":0,"k":36}},{"ty":0,"nm":"Arrow Size","mn":"Pseudo/fL3c11baf7UVr-0004","ix":4,"v":{"a":0,"k":100}},{"ty":7,"nm":"Negative Slider Values?","mn":"Pseudo/fL3c11baf7UVr-0005","ix":5,"v":{"a":0,"k":0}}]}],"sw":75,"sh":75,"sc":"#f81f1f","ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Slider Control Origin","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"p":{"a":0,"k":[694,66,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[72,72,100]},{"t":47,"s":[72,72,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[200,12]},{"t":47,"s":[200,12]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.386029980229,1,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,-5]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,100]},{"t":47,"s":[100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Transform"}],"nm":"HitDetection","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,5.5],[0,-7.25]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,100]},{"t":47,"s":[100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Transform"}],"nm":"CenterLine","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[3,12]},{"t":47,"s":[3,12]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"t":47,"s":[100,-4.5]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"OuterLine","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,4]},{"t":47,"s":[100,4]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[-50,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,100]},{"t":47,"s":[100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Transform"}],"nm":"BaseLine","bm":0,"hd":false},{"ty":"rp","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[1]},{"t":47,"s":[1]}]},"o":{"a":0,"k":0},"m":1,"tr":{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[-100,100]},{"t":47,"s":[-100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"so":{"a":0,"k":100},"eo":{"a":0,"k":100},"nm":"Transform"},"nm":"Repeater 1","hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Ojos","hd":true,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Slider Control","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":9,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[-7.333]},"o":{"x":[0.167],"y":[-8.333]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.951]},"o":{"x":[0.167],"y":[0.083]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.798]},"o":{"x":[0.167],"y":[-0.119]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.142]},"t":14,"s":[58.73]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-4.894]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":33,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-8.333]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]}}]}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":1,"nm":"Cabeza general","parent":6,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[24.723,34.612,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":21,"s":[101.701,110.047,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[101.701,110.047,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[24.723,34.612,0]}]},"a":{"a":0,"k":[37.5,37.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[100,100,100]},{"t":47,"s":[100,100,100]}]}},"ao":0,"ef":[{"ty":5,"nm":"joystickLimit","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":200}}]}],"sw":75,"sh":75,"sc":"#f33333","ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Cabeza general Origin","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-150,90,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[16,16,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[251.383,200],"x":"var $bm_rt;\nvar temp;\ntemp = $bm_mul(thisComp.layer('Cabeza general')('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001'), 2);\n$bm_rt = [\n temp,\n temp\n];"},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117629528,0.310726553202,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":1,"lj":1,"ml":4,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":14}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"flequillo derecho Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[189.069,58.953,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 189.069198608398,\n 58.9526062011719,\n 0\n ];\n var key2 = [\n 194.069198608398,\n 58.9526062011719,\n 0\n ];\n var key3 = [\n 182.569198608398,\n 58.9526062011719,\n 0\n ];\n var key4 = [\n 189.069198608398,\n 60.9526062011719,\n 0\n ];\n var key5 = [\n 189.069198608398,\n 65.9526062011719,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[42.971,44.396,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[78.128,-7.349],[-77.616,-5.647]],"o":[[0,0],[0,0]],"v":[[-42.721,44.146],[42.721,-38.499]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[42.971,44.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"flequillo izquierdo Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[263.296,43.608,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 263.295791625977,\n 43.6083984375,\n 0\n ];\n var key2 = [\n 267.795776367188,\n 43.6083984375,\n 0\n ];\n var key3 = [\n 256.795776367188,\n 43.6083984375,\n 0\n ];\n var key4 = [\n 263.295776367188,\n 45.6083984375,\n 0\n ];\n var key5 = [\n 270.295776367188,\n 53.6083984375,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[52.389,44.001,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-79.107,-11.615],[104.278,-17.596]],"o":[[0,0],[0,0]],"v":[[50.172,43.679],[-52.139,-26.226]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[52.389,44.072]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ceja derecha Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[212.448,82.662,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 212.448196411133,\n 82.6616058349609,\n 0\n ];\n var key2 = [\n 217.948196411133,\n 82.6616058349609,\n 0\n ];\n var key3 = [\n 206.948196411133,\n 82.6616058349609,\n 0\n ];\n var key4 = [\n 212.448196411133,\n 79.6616058349609,\n 0\n ];\n var key5 = [\n 212.448196411133,\n 94.6616058349609,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[7.879,3.44,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.291,-1.544],[0,0],[-2.882,0.224],[-2.19,-1.944],[0,0],[1.958,-0.163]],"o":[[0,0],[1.885,-2.26],[2.887,-0.236],[0,0],[-1.499,-1.331],[-1.972,0.154]],"v":[[-5.038,3.19],[-7.629,0.893],[-0.238,-2.954],[7.629,-0.288],[5.4,2.382],[0.02,0.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.368999974868,0.246999987434,0.216000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[7.878,3.441]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"ceja izquierda Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[260.277,82.108,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 260.277297973633,\n 82.1076049804688,\n 0\n ];\n var key2 = [\n 265.277282714844,\n 82.1076049804688,\n 0\n ];\n var key3 = [\n 254.777282714844,\n 82.1076049804688,\n 0\n ];\n var key4 = [\n 260.277282714844,\n 79.1076049804688,\n 0\n ];\n var key5 = [\n 260.277282714844,\n 94.1076049804688,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[7.879,3.994,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.665,-3.195],[0,0],[-4.521,-4.011],[0,0]],"o":[[0,0],[3.896,-4.663],[0,0],[-3.091,-2.742]],"v":[[-5.038,3.744],[-7.629,1.447],[7.629,0.266],[5.4,2.936]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.368999974868,0.246999987434,0.216000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[7.879,3.995]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"ojo izquierdo Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[260.37,99.467,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 260.369598388672,\n 99.4673004150391,\n 0\n ];\n var key2 = [\n 265.369598388672,\n 99.4673004150391,\n 0\n ];\n var key3 = [\n 254.869598388672,\n 99.4673004150391,\n 0\n ];\n var key4 = [\n 260.369598388672,\n 91.4673004150391,\n 0\n ];\n var key5 = [\n 260.369598388672,\n 112.467300415039,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[3.773,3.881,0]},"s":{"a":0,"k":[100,100,100],"x":"var $bm_rt;\nfunction slider(inputValue) {\n var contrl = thisComp.layer('Ojos');\n var contrlCurVal1 = contrl('ADBE Effect Parade')(1)('ADBE Slider Control-0001');\n var k1 = [\n 100,\n 100,\n 100\n ];\n var k2 = [\n 100,\n 20,\n 100\n ];\n k1 = unArray(k1);\n k2 = unArray(k2);\n if (contrlCurVal1 > 0) {\n var resultAdd1 = linear(contrlCurVal1, 0, 100, k1, k2);\n } else if (contrlCurVal1 < 0) {\n var resultAdd1 = $bm_sum(k1, $bm_sum($bm_neg(linear($bm_neg(contrlCurVal1), 0, 100, k1, k2)), k1));\n } else {\n var resultAdd1 = k1;\n }\n var myResult = $bm_sum(resultAdd1, $bm_sub(inputValue, k1));\n return myResult;\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\n$bm_rt = slider(value);"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.004],[1.945,0],[0,2.008],[-1.944,0]],"o":[[0,2.008],[-1.944,0],[0,-2.004],[1.945,0]],"v":[[3.523,-0.002],[-0.001,3.631],[-3.523,-0.002],[-0.001,-3.631]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.250999989229,0.258999992819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[3.773,3.881]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"ojo derecho Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[212.537,99.467,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 212.537002563477,\n 99.4673004150391,\n 0\n ];\n var key2 = [\n 218.537002563477,\n 99.4673004150391,\n 0\n ];\n var key3 = [\n 207.037002563477,\n 99.4673004150391,\n 0\n ];\n var key4 = [\n 212.537002563477,\n 91.4673004150391,\n 0\n ];\n var key5 = [\n 212.537002563477,\n 112.467300415039,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[3.774,3.881,0]},"s":{"a":0,"k":[100,100,100],"x":"var $bm_rt;\nfunction slider(inputValue) {\n var contrl = thisComp.layer('Ojos');\n var contrlCurVal1 = contrl('ADBE Effect Parade')(1)('ADBE Slider Control-0001');\n var k1 = [\n 100,\n 100,\n 100\n ];\n var k2 = [\n 100,\n 20,\n 100\n ];\n k1 = unArray(k1);\n k2 = unArray(k2);\n if (contrlCurVal1 > 0) {\n var resultAdd1 = linear(contrlCurVal1, 0, 100, k1, k2);\n } else if (contrlCurVal1 < 0) {\n var resultAdd1 = $bm_sum(k1, $bm_sum($bm_neg(linear($bm_neg(contrlCurVal1), 0, 100, k1, k2)), k1));\n } else {\n var resultAdd1 = k1;\n }\n var myResult = $bm_sum(resultAdd1, $bm_sub(inputValue, k1));\n return myResult;\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\n$bm_rt = slider(value);"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.004],[1.944,0],[0,2.008],[-1.946,0]],"o":[[0,2.008],[-1.946,0],[0,-2.004],[1.944,0]],"v":[[3.524,-0.002],[0.002,3.631],[-3.524,-0.002],[0.002,-3.631]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.250999989229,0.258999992819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[3.774,3.881]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"nariz Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[239.024,110.175,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 239.024291992188,\n 110.175003051758,\n 0\n ];\n var key2 = [\n 247.524291992188,\n 110.175003051758,\n 0\n ];\n var key3 = [\n 232.524291992188,\n 110.175003051758,\n 0\n ];\n var key4 = [\n 239.024291992188,\n 103.175003051758,\n 0\n ];\n var key5 = [\n 239.024291992188,\n 124.175003051758,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[12.002,13.156,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[0.734,-12.906],[-11.752,12.787],[11.752,12.906]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.725,0.642999985639,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[12.002,13.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"oreja derecha Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[170.751,119.25,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 170.750793457031,\n 119.249908447266,\n 0\n ];\n var key2 = [\n 168.250793457031,\n 119.249908447266,\n 0\n ];\n var key3 = [\n 175.250793457031,\n 119.249908447266,\n 0\n ];\n var key4 = [\n 170.750793457031,\n 127.249908447266,\n 0\n ];\n var key5 = [\n 170.750793457031,\n 108.249908447266,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[15.797,23.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.713,0],[0,-12.977],[-12.935,0],[-2.402,0.877]],"o":[[-2.402,-0.878],[-12.935,0],[0,12.981],[2.713,0],[0,0]],"v":[[15.548,-22.081],[7.873,-23.501],[-15.548,0.001],[7.873,23.501],[15.548,22.084]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[15.797,23.751]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"oreja izquierda Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[307.932,122.088,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 307.931793212891,\n 122.087905883789,\n 0\n ];\n var key2 = [\n 301.431793212891,\n 122.087905883789,\n 0\n ];\n var key3 = [\n 309.931793212891,\n 122.087905883789,\n 0\n ];\n var key4 = [\n 307.931793212891,\n 130.087905883789,\n 0\n ];\n var key5 = [\n 307.931793212891,\n 111.087905883789,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[15.798,23.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-2.713,0],[0,-12.977],[12.936,0],[2.402,0.877]],"o":[[2.402,-0.876],[12.936,0],[0,12.981],[-2.713,0],[0,0]],"v":[[-15.548,-22.083],[-7.874,-23.501],[15.548,-0.001],[-7.874,23.501],[-15.548,22.084]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[15.798,23.751]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"boca Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[239.086,139.172,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 239.085800170898,\n 139.171905517578,\n 0\n ];\n var key2 = [\n 246.585800170898,\n 139.171905517578,\n 0\n ];\n var key3 = [\n 234.085800170898,\n 139.171905517578,\n 0\n ];\n var key4 = [\n 239.085800170898,\n 132.171905517578,\n 0\n ];\n var key5 = [\n 239.085800170898,\n 150.171905517578,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[12.296,8.647,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.03,0],[0,4.029]],"o":[[0,4.029],[-4.029,0],[0,0]],"v":[[7.296,-3.648],[0,3.648],[-7.296,-3.648]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.255000005984,0.250999989229,0.258999992819,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[12.296,8.648]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"cabeza y cuello Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[239.171,126.915,0]},"a":{"a":0,"k":[64.834,99.113,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.16,7.644],[0.053,0.259],[0,0],[0.109,5.77],[-0.053,2.339],[11.726,11.692],[1.331,0.988],[14.554,-0.26],[0,0],[1.228,-0.1],[1.223,-0.158],[1.227,-0.208],[2.449,-0.572],[7.571,-11.229],[0.64,-6.029],[-0.427,-6.913],[-0.108,-3.275],[-0.215,-12.264],[-0.105,-0.83],[-6.237,-5.664],[-1.706,-1.194],[-10.738,-1.794],[5.313,-8.158],[-28.519,-0.939],[-0.894,-0.229],[5.512,12.198],[-8.342,7.784],[-1.066,1.193],[-0.908,1.301],[-1.117,2.441],[-0.587,1.764],[-0.32,1.247]],"o":[[0.053,-0.257],[0,0],[-0.161,-5.771],[-0.053,-2.39],[0.215,-15.019],[-1.17,-1.143],[-11.782,-9.096],[0,0],[-1.175,0],[-1.227,0.054],[-1.229,0.102],[-2.502,0.365],[-13.594,3.221],[-3.463,5.041],[-0.747,7.224],[0.213,3.274],[0.48,12.266],[0,0.834],[0.855,7.436],[1.439,1.349],[7.418,5.215],[-2.372,8.869],[-1.707,1.347],[29.979,0.986],[-8.563,-11.262],[11.296,-1.85],[1.172,-1.034],[1.066,-1.247],[1.707,-2.34],[0.855,-1.663],[0.425,-1.247],[1.865,-7.169]],"v":[[64.424,-12.225],[64.424,-12.949],[64.424,-15.186],[63.783,-32.546],[63.73,-39.613],[51.363,-83.686],[47.635,-86.908],[4.56,-98.603],[-5.568,-98.392],[-9.194,-98.24],[-12.87,-97.925],[-16.605,-97.458],[-24.065,-96.054],[-58.184,-74.849],[-63.836,-57.96],[-63.516,-36.287],[-63.089,-26.464],[-62.34,10.332],[-62.182,12.826],[-51.093,32.786],[-46.296,36.579],[-18.559,47.394],[-29.874,73.018],[7.211,97.877],[39.57,80.691],[18.332,47.34],[48.539,33.199],[51.844,29.875],[54.829,26.132],[59.038,18.96],[61.174,13.816],[62.292,10.071]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[64.833,99.113]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"brazo derecho Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[-2]},{"t":48,"s":[0]}]},"p":{"a":0,"k":[192.756,239.148,0]},"a":{"a":0,"k":[59.632,38.523,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-14.977,-4.45],[-0.26,2.091],[12.037,2.191],[3.135,-58.345]],"o":[[5.603,-33.679],[3.215,-25.747],[-31.912,32.593],[15.363,-0.972]],"v":[[7.299,106.676],[43.819,-49.238],[6.25,-106.676],[-47.034,103.349]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2784313725490196,0.47843137254901963,0.01568627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[47.284,106.927]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.111,5.99],[0,0],[2.435,3.859],[0,0],[1.242,9.628],[-0.743,4.173],[15.673,-0.829],[0,0],[-14.312,-0.236],[-2.032,4.198],[0,0],[-2.364,3.305],[0,0],[-1.063,6.868]],"o":[[0,0],[-0.105,-5.997],[0,0],[-4.097,-6.497],[-36.279,-11.542],[-0.153,-1.187],[-15.223,-4.696],[-1.34,20.843],[31.404,37.659],[10.546,3.224],[2.294,-4.751],[0,0],[3.73,-5.207],[0,0],[1.068,-6.872]],"v":[[76.682,10.25],[111.014,6.947],[66.294,-0.801],[82.29,-18.337],[37.883,2.628],[-65.035,-30.418],[-64.077,-38.729],[-111.193,-45.156],[-112.915,-10.741],[34.324,29.215],[92.13,41.788],[73.285,29.059],[103.908,34.388],[75.337,19.882],[111.848,22.232]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[114.098,250.811]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"mano izquierda Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"t":48,"s":[-5]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[381.729,384.367,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[380.729,391.367,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[381.729,384.367,0]}]},"a":{"a":0,"k":[25.233,26.15,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-7.979,-2.355],[-0.192,-2.323],[0.63,-4.109],[1.578,-3.18],[0.387,2.333],[-1.034,0.685],[0,0],[2.549,3.736],[-1.477,0.076],[0,0],[1.665,2.433],[-8.267,-0.923],[0,0],[2.493,3.654]],"o":[[0,0],[7.728,2.29],[0.357,4.427],[-0.633,4.11],[-2.325,4.662],[-0.256,-1.567],[1.091,-0.727],[0,0],[-2.551,-3.731],[1.478,-0.081],[0,0],[-1.661,-2.436],[4.632,0.521],[0,0],[-2.497,-3.651]],"v":[[-3.02,-24.137],[8.175,-21.766],[16.626,-5.657],[15.964,9.985],[13.12,19.738],[-11.142,19.281],[-10.287,15.452],[6.617,11.254],[-14.432,7.226],[-13.545,1.846],[7.696,-0.913],[-13.646,-6.691],[-6.09,-12.524],[7.679,-13.11],[-8.476,-20.749]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.859000052658,0.819999964097,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[17.233,24.65]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"cuerpo Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[309.377,338.95,0]},"a":{"a":0,"k":[126.628,154.618,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.324,4.218],[4.752,-7.14],[-11.577,-5.987],[-3.207,16.317]],"o":[[-6.778,-1.996],[-9.891,10.723],[12.863,6.648],[2.852,-14.525]],"v":[[12.168,-18.058],[-17.98,-18.079],[-6.908,16.529],[25.02,8.902]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[225.134,35.803]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.79,1.705],[1.921,-2.889],[-4.681,-2.42],[-1.297,6.595]],"o":[[-2.74,-0.807],[-3.997,4.332],[5.199,2.687],[1.153,-5.872]],"v":[[4.919,-7.299],[-7.268,-7.305],[-2.792,6.682],[10.112,3.6]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[182.578,13.122]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.011,2.947],[3.321,-4.989],[-8.091,-4.185],[-2.241,11.402]],"o":[[-4.736,-1.395],[-6.912,7.492],[8.987,4.644],[1.995,-10.151]],"v":[[8.502,-12.619],[-12.565,-12.633],[-4.826,11.55],[17.482,6.22]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[184.662,45.194]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[33.143,12.414],[10.249,17.335],[0,0],[74.745,-16.293],[0,0],[7.045,-36.936],[-47.315,-7.313],[-8.19,0],[0,52.19]],"o":[[3.577,-16.024],[-15.923,-26.94],[0,0],[-3.658,0.8],[0,0],[0,0],[7.475,2.512],[45.877,0],[0,-41.865]],"v":[[38.84,-29.898],[33.235,-79.153],[0.379,-138.075],[-95.854,-138.075],[-98.671,-50.909],[-80.799,125.575],[-10.721,150.484],[26.502,154.369],[99.512,59.865]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5490196078431373,0.803921568627451,0.2196078431372549,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[99.762,154.618]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-25.353,21.61],[-18.658,-26.627],[-29.32,-77.338]],"o":[[-28.306,7.334],[18.182,-15.498],[0,0],[0,0]],"v":[[72.669,96.012],[-48.567,-87.847],[0.007,-46.653],[73.92,90.194]],"c":false}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2784313725490196,0.47843137254901963,0.01568627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[132.309,107.265]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"pelo atras Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[228.732,106.669,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 228.732452392578,\n 106.669204711914,\n 0\n ];\n var key2 = [\n 226.232452392578,\n 106.669204711914,\n 0\n ];\n var key3 = [\n 239.732452392578,\n 106.669204711914,\n 0\n ];\n var key4 = [\n 233.732452392578,\n 115.669204711914,\n 0\n ];\n var key5 = [\n 232.732452392578,\n 103.669204711914,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[129.324,110.681,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[17.186,-14.438],[2.262,-34.475],[0,0],[0,0],[0,0],[-11.846,1.499],[49.594,87.514]],"o":[[0,0],[-2.259,34.48],[0,0],[0,0],[0,0],[11.849,-1.499],[-23.356,-41.218]],"v":[[-68.865,-93.001],[-31.399,-14.519],[-57.696,61.439],[-57.696,78.748],[-56.284,94.243],[16.343,105.939],[19.271,-61.303]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[189.534,113.672]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-36.116,-17.336],[-2.262,-34.475],[0,0],[0,0],[0,0],[11.845,1.499],[-49.594,87.514]],"o":[[0,0],[2.259,34.48],[0,0],[0,0],[0,0],[-11.848,-1.499],[23.356,-41.218]],"v":[[84.124,-94.975],[16.14,-13.408],[42.437,62.551],[42.437,84.722],[41.026,95.354],[-31.602,107.051],[-34.53,-60.192]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[84.374,112.561]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"fondito azul Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[253.409,305.682,0]},"a":{"a":0,"k":[216.458,190.757,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.862,32.22],[-33.492,21.648],[-31.808,68.096],[-46.439,-91.176],[-0.861,-3.129],[-33.333,0.288],[-6.426,-45.615],[-34.661,-43.593],[-0.347,-0.459],[29.408,-0.097]],"o":[[-30.175,0.096],[-4.106,-22.571],[80.78,-52.224],[34.837,-74.572],[1.456,2.855],[3.29,11.952],[40.224,-0.345],[6.548,46.482],[0.365,0.462],[18.662,24.738],[0,0]],"v":[[-149.526,190.411],[-212.102,135.455],[-176.66,65.388],[-122.697,-109.443],[79.659,-99.331],[83.084,-90.293],[132.161,-43.768],[209.66,18.763],[185.259,125.907],[186.329,127.289],[158.995,189.414]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[216.458,190.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"O","size":50,"style":"Regular","w":78.71,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.15,1.709],[5.208,0],[4.248,-1.692],[2.864,-3.19],[1.563,-4.704],[0,-5.924],[-1.579,-4.688],[-2.93,-3.223],[-4.183,-1.692],[-5.111,0],[-4.086,1.66],[-2.995,3.288],[-1.611,4.736],[0,5.99],[1.579,4.72],[2.962,3.255]],"o":[[-4.15,-1.709],[-5.013,0],[-4.248,1.693],[-2.995,3.353],[-1.563,4.704],[0,6.023],[1.579,4.688],[2.93,3.223],[4.182,1.692],[5.241,0],[4.085,-1.66],[2.897,-3.157],[1.611,-4.736],[0,-5.989],[-1.579,-4.72],[-2.898,-3.157]],"v":[[53.394,-71.655],[39.355,-74.219],[25.464,-71.68],[14.795,-64.355],[7.959,-52.271],[5.615,-36.328],[7.983,-20.264],[14.746,-8.398],[25.415,-1.025],[39.355,1.514],[53.345,-0.977],[63.965,-8.398],[70.728,-20.239],[73.145,-36.328],[70.776,-52.393],[63.965,-64.355]],"c":true}},"nm":"O","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[4.28,-5.061],[7.227,0],[4.297,5.062],[0,9.538],[-4.216,5.127],[-7.39,0],[-4.232,-5.127],[0,-9.44]],"o":[[-4.281,5.062],[-7.227,0],[-4.297,-5.061],[0,-9.44],[4.215,-5.127],[7.324,0],[4.231,5.127],[0,9.538]],"v":[[56.665,-14.429],[39.404,-6.836],[22.119,-14.429],[15.674,-36.328],[21.997,-58.179],[39.404,-65.869],[56.738,-58.179],[63.086,-36.328]],"c":true}},"nm":"O","hd":false}],"nm":"O","bm":0,"hd":false}]},"fFamily":"Verdana"},{"ch":"j","size":50,"style":"Regular","w":34.42,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[26.025,-73.193],[15.674,-73.193],[15.674,-63.672],[26.025,-63.672]],"c":true}},"nm":"j","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0.211,-1.839],[0.716,-1.302],[1.432,-0.652],[2.344,0],[1.546,0.455],[0.912,0.358],[0,0],[0,0],[-2.132,-0.261],[-1.302,0],[-3.255,3.255],[0,6.38]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.637],[-0.212,1.839],[-0.716,1.302],[-1.433,0.651],[-1.465,0],[-1.546,-0.456],[0,0],[0,0],[1.433,0.391],[2.132,0.26],[5.469,0],[3.255,-3.255],[0,0]],"v":[[25.439,-54.541],[4.883,-54.541],[4.883,-46.826],[16.26,-46.826],[16.26,-2.881],[15.942,3.833],[14.551,8.545],[11.328,11.475],[5.664,12.451],[1.147,11.768],[-2.539,10.547],[-3.027,10.547],[-3.027,19.287],[2.319,20.264],[7.471,20.654],[20.557,15.771],[25.439,1.318]],"c":true}},"nm":"j","hd":false}],"nm":"j","bm":0,"hd":false}]},"fFamily":"Verdana"},{"ch":"o","size":50,"style":"Regular","w":60.69,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.557,5.16],[7.649,0],[4.541,-5.159],[0,-8.887],[-4.541,-5.143],[-7.715,0],[-4.558,5.144],[0,8.887]],"o":[[-4.558,-5.159],[-7.715,0],[-4.541,5.16],[0,8.887],[4.541,5.144],[7.649,0],[4.557,-5.143],[0,-8.887]],"v":[[48.682,-48.315],[30.371,-56.055],[11.987,-48.315],[5.176,-27.246],[11.987,-6.201],[30.371,1.514],[48.682,-6.201],[55.518,-27.246]],"c":true}},"nm":"o","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.783,-3.499],[4.883,0],[2.766,3.532],[0,6.836],[-2.751,3.435],[-4.98,0],[-2.767,-3.434],[0,-7.063]],"o":[[-2.783,3.5],[-4.948,0],[-2.767,-3.532],[0,-7.063],[2.75,-3.434],[4.915,0],[2.766,3.435],[0,6.902]],"v":[[41.87,-11.646],[30.371,-6.396],[18.799,-11.694],[14.648,-27.246],[18.774,-42.993],[30.371,-48.145],[41.895,-42.993],[46.045,-27.246]],"c":true}},"nm":"o","hd":false}],"nm":"o","bm":0,"hd":false}]},"fFamily":"Verdana"},{"ch":"s","size":50,"style":"Regular","w":52.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.311,2.409],[4.264,0.977],[2.1,0.391],[1.692,0.391],[1.367,1.14],[0,2.246],[-2.312,1.286],[-3.353,0],[-3.353,-1.188],[-2.344,-1.725],[0,0],[0,0],[3.336,0.798],[3.255,0],[2.815,-0.895],[1.823,-1.53],[0.928,-1.985],[0,-2.246],[-2.002,-2.457],[-4.785,-1.27],[-2.1,-0.391],[-1.302,-0.293],[-1.237,-1.106],[0,-2.148],[2.278,-1.302],[4.036,0],[3.548,1.286],[2.897,2.181],[0,0],[0,0],[-3.369,-0.96],[-4.037,0],[-4.118,3.191],[0,4.98]],"o":[[-2.312,-2.376],[-1.4,-0.325],[-2.1,-0.391],[-3.06,-0.716],[-1.4,-1.139],[0,-2.539],[2.311,-1.286],[3.223,0],[3.352,1.189],[0,0],[0,0],[-2.214,-1.139],[-3.337,-0.797],[-3.484,0],[-2.816,0.896],[-1.888,1.563],[-0.928,1.986],[0,3.581],[2.002,2.458],[1.725,0.456],[2.1,0.391],[3.516,0.781],[1.237,1.107],[0,2.8],[-2.279,1.302],[-3.255,0],[-3.548,-1.286],[0,0],[0,0],[2.278,1.14],[3.369,0.96],[7.129,0],[4.118,-3.19],[0,-3.971]],"v":[[44.531,-25.293],[34.668,-30.322],[29.419,-31.396],[23.73,-32.568],[17.09,-35.352],[14.99,-40.43],[18.457,-46.167],[26.953,-48.096],[36.816,-46.313],[45.361,-41.943],[45.85,-41.943],[45.85,-51.758],[37.524,-54.663],[27.637,-55.859],[18.188,-54.517],[11.23,-50.879],[7.007,-45.557],[5.615,-39.209],[8.618,-30.151],[18.799,-24.561],[24.536,-23.291],[29.639,-22.266],[36.768,-19.434],[38.623,-14.551],[35.205,-8.398],[25.732,-6.445],[15.527,-8.374],[5.859,-13.574],[5.371,-13.574],[5.371,-3.271],[13.843,-0.122],[24.951,1.318],[41.821,-3.467],[47.998,-15.723]],"c":true}},"nm":"s","hd":false}],"nm":"s","bm":0,"hd":false}]},"fFamily":"Verdana"}]} \ No newline at end of file diff --git a/app/src/main/assets/protein.json b/app/src/main/assets/protein.json new file mode 100644 index 0000000..a41ed91 --- /dev/null +++ b/app/src/main/assets/protein.json @@ -0,0 +1 @@ +{"v":"5.5.8","fr":30,"ip":0,"op":180,"w":1122,"h":987,"nm":"Eiendomsmegleren","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Proteinpulver","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[656.355,997.099,0],"ix":2},"a":{"a":0,"k":[73.558,115.822,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-5.017],[-5.017,0],[0,5.018],[5.017,0]],"o":[[0,5.018],[5.017,0],[0,-5.017],[-5.017,0]],"v":[[-9.084,0],[0,9.084],[9.084,0],[0,-9.084]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[95.297,84.527],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.748],[-7.747,0],[0,7.748],[7.748,0]],"o":[[0,7.748],[7.748,0],[0,-7.748],[-7.747,0]],"v":[[-14.029,-0.001],[-0.001,14.029],[14.029,-0.001],[-0.001,-14.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[117.608,69.013],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.118,-0.16],[0.503,-0.066],[0.295,-1.224],[-0.616,0.085],[-0.368,0.408],[-0.045,0.645]],"o":[[-0.502,0.07],[-0.295,1.227],[0.619,-0.079],[0.623,-0.086],[0.368,-0.41],[0.074,-1.039]],"v":[[1.278,-3.956],[-0.229,-3.75],[-1.115,-0.074],[0.737,-0.32],[2.224,-1.063],[2.844,-2.644]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.697,-1.124],[1.176,-0.672],[-0.636,-1.374],[1.558,-0.212],[0.539,1.204],[0.369,-0.046],[0.314,-1.309],[1.512,-0.139],[-1.258,5.207],[-1.994,0.294],[-0.905,-0.724],[0.112,-1.599]],"o":[[-0.698,1.125],[0.635,1.38],[-1.551,0.251],[-0.538,-1.2],[-0.37,0.046],[-0.315,1.312],[-1.506,0.176],[1.262,-5.174],[2.005,-0.23],[1.752,-0.26],[0.904,0.722],[-0.096,1.363]],"v":[[6.229,-0.151],[3.419,2.548],[5.326,6.68],[0.663,7.375],[-0.952,3.769],[-2.061,3.907],[-3.005,7.838],[-7.531,8.309],[-3.75,-7.263],[2.248,-8.049],[6.231,-7.366],[7.419,-3.888]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[91.956,164.677],"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 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.166,-0.138],[0.145,-0.601],[-1.896,0.174],[0.306,-1.255],[1.911,-0.106],[0,0],[-2.249,0.199],[0.324,-1.312],[3.754,-0.088],[-1.268,5.109],[-3.639,0.379],[0.324,-1.319]],"o":[[-0.146,0.602],[1.902,-0.116],[-0.307,1.257],[-1.903,0.163],[0,0],[2.259,-0.12],[-0.324,1.315],[-3.73,0.308],[1.271,-5.077],[3.665,-0.169],[-0.323,1.32],[-2.156,0.212]],"v":[[-0.069,-3.567],[-0.506,-1.764],[5.192,-2.199],[4.272,1.568],[-1.451,1.972],[-1.942,3.992],[4.82,3.514],[3.848,7.455],[-7.383,8.049],[-3.573,-7.229],[7.383,-8.049],[6.414,-4.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[78.829,165.683],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.712,-0.014],[-0.714,0.826],[-0.095,1.296],[0.449,0.475],[0.918,0.009],[0.582,0.011],[0.603,-2.371]],"o":[[1.178,0.021],[0.713,-0.826],[0.064,-0.878],[-0.45,-0.475],[-0.583,-0.006],[-0.603,2.378],[0.712,0.022]],"v":[[-0.523,3.625],[2.314,2.415],[3.526,-0.772],[2.948,-2.803],[0.895,-3.526],[-0.852,-3.552],[-2.659,3.572]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.277,4.989],[-2.043,-0.011],[-1.002,-0.506],[-0.486,-0.953],[0.095,-1.315],[0.819,-1.336],[1.338,-0.715],[1.643,0.036],[2.429,0.144]],"o":[[2.046,0.076],[1.423,0.007],[1.001,0.504],[0.484,0.955],[-0.127,1.749],[-0.82,1.334],[-1.338,0.715],[-2.427,-0.053],[1.276,-4.957]],"v":[[-4.425,-7.625],[1.709,-7.495],[5.346,-6.731],[7.576,-4.547],[8.159,-1.145],[6.739,3.484],[3.503,6.565],[-0.969,7.589],[-8.254,7.294]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[63.671,166.151],"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 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.503,-0.063],[2.728,-4.791],[1.639,0.184],[0,0],[1.436,-2.452],[1.634,0.264],[0.175,5.043],[-1.507,-0.207],[-0.081,-2.872],[-1.557,2.689],[-1.406,-0.127],[-0.046,-2.912],[-1.581,2.807]],"o":[[-2.727,4.92],[-1.639,-0.142],[0,0],[-1.437,2.488],[-1.637,-0.222],[-0.175,-5.043],[1.505,0.242],[0.081,2.872],[1.555,-2.646],[1.405,0.157],[0.045,2.912],[1.58,-2.763],[1.503,0.097]],"v":[[11.518,-6.115],[3.334,8.451],[-1.583,7.962],[-1.776,-0.004],[-6.086,7.405],[-10.995,6.677],[-11.518,-8.452],[-7,-7.777],[-6.757,0.838],[-2.086,-7.164],[2.129,-6.737],[2.266,2],[7.008,-6.357]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[46.718,164.601],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.564,0.298],[-0.335,0.632],[-0.06,0.817],[0.43,0.616],[0.823,0.173],[0.563,-0.291],[0.333,-0.624],[0.061,-0.814],[-0.429,-0.627],[-0.822,-0.18]],"o":[[0.563,-0.296],[0.334,-0.634],[0.066,-0.874],[-0.432,-0.615],[-0.721,-0.152],[-0.564,0.29],[-0.334,0.624],[-0.064,0.872],[0.43,0.627],[0.719,0.158]],"v":[[1.189,3.38],[2.538,1.984],[3.13,-0.195],[2.582,-2.43],[0.7,-3.609],[-1.226,-3.4],[-2.571,-2.029],[-3.163,0.13],[-2.615,2.378],[-0.737,3.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.99,0.805],[0.482,1.137],[-0.096,1.29],[-0.824,1.16],[-1.344,0.449],[-1.633,-0.336],[-0.996,-0.751],[-0.486,-1.102],[0.097,-1.301],[0.829,-1.216],[1.35,-0.489],[1.631,0.364]],"o":[[-0.99,-0.803],[-0.483,-1.136],[0.127,-1.71],[0.822,-1.16],[1.345,-0.449],[1.377,0.282],[0.996,0.751],[0.487,1.103],[-0.128,1.725],[-0.829,1.218],[-1.349,0.49],[-1.374,-0.305]],"v":[[-4.968,5.865],[-7.177,2.949],[-7.756,-0.691],[-6.332,-4.992],[-3.082,-7.4],[1.385,-7.564],[4.946,-6.02],[7.17,-3.243],[7.755,0.359],[6.319,4.777],[3.05,7.344],[-1.422,7.536]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[25.407,161.832],"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 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.369,0.244],[-0.046,0.616],[1.118,0.326],[0.501,0.15],[0.294,-1.079],[-0.616,-0.182]],"o":[[0.368,-0.243],[0.073,-0.993],[-0.502,-0.146],[-0.295,1.081],[0.615,0.189],[0.623,0.184]],"v":[[2.171,1.081],[2.793,-0.206],[1.224,-2.177],[-0.281,-2.623],[-1.164,0.617],[0.683,1.173]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.92,-1.114],[0.114,-1.542],[0.625,-0.79],[1.064,-0.232],[1.346,0.403],[0.767,0.239],[0.305,-1.129],[1.487,0.512],[-1.246,4.59],[-1.979,-0.567]],"o":[[0.919,1.114],[-0.092,1.233],[-0.626,0.792],[-1.064,0.231],[-0.769,-0.23],[-0.303,1.131],[-1.493,-0.476],[1.242,-4.558],[1.966,0.629],[1.781,0.509]],"v":[[6.19,-3.387],[7.399,0.592],[6.323,3.63],[3.788,5.169],[0.172,4.915],[-2.131,4.211],[-3.043,7.602],[-7.513,6.12],[-3.781,-7.602],[2.136,-5.809]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":[9.81,156.774],"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 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.16,-0.197],[0.148,-0.605],[-1.889,0.224],[0,0],[1.905,-0.157],[0.167,-0.677],[-2.242,0.26],[0.329,-1.322],[3.747,-0.189],[-1.293,5.146],[-3.626,0.478],[0.329,-1.328]],"o":[[-0.148,0.605],[1.897,-0.168],[0,0],[-1.897,0.215],[-0.167,0.679],[2.253,-0.179],[-0.33,1.324],[-3.72,0.409],[1.295,-5.115],[3.657,-0.268],[-0.329,1.331],[-2.15,0.27]],"v":[[-0.047,-3.566],[-0.493,-1.75],[5.188,-2.338],[4.251,1.455],[-1.453,2.014],[-1.955,4.048],[4.787,3.388],[3.798,7.359],[-7.404,8.256],[-3.521,-7.136],[7.404,-8.255],[6.417,-4.267]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[84.078,144.618],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.301,5.058],[-1.522,0.053],[0.957,-3.743],[-2.034,0.102],[0.342,-1.335],[3.57,0.042]],"o":[[1.524,-0.017],[-0.956,3.761],[2.04,-0.036],[-0.34,1.337],[-3.556,0.156],[1.301,-5.025]],"v":[[-1.954,-7.531],[2.616,-7.635],[-0.254,3.62],[5.857,3.413],[4.834,7.421],[-5.857,7.593]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[70.584,145.512],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.011,0.634],[0.496,1.058],[-0.104,1.314],[-0.839,1.306],[-1.362,0.697],[-1.657,-0.048],[-0.968,-0.537],[-0.416,-0.966],[1.175,-0.934],[1.204,0.039],[0.587,-0.363],[0.365,-0.679],[0.069,-0.888],[-0.468,-0.563],[-0.842,-0.036],[-0.96,1.142],[-0.823,-0.968],[1.039,-0.431],[1.321,0.06]],"o":[[-1.012,-0.633],[-0.496,-1.059],[0.138,-1.743],[0.84,-1.307],[1.362,-0.697],[1.308,0.039],[0.968,0.537],[-1.173,0.956],[-0.516,-1.191],[-0.712,-0.025],[-0.588,0.363],[-0.366,0.679],[-0.071,0.887],[0.469,0.565],[1.153,0.048],[0.824,0.978],[-0.874,1.07],[-1.039,0.432],[-1.386,-0.065]],"v":[[-4.493,6.787],[-6.755,4.245],[-7.342,0.686],[-5.876,-3.883],[-2.572,-6.883],[1.958,-7.853],[5.371,-6.993],[7.446,-4.743],[3.922,-1.909],[1.342,-3.747],[-0.607,-3.24],[-2.037,-1.678],[-2.691,0.673],[-2.094,2.85],[-0.127,3.753],[3.041,2.109],[5.513,5.029],[2.643,7.281],[-0.898,7.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[58.878,145.415],"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 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.013,0.423],[0.635,0.559],[-0.687,1.149],[-1.592,-0.19],[-0.323,0.122],[-0.022,0.272],[0.305,0.193],[0.671,0.266],[0.574,0.341],[0.403,0.609],[-0.071,0.893],[-0.617,0.771],[-1.072,0.336],[-1.411,-0.143],[-0.857,-0.298],[-0.601,-0.463],[0.647,-1.179],[0.627,0.246],[0.673,0.071],[0.366,-0.16],[0.022,-0.27],[-0.305,-0.193],[-0.711,-0.262],[-0.581,-0.314],[-0.397,-0.581],[0.07,-0.885],[0.624,-0.791],[1.073,-0.353],[1.398,0.173]],"o":[[-1.012,-0.424],[0.686,-1.141],[1.388,1.131],[0.583,0.07],[0.323,-0.121],[0.02,-0.256],[-0.305,-0.192],[-0.886,-0.364],[-0.575,-0.34],[-0.403,-0.608],[0.089,-1.122],[0.617,-0.77],[1.072,-0.336],[1.01,0.103],[0.856,0.298],[-0.647,1.186],[-0.502,-0.417],[-0.626,-0.246],[-0.634,-0.068],[-0.365,0.16],[-0.021,0.27],[0.305,0.193],[0.862,0.321],[0.582,0.314],[0.398,0.581],[-0.089,1.113],[-0.624,0.791],[-1.072,0.354],[-1.178,-0.146]],"v":[[-4.862,6.791],[-7.333,5.317],[-5.274,1.88],[-0.806,3.865],[0.552,3.785],[1.07,3.197],[0.643,2.524],[-0.821,1.839],[-3.01,0.779],[-4.475,-0.645],[-4.972,-2.898],[-3.913,-5.734],[-1.38,-7.391],[2.345,-7.676],[5.146,-7.077],[7.333,-5.939],[5.39,-2.391],[3.698,-3.385],[1.748,-3.859],[0.248,-3.723],[-0.332,-3.079],[0.093,-2.383],[1.616,-1.699],[3.782,-0.747],[5.25,0.593],[5.742,2.791],[4.673,5.649],[2.128,7.371],[-1.577,7.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[44.463,144.321],"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 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.844,0.63],[0.402,0.92],[-0.088,1.095],[-0.15,0.568],[-0.711,2.607],[-1.52,-0.282],[0.703,-2.59],[0.026,-0.324],[-0.282,-0.386],[-0.592,-0.113],[-0.411,0.399],[-0.294,1.065],[-0.705,2.616],[-1.5,-0.21],[0.732,-2.721],[1.33,-0.937],[2.059,0.404]],"o":[[-0.845,-0.632],[-0.403,-0.919],[0.036,-0.45],[0.71,-2.598],[1.516,0.319],[-0.704,2.599],[-0.11,0.379],[-0.053,0.663],[0.284,0.386],[0.67,0.128],[0.411,-0.398],[0.705,-2.607],[1.497,0.246],[-0.734,2.732],[-0.594,2.189],[-1.33,0.937],[-1.21,-0.238]],"v":[[-5.409,6.489],[-7.281,4.16],[-7.755,1.135],[-7.475,-0.392],[-5.344,-8.199],[-0.791,-7.298],[-2.901,0.484],[-3.104,1.54],[-2.76,3.112],[-1.447,3.861],[0.175,3.454],[1.233,1.258],[3.348,-6.575],[7.843,-5.892],[5.642,2.285],[2.756,6.982],[-2.328,7.795]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[31.486,141.976],"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 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.289,-0.285],[1.274,-4.697],[1.37,0.365],[-0.574,2.134],[1.397,-1.438],[0.66,0.193],[0.545,1.963],[0.574,-2.071],[1.355,0.452],[-1.274,4.602],[-1.219,-0.353],[-0.76,-2.869],[-2.083,2.157]],"o":[[-1.278,4.727],[-1.376,-0.336],[0.573,-2.128],[-1.4,1.471],[-0.661,-0.185],[-0.546,-1.959],[-0.574,2.078],[-1.36,-0.423],[1.269,-4.573],[1.214,0.376],[0.758,2.877],[2.072,-2.083],[1.285,0.312]],"v":[[9.917,-4.944],[6.088,9.191],[1.969,8.138],[3.689,1.746],[-0.506,6.11],[-2.488,5.543],[-4.124,-0.34],[-5.845,5.883],[-9.917,4.571],[-6.104,-9.191],[-2.454,-8.098],[-0.177,0.521],[6.055,-5.839]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[14.107,138.265],"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 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.838],[-27.995,0],[0,7.838],[27.993,0]],"o":[[0,7.838],[27.993,0],[0,-7.838],[-27.995,0]],"v":[[-50.688,0],[0,14.191],[50.688,0],[0,-14.191]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[73.558,14.441],"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 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[27.993,0],[0,7.974],[0,0],[-27.994,0],[0,7.974],[0,0]],"o":[[-27.994,0],[0,0],[0,7.974],[27.993,0],[0,0],[0,7.974]],"v":[[0,-1.775],[-50.688,-16.214],[-50.688,1.775],[0,16.214],[50.688,1.775],[50.688,-16.214]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[73.558,30.656],"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 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.281,9.686],[0,0],[0,0],[-26.206,0.403]],"o":[[-6.789,-2.18],[0,0],[9.005,15.845],[-41.761,-6.994]],"v":[[-21.241,-38.342],[-31.773,-42.282],[-31.773,22.859],[31.773,41.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[32.023,150.785],"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 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[17.773,5.706],[-41.761,-6.994],[0,0]],"o":[[-47.34,12.614],[1.281,9.686],[26.476,-0.409],[0,0]],"v":[[51.897,-38.444],[-51.897,-40.111],[1.117,40.111],[51.897,35.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[62.679,152.554],"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 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.284,0],[0,0],[0,-20.973],[0,0],[0,0],[0,0],[-40.487,0],[0,11.534],[0,0],[0,0],[0,0]],"o":[[0,0],[-19.283,0],[0,0],[0,0],[0,0],[0,11.534],[40.487,0],[0,0],[0,0],[0,0],[0,-20.973]],"v":[[38.392,-97.418],[-38.392,-97.418],[-73.308,-59.443],[-73.308,-33.425],[-73.308,50.517],[-73.308,76.534],[0,97.418],[73.308,76.534],[73.308,50.517],[73.308,-33.425],[73.308,-59.443]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,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":[73.558,133.977],"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 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Hode","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":66,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":106,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":114,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[7]},{"t":166,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[574,490.45,0],"to":[1,0,0],"ti":[3.333,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[580,490.45,0],"to":[-3.333,0,0],"ti":[1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49.803,"s":[554,490.45,0],"to":[-1,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60.621,"s":[574,490.45,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":71.439,"s":[554,490.45,0],"to":[0,0,0],"ti":[-4.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":82,"s":[574,490.45,0],"to":[4.667,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":106,"s":[582,490.45,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":156,"s":[582,490.45,0],"to":[-1.333,0,0],"ti":[1.333,0,0]},{"t":166,"s":[574,490.45,0]}],"ix":2},"a":{"a":0,"k":[994,355.45,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Arm vekt","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37,"s":[-10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[-20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[-10]},{"t":179,"s":[-20]}],"ix":10},"p":{"a":0,"k":[697.539,589.816,0],"ix":2},"a":{"a":0,"k":[1117.539,454.816,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Kropp","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[592.173,600.206,0],"ix":2},"a":{"a":0,"k":[188.119,146.645,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[105,105,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":88,"s":[107,107,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130,"s":[100,100,100]},{"t":179,"s":[105,105,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.709,1.409],[-6.638,-5.297],[1.228,-17.272],[-33.649,30.266],[44.966,-15.145],[25.695,-59.242]],"o":[[5.495,4.925],[0,0],[0,0],[6.919,-6.222],[-38.003,12.8],[-37.327,86.059]],"v":[[-122.475,-5.474],[-104.307,9.853],[-74.769,89.029],[26.693,81.852],[77.509,-96.974],[-1.427,-17.024]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447000002394,0.109999997008,0.172999991623,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":[203.33,198.397],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8,14],[-44,-17],[-1,-17],[0,0]],"o":[[8,-14],[0,0],[1,17],[0,0]],"v":[[-61.113,-102.133],[33.421,-115.125],[83.257,-90.447],[-51.26,-12.909]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[97,11],[0,0],[10.562,-25.047],[-80.605,-72.252],[-6.638,-5.297],[0.869,-18.625],[-33.649,30.266],[-20.109,25.233],[0,0]],"o":[[-97,-11],[0,0],[-9.889,23.448],[5.495,4.925],[0,0],[0,0],[13.085,-11.77],[31.6,-39.653],[0,0]],"v":[[53.886,-118.133],[-64.113,-155.133],[-125.66,-91.425],[-92.282,37.541],[-74.113,52.867],[-41.618,122.185],[56.886,124.867],[110.531,63.624],[172.886,-18.133]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,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":[173.136,155.383],"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":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"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":[[-43.507,-76.25],[-88.507,-73.25],[-113.507,0.75],[-65.007,76.25],[113.507,-30.73],[35.492,-72.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.675,0.556999954523,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":[191.53,109.5],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Hånd på lår","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[415.448,763.278,0],"ix":2},"a":{"a":0,"k":[45.314,35.696,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.851,9.503],[6.862,2.913],[0.571,-6.701],[-1.091,-14.021],[0,6.609],[0.376,4.816],[-0.365,-0.381],[-2.725,-4.651],[1.888,14.162],[3.018,6.07],[-0.438,-0.521],[-2.912,-5.339],[-0.944,11.329],[3.575,5.473],[-0.501,-0.434],[-0.934,-5.784],[0.2,9.231]],"o":[[-7.336,-8.882],[-28.337,-6.644],[8.43,4.034],[1.252,16.113],[0,-2.326],[-0.041,-0.527],[6.082,6.337],[4.485,7.656],[-0.575,-4.312],[-0.302,-0.609],[7.525,8.937],[2.892,5.299],[0.69,-8.28],[-0.362,-0.554],[3.92,3.391],[1.481,9.175],[-0.123,-5.683]],"v":[[27.885,-16.458],[5.714,-33.337],[-42.841,-9.081],[-18.378,14.699],[-7.992,18.476],[-9.421,0.692],[-8.448,0.24],[0.328,26.801],[7.8,13.172],[1.469,-7.164],[2.425,-7.783],[16.613,22.077],[25.109,13.644],[15.678,-11.384],[16.531,-12.127],[27.76,3.344],[38.641,6.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,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":[50.489,41.148],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-39.032,-1.12],[1.186,-0.019],[0.093,-0.07],[3.338,1.238],[0.126,-0.272],[-1.649,-9.895],[-4.959,-2.373]],"o":[[-9.042,-3.838],[-0.116,0.002],[-9.585,7.224],[-0.28,-0.105],[-1.005,2.169],[0.699,4.196],[0.571,-6.701]],"v":[[27.977,-9.097],[10.634,-12.982],[6.035,-16.588],[-22.394,-13.761],[-23.109,-13.463],[-26.328,7.783],[-16.579,16.658]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,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.226,16.909],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Bein","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,675,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[108.671,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Overarm bak","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[448.777,589.279,0],"ix":2},"a":{"a":0,"k":[102.993,146.718,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.463,-5.698],[-2.372,-1.026],[-2.463,5.698],[2.372,1.025]],"o":[[-2.463,5.698],[2.372,1.025],[2.464,-5.697],[-2.371,-1.025]],"v":[[-4.294,-1.856],[-4.46,10.318],[4.294,1.857],[4.46,-10.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[88.484,41.481],"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":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.333,-30.877]],"o":[[0,0],[0,0]],"v":[[9.12,-21.553],[-9.12,21.553]],"c":false},"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":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[39.622,120.501],"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":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.742,6.693],[10.09,-25.118],[-2.97,8.212],[0.283,21.502]],"o":[[22.299,44.051],[8.529,-0.065],[0,0],[-0.28,-21.309]],"v":[[-2.755,-63.212],[-19.827,63.212],[-0.572,49.602],[19.543,-27.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666999966491,0.545000023935,0.455000005984,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":[63.819,229.975],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.144,7.691],[8.096,3.198],[-3.871,-24.833],[0,0],[-7.962,-1.076],[-0.97,0.006],[-2.969,8.212],[-0.025,20.474]],"o":[[-5.219,-3.958],[-25.248,-9.97],[7.526,48.272],[2.378,7.674],[0.984,0.134],[8.528,-0.065],[0,0],[0.018,-13.52]],"v":[[26.587,-50.559],[6.651,-61.159],[-37.694,-32.752],[-17.708,56.605],[-0.754,70.954],[2.178,71.123],[21.431,57.514],[41.547,-19.719]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[41.815,222.063],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.576,11.361],[21.954,-5.196],[0,0],[-2.23,30.652],[-3.917,0],[-9.861,6.014]],"o":[[-23.957,60.431],[14.932,13.008],[31.219,0],[3.727,0.665],[12.396,0],[-18.491,-10.105]],"v":[[31.788,-49.078],[-74.83,36.07],[-29.492,46.984],[29.513,-7.846],[40.987,-6.816],[74.83,-16.297]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666999966491,0.545000023935,0.455000005984,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":[96.206,137.266],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.576,11.361],[-0.007,0.371],[0,-19.938],[-0.003,-0.266],[0,-32.685],[-4.859,-4.232],[0,0],[-2.23,30.652],[-3.917,0],[-9.861,6.014]],"o":[[-33.372,-35.851],[-14.118,11.942],[0,0.267],[-45.222,14.787],[0,8.025],[14.932,13.008],[31.219,0],[3.727,0.665],[12.396,0],[-18.491,-10.105]],"v":[[35.83,-12.801],[3.021,-85.354],[-20.07,-35.64],[-20.05,-34.846],[-78.872,54.261],[-70.789,72.346],[-25.451,83.261],[33.555,28.43],[45.029,29.461],[78.872,19.979]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[92.164,100.989],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,23.558],[35.954,0],[11.339,-9.591],[-76.841,-41.99]],"o":[[0,-35.953],[-16.014,0],[-0.009,0.489],[18.742,-11.429]],"v":[[54.049,4.74],[-11.052,-60.359],[-53.06,-44.974],[22.792,60.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447000002394,0.109999997008,0.172999991623,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":[148.244,60.61],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Puff","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[564.977,913.789,0],"ix":2},"a":{"a":0,"k":[119.979,119.978,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-72.303,-148.179],[0,0],[21.144,0],[0,0],[0,-21.144],[0,0]],"o":[[0,0],[0,-21.144],[0,0],[-21.144,0],[0,0],[14.87,-3.617]],"v":[[119.729,91.625],[119.729,-53.34],[81.443,-91.625],[-81.443,-91.625],[-119.729,-53.34],[-119.729,-19.994]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46699999641,0.513999968884,0.536999990426,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":[119.979,91.875],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[21.145,0],[0,0],[0,-21.144],[0,0],[0,0],[-21.144,0],[0,0],[0,21.143],[0,0],[0,0]],"o":[[0,0],[-21.144,0],[0,0],[0,0],[0,21.143],[0,0],[21.145,0],[0,0],[0,0],[0,-21.144]],"v":[[81.444,-119.729],[-81.443,-119.729],[-119.728,-81.443],[-119.728,-48.097],[-119.728,81.445],[-81.443,119.729],[81.444,119.729],[119.728,81.445],[119.728,63.521],[119.728,-81.443]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654999976065,0.713999968884,0.757000014361,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":[119.978,119.978],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Isbiter foran flaske","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.542,912.072,0],"ix":2},"a":{"a":0,"k":[24.678,11.355,0],"ix":1},"s":{"a":0,"k":[100,100,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.348,0.023],[1.131,-0.229],[3.757,-1.015],[0.13,-0.384],[-0.001,-0.002],[-1.096,-0.153],[-0.83,0.168],[-0.001,0],[-0.455,0.151],[-1.548,0.41],[-0.866,0.215],[-0.706,0.169],[-0.45,0.105],[-0.308,0.071],[-0.126,0.029],[0,0]],"o":[[0,0],[-0.341,-0.051],[-1.123,-0.074],[0,0],[-1.394,0.376],[0.001,0.004],[0.274,0.596],[1.45,0.2],[0.002,-0.001],[0.329,-0.135],[1.14,-0.381],[0.873,-0.232],[0.791,-0.197],[0.539,-0.128],[0.406,-0.095],[0.554,-0.126],[0.03,-0.006],[0,0]],"v":[[8.929,-1.86],[7.201,-2.126],[6.165,-2.236],[2.762,-2.005],[-7.593,-0.13],[-10.122,1.028],[-10.116,1.037],[-7.808,2.11],[-3.802,2.043],[-3.797,2.041],[-2.612,1.609],[1.556,0.397],[4.188,-0.277],[6.451,-0.829],[7.943,-1.18],[9.017,-1.428],[10.071,-1.667],[10.122,-1.677]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[36.033,14.07],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.106,0.01],[0.554,-0.126],[0.405,-0.094],[0,0],[0,0],[-0.653,-0.043],[0,0],[0,0],[0,0]],"o":[[-0.125,0.028],[-0.307,0.072],[0,0],[0,0],[0.649,0.046],[0,0],[0,0],[0,0],[-0.1,-0.023]],"v":[[4.135,-4.151],[3.081,-3.913],[2.008,-3.665],[0.748,-2.167],[-4.448,4.017],[-2.495,4.151],[1.211,-0.257],[3.315,-2.762],[4.448,-4.111]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[41.969,16.554],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.57,0.134],[0,0],[0,0],[0,0],[-2.438,-0.104],[-0.778,-0.027]],"o":[[0,0],[-0.104,-0.514],[0,0],[0,0],[0,0],[2.418,0.159],[0.78,0.033],[0,0]],"v":[[4.119,0.937],[3.247,-3.356],[2.128,-4.376],[0.994,-3.028],[-1.11,-0.523],[-4.817,3.886],[2.479,4.285],[4.817,4.376]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[44.29,16.82],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.539,-0.128],[0.791,-0.197],[0,0],[-0.944,-0.069],[0,0]],"o":[[-0.45,0.105],[-0.706,0.169],[0,0],[0.934,0.074],[0,0],[0,0]],"v":[[4.637,-3.841],[3.145,-3.489],[0.882,-2.938],[-4.637,3.628],[-1.82,3.841],[3.377,-2.343]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[39.34,16.731],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.537,-0.042]],"o":[[0,0],[0,0],[0.532,0.045],[0,0]],"v":[[0.448,-0.923],[-0.823,0.59],[-0.781,0.793],[0.823,0.923]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[33.749,19.426],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.155,0.183],[0.329,-0.136],[-0.031,-0.156],[0,0],[0,0],[0,0]],"o":[[-0.455,0.151],[-0.031,0.151],[0,0],[0,0],[0,0],[-0.047,-0.233]],"v":[[0.225,-2.168],[-0.96,-1.735],[-0.969,-1.273],[-0.27,2.168],[1,0.656],[0.552,-1.549]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[33.196,17.847],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,0.596],[-0.106,-0.521],[0,0],[-0.614,-0.059],[0,0]],"o":[[-0.382,0.39],[0,0],[0.605,0.061],[0,0],[-1.097,-0.152]],"v":[[-0.857,-2.327],[-1.345,-0.918],[-0.722,2.147],[1.109,2.327],[1.451,-1.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[26.774,17.434],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.031,0.151],[0.002,-0.001],[1.45,0.201],[0,0],[-1.722,-0.144],[0,0]],"o":[[-0.031,-0.155],[-0.001,0],[-0.83,0.168],[0,0],[1.666,0.16],[0,0],[0,0]],"v":[[1.802,-1.592],[1.811,-2.053],[1.806,-2.052],[-2.2,-1.986],[-2.543,1.596],[2.543,2.053],[2.501,1.849]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[30.426,18.165],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.873,-0.232],[0,0],[0,0],[-0.043,-0.003]],"o":[[-0.866,0.215],[0,0],[0,0],[0.044,0.004],[0,0]],"v":[[3.013,-3.283],[0.38,-2.608],[-3.013,1.428],[-2.638,3.273],[-2.507,3.283]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[37.209,17.076],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.14,-0.381],[-0.047,-0.233],[0,0],[0,0]],"o":[[0.155,0.183],[0,0],[0,0],[-1.548,0.41]],"v":[[-2.084,-0.806],[-1.757,-0.187],[-1.309,2.018],[2.084,-2.018]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[35.505,16.485],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.88,0.18],[1.133,-1.936],[0,-0.006],[-1.852,-0.178],[-0.002,0],[-0.609,0.035],[-1.993,-0.043],[-1.115,-0.046],[0,0],[0,0],[0,0],[0,0],[-0.224,-0.108],[0,0]],"o":[[-1.63,-0.953],[0,0],[0.001,0.006],[0.209,2.362],[0.002,-0.001],[0.45,-0.065],[1.502,-0.085],[1.13,0.024],[0,0],[0,0],[0,0],[0,0],[0.262,0.025],[0.039,0.003],[0,0]],"v":[[9.278,1.332],[3.95,-0.387],[-12.575,-1.323],[-12.57,-1.306],[-5.456,2.918],[-5.45,2.917],[-3.846,2.768],[1.566,2.725],[4.964,2.833],[5.165,2.668],[4.928,2.38],[10.039,2.87],[11.787,3.036],[12.51,3.255],[12.575,3.259]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[15.118,3.51],"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 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.249,-0.018],[0.262,0.024]],"o":[[0,0],[1.456,0.087],[-0.224,-0.108],[0,0]],"v":[[-1.108,-0.193],[-1.362,0.016],[1.362,0.193],[0.64,-0.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[26.266,6.572],"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 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.332,-0.079],[0,0]],"o":[[0,0],[0,0],[1.796,0.073],[0,0],[0,0]],"v":[[-2.555,-0.349],[-2.318,-0.061],[-2.52,0.104],[2.302,0.349],[2.555,0.141]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[22.602,6.238],"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 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.111,0.342],[0.45,-0.065],[0.002,-0.001],[0.209,2.361],[0.165,-0.642],[0.014,-0.145],[0,0],[-0.936,-0.141],[-2.173,-0.3],[-0.658,-0.089],[0,0],[0,0],[0,0]],"o":[[-0.61,0.035],[-0.002,0],[-1.851,-0.177],[-0.503,0.35],[-0.034,0.134],[0,0],[0.73,0.114],[1.633,0.246],[0.62,0.085],[0,0],[0,0],[0,0],[0.035,-0.371]],"v":[[5.434,-3.696],[3.83,-3.548],[3.823,-3.547],[-3.292,-7.77],[-4.336,-6.259],[-4.427,-5.852],[-5.589,6.298],[-3.083,6.684],[2.646,7.508],[4.56,7.77],[4.914,4.069],[5.218,0.906],[5.555,-2.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[5.839,9.973],"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 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.123,0.06],[1.456,0.087],[0,0],[-1.056,-0.132],[0,0]],"o":[[-0.249,-0.018],[0,0],[0.983,0.13],[0,0],[-0.109,-0.079]],"v":[[8.008,-5.654],[5.285,-5.831],[-8.365,5.437],[-5.313,5.831],[8.365,-5.459]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[19.619,12.418],"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 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,0.024],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-1.114,-0.046]],"v":[[1.267,-3.905],[-4.36,0.742],[-4.664,3.905],[4.664,-3.796]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[15.418,10.138],"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 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.382,0.39],[0.001,0.004],[-1.393,0.376],[0,0],[0.626,0.447],[0,0],[-4.204,-0.422],[0,0]],"o":[[-0.001,-0.003],[0.13,-0.384],[0,0],[0.079,-0.821],[0,0],[3.576,0.45],[0,0],[-0.106,-0.521]],"v":[[4.268,1.837],[4.261,1.827],[6.789,0.67],[7.264,-4.291],[6.334,-6.311],[-7.344,4.98],[4.402,6.311],[3.779,3.245]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[21.649,13.27],"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 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.284,-0.038],[0,0],[1.796,0.073]],"o":[[0,0],[0.278,0.037],[0,0],[-1.332,-0.079],[0,0]],"v":[[-6.898,1.943],[-7.252,5.643],[-6.398,5.756],[7.252,-5.512],[2.43,-5.756]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[17.652,12.099],"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 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.502,-0.085],[0.035,-0.371],[0,0],[0,0]],"o":[[0.111,0.342],[0,0],[0,0],[-1.994,-0.043]],"v":[[-2.598,-2.258],[-2.477,-1.18],[-2.814,2.344],[2.814,-2.301]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[13.871,8.535],"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 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Champagne","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,675,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Speil","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[781.846,546.636,0],"ix":2},"a":{"a":0,"k":[242.195,379.656,0],"ix":1},"s":{"a":0,"k":[100,100,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],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-174.838,326.02],[-191.96,-331.179],[191.96,-330.1],[181.37,331.179]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.736999990426,0.808000033509,0.827000038297,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[241.96,381.179],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"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":[[186.952,-250.959],[186.155,-254.752],[160.765,-248.106],[-186.952,132.423],[-183.766,254.752],[182.94,-140.369]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[246.968,302.037],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[39.652,-149.451],[-132.059,31.612],[-128.99,149.451],[132.059,-146.36]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[186.861,202.705],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-183.353,119.777],[-179.434,270.186],[176.773,275.345],[183.353,-275.345]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894000004787,0.941000007181,0.957000014361,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":[246.968,436.484],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[86.118,-187.851],[-174.931,107.962],[-172.786,190.264],[174.931,-190.264]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894000004787,0.941000007181,0.957000014361,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":[232.803,244.195],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"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":[[0.633,-2.062],[-0.633,-1.731],[0.163,2.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[433.757,49.016],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"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":[[-88.257,-92.159],[-83.455,92.159],[88.257,-88.904]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894000004787,0.941000007181,0.957000014361,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":[138.257,142.158],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Gulv","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[564.511,1064.813,0],"ix":2},"a":{"a":0,"k":[568.274,90.176,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[26.277,0],[0,0],[-22.263,12.542],[0,0],[-4.851,0],[0,0],[-4.094,-2.277],[0,0]],"o":[[0,0],[-26.201,0],[0,0],[4.122,-2.322],[0,0],[4.801,0],[0,0],[22.405,12.464]],"v":[[532.026,89.926],[-532.043,89.926],[-545.771,46.207],[-310.422,-86.374],[-296.694,-89.926],[293.689,-89.926],[307.292,-86.443],[545.628,46.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.882000014361,0.905999995213,0.917999985639,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":[568.283,90.176],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Hair front","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1001.073,207.645,0],"ix":2},"a":{"a":0,"k":[113.881,80.346,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[36.844,21.146]],"o":[[10.607,-14.126],[0,0]],"v":[[-1.807,34.22],[-18.422,-34.22]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156999999402,0.275,0.368999974868,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[134.151,54.22],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[43.342,11.495]],"o":[[6.956,-17.301],[0,0]],"v":[[18.085,32.298],[-25.04,-32.298]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156999999402,0.275,0.368999974868,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[101.566,56.142],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[49.191,-0.126]],"o":[[2.458,-20.308],[0,0]],"v":[[29.868,25.284],[-32.326,-25.159]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156999999402,0.275,0.368999974868,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[75.762,64.984],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.796,33.552],[0,0],[0,0],[25.894,-64.503],[0,0],[0,0]],"o":[[-2.796,-33.552],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[26.562,-19.553],[-9.786,-47.513],[-29.358,-27.942],[-13.37,47.114],[-9.705,53.105],[5.768,43.08]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[197.352,103.773],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.806,0],[21.377,-41.267],[-1.667,-1.225],[-21.454,-19.021],[0,0],[0,0],[-13.637,5.323],[-3.235,-0.754],[0,0],[0,0]],"o":[[-28.806,0],[-4.705,9.083],[-1.354,11.724],[0,0],[0,0],[0,0],[24.766,14.817],[12.368,2.886],[0,0],[0,-28.442]],"v":[[15.783,-74.454],[-88.953,-17.762],[-82.896,-0.126],[-54.767,74.454],[-51.07,69.354],[-61.52,4.554],[-37.754,0],[15.739,24.373],[74.086,-2.436],[93.658,-22.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[93.908,78.268],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Øyenbryn høyre","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[1036.988,254.153,0],"to":[0,-1.5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[1036.988,245.153,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[1036.988,254.153,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[1036.988,245.153,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[1036.988,254.153,0],"to":[0,0,0],"ti":[0,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[1036.988,245.153,0],"to":[0,-1.167,0],"ti":[0,-1.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":110,"s":[1036.988,247.153,0],"to":[0,1.5,0],"ti":[0,-1.167,0]},{"t":179,"s":[1036.988,254.153,0]}],"ix":2},"a":{"a":0,"k":[50.764,50.408,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[-5.272,2.562],[-8.984,-14.348]],"o":[[0,0],[7.382,-3.584],[0,0]],"v":[[-25.763,20.045],[-15.312,16.193],[25.763,-5.698]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[-5.837,0.537],[-19.752,-15.094]],"o":[[0,0],[10.699,-0.984],[0,0]],"v":[[-27.388,4.17],[-13.812,5.193],[26.763,13.302]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":159,"s":[{"i":[[0,0],[-5.837,0.537],[-19.752,-15.094]],"o":[[0,0],[10.699,-0.984],[0,0]],"v":[[-27.388,4.17],[-13.812,5.193],[26.763,13.302]],"c":false}]},{"t":179,"s":[{"i":[[0,0],[-5.272,2.562],[-8.984,-14.348]],"o":[[0,0],[7.382,-3.584],[0,0]],"v":[[-25.763,20.045],[-15.312,16.193],[25.763,-5.698]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[50.764,45.046],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.272,2.562],[-8.984,-14.348]],"o":[[0,0],[7.382,-3.584],[0,0]],"v":[[25,65.091],[35.451,61.238],[76.527,39.348]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Øyenbryn - venstre","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[-4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":140,"s":[-4]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[960.603,255.119,0],"ix":2},"a":{"a":0,"k":[50.665,29.348,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[13.405,3],[0,0]],"o":[[0,0],[-13.405,-3],[0,0]],"v":[[25.665,-1.748],[-1.797,-0.481],[-25.665,3.481]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[50.665,28.481],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Munn 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[100]},{"t":157,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[980.808,355.45,0],"ix":2},"a":{"a":0,"k":[41.337,20.99,0],"ix":1},"s":{"a":0,"k":[100,100,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],[-1.479,1.973],[0,0],[0.225,1.032],[0,0],[-0.085,-0.098],[-2.306,-1.48],[-0.119,-0.064],[-1.41,-0.402],[-1.064,-0.113],[-0.848,-0.225],[-0.178,-0.065],[-1.746,-1.659],[0,0],[-0.897,-0.017],[-0.072,0],[-1.35,0.081],[-1.782,0.032],[0,0],[-1.864,-0.563],[-0.478,-0.193],[-0.549,-0.338],[-1.087,-0.419],[-0.402,-0.131],[0,0]],"o":[[0,0],[0,0],[-2.064,0.373],[0,0],[0.567,-0.756],[0,0],[0.074,0.097],[1.398,1.593],[0.12,0.081],[1.184,0.756],[1.063,0.354],[0.873,0.064],[0.179,0.032],[2.079,0.547],[0,0],[0.98,0.483],[0.071,0.015],[1.852,0.017],[1.35,-0.08],[0,0],[1.721,0],[0.49,0.113],[0.442,0.241],[1.052,0.596],[0.399,0.15],[0,0],[0,0]],"v":[[-9.715,6.577],[-20.171,8.461],[-27.665,9.813],[-29.483,4.837],[-24.52,-1.785],[-23.965,-4.686],[-27.073,-18.966],[-26.842,-18.676],[-19.884,-14.358],[-19.526,-14.148],[-15.63,-12.379],[-12.332,-11.83],[-9.727,-11.428],[-9.19,-11.283],[-3.656,-7.694],[-0.705,-5.603],[2.211,-4.991],[2.426,-4.976],[7.265,-5.137],[12.01,-5.361],[12.165,-5.361],[17.661,-4.767],[19.083,-4.251],[20.517,-3.431],[23.72,-1.934],[24.922,-1.518],[2.223,4.422]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[1.59,-1.996],[1.684,-0.805],[2.605,1.24],[2.976,1.367],[6.846,1.577],[5.7,-3.154],[2.748,2.173],[0.167,0.146],[0.227,-1.617],[-3.188,-4.331],[-0.506,-4.272],[-41.616,19.406],[-0.21,0.105],[-0.189,0.089],[0,0],[-0.009,0.006],[-0.574,1.835],[-0.061,1.094]],"o":[[0,0],[-0.92,1.143],[-1.075,0.514],[-2.617,-1.238],[-4.457,-2.044],[-2.248,-0.516],[-8.09,4.457],[-0.371,-0.29],[0,0],[-0.227,1.617],[0,0],[1.06,8.957],[0.218,-0.087],[0.188,-0.088],[0,0],[0.008,-0.005],[1.792,-1.062],[0.609,-1.834],[0.012,-1.11]],"v":[[40.832,-12.812],[39.146,-7.02],[35.586,-4.444],[27.197,-4.736],[15.737,-14.389],[2.056,-15.966],[-8.209,-19.104],[-27.161,-22.387],[-27.962,-23.048],[-28.692,-20.074],[-27.126,-3.861],[-40.338,14.09],[35.197,-1.168],[35.835,-1.465],[36.398,-1.725],[36.36,-1.728],[36.387,-1.741],[40.043,-6.522],[40.832,-11.09]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,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":[41.094,23.297],"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.072,0],[-1.351,0.096],[-1.781,0.038],[0,0]],"o":[[0,0],[0,0],[0.072,0.02],[1.852,0.019],[1.35,-0.096],[0,0],[0,0]],"v":[[5.103,2.455],[-5.103,1.858],[-5.103,-2.014],[-4.888,-1.993],[-0.048,-2.186],[4.697,-2.455],[4.851,-2.455]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[48.419,19.438],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.072,0],[-1.351,0.096],[-1.781,0.038],[0,0]],"o":[[0,0],[0,0],[0.072,0.02],[1.852,0.019],[1.35,-0.096],[0,0],[0,0]],"v":[[5.103,2.455],[-5.103,1.858],[-5.103,-2.014],[-4.888,-1.993],[-0.048,-2.186],[4.697,-2.455],[4.851,-2.455]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[48.419,19.438],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.936,-0.212],[0,0],[0,0],[0,0],[0,0],[-1.864,-0.674],[-0.479,-0.23],[-0.55,-0.405],[-1.087,-0.5]],"o":[[0,0],[0,0],[0,0],[0,0],[1.721,0],[0.489,0.135],[0.441,0.289],[1.051,0.713],[1.923,0.867]],"v":[[8.687,2.85],[8.293,2.947],[8.257,2.947],[-8.436,1.964],[-8.687,-2.947],[-3.19,-2.235],[-1.768,-1.619],[-0.334,-0.636],[2.868,1.155]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[61.958,19.929],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.936,-0.212],[0,0],[0,0],[0,0],[0,0],[-1.864,-0.674],[-0.479,-0.23],[-0.55,-0.405],[-1.087,-0.5]],"o":[[0,0],[0,0],[0,0],[0,0],[1.721,0],[0.489,0.135],[0.441,0.289],[1.051,0.713],[1.923,0.867]],"v":[[8.687,2.85],[8.293,2.947],[8.257,2.947],[-8.436,1.964],[-8.687,-2.947],[-3.19,-2.235],[-1.768,-1.619],[-0.334,-0.636],[2.868,1.155]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[61.958,19.929],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.222,1.198],[-5.222,3.082],[-5.222,-3.082],[4.983,-2.582]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[48.539,24.638],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.222,1.198],[-5.222,3.082],[-5.222,-3.082],[4.983,-2.582]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[48.539,24.638],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.896,-0.019],[0,0],[0,0],[0,0],[-0.18,-0.077],[-1.744,-1.985],[0,0]],"o":[[0,0],[0,0],[0,0],[0.179,0.039],[2.079,0.654],[0,0],[0.98,0.577]],"v":[[5.969,1.916],[5.969,5.788],[-5.969,5.076],[-5.969,-5.788],[-5.43,-5.613],[0.102,-1.319],[3.053,1.186]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[37.45,15.673],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.896,-0.019],[0,0],[0,0],[0,0],[-0.18,-0.077],[-1.744,-1.985],[0,0]],"o":[[0,0],[0,0],[0,0],[0.179,0.039],[2.079,0.654],[0,0],[0.98,0.577]],"v":[[5.969,1.916],[5.969,5.788],[-5.969,5.076],[-5.969,-5.788],[-5.43,-5.613],[0.102,-1.319],[3.053,1.186]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[37.45,15.673],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.969,-3.862],[5.969,2.301],[-5.969,4.457],[-5.969,-4.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[37.347,25.418],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.969,-3.862],[5.969,2.301],[-5.969,4.457],[-5.969,-4.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[37.347,25.418],"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 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.27],[0,0],[0,0],[0,0],[-1.41,-0.481],[-1.064,-0.135]],"o":[[0,0],[0,0],[0,0],[1.184,0.905],[1.063,0.424],[0.873,0.077]],"v":[[6.943,-3.804],[6.943,7.059],[-6.943,6.25],[-2.857,-7.059],[1.039,-4.94],[4.337,-4.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[24.539,13.121],"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 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.27],[0,0],[0,0],[0,0],[-1.41,-0.481],[-1.064,-0.135]],"o":[[0,0],[0,0],[0,0],[1.184,0.905],[1.063,0.424],[0.873,0.077]],"v":[[6.943,-3.804],[6.943,7.059],[-6.943,6.25],[-2.857,-7.059],[1.039,-4.94],[4.337,-4.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[24.539,13.121],"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 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.943,-5.061],[6.943,3.853],[-3.514,5.737],[-6.943,-5.737]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[24.436,26.022],"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 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.943,-5.061],[6.943,3.853],[-3.514,5.737],[-6.943,-5.737]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[24.436,26.022],"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 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"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":[[8.347,-1.07],[-8.108,1.891],[-8.347,-1.891]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[61.868,23.946],"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 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"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":[[8.347,-1.07],[-8.108,1.891],[-8.347,-1.891]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[61.868,23.946],"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 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.263,-0.226],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0.131,0.112],[0,0],[0,0]],"v":[[4.469,-2.439],[3.979,-1.102],[-0.108,10.018],[-4.457,6.091],[-4.469,-10.018],[-4.457,-10],[-3.86,-9.502],[4.099,-2.76]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,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":[17.601,10.268],"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 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"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":[[6.955,4.481],[-6.955,6.992],[3.524,-6.992]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,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":[13.969,27.277],"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 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Munn","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[0]},{"t":157,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[981.407,351.58,0],"ix":2},"a":{"a":0,"k":[40.453,26.496,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.758,-13.193]],"o":[[0,0],[0,0]],"v":[[6.074,-3.876],[-4.316,6.596]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.574,14.097],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.02,2.781]],"o":[[0,0],[0,0]],"v":[[-10.548,-3.536],[10.548,0.755]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[33.369,41.601],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.332,-1.235],[1.409,-0.501],[2.185,0.773],[2.485,0.85],[5.726,0.978],[4.773,-1.957],[1.104,0.703],[-1.828,-1.584],[-3.615,-0.776],[-0.896,-0.072],[-0.85,-0.205],[-1.454,-1.03],[0,0],[-0.786,-0.007],[-1.131,0.047],[-1.487,0.016],[-1.606,-0.35],[-0.396,-0.117],[-0.462,-0.211],[-0.909,-0.257],[-1.821,-0.069],[-1.496,0.66],[-0.48,1.147],[-0.049,0.682]],"o":[[0,0],[-0.775,0.718],[-0.902,0.32],[-2.185,-0.775],[-3.733,-1.275],[-1.884,-0.321],[-7.7,3.157],[0,0],[1.817,1.553],[0.883,0.214],[0.885,0.052],[1.743,0.343],[0,0],[0.891,0.318],[1.553,0.012],[1.131,-0.047],[1.479,-0.002],[0.408,0.074],[0.369,0.151],[0.879,0.371],[1.815,0.511],[1.813,0.065],[1.497,-0.66],[0.508,-1.14],[0.018,-0.688]],"v":[[28.787,-0.686],[27.374,2.908],[24.394,4.516],[17.371,4.334],[7.787,-1.665],[-3.668,-2.643],[-12.259,-4.6],[-28.796,-7.056],[-26.697,-4.735],[-18.465,-0.414],[-15.705,-0.08],[-13.082,0.263],[-8.45,2.49],[-5.981,3.795],[-3.36,4.182],[0.691,4.085],[4.662,3.945],[9.39,4.308],[10.579,4.629],[11.782,5.141],[14.463,6.074],[19.965,6.991],[25.062,6.193],[28.126,3.22],[28.777,0.383]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,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":[43.032,23.985],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Nese","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[988.63,322.357,0],"ix":2},"a":{"a":0,"k":[31.442,19.574,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-23.626,8.265]],"o":[[0,0],[0,0]],"v":[[-16.442,-7.459],[16.442,-0.806]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[31.442,22.459],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Øye kant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[997.757,273.12,0],"ix":2},"a":{"a":0,"k":[60.475,4.399,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.612,1.448],[-2.785,-0.696],[-4.785,-0.994],[-1.634,-0.071],[-0.46,0.021],[0,0],[0.456,0.043],[0.798,0.144],[2.298,0.73],[3.287,0.36],[1.138,-0.088],[1.173,-0.356],[2.239,-0.965]],"o":[[0,0],[4.605,-1.426],[2.93,0.298],[2.393,0.496],[0.815,0.05],[0.458,-0.013],[0,0],[-0.456,-0.034],[-1.598,-0.256],[-4.587,-1.451],[-0.807,-0.107],[-1.102,0.148],[-2.362,0.678],[-4.477,1.931]],"v":[[-21.669,4.127],[-14.802,0.242],[-2.356,-2.528],[12.751,1.875],[19.018,2.729],[20.957,2.748],[21.669,2.729],[20.959,2.662],[19.05,2.418],[13,0.906],[-1.69,-3.968],[-4.638,-4.039],[-8.089,-3.303],[-15.149,-0.695]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,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":[99.031,4.377],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.505,0.391],[-2.94,1.005],[-0.889,0.331],[-1.021,0.177],[-2.037,-0.845],[-1.299,-0.817],[-0.428,-0.047],[0.001,-0.015],[0.408,0.109],[0.58,0.47],[2.069,1.062],[2.411,-0.255],[0.962,-0.309],[0.565,-0.181],[4.395,-0.884]],"o":[[0,0],[4.517,-0.406],[0.807,-0.278],[0.86,-0.331],[2.037,-0.391],[2.068,0.784],[0.653,0.406],[0.427,0.057],[0.003,-0.015],[-0.408,-0.102],[-1.145,-0.934],[-2.009,-1.117],[-1.195,0.105],[-0.943,0.29],[-2.534,0.881],[-4.418,0.884]],"v":[[-19.965,3.104],[-11.671,2.543],[0.972,0.571],[3.333,-0.394],[6.171,-1.211],[12.568,-0.381],[17.599,2.427],[19.297,3.084],[19.962,3.104],[19.312,3],[17.775,2.168],[12.99,-1.289],[5.961,-2.886],[2.699,-2.2],[0.294,-1.311],[-11.812,1.553]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,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":[20.215,4.035],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Øyeskygge","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[996.35,269.127,0],"ix":2},"a":{"a":0,"k":[74.381,28.637,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[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]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[25.982,-12.644],[11.505,-18.243],[-5.073,-7.757],[-20.769,6.806]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[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]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[24.732,-3.394],[0.755,-11.243],[-12.823,-9.007],[-31.269,-9.694]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[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]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[24.732,-3.394],[0.755,-11.243],[-12.823,-9.007],[-31.269,-9.694]],"c":true}]},{"t":177,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[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]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[25.982,-12.644],[11.505,-18.243],[-5.073,-7.757],[-20.769,6.806]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[118.01,18.493],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.322,-0.657],[5.747,0.613],[0,0],[-6.99,2.796],[-2.778,-0.315]],"o":[[-1.322,0.656],[-4.634,-0.493],[2.76,-0.512],[9.449,-3.779],[2.126,0.24]],"v":[[20.076,-2.423],[9.835,-3.233],[-12.079,-2.821],[4.697,-7.016],[21.473,-2.821]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.815,0.033],[-9.381,0.325],[-3.715,2.773],[0,0]],"o":[[0,0],[0,0],[0,0],[19.124,5.769],[0,0],[9.166,-6.844],[0,0]],"v":[[19.236,-19.676],[-10.608,-21.396],[-29.671,-13.806],[-27.39,-2.78],[13.572,-0.462],[24.04,18.623],[25.038,-19.666]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[33.455,38.159],"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":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Head","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.857,294.617,0],"ix":2},"a":{"a":0,"k":[90.283,139.268,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.582,2.796],[0,0],[-6.99,2.796],[-5.592,0]],"o":[[0,0],[0,0],[6.99,-2.796],[0,0]],"v":[[18.753,-8.388],[10.364,-8.388],[22.302,-15.254],[52.305,-9.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[4.409,0.313],[0,0],[-6.99,2.796],[-2.796,0],[0,0]],"o":[[-5.208,-0.372],[2.76,-0.512],[9.449,-3.779],[2.796,0],[0,0]],"v":[[-39.698,-9.745],[-60.933,-9.785],[-44.157,-13.98],[-27.381,-9.785],[-28.779,-8.388]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[14.578,22.428],[43.338,-47.531],[0,0],[-17.49,-14.288],[0,0],[6.95,1.487],[-7.092,-5.91],[-1.23,-12.693],[-16.777,2.796],[-2.796,8.388],[-22.91,16.731],[-2.797,13.121],[0,0]],"o":[[-18.174,-27.96],[0,0],[0,0],[8.558,6.991],[0,0],[-10.708,10.886],[7.334,6.113],[1.577,16.287],[16.776,-2.795],[0,0],[12.872,-9.4],[2.797,-13.121],[0,0]],"v":[[78.877,-78.944],[-90.291,-82.482],[-74.249,-10.693],[-75.965,22.199],[-54.048,30.018],[-68.385,31.125],[-58.49,73.341],[-45.555,107.645],[-0.819,127.218],[27.141,110.442],[43.917,48.929],[70.56,15.656],[68.491,-8.545]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,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":[93.705,130.264],"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":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Kjeve","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[999.683,350.31,0],"ix":2},"a":{"a":0,"k":[83.673,53.453,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.676,8.315],[18.01,0.761],[7.108,2.839],[-6.116,-9.476],[-0.003,-1.481],[-22.15,-29.224],[0,0],[0,0],[-18.645,1.509],[-1.398,13.979]],"o":[[0,0],[-7.3,-0.308],[0,0],[6.116,9.475],[0.074,35.448],[0,0],[0,0],[0,0],[11.234,-0.909],[0.663,-6.631]],"v":[[76.906,-35.75],[-4.788,-31.031],[-78.52,-45.036],[-76.26,-41.646],[-76.26,-6.696],[-33.462,48.082],[2.107,51.122],[28.531,48.281],[57.948,13.41],[81.714,-12.288]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[82.626,51.372],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Øre høyre","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1001.772,291.307,0],"ix":2},"a":{"a":0,"k":[98.696,37.743,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[9.063,-2.039],[-5.38,-17.356]],"o":[[-1.794,-3.463],[0,0],[1.656,5.339]],"v":[[10.272,2.36],[-10.272,-10.137],[5.216,6.837]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.340999977261,0.282000014361,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":[16.313,28.436],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.628,-23.538],[-8.463,3.621]],"o":[[0,0],[1.629,23.538],[8.463,-3.621]],"v":[[6.402,-11.885],[-17.431,-5.25],[10.595,25.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[19.308,29.038],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.602,-2.835],[5.381,-17.356]],"o":[[0,0],[0,0],[-1.655,5.339]],"v":[[-7.222,1.117],[7.222,-10.137],[-5.38,7.633]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.340999977261,0.282000014361,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":[182.753,37.594],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.629,-23.538],[8.463,3.621]],"o":[[0,0],[-1.629,23.539],[-8.463,-3.621]],"v":[[-6.402,-11.885],[17.43,-5.25],[-10.596,25.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[178.084,38.341],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Hair back","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.408,309.88,0],"ix":2},"a":{"a":0,"k":[112.936,47.15,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.747,0.308],[0,0],[-7.942,-13.201],[1.408,0.091],[3.958,1.782],[0.316,-0.039],[0,0],[0.261,0.098],[0,0],[0.423,-0.198],[21.27,1.763],[-1.31,0.956],[-19.547,30.297],[-39.515,7.487],[-14.39,9.569],[0.062,-1.424],[0,0],[-0.097,-0.236],[-14.445,-13.144]],"o":[[-14.503,-2.552],[0,0],[0.727,1.208],[-13.318,-0.863],[-0.292,-0.131],[0,0],[-0.277,0.034],[0,0],[-0.438,-0.163],[-3.913,1.839],[-1.616,-0.135],[22.726,-16.559],[8.479,-13.143],[10.13,-1.919],[1.188,-0.789],[0,0],[-0.01,0.255],[1.21,2.914],[1.312,1.194]],"v":[[109.955,41.626],[85.351,27.774],[93.293,43.964],[91.68,46.605],[44.851,30.836],[43.923,30.696],[-21.76,38.794],[-22.579,38.698],[-62.963,23.726],[-64.302,23.777],[-110.569,33.189],[-111.445,30.025],[-75.305,-25.462],[-2.609,8.09],[86.245,-45.908],[88.951,-44.38],[86.978,1.709],[87.108,2.448],[111.443,38.612]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[113.005,46.946],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Skygge under hode","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[974.662,375.441,0],"ix":2},"a":{"a":0,"k":[78.868,68.028,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-42.979,11.272],[0.458,12.941],[-0.371,42.902],[1.224,-2.093]],"o":[[0,0],[42.98,-11.27],[-0.354,-10.026],[0.347,-40.004],[-9.823,16.797]],"v":[[-73.458,-5.954],[-3.97,66.989],[78.863,-17.807],[-17.373,-31.108],[-52.839,-58.239]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,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":[78.868,68.029],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Øye","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[997.64,274.929,0],"ix":2},"a":{"a":0,"k":[40.962,6.342,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-0.805],[-0.805,0],[0,0.804],[0.804,0]],"o":[[0,0.804],[0.804,0],[0,-0.805],[-0.805,0]],"v":[[-1.455,0],[0,1.456],[1.455,0],[0,-1.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[77.278,5.386],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.187],[-1.185,0],[0,1.186],[1.187,0]],"o":[[0,1.186],[1.187,0],[0,-1.187],[-1.185,0]],"v":[[-2.147,0],[-0.001,2.147],[2.147,0],[-0.001,-2.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,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":[76.081,6.334],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.088],[-3.088,0],[0,3.089],[3.089,0]],"o":[[0,3.089],[3.089,0],[0,-3.088],[-3.088,0]],"v":[[-5.592,-0.001],[-0.001,5.592],[5.592,-0.001],[-0.001,-5.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.54900004069,0.698000021542,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":[76.081,6.842],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-0.805],[-0.805,0],[0,0.804],[0.804,0]],"o":[[0,0.804],[0.804,0],[0,-0.805],[-0.805,0]],"v":[[-1.456,0],[0,1.456],[1.456,0],[0,-1.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[7.04,4.386],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.187],[-1.186,0],[0,1.186],[1.186,0]],"o":[[0,1.186],[1.186,0],[0,-1.187],[-1.186,0]],"v":[[-2.147,0],[0,2.147],[2.147,0],[0,-2.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,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":[5.842,5.334],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.088],[-3.089,0],[0,3.089],[3.088,0]],"o":[[0,3.089],[3.088,0],[0,-3.088],[-3.089,0]],"v":[[-5.592,-0.001],[0,5.592],[5.592,-0.001],[0,-5.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.54900004069,0.698000021542,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":[5.842,5.842],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Hvit bak øye","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[992.759,275.429,0],"ix":2},"a":{"a":0,"k":[62.572,62.571,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.419],[-34.419,0],[0,34.42],[34.42,0]],"o":[[0,34.42],[34.42,0],[0,-34.419],[-34.419,0]],"v":[[-62.322,-0.001],[-0.001,62.322],[62.322,-0.001],[-0.001,-62.322]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[62.572,62.572],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Underarm med vekter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[30]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[1056.239,591.883,0],"ix":2},"a":{"a":0,"k":[282.218,121.941,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-20.631,-7.776]],"o":[[0,0],[0,0]],"v":[[-25.274,-1.762],[25.274,3.888]],"c":false},"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":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[254.388,94.591],"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":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.344,-1.101],[0.771,-0.182],[-1.015,-9.535],[-9.342,-0.191],[-0.808,0.086],[1.1,10.343]],"o":[[-0.808,0.086],[-9.092,2.153],[1.014,9.535],[0.791,0.016],[10.344,-1.101],[-1.101,-10.343]],"v":[[-2.036,-18.235],[-4.403,-17.825],[-18.771,2.487],[-0.45,19.32],[1.95,19.222],[18.686,-1.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.109999997008,0.128999986836,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":[160.266,72.155],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.343,-1.101],[0.77,-0.182],[-1.014,-9.535],[-9.341,-0.191],[-0.808,0.086],[1.101,10.343]],"o":[[-0.808,0.086],[-9.092,2.153],[1.015,9.535],[0.792,0.016],[10.343,-1.101],[-1.1,-10.343]],"v":[[-2.036,-18.235],[-4.403,-17.825],[-18.772,2.487],[-0.451,19.32],[1.95,19.222],[18.685,-1.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.165000002992,0.216000007181,0.246999987434,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":[149.271,72.155],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[37.765,-4.019],[2.813,-0.666],[-3.704,-34.815],[-34.108,-0.697],[-2.95,0.313],[4.018,37.765]],"o":[[-2.951,0.314],[-33.198,7.858],[3.705,34.815],[2.89,0.059],[37.766,-4.02],[-4.019,-37.766]],"v":[[-7.433,-66.578],[-16.076,-65.081],[-68.537,9.079],[-1.643,70.538],[7.12,70.183],[68.224,-5.474]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.109999997008,0.128999986836,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":[149.385,70.847],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.705,34.814],[-33.197,7.858],[2.95,-0.314],[-4.019,-37.765],[-37.766,4.019],[-2.813,0.666]],"o":[[-3.705,-34.815],[-2.89,-0.06],[-37.766,4.019],[4.019,37.765],[2.95,-0.313],[-34.108,-0.697]],"v":[[-22.734,3.623],[29.727,-70.537],[20.964,-70.182],[-40.14,5.475],[35.517,66.578],[44.159,65.082]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.165000002992,0.216000007181,0.246999987434,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":[103.582,76.303],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.166,29.75],[29.146,0.595],[-3.166,-29.751],[-29.147,-0.596]],"o":[[-3.166,-29.751],[-28.369,6.716],[3.166,29.75],[28.369,-6.716]],"v":[[50.997,-5.427],[-6.166,-57.946],[-50.997,5.427],[6.166,57.946]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.109999997008,0.128999986836,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":[69.556,68.554],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.166,29.75],[-28.369,6.716],[2.522,-0.269],[-3.435,-32.271],[-32.272,3.434],[-2.404,0.569]],"o":[[-3.166,-29.751],[-2.471,-0.051],[-32.272,3.433],[3.434,32.272],[2.521,-0.268],[-29.147,-0.596]],"v":[[-19.427,3.096],[25.404,-60.277],[17.914,-59.973],[-34.301,4.678],[30.351,56.894],[37.736,55.616]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.165000002992,0.216000007181,0.246999987434,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":[37.986,70.885],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[22.748,12.782],[-14.871,-12.828],[-57.622,3.903],[1.373,15.354],[0,0]],"o":[[-0.679,6.288],[22.522,19.428],[47.932,-3.247],[0,0],[-66.873,20.532]],"v":[[-91.861,-34.602],[-73.465,-6.466],[31.69,30.699],[91.167,-6.516],[91.264,-10.009]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[233.821,132.669],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.373,15.354],[1.274,2.684],[89.189,-8.434],[1.193,-11.057],[-14.871,-12.828],[-57.622,3.903]],"o":[[-0.277,-3.104],[-19.485,-41.019],[0,0],[-0.679,6.288],[22.522,19.428],[47.933,-3.247]],"v":[[91.167,4.533],[88.757,-4.225],[-74.372,-37.217],[-91.861,-23.552],[-73.465,4.583],[31.689,41.749]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,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":[233.822,121.619],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Underarm skygge","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[-6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[-6]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[296.531,128.289,0],"ix":2},"a":{"a":0,"k":[139.576,59.31,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-41.877,-62.336],[53.927,0.179],[0,0]],"o":[[9.733,14.49],[-53.927,-0.179],[26.52,-35.234]],"v":[[78.654,3.192],[33.676,42.741],[-83.432,-15.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,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":[83.432,42.742],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Overarm vekter Shine","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1153.327,472.945,0],"ix":2},"a":{"a":0,"k":[12.597,26.517,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.336,-3.748],[-2.258,-0.805],[-1.337,3.748],[2.258,0.805]],"o":[[-1.337,3.748],[2.258,0.805],[1.336,-3.748],[-2.258,-0.805]],"v":[[-4.088,-1.458],[-2.419,6.786],[4.089,1.458],[2.42,-6.786]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.834999952129,0.776000019148,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":[6.071,44.335],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.081,-8.644],[-5.254,-1.873],[-3.081,8.644],[5.254,1.873]],"o":[[-3.082,8.644],[5.254,1.873],[3.082,-8.643],[-5.254,-1.873]],"v":[[-9.512,-3.392],[-5.578,15.651],[9.512,3.391],[5.58,-15.651]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.834999952129,0.776000019148,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":[12.844,17.774],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Overarm vekter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1117.577,454.816,0],"ix":2},"a":{"a":0,"k":[64.25,58.755,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":85,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":125,"s":[105,105,100]},{"t":179,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.81,0],[6.212,-2.009],[-5.593,-16.423],[-9.957,-2.967]],"o":[[-6.881,0],[34.822,-0.625],[8.587,1.585],[-6.551,-34.238]],"v":[[-21.668,-26.513],[-41.381,-23.404],[7.929,18.772],[41.381,26.513]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447000002394,0.109999997008,0.172999991623,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":[85.918,26.763],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.81,0],[6.212,-2.009],[0,-28.466],[-0.339,-2.671],[-61.49,-11.349],[-9.957,-2.967]],"o":[[-6.881,0],[-25.697,8.314],[0,2.764],[9.725,-15.835],[8.588,1.585],[-6.551,-34.238]],"v":[[0.476,-36.077],[-19.237,-32.968],[-63.524,27.923],[-63.001,36.077],[35.734,10.177],[63.524,16.949]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,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":[63.775,36.327],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.19],[1.821,5.94],[0.874,2.152],[18.648,-2.572],[13.629,-34.609],[-2.623,-2.544],[0,0]],"o":[[0,-6.536],[-0.712,-2.323],[-9.496,-7.286],[5.085,9.463],[6.97,3.48],[-0.239,-0.91],[15.865,-11.647]],"v":[[19.953,-9.933],[12.451,-29.082],[10.068,-35.791],[-14.45,-28.649],[-19.953,33.359],[-5.814,43.077],[-6.218,41.682]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[108.297,74.183],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.536],[1.822,5.94],[2.207,1.692],[-0.712,-2.323]],"o":[[0,-6.536],[-2.565,-3.079],[0.874,2.152],[1.821,5.94]],"v":[[4.943,12.929],[2.135,-5.853],[-4.943,-12.929],[-2.56,-6.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[123.308,51.321],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-23.295,7.998],[24.53,7.735],[-9.497,-7.286],[26.254,0],[0,-35.346],[-0.34,-2.67],[-4.6,-7.517]],"o":[[21.507,-43.785],[18.648,-2.572],[-8.983,-22.117],[-35.346,0],[0,2.763],[1.164,9.143],[-1.634,1.246]],"v":[[28.32,48.813],[23.156,-22.365],[58.966,-21.71],[6.174,-56.811],[-56.052,2.917],[-58.626,12.301],[-49.777,37.503]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,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":[59.4,60.102],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Biceps shine","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[60]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":103,"s":[60]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[80]},{"t":179,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":0,"s":[1056.83,518.177,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[1056.83,518.177,0],"to":[-0.75,-1.25,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[1052.33,510.677,0],"to":[0,0,0],"ti":[-0.986,-1.408,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[1056.83,518.177,0],"to":[1.167,1.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":103,"s":[1056.83,518.177,0],"to":[-0.75,-1.25,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":125,"s":[1052.33,510.677,0],"to":[0,0,0],"ti":[-0.75,-1.25,0]},{"t":179,"s":[1056.83,518.177,0]}],"ix":2},"a":{"a":0,"k":[9.23,16.289,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[40,40,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":38,"s":[85,85,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":85,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":103,"s":[40,40,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":125,"s":[100,100,100]},{"t":179,"s":[30,30,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.222,-8.893],[-2.858,-1.358],[-4.222,8.893],[2.86,1.358]],"o":[[-4.222,8.892],[2.86,1.356],[4.221,-8.892],[-2.858,-1.356]],"v":[[-5.176,-2.457],[-7.644,16.101],[5.177,2.457],[7.643,-16.101]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[9.23,16.289],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Biceps","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[-21]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":117,"s":[-21]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[1100.019,542.592,0],"ix":2},"a":{"a":0,"k":[63.546,84.386,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[120,97.727,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":85,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":117,"s":[120,97.727,100]},{"t":179,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.119,-0.24],[12.233,-22.705],[32.37,-8.869],[-13.847,9.618],[2.298,8.764],[6.97,3.48]],"o":[[0,0],[-13.535,25.122],[11.311,5.799],[53.433,-37.113],[-2.622,-2.545],[-0.117,0.238]],"v":[[19.262,-50.308],[14.262,-3.014],[-61.47,56.945],[-10.23,45.667],[34.967,-60.199],[19.606,-51.016]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,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":[85.592,96.413],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-13.535,25.122],[49.508,19.297],[12.049,-12.667],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-36.449,-14.207],[-10.665,11.213],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[{"i":[[-13.535,25.122],[48.122,22.533],[17.206,-16.35],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-28.458,-13.325],[-11.218,10.66],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":33,"s":[{"i":[[-13.535,25.122],[49.609,19.037],[20.249,-19.176],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-38.468,-14.761],[-16.624,15.743],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-45.439,-57.479],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[-13.535,25.122],[49.508,19.297],[12.049,-12.667],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-36.449,-14.207],[-10.665,11.213],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":111,"s":[{"i":[[-13.535,25.122],[49.21,20.045],[11.603,-12.294],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-33.179,-13.515],[-10.622,11.254],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":121,"s":[{"i":[[-13.535,25.122],[49.329,19.751],[11.232,-10.645],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-49.329,-19.751],[-11.233,10.644],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-50.449,-49.963],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"t":179,"s":[{"i":[[-13.535,25.122],[49.508,19.297],[12.049,-12.667],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-36.449,-14.207],[-10.665,11.213],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,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":[73.778,76.804],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Bulge","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[991.231,661.924,0],"ix":2},"a":{"a":0,"k":[49.281,40.467,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-9.266,14.965]],"o":[[-1.516,37.162],[0,0]],"v":[[-22.029,-18.581],[23.546,2.664]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[48.545,43.581],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Høyre lår","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1087.32,646.936,0],"ix":2},"a":{"a":0,"k":[139.818,54.017,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.277,15.508],[0,0],[0,0],[-36.262,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-4.135,-7.19],[-62.035,-22.352]],"v":[[-35.001,-41.495],[-67.349,-34.874],[-19.235,18.521],[67.349,41.495],[62.518,22.725]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,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":[67.599,64.665],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-46.015,-4.486],[0,13.241],[-65.441,-1.899]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,-13.241],[-34.296,-21.491]],"v":[[-23.184,-52.792],[-90.895,-26.479],[-99.203,-23.251],[-51.089,30.144],[31.994,52.792],[30.663,34.348],[99.203,-11.771]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[99.453,53.042],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.689,-4.469],[-20.819,0.753],[-13.08,2.628],[31.425,8.506]],"o":[[16.466,1.606],[23.859,-0.862],[-43.369,-0.328],[-2.215,7.265]],"v":[[-57.169,8.012],[-1.042,9.679],[60.714,3.621],[-58.5,-10.432]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,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":[188.616,97.822],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.494,11.784],[-5.325,-18.657],[-43.369,-0.328],[-0.302,9.564]],"o":[[-65.439,-1.898],[31.425,8.507],[27.952,-2.309],[0.229,-7.295]],"v":[[-14.334,-32.344],[-69.725,19.57],[42.321,34.242],[79.544,20.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,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":[199.841,67.82],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Høyre legg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1200.112,836.648,0],"ix":2},"a":{"a":0,"k":[48.134,182.975,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.534,17.912],[14.355,38.199],[-34.409,51.299],[-2.811,-30.533],[4.311,-15.009],[-1.08,-27.428]],"o":[[0,0],[-14.354,-38.198],[19.599,-29.22],[2.124,23.069],[-9.41,32.763],[0.64,16.272]],"v":[[-11.144,123.786],[-18.275,23.523],[-8.464,-112.478],[40.749,-88.378],[36.938,-20.378],[5.415,125.141]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,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":[43.123,141.948],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-4.834,-17.164],[-0.999,11.553],[0,0]],"o":[[0,0],[0,0],[4.834,17.166],[0.999,-11.553],[0,0]],"v":[[-18.779,-42.815],[-28.71,-14.086],[-25.171,26.164],[29.006,24.743],[0.849,-43.331]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,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":[49.786,313.56],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Venstre Lår","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[879.775,654.163,0],"ix":2},"a":{"a":0,"k":[152.413,59.038,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[76.703,25.968],[13.65,-9.676],[5.943,-10.346],[-15.265,12.388]],"o":[[-14.971,14.723],[11.279,13.22],[22.19,-2.101],[28.684,-23.279]],"v":[[-12.692,-40.095],[-64.01,1.091],[-58.397,40.095],[10.189,23.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,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":[266.304,51.713],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[76.703,25.968],[2.173,0.703],[9.486,-0.762],[-11.266,-13.205],[5.943,-10.346],[-15.265,12.388]],"o":[[-2.029,-0.687],[-28.684,-9.285],[37.983,1.5],[11.279,13.22],[22.19,-2.101],[28.684,-23.279]],"v":[[23.053,-34.411],[16.768,-36.493],[-99.755,-18.923],[-28.266,6.775],[-22.652,45.779],[45.934,29.236]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,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":[230.559,46.029],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[39.785,-6.359],[-85.546,19.664],[11.218,13.204]],"o":[[31.928,4.931],[5.932,-10.327],[-34.552,28.335]],"v":[[-79.555,25.187],[73.623,8.813],[68.072,-30.118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,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":[134.283,82.995],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.218,13.204],[38.053,1.502],[0,-10.456],[-23.965,-3.701],[-85.546,19.664]],"o":[[-11.245,-13.237],[-101.782,8.185],[0,0],[31.928,4.931],[5.932,-10.327]],"v":[[95.311,-16.412],[23.76,-42.183],[-106.794,26.402],[-72.172,35.716],[100.862,22.519]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,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":[107.044,69.289],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Venstre legg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[770.333,820.594,0],"ix":2},"a":{"a":0,"k":[46.292,161.917,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14.004,42.144],[-1.959,65.291],[-8.574,-37.289],[-2.888,-39.577],[-2.83,-16.226],[3.255,-0.772]],"o":[[0,0],[-11.961,-35.993],[1.226,-40.858],[12.744,55.419],[3.169,43.435],[0.574,3.295],[-16.941,4.02]],"v":[[21.627,125.426],[-0.45,27.302],[-41.552,-92.897],[26.346,-84.805],[28.841,14.104],[42.938,122.501],[38.156,129.735]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,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":[43.761,134.005],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16.309,-19.608],[-3.112,-3.079],[-2.371,-0.284],[-21.097,11.977],[-5.494,4.296],[1.457,4.26],[0,0],[0,0]],"o":[[-2.8,3.366],[2.108,2.085],[5.301,0.635],[12.427,-7.056],[3.546,-2.772],[0,0],[0,0],[0,0]],"v":[[-40.81,11.743],[-40.283,23.066],[-33.241,27.401],[11.517,15.216],[38.676,5.188],[42.154,-6.563],[37.548,-28.036],[18.048,-20.302]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,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":[47.738,280.892],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Flaske","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[612.656,715.184,0],"ix":2},"a":{"a":0,"k":[60.166,74.557,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.868,-12.577],[-2.142,-1.253],[-0.012,-0.003],[-0.098,2.306],[-0.7,10.752],[-9.278,5.631],[0,0],[0,0]],"o":[[1.307,5.73],[0.011,0.006],[0.618,0.137],[-1.339,-2.347],[1.273,-19.542],[3.16,-1.917],[0,0],[-32.134,17.82]],"v":[[-16.055,18.263],[-8.194,31.326],[-8.184,31.304],[-6.035,30.341],[-14.018,11.706],[13.644,-27.073],[18.923,-29.989],[17.811,-32.647]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[33.122,51.996],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.316,5.771],[-32.134,17.82],[0,0],[-8.526,-25.772],[-0.297,-0.589],[-1.475,-0.989],[0,0],[-1.125,-0.145],[0,0],[3.021,2.504],[0.286,0.391]],"o":[[-2.868,-12.577],[-7.405,2.556],[-19.16,8.019],[0.209,0.633],[0.944,1.877],[0,0],[1.124,0.754],[0,0],[0,0],[-0.381,-0.317],[-2.124,-1.193]],"v":[[-8.524,18.934],[25.341,-31.975],[16.114,-30.695],[-16.815,23.771],[-16.052,25.607],[-12.26,29.982],[-11.839,30.264],[-8.427,31.628],[-0.654,31.975],[-1.899,29.238],[-2.898,28.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[25.591,51.325],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-17.194,10.314],[5.99,-4.235],[0.435,-0.655]],"o":[[0,0],[0,0],[-5.125,3.622],[-0.94,1.423]],"v":[[-16.188,-10.872],[8.169,-8.35],[10.198,0.551],[-8.46,9.449]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[68.704,49.709],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.979,-1.056],[-1.158,-0.454],[0,0],[0,0],[2.288,3.476]],"o":[[1.699,0.526],[0,0],[0,0],[-2.654,-0.551],[-0.446,1.941]],"v":[[-3.923,1.51],[0.686,2.483],[2.148,3.057],[5.073,1.374],[-4.627,-3.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[22.014,80.963],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.474,-1.128],[-6.547,2.745],[0.474,1.128],[8.775,-3.678]],"o":[[0.474,1.129],[6.548,-2.744],[-0.473,-1.128],[-8.775,3.679]],"v":[[-11.855,7.757],[0.857,4.831],[11.856,-2.182],[-3.355,-5.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[53.43,9.137],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.643,-1.536],[-7.885,3.299],[0.643,1.536],[7.885,-3.3]],"o":[[0.643,1.536],[7.886,-3.3],[-0.643,-1.536],[-7.885,3.3]],"v":[[-14.278,5.975],[1.164,2.782],[14.278,-5.975],[-1.164,-2.782]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[53.684,12.531],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.965,-1.24],[2.236,-1.321],[0,0],[0,0],[-8.746,3.66],[0.846,2.023],[0,0]],"o":[[-2.51,0.665],[-2.965,1.241],[0,0],[0,0],[0.847,2.023],[8.746,-3.66],[0,0],[0,0]],"v":[[5.507,-5.327],[-2.82,-2.45],[-10.715,1.462],[-15.395,3.22],[-14.007,6.536],[0.245,4.875],[14.549,-5.414],[13.232,-8.559]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[54.801,15.286],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.149,-20.93],[-15.713,-13.872],[-1.15,20.93],[15.713,13.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[60.828,30.742],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.379,-0.907],[-4.657,1.949],[0.38,0.908],[4.656,-1.948]],"o":[[0.38,0.907],[4.656,-1.948],[-0.38,-0.907],[-4.657,1.948]],"v":[[-8.432,3.528],[0.687,1.643],[8.431,-3.528],[-0.688,-1.643]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[71.227,51.54],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.552,-3.7],[-19.684,8.259],[1.553,3.699],[26.381,-11.068]],"o":[[1.552,3.7],[19.684,-8.26],[-1.552,-3.7],[-26.38,11.068]],"v":[[-35.641,21.601],[2.81,13.346],[35.641,-8.307],[-8.762,-14.233]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,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":[49.716,53.491],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.676,-2.794],[4.995,-3.065],[0,0],[0,0],[-19.692,8.241],[2.142,5.118],[0,0]],"o":[[-5.689,1.406],[-6.675,2.794],[0,0],[0,0],[2.141,5.119],[19.691,-8.24],[0,0],[0,0]],"v":[[15.526,-14.182],[-3.285,-7.846],[-20.999,1.103],[-38.392,8.383],[-35.06,16.34],[4.473,10.686],[36.25,-13.5],[32.918,-21.46]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,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":[52.27,66.271],"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 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-27.705,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[16.208,-45.017],[-13.835,-30.365],[-45.36,-19.251],[-14.816,39.406],[45.36,45.017]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,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":[68.067,101.408],"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 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Champagne beholder kant Foran","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[686.002,779.05,0],"ix":2},"a":{"a":0,"k":[130.546,14.312,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[64.78,0],[3.177,12.469],[0,0],[-71.96,0],[0,15.533],[0,0]],"o":[[-64.78,0],[0,0],[0,15.533],[71.96,0],[0,0],[-3.177,12.469]],"v":[[0,8.325],[-120.845,-14.062],[-130.296,-14.062],[0,14.062],[130.296,-14.062],[120.845,-14.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,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":[130.546,14.312],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Isbiter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[684.904,750.011,0],"ix":2},"a":{"a":0,"k":[110.506,42.44,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.211],[0.142,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.771,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[112.597,62.357],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.193,-0.948],[0,0]],"o":[[0,0],[-0.6,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.601,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.326,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.805],[0.07,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[109.935,72.51],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.266],[-3.65,6.615],[-3.063,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[116.345,70.927],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[113.494,67.79],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.422,0.085],[0,0],[0.227,1.123],[0,0]],"o":[[0,0],[0,0],[0.143,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.245,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.967],[4.427,7.752],[5.241,5.471],[2.215,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[118.75,72.673],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.369],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[115.102,69.602],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.229,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[112.044,66.492],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.06,-0.733],[-0.78,-2.26],[-1.048,0.724]],"o":[[0,0],[-1.474,-0.072],[0,0],[1.739,2.021],[1.771,-2.702]],"v":[[8.243,-4.843],[5.264,-4.989],[1.417,-3.985],[-7.463,3.04],[-0.973,3.428]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[8.493,19.625],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.582,0.028],[0,0],[0.67,0.969],[0,0],[-1.522,-0.076],[0,0],[-0.67,-0.969],[0,0]],"o":[[0,0],[-0.812,-0.04],[0,0],[-1.257,-1.815],[0,0],[0.812,0.04],[0,0],[0.481,0.696]],"v":[[9.927,10.557],[3.697,10.25],[1.266,8.596],[-9.369,-6.779],[-8.799,-10.509],[-4.583,-10.302],[-2.153,-8.648],[10.145,9.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[11.18,31.703],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.229,-0.159],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.308,-0.05]],"v":[[-0.673,-11.974],[-1.659,-11.292],[-0.385,9.212],[1.659,12.169],[0.151,-12.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[16.863,26.933],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.149,-7.109],[-1.341,-6.079],[-0.705,4.152],[1.341,7.109],[0.466,-6.966]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[12.169,24.746],"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 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.622,0.102],[0,0],[0,0],[-0.432,0.299],[0,0],[0.793,1.146],[0,0]],"o":[[0,0],[0,0],[0.496,0.717],[0,0],[0.692,-0.478],[0,0],[-0.531,-0.767]],"v":[[-6.638,-13.74],[-5.129,10.549],[-3.651,12.685],[-1.97,13.441],[5.946,5.789],[5.763,2.846],[-4.772,-12.385]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[23.652,28.553],"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 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.079,-8.256],[-1.763,-8.113],[-0.888,5.962],[2.079,10.251],[0.805,-10.251]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[14.398,25.893],"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 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.793,-1.146],[0,0],[0,0]],"o":[[-0.692,0.479],[0,0],[0,0],[0,0]],"v":[[-1.523,-2.969],[-1.34,-0.026],[2.215,5.115],[1.579,-5.115]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[9.249,23.783],"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 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.061,-0.734],[-0.78,-2.26],[-1.048,0.724]],"o":[[0,0],[-1.473,-0.073],[0,0],[1.739,2.021],[1.771,-2.702]],"v":[[8.243,-4.842],[5.263,-4.988],[1.416,-3.984],[-7.463,3.04],[-0.973,3.429]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[13.752,19.979],"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 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.582,0.028],[0,0],[0.67,0.969],[0,0],[-1.522,-0.075],[0,0],[-0.67,-0.969],[0,0]],"o":[[0,0],[-0.812,-0.039],[0,0],[-1.257,-1.816],[0,0],[0.813,0.04],[0,0],[0.481,0.695]],"v":[[9.927,10.556],[3.697,10.25],[1.266,8.596],[-9.369,-6.779],[-8.799,-10.509],[-4.584,-10.301],[-2.153,-8.647],[10.145,9.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[16.439,32.057],"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 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.229,-0.158],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.308,-0.049]],"v":[[-0.673,-11.974],[-1.659,-11.291],[-0.385,9.212],[1.659,12.169],[0.151,-12.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[22.122,27.287],"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 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.149,-7.11],[-1.341,-6.079],[-0.705,4.153],[1.341,7.11],[0.466,-6.967]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[17.428,25.1],"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 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.623,0.101],[0,0],[0,0],[-0.432,0.298],[0,0],[0.794,1.147],[0,0]],"o":[[0,0],[0,0],[0.495,0.717],[0,0],[0.693,-0.479],[0,0],[-0.531,-0.767]],"v":[[-6.638,-13.74],[-5.129,10.549],[-3.651,12.686],[-1.971,13.441],[5.945,5.79],[5.762,2.846],[-4.773,-12.384]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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.911,28.907],"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 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.079,-8.257],[-1.763,-8.114],[-0.888,5.963],[2.079,10.252],[0.805,-10.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[19.657,26.247],"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 20","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.793,-1.147],[0,0],[0,0]],"o":[[-0.692,0.479],[0,0],[0,0],[0,0]],"v":[[-1.523,-2.97],[-1.34,-0.026],[2.215,5.116],[1.579,-5.116]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[14.508,24.137],"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 21","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.038,-0.211],[0.141,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.77,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[157.133,16.202],"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 22","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.209],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.192,-0.948],[0,0]],"o":[[0,0],[-0.599,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.601,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.326,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.804],[0.07,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[154.471,26.354],"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 23","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.266],[-3.65,6.615],[-3.063,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[160.881,24.772],"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 24","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.261],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[158.03,21.635],"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 25","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.423,0.085],[0,0],[0.228,1.123],[0,0]],"o":[[0,0],[0,0],[0.142,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.245,-11.052],[-5.469,7.762],[-5.044,9.852],[-4.02,10.967],[4.426,7.752],[5.24,5.471],[2.214,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[163.286,26.517],"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 26","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.369],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[159.638,23.447],"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 27","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.229,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.346],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[156.58,20.337],"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 28","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.376],[0.666,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.78,-0.153],[0,0],[0.697,1.379],[4.157,-1.541]],"v":[[12.618,-2.318],[9.018,-2.628],[3.509,-2.29],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[196.17,62.804],"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 29","np":2,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.604],[-4.206,5.402],[-6.296,-4.891],[-2.884,-7.155],[2.205,-6.718],[4.031,-5.516],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[189.181,70.551],"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 30","np":2,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[201.054,68.066],"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 31","np":2,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.352,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[196.765,66.368],"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 32","np":2,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.154],[0,0],[0.155,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.481],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.347,7.909],[-7.805,8.501],[7.578,4.35],[9.483,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[203.037,69.18],"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 33","np":2,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.182,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[199.337,67.293],"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 34","np":2,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.881,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[194.893,65.642],"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 35","np":2,"cix":2,"bm":0,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.375],[0.666,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.78,-0.153],[0,0],[0.697,1.379],[4.157,-1.541]],"v":[[12.618,-2.318],[9.018,-2.628],[3.509,-2.29],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[147.672,38.223],"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 36","np":2,"cix":2,"bm":0,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.085],[0,0],[-0.247,-1.215],[0,0],[0.981,0.084],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.155],[2.205,-6.717],[4.031,-5.516],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[140.683,45.97],"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 37","np":2,"cix":2,"bm":0,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[152.556,43.485],"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 38","np":2,"cix":2,"bm":0,"ix":38,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.352,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[148.267,41.787],"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 39","np":2,"cix":2,"bm":0,"ix":39,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.154],[0,0],[0.155,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.347,7.91],[-7.805,8.501],[7.578,4.35],[9.483,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[154.539,44.599],"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 40","np":2,"cix":2,"bm":0,"ix":40,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.182,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[150.839,42.712],"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 41","np":2,"cix":2,"bm":0,"ix":41,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.881,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[146.395,41.061],"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 42","np":2,"cix":2,"bm":0,"ix":42,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[199.372,28.672],"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 43","np":2,"cix":2,"bm":0,"ix":43,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[189.87,39.47],"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 44","np":2,"cix":2,"bm":0,"ix":44,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.736,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[202.199,40.117],"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 45","np":2,"cix":2,"bm":0,"ix":45,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[198.719,35.872],"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 46","np":2,"cix":2,"bm":0,"ix":46,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[202.557,42.34],"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 47","np":2,"cix":2,"bm":0,"ix":47,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[200.937,38.292],"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 48","np":2,"cix":2,"bm":0,"ix":48,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[197.433,33.969],"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 49","np":2,"cix":2,"bm":0,"ix":49,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.935],[-1.856,-0.177]],"o":[[0,0],[-1.631,-0.953],[0,0],[0.185,2.372],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.324],[-5.456,2.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[206.561,46.141],"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 50","np":2,"cix":2,"bm":0,"ix":50,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.525],[0,0],[0.185,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.466,8.817],[-5.778,6.256],[-4.204,-10.188],[-0.197,-12.24],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[197.059,56.94],"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 51","np":2,"cix":2,"bm":0,"ix":51,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[209.388,57.587],"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 52","np":2,"cix":2,"bm":0,"ix":52,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[205.908,53.341],"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 53","np":2,"cix":2,"bm":0,"ix":53,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.074,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.615,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[209.746,59.809],"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 54","np":2,"cix":2,"bm":0,"ix":54,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[208.126,55.761],"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 55","np":2,"cix":2,"bm":0,"ix":55,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.228],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.811],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[204.622,51.438],"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 56","np":2,"cix":2,"bm":0,"ix":56,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[192.536,44.836],"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 57","np":2,"cix":2,"bm":0,"ix":57,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[183.034,55.635],"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 58","np":2,"cix":2,"bm":0,"ix":58,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[195.362,56.282],"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 59","np":2,"cix":2,"bm":0,"ix":59,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[191.882,52.036],"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 60","np":2,"cix":2,"bm":0,"ix":60,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[195.721,58.504],"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 61","np":2,"cix":2,"bm":0,"ix":61,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[194.1,54.456],"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 62","np":2,"cix":2,"bm":0,"ix":62,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[190.596,50.133],"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 63","np":2,"cix":2,"bm":0,"ix":63,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[178.009,19.378],"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 64","np":2,"cix":2,"bm":0,"ix":64,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.186,-1.943],[0,0],[0.899,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.205,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[168.507,30.177],"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 65","np":2,"cix":2,"bm":0,"ix":65,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[180.836,30.824],"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 66","np":2,"cix":2,"bm":0,"ix":66,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[177.356,26.578],"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 67","np":2,"cix":2,"bm":0,"ix":67,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[181.194,33.046],"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 68","np":2,"cix":2,"bm":0,"ix":68,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[179.573,28.998],"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 69","np":2,"cix":2,"bm":0,"ix":69,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[176.07,24.675],"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 70","np":2,"cix":2,"bm":0,"ix":70,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[176.896,55.196],"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 71","np":2,"cix":2,"bm":0,"ix":71,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[167.394,65.995],"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 72","np":2,"cix":2,"bm":0,"ix":72,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[179.723,66.642],"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 73","np":2,"cix":2,"bm":0,"ix":73,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[176.243,62.397],"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 74","np":2,"cix":2,"bm":0,"ix":74,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.766,-0.074],[0,0],[-0.117,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.161],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[180.081,68.864],"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 75","np":2,"cix":2,"bm":0,"ix":75,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[178.461,64.816],"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 76","np":2,"cix":2,"bm":0,"ix":76,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[174.957,60.493],"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 77","np":2,"cix":2,"bm":0,"ix":77,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.667,-1.766],[-1.57,-1.6],[-0.659,1.744]],"o":[[0,0],[-1.347,1.323],[0,0],[2.337,0.445],[0.543,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.514,-4.388],[-4.727,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[157.324,46.308],"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 78","np":2,"cix":2,"bm":0,"ix":78,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.533,-0.523],[0,0],[0.973,0.367],[0,0],[-1.392,1.367],[0,0],[-0.973,-0.367],[0,0]],"o":[[0,0],[-0.743,0.729],[0,0],[-1.826,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.877,1.122],[7.181,6.715],[4.366,7.309],[-11.089,1.475],[-12.018,-2.931],[-8.164,-6.716],[-5.349,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[165.258,57.744],"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 79","np":2,"cix":2,"bm":0,"ix":79,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.039,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[168.591,46.183],"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 80","np":2,"cix":2,"bm":0,"ix":80,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.773,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[163.574,48.423],"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 81","np":2,"cix":2,"bm":0,"ix":81,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.597,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.435,-1.152],[0,0],[-0.772,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.184,-3.788],[7.884,-6.663],[-7.425,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[173.499,46.397],"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 82","np":2,"cix":2,"bm":0,"ix":82,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.093,-5.361],[1.121,8.386],[5.432,10.014],[-3.619,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[166.198,46.91],"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 83","np":2,"cix":2,"bm":0,"ix":83,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.153,-0.436],[0,0],[0,0]],"o":[[-0.435,1.153],[0,0],[0,0],[0,0]],"v":[[-3.016,0.17],[-1.716,3.046],[3.451,4.997],[-1.065,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[160.895,49.178],"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 84","np":2,"cix":2,"bm":0,"ix":84,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.307],[-0.728,-2.12],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.806]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.58],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[152.416,61.216],"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 85","np":2,"cix":2,"bm":0,"ix":85,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.242],[0,0],[0.721,0.751],[0,0],[-1.845,0.635],[0,0],[-0.721,-0.751],[0,0]],"o":[[0,0],[-0.985,0.338],[0,0],[-1.35,-1.408],[0,0],[0.984,-0.339],[0,0],[0.517,0.539]],"v":[[11.106,6.769],[3.557,9.365],[0.76,8.688],[-10.677,-3.232],[-9.619,-7.608],[-4.51,-9.364],[-1.714,-8.687],[11.51,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[154.246,73.901],"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 86","np":2,"cix":2,"bm":0,"ix":86,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.37,0.09]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.722],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[161.685,65.394],"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 87","np":2,"cix":2,"bm":0,"ix":87,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.71],[-1.255,5.254],[0.945,7.546],[1.255,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[156.182,65.245],"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 88","np":2,"cix":2,"bm":0,"ix":88,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.748,-0.182],[0,0],[0,0],[-0.555,0.533],[0,0],[0.853,0.889],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.852],[0,0],[-0.571,-0.594]],"v":[[-6.891,-14.039],[-7.429,11.99],[-5.84,13.647],[-3.869,13.688],[6.511,1.536],[6.576,-1.617],[-4.753,-13.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[169.945,66.419],"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 89","np":2,"cix":2,"bm":0,"ix":89,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.432],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[158.918,65.13],"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 90","np":2,"cix":2,"bm":0,"ix":90,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.889],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.659],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[152.701,65.017],"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 91","np":2,"cix":2,"bm":0,"ix":91,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.044,0.176],[0.836,-1.777],[-1.031,-0.174]],"o":[[0,0],[-0.825,-0.887],[0,0],[-0.136,2.183],[2.589,-0.573]],"v":[[6.943,3.07],[5.274,1.277],[2.438,-0.335],[-6.807,-1.293],[-3.214,2.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[103.144,32.637],"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 92","np":2,"cix":2,"bm":0,"ix":92,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.326,0.351],[0,0],[-0.16,0.953],[0,0],[-0.852,-0.916],[0,0],[0.161,-0.953],[0,0]],"o":[[0,0],[-0.454,-0.489],[0,0],[0.302,-1.787],[0,0],[0.455,0.489],[0,0],[-0.116,0.684]],"v":[[0.034,11.838],[-3.454,8.089],[-3.936,5.725],[-1.379,-9.407],[1.094,-11.274],[3.452,-8.738],[3.934,-6.373],[0.98,11.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[96.881,42.526],"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 93","np":2,"cix":2,"bm":0,"ix":93,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.225,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.152,-0.206]],"v":[[5.946,-7.683],[4.975,-7.847],[-6.022,4.937],[-6.514,7.847],[6.514,-7.296]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[103.719,43.181],"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 94","np":2,"cix":2,"bm":0,"ix":94,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.67,-4.398],[2.204,-4.645],[-3.283,1.734],[-3.775,4.645],[3.775,-4.132]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[102.184,39.252],"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 95","np":2,"cix":2,"bm":0,"ix":95,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.308,0.416],[0,0],[0,0],[-0.426,-0.071],[0,0],[-0.191,1.129],[0,0]],"o":[[0,0],[0,0],[-0.119,0.706],[0,0],[0.682,0.116],[0,0],[0.128,-0.755]],"v":[[6.527,-9.403],[-6.501,5.741],[-6.855,7.843],[-6.301,9.25],[2.736,9.287],[4.315,7.451],[6.846,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[103.706,45.287],"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 96","np":2,"cix":2,"bm":0,"ix":96,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.66,-6.632],[2.764,-6.366],[-4.785,2.41],[-5.499,6.632],[5.499,-6.153]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[103.195,41.486],"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 97","np":2,"cix":2,"bm":0,"ix":97,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.191,-1.129],[0,0],[0,0]],"o":[[-0.681,-0.114],[0,0],[0,0],[0,0]],"v":[[-0.31,-3.391],[-1.889,-1.555],[-2.743,3.505],[2.743,-2.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[101.645,37.481],"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 98","np":2,"cix":2,"bm":0,"ix":98,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.21],[0.141,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.771,-2.409],[-7.199,0.02],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[120.199,9.759],"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 99","np":2,"cix":2,"bm":0,"ix":99,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.192,-0.948],[0,0]],"o":[[0,0],[-0.6,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.6,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.325,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.805],[0.071,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[117.537,19.911],"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 100","np":2,"cix":2,"bm":0,"ix":100,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.017,-9.266],[-3.65,6.615],[-3.062,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[123.947,18.328],"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 101","np":2,"cix":2,"bm":0,"ix":101,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[121.096,15.192],"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 102","np":2,"cix":2,"bm":0,"ix":102,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.423,0.085],[0,0],[0.228,1.123],[0,0]],"o":[[0,0],[0,0],[0.142,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.244,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.967],[4.426,7.752],[5.24,5.471],[2.214,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[126.353,20.074],"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 103","np":2,"cix":2,"bm":0,"ix":103,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.368],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[122.705,17.003],"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 104","np":2,"cix":2,"bm":0,"ix":104,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.228,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[119.647,13.894],"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 105","np":2,"cix":2,"bm":0,"ix":105,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.851,-0.376],[0.666,-1.455],[-1.828,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.317],[9.017,-2.627],[3.507,-2.289],[-12.618,1.402],[-4.829,2.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[146.211,53.429],"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 106","np":2,"cix":2,"bm":0,"ix":106,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.704,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.156],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[139.222,61.176],"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 107","np":2,"cix":2,"bm":0,"ix":107,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.4,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.207,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[151.095,58.691],"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 108","np":2,"cix":2,"bm":0,"ix":108,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.913],[-4.753,2.461],[-4.352,4.441],[4.753,-4.329]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[146.807,56.992],"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 109","np":2,"cix":2,"bm":0,"ix":109,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.153],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.481],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.654],[-9.638,6.48],[-9.347,7.909],[-7.805,8.501],[7.578,4.351],[9.482,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[153.078,59.805],"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 110","np":2,"cix":2,"bm":0,"ix":110,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.367],[2.182,-5.254],[-6.923,3.516],[-6.34,6.388],[6.923,-6.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[149.378,57.918],"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 111","np":2,"cix":2,"bm":0,"ix":111,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.246],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.253],[-2.881,3.187],[3.737,-3.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[144.935,56.266],"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 112","np":2,"cix":2,"bm":0,"ix":112,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.851,-0.376],[0.667,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.698,1.379],[4.158,-1.541]],"v":[[12.618,-2.318],[9.018,-2.628],[3.508,-2.29],[-12.618,1.402],[-4.83,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[95.72,48.604],"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 113","np":2,"cix":2,"bm":0,"ix":113,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.704,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.159],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.466]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.403],[-6.296,-4.89],[-2.884,-7.154],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[88.731,56.351],"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 114","np":2,"cix":2,"bm":0,"ix":114,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.207,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[100.603,53.866],"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 115","np":2,"cix":2,"bm":0,"ix":115,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.351,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[96.315,52.168],"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 116","np":2,"cix":2,"bm":0,"ix":116,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.755,0.154],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.098,0.481],[0,0],[1.207,-0.245],[0,0],[-0.104,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.348,7.909],[-7.805,8.501],[7.578,4.35],[9.482,2.517],[7.411,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[102.587,54.98],"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 117","np":2,"cix":2,"bm":0,"ix":117,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.181,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[98.887,53.093],"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 118","np":2,"cix":2,"bm":0,"ix":118,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.157,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.675,-2.088],[-3.58,-0.254],[-2.882,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[94.443,51.442],"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 119","np":2,"cix":2,"bm":0,"ix":119,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.953],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[148.304,18.612],"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 120","np":2,"cix":2,"bm":0,"ix":120,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.256],[-4.204,-10.188],[-0.198,-12.24],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[138.802,29.411],"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 121","np":2,"cix":2,"bm":0,"ix":121,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[151.131,30.058],"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 122","np":2,"cix":2,"bm":0,"ix":122,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[147.651,25.812],"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 123","np":2,"cix":2,"bm":0,"ix":123,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[151.489,32.28],"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 124","np":2,"cix":2,"bm":0,"ix":124,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[149.869,28.232],"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 125","np":2,"cix":2,"bm":0,"ix":125,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[146.364,23.909],"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 126","np":2,"cix":2,"bm":0,"ix":126,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[164.691,40.021],"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 127","np":2,"cix":2,"bm":0,"ix":127,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[155.189,50.82],"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 128","np":2,"cix":2,"bm":0,"ix":128,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[167.518,51.467],"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 129","np":2,"cix":2,"bm":0,"ix":129,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[164.038,47.221],"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 130","np":2,"cix":2,"bm":0,"ix":130,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[167.876,53.689],"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 131","np":2,"cix":2,"bm":0,"ix":131,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[166.256,49.641],"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 132","np":2,"cix":2,"bm":0,"ix":132,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.117,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[162.752,45.319],"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 133","np":2,"cix":2,"bm":0,"ix":133,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.177]],"o":[[0,0],[-1.631,-0.953],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[132.546,57.432],"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 134","np":2,"cix":2,"bm":0,"ix":134,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.256],[-4.204,-10.188],[-0.197,-12.24],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[123.044,68.231],"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 135","np":2,"cix":2,"bm":0,"ix":135,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[135.373,68.878],"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 136","np":2,"cix":2,"bm":0,"ix":136,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.515,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[131.893,64.632],"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 137","np":2,"cix":2,"bm":0,"ix":137,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[135.731,71.1],"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 138","np":2,"cix":2,"bm":0,"ix":138,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[134.111,67.053],"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 139","np":2,"cix":2,"bm":0,"ix":139,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[130.607,62.73],"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 140","np":2,"cix":2,"bm":0,"ix":140,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.131,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.184,2.371],[4.464,-0.65]],"v":[[12.574,3.259],[9.277,1.333],[3.949,-0.387],[-12.574,-1.323],[-5.457,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[134.695,25.331],"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 141","np":2,"cix":2,"bm":0,"ix":141,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[125.193,36.13],"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 142","np":2,"cix":2,"bm":0,"ix":142,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[137.522,36.777],"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 143","np":2,"cix":2,"bm":0,"ix":143,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[134.042,32.532],"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 144","np":2,"cix":2,"bm":0,"ix":144,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.074,0.767],[0,0],[1.228,0.118],[0,0],[0.079,-0.822]],"v":[[9.682,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.16],[6.618,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[137.88,38.999],"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 145","np":2,"cix":2,"bm":0,"ix":145,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[136.26,34.951],"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 146","np":2,"cix":2,"bm":0,"ix":146,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[132.755,30.628],"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 147","np":2,"cix":2,"bm":0,"ix":147,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[143.076,59.34],"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 148","np":2,"cix":2,"bm":0,"ix":148,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.376],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.072,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.513],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[133.574,70.139],"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 149","np":2,"cix":2,"bm":0,"ix":149,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.736,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[145.903,70.786],"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 150","np":2,"cix":2,"bm":0,"ix":150,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[142.423,66.54],"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 151","np":2,"cix":2,"bm":0,"ix":151,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.766,-0.074],[0,0],[-0.118,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.821]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.161],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[146.261,73.008],"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 152","np":2,"cix":2,"bm":0,"ix":152,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[144.641,68.96],"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 153","np":2,"cix":2,"bm":0,"ix":153,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[141.136,64.637],"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 154","np":2,"cix":2,"bm":0,"ix":154,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.667,-1.766],[-1.57,-1.6],[-0.659,1.744]],"o":[[0,0],[-1.347,1.323],[0,0],[2.337,0.445],[0.543,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.514,-4.388],[-4.727,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[104.315,46.308],"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 155","np":2,"cix":2,"bm":0,"ix":155,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.533,-0.523],[0,0],[0.973,0.367],[0,0],[-1.392,1.367],[0,0],[-0.974,-0.367],[0,0]],"o":[[0,0],[-0.743,0.729],[0,0],[-1.826,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.877,1.122],[7.181,6.715],[4.366,7.309],[-11.089,1.475],[-12.018,-2.931],[-8.163,-6.716],[-5.348,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[112.249,57.744],"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 156","np":2,"cix":2,"bm":0,"ix":156,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.04,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[115.582,46.183],"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 157","np":2,"cix":2,"bm":0,"ix":157,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.773,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[110.565,48.423],"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 158","np":2,"cix":2,"bm":0,"ix":158,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.596,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.436,-1.152],[0,0],[-0.771,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.183,-3.788],[7.884,-6.663],[-7.426,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[120.491,46.397],"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 159","np":2,"cix":2,"bm":0,"ix":159,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.094,-5.361],[1.12,8.386],[5.432,10.014],[-3.62,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[113.189,46.91],"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 160","np":2,"cix":2,"bm":0,"ix":160,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.153,-0.436],[0,0],[0,0]],"o":[[-0.436,1.153],[0,0],[0,0],[0,0]],"v":[[-3.015,0.17],[-1.717,3.046],[3.452,4.997],[-1.066,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[107.886,49.178],"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 161","np":2,"cix":2,"bm":0,"ix":161,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.306],[-0.728,-2.121],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.807]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.581],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[92.747,62.314],"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 162","np":2,"cix":2,"bm":0,"ix":162,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.243],[0,0],[0.721,0.751],[0,0],[-1.845,0.634],[0,0],[-0.72,-0.751],[0,0]],"o":[[0,0],[-0.984,0.339],[0,0],[-1.351,-1.407],[0,0],[0.985,-0.338],[0,0],[0.516,0.538]],"v":[[11.107,6.769],[3.556,9.364],[0.761,8.687],[-10.676,-3.233],[-9.618,-7.608],[-4.509,-9.365],[-1.713,-8.688],[11.512,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[94.576,74.998],"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 163","np":2,"cix":2,"bm":0,"ix":163,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.369,0.091]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.721],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[102.016,66.491],"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 164","np":2,"cix":2,"bm":0,"ix":164,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.711],[-1.255,5.253],[0.945,7.546],[1.255,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[96.513,66.342],"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 165","np":2,"cix":2,"bm":0,"ix":165,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.748,-0.182],[0,0],[0,0],[-0.556,0.533],[0,0],[0.853,0.89],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.853],[0,0],[-0.571,-0.595]],"v":[[-6.891,-14.039],[-7.429,11.99],[-5.84,13.647],[-3.868,13.688],[6.511,1.537],[6.576,-1.618],[-4.753,-13.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[110.276,67.516],"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 166","np":2,"cix":2,"bm":0,"ix":166,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.431],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[99.249,66.227],"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 167","np":2,"cix":2,"bm":0,"ix":167,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.888],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.658],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[93.032,66.114],"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 168","np":2,"cix":2,"bm":0,"ix":168,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.211],[0.141,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.771,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[68.746,2.869],"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 169","np":2,"cix":2,"bm":0,"ix":169,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.192,-0.948],[0,0]],"o":[[0,0],[-0.599,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.6,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.326,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.805],[0.071,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[66.084,13.023],"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 170","np":2,"cix":2,"bm":0,"ix":170,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.266],[-3.65,6.615],[-3.062,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[72.494,11.44],"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 171","np":2,"cix":2,"bm":0,"ix":171,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[69.643,8.303],"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 172","np":2,"cix":2,"bm":0,"ix":172,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.423,0.085],[0,0],[0.228,1.123],[0,0]],"o":[[0,0],[0,0],[0.142,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.244,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.967],[4.426,7.752],[5.24,5.471],[2.214,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[74.9,13.185],"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 173","np":2,"cix":2,"bm":0,"ix":173,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.368],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[71.251,10.115],"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 174","np":2,"cix":2,"bm":0,"ix":174,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.228,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[68.193,7.005],"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 175","np":2,"cix":2,"bm":0,"ix":175,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.376],[0.666,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.78,-0.153],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.317],[9.018,-2.627],[3.509,-2.289],[-12.618,1.402],[-4.829,2.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[114.02,46.638],"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 176","np":2,"cix":2,"bm":0,"ix":176,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.248,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.38,6.605],[-4.205,5.402],[-6.295,-4.89],[-2.884,-7.156],[2.206,-6.717],[4.032,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[107.032,54.385],"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 177","np":2,"cix":2,"bm":0,"ix":177,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[118.904,51.9],"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 178","np":2,"cix":2,"bm":0,"ix":178,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.913],[-4.753,2.461],[-4.352,4.441],[4.753,-4.329]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[114.616,50.201],"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 179","np":2,"cix":2,"bm":0,"ix":179,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.153],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.654],[-9.638,6.48],[-9.347,7.909],[-7.805,8.501],[7.578,4.351],[9.482,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[120.888,53.014],"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 180","np":2,"cix":2,"bm":0,"ix":180,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.367],[2.182,-5.254],[-6.923,3.516],[-6.34,6.388],[6.923,-6.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[117.187,51.127],"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 181","np":2,"cix":2,"bm":0,"ix":181,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.246],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.253],[-2.881,3.187],[3.737,-3.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[112.744,49.475],"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 182","np":2,"cix":2,"bm":0,"ix":182,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.851,-0.376],[0.666,-1.455],[-1.828,0.371]],"o":[[0,0],[-1.779,-0.152],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.318],[9.017,-2.628],[3.507,-2.289],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[65.287,26.502],"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 183","np":2,"cix":2,"bm":0,"ix":183,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.704,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.085],[0,0],[-0.247,-1.215],[0,0],[0.981,0.084],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.155],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[58.299,34.249],"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 184","np":2,"cix":2,"bm":0,"ix":184,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.207,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[70.171,31.764],"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 185","np":2,"cix":2,"bm":0,"ix":185,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.462,-4.441],[1.864,-3.914],[-4.754,2.461],[-4.351,4.441],[4.754,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[65.883,30.066],"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 186","np":2,"cix":2,"bm":0,"ix":186,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.107],[0,0],[0,0],[-0.754,0.154],[0,0],[0.156,0.768],[0,0]],"o":[[0,0],[0,0],[0.098,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.515]],"v":[[6.073,-8.654],[-9.638,6.479],[-9.348,7.909],[-7.805,8.5],[7.578,4.35],[9.482,2.516],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[72.155,32.878],"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 187","np":2,"cix":2,"bm":0,"ix":187,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.183,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[68.454,30.991],"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 188","np":2,"cix":2,"bm":0,"ix":188,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.883,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[64.011,29.339],"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 189","np":2,"cix":2,"bm":0,"ix":189,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.131,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.184,2.371],[4.464,-0.65]],"v":[[12.574,3.259],[9.277,1.333],[3.949,-0.387],[-12.574,-1.323],[-5.457,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[117.998,19.429],"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 190","np":2,"cix":2,"bm":0,"ix":190,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.953],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[108.496,30.228],"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 191","np":2,"cix":2,"bm":0,"ix":191,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[120.824,30.874],"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 192","np":2,"cix":2,"bm":0,"ix":192,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[117.345,26.629],"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 193","np":2,"cix":2,"bm":0,"ix":193,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[121.183,33.096],"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 194","np":2,"cix":2,"bm":0,"ix":194,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[119.562,29.049],"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 195","np":2,"cix":2,"bm":0,"ix":195,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[116.058,24.726],"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 196","np":2,"cix":2,"bm":0,"ix":196,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[132.5,33.23],"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 197","np":2,"cix":2,"bm":0,"ix":197,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.186,-1.943],[0,0],[0.899,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.205,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[122.998,44.029],"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 198","np":2,"cix":2,"bm":0,"ix":198,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[135.327,44.676],"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 199","np":2,"cix":2,"bm":0,"ix":199,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[131.847,40.43],"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 200","np":2,"cix":2,"bm":0,"ix":200,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[135.685,46.898],"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 201","np":2,"cix":2,"bm":0,"ix":201,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[134.065,42.85],"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 202","np":2,"cix":2,"bm":0,"ix":202,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[130.561,38.528],"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 203","np":2,"cix":2,"bm":0,"ix":203,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.953],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[110.443,42.019],"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 204","np":2,"cix":2,"bm":0,"ix":204,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.035],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.466,8.818],[-5.778,6.257],[-4.204,-10.188],[-0.197,-12.24],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[100.941,52.818],"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 205","np":2,"cix":2,"bm":0,"ix":205,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[113.27,53.465],"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 206","np":2,"cix":2,"bm":0,"ix":206,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[109.79,49.219],"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 207","np":2,"cix":2,"bm":0,"ix":207,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.074,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.615,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[113.628,55.687],"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 208","np":2,"cix":2,"bm":0,"ix":208,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[112.008,51.64],"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 209","np":2,"cix":2,"bm":0,"ix":209,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[108.503,47.317],"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 210","np":2,"cix":2,"bm":0,"ix":210,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.756,0.694],[1.624,-1.546],[-1.734,-0.685]],"o":[[0,0],[-1.303,-1.367],[0,0],[-0.479,2.33],[4.469,0.61]],"v":[[11.688,6.457],[9.052,3.693],[4.409,0.565],[-11.209,-4.911],[-5.544,1.136]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[21.13,34.553],"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 211","np":2,"cix":2,"bm":0,"ix":211,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.515,0.54],[0,0],[-0.381,0.968],[0,0],[-1.346,-1.413],[0,0],[0.382,-0.967],[0,0]],"o":[[0,0],[-0.718,-0.754],[0,0],[0.717,-1.814],[0,0],[0.718,0.753],[0,0],[-0.273,0.694]],"v":[[-1.323,12.852],[-6.831,7.072],[-7.382,4.248],[-1.315,-11.118],[3.103,-11.979],[6.829,-8.068],[7.38,-5.245],[0.366,12.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[9.613,42.306],"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 212","np":2,"cix":2,"bm":0,"ix":212,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.379,0.149],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.235,-0.298]],"v":[[11.019,-5.208],[9.386,-5.853],[-10.774,2.896],[-11.941,5.853],[11.941,-4.513]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[21.103,45.786],"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 213","np":2,"cix":2,"bm":0,"ix":213,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.772,-2.688],[4.306,-3.661],[-5.754,0.705],[-6.92,3.661],[6.92,-2.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[18.941,40.736],"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 214","np":2,"cix":2,"bm":0,"ix":214,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.477,0.604],[0,0],[0,0],[-0.717,-0.284],[0,0],[-0.452,1.146],[0,0]],"o":[[0,0],[0,0],[-0.282,0.717],[0,0],[1.146,0.453],[0,0],[0.303,-0.766]],"v":[[12.186,-9.565],[-11.696,0.799],[-12.54,2.935],[-11.754,4.745],[3.617,9.112],[6.511,7.855],[12.519,-7.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[20.859,50.839],"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 215","np":2,"cix":2,"bm":0,"ix":215,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.304,-5.318],[5.452,-4.975],[-8.388,1.031],[-10.08,5.318],[10.08,-3.431]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[20.409,43.366],"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 216","np":2,"cix":2,"bm":0,"ix":216,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.453,-1.146],[0,0],[0,0]],"o":[[-1.146,-0.452],[0,0],[0,0],[0,0]],"v":[[-0.107,-2.971],[-3.002,-1.715],[-5.03,3.423],[5.03,-0.943]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[18.217,38.018],"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 217","np":2,"cix":2,"bm":0,"ix":217,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[92.809,12.587],"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 218","np":2,"cix":2,"bm":0,"ix":218,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.466,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[83.307,23.386],"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 219","np":2,"cix":2,"bm":0,"ix":219,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[95.636,24.033],"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 220","np":2,"cix":2,"bm":0,"ix":220,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[92.156,19.787],"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 221","np":2,"cix":2,"bm":0,"ix":221,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[95.994,26.255],"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 222","np":2,"cix":2,"bm":0,"ix":222,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[94.374,22.207],"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 223","np":2,"cix":2,"bm":0,"ix":223,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[90.87,17.884],"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 224","np":2,"cix":2,"bm":0,"ix":224,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[95.894,46.991],"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 225","np":2,"cix":2,"bm":0,"ix":225,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.035],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.953],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[86.392,57.79],"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 226","np":2,"cix":2,"bm":0,"ix":226,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[98.721,58.437],"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 227","np":2,"cix":2,"bm":0,"ix":227,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[95.241,54.192],"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 228","np":2,"cix":2,"bm":0,"ix":228,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[99.079,60.659],"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 229","np":2,"cix":2,"bm":0,"ix":229,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[97.459,56.611],"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 230","np":2,"cix":2,"bm":0,"ix":230,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[93.955,52.288],"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 231","np":2,"cix":2,"bm":0,"ix":231,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.666,-1.766],[-1.571,-1.6],[-0.659,1.744]],"o":[[0,0],[-1.347,1.323],[0,0],[2.336,0.445],[0.543,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.516,-4.388],[-4.726,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[72.125,39.517],"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 232","np":2,"cix":2,"bm":0,"ix":232,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.533,-0.523],[0,0],[0.973,0.367],[0,0],[-1.392,1.367],[0,0],[-0.974,-0.367],[0,0]],"o":[[0,0],[-0.743,0.729],[0,0],[-1.826,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.877,1.122],[7.181,6.715],[4.366,7.309],[-11.089,1.475],[-12.018,-2.931],[-8.163,-6.716],[-5.348,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[80.058,50.953],"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 233","np":2,"cix":2,"bm":0,"ix":233,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.039,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[83.392,39.392],"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 234","np":2,"cix":2,"bm":0,"ix":234,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.773,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[78.375,41.632],"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 235","np":2,"cix":2,"bm":0,"ix":235,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.596,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.435,-1.152],[0,0],[-0.772,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.184,-3.788],[7.884,-6.663],[-7.425,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[88.3,39.606],"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 236","np":2,"cix":2,"bm":0,"ix":236,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.094,-5.361],[1.12,8.386],[5.432,10.014],[-3.62,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[80.999,40.119],"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 237","np":2,"cix":2,"bm":0,"ix":237,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.154,-0.436],[0,0],[0,0]],"o":[[-0.435,1.153],[0,0],[0,0],[0,0]],"v":[[-3.016,0.17],[-1.716,3.046],[3.451,4.997],[-1.066,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[75.696,42.387],"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 238","np":2,"cix":2,"bm":0,"ix":238,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.307],[-0.728,-2.12],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.806]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.58],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[69.101,56.453],"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 239","np":2,"cix":2,"bm":0,"ix":239,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.243],[0,0],[0.721,0.751],[0,0],[-1.845,0.634],[0,0],[-0.721,-0.751],[0,0]],"o":[[0,0],[-0.984,0.338],[0,0],[-1.351,-1.408],[0,0],[0.984,-0.339],[0,0],[0.517,0.538]],"v":[[11.106,6.769],[3.556,9.365],[0.76,8.688],[-10.677,-3.232],[-9.618,-7.608],[-4.509,-9.364],[-1.713,-8.687],[11.511,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[70.93,69.138],"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 240","np":2,"cix":2,"bm":0,"ix":240,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.37,0.09]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.721],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[78.37,60.632],"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 241","np":2,"cix":2,"bm":0,"ix":241,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.71],[-1.256,5.254],[0.944,7.546],[1.256,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[72.867,60.482],"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 242","np":2,"cix":2,"bm":0,"ix":242,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.747,-0.183],[0,0],[0,0],[-0.555,0.533],[0,0],[0.853,0.889],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.852],[0,0],[-0.571,-0.594]],"v":[[-6.891,-14.038],[-7.429,11.99],[-5.84,13.647],[-3.869,13.688],[6.511,1.537],[6.576,-1.617],[-4.753,-13.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[86.63,61.656],"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 243","np":2,"cix":2,"bm":0,"ix":243,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.431],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[75.603,60.367],"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 244","np":2,"cix":2,"bm":0,"ix":244,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.889],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.659],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[69.386,60.254],"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 245","np":2,"cix":2,"bm":0,"ix":245,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.211],[0.142,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.087],[2.209,-1.466]],"v":[[7.199,-0.85],[4.998,-1.923],[1.771,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[31.254,12.514],"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 246","np":2,"cix":2,"bm":0,"ix":246,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.192,0.947],[0,0],[-1.125,-0.549],[0,0],[-0.193,-0.947],[0,0]],"o":[[0,0],[-0.6,-0.292],[0,0],[-0.36,-1.777],[0,0],[0.601,0.293],[0,0],[0.138,0.68]],"v":[[4.276,11.143],[-0.326,8.898],[-1.625,6.865],[-4.68,-8.175],[-3.043,-10.805],[0.07,-9.287],[1.37,-7.253],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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.592,22.667],"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 247","np":2,"cix":2,"bm":0,"ix":247,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.268],[-3.65,6.615],[-3.063,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[35.003,21.084],"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 248","np":2,"cix":2,"bm":0,"ix":248,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[32.151,17.947],"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 249","np":2,"cix":2,"bm":0,"ix":249,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.422,0.086],[0,0],[0.228,1.122],[0,0]],"o":[[0,0],[0,0],[0.143,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.245,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.966],[4.427,7.752],[5.24,5.471],[2.215,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[37.407,22.83],"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 250","np":2,"cix":2,"bm":0,"ix":250,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.369],[0.631,-7.158],[-3.259,3.744],[-2.408,7.942],[3.259,-7.942]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[33.759,19.759],"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 251","np":2,"cix":2,"bm":0,"ix":251,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.229,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[30.701,16.649],"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 252","np":2,"cix":2,"bm":0,"ix":252,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.376],[0.667,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.698,1.378],[4.158,-1.541]],"v":[[12.618,-2.317],[9.018,-2.627],[3.508,-2.289],[-12.618,1.402],[-4.83,2.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[61.012,46.638],"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 253","np":2,"cix":2,"bm":0,"ix":253,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.156],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[54.023,54.385],"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 254","np":2,"cix":2,"bm":0,"ix":254,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[65.895,51.9],"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 255","np":2,"cix":2,"bm":0,"ix":255,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.913],[-4.753,2.461],[-4.352,4.441],[4.753,-4.329]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[61.607,50.201],"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 256","np":2,"cix":2,"bm":0,"ix":256,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.153],[0,0],[0.155,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.654],[-9.638,6.48],[-9.347,7.909],[-7.805,8.501],[7.578,4.351],[9.483,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[67.879,53.014],"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 257","np":2,"cix":2,"bm":0,"ix":257,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.367],[2.182,-5.254],[-6.923,3.516],[-6.339,6.388],[6.923,-6.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[64.178,51.127],"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 258","np":2,"cix":2,"bm":0,"ix":258,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.246],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.253],[-2.881,3.187],[3.737,-3.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[59.735,49.475],"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 259","np":2,"cix":2,"bm":0,"ix":259,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.375],[0.666,-1.456],[-1.827,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.318],[9.017,-2.628],[3.509,-2.29],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[13.952,39.656],"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 260","np":2,"cix":2,"bm":0,"ix":260,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.131,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.085],[0,0],[-0.248,-1.215],[0,0],[0.981,0.084],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.38,6.605],[-4.205,5.402],[-6.295,-4.89],[-2.884,-7.155],[2.206,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[6.963,47.403],"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 261","np":2,"cix":2,"bm":0,"ix":261,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.053]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[18.836,44.918],"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 262","np":2,"cix":2,"bm":0,"ix":262,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.352,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[14.547,43.22],"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 263","np":2,"cix":2,"bm":0,"ix":263,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.154],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.347,7.91],[-7.805,8.501],[7.578,4.35],[9.482,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[20.819,46.032],"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 264","np":2,"cix":2,"bm":0,"ix":264,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.182,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[17.119,44.144],"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 265","np":2,"cix":2,"bm":0,"ix":265,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.881,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[12.676,42.493],"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 266","np":2,"cix":2,"bm":0,"ix":266,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.372],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[58.177,4.437],"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 267","np":2,"cix":2,"bm":0,"ix":267,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.376],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.942],[0,0],[0.898,0.524],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.466,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[48.675,15.236],"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 268","np":2,"cix":2,"bm":0,"ix":268,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[61.004,15.883],"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 269","np":2,"cix":2,"bm":0,"ix":269,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[57.524,11.638],"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 270","np":2,"cix":2,"bm":0,"ix":270,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.119],[0,0],[0.078,-0.821]],"v":[[9.681,-10.219],[-10.397,6.354],[-10.616,8.639],[-9.361,10.161],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[61.362,18.106],"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 271","np":2,"cix":2,"bm":0,"ix":271,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.953],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[59.742,14.058],"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 272","np":2,"cix":2,"bm":0,"ix":272,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.118],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.694],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[56.238,9.735],"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 273","np":2,"cix":2,"bm":0,"ix":273,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[79.492,33.23],"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 274","np":2,"cix":2,"bm":0,"ix":274,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[69.99,44.029],"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 275","np":2,"cix":2,"bm":0,"ix":275,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.736,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[82.318,44.676],"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 276","np":2,"cix":2,"bm":0,"ix":276,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[78.839,40.43],"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 277","np":2,"cix":2,"bm":0,"ix":277,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[82.677,46.898],"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 278","np":2,"cix":2,"bm":0,"ix":278,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[81.057,42.85],"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 279","np":2,"cix":2,"bm":0,"ix":279,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[77.552,38.528],"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 280","np":2,"cix":2,"bm":0,"ix":280,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.953],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[57.434,42.019],"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 281","np":2,"cix":2,"bm":0,"ix":281,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.035],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.188],[-0.198,-12.24],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[47.933,52.818],"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 282","np":2,"cix":2,"bm":0,"ix":282,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[60.261,53.465],"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 283","np":2,"cix":2,"bm":0,"ix":283,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[56.782,49.219],"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 284","np":2,"cix":2,"bm":0,"ix":284,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.822]],"v":[[9.681,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[60.619,55.687],"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 285","np":2,"cix":2,"bm":0,"ix":285,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[58.999,51.64],"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 286","np":2,"cix":2,"bm":0,"ix":286,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[55.495,47.317],"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 287","np":2,"cix":2,"bm":0,"ix":287,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[49.495,18.54],"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 288","np":2,"cix":2,"bm":0,"ix":288,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[39.994,29.339],"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 289","np":2,"cix":2,"bm":0,"ix":289,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[52.322,29.986],"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 290","np":2,"cix":2,"bm":0,"ix":290,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[48.842,25.741],"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 291","np":2,"cix":2,"bm":0,"ix":291,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[52.68,32.208],"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 292","np":2,"cix":2,"bm":0,"ix":292,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[51.06,28.16],"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 293","np":2,"cix":2,"bm":0,"ix":293,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[47.556,23.837],"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 294","np":2,"cix":2,"bm":0,"ix":294,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.131,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.184,2.371],[4.464,-0.65]],"v":[[12.574,3.259],[9.277,1.333],[3.949,-0.387],[-12.574,-1.323],[-5.457,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[57.876,52.549],"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 295","np":2,"cix":2,"bm":0,"ix":295,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.035],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.953],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[48.375,63.348],"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 296","np":2,"cix":2,"bm":0,"ix":296,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[60.703,63.995],"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 297","np":2,"cix":2,"bm":0,"ix":297,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[57.223,59.749],"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 298","np":2,"cix":2,"bm":0,"ix":298,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.767,-0.074],[0,0],[-0.117,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.228,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.161],[6.618,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[61.061,66.217],"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 299","np":2,"cix":2,"bm":0,"ix":299,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[59.441,62.169],"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 300","np":2,"cix":2,"bm":0,"ix":300,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[55.937,57.846],"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 301","np":2,"cix":2,"bm":0,"ix":301,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.666,-1.766],[-1.571,-1.6],[-0.658,1.744]],"o":[[0,0],[-1.346,1.323],[0,0],[2.336,0.445],[0.544,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.516,-4.388],[-4.726,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[19.116,39.517],"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 302","np":2,"cix":2,"bm":0,"ix":302,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.532,-0.523],[0,0],[0.974,0.367],[0,0],[-1.392,1.367],[0,0],[-0.973,-0.367],[0,0]],"o":[[0,0],[-0.742,0.729],[0,0],[-1.825,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.878,1.122],[7.181,6.715],[4.366,7.309],[-11.09,1.475],[-12.017,-2.931],[-8.163,-6.716],[-5.348,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[27.049,50.953],"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 303","np":2,"cix":2,"bm":0,"ix":303,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.039,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[30.383,39.392],"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 304","np":2,"cix":2,"bm":0,"ix":304,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.772,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[25.366,41.632],"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 305","np":2,"cix":2,"bm":0,"ix":305,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.596,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.435,-1.152],[0,0],[-0.772,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.184,-3.788],[7.884,-6.663],[-7.425,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[35.292,39.606],"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 306","np":2,"cix":2,"bm":0,"ix":306,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.093,-5.361],[1.121,8.386],[5.432,10.014],[-3.619,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[27.99,40.119],"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 307","np":2,"cix":2,"bm":0,"ix":307,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.153,-0.436],[0,0],[0,0]],"o":[[-0.435,1.153],[0,0],[0,0],[0,0]],"v":[[-3.016,0.17],[-1.716,3.046],[3.451,4.997],[-1.066,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[22.687,42.387],"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 308","np":2,"cix":2,"bm":0,"ix":308,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.307],[-0.728,-2.12],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.806]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.58],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,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":[19.672,54.587],"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 309","np":2,"cix":2,"bm":0,"ix":309,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.242],[0,0],[0.721,0.751],[0,0],[-1.845,0.635],[0,0],[-0.72,-0.751],[0,0]],"o":[[0,0],[-0.984,0.338],[0,0],[-1.351,-1.408],[0,0],[0.985,-0.339],[0,0],[0.516,0.538]],"v":[[11.107,6.769],[3.556,9.365],[0.761,8.688],[-10.676,-3.232],[-9.618,-7.608],[-4.509,-9.364],[-1.713,-8.687],[11.512,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,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":[21.502,67.272],"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 310","np":2,"cix":2,"bm":0,"ix":310,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.37,0.09]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.722],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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.942,58.765],"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 311","np":2,"cix":2,"bm":0,"ix":311,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.71],[-1.255,5.254],[0.945,7.546],[1.255,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,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":[23.438,58.616],"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 312","np":2,"cix":2,"bm":0,"ix":312,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.748,-0.183],[0,0],[0,0],[-0.556,0.533],[0,0],[0.853,0.889],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.852],[0,0],[-0.571,-0.594]],"v":[[-6.891,-14.038],[-7.429,11.99],[-5.84,13.647],[-3.868,13.688],[6.511,1.537],[6.576,-1.617],[-4.753,-13.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[37.202,59.79],"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 313","np":2,"cix":2,"bm":0,"ix":313,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.432],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[26.174,58.501],"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 314","np":2,"cix":2,"bm":0,"ix":314,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.889],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.659],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,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":[19.957,58.388],"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 315","np":2,"cix":2,"bm":0,"ix":315,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Champagne beholder kant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[686.002,764.988,0],"ix":2},"a":{"a":0,"k":[130.546,28.374,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[66.825,0],[0,13.019],[-66.825,0],[0,-13.021]],"o":[[-66.825,0],[0,-13.021],[66.825,0],[0,13.019]],"v":[[0,22.387],[-120.998,-1.187],[0,-24.762],[120.998,-1.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[71.96,0],[0,-15.532],[-71.96,0],[0,15.533]],"o":[[-71.96,0],[0,15.533],[71.96,0],[0,-15.532]],"v":[[0,-28.124],[-130.296,0],[0,28.124],[130.296,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,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":[130.546,28.374],"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Champagne beholder","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[686.002,828.136,0],"ix":2},"a":{"a":0,"k":[130.546,88.16,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-28.19,1.706]],"o":[[0,0],[0,0]],"v":[[-20.384,-4.05],[20.384,2.344]],"c":false},"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":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[95.427,158.292],"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":40,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-42.026,-7.44]],"o":[[0,0],[0,0]],"v":[[-33.26,-23.375],[33.26,23.375]],"c":false},"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":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[73.602,91.644],"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":40,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[66.825,0],[0,-13.02],[-66.825,0],[0,13.02]],"o":[[-66.825,0],[0,13.02],[66.825,0],[0,-13.02]],"v":[[0,-23.575],[-120.998,0.001],[0,23.575],[120.998,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298000021542,0.340999977261,0.356999984442,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":[130.546,23.824],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-106.147,0]],"o":[[0,0],[0,0],[0,0],[106.146,0]],"v":[[130.296,-53.193],[0,-53.193],[-130.296,-53.193],[0,53.193]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654999976065,0.713999968884,0.757000014361,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":[130.546,78.206],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.668,16.708],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27.928,10.093],[-5.507,-17.562],[-27.928,-17.562],[-27.928,17.562]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,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":[158.474,137.399],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.668,16.708],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-27.928,10.093],[5.507,-17.562],[27.928,-17.562],[27.928,17.562]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,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":[102.617,137.399],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.832],[-36.286,0],[0,7.833],[36.285,0]],"o":[[0,7.833],[36.285,0],[0,-7.832],[-36.286,0]],"v":[[-65.701,-0.001],[0,14.182],[65.701,-0.001],[0,-14.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,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":[130.545,154.961],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[24.495,0],[11.298,-4.29],[0,0],[0,0],[-36.286,0],[0,7.832],[0,0]],"o":[[-11.298,-4.29],[-24.496,0],[0,0],[0,0],[0,7.832],[36.286,0],[0,0],[0,0]],"v":[[57.142,-6.996],[-0.001,-14.182],[-57.149,-6.996],[-65.702,-6.996],[-65.702,0],[-0.001,14.182],[65.702,0],[65.702,-6.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298000021542,0.340999977261,0.356999984442,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":[130.546,161.889],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Eiendomsmegleren 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[567,493.5,0],"ix":2},"a":{"a":0,"k":[571,675,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1142,"h":1350,"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/success_light.json b/app/src/main/assets/success_light.json new file mode 100644 index 0000000..4192a28 --- /dev/null +++ b/app/src/main/assets/success_light.json @@ -0,0 +1 @@ +{"v":"4.10.1","fr":25,"ip":0,"op":55,"w":796,"h":714,"nm":"Anim8*","ddd":0,"assets":[{"id":"comp_745","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cruz3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[1],"e":[100]},{"t":28}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":18,"s":[-33],"e":[13]},{"t":50}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":18,"s":[614.125,467.5,0],"e":[841.125,680.5,0],"to":[37.8333320617676,35.5,0],"ti":[-37.8333320617676,-35.5,0]},{"t":28}],"ix":2},"a":{"a":0,"k":[-882.375,-1726,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"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":[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":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-882.239,-1725.811],"ix":2},"a":{"a":0,"k":[-882.239,-1725.811],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"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,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":1020.5,"st":18,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"cruz2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[1],"e":[100]},{"t":26}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":16,"s":[-30],"e":[16]},{"t":50}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":16,"s":[606.125,465.5,0],"e":[322.125,572.5,0],"to":[-47.3333320617676,17.8333339691162,0],"ti":[47.3333320617676,-17.8333339691162,0]},{"t":26}],"ix":2},"a":{"a":0,"k":[-882.375,-1726,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"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":[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":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-882.239,-1725.811],"ix":2},"a":{"a":0,"k":[-882.239,-1725.811],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"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,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":1018.5,"st":16,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"cruz1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[1],"e":[100]},{"t":25}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[-28],"e":[18]},{"t":50}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.103,"y":1},"o":{"x":0.333,"y":0},"n":"0p103_1_0p333_0","t":15,"s":[614.125,462.5,0],"e":[852.125,164.5,0],"to":[39.6666679382324,-49.6666679382324,0],"ti":[-39.6666679382324,49.6666679382324,0]},{"t":25}],"ix":2},"a":{"a":0,"k":[-882.375,-1726,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"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":[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":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-882.239,-1725.811],"ix":2},"a":{"a":0,"k":[-882.239,-1725.811],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"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,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":1017.5,"st":15,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Bolas2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[617.5,490.5,0],"ix":2},"a":{"a":0,"k":[-1112,-1428,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.101,0.101,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p101_1_0p333_0","0p101_1_0p333_0","0p667_1_0p333_0"],"t":13,"s":[0,0,100],"e":[100,100,100]},{"t":25}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"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.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-952.029,-1150.197],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[64.361,64.361],"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 3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"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.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-1435.793,-1556.371],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[64.361,64.361],"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 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":1015.5,"st":13,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Bolas1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.921]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p921_0p333_0"],"t":11,"s":[-11],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.327]},"n":["0p15_1_0p167_0p327"],"t":23,"s":[0],"e":[6]},{"t":50}],"ix":10},"p":{"a":0,"k":[621.5,478.5,0],"ix":2},"a":{"a":0,"k":[-1108,-1440,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.101,0.101,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p101_1_0p333_0","0p101_1_0p333_0","0p667_1_0p333_0"],"t":11,"s":[0,0,100],"e":[100,100,100]},{"t":23}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"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.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-1151.238,-1723.625],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[140.88,140.88],"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 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"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.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-1282.949,-1147.881],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[140.88,140.88],"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,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"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.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-819.535,-1371.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[85.671,85.671],"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 3","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":1013.5,"st":11,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"stroke3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1950.5,2175.5,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1117.454,-1623.493]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"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,"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":[100.04,99.99],"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,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":9,"s":[0],"e":[100]},{"t":17}],"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":9,"op":1011.5,"st":9,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"stroke4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2288.5,1790.5,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1372.351,-1474.477]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"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,"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":[100.04,99.99],"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,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":6.5,"s":[0],"e":[100]},{"t":14.5}],"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":6.5,"op":1009,"st":6.5,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"stroke2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1818.5,2059.5,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1027.49,-1672.499]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"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,"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":[100.04,99.99],"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,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":4,"s":[0],"e":[100]},{"t":12}],"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":4,"op":1006.5,"st":4,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"stroke1","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1729.5,1918.5,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1027.49,-1672.499]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"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,"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":[100.04,99.99],"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,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":0,"s":[0],"e":[100]},{"t":8}],"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":1002.5,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[396.5,357,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":[{"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":[[-72,6],[-28,49],[75,-54]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.09019607843137255,0.6470588235294118,0.4588235294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":1,"lj":1,"ml":4,"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":[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":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":18,"s":[0],"e":[100]},{"t":32}],"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":18,"op":73,"st":18,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[398,357.031,0],"ix":2},"a":{"a":0,"k":[9.719,2.719,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"t":13,"s":[30,30,100],"e":[91.577,91.577,100]},{"t":21}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.438,355.438],"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":0,"ix":5},"lc":1,"lj":1,"ml":4,"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,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.719,2.719],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":68,"st":13,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[398.111,357.031,0],"ix":2},"a":{"a":0,"k":[9.719,2.719,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"t":8,"s":[30,30,100],"e":[101.143,101.143,100]},{"t":16}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.438,355.438],"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":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.09019607843137255,0.6470588235294118,0.4588235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.719,2.719],"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":63,"st":8,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"BG","refId":"comp_745","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1513.5,1812.5,0],"ix":2},"a":{"a":0,"k":[1729.5,1918.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":3459,"h":3837,"ip":0,"op":1005,"st":0,"bm":0}]} \ No newline at end of file diff --git a/app/src/main/assets/uploading.json b/app/src/main/assets/uploading.json new file mode 100644 index 0000000..e6c099c --- /dev/null +++ b/app/src/main/assets/uploading.json @@ -0,0 +1 @@ +{"v":"5.5.5","fr":29.9700012207031,"ip":0,"op":38.0000015477717,"w":1024,"h":768,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[100]},{"t":37.0000015070409,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[323,357,0],"to":[-15.333,-11,0],"ti":[15.333,11,0]},{"t":35.0000014255792,"s":[231,291,0]}],"ix":2},"a":{"a":0,"k":[-233,-159,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":[38,38],"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,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":[-233,-159],"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":23.0000009368092,"op":38.0000015477717,"st":10.0000004073083,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[100]},{"t":36.0000014663101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[685,325,0],"to":[17,-13.333,0],"ti":[-17,13.333,0]},{"t":34.0000013848484,"s":[787,245,0]}],"ix":2},"a":{"a":0,"k":[-233,-159,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":[38,38],"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,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":[-233,-159],"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":22.0000008960784,"op":37.0000015070409,"st":9.00000036657752,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[100]},{"t":29.0000011811942,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":15,"s":[489,213,0],"to":[-0.333,-23.667,0],"ti":[0.333,23.667,0]},{"t":27.0000010997325,"s":[487,71,0]}],"ix":2},"a":{"a":0,"k":[-233,-159,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":[38,38],"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,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":[-233,-159],"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":15.0000006109625,"op":30.0000012219251,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512,384,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[74,74,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1024,768],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,1,0.583529423732,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":[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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25.0000010182709,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 6","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":25,"s":[507.984,852.584,0],"to":[0,-33.333,0],"ti":[0,33.333,0]},{"t":30.0000012219251,"s":[507.984,652.584,0]}],"ix":2},"a":{"a":0,"k":[-8,336.584,0],"ix":1},"s":{"a":0,"k":[116,116,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.882,4.882],[0,0],[4.882,-4.882],[0,0],[-4.881,-4.881],[-4.882,4.882],[0,0],[0,0],[-6.903,0],[0,6.903],[0,0],[0,0],[-3.199,0],[-2.44,2.441]],"o":[[0,0],[-4.882,-4.882],[0,0],[-4.881,4.882],[4.882,4.882],[0,0],[0,0],[0,6.903],[6.903,0],[0,0],[0,0],[2.44,2.441],[3.199,0],[4.882,-4.881]],"v":[[55.286,254.745],[0.839,200.298],[-16.839,200.298],[-71.286,254.745],[-71.286,272.423],[-53.609,272.423],[-20.5,239.314],[-20.5,324.084],[-8,336.584],[4.5,324.084],[4.5,239.314],[37.608,272.423],[46.447,276.084],[55.286,272.423]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[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":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25.0000010182709,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.842,"y":0},"t":5,"s":[507.984,652.584,0],"to":[0,-40,0],"ti":[0,40,0]},{"t":15.0000006109625,"s":[507.984,412.584,0]}],"ix":2},"a":{"a":0,"k":[-8,336.584,0],"ix":1},"s":{"a":0,"k":[116,116,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.882,4.882],[0,0],[4.882,-4.882],[0,0],[-4.881,-4.881],[-4.882,4.882],[0,0],[0,0],[-6.903,0],[0,6.903],[0,0],[0,0],[-3.199,0],[-2.44,2.441]],"o":[[0,0],[-4.882,-4.882],[0,0],[-4.881,4.882],[4.882,4.882],[0,0],[0,0],[0,6.903],[6.903,0],[0,0],[0,0],[2.44,2.441],[3.199,0],[4.882,-4.881]],"v":[[55.286,254.745],[0.839,200.298],[-16.839,200.298],[-71.286,254.745],[-71.286,272.423],[-53.609,272.423],[-20.5,239.314],[-20.5,324.084],[-8,336.584],[4.5,324.084],[4.5,239.314],[37.608,272.423],[46.447,276.084],[55.286,272.423]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[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":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":25.0000010182709,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[-19.032,8,0],"to":[0,-5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[-19.032,-22,0],"to":[0,0,0],"ti":[0,-5,0]},{"t":30.0000012219251,"s":[-19.032,8,0]}],"ix":2},"a":{"a":0,"k":[-4.016,-1,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[89.666,89.666,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[120.666,120.666,100]},{"t":30.0000012219251,"s":[89.666,89.666,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[238,238],"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,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":[-3,-1],"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":10.0000004073083,"op":910.00003706506,"st":10.0000004073083,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 4","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[76.968,72,0],"to":[14.667,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[164.968,32,0],"to":[0,0,0],"ti":[14.667,-6.667,0]},{"t":33.0000013441176,"s":[76.968,72,0]}],"ix":2},"a":{"a":0,"k":[-4.016,-1,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":13,"s":[37.666,37.666,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[76.666,76.666,100]},{"t":33.0000013441176,"s":[37.666,37.666,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[238,238],"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,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":[-3,-1],"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":13.0000005295009,"op":913.000037187252,"st":13.0000005295009,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 2","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[-72.032,75,0],"to":[-15,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[-162.032,35,0],"to":[0,0,0],"ti":[-15,-6.667,0]},{"t":36.0000014663101,"s":[-72.032,75,0]}],"ix":2},"a":{"a":0,"k":[-4.016,-1,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16,"s":[37.666,37.666,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[73.666,73.666,100]},{"t":36.0000014663101,"s":[37.666,37.666,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[238,238],"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,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":[-3,-1],"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":16.0000006516934,"op":916.000037309445,"st":16.0000006516934,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[508.016,318,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":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-35.648,0],[0,0],[-5.385,31.695],[0.07,5.979],[51.78,1.447],[4.907,-0.62],[58.803,0],[16.362,-61.554],[0,-40.599],[-0.021,-0.752]],"o":[[0,0],[32.149,0],[0.966,-5.688],[-0.608,-51.796],[-5.108,-0.143],[-22.365,-50.519],[-66.704,0],[-38.961,5.871],[0,0.757],[0.978,35.634]],"v":[[-158.085,126.5],[157.68,126.5],[223.094,71.857],[224.461,54.335],[130.235,-41.461],[115.199,-40.73],[-16.532,-126.5],[-155.701,-19.588],[-224.532,60.5],[-224.501,62.762]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[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":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Shape Layer 1 Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[512,424,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[512,404,0],"to":[0,0,0],"ti":[0,0,0]},{"t":23.0000009368092,"s":[512,424,0]}],"ix":2},"a":{"a":0,"k":[512,384,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1024,"h":768,"ip":3.00000012219251,"op":903.000036779944,"st":3.00000012219251,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Shape Layer 1 Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[512,424,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[512,404,0],"to":[0,0,0],"ti":[0,0,0]},{"t":22.0000008960784,"s":[512,424,0]}],"ix":2},"a":{"a":0,"k":[512,384,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1024,"h":768,"ip":2.00000008146167,"op":902.000036739213,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Shape Layer 1 Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[512,424,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[512,404,0],"to":[0,0,0],"ti":[0,0,0]},{"t":21.0000008553475,"s":[512,424,0]}],"ix":2},"a":{"a":0,"k":[512,384,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1024,"h":768,"ip":1.00000004073083,"op":901.000036698482,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Shape Layer 1 Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[512,424,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[512,404,0],"to":[0,0,0],"ti":[0,0,0]},{"t":20.0000008146167,"s":[512,424,0]}],"ix":2},"a":{"a":0,"k":[512,384,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1024,"h":768,"ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/wallet_light.json b/app/src/main/assets/wallet_light.json new file mode 100644 index 0000000..97bf93c --- /dev/null +++ b/app/src/main/assets/wallet_light.json @@ -0,0 +1 @@ +{"v":"5.5.9","fr":24,"ip":0,"op":72,"w":600,"h":600,"nm":"財布","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"warret_middle 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[11]},{"t":53,"s":[40]}],"ix":10},"p":{"a":0,"k":[218.5,378,0],"ix":2},"a":{"a":0,"k":[-88,-8,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[100,100,100]},{"t":18,"s":[93,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"t":58,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.986764729023,0.982347846031,0.979403316975,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":[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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":83,"st":7,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"warret_middle 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[8]},{"t":52,"s":[13]}],"ix":10},"p":{"a":0,"k":[217,381,0],"ix":2},"a":{"a":0,"k":[-88,-8,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"t":16,"s":[93,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"t":56,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.986764729023,0.982347846031,0.979403316975,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":[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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":81,"st":5,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"warret_middle 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[3]},{"t":50,"s":[13]}],"ix":10},"p":{"a":0,"k":[212,380,0],"ix":2},"a":{"a":0,"k":[-88,-8,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":11,"s":[100,100,100]},{"t":15,"s":[93,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"t":55,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.986764729023,0.982347846031,0.979403316975,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":[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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":80,"st":4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"warret_middle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[-2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[-2]},{"t":48,"s":[13]}],"ix":10},"p":{"a":0,"k":[212,380,0],"ix":2},"a":{"a":0,"k":[-88,-8,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,100,100]},{"t":13,"s":[93,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[73.931,-107.724],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[1,-145.606]],"c":true}]},{"t":53,"s":[{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[78.341,-27.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.986764729023,0.982347846031,0.979403316975,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":[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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":78,"st":2,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"warret_留め金","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[431,445.5,0],"ix":2},"a":{"a":0,"k":[131,57.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.789,0.667,0.667],"y":[0.989,1,1]},"o":{"x":[1,0.333,0.333],"y":[0.015,0,0]},"t":54,"s":[11,100,100]},{"t":59,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.18],[7.18,0],[0,7.18],[-7.18,0]],"o":[[0,7.18],[-7.18,0],[0,-7.18],[7.18,0]],"v":[[115,58],[102,71],[89,58],[102,45]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.6,0],[0,0],[0,6.6],[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0]],"o":[[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0],[6.6,0],[0,0],[0,6.6]],"v":[[119,78],[72,78],[60,66],[60,49],[72,37],[119,37],[131,49],[131,66]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":54,"op":76,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"warret_留め金","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[1],"y":[3.54]},"t":3,"s":[431]},{"i":{"x":[0],"y":[1.001]},"o":{"x":[0.167],"y":[0.167]},"t":3.11,"s":[430.449]},{"t":9.1103515625,"s":[406]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[1],"y":[0]},"t":3,"s":[445.5]},{"i":{"x":[0.96],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3.11,"s":[445.5]},{"t":9.1103515625,"s":[445.5]}],"ix":4}},"a":{"a":0,"k":[131,57.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":11,"s":[-121,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34,"s":[-121,100,100]},{"t":48,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.18],[7.18,0],[0,7.18],[-7.18,0]],"o":[[0,7.18],[-7.18,0],[0,-7.18],[7.18,0]],"v":[[115,58],[102,71],[89,58],[102,45]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.6,0],[0,0],[0,6.6],[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0]],"o":[[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0],[6.6,0],[0,0],[0,6.6]],"v":[[119,78],[72,78],[60,66],[60,49],[72,37],[119,37],[131,49],[131,66]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":7,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"warret_face","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[215.941,380,0],"ix":2},"a":{"a":0,"k":[-84.059,-8,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.6,0],[0,0],[0,6.6],[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0]],"o":[[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0],[6.6,0],[0,0],[0,6.6]],"v":[[105,132],[-76,132],[-88,120],[-88,4],[-76,-8],[105,-8],[117,4],[117,120]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Card","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.847],"y":[0.975]},"o":{"x":[0.647],"y":[-0.016]},"t":11,"s":[0]},{"t":54,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[326.934]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31.565,"s":[326.934]},{"t":54,"s":[326.934]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.307],"y":[0.991]},"o":{"x":[0.381],"y":[-0.007]},"t":11,"s":[436.586]},{"i":{"x":[0.578],"y":[1.003]},"o":{"x":[0.653],"y":[-0.009]},"t":31.856,"s":[111.621]},{"t":54,"s":[436.586]}],"ix":4}},"a":{"a":0,"k":[54.662,45,0],"ix":1},"s":{"a":0,"k":[100,100,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],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.914,82.84],[-13.076,83.671],[-13.906,49.681],[20.084,48.851]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[39.335,75.597],[87.728,74.414]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[38.817,54.395],[124.199,52.308]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.539,27.624],[141.884,23.313]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.598,-0.161],[0,0],[0.161,6.598],[0,0],[-6.598,0.161],[0,0],[-0.161,-6.598],[0,0]],"o":[[0,0],[-6.598,0.161],[0,0],[-0.161,-6.598],[0,0],[6.598,-0.161],[0,0],[0.161,6.598]],"v":[[132.157,103.129],[-19.512,106.835],[-31.801,95.132],[-34.146,-0.839],[-22.443,-13.129],[129.226,-16.835],[141.515,-5.132],[143.861,90.839]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":10,"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":[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 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"billets","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":35,"ix":10},"p":{"a":0,"k":[219.374,384.956,0],"ix":2},"a":{"a":0,"k":[224,380,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,0],[222,390],[496,380],[600,0]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":600,"h":600,"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"warret_back","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.397],"y":[0.994]},"o":{"x":[0.526],"y":[0.003]},"t":7,"s":[13]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[-16]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.001]},"t":47,"s":[-16]},{"t":54,"s":[17]}],"ix":10},"p":{"a":0,"k":[212,380,0],"ix":2},"a":{"a":0,"k":[-88,-8,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[100,100,100]},{"t":11,"s":[85,100,100]}],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-102.327,-40.732],[-42.46,108.556],[108.575,105.772],[106.82,-67.917]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4,7],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[67,67],"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":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.381,-1.685],[0,0],[1.685,6.381],[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0]],"o":[[0,0],[-6.381,1.685],[0,0],[-1.685,-6.381],[0,0],[6.381,-1.685],[0,0],[1.685,6.381]],"v":[[99.64,67.217],[-44.879,105.375],[-59.545,96.836],[-83.662,5.498],[-75.123,-9.168],[69.396,-47.327],[84.062,-38.788],[108.179,52.551]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,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":[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":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":76,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"warret_留め金2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":11,"s":[-25]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[403,445.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[352,362.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[352,362.5,0],"to":[0,0,0],"ti":[-13.167,-13.833,0]},{"t":54,"s":[431,445.5,0]}],"ix":2},"a":{"a":0,"k":[131,57.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":11,"s":[-121,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":47,"s":[-121,100,100]},{"t":61,"s":[100,100,100]}],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.258823543787,0.129411771894,0.043137256056,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.18],[7.18,0],[0,7.18],[-7.18,0]],"o":[[0,7.18],[-7.18,0],[0,-7.18],[7.18,0]],"v":[[115,58],[102,71],[89,58],[102,45]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1568627450980392,0.1450980392156863,0.1450980392156863,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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.6,0],[0,0],[0,6.6],[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0]],"o":[[0,0],[-6.6,0],[0,0],[0,-6.6],[0,0],[6.6,0],[0,0],[0,6.6]],"v":[[119,78],[72,78],[60,66],[60,49],[72,37],[119,37],[131,49],[131,66]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":[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":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":54,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/water_loader.json b/app/src/main/assets/water_loader.json new file mode 100644 index 0000000..d1236a3 --- /dev/null +++ b/app/src/main/assets/water_loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":60,"ip":0,"op":75,"w":147,"h":194,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"np_glass_80834_000000","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.447,96.9,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":"rc","d":1,"s":{"a":0,"k":[146.895,193.8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path 945","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[73.447,96.9,0],"ix":1},"s":{"a":0,"k":[100,100,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],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[118.783,193.8],[28.114,193.8],[0,0],[146.895,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[32.983,188.184],[113.923,188.184],[140.413,5.616],[6.494,5.616]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180392156863,0.560784313725,0.980392156863,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":[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":"Path 945","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path 944","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[1.205,84.746,0],"to":[0,0,0],"ti":[0,0,0]},{"t":71,"s":[0.205,9.746,0]}],"ix":2},"a":{"a":0,"k":[58.815,75.549,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[70,0,100]},{"t":71,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[29.855,-32.137],[0,0]],"o":[[0,0],[0,0],[0,0],[-18.504,4.289],[-36.916,52.915],[0,0]],"v":[[0,5.115],[8.984,156.029],[105.125,156.029],[117.63,0],[59.454,21.334],[0.001,5.116]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[51.178,24.368],[0,0]],"o":[[0,0],[0,0],[0,0],[-18.504,4.289],[-44.209,-31.954],[0,0]],"v":[[0.154,5.115],[13.554,151.919],[101.291,151.919],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":41,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[40.633,10.772],[0,0]],"o":[[0,0],[0,0],[0,0],[-15.825,11.758],[-44.395,-12.173],[0,0]],"v":[[0.154,5.115],[18.578,151.097],[97.257,151.097],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[41.709,2.712],[0,0]],"o":[[0,0],[0,0],[0,0],[-18.842,9.643],[-43.738,-4.701],[0,0]],"v":[[0.154,5.115],[20.845,151.077],[96.238,151.097],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]},{"t":63,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[44.213,-16.049],[0,0]],"o":[[0,0],[0,0],[0,0],[-25.865,4.721],[-42.208,12.69],[0,0]],"v":[[0.154,5.115],[23.665,151.097],[93.866,151.097],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180392156863,0.560784313725,0.980392156863,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":[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":"Path 944","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..86db37c Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/consultantapp/ConsultantUserApplication.kt b/app/src/main/java/com/consultantapp/ConsultantUserApplication.kt new file mode 100644 index 0000000..cfc0ec0 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ConsultantUserApplication.kt @@ -0,0 +1,208 @@ +package com.consultantapp + +import android.app.Application +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.util.Log +import androidx.lifecycle.* +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.appsflyer.AppsFlyerLib +import com.appsflyer.attribution.AppsFlyerRequestListener +import com.consultantapp.data.models.requests.AppFeatures +import com.consultantapp.data.models.responses.appdetails.AppVersion +import com.consultantapp.data.network.PushType +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.di.DaggerAppComponent +import com.consultantapp.ui.calling.SoundPoolManager +import com.consultantapp.ui.dashboard.chat.chatdetail.ChatDetailActivity +import com.consultantapp.utils.* +import com.facebook.drawee.backends.pipeline.Fresco +import com.google.android.libraries.places.api.Places +import dagger.android.AndroidInjector +import dagger.android.DaggerApplication +import java.util.* +import javax.inject.Inject +import kotlin.concurrent.schedule + + +var appFeatures = AppFeatures() +var appClientDetails = AppVersion() + +class ConsultantUserApplication : DaggerApplication(), LifecycleObserver { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + private var isReceiverRegistered = false + + + override fun onCreate() { + super.onCreate() + + ProcessLifecycleOwner.get().lifecycle.addObserver(this) + + Fresco.initialize(this) + SoundPoolManager.getInstance(this) + appSocket.init() + + // Initialize Places. + try { + Places.initialize(applicationContext, getString(R.string.google_places_api_key)) + } catch (e: Exception) { + } + + setsApplication(this) + + appClientDetails = userRepository.getAppSetting() + + /*Check for features*/ + when (BuildConfig.FLAVOR) { + "consult", "edu", "marketplace", "healthcare" -> { + appFeatures.needWalkThrough = true + appFeatures.needLanguageScreen = true + appFeatures.needUserDoctorScreen = true + appFeatures.needLocation = true + appFeatures.needBlogs = true + appFeatures.needArticles = true + appFeatures.needHealthTools = false + appFeatures.homeConsultIcons = true + } + "heal" -> { + appFeatures.needWalkThrough = true + appFeatures.needLanguageScreen = true + appFeatures.needUserDoctorScreen = true + appFeatures.needLocation = true + appFeatures.homeConsultIcons = true + appFeatures.needArticles = true + appFeatures.needHealthTools = true + appFeatures.signUpAddition = true + appFeatures.needInsuranceDocument = true + appFeatures.needHomePatients = true + appFeatures.needTestimonials = true + } + "homeDoctor" -> { + appFeatures.needLanguageScreen = true + appFeatures.homeConsultIcons = true + appFeatures.needLocation = true + AppsFlyerLib.getInstance().init(getString(R.string.apps_flyer_dev_key), null, this) + AppsFlyerLib.getInstance().start(applicationContext,null,object : + AppsFlyerRequestListener { + override fun onSuccess() { + Log.d("AppsFlyer", "Launch sent successfully, got 200 response code from server"); + } + + override fun onError(i: Int, s: String) { + Log.d("AppsFlyer", "Launch failed to be sent:\n" + + "Error code: " + i + "\n" + + "Error description: " + s) + } + + }) + } + "airdoc" -> { + appFeatures.needLocation = false + } + "nurseLynx" -> { + appFeatures.needLocation = true + appFeatures.needInviteCode = true + } + "taradoc" -> { + appFeatures.needLanguageScreen = false + appFeatures.needLocation = true + } + "clouddoc" -> { + appFeatures.needLocation = true + appFeatures.needPackage = true + appFeatures.needBlogs = true + } + "meetMd" -> { + appFeatures.needLocation = true + appFeatures.needBlogs = true + appFeatures.needArticles = true + appFeatures.homeConsultIcons = true + } + else -> { + appFeatures.needBlogs = true + appFeatures.needArticles = true + } + } + } + + override fun applicationInjector(): AndroidInjector = + DaggerAppComponent.builder().create(this) + + companion object { + + private var isApplication: Application? = null + + fun setsApplication(sApplication: Application) { + isApplication = sApplication + } + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + fun appInResumeState() { + registerReceiver() + //Toast.makeText(this, "In Foreground", Toast.LENGTH_LONG).show(); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) + fun appInPauseState() { + //Toast.makeText(this, "In Background", Toast.LENGTH_LONG).show(); + unregisterReceiver() + } + + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.CHAT_STARTED) + LocalBroadcastManager.getInstance(this).registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.CHAT_STARTED -> { + if (ChatDetailActivity.otherUserID == "-1") { + if (!appSocket.isConnected) + appSocket.init() + + val intentActivity = + Intent(this@ConsultantUserApplication, ChatDetailActivity::class.java) + .putExtra(USER_ID, intent.getStringExtra(USER_ID)) + .putExtra(USER_NAME, intent.getStringExtra(USER_NAME)) + .putExtra(EXTRA_REQUEST_ID, intent.getStringExtra(EXTRA_REQUEST_ID)) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + Timer().schedule(2000) { + startActivity(intentActivity) + } + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/apis/WebService.kt b/app/src/main/java/com/consultantapp/data/apis/WebService.kt new file mode 100644 index 0000000..2ddfb19 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/apis/WebService.kt @@ -0,0 +1,462 @@ +package com.consultantapp.data.apis + +import com.consultantapp.data.models.requests.CreateRequest +import com.consultantapp.data.models.requests.UpdateSymptom +import com.consultantapp.data.models.responses.* +import com.consultantapp.data.models.responses.appdetails.AppVersion +import com.consultantapp.data.models.responses.directions.Direction +import com.consultantapp.data.network.responseUtil.ApiResponse +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.http.* + + +interface WebService { + companion object { + + private const val LOGIN = "/api/login" + private const val APP_VERSION = "/api/appversion" + private const val CLIENT_DETAILS = "/api/clientdetail" + private const val COUNTRY_DATA = "/api/countrydata" + private const val PREFERENCES = "/api/master/preferences" + private const val UPDATE_NUMBER = "/api/update-phone" + private const val VERIFY_OTP = "/api/verify-otp" + private const val RESEND_OTP = "api/resend-otp" + private const val REGISTER = "/api/register" + private const val FORGOT_PASSWORD = "/api/forgot_password" + private const val CHANGE_PASSWORD = "/api/password-change" + private const val PROFILE_UPDATE = "/api/profile-update" + private const val LOGOUT = "/api/app_logout" + private const val SEND_SMS = "/api/send-sms" + private const val SEND_EMAIL_OTP = "/api/send-email-otp" + private const val EMAIL_VERIFY = "/api/email-verify" + private const val UPDATE_FCM_ID = "/api/update-fcm-id" + private const val CREATE_REQUEST = "/api/create-request" + private const val CONFIRM_REQUEST = "/api/confirm-request" + private const val ADD_CARD = "api/add-card" + private const val UPDATE_CARD = "/api/update-card" + private const val DELETE_CARD = "/api/delete-card" + private const val ADD_MONEY = "/api/add-money" + private const val ADD_REVIEW = "/api/add-review" + private const val REQUEST_USER_APPROVE = "/api/request-user-approve" + private const val COMPLETE_CHAT = "/api/complete-chat" + private const val UPLOAD_IMAGE = "/api/upload-image" + private const val FEEDS = "/api/feeds" + private const val FEEDS_COMMENTS = "/api/feeds/comments/{feed_id}" + private const val VIEW_FEEDS = "/api/feeds/view/{feed_id}" + private const val ADD_FAVORITE = "/api/feeds/add-favorite/{feed_id}" + private const val ADD_LIKE = "/api/feeds/add-like/{feed_id}" + private const val ADD_COMMENT = "/api/feeds/add-comment/{feed_id}" + + private const val REQUESTS = "/api/requests-cs" + private const val REQUEST_DETAIL = "/api/request-detail" + private const val HOME = "/api/home" + private const val CANCEL_REQUEST = "/api/cancel-request" + private const val DOCTOR_LIST = "/api/doctor-list" + private const val BANNERS = "/api/banners" + private const val COUPONS = "/api/coupons" + private const val DOCTOR_DETAIL = "/api/doctor-detail" + private const val REVIEW_LIST = "/api/review-list" + private const val WALLET_HISTORY = "/api/wallet-history" + private const val CARD_LISTING = "/api/cards" + private const val WALLET = "/api/wallet" + private const val REQUEST_CHECK = "/api/request-check" + private const val CHAT_LISTING = "/api/chat-listing" + private const val CHAT_MESSAGES = "/api/chat-messages" + private const val NOTIFICATIONS = "/api/notifications" + private const val CATEGORIES = "/api/categories" + private const val CLASSES = "/api/classes" + private const val CLASS_DETAIL = "/api/class/detail" + private const val ENROLL_USER = "/api/enroll-user" + private const val CLASS_JOIN = "/api/class/join" + private const val ORDER_CREATE = "/api/order/create" + private const val HYPER_PAY_COMPLETE_DONE = "api/webhook/hyperpay" + private const val RAZOR_PAY_WEBHOOK = "/api/razor-pay-webhook" + private const val SERVICES = "/api/services" + private const val GET_FILTERS = "/api/get-filters" + private const val GET_SLOTS = "/api/get-slots" + private const val CALL_STATUS = "/api/call-status" + private const val PAGES = "/api/pages" + private const val PACK_SUB = "/api/pack-sub" + private const val PURCHASE_PACK = "/api/sub-pack" + private const val PACK_DETAIL = "/api/pack-detail" + private const val SUBSCRIPTIONS = "/api/subscriptions" + private const val SUBSCRIPTION_DETAIL = "/api/subscription-detail" + private const val SUBSCRIPTION_PACK = "/api/subscription-pack" + private const val ASK_QUESTIONS = "/api/ask-questions" + private const val ASK_QUESTIONS_DETAIL = "/api/ask-question-detail" + private const val WATER_LIMIT = "/api/water-limit" + private const val PROTEIN_LIMIT = "/api/protein-limit" + private const val DRINK_WATER = "/api/drink-water" + private const val DRINK_PROTEIN = "/api/drink-protein" + private const val ADD_FAMILY = "/api/add-family" + private const val SYMPTOM = "/api/symptoms" + private const val UPDATE_SYMPTOM = "/api/update-request-symptoms" + private const val EXTRA_PAYMENT = "/api/pay-extra-payment" + private const val CARE_PLANS = "/api/care-plans" + private const val TIERS = "/api/tiers" + private const val ADD_BANK = "/api/add-bank" + private const val BANK_ACCOUNTS = "/api/bank-accounts" + private const val GET_MEDICAL_HISTORY = "/api/get-medical-history" + + private const val DIRECTIONS = "https://maps.googleapis.com/maps/api/directions/json" + + private const val WORKING_HOURS = "/api/workingHours" + private const val SPEAKOUT_LIST = "/common/listSpeakouts" + + /*V2 Api*/ + private const val CREATE_REQUEST_V2 = "/api/v2/create-request" + private const val CONFIRM_REQUEST_V2 = "/api/v2/confirm-request" + private const val DOCTOR_LIST_V2 = "/api/v2/doctor-list" + private const val CANCEL_REQUEST_V2 = "/api/v2/cancel-request" + + private const val CONTACT_LIST = "/api/contact-list" + private const val CONTACT_ADD = "/api/contact-add" + private const val CONTACT_DELETE = "/api/contact-delete" + private const val CONTACT_MESSAGE = "/api/contact-message" + + } + + /*POST APIS*/ + @FormUrlEncoded + @POST(LOGIN) + fun login(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(APP_VERSION) + fun appVersion(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(UPDATE_NUMBER) + fun updateNumber(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(VERIFY_OTP) + fun verifyOtp(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(RESEND_OTP) + fun resendOtp(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(REGISTER) + fun register(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(FORGOT_PASSWORD) + fun forgotPassword(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CHANGE_PASSWORD) + fun changePassword(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(PROFILE_UPDATE) + fun updateProfile(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(COMPLETE_CHAT) + fun completeChat(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(SEND_SMS) + fun sendSMS(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(SEND_EMAIL_OTP) + fun sendEmailOtp(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(EMAIL_VERIFY) + fun emailVerify(@FieldMap hashMap: HashMap): Call> + + @POST(LOGOUT) + fun logout(): Call> + + @FormUrlEncoded + @POST(UPDATE_FCM_ID) + fun updateFcmId(@FieldMap hashMap: HashMap): Call> + + @POST(CREATE_REQUEST) + fun createRequest(@Body createRequest: CreateRequest): Call> + + @POST(CREATE_REQUEST_V2) + fun createRequestV2(@Body createRequest: CreateRequest): Call> + + @POST(CONFIRM_REQUEST) + fun confirmRequest(@Body createRequest: CreateRequest): Call> + + @POST(CONFIRM_REQUEST_V2) + fun confirmRequestV2(@Body createRequest: CreateRequest): Call> + + @FormUrlEncoded + @POST(ADD_CARD) + fun addCard(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(UPDATE_CARD) + fun updateCard(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(DELETE_CARD) + fun deleteCard(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_MONEY) + fun addMoney(@FieldMap hashMap: HashMap): Call> + + @Multipart + @POST(UPLOAD_IMAGE) + fun uploadFile(@PartMap map: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_REVIEW) + fun addReview(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(REQUEST_USER_APPROVE) + fun approveWorkingHour(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ENROLL_USER) + fun enrollUser(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CLASS_JOIN) + fun joinClass(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ORDER_CREATE) + fun orderCreate(@FieldMap hashMap: HashMap): Call> + + + @FormUrlEncoded + @POST(HYPER_PAY_COMPLETE_DONE) + fun hyperPayCompleteTrans(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CANCEL_REQUEST_V2) + fun cancelRequest(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CALL_STATUS) + fun callStatus(@FieldMap hashMap: HashMap): Call> + + @GET(PACK_DETAIL) + fun packDetail(@QueryMap hashMap: Map): Call> + + @GET(SUBSCRIPTION_DETAIL) + fun subscriptionDetail(@QueryMap hashMap: Map): Call> + + @FormUrlEncoded + @POST(PURCHASE_PACK) + fun purchasePack(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(SUBSCRIPTION_PACK) + fun subscriptionPack(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_FAVORITE) + fun addFavorite(@Path("feed_id") feed_id: String, + @FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_LIKE) + fun addLike(@Path("feed_id") feed_id: String, + @FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_COMMENT) + fun addComment(@Path("feed_id") feed_id: String, + @FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(RAZOR_PAY_WEBHOOK) + fun razorPayWebhook(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ASK_QUESTIONS) + fun askQuestion(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(WATER_LIMIT) + fun setDailyLimit(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(PROTEIN_LIMIT) + fun setProteinDailyLimit(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(DRINK_WATER) + fun setWaterIntake(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(DRINK_PROTEIN) + fun setProteinIntake(@FieldMap hashMap: HashMap): Call> + + + @FormUrlEncoded + @POST(ADD_FAMILY) + fun addFamily(@FieldMap hashMap: HashMap): Call> + + @POST(UPDATE_SYMPTOM) + fun updateSymptom(@Body updateSymptom: UpdateSymptom): Call> + + @POST(CARE_PLANS) + fun carePlans(@Body updateSymptom: UpdateSymptom): Call> + + @FormUrlEncoded + @POST(ADD_BANK) + fun addBank(@FieldMap hashMap: HashMap): Call> + + + /*GET*/ + + @GET(CLIENT_DETAILS) + fun clientDetails(@QueryMap hashMap: Map): Call> + + @GET(COUNTRY_DATA) + fun countryData(@QueryMap hashMap: Map): Call> + + @GET(PREFERENCES) + fun preferences(@QueryMap hashMap: Map): Call> + + @GET(HOME) + fun home(): Call> + + @GET(REQUESTS) + fun request(@QueryMap hashMap: Map): Call> + + @GET(REQUEST_DETAIL) + fun requestDetail(@QueryMap hashMap: Map): Call> + + @GET(DOCTOR_LIST) + fun doctorList(@QueryMap hashMap: Map): Call> + + @GET(DOCTOR_LIST_V2) + fun doctorListV2(@QueryMap hashMap: Map): Call> + + @GET(BANNERS) + fun banners(): Call> + + @GET(DOCTOR_DETAIL) + fun doctorDetails(@QueryMap hashMap: Map): Call> + + @GET(REVIEW_LIST) + fun reviewList(@QueryMap hashMap: Map): Call> + + @GET(WALLET_HISTORY) + fun walletHistory(@QueryMap hashMap: Map): Call> + + @GET(CARD_LISTING) + fun cardListing(@QueryMap hashMap: Map): Call> + + @GET(WALLET) + fun wallet(@QueryMap hashMap: Map): Call> + + @GET(CHAT_LISTING) + fun getChatListing(@QueryMap hashMap: Map): Call> + + @GET(CHAT_MESSAGES) + fun getChatMessage(@QueryMap hashMap: Map): Call> + + @GET(NOTIFICATIONS) + fun notifications(@QueryMap hashMap: Map): Call> + + @GET(FEEDS) + fun getFeeds(@QueryMap hashMap: Map): Call> + + @GET(FEEDS_COMMENTS) + fun getFeedsComment(@Path("feed_id") feed_id: String, + @QueryMap hashMap: Map): Call> + + @GET(VIEW_FEEDS) + fun viewFeeds(@Path("feed_id") feed_id: String): Call> + + + @GET(CATEGORIES) + fun categories(@QueryMap hashMap: Map): Call> + + @GET(CLASSES) + fun classesList(@QueryMap hashMap: Map): Call> + + @GET(CLASS_DETAIL) + fun classDetail(@QueryMap hashMap: Map): Call> + + @GET(GET_FILTERS) + fun getFilters(@QueryMap hashMap: Map): Call> + + + @GET(SERVICES) + fun services(@QueryMap hashMap: Map): Call> + + @GET(GET_SLOTS) + fun getSlots(@QueryMap hashMap: Map): Call> + + @GET(PAGES) + fun getPages(): Call> + + @GET(COUPONS) + fun coupons(@QueryMap hashMap: Map): Call> + + @GET(PACK_SUB) + fun packSub(@QueryMap hashMap: Map): Call> + + @GET(SUBSCRIPTIONS) + fun subscriptions(@QueryMap hashMap: Map): Call> + + @GET(DIRECTIONS) + fun directions(@QueryMap hashMap: Map): Call + + @GET(ASK_QUESTIONS) + fun getQuestions(@QueryMap hashMap: Map): Call> + + @GET(ASK_QUESTIONS_DETAIL) + fun getQuestionsDetails(@QueryMap hashMap: Map): Call> + + @GET(WATER_LIMIT) + fun getWaterLimit(@QueryMap hashMap: Map): Call> + + @GET(PROTEIN_LIMIT) + fun getProteinIntake(@QueryMap hashMap: Map): Call> + + @GET(REQUEST_CHECK) + fun requestCheck(@QueryMap hashMap: Map): Call> + + @GET(SYMPTOM) + fun symptom(@QueryMap hashMap: Map): Call> + + @GET(TIERS) + fun carePlanTier(): Call> + + @POST(EXTRA_PAYMENT) + fun payExtra(@Body extraPayment: Extra_payment): Call> + + @GET(BANK_ACCOUNTS) + fun bankAccounts(@QueryMap hashMap: Map): Call> + + @GET(GET_MEDICAL_HISTORY) + fun getMedicalHistory(@QueryMap hashMap: Map): Call> + + + /*PUT API*/ + @FormUrlEncoded + @PUT(WORKING_HOURS) + fun workingHours(@FieldMap hashMap: HashMap): Call> + + + @GET(CONTACT_LIST) + fun contactList(@QueryMap hashMap: Map): Call> + + @POST(CONTACT_ADD) + fun addContact(@Body contactList: ContactEmergency): Call> + + @FormUrlEncoded + @POST(CONTACT_DELETE) + fun deletContact(@FieldMap hashMap: HashMap): Call> + + @POST(CONTACT_MESSAGE) + fun sendMessage(): Call> + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/PushData.kt b/app/src/main/java/com/consultantapp/data/models/PushData.kt new file mode 100644 index 0000000..d6c5756 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/PushData.kt @@ -0,0 +1,27 @@ +package com.consultantapp.data.models + +import java.io.Serializable + +data class PushData( + val msg: String, + var title: String, + val sound: String, + val pushType: String, + val imageUrl: String, + val message: String, + val senderId: String, + val senderName: String, + val receiverId: String, + val messageType: String, + val request_id: String, + val call_id: String, + val service_type:String, + val cut_from: String?= null, + val main_service_type:String, + val sentAt: Long, + val request_time: String, + val sender_name: String, + val sender_image: String, + val vendor_category_name: String, + val transaction_id: String +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/AppFeatures.kt b/app/src/main/java/com/consultantapp/data/models/requests/AppFeatures.kt new file mode 100644 index 0000000..3e321aa --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/AppFeatures.kt @@ -0,0 +1,29 @@ +package com.consultantapp.data.models.requests + +class AppFeatures { + var needUserDoctorScreen = false + + var needWalkThrough = false + var needLanguageScreen = false + var needPackage = false + + var needClasses = false + + var needLocation = false + + var subCategoryImageCenter = false + + var homeConsultIcons = false + + var needBlogs = false + var needArticles = false + + var needHealthTools = false + + var signUpAddition = false + var needInsuranceDocument = false + + var needHomePatients = false + var needTestimonials = false + var needInviteCode = false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/CarePlan.kt b/app/src/main/java/com/consultantapp/data/models/requests/CarePlan.kt new file mode 100644 index 0000000..2eb9ef7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/CarePlan.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.models.requests + +data class CarePlan ( + var id: Int? = null, + var type: Int? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/ConsultTypeModel.kt b/app/src/main/java/com/consultantapp/data/models/requests/ConsultTypeModel.kt new file mode 100644 index 0000000..2c75c70 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/ConsultTypeModel.kt @@ -0,0 +1,7 @@ +package com.consultantapp.data.models.requests + +data class ConsultTypeModel ( + var name: String? = null, + var image: Int? = null, + var type: String? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/CreateRequest.kt b/app/src/main/java/com/consultantapp/data/models/requests/CreateRequest.kt new file mode 100644 index 0000000..5925441 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/CreateRequest.kt @@ -0,0 +1,23 @@ +package com.consultantapp.data.models.requests + +import java.io.Serializable + +class CreateRequest : Serializable { + var consultant_id: String? = null + var schedule_type: String? = null + var service_id: String? = null + var request_id: String? = null + var category_id: String? = null + var date: String? = null + var time: String? = null + var end_date: String? = null + var end_time: String? = null + var coupon_code: String? = null + + var service_address: String? = null + var lat: Double? = null + var long: Double? = null + + var tier_id: Int? = null + var tier_options:ArrayList?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/DatesAvailability.kt b/app/src/main/java/com/consultantapp/data/models/requests/DatesAvailability.kt new file mode 100644 index 0000000..0a3aa0c --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/DatesAvailability.kt @@ -0,0 +1,10 @@ +package com.consultantapp.data.models.requests + +class DatesAvailability { + var displayName: String? = null + var date: Long? = null + var isSelected = false + + /*Water intake*/ + var intakeAmount: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/DocImage.kt b/app/src/main/java/com/consultantapp/data/models/requests/DocImage.kt new file mode 100644 index 0000000..18fb42f --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/DocImage.kt @@ -0,0 +1,13 @@ +package com.consultantapp.data.models.requests + +import java.io.File +import java.io.Serializable + +class DocImage : Serializable { + var imageFile: File? = null + var type: String? = null + + var image: String? = null + var insuranceNumber: String? = null + var expiry: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/SaveAddress.kt b/app/src/main/java/com/consultantapp/data/models/requests/SaveAddress.kt new file mode 100644 index 0000000..8c6f67f --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/SaveAddress.kt @@ -0,0 +1,14 @@ +package com.consultantapp.data.models.requests + +import java.io.Serializable + +data class SaveAddress ( + var locationName: String? = null, + var houseNumber: String? = null, + var isDefault :Boolean = false, + var _id: String? = null, + var addressId: String? = null, + + var lat: Double? = null, + var long: Double? = null +): Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/SetFilter.kt b/app/src/main/java/com/consultantapp/data/models/requests/SetFilter.kt new file mode 100644 index 0000000..61b2e55 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/SetFilter.kt @@ -0,0 +1,11 @@ +package com.consultantapp.data.models.requests + +import java.io.Serializable + +class SetFilter :Serializable{ + var filter_id: Int? = null + var filter_option_ids: ArrayList? = null + + var preference_id: Int? = null + var option_ids: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/requests/UpdateSymptom.kt b/app/src/main/java/com/consultantapp/data/models/requests/UpdateSymptom.kt new file mode 100644 index 0000000..657a30d --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/requests/UpdateSymptom.kt @@ -0,0 +1,18 @@ +package com.consultantapp.data.models.requests + +import com.consultantapp.data.models.responses.Page +import java.io.Serializable + + +class UpdateSymptom : Serializable { + var request_id: String? = null + var image: ArrayList? = null + var images: ArrayList? = null + var option_ids: String? = null + var symptom_details: String? = null + + var care_plans: ArrayList? = null + var question_answers:ArrayList?=null + + var type: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/AddPrescription.kt b/app/src/main/java/com/consultantapp/data/models/responses/AddPrescription.kt new file mode 100644 index 0000000..50f5dfc --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/AddPrescription.kt @@ -0,0 +1,14 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class AddPrescription : Serializable { + var request_id: String? = null + var type: String? = null + + /*Manual*/ + var title: String? = null + var image: ArrayList? = null + + var images: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Bank.kt b/app/src/main/java/com/consultantapp/data/models/responses/Bank.kt new file mode 100644 index 0000000..f374ce6 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Bank.kt @@ -0,0 +1,16 @@ +package com.consultantapp.data.models.responses + +class Bank { + + var id: String? = null + var bank_name: String? = null + var last_four_digit: String? = null + var created_at: String? = null + + var name: String? = null + var ifc_code: String? = null + var account_holder_type: String? = null + var country: String? = null + var currency: String? = null + var account_number: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Banner.kt b/app/src/main/java/com/consultantapp/data/models/responses/Banner.kt new file mode 100644 index 0000000..fd2f221 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Banner.kt @@ -0,0 +1,27 @@ +package com.consultantapp.data.models.responses + +class Banner { + var id: Int? = null + var image_web: Any? = null + var image_mobile: String? = null + var position: String? = null + var banner_type: String? = null + var start_date: String? = null + var end_date: String? = null + var category_id: String? = null + var category: Categories? = null + var sp_id: String? = null + var class_id: String? = null + var created_at: String? = null + var updated_at: String? = null + + /*Coupon*/ + var service_id: String? = null + var service :Service?=null + var minimum_value: String? = null + var limit: Int? = null + var coupon_code: String? = null + var maximum_discount_amount: String? = null + var discount_type: String? = null + var discount_value: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Categories.kt b/app/src/main/java/com/consultantapp/data/models/responses/Categories.kt new file mode 100644 index 0000000..ebef29a --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Categories.kt @@ -0,0 +1,20 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +data class Categories( + var id: String? = null, + var name: String? = null, + var image: String? = null, + var parent_id: String? = null, + var created_at: String? = null, + var color_code: String? = null, + var description: String? = null, + var image_icon: String? = null, + var multi_select: String? = null, + //var subcategory: List? = null + var is_subcategory: Boolean? = null, + var is_filters: Boolean? = null, +) : Serializable { + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/ClassData.kt b/app/src/main/java/com/consultantapp/data/models/responses/ClassData.kt new file mode 100644 index 0000000..440d0ed --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/ClassData.kt @@ -0,0 +1,20 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class ClassData :Serializable{ + var id: String? = null + var name: String? = null + var status: String? = null + var class_date: String? = null + var created_at: String? = null + var bookingDateUTC: String? = null + var price: String? = null + var category_id: Int? = null + var created_by: UserData? = null + var booking_date: String? = null + var time: String? = null + var category_data: Categories? = null + var enroll_users: List? = null + var isOccupied = false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/CommonDataModel.kt b/app/src/main/java/com/consultantapp/data/models/responses/CommonDataModel.kt new file mode 100644 index 0000000..277ee07 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/CommonDataModel.kt @@ -0,0 +1,123 @@ +package com.consultantapp.data.models.responses + +import com.consultantapp.data.models.responses.chat.ChatList +import com.consultantapp.data.models.responses.chat.ChatMessage +import com.google.gson.annotations.SerializedName + + +class CommonDataModel { + var message: String? = null + var minimum_balance: String? = null + var requests: List? = null + var doctors: List? = null + var review_list: List? = null + var dcotor_detail: UserData? = null + var messages: List? = null + var lists: List? = null + var balance: String? = null + var payments: List? = null + var notifications: List? = null + var cards: List? = null + var classes_category: List? = null + var classes: List? = null + var filters: List? = null + var services: List? = null + var interval: List? = null + var banners: List? = null + var coupons: List? = null + + /*Upload Image*/ + var image_name: String? = null + + var request_status: String? = null + var currentTimer: Long? = null + + var isOnline: Boolean? = null + var CALLING_TYPE: String? = null + var order_id: String? = null + + /*Create Request*/ + var amountNotSufficient: Boolean? = null + + /*Twili*/ + var twilioToken: String? = null + + /*Confirm Booking*/ + var total: String? = null + var total_hours: String? = null + var discount: String? = null + var grand_total: String? = null + var book_slot_time: String? = null + var book_slot_date: String? = null + var service_tax: String? = null + var tier_charges: String? = null + var tax_percantage: String? = null + + /*Add money stripe authentication*/ + var requires_source_action: Boolean? = null + var url: String? = null + var transaction_id: String? = null + var transactionCompleted: Boolean? = null + + + /*Pages*/ + var pages: List? = null + + + /*Country*/ + var type: String? = null + var country: List? = null + var city: List? = null + var state: List? = null + + /*Package*/ + var packages: List? = null + var plans: List? = null + var active_plan: Boolean? = null + var detail: Packages? = null + + /*Home*/ + var top_blogs: List? = null + var top_articles: List? = null + var testimonials: List? = null + + /*Feeds*/ + var feeds: List? = null + var feed: Feed? = null + var comment: Feed? = null + var comments: List? = null + var tips: List? = null + + /*SignUp*/ + var preferences: List? = null + + /*Request*/ + var request: Request? = null + var request_detail: Request? = null + + /*Home*/ + var questions: List? = null + var question: Feed? = null + var can_ask_question: Boolean? = null + + /*Family*/ + var family: UserData? = null + + var symptoms: List? = null + var tiers: List? = null + + var bank_accounts: List? = null + + var count_data: CommonDataModel? = null + + var contacts: List? = null + + var contact_added: Boolean? = null + var notification_count: Int? = null + +} + +data class CallStatusResponse( + var message: String? = null, + var is_call_socket_enabled:String?=null, +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/ContactEmergency.kt b/app/src/main/java/com/consultantapp/data/models/responses/ContactEmergency.kt new file mode 100644 index 0000000..cb5ce95 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/ContactEmergency.kt @@ -0,0 +1,17 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +data class ContactEmergency( + var id: String? = null, + var contacts: ArrayList? = null, + + /*Contacts*/ + var name: String? = null, + var phone_numbers: ArrayList? = null, + + /*Phone number*/ + var phone: String? = null, + var type_label: String? = null + +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/CountryCity.kt b/app/src/main/java/com/consultantapp/data/models/responses/CountryCity.kt new file mode 100644 index 0000000..552edcc --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/CountryCity.kt @@ -0,0 +1,8 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class CountryCity : Serializable { + var id: String? = null + var name: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Extra_detail.kt b/app/src/main/java/com/consultantapp/data/models/responses/Extra_detail.kt new file mode 100644 index 0000000..a45de79 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Extra_detail.kt @@ -0,0 +1,24 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Extra_detail :Serializable{ + var id: Int? = null + var request_id: Int? = null + var first_name: String? = null + var last_name: String? = null + var service_for: String? = null + var home_care_req: String? = null + var service_address: String? = null + var lat: String? = null + var long: String? = null + var reason_for_service: String? = null + var created_at: String? = null + var updated_at: String? = null + var start_time: String? = null + var end_time: String? = null + var working_dates: String? = null + var filter_id: String? = null + var filter_name: String? = null + var distance: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Extra_payment.kt b/app/src/main/java/com/consultantapp/data/models/responses/Extra_payment.kt new file mode 100644 index 0000000..d9b60d3 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Extra_payment.kt @@ -0,0 +1,11 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Extra_payment :Serializable{ + var id: Int? = null + var request_id: String? = null + var balance: String? = null + var description: String? = null + var status: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Feed.kt b/app/src/main/java/com/consultantapp/data/models/responses/Feed.kt new file mode 100644 index 0000000..27486a4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Feed.kt @@ -0,0 +1,38 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Feed : Serializable { + var id: String? = null + var title: String? = null + var image: String? = null + var description: String? = null + var like: Any? = null + var user_id: Int? = null + var created_at: String? = null + var user_data: UserData? = null + + var favorite: String? = null + var views: String? = null + var is_favorite: Boolean? = null + + var type: String? = null + var image_web: String? = null + var image_mobile: String? = null + var on_click_info: Any? = null + var home_screen: Int? = null + var enable: Int? = null + var updated_at: String? = null + var comment_count: Int? = null + var is_like: Boolean? = null + + + var feed_id: Int? = null + var comment_id: Any? = null + var comment: String? = null + var user: UserData? = null + + /*Ask Question*/ + var answers: List? = null + var answer: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Filter.kt b/app/src/main/java/com/consultantapp/data/models/responses/Filter.kt new file mode 100644 index 0000000..2fae96d --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Filter.kt @@ -0,0 +1,26 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +data class Filter ( + var id: Int? = null, + var category_id: Int? = null, + var filter_name: String? = null, + var preference_name: String? = null, + var is_multi: String? = null, + var options: List? = null, + + /*Options*/ + var option_name: String? = null, + var filter_type_id: Int? = null, + var isSelected :Boolean= false, + + /*Symptom*/ + var name: String? = null, + + var title: String? = null, + var tier_options: List? = null, + var tier_options_select: ArrayList? = null, + var type: String? = null, + var status: String? = null +) :Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/FilterOption.kt b/app/src/main/java/com/consultantapp/data/models/responses/FilterOption.kt new file mode 100644 index 0000000..3d8091b --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/FilterOption.kt @@ -0,0 +1,11 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +data class FilterOption( + var id: String? = null, + var option_name: String? = null, + var filter_type_id: Int? = null, + + var isSelected: Boolean = false, +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Interval.kt b/app/src/main/java/com/consultantapp/data/models/responses/Interval.kt new file mode 100644 index 0000000..be2095a --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Interval.kt @@ -0,0 +1,7 @@ +package com.consultantapp.data.models.responses + +class Interval { + var time: String? = null + var available: Boolean? = null + var isSelected=false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/JitsiClass.kt b/app/src/main/java/com/consultantapp/data/models/responses/JitsiClass.kt new file mode 100644 index 0000000..6d06d30 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/JitsiClass.kt @@ -0,0 +1,12 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class JitsiClass : Serializable { + + var id: String? = null + var call_id: String? = null + var name: String? = null + var callType: String? = null + var isClass = false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Last_location.kt b/app/src/main/java/com/consultantapp/data/models/responses/Last_location.kt new file mode 100644 index 0000000..6bfad71 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Last_location.kt @@ -0,0 +1,8 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Last_location :Serializable{ + var lat: Double? = null + var long: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/MedicalHistory.kt b/app/src/main/java/com/consultantapp/data/models/responses/MedicalHistory.kt new file mode 100644 index 0000000..377aecd --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/MedicalHistory.kt @@ -0,0 +1,15 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + + +data class MedicalHistory ( + var id: Int? = null, + var request_id: Int? = null, + var comment: String? = null, + var preference_name: String? = null, + var request: MedicalHistory? = null, + + /*Request*/ + var booking_date: String? = null +) :Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Notification.kt b/app/src/main/java/com/consultantapp/data/models/responses/Notification.kt new file mode 100644 index 0000000..b722b6d --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Notification.kt @@ -0,0 +1,14 @@ +package com.consultantapp.data.models.responses + +class Notification { + + var id: String? = null + var pushType: String? = null + var message: String? = null + var module: String? = null + var module_id: String? = null + var created_at: String? = null + var read_status: String? = null + var form_user:UserData?=null + var to_user:UserData?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Packages.kt b/app/src/main/java/com/consultantapp/data/models/responses/Packages.kt new file mode 100644 index 0000000..c9e6607 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Packages.kt @@ -0,0 +1,16 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Packages : Serializable{ + var id: String? = null + var title: String? = null + var description: String? = null + var price: String? = null + var image: String? = null + var total_requests: String? = null + var available_requests: String? = null + var category_id: String? = null + var subscribe: Boolean? = null + var expired_on_plan:String?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Page.kt b/app/src/main/java/com/consultantapp/data/models/responses/Page.kt new file mode 100644 index 0000000..20cb9ae --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Page.kt @@ -0,0 +1,18 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +data class Page( + var icon: Int? = null, + + var slug: String? = null, + var title: String? = null, + var app_type: String? = null, + + var desc: String? = null, + + var question: String? = null, + var answer: String? = null, + + var status: String? = null +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Profile.kt b/app/src/main/java/com/consultantapp/data/models/responses/Profile.kt new file mode 100644 index 0000000..0e79cf7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Profile.kt @@ -0,0 +1,30 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Profile :Serializable{ + + var id: Int? = null + var avatar: Any? = null + var title:String?=null + var dob: String? = null + var qualification: Any? = null + var experience: Any? = null + var rating: Any? = null + var bio: String? = null + var user_id: Int? = null + var created_at: String? = null + var updated_at: String? = null + var working_since: String? = null + + /*Address*/ + var address: String? = null + var city: String? = null + var state: String? = null + var country: String? = null + + var country_id: String? = null + var state_id: String? = null + var city_id: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Request.kt b/app/src/main/java/com/consultantapp/data/models/responses/Request.kt new file mode 100644 index 0000000..d14324b --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Request.kt @@ -0,0 +1,51 @@ +package com.consultantapp.data.models.responses + +import com.consultantapp.data.models.requests.DocImage +import com.google.gson.annotations.SerializedName +import java.io.Serializable + +class Request : Serializable { + + var id: String? = null + var booking_date: String? = null + var from_user: UserData? = null + var to_user: UserData? = null + var time: String? = null + var service_type: String? = null + var main_service_type: String? = null + var service: Service? = null + var schedule_type: String? = null + var service_id: String? = null + var price: String? = null + var status: String? = null + var created_at: String? = null + var rating: String? = null + var bookingDateUTC: String? = null + var booking_end_date: String? = null + var canReschedule = false + var canCancel = false + + var is_prescription: Boolean? = null + + var extra_detail: Extra_detail? = null + var last_location: Last_location? = null + + var symptoms: List? = null + var symptom_details: String? = null + var symptom_images: List? = null + var extra_payment: Extra_payment? = null + + var cancel_reason: String? = null + + var care_plans: List? = null + var tier_detail: Filter? = null + var question_answers: List? = null + + var pre_scription: AddPrescription? = null + + var categoryData: Categories? = null + + var user_status: String? = null + var user_comment: String? = null + var total_hours :Double ?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Review.kt b/app/src/main/java/com/consultantapp/data/models/responses/Review.kt new file mode 100644 index 0000000..1a88a9e --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Review.kt @@ -0,0 +1,11 @@ +package com.consultantapp.data.models.responses + +class Review { + + var id: Int? = null + var from_user: Int? = null + var rating: Float? = null + var comment: String? = null + var user: UserData? = null + var consultant: UserData? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Service.kt b/app/src/main/java/com/consultantapp/data/models/responses/Service.kt new file mode 100644 index 0000000..a118a46 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Service.kt @@ -0,0 +1,39 @@ +package com.consultantapp.data.models.responses + +import com.consultantapp.data.models.requests.SaveAddress +import java.io.Serializable + + +class Service : Serializable { + var id: String? = null + var category_id: Int? = null + var service_id: String? = null + var is_active: String? = null + var price_minimum: Double? = null + var price_maximum: Double? = null + var price_fixed: Double? = null + var minimum_duration: Int? = null + var gap_duration: Int? = null + var created_at: String? = null + var updated_at: String? = null + var name: String? = null + var description: String? = null + var need_availability: String? = null + var price_type: String? = null + + var isSelected = false + var price: String? = null + var unit_price: Double? = null + var available: String? = null + + var sp_id: Int? = null + var category_service_id: Int? = null + var duration: String? = null + var minimmum_heads_up: String? = null + var deleted_at: Any? = null + var category_name: String? = null + var service_name: String? = null + var main_service_type: String? = null + var color_code: String? = null + var clinic_address: SaveAddress? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Subscription.kt b/app/src/main/java/com/consultantapp/data/models/responses/Subscription.kt new file mode 100644 index 0000000..93228fc --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Subscription.kt @@ -0,0 +1,12 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Subscription :Serializable{ + + var service_id: Int? = null + var charges: String? = null + var duration: Int? = null + var type: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/UserData.kt b/app/src/main/java/com/consultantapp/data/models/responses/UserData.kt new file mode 100644 index 0000000..b7b2e3e --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/UserData.kt @@ -0,0 +1,74 @@ +package com.consultantapp.data.models.responses + +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.models.responses.appdetails.Insurance +import java.io.Serializable + +class UserData : Serializable { + var id: String? = null + var name: String? = null + var phone: String? = null + var country_code: String? = null + var profile_image: String? = null + var fcm_id: String? = null + var email: String? = null + var email_verified_at: Any? = null + var created_at: String? = null + var updated_at: String? = null + var token: String? = null + var provider_type: String? = null + var reference_code: String? = null + var profile: Profile? = null + var services: ArrayList? = null + var categoryData: Categories? = null + //var roles: List? = null + + var subscriptions: List? = null + var dob: String? = null + var qualification: String? = null + var patientCount: String? = null + var experience: String? = null + var speciality: String? = null + var call_price: String? = null + var chat_price: String? = null + var totalRating: String? = null + var reviewCount: String? = null + var isAvailable = false + + /*Insurance*/ + var insurance_enable: String? = null + var insurances: ArrayList? = null + var custom_fields: ArrayList? = null + val insurance_images: ArrayList? = null + val insurance_info: ArrayList? = null + + /*Prefrences*/ + var master_preferences: ArrayList? = null + + /*Family Member*/ + var family_members: ArrayList? = null + var user_id: Int? = null + var first_name: String? = null + var relation: String? = null + var image: String? = null + var medical_allergies: String? = null + var chronic_diseases: String? = null + var previous_surgeries: String? = null + var previous_medication: String? = null + var patient_type: String? = null + + var medical_history: ArrayList? = null + var category:String?=null + + + var charges: String? = null + var duration: Int? = null + var consultant_id: Int? = null + var service_id: Int? = null + var service_type: String? = null + var doctor_data: UserData? = null + var distance: String? = null + var address_data: SaveAddress? = null + var national_id:String?=null +} diff --git a/app/src/main/java/com/consultantapp/data/models/responses/Wallet.kt b/app/src/main/java/com/consultantapp/data/models/responses/Wallet.kt new file mode 100644 index 0000000..25a1823 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/Wallet.kt @@ -0,0 +1,25 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class Wallet :Serializable{ + + var id: String? = null + var from: UserData? = null + var to: UserData? = null + var transaction_id: Int? = null + var created_at: String? = null + var updated_at: String? = null + var type: String? = null + var status:String?=null + var closing_balance: String? = null + var amount: String? = null + var service_type: String? = null + var call_duration: String? = null + + /*Cards*/ + var isSelected = false + var card_brand: String? = null + var last_four_digit: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/WaterIntake.kt b/app/src/main/java/com/consultantapp/data/models/responses/WaterIntake.kt new file mode 100644 index 0000000..8746f90 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/WaterIntake.kt @@ -0,0 +1,9 @@ +package com.consultantapp.data.models.responses + +import java.io.Serializable + +class WaterIntake : Serializable { + var limit: Double? = null + var total_achieved_goal: String? = null + var today_intake: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/appdetails/AppVersion.kt b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/AppVersion.kt new file mode 100644 index 0000000..c680418 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/AppVersion.kt @@ -0,0 +1,46 @@ +package com.consultantapp.data.models.responses.appdetails + +import com.consultantapp.data.models.responses.Page +import java.util.* + +class AppVersion { + + var update_type: Int? = null + var message: String? = null + var privateKey: String? = null + var publicKey: String? = null + + var version_name: String? = null + var current_version: Int? = null + var charges: String? = null + var audio_video: String? = null + var class_calling: String? = null + var unit_price: String? = null + var slot_duration: String? = null + var vendor_auto_approved: String? = null + var currency: String? = null + var jitsi_id: String? = null + var applogo: String? = null + var domain = "" + /*Urls*/ + var domain_url: String? = null + var media_url: String? = null + var socket_url: String? = null + var jitsi_meet_url: String? = null + + var payment_type: String? = null + var gateway_key: String? = null + var payment_provider_mode:String ?=null + var insurance: Boolean? = null + var insurances: ArrayList? = null + var custom_fields: CustomFields? = null + var country_id: String? = null + var country_name_code: String? = null + var country_code: Int? = null + + var client_features: ArrayList? = null + var clientFeaturesKeys = ClientFeaturesKeys() + + /*Pages*/ + var pages: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/appdetails/ClientFeatures.kt b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/ClientFeatures.kt new file mode 100644 index 0000000..47d3d4e --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/ClientFeatures.kt @@ -0,0 +1,9 @@ +package com.consultantapp.data.models.responses.appdetails + +class ClientFeatures { + var client_feature_id: String? = null + var client_id: String? = null + var feature_id: String? = null + //var feature_values: String? = null + var name: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/appdetails/ClientFeaturesKeys.kt b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/ClientFeaturesKeys.kt new file mode 100644 index 0000000..c5c75e4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/ClientFeaturesKeys.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.models.responses.appdetails + +class ClientFeaturesKeys { + var isAddress: Boolean? = null + var isInsurance: Boolean? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/appdetails/CustomFields.kt b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/CustomFields.kt new file mode 100644 index 0000000..4cf071a --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/CustomFields.kt @@ -0,0 +1,8 @@ +package com.consultantapp.data.models.responses.appdetails + +import java.util.* + +class CustomFields { + var service_provider: ArrayList? = null + var customer: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/appdetails/Insurance.kt b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/Insurance.kt new file mode 100644 index 0000000..f5bb412 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/appdetails/Insurance.kt @@ -0,0 +1,22 @@ +package com.consultantapp.data.models.responses.appdetails + +import java.io.Serializable + +class Insurance :Serializable{ + var id: String? = null + var category_id: String? = null + var name: String? = null + var company: String? = null + var enable: String? = null + var created_at: String? = null + var updated_at: String? = null + + var isSelected=false + + + /*Fields*/ + var field_name: String? = null + var field_value:String?=null + var field_type: String? = null + var required_sign_up: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/chat/ChatList.kt b/app/src/main/java/com/consultantapp/data/models/responses/chat/ChatList.kt new file mode 100644 index 0000000..1ba93ee --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/chat/ChatList.kt @@ -0,0 +1,18 @@ +package com.consultantapp.data.models.responses.chat + +import com.consultantapp.data.models.responses.UserData + +data class ChatList( + var image: String? = null, + val isDelivered: Boolean? = null, + val from_user: UserData? = null, + val to_user: UserData? = null, + var messageType: String? = null, + val isRead: Boolean? = null, + val video: Any? = null, + var id: String? = null, + var last_message: ChatMessage? = null, + var unReadCount: Int, + val chatType: Any? = null, + val status: String? = null +) diff --git a/app/src/main/java/com/consultantapp/data/models/responses/chat/ChatMessage.kt b/app/src/main/java/com/consultantapp/data/models/responses/chat/ChatMessage.kt new file mode 100644 index 0000000..d484cb2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/chat/ChatMessage.kt @@ -0,0 +1,24 @@ +package com.consultantapp.data.models.responses.chat + +import com.consultantapp.utils.MediaUploadStatus + +data class ChatMessage( + val imageUrl: String? = null, + val message: String? = null, + val senderId: String? = null, + val senderName: String? = null, + val receiverId: String? = null, + var messageType: String? = null, + val request_id: String? = null, + val sentAt: Long? = null, + var status: String? = null, + + var conversationId: String? = null, + //val deleteByList: List? = null, + var isActive: Boolean? = null, + var createAt: String? = null, + var __v: Int? = null, + var mediaUploadStatus: String = MediaUploadStatus.UPLOADED, + var id: String? = null, + var messageId: String? = null +) diff --git a/app/src/main/java/com/consultantapp/data/models/responses/chat/Listing.kt b/app/src/main/java/com/consultantapp/data/models/responses/chat/Listing.kt new file mode 100644 index 0000000..18a75b6 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/chat/Listing.kt @@ -0,0 +1,7 @@ +package com.consultantapp.data.models.responses.chat + +data class Listing( + val count: Int? = null, + val isOnline: Boolean? = null, + val listing: T? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Bounds.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Bounds.kt new file mode 100644 index 0000000..6ee680d --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Bounds.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.models.responses.directions + +class Bounds { + var northeast: End_location? = null + var southwest: End_location? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Direction.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Direction.kt new file mode 100644 index 0000000..885ebfe --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Direction.kt @@ -0,0 +1,7 @@ +package com.consultantapp.data.models.responses.directions + +class Direction { + var geocoded_waypoints: List? = null + var routes: List? = null + var status: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Distance.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Distance.kt new file mode 100644 index 0000000..ec1e803 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Distance.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.models.responses.directions + +class Distance { + var text: String? = null + var value: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Duration.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Duration.kt new file mode 100644 index 0000000..5fb594b --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Duration.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.models.responses.directions + +class Duration { + var text: String? = null + var value: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/End_location.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/End_location.kt new file mode 100644 index 0000000..501637a --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/End_location.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.models.responses.directions + +class End_location { + var lat: Double? = null + var lng: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Geocoded_waypoint.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Geocoded_waypoint.kt new file mode 100644 index 0000000..9e32932 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Geocoded_waypoint.kt @@ -0,0 +1,7 @@ +package com.consultantapp.data.models.responses.directions + +class Geocoded_waypoint { + var geocoder_status: String? = null + var place_id: String? = null + var types: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Leg.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Leg.kt new file mode 100644 index 0000000..8250aa8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Leg.kt @@ -0,0 +1,13 @@ +package com.consultantapp.data.models.responses.directions + +class Leg { + var distance: Distance? = null + var duration: Duration? = null + var end_address: String? = null + var end_location: End_location? = null + var start_address: String? = null + var start_location: End_location? = null + var steps: List? = null + var traffic_speed_entry: List? = null + var via_waypoint: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Overview_polyline.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Overview_polyline.kt new file mode 100644 index 0000000..6814a60 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Overview_polyline.kt @@ -0,0 +1,5 @@ +package com.consultantapp.data.models.responses.directions + +class Overview_polyline { + var points: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Polyline.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Polyline.kt new file mode 100644 index 0000000..01cd784 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Polyline.kt @@ -0,0 +1,5 @@ +package com.consultantapp.data.models.responses.directions + +class Polyline { + var points: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Route.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Route.kt new file mode 100644 index 0000000..16fcb49 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Route.kt @@ -0,0 +1,11 @@ +package com.consultantapp.data.models.responses.directions + +class Route { + var bounds: Bounds? = null + var copyrights: String? = null + var legs: List? = null + var overview_polyline: Overview_polyline? = null + var summary: String? = null + var warnings: List? = null + var waypoint_order: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/models/responses/directions/Step.kt b/app/src/main/java/com/consultantapp/data/models/responses/directions/Step.kt new file mode 100644 index 0000000..cb3bd4b --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/models/responses/directions/Step.kt @@ -0,0 +1,12 @@ +package com.consultantapp.data.models.responses.directions + +class Step { + var distance: Distance? = null + var duration: Duration? = null + var end_location: End_location? = null + var html_instructions: String? = null + var polyline: Polyline? = null + var start_location: End_location? = null + var travel_mode: String? = null + var maneuver: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/ApiConstants.kt b/app/src/main/java/com/consultantapp/data/network/ApiConstants.kt new file mode 100644 index 0000000..6849954 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/ApiConstants.kt @@ -0,0 +1,67 @@ +package com.consultantapp.data.network + +const val PER_PAGE_LOAD = 20 +const val HOME_CATEGORIES = 6 +const val PER_PAGE_LOAD_CHAT = 50 + + +object ApiKeys { + /*facbook,google,email,phone*/ + const val PROVIDER_TYPE = "provider_type" + + /*optional only phone and email*/ + const val PROVIDER_ID = "provider_id" + + /*access_token or password or otp*/ + const val PROVIDER_VERIFICATION = "provider_verification" + const val USER_TYPE = "user_type" + + const val AFTER = "after" + const val BEFORE = "before" + const val PER_PAGE = "per_page" +} + +object ProviderType { + const val facebook = "facebook" + const val google = "google" + const val email = "email" + const val phone = "phone" +} + +object LoadingStatus { + const val ITEM = 0 + const val LOADING = 1 +} + + +object PushType { + const val CHAT = "chat" + const val CHAT_STARTED = "CHAT_STARTED" + const val REQUEST_COMPLETED = "REQUEST_COMPLETED" + const val REQUEST_FAILED = "REQUEST_FAILED" + const val CANCELED_REQUEST = "CANCELED_REQUEST" + const val RESCHEDULED_REQUEST = "RESCHEDULED_REQUEST" + const val UPCOMING_APPOINTMENT = "UPCOMING_APPOINTMENT" + const val REQUEST_ACCEPTED = "Request Accepted" + const val BOOKING_RESERVED = "BOOKING_RESERVED" + const val CALL = "CALL" + const val CALL_RINGING = "CALL_RINGING" + const val CALL_ACCEPTED = "CALL_ACCEPTED" + const val CALL_CANCELED = "CALL_CANCELED" + const val BALANCE_ADDED = "BALANCE_ADDED" + const val BALANCE_FAILED="BALANCE_FAILED" + const val AMOUNT_RECEIVED = "AMOUNT_RECEIVED" + const val BALANCE_DEDUCTED="BALANCE_DEDUCTED" + const val BALANCE_REFUNDED="BALANCE_REFUNDED" + const val PRESCRIPTION_ADDED = "PRESCRIPTION_ADDED" + const val CARE_PLAN_DONE = "CARE_PLAN_DONE" + + const val START = "START" + const val REACHED = "REACHED" + const val START_SERVICE = "START_SERVICE" + const val CANCEL_SERVICE = "CANCEL_SERVICE" + const val COMPLETED = "COMPLETED" + const val QUESTION_ANSWERED="QUESTION_ANSWERED" + const val WATER_INTAKE = "WATER_INTAKE" + const val REQUEST_EXTRA_PAYMENT="REQUEST_EXTRA_PAYMENT" +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/ApisRespHandler.kt b/app/src/main/java/com/consultantapp/data/network/ApisRespHandler.kt new file mode 100644 index 0000000..09462dd --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/ApisRespHandler.kt @@ -0,0 +1,100 @@ +package com.consultantapp.data.network + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.consultantapp.R +import com.consultantapp.data.network.responseUtil.AppError +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.logoutUser + +object ApisRespHandler { + + private var alertDialog: AlertDialog.Builder? = null + + fun handleError(error: AppError?, activity: Activity, prefsManager: PrefsManager) { + error ?: return + + + when (error) { + is AppError.ApiError -> { + if (alertDialog == null) + errorMessage(activity, error.message) + } + + is AppError.ApiUnauthorized -> { + if (alertDialog == null) + sessionExpired(activity, error.message, prefsManager) + } + + is AppError.ApiAccountBlock -> { + if (alertDialog == null) + accountDeleted(activity, error.message, prefsManager) + } + + is AppError.ApiAccountRuleChanged -> { + if (alertDialog == null) + accountDeleted(activity, error.message, prefsManager) + } + + is AppError.ApiFailure -> { + if (alertDialog == null) { + if (error.message.contains("Failed to connect to",true) || + error.message.contains("Unable to resolve host",true) || + error.message.contains("No address associated with hostname",true)) + errorMessage(activity, activity.getString(R.string.check_internet)) + else + errorMessage(activity, error.message) + } + } + } + } + + + private fun sessionExpired(activity: Activity, message: String?, prefsManager: PrefsManager) { + try { + alertDialog = AlertDialog.Builder(activity) + alertDialog?.setCancelable(false) + alertDialog?.setTitle(activity.getString(R.string.alert)) + alertDialog?.setMessage(message) + alertDialog?.setPositiveButton(activity.getString(R.string.login)) { _, _ -> + logoutUser(activity, prefsManager) + + alertDialog = null + } + alertDialog?.show() + } catch (ignored: Exception) { + } + } + + private fun accountDeleted(activity: Activity, message: String?, prefsManager: PrefsManager) { + try { + alertDialog = AlertDialog.Builder(activity) + alertDialog?.setCancelable(false) + alertDialog?.setTitle(activity.getString(R.string.alert)) + alertDialog?.setMessage(message) + alertDialog?.setPositiveButton(activity.getString(R.string.ok)) { _, _ -> + logoutUser(activity, prefsManager) + alertDialog = null + } + alertDialog?.show() + + } catch (ignored: Exception) { + } + } + + private fun errorMessage(activity: Activity, message: String?) { + try { + alertDialog = AlertDialog.Builder(activity) + alertDialog?.setCancelable(false) + alertDialog?.setTitle(activity.getString(R.string.alert)) + alertDialog?.setMessage(message) + alertDialog?.setPositiveButton(activity.getString(R.string.ok)) { _, _ -> + alertDialog = null + } + alertDialog?.show() + + } catch (ignored: Exception) { + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/Config.kt b/app/src/main/java/com/consultantapp/data/network/Config.kt new file mode 100644 index 0000000..7cb6719 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/Config.kt @@ -0,0 +1,31 @@ +package com.consultantapp.data.network + +import com.consultantapp.BuildConfig + +object Config { + + var BASE_URL = "" + + private val appMode = AppMode.LIVE + + val baseURL: String + get() { + init(appMode) + return BASE_URL + } + + private fun init(appMode: AppMode) { + BASE_URL = when (appMode) { + AppMode.DEV -> { + BuildConfig.BASE_URL + } + AppMode.LIVE -> { + BuildConfig.BASE_URL + } + } + } + + private enum class AppMode { + DEV, LIVE + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/ApiResponse.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/ApiResponse.kt new file mode 100644 index 0000000..0eb8a26 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/ApiResponse.kt @@ -0,0 +1,6 @@ +package com.consultantapp.data.network.responseUtil + +data class ApiResponse( + val message: String? = null, + val data: T? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/ApiUtils.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/ApiUtils.kt new file mode 100644 index 0000000..0edf8fb --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/ApiUtils.kt @@ -0,0 +1,54 @@ +package com.consultantapp.data.network.responseUtil + +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import org.json.JSONObject +import retrofit2.Response +import java.io.File + +object ApiUtils { + private fun getErrorMessage(errorJson: String?): String { + if (errorJson.isNullOrBlank()) { + return "" + } + + return try { + val errorJsonObject = JSONObject(errorJson) + errorJsonObject.getString("message") + } catch (exception: Exception) { + "" + } + } + + fun getError(statusCode: Int, errorJson: String?): AppError { + val message = getErrorMessage(errorJson) + return when (statusCode) { + 401 -> { + AppError.ApiUnauthorized(message) + } + 402 -> { + AppError.ApiAccountBlock(message) + } + 403 -> { + AppError.ApiAccountRuleChanged(message) + } + else -> { + AppError.ApiError(statusCode, message) + } + } + } + + fun failure(throwable: Throwable): AppError { + return AppError.ApiFailure(throwable.localizedMessage ?: "") + } + + fun imageToRequestBody(imageFile: File): RequestBody =imageFile.asRequestBody("image/*".toMediaType()) + + fun imageToRequestBodyKey(parameterName: String, fileName: String): String = + "$parameterName\"; filename=\"$fileName" +} + +fun Response.getAppError(): AppError { + return ApiUtils.getError(code(), errorBody()?.string()) +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/AppError.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/AppError.kt new file mode 100644 index 0000000..3d1ecc5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/AppError.kt @@ -0,0 +1,10 @@ +package com.consultantapp.data.network.responseUtil + +sealed class AppError { + data class ApiError(val statusCode: Int, val message: String) : AppError() + data class ApiUnauthorized(val message: String) : AppError() + data class ApiAccountBlock(val message: String) : AppError() + data class ApiAccountRuleChanged(val message: String) : AppError() + data class ApiFailure(val message: String) : AppError() + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/Data.java b/app/src/main/java/com/consultantapp/data/network/responseUtil/Data.java new file mode 100644 index 0000000..02bc05e --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/Data.java @@ -0,0 +1,133 @@ +package com.consultantapp.data.network.responseUtil; + +import java.util.List; + +public class Data { + private List image; + private String createdAt; + private String subject; + private int V; + private String tenantId; + private String description; + private String id; + private int type; + private String ownerId; + private String propertyId; + private int status; + private String updatedAt; + + public List getImage() { + return image; + } + + public void setImage(List image) { + this.image = image; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public int getV() { + return V; + } + + public void setV(int V) { + this.V = V; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getOwnerId() { + return ownerId; + } + + public void setOwnerId(String ownerId) { + this.ownerId = ownerId; + } + + public String getPropertyId() { + return propertyId; + } + + public void setPropertyId(String propertyId) { + this.propertyId = propertyId; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return + "Template{" + + "image = '" + image + '\'' + + ",createdAt = '" + createdAt + '\'' + + ",subject = '" + subject + '\'' + + ",__v = '" + V + '\'' + + ",tenantId = '" + tenantId + '\'' + + ",description = '" + description + '\'' + + ",_id = '" + id + '\'' + + ",type = '" + type + '\'' + + ",ownerId = '" + ownerId + '\'' + + ",propertyId = '" + propertyId + '\'' + + ",status = '" + status + '\'' + + ",updatedAt = '" + updatedAt + '\'' + + "}"; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/ImageItem.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/ImageItem.kt new file mode 100644 index 0000000..526ae4e --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/ImageItem.kt @@ -0,0 +1,19 @@ +package com.consultantapp.data.network.responseUtil + +internal class ImageItem { + var thumbnail: String? = null + var original: String? = null + var name: String? = null + var id: String? = null + var type: String? = null + + override fun toString(): String { + return "ImageItem{" + + "thumbnail = '" + thumbnail + '\''.toString() + + ",original = '" + original + '\''.toString() + + ",name = '" + name + '\''.toString() + + ",_id = '" + id + '\''.toString() + + ",type = '" + type + '\''.toString() + + "}" + } +} diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/Resource.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/Resource.kt new file mode 100644 index 0000000..b044ce8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/Resource.kt @@ -0,0 +1,22 @@ +package com.consultantapp.data.network.responseUtil + + +/** + * A generic class that holds a value with its loading status. + * @param + */ +data class Resource(val status: Status, val data: T?, val error: AppError?) { + companion object { + fun success(data: T? = null): Resource { + return Resource(Status.SUCCESS, data, null) + } + + fun error(error: AppError): Resource { + return Resource(Status.ERROR, null, error) + } + + fun loading(): Resource { + return Resource(Status.LOADING, null, null) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/Response.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/Response.kt new file mode 100644 index 0000000..7528f0c --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/Response.kt @@ -0,0 +1,15 @@ +package com.consultantapp.data.network.responseUtil + +internal class Response { + var msg: String? = null + var data: Data? = null + var statusCode: Int = 0 + + override fun toString(): String { + return "Response{" + + "msg = '" + msg + '\''.toString() + + ",data = '" + data + '\''.toString() + + ",statusCode = '" + statusCode + '\''.toString() + + "}" + } +} diff --git a/app/src/main/java/com/consultantapp/data/network/responseUtil/Status.kt b/app/src/main/java/com/consultantapp/data/network/responseUtil/Status.kt new file mode 100644 index 0000000..4f08a93 --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/network/responseUtil/Status.kt @@ -0,0 +1,14 @@ +package com.consultantapp.data.network.responseUtil + +/** + * Status of a resource that is provided to the UI. + * + * + * These are usually created by the Repository classes where they return + * `LiveData>` to pass back the latest data to the UI with its fetch status. + */ +enum class Status { + SUCCESS, + ERROR, + LOADING +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/data/repos/UserRepository.kt b/app/src/main/java/com/consultantapp/data/repos/UserRepository.kt new file mode 100644 index 0000000..1e9540e --- /dev/null +++ b/app/src/main/java/com/consultantapp/data/repos/UserRepository.kt @@ -0,0 +1,146 @@ +package com.consultantapp.data.repos + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.consultantapp.ConsultantUserApplication +import com.consultantapp.appClientDetails +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.PushData +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.models.responses.appdetails.AppVersion +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.utils.* +import com.google.firebase.messaging.FirebaseMessaging +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.util.* +import javax.inject.Inject +import javax.inject.Singleton +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + + +@Singleton +class UserRepository @Inject constructor( + private val app: ConsultantUserApplication, + private val prefsManager: PrefsManager, private val webService: WebService +) { + + val groupCreatedCall = MutableLiveData() + val loginGuestUser = MutableLiveData() + val groupExitResponse = MutableLiveData>() + val pushData = MutableLiveData() + val isNewNotification = MutableLiveData() + + fun isUserLoggedIn(): Boolean { + val user = getUser() + val appSetting = getAppSetting() + + return if (user?.id.isNullOrEmpty() || user?.name.isNullOrEmpty() || user?.profile?.dob.isNullOrEmpty()) + false + else if (appSetting.insurance == true && user?.insurance_enable == null) + false + else if (appSetting.clientFeaturesKeys.isAddress == true && user?.profile?.address.isNullOrEmpty()) + false + else + true + } + + fun getUser(): UserData? { + return prefsManager.getObject(USER_DATA, UserData::class.java) + } + + fun getAppSetting(): AppVersion { + return prefsManager.getObject(APP_DETAILS, AppVersion::class.java) ?: AppVersion() + } + + fun getUserLanguage(): String { + return prefsManager.getString(USER_LANGUAGE, "") + } + + fun getPushCallData(): PushData? { + return prefsManager.getObject(PUSH_DATA, PushData::class.java) + } + + fun pushTokenUpdate() { + if (isUserLoggedIn()) { + FirebaseMessaging.getInstance().token.addOnCompleteListener { + if (it.isComplete) { + + Log.d("FCMToken", it.result) + + val hashMap = HashMap() + hashMap["fcm_id"] = it.result + + webService.updateFcmId(hashMap) + .enqueue(object : Callback> { + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + Log.e("fcmToken", "Success") + } else { + Log.e("fcmToken", "Faliure") + } + } + override fun onFailure(call: Call>, + throwable: Throwable) { + Log.e("fcmToken", "faliue 500") + } + }) + } + } + } + } + + fun callStatus(requestId: String, call_id: String, callStatus: String) { + val hashMap = HashMap() + hashMap["request_id"] = requestId + hashMap["call_id"] = call_id + hashMap["status"] = callStatus + + webService.callStatus(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + Log.e("fcmToken", "Success") + } else { + Log.e("fcmToken", "Faliure") + } + } + + override fun onFailure(call: Call>, + throwable: Throwable) { + Log.e("fcmToken", "faliue 500") + } + }) + } + + fun getPages() { + webService.getPages() + .enqueue(object : Callback> { + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + val commonData = Resource.success(response.body()?.data) + val appDetails=getAppSetting() + appDetails.pages=ArrayList() + appDetails.pages?.addAll(commonData.data?.pages ?: emptyList()) + prefsManager.remove(APP_DETAILS) + prefsManager.save(APP_DETAILS, appDetails) + appClientDetails = getAppSetting() + } else { + Log.e("getPages", "Faliure") + } + } + override fun onFailure(call: Call>, throwable: Throwable) { + Log.e("getPages", "faliure 500") + } + }) + } +} + diff --git a/app/src/main/java/com/consultantapp/di/AppComponent.kt b/app/src/main/java/com/consultantapp/di/AppComponent.kt new file mode 100644 index 0000000..bc32e48 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/AppComponent.kt @@ -0,0 +1,25 @@ +package com.consultantapp.di + +import com.consultantapp.ConsultantUserApplication +import com.consultantapp.utils.BroadcastReceiverModule +import dagger.Component +import dagger.android.AndroidInjector +import dagger.android.support.AndroidSupportInjectionModule +import javax.inject.Singleton + + +@Component(modules = [ + AndroidSupportInjectionModule::class, + AppModule::class, + BindingsModule::class, + ServiceBuilderModule::class, + NetworkModule::class, + ViewModelsModule::class, + BroadcastReceiverModule::class +]) +@Singleton +interface AppComponent : AndroidInjector { + + @Component.Builder + abstract class Builder : AndroidInjector.Builder() +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/AppModule.kt b/app/src/main/java/com/consultantapp/di/AppModule.kt new file mode 100644 index 0000000..fd0e2f1 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/AppModule.kt @@ -0,0 +1,44 @@ +package com.consultantapp.di + +import android.content.Context +import android.content.SharedPreferences +import android.preference.PreferenceManager +import com.consultantapp.ConsultantUserApplication +import com.consultantapp.pushNotifications.MessagingService +import com.google.gson.FieldNamingPolicy +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import dagger.Module +import dagger.Provides +import javax.inject.Singleton + + +@Module +object AppModule { + + @Provides + @Singleton + @JvmStatic + fun provideContext(app: ConsultantUserApplication): Context = app.applicationContext + + @Provides + @Singleton + @JvmStatic + fun provideMessagingService(messagingService: MessagingService): MessagingService = MessagingService() + + @Provides + @Singleton + @JvmStatic + fun sharedPreferences(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + + @Provides + @Singleton + @JvmStatic + fun provideGson(): Gson { + return GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) + .setPrettyPrinting() + .setLenient() + .create() + } +} diff --git a/app/src/main/java/com/consultantapp/di/BindingsModule.kt b/app/src/main/java/com/consultantapp/di/BindingsModule.kt new file mode 100644 index 0000000..4bf4bb0 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/BindingsModule.kt @@ -0,0 +1,334 @@ +package com.consultantapp.di + + +import com.consultantapp.ui.SplashActivity +import com.consultantapp.ui.calling.CallingActivity +import com.consultantapp.ui.classes.CategoriesFragment +import com.consultantapp.ui.classes.ClassesDetailFragment +import com.consultantapp.ui.classes.ClassesFragment +import com.consultantapp.ui.dashboard.HomeActivity +import com.consultantapp.ui.dashboard.appointment.AppointmentFragment +import com.consultantapp.ui.dashboard.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantapp.ui.dashboard.appointment.appointmentStatus.CompletedRequestFragment +import com.consultantapp.ui.dashboard.appointment.detail.AppointmentDetailFragment +import com.consultantapp.ui.dashboard.appointment.medicalhistory.MedicalHistoryFragment +import com.consultantapp.ui.dashboard.appointment.rating.AddRatingFragment +import com.consultantapp.ui.dashboard.careplan.CarePlanFragment +import com.consultantapp.ui.dashboard.careplan.QuestionAnswerFragment +import com.consultantapp.ui.dashboard.chat.BottomAudioPlayerFragment +import com.consultantapp.ui.dashboard.chat.ChatFragment +import com.consultantapp.ui.dashboard.chat.chatdetail.ChatDetailActivity +import com.consultantapp.ui.dashboard.doctor.DoctorActionActivity +import com.consultantapp.ui.dashboard.doctor.confirm.ConfirmBookingFragment +import com.consultantapp.ui.dashboard.doctor.detail.BottomRequestFragment +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity +import com.consultantapp.ui.dashboard.doctor.detail.prefrence.PrefrenceFragment +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.dashboard.doctor.schedule.DateTimeFragment +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment +import com.consultantapp.ui.dashboard.doctor.schedule.ServicePlansFragment +import com.consultantapp.ui.dashboard.doctor.schedule.request.BottomServiceFragment +import com.consultantapp.ui.dashboard.doctor.schedule.request.BottomServiceRequestFragment +import com.consultantapp.ui.dashboard.doctor.symptom.SymptomDetailFragment +import com.consultantapp.ui.dashboard.feeds.FeedDetailsFragment +import com.consultantapp.ui.dashboard.feeds.FeedsFragment +import com.consultantapp.ui.dashboard.home.HomeFragment +import com.consultantapp.ui.dashboard.home.HomeMainFragment +import com.consultantapp.ui.dashboard.home.addfamily.AddFamilyFragment +import com.consultantapp.ui.dashboard.home.addfamily.BottomFamilyFragment +import com.consultantapp.ui.dashboard.home.bank.BankInfoFragment +import com.consultantapp.ui.dashboard.home.banner.BannerFragment +import com.consultantapp.ui.dashboard.home.healthtool.bmichecker.BmiCheckerFragment +import com.consultantapp.ui.dashboard.home.healthtool.pregnancycalculator.BottomPregnancyFragment +import com.consultantapp.ui.dashboard.home.healthtool.pregnancycalculator.PregnancyCalculatorFragment +import com.consultantapp.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.BottomWaterLimitFragment +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.WaterIntakeFragment +import com.consultantapp.ui.dashboard.home.questions.AskQuestionFragment +import com.consultantapp.ui.dashboard.home.questions.QuestionsFragment +import com.consultantapp.ui.dashboard.home.questions.detail.QuestionDetailFragment +import com.consultantapp.ui.dashboard.home.tipofday.TipOfDayFragmentFragment +import com.consultantapp.ui.dashboard.language.LanguageFragment +import com.consultantapp.ui.dashboard.location.AddAddressActivity +import com.consultantapp.ui.dashboard.location.LocationFragment +import com.consultantapp.ui.dashboard.settings.SettingsFragment +import com.consultantapp.ui.dashboard.settings.contactlist.ContactListAdapter +import com.consultantapp.ui.dashboard.settings.contactlist.ContactListFragment +import com.consultantapp.ui.dashboard.settings.idcard.IdCardFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.ui.dashboard.subscription.SubscriptionDetailFragment +import com.consultantapp.ui.dashboard.subscription.SubscriptionListFragment +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.dashboard.success.SuccessFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.addmoney.AddCardFragment +import com.consultantapp.ui.drawermenu.addmoney.AddMoneyActivity +import com.consultantapp.ui.drawermenu.addmoney.BottomCardTypeFragment +import com.consultantapp.ui.drawermenu.history.HistoryFragment +import com.consultantapp.ui.drawermenu.notification.NotificationFragment +import com.consultantapp.ui.drawermenu.profile.ProfileFragment +import com.consultantapp.ui.drawermenu.wallet.WalletFragment +import com.consultantapp.ui.jitsimeet.JitsiActivity +import com.consultantapp.ui.loginSignUp.SignUpActivity +import com.consultantapp.ui.loginSignUp.changepassword.ChangePasswordFragment +import com.consultantapp.ui.loginSignUp.forgotpassword.ForgotPasswordFragment +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.ui.loginSignUp.insurance.add.DialogAddDocumentFragment +import com.consultantapp.ui.loginSignUp.login.InfoUserFragment +import com.consultantapp.ui.loginSignUp.login.LoginFragment +import com.consultantapp.ui.loginSignUp.loginemail.LoginEmailFragment +import com.consultantapp.ui.loginSignUp.signup.SignUpFragment +import com.consultantapp.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.ui.walkthrough.WalkThroughDetailFragment +import com.consultantapp.ui.walkthrough.WalkThroughFragment +import com.consultantapp.ui.webview.WebViewActivity +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class BindingsModule { + + @ContributesAndroidInjector + abstract fun splashActivity(): SplashActivity + + @ContributesAndroidInjector + abstract fun homeActivity(): HomeActivity + + @ContributesAndroidInjector + abstract fun signUpActivity(): SignUpActivity + + @ContributesAndroidInjector + abstract fun welcomeFragment(): WelcomeFragment + + @ContributesAndroidInjector + abstract fun loginFragment(): LoginFragment + + @ContributesAndroidInjector + abstract fun verifyOTPFragment(): VerifyOTPFragment + + @ContributesAndroidInjector + abstract fun doctorListActivity(): DoctorListActivity + + @ContributesAndroidInjector + abstract fun doctorDetailActivity(): DoctorDetailActivity + + @ContributesAndroidInjector + abstract fun drawerActivity(): DrawerActivity + + @ContributesAndroidInjector + abstract fun historyFragment(): HistoryFragment + + @ContributesAndroidInjector + abstract fun signUpFragment(): SignUpFragment + + @ContributesAndroidInjector + abstract fun loginEmailFragment(): LoginEmailFragment + + @ContributesAndroidInjector + abstract fun profileFragment(): ProfileFragment + + @ContributesAndroidInjector + abstract fun notificationFragment(): NotificationFragment + + @ContributesAndroidInjector + abstract fun forgotPasswordFragment(): ForgotPasswordFragment + + @ContributesAndroidInjector + abstract fun changePasswordFragment(): ChangePasswordFragment + + @ContributesAndroidInjector + abstract fun walletFragment(): WalletFragment + + @ContributesAndroidInjector + abstract fun addCardFragment(): AddCardFragment + + @ContributesAndroidInjector + abstract fun chatFragment(): ChatFragment + + @ContributesAndroidInjector + abstract fun chatDetailActivity(): ChatDetailActivity + + @ContributesAndroidInjector + abstract fun appointmentFragment(): AppointmentFragment + + @ContributesAndroidInjector + abstract fun appointmentDetailFragment(): AppointmentDetailFragment + + @ContributesAndroidInjector + abstract fun addRatingFragment(): AddRatingFragment + + @ContributesAndroidInjector + abstract fun categoriesFragment(): CategoriesFragment + + @ContributesAndroidInjector + abstract fun classesFragment(): ClassesFragment + + @ContributesAndroidInjector + abstract fun classesDetailFragment(): ClassesDetailFragment + + @ContributesAndroidInjector + abstract fun jitsiActivity(): JitsiActivity + + @ContributesAndroidInjector + abstract fun homeFragment(): HomeFragment + + @ContributesAndroidInjector + abstract fun homeMainFragment(): HomeMainFragment + + @ContributesAndroidInjector + abstract fun locationFragment(): LocationFragment + + @ContributesAndroidInjector + abstract fun languageFragment(): LanguageFragment + + @ContributesAndroidInjector + abstract fun subCategoryFragment(): SubCategoryFragment + + @ContributesAndroidInjector + abstract fun settingsFragment(): SettingsFragment + + @ContributesAndroidInjector + abstract fun bottomRequestFragment(): BottomRequestFragment + + @ContributesAndroidInjector + abstract fun prefrenceFragment(): PrefrenceFragment + + @ContributesAndroidInjector + abstract fun doctorActionActivity(): DoctorActionActivity + + @ContributesAndroidInjector + abstract fun scheduleFragment(): ScheduleFragment + + @ContributesAndroidInjector + abstract fun dateTimeFragment(): DateTimeFragment + + @ContributesAndroidInjector + abstract fun confirmBookingFragment(): ConfirmBookingFragment + + @ContributesAndroidInjector + abstract fun bannerFragment(): BannerFragment + + @ContributesAndroidInjector + abstract fun callingActivity(): CallingActivity + + @ContributesAndroidInjector + abstract fun webViewActivity(): WebViewActivity + + @ContributesAndroidInjector + abstract fun addMoneyActivity(): AddMoneyActivity + + @ContributesAndroidInjector + abstract fun bottomCardTypeFragment(): BottomCardTypeFragment + + @ContributesAndroidInjector + abstract fun insuranceFragment(): InsuranceFragment + + @ContributesAndroidInjector + abstract fun subscriptionListFragment(): SubscriptionListFragment + + @ContributesAndroidInjector + abstract fun subscriptionDetailFragment(): SubscriptionDetailFragment + + @ContributesAndroidInjector + abstract fun feedDetailsFragment(): FeedDetailsFragment + + @ContributesAndroidInjector + abstract fun feedsFragment(): FeedsFragment + + @ContributesAndroidInjector + abstract fun walkThroughFragment(): WalkThroughFragment + + @ContributesAndroidInjector + abstract fun walkThroughDetailFragment(): WalkThroughDetailFragment + + @ContributesAndroidInjector + abstract fun tipOfDayFragmentFragment(): TipOfDayFragmentFragment + + @ContributesAndroidInjector + abstract fun successFragment(): SuccessFragment + + @ContributesAndroidInjector + abstract fun networkIssueFragment(): NetworkIssueFragment + + @ContributesAndroidInjector + abstract fun infoUserFragment(): InfoUserFragment + + @ContributesAndroidInjector + abstract fun appointmentStatusActivity(): AppointmentStatusActivity + + @ContributesAndroidInjector + abstract fun bmiCheckerFragment(): BmiCheckerFragment + + @ContributesAndroidInjector + abstract fun waterIntakeFragment(): WaterIntakeFragment + + @ContributesAndroidInjector + abstract fun proteinIntakeFragment(): ProteinIntakeFragment + + @ContributesAndroidInjector + abstract fun pregnancyCalculatorFragment(): PregnancyCalculatorFragment + + @ContributesAndroidInjector + abstract fun bottomPregnancyFragment(): BottomPregnancyFragment + + @ContributesAndroidInjector + abstract fun bottomWaterLimitFragment(): BottomWaterLimitFragment + + @ContributesAndroidInjector + abstract fun questionsFragment(): QuestionsFragment + + @ContributesAndroidInjector + abstract fun questionDetailFragment(): QuestionDetailFragment + + @ContributesAndroidInjector + abstract fun askQuestionFragment(): AskQuestionFragment + + @ContributesAndroidInjector + abstract fun bottomFamilyFragment(): BottomFamilyFragment + + @ContributesAndroidInjector + abstract fun addFamilyFragment(): AddFamilyFragment + + @ContributesAndroidInjector + abstract fun bottomAudioPlayerFragment(): BottomAudioPlayerFragment + + @ContributesAndroidInjector + abstract fun dialogAddDocumentFragment(): DialogAddDocumentFragment + + @ContributesAndroidInjector + abstract fun symptomDetailFragment(): SymptomDetailFragment + + @ContributesAndroidInjector + abstract fun addAddressActivity(): AddAddressActivity + + @ContributesAndroidInjector + abstract fun carePlanFragment(): CarePlanFragment + + @ContributesAndroidInjector + abstract fun questionAnswerFragment(): QuestionAnswerFragment + + @ContributesAndroidInjector + abstract fun bankInfoFragment(): BankInfoFragment + + @ContributesAndroidInjector + abstract fun idCardFragment(): IdCardFragment + + @ContributesAndroidInjector + abstract fun medicalHistoryFragment(): MedicalHistoryFragment + + @ContributesAndroidInjector + abstract fun bottomServiceRequestFragment(): BottomServiceRequestFragment + + @ContributesAndroidInjector + abstract fun bottomServiceFragment(): BottomServiceFragment + + @ContributesAndroidInjector + abstract fun completedRequestFragment(): CompletedRequestFragment + + @ContributesAndroidInjector + abstract fun contactListFragment(): ContactListFragment + + @ContributesAndroidInjector + abstract fun servicePlansFragment(): ServicePlansFragment +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/DaggerBottomSheetDialogFragment.kt b/app/src/main/java/com/consultantapp/di/DaggerBottomSheetDialogFragment.kt new file mode 100644 index 0000000..f5126ec --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/DaggerBottomSheetDialogFragment.kt @@ -0,0 +1,31 @@ +package com.consultantapp.di + +import android.content.Context +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import dagger.android.AndroidInjector +import dagger.android.DispatchingAndroidInjector +import dagger.android.HasAndroidInjector +import dagger.android.support.AndroidSupportInjection +import javax.inject.Inject + + +/** + * A [BottomSheetDialogFragment] that injects its members in [onAttach] and can be used to inject + * child [BottomSheetDialogFragment]s attached to it. + * Note that when this fragment gets reattached, its members will be injected again. + * + * @author Ryan Amaral + */ +open class DaggerBottomSheetDialogFragment : BottomSheetDialogFragment(), HasAndroidInjector { + + @Inject lateinit var mChildFragmentInjector: DispatchingAndroidInjector + + override fun onAttach(context: Context) { + AndroidSupportInjection.inject(this) + super.onAttach(context) + } + + override fun androidInjector(): AndroidInjector { + return mChildFragmentInjector + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/NetworkModule.kt b/app/src/main/java/com/consultantapp/di/NetworkModule.kt new file mode 100644 index 0000000..6e56b89 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/NetworkModule.kt @@ -0,0 +1,92 @@ +package com.consultantapp.di + +import com.consultantapp.BuildConfig +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.Config +import com.consultantapp.utils.* +import com.google.gson.Gson +import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory +import dagger.Module +import dagger.Provides +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.scalars.ScalarsConverterFactory +import java.util.* +import java.util.concurrent.TimeUnit +import javax.inject.Singleton + + +@Module +object NetworkModule { + + @Provides + @Singleton + @JvmStatic + fun okHttpClient(prefsManager: PrefsManager): OkHttpClient { + return OkHttpClient.Builder() + .connectTimeout(100, TimeUnit.SECONDS) + .readTimeout(100, TimeUnit.SECONDS) + .writeTimeout(100, TimeUnit.SECONDS) + .addInterceptor(getHttpLoggingInterceptor()) + .cache(null) + .addInterceptor(getNetworkInterceptor(prefsManager)) + .build() + } + + @Provides + @Singleton + @JvmStatic + fun retrofit(client: OkHttpClient, gson: Gson): Retrofit { + return Retrofit.Builder() + .baseUrl(Config.baseURL) + .client(client) + .addConverterFactory(GsonConverterFactory.create(gson)) + .addConverterFactory(ScalarsConverterFactory.create()) + .addCallAdapterFactory(CoroutineCallAdapterFactory()) + .build() + } + + private fun getNetworkInterceptor(prefsManager: PrefsManager): Interceptor { + return Interceptor { chain -> + var request = chain.request() + + /*Get App Id*/ + val app_id = BuildConfig.APP_UNIQUE_ID + + + val requestBuilder = request.newBuilder() + requestBuilder.addHeader("Accept", "application/json") + .header("Connection", "close") + .addHeader("user-type", APP_TYPE) + .addHeader("language", prefsManager.getString(USER_LANGUAGE, "en")) + .addHeader("timezone", TimeZone.getDefault().id) + .addHeader("app-id", "c6b484d83fb21425453dcd0af6c1f01b15") + .addHeader("devicetype", ANDROID) + + val accessToken = prefsManager.getObject(USER_DATA, UserData::class.java)?.token + + if (!accessToken.isNullOrEmpty()) + requestBuilder.addHeader("authorization", "Bearer $accessToken") + + request=requestBuilder.build() + + chain.proceed(request) + } + } + + + private fun getHttpLoggingInterceptor(): HttpLoggingInterceptor { + val httpLoggingInterceptor = HttpLoggingInterceptor() + httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY + return httpLoggingInterceptor + } + + @Provides + @Singleton + @JvmStatic + fun webService(retrofit: Retrofit): WebService = retrofit.create(WebService::class.java) +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/ResourceProvider.kt b/app/src/main/java/com/consultantapp/di/ResourceProvider.kt new file mode 100644 index 0000000..e8e1d54 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/ResourceProvider.kt @@ -0,0 +1,19 @@ +package com.consultantapp.di + +import android.content.Context +import android.content.res.Resources +import com.consultantapp.utils.LocaleHelper +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ResourceProvider @Inject constructor(private val context: Context) { + + fun getStringResource(stringId: Int): String { + return LocaleHelper.onCreate(context).getString(stringId) + } + + fun getResources(): Resources { + return context.resources + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/ServiceBuilderModule.kt b/app/src/main/java/com/consultantapp/di/ServiceBuilderModule.kt new file mode 100644 index 0000000..7598aed --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/ServiceBuilderModule.kt @@ -0,0 +1,17 @@ +package com.consultantapp.di + +import com.consultantapp.pushNotifications.MessagingService +import com.consultantapp.ui.calling.IncomingCallNotificationService +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class ServiceBuilderModule { + + @ContributesAndroidInjector + abstract fun messagingService(): MessagingService + + @ContributesAndroidInjector + abstract fun incomingCallNotificationService(): IncomingCallNotificationService + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/SingleLiveEvent.java b/app/src/main/java/com/consultantapp/di/SingleLiveEvent.java new file mode 100644 index 0000000..4386c57 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/SingleLiveEvent.java @@ -0,0 +1,58 @@ +package com.consultantapp.di; + + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; + +import java.util.concurrent.atomic.AtomicBoolean; + +import timber.log.Timber; + + +/** + * A lifecycle-aware observable that sends only new updates after subscription, used for events USER_LIKE + * navigation and Snackbar messages. + *

+ * This avoids a common problem with events: on configuration change (USER_LIKE rotation) an update + * can be emitted if the observer is active. This LiveData only calls the observable if there's an + * explicit call to setValue() or call(). + *

+ * Note that only one observer is going to be notified of changes. + */ +public class SingleLiveEvent extends MutableLiveData { + private final AtomicBoolean pending = new AtomicBoolean(false); + + @MainThread + public void setObserver(@NonNull LifecycleOwner owner, @NonNull final Observer observer) { + + if (hasActiveObservers()) { + Timber.w("Multiple observers registered but only one will be notified of changes."); + } + + // Observe the internal MutableLiveData + super.observe(owner, t -> { + if (pending.compareAndSet(true, false)) { + observer.onChanged(t); + } + }); + + } + + @MainThread + public void setValue(@Nullable T t) { + pending.set(true); + super.setValue(t); + } + + /** + * Used for cases where T is Void, to make calls cleaner. + */ + @MainThread + public void call() { + setValue(null); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/ViewModelKey.java b/app/src/main/java/com/consultantapp/di/ViewModelKey.java new file mode 100644 index 0000000..03b7d56 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/ViewModelKey.java @@ -0,0 +1,20 @@ +package com.consultantapp.di; + +import androidx.lifecycle.ViewModel; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import dagger.MapKey; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@MapKey +@Documented +@Target(METHOD) +@Retention(RUNTIME) +public @interface ViewModelKey { + Class value(); +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/ViewModelProviderFactory.java b/app/src/main/java/com/consultantapp/di/ViewModelProviderFactory.java new file mode 100644 index 0000000..9ab6fad --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/ViewModelProviderFactory.java @@ -0,0 +1,47 @@ +package com.consultantapp.di; + + +import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; + +@Singleton +public class ViewModelProviderFactory implements ViewModelProvider.Factory { + private final Map, Provider> creators; + + @Inject + public ViewModelProviderFactory(Map, Provider> creators) { + this.creators = creators; + } + + @SuppressWarnings("unchecked") + @Override + @NonNull + public T create(@NonNull Class modelClass) { + Provider creator = creators.get(modelClass); + if (creator == null) { + for (Map.Entry, Provider> entry : creators.entrySet()) { + if (modelClass.isAssignableFrom(entry.getKey())) { + creator = entry.getValue(); + break; + } + } + } + if (creator == null) { + throw new IllegalArgumentException("unknown model class " + modelClass); + } + + + try { + return (T) creator.get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/di/ViewModelsModule.kt b/app/src/main/java/com/consultantapp/di/ViewModelsModule.kt new file mode 100644 index 0000000..f6143e8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/di/ViewModelsModule.kt @@ -0,0 +1,138 @@ +package com.consultantapp.di + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.ui.AppVersionViewModel +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.calling.CallViewModel +import com.consultantapp.ui.classes.ClassesViewModel +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.ui.dashboard.appointment.appointmentStatus.DirectionViewModel +import com.consultantapp.ui.dashboard.chat.ChatViewModel +import com.consultantapp.ui.dashboard.chat.UploadFileViewModel +import com.consultantapp.ui.dashboard.doctor.schedule.GetSlotsViewModel +import com.consultantapp.ui.dashboard.doctor.symptom.PandemicViewModel +import com.consultantapp.ui.dashboard.feeds.FeedViewModel +import com.consultantapp.ui.dashboard.home.BannerViewModel +import com.consultantapp.ui.dashboard.home.HomeViewModel +import com.consultantapp.ui.dashboard.home.bank.BankViewModel +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.WaterIntakeViewModel +import com.consultantapp.ui.dashboard.home.questions.QuestionViewModel +import com.consultantapp.ui.dashboard.settings.contactlist.ContactViewModel +import com.consultantapp.ui.drawermenu.wallet.WalletViewModel +import dagger.Binds +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoMap +import javax.inject.Singleton + +@Module +abstract class ViewModelsModule { + + @Module + companion object { + + @Provides + @Singleton + @JvmStatic + fun viewModelProviderFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory = + factory + } + + @Binds + @IntoMap + @ViewModelKey(LoginViewModel::class) + abstract fun loginViewModel(viewModel: LoginViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(DoctorViewModel::class) + abstract fun doctorViewModel(viewModel: DoctorViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(WalletViewModel::class) + abstract fun walletViewModel(viewModel: WalletViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(AppointmentViewModel::class) + abstract fun appointmentViewModel(viewModel: AppointmentViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(ChatViewModel::class) + abstract fun chatViewModel(viewModel: ChatViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(UploadFileViewModel::class) + abstract fun uploadFileViewModel(viewModel: UploadFileViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(ClassesViewModel::class) + abstract fun classesViewModel(viewModel: ClassesViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(GetSlotsViewModel::class) + abstract fun getSlotsViewModel(viewModel: GetSlotsViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(BannerViewModel::class) + abstract fun bannerViewModel(viewModel: BannerViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(CallViewModel::class) + abstract fun callViewModel(viewModel: CallViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(AppVersionViewModel::class) + abstract fun appVersionViewModel(viewModel: AppVersionViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(FeedViewModel::class) + abstract fun feedViewModel(viewModel: FeedViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(HomeViewModel::class) + abstract fun homeViewModel(viewModel: HomeViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(DirectionViewModel::class) + abstract fun directionViewModel(viewModel: DirectionViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(QuestionViewModel::class) + abstract fun questionViewModel(viewModel: QuestionViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(WaterIntakeViewModel::class) + abstract fun waterIntakeViewModel(viewModel: WaterIntakeViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(PandemicViewModel::class) + abstract fun pandemicViewModel(viewModel: PandemicViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(BankViewModel::class) + abstract fun bankViewModel(viewModel: BankViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(ContactViewModel::class) + abstract fun contactViewModel(viewModel: ContactViewModel): ViewModel + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/pushNotifications/IncomingCallBroadcastReceiver.kt b/app/src/main/java/com/consultantapp/pushNotifications/IncomingCallBroadcastReceiver.kt new file mode 100644 index 0000000..2e64ba4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/pushNotifications/IncomingCallBroadcastReceiver.kt @@ -0,0 +1,14 @@ +package com.consultantapp.pushNotifications + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.consultantapp.ui.calling.Constants + +class IncomingCallBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if(intent?.action == Constants.ACTION_INCOMING_CALL){ + context?.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/pushNotifications/MessagingService.kt b/app/src/main/java/com/consultantapp/pushNotifications/MessagingService.kt new file mode 100644 index 0000000..195133d --- /dev/null +++ b/app/src/main/java/com/consultantapp/pushNotifications/MessagingService.kt @@ -0,0 +1,608 @@ +package com.consultantapp.pushNotifications + +import android.Manifest +import android.annotation.TargetApi +import android.app.* +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.graphics.BitmapFactory +import android.media.AudioAttributes +import android.os.Build +import android.os.Handler +import android.os.PowerManager +import android.provider.Settings +import android.util.Log +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.PushData +import com.consultantapp.data.network.PushType +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.ui.calling.CallingActivity +import com.consultantapp.ui.calling.Constants +import com.consultantapp.ui.calling.Constants.CALL_NOTIFICATION_ID +import com.consultantapp.ui.calling.Constants.INCOMING_CALL_INVITE +import com.consultantapp.ui.calling.IncomingCallNotificationService +import com.consultantapp.ui.calling.SoundPoolManager +import com.consultantapp.ui.dashboard.HomeActivity +import com.consultantapp.ui.dashboard.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantapp.ui.dashboard.chat.chatdetail.ChatDetailActivity +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.DrawerActivity.Companion.WALLET +import com.consultantapp.utils.* +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import com.google.gson.Gson +import dagger.android.AndroidInjection +import org.json.JSONObject +import java.util.* +import javax.inject.Inject + + +class MessagingService : FirebaseMessagingService() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + private val channelId = "Consultant user" + + val CHANNEL_ID: String = "my_channel_id" + + + override fun onCreate() { + AndroidInjection.inject(this) + super.onCreate() + } + + private val isAppVisible: Boolean + private get() = ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED) + + override fun handleIntent(intent: Intent) { + super.handleIntent(intent) + + /*val message = Gson().toJson(intent.extras) + + val jsonObject = JSONObject(message)*/ + + // Assuming you have your JSON structure as a string + val jsonString = intent.let { Gson().toJson(it) } ?: return + val jsonObject = JSONObject(jsonString) + + // Navigate to the "mMap" object + val mMap = jsonObject.getJSONObject("mExtras").getJSONObject("mMap") + + sendNotification(mMap) + } + + override fun onNewToken(token: String) { + super.onNewToken(token) + Log.e("fcmToken", token) + + if (userRepository.isUserLoggedIn()) { + userRepository.pushTokenUpdate() + } + } + + override fun onMessageReceived(remoteMessage: RemoteMessage) { + Log.e("remoteMessage", remoteMessage.data.toString()) + + appSocket.init() + val notificationData = JSONObject(remoteMessage.data as MutableMap) + + if (userRepository.isUserLoggedIn()) { + sendNotification(notificationData) + } + } + + + @TargetApi(Build.VERSION_CODES.O) + private fun sendNotification(notificationData: JSONObject) { + Log.e("Notification", "Received"+notificationData) + userRepository.isNewNotification.postValue(true) + + val pushData = PushData( + msg = notificationData.optString("msg"), + title = notificationData.optString("title"), + sound = notificationData.optString("sound"), + pushType = notificationData.optString("pushType"), + imageUrl = notificationData.optString("imageUrl"), + message = notificationData.optString("message"), + senderId = notificationData.optString("senderId"), + senderName = notificationData.optString("senderName"), + receiverId = notificationData.optString("receiverId"), + messageType = notificationData.optString("messageType"), + request_id = notificationData.optString("request_id"), + call_id = notificationData.optString("call_id"), + service_type = notificationData.optString("service_type"), + main_service_type = notificationData.optString("main_service_type"), + sentAt = notificationData.optLong("sentAt"), + request_time = notificationData.optString("request_time"), + sender_name = notificationData.optString("sender_name"), + sender_image = notificationData.optString("sender_image"), + vendor_category_name = notificationData.optString("vendor_category_name"), + transaction_id = notificationData.optString("transaction_id") + ) + + + + val requestID = Calendar.getInstance().timeInMillis.toInt() + + /*Stack builder home activity*/ + val stackBuilder = TaskStackBuilder.create(this) + + stackBuilder.addParentStack(HomeActivity::class.java) + val homeIntent = Intent(this, HomeActivity::class.java) + //stackBuilder.addNextIntent(homeIntent) + + Log.e("Notification", "Parent added") + /*Final activity to open*/ + var intent: Intent? = null + + val titleString = pushData.pushType.replace("_", " ").toLowerCase() + var title = "" + + val lineScan = Scanner(titleString) + while (lineScan.hasNext()) { + val word: String = lineScan.next() + title += Character.toUpperCase(word[0]).toString() + word.substring(1) + " " + } + + val msg = pushData.message + when (pushData.pushType) { + PushType.CHAT -> { + /* homeIntent.putExtra(EXTRA_TAB, "2") + title = pushData.senderName + intent = Intent(this, ChatDetailActivity::class.java) + .putExtra(USER_ID, pushData.senderId) + .putExtra(USER_NAME, pushData.senderName) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id)*/ + //stackBuilder.addNextIntent(intent) + + intent = Intent(this, ChatDetailActivity::class.java) + .putExtra(USER_ID, pushData.senderId) + .putExtra(USER_NAME, pushData.senderName) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(USER_ID, pushData.senderId) + .putExtra(USER_NAME, pushData.senderName) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + + } + + PushType.CHAT_STARTED -> { + intent = Intent(this, ChatDetailActivity::class.java) + .putExtra(USER_ID, pushData.senderId) + .putExtra(USER_NAME, pushData.senderName) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(USER_ID, pushData.senderId) + .putExtra(USER_NAME, pushData.senderName) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + + } + + PushType.QUESTION_ANSWERED -> { + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.QUESTION_DETAILS) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + PushType.START, PushType.REACHED -> { + + intent = Intent(this, AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + PushType.CANCEL_SERVICE, PushType.START_SERVICE -> { + homeIntent.putExtra(EXTRA_TAB, "1") + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + + PushType.REQUEST_ACCEPTED -> { + homeIntent.putExtra(EXTRA_TAB, "1") + + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.REQUEST_FAILED, + PushType.CANCELED_REQUEST, PushType.RESCHEDULED_REQUEST, PushType.UPCOMING_APPOINTMENT, + PushType.PRESCRIPTION_ADDED, PushType.REQUEST_EXTRA_PAYMENT, PushType.CARE_PLAN_DONE, + -> { + homeIntent.putExtra(EXTRA_TAB, "1") + + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + PushType.BOOKING_RESERVED, PushType.BALANCE_ADDED, PushType.BALANCE_FAILED, + PushType.AMOUNT_RECEIVED, PushType.BALANCE_REFUNDED, PushType.BALANCE_DEDUCTED, + -> { + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, WALLET) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.transaction_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + PushType.WATER_INTAKE -> { + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.WATER_INTAKE) + } + + PushType.CALL -> { + + /* SoundPoolManager.getInstance(this)?.playRinging() + + + + handleInvite(pushData) + + wakeDevice() + userRepository.callStatus(pushData.request_id, pushData.call_id, PushType.CALL_RINGING) + + mHandler.removeCallbacksAndMessages(null) + mHandler.postDelayed({ + handleCanceledCallInvite(pushData) + + userRepository.callStatus(pushData.request_id, pushData.call_id, PushType.CALL_CANCELED) + + mHandler.removeCallbacksAndMessages(null) + }, 40000) + + return*/ + SoundPoolManager.getInstance(this)?.playRinging() + // CallRingManager.playRingtone(this) + if (!isAppVisible) { + createNotification(this, pushData) + wakeDevice() + } else { + val intent = Intent(this, CallingActivity::class.java) + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.action = Constants.ACTION_INCOMING_CALL + intent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, CALL_NOTIFICATION_ID) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + this.startActivity(intent) + } + return + + } + + /* PushType.CALL_CANCELED -> { + handleCanceledCallInvite(pushData) + mHandler.removeCallbacksAndMessages(null) + return + }*/ + + PushType.CALL_CANCELED -> { + SoundPoolManager.getInstance(this)?.stopRinging() + // CallRingManager.stopRingtone() + if (!isAppVisible) { + val notificationManager = NotificationManagerCompat.from(this) + notificationManager.cancel(1) + } else { + val cancelIntent = Intent() + cancelIntent.action = PushType.CALL_CANCELED + cancelIntent.putExtra(EXTRA_REQUEST_ID, pushData.call_id) + LocalBroadcastManager.getInstance(this).sendBroadcast(cancelIntent) + + } +// return + } + } + + stackBuilder.addNextIntent(homeIntent) + if (intent != null) + stackBuilder.addNextIntent(intent) + + + /*val pendingIntent = PendingIntent.getActivity(this, requestID, + intent, PendingIntent.FLAG_UPDATE_CURRENT)*/ + + /*Flags*/ + homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + homeIntent.action = System.currentTimeMillis().toString() + + val pendingIntent = + stackBuilder.getPendingIntent(requestID, PendingIntent.FLAG_MUTABLE /*or PendingIntent.FLAG_UPDATE_CURRENT*/) + + val notificationBuilder = NotificationCompat.Builder(this, channelId) + .setContentTitle(title) //Header + .setContentText(msg) //Content + .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)) + .setAutoCancel(true) + .setDefaults(Notification.DEFAULT_ALL) + .setContentIntent(pendingIntent) + .setSound(Settings.System.DEFAULT_NOTIFICATION_URI) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + notificationBuilder.setSmallIcon(R.drawable.ic_push) + notificationBuilder.color = ContextCompat.getColor(this, R.color.colorAccent) + } else { + notificationBuilder.setSmallIcon(R.mipmap.ic_launcher) + } + + val notificationManager = + getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val mChannel = NotificationChannel( + channelId, getText(R.string.app_name), + NotificationManager.IMPORTANCE_HIGH + ) + + val attributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION) + .build() + + mChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI, attributes) + + notificationManager.createNotificationChannel(mChannel) + } + + if (pushData.pushType == PushType.CHAT && pushData.senderId == ChatDetailActivity.otherUserID && + pushData.request_id == ChatDetailActivity.requestId + ) { + /*Don't generate push*/ + Log.e("", "") + } else { + notificationManager.notify(requestID, notificationBuilder.build()) + } + } + + companion object { + val mHandler = Handler() + } + +/* private fun wakeDevice() { + val pm = getSystemService(Context.POWER_SERVICE) as PowerManager + val wl = pm.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, + "Consultant:" + ) + wl.acquire(25000) + }*/ + + private fun wakeDevice() { + val pm = getSystemService(POWER_SERVICE) as PowerManager + val isScreenOn = + if (Build.VERSION.SDK_INT >= 20) pm.isInteractive else pm.isScreenOn // check if screen is on + if (!isScreenOn) { + val wl = pm.newWakeLock( + PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, + "myApp:notificationLock" + ) + wl.acquire(3000) //set your time in milliseconds + } + } + + private fun handleInvite(pushData: PushData) { + val intent = Intent(this, IncomingCallNotificationService::class.java) + intent.action = Constants.ACTION_INCOMING_CALL + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.putExtra(EXTRA_REQUEST_ID, pushData.call_id) + +// startService(intent) + + /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent) + } else { + startService(intent) + }*/ + LocalBroadcastManager.getInstance(this).registerReceiver(object : BroadcastReceiver(){ + override fun onReceive(context: Context?, intent1: Intent?) { + + val intent = Intent(context, CallingActivity::class.java) + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.action = Constants.ACTION_INCOMING_CALL + intent.putExtra( + Constants.INCOMING_CALL_NOTIFICATION_ID, + CALL_NOTIFICATION_ID + ) + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context?.startActivity(intent) + } + + }, + IntentFilter(Constants.ACTION_INCOMING_CALL) + ) + // this.startActivity(intent) + LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + } + + private fun handleCanceledCallInvite(pushData: PushData) { + SoundPoolManager.getInstance(this)?.stopRinging() + val intent = Intent(this, IncomingCallNotificationService::class.java) + intent.action = Constants.ACTION_CANCEL_CALL + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.putExtra(EXTRA_REQUEST_ID, pushData.call_id) + +// startService(intent) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent) + } else { + startService(intent) + } + } + + @RequiresApi(Build.VERSION_CODES.O) + fun createNotification(context: Context, pushData: PushData) { +// val intent = Intent(context, HomeActivity::class.java) +// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val name: CharSequence = "My Channel" + val description = "Channel description" + val importance = NotificationManager.IMPORTANCE_HIGH + val channel = NotificationChannel(CHANNEL_ID, name, importance) + channel.description = description + val notificationManager = context.getSystemService(NotificationManager::class.java) + notificationManager.createNotificationChannel(channel) + } + + val intentDel = Intent(this, MyNotificationReceiver::class.java) + intentDel.setAction("ACTION_NOTIFICATION_DISMISSED") + intentDel.putExtra("PUSH_DATA_MODEL", pushData) + val pendingIntentDelete = PendingIntent.getBroadcast( + this, + 4, + intentDel, + PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE + ) + + + val intent = Intent(this, CallingActivity::class.java).apply { + putExtra(Constants.INCOMING_CALL_INVITE, pushData) + action = Constants.ACTION_INCOMING_CALL_NOTIFICATION + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) + } + val pendingIntent = PendingIntent.getActivity( + this, + 1, + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + + val builder = NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.ic_call_end_white_24dp) + .setContentTitle(getString(R.string.app_name)) + .setContentText(pushData.sender_name + " is calling.") + .setAutoCancel(false) + .setOngoing(true) + .setDeleteIntent(pendingIntentDelete) + .setContentIntent(getButtonPendingIntentFullScreen(this, pushData)) + .addAction( + android.R.drawable.ic_menu_delete, + "Accept", getButtonPendingIntent(this, pushData) + ) + .addAction( + android.R.drawable.ic_menu_call, + "Decline", getButtonPendingIntentDecline(this, pushData) + ) + + val notificationManager = NotificationManagerCompat.from(context) + val importance = NotificationManager.IMPORTANCE_HIGH + val name: CharSequence = "My Channel" + val channel = NotificationChannel(CHANNEL_ID, name, importance) + notificationManager.createNotificationChannel(channel) + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED + ) { + return + } + notificationManager.notify(1, builder.build()) + } + + private fun getButtonPendingIntentFullScreen( + context: Context, + callInvite: PushData + ): PendingIntent { + val activeCallIntent = Intent(context, CallingActivity::class.java).apply { + putExtra(INCOMING_CALL_INVITE, callInvite) +// putExtra(EXTRA_CALL_NAME, false) + putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, "1") + action = Constants.NEW_CALL + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) + } + return PendingIntent.getActivity( + context, + 1, + activeCallIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + ) + } + + + private fun getButtonPendingIntent(context: Context, callInvite: PushData): PendingIntent { + val activeCallIntent = Intent(this, CallingActivity::class.java) + activeCallIntent.putExtra(INCOMING_CALL_INVITE, callInvite) + activeCallIntent.putExtra(EXTRA_CALL_NAME, true) + activeCallIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + activeCallIntent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, "1") + activeCallIntent.putExtra(CUT_FROM, callInvite.cut_from) + + activeCallIntent.action = Constants.NEW_CALL + return PendingIntent.getActivity( + context, + 0, + activeCallIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + ) + } + + private fun getButtonPendingIntentDecline(context: Context, pushData: PushData): PendingIntent { + val intentData = Intent(context, MyNotificationReceiver::class.java) + intentData.putExtra("PUSH_DATA", "push_data") + intentData.putExtra("PUSH_DATA_MODEL", pushData) + intentData.putExtra(CUT_FROM, pushData.cut_from) + + return PendingIntent.getBroadcast( + context, + 0, + intentData, + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/pushNotifications/MyNotificationReceiver.kt b/app/src/main/java/com/consultantapp/pushNotifications/MyNotificationReceiver.kt new file mode 100644 index 0000000..ffc6603 --- /dev/null +++ b/app/src/main/java/com/consultantapp/pushNotifications/MyNotificationReceiver.kt @@ -0,0 +1,115 @@ +package com.consultantapp.pushNotifications + +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.util.Log +import androidx.annotation.RequiresApi +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import com.consultantapp.R +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.PushData +import com.consultantapp.data.models.responses.CallStatusResponse +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.JitsiClass +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.ui.calling.CallingActivity +import com.consultantapp.ui.calling.Constants +import com.consultantapp.ui.calling.IncomingCallNotificationService +import com.consultantapp.ui.calling.SoundPoolManager +import com.consultantapp.utils.CallRingManager +import com.consultantapp.utils.isConnectedToInternet +import com.consultantapp.utils.longToast +import dagger.android.AndroidInjection +import dagger.android.DaggerBroadcastReceiver +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + + + +class MyNotificationReceiver:BroadcastReceiver() { + private val CHANNEL_ID: String = "MY_NEW_CHANNEL" + + companion object{ + private const val TAG = "MyNotificationReceiver" + } + @Inject + lateinit var webService: WebService + private var pendingIntent: PendingIntent?=null + override fun onReceive(context: Context?, intent: Intent?) { + Log.d(TAG, "onReceive:${intent?.data}") + AndroidInjection.inject(this,context) + if(intent?.getStringExtra("PUSH_DATA").toString() == "push_data"|| intent?.action=="ACTION_NOTIFICATION_DISMISSED"){ + if(CallRingManager.isPlaying()){ + CallRingManager.stopRingtone() + } + + val notificationManager = NotificationManagerCompat.from(context!!) + notificationManager.cancel(1) + val callInvite = intent?.getSerializableExtra( "PUSH_DATA_MODEL") as PushData + val hashMap = HashMap() + hashMap["request_id"] = callInvite?.request_id ?:"" + hashMap["call_id"] = callInvite?.call_id?:"" + hashMap["status"] = PushType.CALL_CANCELED + webService.callStatus(hashMap).enqueue(object : Callback> { + override fun onResponse(call: Call>, + response: Response> + ) { + if (response.isSuccessful) { + Log.e("fcmToken", "Success${response.body()}") + } else { + Log.e("fcmToken", "Faliure") + } + } + + override fun onFailure(call: Call>, t: Throwable) { + Log.e("fcmToken", "faliue 500") + } + }) + }else if (intent?.action == "ACTION_NOTIFICATION_DISMISSED_SERVICE") { + val callInvite = intent.getSerializableExtra("CALL_MODEL") as? JitsiClass + Log.d("MyNotificationReceiver", "onReceive called"+callInvite) + val intentDel = Intent(context, MyNotificationReceiver::class.java).apply { + action = "ACTION_NOTIFICATION_DISMISSED_SERVICE" + putExtra("CALL_MODEL", callInvite) + } + pendingIntent = PendingIntent.getBroadcast(context, 5, intentDel, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE) + if (callInvite != null) { + Log.d("MyNotificationReceiver", "Received CALL_MODEL with ID: ${callInvite.id}") + createNotification(context!!, callInvite) + } else { + Log.e("MyNotificationReceiver", "CALL_MODEL is null") + } + } + } + + private fun createNotification(context: Context, pushData: JitsiClass) { + var notification= NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.ic_call_end_white_24dp) + .setContentTitle(context.getString(R.string.app_name)) + .setContentText("You have an ongoing call") + .setAutoCancel(false) + .setDeleteIntent(pendingIntent) + .setContentIntent(getPendingIntent(context)) + .setOngoing(true) + .build() + + val nNotifyMgr = context.getSystemService(NotificationManager::class.java) as NotificationManager + nNotifyMgr.notify(1, notification) + } + + private fun getPendingIntent(context: Context): PendingIntent { + val intent = Intent(context, CallingActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_SINGLE_TOP + } + return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/pushNotifications/UpdatePushTokenViewModel.kt b/app/src/main/java/com/consultantapp/pushNotifications/UpdatePushTokenViewModel.kt new file mode 100644 index 0000000..be077d4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/pushNotifications/UpdatePushTokenViewModel.kt @@ -0,0 +1,37 @@ +package com.consultantapp.pushNotifications + +import android.service.autofill.UserData +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import javax.inject.Inject + +class UpdatePushTokenViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val updatePushToken by lazy { SingleLiveEvent>() } + + fun updatePushToken(hashMap: HashMap) { + updatePushToken.value = Resource.loading() + + /* webService.numberLogin(hashMap) + .enqueue(object : Callback> { + + override fun onResponse( + call: Call>, + response: Response>) { + if (response.isSuccessful) { + updatePushToken.value = Resource.success(response.body()?.data) + } else { + updatePushToken.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updatePushToken.value = Resource.error(ApiUtils.failure(throwable)) + } + })*/ + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/AppVersionViewModel.kt b/app/src/main/java/com/consultantapp/ui/AppVersionViewModel.kt new file mode 100644 index 0000000..afbf93e --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/AppVersionViewModel.kt @@ -0,0 +1,116 @@ +package com.consultantapp.ui + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.appdetails.AppVersion +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class AppVersionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val checkAppVersion by lazy { SingleLiveEvent>() } + + val clientDetails by lazy { SingleLiveEvent>() } + + val countryCity by lazy { SingleLiveEvent>() } + + val preferences by lazy { SingleLiveEvent>() } + + fun checkAppVersion(hashMap: HashMap) { + checkAppVersion.value = Resource.loading() + + webService + .appVersion(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + checkAppVersion.value =Resource.success(response.body()?.data) + } else { + checkAppVersion.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + checkAppVersion.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } + + fun clientDetails(hashMap: HashMap) { + clientDetails.value = Resource.loading() + + webService + .clientDetails(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + clientDetails.value =Resource.success(response.body()?.data) + } else { + clientDetails.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + clientDetails.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } + + + fun countryCity(hashMap: HashMap) { + countryCity.value = Resource.loading() + + webService.countryData(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + countryCity.value =Resource.success(response.body()?.data) + } else { + countryCity.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + countryCity.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } + + fun preferences(hashMap: HashMap) { + preferences.value = Resource.loading() + + webService.preferences(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + preferences.value =Resource.success(response.body()?.data) + } else { + preferences.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + preferences.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/LoginViewModel.kt b/app/src/main/java/com/consultantapp/ui/LoginViewModel.kt new file mode 100644 index 0000000..5733efb --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/LoginViewModel.kt @@ -0,0 +1,333 @@ +package com.consultantapp.ui + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class LoginViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val login by lazy { SingleLiveEvent>() } + + val updateNumber by lazy { SingleLiveEvent>() } + + val register by lazy { SingleLiveEvent>() } + + val forgotPassword by lazy { SingleLiveEvent>() } + + val changePassword by lazy { SingleLiveEvent>() } + + val updateProfile by lazy { SingleLiveEvent>() } + + val logout by lazy { SingleLiveEvent>() } + + val sendSMS by lazy { SingleLiveEvent>() } + + val pagesLink by lazy { SingleLiveEvent>() } + + val addFamily by lazy { SingleLiveEvent>() } + + val sendEmailOtp by lazy { SingleLiveEvent>() } + + val emailVerify by lazy { SingleLiveEvent>() } + + + fun login(hashMap: HashMap) { + login.value = Resource.loading() + + webService.login(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + login.value = Resource.success(response.body()?.data) + } else { + login.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + login.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun updateNumber(hashMap: HashMap) { + updateNumber.value = Resource.loading() + + webService.updateNumber(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateNumber.value = Resource.success(response.body()?.data) + } else { + updateNumber.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateNumber.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun register(hashMap: HashMap) { + register.value = Resource.loading() + + webService.register(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + register.value = Resource.success(response.body()?.data) + } else { + register.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + register.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun forgotPassword(hashMap: HashMap) { + forgotPassword.value = Resource.loading() + + webService.forgotPassword(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + forgotPassword.value = Resource.success(response.body()?.data) + } else { + forgotPassword.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + forgotPassword.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun changePassword(hashMap: HashMap) { + changePassword.value = Resource.loading() + + webService.changePassword(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + changePassword.value = Resource.success(response.body()?.data) + } else { + changePassword.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + changePassword.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateProfile(hashMap: HashMap) { + updateProfile.value = Resource.loading() + + webService.updateProfile(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateProfile.value = Resource.success(response.body()?.data) + } else { + updateProfile.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateProfile.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun logout() { + logout.value = Resource.loading() + + webService.logout() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + logout.value = Resource.success(response.body()?.data) + } else { + logout.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + logout.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun sendSms(hashMap: HashMap) { + sendSMS.value = Resource.loading() + + webService.sendSMS(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + sendSMS.value = Resource.success(response.body()?.data) + } else { + sendSMS.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + sendSMS.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getPages() { + pagesLink.value = Resource.loading() + + webService.getPages() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + pagesLink.value = Resource.success(response.body()?.data) + } else { + pagesLink.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + pagesLink.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addFamily(hashMap: HashMap) { + addFamily.value = Resource.loading() + + webService.addFamily(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addFamily.value = Resource.success(response.body()?.data) + } else { + addFamily.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addFamily.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun sendEmailOtp(hashMap: HashMap) { + sendEmailOtp.value = Resource.loading() + + webService.sendEmailOtp(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + sendEmailOtp.value = Resource.success(response.body()?.data) + } else { + sendEmailOtp.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + sendEmailOtp.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun emailVerify(hashMap: HashMap) { + emailVerify.value = Resource.loading() + + webService.emailVerify(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + emailVerify.value = Resource.success(response.body()?.data) + } else { + emailVerify.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + emailVerify.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/SplashActivity.kt b/app/src/main/java/com/consultantapp/ui/SplashActivity.kt new file mode 100644 index 0000000..e509699 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/SplashActivity.kt @@ -0,0 +1,340 @@ +package com.consultantapp.ui + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.Uri +import android.os.Bundle +import android.util.Log +import androidx.appcompat.app.AlertDialog +import androidx.core.app.TaskStackBuilder +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.* +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivitySplashBinding +import com.consultantapp.ui.dashboard.HomeActivity +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.walkthrough.WalkThroughFragment.Companion.WALK_THROUGH_SCREEN +import com.consultantapp.utils.* +import com.google.firebase.dynamiclinks.FirebaseDynamicLinks +import dagger.android.support.DaggerAppCompatActivity +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + + +class SplashActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var viewModel: AppVersionViewModel + + private lateinit var binding: ActivitySplashBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_splash) + + initialise() + listeners() + bindObservers() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[AppVersionViewModel::class.java] + + //prefsManager.save(USER_LANGUAGE, "en") + hitApi() + } + + private fun hitApi() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["app_type"] = "1"/*APP_TYPE 1: User App, 2: Doctor App*/ + hashMap["device_type"] = "2"/*ANDROID*/ + viewModel.clientDetails(hashMap) + } + } + + + private fun listeners() { + binding.ivDoc.setOnClickListener { + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) { + val appPackageName = getString(R.string.app_application_id) + + try { + startActivity(packageManager.getLaunchIntentForPackage(appPackageName)) + } catch (e: Exception) { + try { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=$appPackageName") + ) + ) + } catch (anfe: android.content.ActivityNotFoundException) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(PLAY_STORE + appPackageName) + ) + ) + } + } + } + } + + binding.ivPatient.setOnClickListener { + prefsManager.save(USER_TYPE, true) + checkDeepLink() + } + } + + private fun bindObservers() { + viewModel.clientDetails.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + val appDetails = it.data + /*Handle feature keys*/ + appDetails?.client_features?.forEach { + when (it.name?.toLowerCase(Locale.getDefault())) { + ClientFeatures.ADDRESS.toLowerCase(Locale.getDefault()) -> + appDetails.clientFeaturesKeys.isAddress = true + } + } + + + prefsManager.remove(APP_DETAILS) + prefsManager.save(APP_DETAILS, appDetails) + appClientDetails = userRepository.getAppSetting() + + /*Check App Version*/ + val hashMap = HashMap() + hashMap["app_type"] = "1"/*APP_TYPE 1: User App, 2: Doctor App*/ + hashMap["device_type"] = "2"/*ANDROID*/ + hashMap["current_version"] = getVersion(this).versionCode.toString() + + viewModel.checkAppVersion(hashMap) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModel.checkAppVersion.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + when (it.data?.update_type) { + AppUpdateType.HARD_UPDATE -> hardUpdate() + AppUpdateType.SOFT_UPDATE -> softUpdate() + else -> checkDeepLink() + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + private fun hardUpdate() { + AlertDialog.Builder(this) + .setCancelable(false) + .setTitle(getString(R.string.update)) + .setMessage(getString(R.string.update_desc, getString(R.string.app_name))) + .setPositiveButton(getString(R.string.update)) { dialog, which -> + updatePlayStore() + hardUpdate() + }.show() + } + + private fun updatePlayStore() { + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) { + try { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=${BuildConfig.APPLICATION_ID}") + ) + ) + } catch (anfe: android.content.ActivityNotFoundException) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(PLAY_STORE + BuildConfig.APPLICATION_ID) + ) + ) + } + } + } + + private fun softUpdate() { + AlertDialog.Builder(this) + .setCancelable(false) + .setTitle(getString(R.string.update)) + .setMessage(getString(R.string.update_desc, getString(R.string.app_name))) + .setPositiveButton(getString(R.string.update)) { dialog, which -> + updatePlayStore() + softUpdate() + }.setNegativeButton(getString(R.string.skip)) { dialog, which -> + checkDeepLink() + }.show() + } + + private fun goNormalSteps() { + startActivity(Intent(this, HomeActivity::class.java)) + finish() + } + + object AppUpdateType { + const val HARD_UPDATE = 1 + const val SOFT_UPDATE = 2 + } + + + private fun checkDeepLink() { + /*Check if Deep Link*/ + FirebaseDynamicLinks.getInstance() + .getDynamicLink((intent ?: Intent())) + .addOnSuccessListener(this) { pendingDynamicLinkData -> + // Get deep link from result (may be null if no link is found) + val deepLink: Uri? + if (pendingDynamicLinkData != null) { + deepLink = pendingDynamicLinkData.link + openHomeActivity(deepLink) + } else { + openHomeActivity(null) + } + } + .addOnFailureListener(this) { _ -> + openHomeActivity(null) + } + } + + private fun openHomeActivity(deepLink: Uri?) { + when { + appFeatures.needLanguageScreen && userRepository.getUserLanguage().isEmpty() -> { + startActivityForResult( + Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.LANGUAGE_SCREEN), + AppRequestCode.LANGUAGE_SCREENS + ) + } + appFeatures.needUserDoctorScreen && !prefsManager.getBoolean(USER_TYPE, false) -> { + binding.clUserType.visible() + } + appFeatures.needWalkThrough && !prefsManager.getBoolean(WALK_THROUGH_SCREEN, false) -> { + binding.clUserType.gone() + startActivityForResult( + Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, WALK_THROUGH_SCREEN), + AppRequestCode.WALK_THROUGH_SCREENS + ) + } + else -> { + + val stackBuilder = TaskStackBuilder.create(this) + + stackBuilder.addParentStack(HomeActivity::class.java) + val homeIntent = Intent(this, HomeActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + stackBuilder.addNextIntent(homeIntent) + + if (deepLink?.getQueryParameter("id") != null) { + var intent = Intent(this, DoctorDetailActivity::class.java) + if (deepLink.toString().contains(DeepLink.USER_PROFILE)) { + intent = Intent(this, DoctorDetailActivity::class.java) + intent.putExtra( + DoctorDetailActivity.DOCTOR_ID, + deepLink.getQueryParameter("id") + ) + } + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + stackBuilder.addNextIntent(intent) + } + + stackBuilder.startActivities() + finish() + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.WALK_THROUGH_SCREENS -> { + checkDeepLink() + } + AppRequestCode.LANGUAGE_SCREENS -> { + checkDeepLink() + } + } + } + } + + companion object { + const val USER_TYPE = "user type" + } + + override fun onResume() { + super.onResume() + unregisterReceiver() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + val intentFilter = IntentFilter() + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(this) + .registerReceiver(refreshData, intentFilter) + + } + + private fun unregisterReceiver() { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshData) + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + NetworkIssueFragment.NETWORK_ISSUE -> + hitApi() + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/adapter/CheckItemAdapter.kt b/app/src/main/java/com/consultantapp/ui/adapter/CheckItemAdapter.kt new file mode 100644 index 0000000..a9b34ca --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/adapter/CheckItemAdapter.kt @@ -0,0 +1,69 @@ +package com.consultantapp.ui.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.databinding.RvItemCheckBinding +import com.consultantapp.ui.dashboard.home.addfamily.AddFamilyFragment +import com.consultantapp.ui.dashboard.home.healthtool.pregnancycalculator.PregnancyCalculatorFragment + + +class CheckItemAdapter(private val fragment: Fragment, private val isMultiSelect: Boolean, + private val items: ArrayList) : RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_check, parent, false)) + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: RvItemCheckBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Filter) = with(binding) { + + tvName.text = item.option_name ?: item.name + + if (item.isSelected) { + tvName.setBackgroundResource(R.drawable.drawable_theme_60) + tvName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorWhite)) + } else { + tvName.setBackgroundResource(R.drawable.drawable_stroke_inactive) + tvName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorBlack)) + } + + clMain.setOnClickListener { + val pos = adapterPosition + + /*Fragment Listeners*/ + if (fragment is AddFamilyFragment) + fragment.itemRelationClick(pos) + else if (fragment is PregnancyCalculatorFragment) { + if (items.size == 4 && !items[pos].isSelected) + fragment.itemRelationClick(pos) + } + + if (isMultiSelect) + items[pos].isSelected = !items[pos].isSelected + else + items.forEachIndexed { index, filterOption -> + items[index].isSelected = pos == index + } + notifyDataSetChanged() + } + } + } +} + diff --git a/app/src/main/java/com/consultantapp/ui/adapter/CommonFragmentPagerAdapter.kt b/app/src/main/java/com/consultantapp/ui/adapter/CommonFragmentPagerAdapter.kt new file mode 100644 index 0000000..28de79d --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/adapter/CommonFragmentPagerAdapter.kt @@ -0,0 +1,42 @@ +package com.consultantapp.ui.adapter + +import android.os.Parcelable +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter + + +class CommonFragmentPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { + + val fragments = mutableListOf() + private val titles = mutableListOf() + + + override fun getItem(position: Int): Fragment { + return fragments[position] + } + + override fun getCount(): Int { + return fragments.size + } + + override fun getPageTitle(position: Int): CharSequence { + return titles[position] + } + + fun addTab(title: String, fragment: Fragment): CommonFragmentPagerAdapter { + fragments.add(fragment) + titles.add(title) + + return this + } + + fun clear() { + fragments.clear() + titles.clear() + } + + override fun saveState(): Parcelable? { + return null + } +} diff --git a/app/src/main/java/com/consultantapp/ui/adapter/ImagesAdapter.kt b/app/src/main/java/com/consultantapp/ui/adapter/ImagesAdapter.kt new file mode 100644 index 0000000..9efe448 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/adapter/ImagesAdapter.kt @@ -0,0 +1,80 @@ +package com.consultantapp.ui.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.databinding.RvItemImageBinding +import com.consultantapp.ui.dashboard.doctor.symptom.SymptomDetailFragment +import com.consultantapp.utils.DocType +import com.consultantapp.utils.gone +import com.consultantapp.utils.visible + + +class ImagesAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + val MAX_ITEM = 3 + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + if (items.isEmpty() || (position == 0 && items.size < MAX_ITEM)) + holder.bind(null) + else if (items.size == MAX_ITEM) + holder.bind(items[position]) + else + holder.bind(items[position - 1]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_image, parent, false)) + + } + + override fun getItemCount(): Int = if (items.size == MAX_ITEM) items.size else items.size + 1 + + inner class ViewHolder(val binding: RvItemImageBinding) : + RecyclerView.ViewHolder(binding.root) { + + val context = binding.root.context + + init { + binding.ivImage.setOnClickListener { + if (items.size < MAX_ITEM && bindingAdapterPosition == 0) { + if (fragment is SymptomDetailFragment) + fragment.clickItem() + } + } + + binding.ivDelete.setOnClickListener { + if (items.size == MAX_ITEM) + items.removeAt(bindingAdapterPosition) + else + items.removeAt(bindingAdapterPosition - 1) + + notifyDataSetChanged() + } + } + + fun bind(item: DocImage?) = with(binding) { + ivImage.setBackgroundResource(R.drawable.drawable_grey_stroke) + if (items.size < MAX_ITEM && bindingAdapterPosition == 0) { + ivImage.setImageResource(R.drawable.ic_camera) + ivDelete.gone() + } else { + if (item?.type == DocType.PDF) { + ivImage.setBackgroundResource(R.drawable.ic_pdf) + Glide.with(context).load("").into(ivImage) + }else + Glide.with(context).load(item?.imageFile).into(ivImage) + ivDelete.visible() + } + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/adapter/ImagesDocumentAdapter.kt b/app/src/main/java/com/consultantapp/ui/adapter/ImagesDocumentAdapter.kt new file mode 100644 index 0000000..8de7c48 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/adapter/ImagesDocumentAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantapp.ui.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.databinding.RvItemImageBinding +import com.consultantapp.utils.* + + +class ImagesDocumentAdapter(private val fragment: Fragment, private val items: ArrayList) + : RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_image, parent, false)) + + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemImageBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + val heightOfImage = pxFromDp(fragment.requireContext(), 100f).toInt() + binding.ivImage.layoutParams.height = heightOfImage + binding.ivImage.layoutParams.width = heightOfImage + + binding.ivImage.setOnClickListener { + val item = items[adapterPosition] + when (item.type) { + DocType.IMAGE -> { + val itemImages = ArrayList() + itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, item.image)) + viewImageFull(fragment.requireActivity(), itemImages, adapterPosition) + } + DocType.PDF -> { + val link = getImageBaseUrl(ImageFolder.PDF, item.image) + openPdf(fragment.requireActivity(), link) + } + } + } + } + + + fun bind(item: DocImage?) = with(binding) { + + if (item?.type == DocType.PDF) { + ivImage.setBackgroundResource(R.drawable.ic_pdf) + Glide.with(binding.root.context).load("").into(ivImage) + } else + loadImage("tag",binding.ivImage, item?.image, R.drawable.image_placeholder) + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/calling/CallViewModel.kt b/app/src/main/java/com/consultantapp/ui/calling/CallViewModel.kt new file mode 100644 index 0000000..59e3a96 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/calling/CallViewModel.kt @@ -0,0 +1,43 @@ +package com.consultantapp.ui.calling + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class CallViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val callStatus by lazy { SingleLiveEvent>() } + + fun callStatus(hashMap: HashMap) { + callStatus.value = Resource.loading() + + webService.callStatus(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + callStatus.value = Resource.success(response.body()?.data) + } else { + callStatus.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + callStatus.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/calling/CallingActivity.kt b/app/src/main/java/com/consultantapp/ui/calling/CallingActivity.kt new file mode 100644 index 0000000..d52ac07 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/calling/CallingActivity.kt @@ -0,0 +1,268 @@ +package com.consultantapp.ui.calling + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.media.AudioManager +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import android.os.Build +import android.util.Log +import androidx.core.app.NotificationManagerCompat +import com.consultantapp.data.models.PushData +import com.consultantapp.data.models.responses.JitsiClass +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityCallingBinding +import com.consultantapp.pushNotifications.MessagingService +import com.consultantapp.ui.jitsimeet.JitsiActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + + +class CallingActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + lateinit var binding: ActivityCallingBinding + + private lateinit var callInvite: PushData + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: CallViewModel + + private var callStatus = "" + + private var audioManager: AudioManager? = null + + private var isReceiverRegistered = false + + private var callId: String? = null + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + listeners() + bindObservers() + + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + window.statusBarColor = Color.TRANSPARENT + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_calling) + + // These flags ensure that the activity can be launched when the screen is locked. + window.addFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + ) + + viewModel = ViewModelProvider(this, viewModelFactory)[CallViewModel::class.java] + progressDialog = ProgressDialog(this) + + + /* + * Needed for setting/abandoning audio focus during a call + */ + audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager + audioManager?.isSpeakerphoneOn = true + + callInvite = intent.getSerializableExtra(Constants.INCOMING_CALL_INVITE) as PushData + callId = callInvite.call_id + + binding.tvName.text = callInvite.sender_name + binding.tvDesc.text = callInvite.vendor_category_name + loadImage("profile",binding.ivPic, callInvite.sender_image, R.drawable.ic_profile_placeholder) + + binding.tvTime.text = "${ + DateUtils.dateTimeFormatFromUTC( + DateFormat.DATE_TIME_FORMAT, + callInvite?.request_time + ) + }" + + binding.tvCallType.text = callInvite.service_type + + /*If opening from push*/ + if (intent.hasExtra(EXTRA_CALL_NAME)) { + hitApiCall(PushType.CALL_ACCEPTED) + } + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + + if (intent?.action == Constants.ACTION_CANCEL_CALL) { + if (intent.hasExtra(EXTRA_REQUEST_ID) && intent.getStringExtra(EXTRA_REQUEST_ID) == callId) { + clearNotification() + finish() + } + } + } + + private fun listeners() { + binding.ivPickCall.setOnClickListener { + hitApiCall(PushType.CALL_ACCEPTED) + } + + binding.ivRejectCall.setOnClickListener { + hitApiCall(PushType.CALL_CANCELED) + } + } + + private fun hitApiCall(status: String) { + MessagingService.mHandler.removeCallbacksAndMessages(null) + + callStatus = status + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["request_id"] = callInvite.request_id + hashMap["call_id"] = callInvite.call_id + hashMap["status"] = callStatus + viewModel.callStatus(hashMap) + + if (status == PushType.CALL_ACCEPTED) + longToast(getString(R.string.connecting)) + else if (status == PushType.CALL_CANCELED) + longToast(getString(R.string.disconnecting)) + + disableButton(binding.ivPickCall) + disableButton(binding.ivRejectCall) + } + } + + override fun onBackPressed() { + } + + private fun bindObservers() { + viewModel.callStatus.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + if (callStatus == PushType.CALL_ACCEPTED) { + + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = callInvite.request_id + jitsiClass.call_id = callInvite.call_id + jitsiClass.callType = callInvite.main_service_type + jitsiClass.name = "" + + val intentJitsi = Intent(this, JitsiActivity::class.java) + intentJitsi.putExtra(EXTRA_CALL_NAME, jitsiClass) + startActivity(intentJitsi) + } + clearNotification() + finish() + + } + + Status.ERROR -> { + progressDialog.setLoading(false) + clearNotification() + finish() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun clearNotification() { + SoundPoolManager.getInstance(this)?.stopRinging() + SoundPoolManager.getInstance(this)?.release() + val intent = Intent(this, IncomingCallNotificationService::class.java) + intent.action = Constants.CLEAR_NOTIFICATION + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + + /* if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent) + } + + else { + startService(intent) + }*/ + startService(intent) + } + + override fun onDestroy() { + SoundPoolManager.getInstance(this)?.release() + super.onDestroy() + unregisterReceiver() + val notificationManager = NotificationManagerCompat.from(this) + notificationManager.cancel(1) + if(CallRingManager.isPlaying()){ + CallRingManager.stopRingtone() + } + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(Constants.ACTION_INCOMING_CALL) + intentFilter.addAction(Constants.ACTION_CANCEL_CALL) + LocalBroadcastManager.getInstance(this).registerReceiver( + callCancelledReceiver, intentFilter + ) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(callCancelledReceiver) + isReceiverRegistered = false + } + } + + private val callCancelledReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Constants.ACTION_CANCEL_CALL) { + if (intent.hasExtra(EXTRA_REQUEST_ID) && intent.getStringExtra(EXTRA_REQUEST_ID) == callId) { + clearNotification() + finish() + } + } + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/calling/Constants.kt b/app/src/main/java/com/consultantapp/ui/calling/Constants.kt new file mode 100644 index 0000000..aa603b0 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/calling/Constants.kt @@ -0,0 +1,20 @@ +package com.consultantapp.ui.calling + +object Constants { + val NEW_CALL ="NEW_CALL" + const val CALL_SID_KEY = "CALL_SID" + const val VOICE_CHANNEL_LOW_IMPORTANCE = "notification-channel-low-importance" + const val VOICE_CHANNEL_HIGH_IMPORTANCE = "notification-channel-high-importance" + const val INCOMING_CALL_INVITE = "INCOMING_CALL_INVITE" + const val CANCELLED_CALL_INVITE = "CANCELLED_CALL_INVITE" + const val INCOMING_CALL_NOTIFICATION_ID = "INCOMING_CALL_NOTIFICATION_ID" + const val ACTION_ACCEPT = "ACTION_ACCEPT" + const val ACTION_REJECT = "ACTION_REJECT" + const val ACTION_INCOMING_CALL_NOTIFICATION = "ACTION_INCOMING_CALL_NOTIFICATION" + const val ACTION_INCOMING_CALL = "ACTION_INCOMING_CALL" + const val ACTION_CANCEL_CALL = "ACTION_CANCEL_CALL" + const val CLEAR_NOTIFICATION = "CLEAR_NOTIFICATION" + const val REQUEST_ACCEPTED = "REQUEST_ACCEPTED" + + const val CALL_NOTIFICATION_ID = 1000000 +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/calling/IncomingCallNotificationService.kt b/app/src/main/java/com/consultantapp/ui/calling/IncomingCallNotificationService.kt new file mode 100644 index 0000000..b0cfce5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/calling/IncomingCallNotificationService.kt @@ -0,0 +1,331 @@ +package com.consultantapp.ui.calling + +import android.annotation.TargetApi +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.media.AudioAttributes +import android.media.RingtoneManager +import android.os.Build +import android.os.Bundle +import android.os.IBinder +import android.provider.Settings +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.PushData +import com.consultantapp.data.network.PushType +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.pushNotifications.IncomingCallBroadcastReceiver +import com.consultantapp.pushNotifications.MessagingService +import com.consultantapp.ui.calling.Constants.CALL_NOTIFICATION_ID +import com.consultantapp.utils.EXTRA_CALL_NAME +import dagger.android.DaggerService +import javax.inject.Inject + + +class IncomingCallNotificationService : DaggerService() { + + @Inject + lateinit var userRepository: UserRepository + + private val notificationId = CALL_NOTIFICATION_ID + + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + val action = intent.action + if (action != null) { + val callInvite = intent.getSerializableExtra(Constants.INCOMING_CALL_INVITE) as PushData + when (action) { + Constants.ACTION_INCOMING_CALL -> handleIncomingCall( + callInvite + ) + + Constants.ACTION_ACCEPT -> accept( + callInvite + ) + + Constants.ACTION_REJECT -> reject(callInvite) + Constants.ACTION_CANCEL_CALL -> handleCancelledCall( + intent + ) + + Constants.CLEAR_NOTIFICATION -> endForeground() + else -> { + } + } + } + return START_NOT_STICKY + } + + override fun onBind(intent: Intent): IBinder? { + return null + } + + private fun createNotification(callInvite: PushData, channelImportance: Int): Notification { + val intent = Intent(this, CallingActivity::class.java) + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + intent.action = Constants.ACTION_INCOMING_CALL_NOTIFICATION + + intent.putExtra( + Constants.INCOMING_CALL_NOTIFICATION_ID, + notificationId + ) + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + val pendingIntent = PendingIntent.getActivity( + this, + notificationId, + intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + /* + * Pass the notification id and call sid to use as an identifier to cancel the + * notification later + */ + val extras = Bundle() + extras.putString(Constants.CALL_SID_KEY, callInvite.request_id) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + buildNotification( + callInvite.sender_name + " is calling.", + pendingIntent, + extras, + callInvite, + createChannel(channelImportance) + ) + } else { + NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.ic_call_end_white_24dp) + .setContentTitle(getString(R.string.app_name)) + .setContentText(callInvite.sender_name + " is calling.") + .setAutoCancel(true) + .setExtras(extras) + .setContentIntent(pendingIntent) + .setGroup("test_app_notification") + .setColor(Color.rgb(214, 10, 37)).build() + } + } + + /** + * Build a notification. + * + * @param text the text of the notification + * @param pendingIntent the body, pending intent for the notification + * @param extras extras passed with the notification + * @return the builder + */ + /* @TargetApi(Build.VERSION_CODES.O)*/ + private fun buildNotification( + text: String, pendingIntent: PendingIntent, extras: Bundle, + callInvite: PushData, + channelId: String, + ): Notification { + val rejectIntent = + Intent(applicationContext, IncomingCallNotificationService::class.java) + rejectIntent.action = Constants.ACTION_REJECT + rejectIntent.putExtra( + Constants.INCOMING_CALL_INVITE, + callInvite + ) + rejectIntent.putExtra( + Constants.INCOMING_CALL_NOTIFICATION_ID, + notificationId + ) + val piRejectIntent = PendingIntent.getService( + applicationContext, + 0, rejectIntent, + PendingIntent.FLAG_MUTABLE /*or PendingIntent.FLAG_UPDATE_CURRENT*/ + ) + val acceptIntent = + Intent(applicationContext, CallingActivity::class.java) + acceptIntent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + acceptIntent.putExtra(EXTRA_CALL_NAME, true) +// acceptIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + acceptIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + acceptIntent.putExtra( + Constants.INCOMING_CALL_INVITE, + callInvite + ) + acceptIntent.putExtra( + Constants.INCOMING_CALL_NOTIFICATION_ID, + notificationId + ) + acceptIntent.action = Constants.ACTION_ACCEPT + + val piAcceptIntent = PendingIntent.getActivity( + applicationContext, + 0, acceptIntent, + PendingIntent.FLAG_MUTABLE /*or PendingIntent.FLAG_UPDATE_CURRENT*/ + ) + + //SoundPoolManager.getInstance(this)?.release() +// SoundPoolManager.getInstance(this)?.playRinging() + + //Define sound URI + val soundUri = + RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE) + val builder = + Notification.Builder(applicationContext, channelId) + .setSmallIcon(R.drawable.ic_call_end_white_24dp) + .setContentTitle(getString(R.string.app_name)) + .setContentText(text) + .setCategory(Notification.CATEGORY_CALL) + .setFullScreenIntent(pendingIntent, true) + .setExtras(extras) + .setAutoCancel(true) + .addAction( + android.R.drawable.ic_menu_delete, + getString(R.string.decline), piRejectIntent + ) + .addAction( + android.R.drawable.ic_menu_call, + getString(R.string.answer), piAcceptIntent + ) + .setFullScreenIntent(pendingIntent, true) + + return builder.build() + } + + /*@TargetApi(Build.VERSION_CODES.O)*/ + private fun createChannel(channelImportance: Int): String { + var callInviteChannel = NotificationChannel( + Constants.VOICE_CHANNEL_HIGH_IMPORTANCE, + "Primary Voice Channel", NotificationManager.IMPORTANCE_HIGH + ) + var channelId = + Constants.VOICE_CHANNEL_HIGH_IMPORTANCE + if (channelImportance == NotificationManager.IMPORTANCE_LOW) { + callInviteChannel = NotificationChannel( + Constants.VOICE_CHANNEL_LOW_IMPORTANCE, + "Primary Voice Channel", NotificationManager.IMPORTANCE_LOW + ) + channelId = Constants.VOICE_CHANNEL_LOW_IMPORTANCE + } + callInviteChannel.lightColor = Color.GREEN + + val attributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION) + .build() + + callInviteChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI, attributes) + + callInviteChannel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE + val notificationManager = + getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.createNotificationChannel(callInviteChannel) + return channelId + } + + private fun accept(callInvite: PushData) { + endForeground() + val activeCallIntent = Intent(this, CallingActivity::class.java) + activeCallIntent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + activeCallIntent.putExtra(EXTRA_CALL_NAME, true) + activeCallIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + activeCallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + activeCallIntent.putExtra( + Constants.INCOMING_CALL_INVITE, + callInvite + ) + activeCallIntent.putExtra( + Constants.INCOMING_CALL_NOTIFICATION_ID, + notificationId + ) + activeCallIntent.action = Constants.ACTION_ACCEPT + startActivity(activeCallIntent) + } + + private fun reject(callInvite: PushData) { + endForeground() + SoundPoolManager.getInstance(this)?.stopRinging() + + /*Handle if cancelled from push*/ + MessagingService.mHandler.removeCallbacksAndMessages(null) + userRepository.callStatus(callInvite.request_id, callInvite.call_id, PushType.CALL_CANCELED) + + val intent = Intent(this, IncomingCallNotificationService::class.java) + intent.action = Constants.ACTION_CANCEL_CALL + + LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + //callInvite.reject(getApplicationContext()); + } + + private fun handleCancelledCall(intent: Intent) { + endForeground() + LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + } + + private fun handleIncomingCall(callInvite: PushData) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setCallInProgressNotification(callInvite) + } + sendCallInviteToActivity(callInvite) + } + + private fun endForeground() { + stopForeground(true) + } + + /* @TargetApi(Build.VERSION_CODES.O)*/ + private fun setCallInProgressNotification(callInvite: PushData) { + if (isAppVisible) { + Log.i(TAG, "setCallInProgressNotification - app is visible.") + try{ + startForeground(notificationId, createNotification(callInvite, NotificationManager.IMPORTANCE_LOW)) + }catch (ex: Exception){ + Log.e("setCallInProgressNotification", ex.message.toString()) + } + + } else { + Log.i(TAG, "setCallInProgressNotification - app is NOT visible.") + try { + startForeground(notificationId, createNotification(callInvite, NotificationManager.IMPORTANCE_HIGH)) + }catch (ex:Exception){ + Log.e("setCallInProgressNotification", ex.message.toString()) + } + + } + } + + /* + * Send the CallInvite to the VoiceActivity. Start the activity if it is not running already. + */ + private fun sendCallInviteToActivity(callInvite: PushData) { + /* if (Build.VERSION.SDK_INT >= 29 && !isAppVisible) { + return + }*/ + val intent = Intent(this, CallingActivity::class.java) + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + intent.action = Constants.ACTION_INCOMING_CALL + intent.putExtra( + Constants.INCOMING_CALL_NOTIFICATION_ID, + notificationId + ) + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + LocalBroadcastManager.getInstance(this).registerReceiver(IncomingCallBroadcastReceiver(), + IntentFilter(Constants.ACTION_INCOMING_CALL)) + // this.startActivity(intent) + LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + } + + private val isAppVisible: Boolean + private get() = ProcessLifecycleOwner + .get() + .lifecycle + .currentState + .isAtLeast(Lifecycle.State.STARTED) + + companion object { + private val TAG = IncomingCallNotificationService::class.java.simpleName + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/calling/SoundPoolManager.kt b/app/src/main/java/com/consultantapp/ui/calling/SoundPoolManager.kt new file mode 100644 index 0000000..ca1f337 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/calling/SoundPoolManager.kt @@ -0,0 +1,94 @@ +package com.consultantapp.ui.calling + +import android.content.Context +import android.media.AudioManager +import android.media.SoundPool +import android.util.Log +import com.consultantapp.R + +class SoundPoolManager private constructor(context: Context) { + private var playing = false + private var loaded = false + private var playingCalled = false + private val volume: Float + private var soundPool: SoundPool? + private val ringingSoundId: Int + private var ringingStreamId = 0 + private val disconnectSoundId: Int + + fun playRinging() { + try { + if (loaded && !playing) { + ringingStreamId = soundPool?.play(ringingSoundId, volume, volume, 1, 1, 1.0f) ?:0 + playing = true + Log.e("SoundPoolManager", "playing") + } else { + Log.e("SoundPoolManager", "playingCalled") + playingCalled = true + } + } catch (ignored: Exception) { + Log.e("SoundPoolManager", ignored.toString()) + } + } + + fun stopRinging() { + if (playing) { + soundPool?.stop(ringingStreamId) + playing = false + } + } + + fun playDisconnect() { + if (loaded && !playing) { + soundPool?.play(disconnectSoundId, volume, volume, 1, 1, 1f) + playing = false + } + } + + fun release() { + if (soundPool != null) { + soundPool?.unload(ringingSoundId) + soundPool?.unload(disconnectSoundId) + soundPool?.release() + soundPool = null + } + instance = null + + Log.e("SoundPoolManager", "release") + } + + companion object { + private var instance: SoundPoolManager? = null + fun getInstance(context: Context): SoundPoolManager? { + if (instance == null) { + instance = SoundPoolManager(context) + Log.e("SoundPoolManager", "instance") + } + return instance + } + } + + init { + + // AudioManager audio settings for adjusting the volume + val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager + val actualVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat() + val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat() + volume = actualVolume / maxVolume + + // Load the sounds + val maxStreams = 1 + soundPool = SoundPool.Builder().setMaxStreams(maxStreams).build() + + ringingSoundId = soundPool?.load(context, R.raw.incoming_call, 1) ?:0 + disconnectSoundId = soundPool?.load(context, R.raw.disconnect, 1)?:0 + + soundPool?.setOnLoadCompleteListener { soundPool: SoundPool?, sampleId: Int, status: Int -> + loaded = true + if (playingCalled) { + playRinging() + playingCalled = false + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/classes/CategoriesFragment.kt b/app/src/main/java/com/consultantapp/ui/classes/CategoriesFragment.kt new file mode 100644 index 0000000..9616a3a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/classes/CategoriesFragment.kt @@ -0,0 +1,262 @@ +package com.consultantapp.ui.classes + +import android.app.Activity +import android.app.AlertDialog +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.dashboard.CategoriesAdapter +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.dashboard.doctor.schedule.request.BottomServiceFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CLASSES_PAGE +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class CategoriesFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private var items = ArrayList() + + private lateinit var adapter: CategoriesAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate( + inflater, + R.layout.activity_listing_toolbar, + container, + false + ) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + //binding.tvHeader.gone() + if (requireActivity().intent.getStringExtra(EXTRA_NAME) == DrawerActivity.MY_QUESTION) + binding.tvHeader.text = getString(R.string.categories) + else + binding.tvHeader.text = "${getString(R.string.meet)} ${getString(R.string.with_experts)}" + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + } + + private fun setAdapter() { + /* val layoutManager = GridLayoutManager(activity, 6) + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (items.size % 2 != 0) { + when (position) { + items.size - 3, items.size - 2, items.size - 1 -> + 2 + else -> 3 + } + } else 3 + } + } + binding.rvListing.layoutManager = layoutManager +*/ + binding.rvListing.layoutManager = GridLayoutManager(requireContext(), 2) + adapter = CategoriesAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + isLoadingMoreItems = true + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as GridLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.categories(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.categories.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.classes_category ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + } + + + fun clickItem(item: Categories?) { + when { + userRepository.getUser() == null -> { + val fragment = WelcomeFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + item?.is_subcategory == true -> { + registerActivityResult.launch(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.SUB_CATEGORY) + .putExtra(EXTRA_NAME, requireActivity().intent.getStringExtra(EXTRA_NAME)) + .putExtra(CLASSES_PAGE, requireActivity().intent?.getBooleanExtra(CLASSES_PAGE, false)) + .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, item)) + } + requireActivity().intent.getStringExtra(EXTRA_NAME) == DrawerActivity.MY_QUESTION -> { + registerActivityResult.launch(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ASK_QUESTION) + .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, item)) + } + requireActivity().intent.getBooleanExtra(CLASSES_PAGE, false) -> { + if (userRepository.getUser() == null) { + val fragment = WelcomeFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } else { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES) + .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, item)) + } + } + BuildConfig.FLAVOR == "nurseLynx"->{ + val fragment = BottomServiceFragment(item) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + else -> { + startActivity(Intent(requireContext(), DoctorListActivity::class.java) + .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, item)) + } + } + } + + + + fun showInformationDialog(item: Categories?) { + AlertDialog.Builder(context) + .setTitle(item?.name) + .setMessage(item?.description) + .setPositiveButton(R.string.ok) { dialog, which -> + dialog.dismiss() + } + .setCancelable(true) + .show() + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/classes/ClassesAdapter.kt b/app/src/main/java/com/consultantapp/ui/classes/ClassesAdapter.kt new file mode 100644 index 0000000..157b159 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/classes/ClassesAdapter.kt @@ -0,0 +1,117 @@ +package com.consultantapp.ui.classes + +import android.app.Activity +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.ClassData +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemClassBinding +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* + + +class ClassesAdapter( + private val fragment: Fragment?, private val activity: Activity?, + private val items: ArrayList +) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_class, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemClassBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvStartClass.setOnClickListener { + if (fragment != null && fragment is ClassesFragment) + fragment.startCall(items[adapterPosition]) + else if (activity != null && activity is DoctorDetailActivity) + activity.startCall(items[adapterPosition]) + } + + binding.clClass.setOnClickListener { + if (fragment != null && fragment is ClassesFragment) { + fragment.requireActivity().intent.putExtra(ClassesDetailFragment.CLASS_ID,items[adapterPosition].id) + replaceFragment(fragment.requireActivity().supportFragmentManager, + ClassesDetailFragment(), R.id.container) + }else if (activity != null && activity is DoctorDetailActivity) { + activity.startActivity(Intent(activity, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES_DETAILS) + .putExtra(ClassesDetailFragment.CLASS_ID, items[adapterPosition].id)) + } + } + } + + fun bind(item: ClassData) = with(binding) { + val context = binding.root.context + + tvName.text = getDoctorName(item.created_by) + tvDesc.text = item.created_by?.categoryData?.name ?: context.getString(R.string.na) + + loadImage("profile",binding.ivPic, + item.created_by?.profile_image, + R.drawable.ic_profile_placeholder + ) + + tvClassName.text = item.name + + val classTime = + DateUtils.dateTimeFormatFromUTC(DateFormat.DATE_TIME_FORMAT, item.bookingDateUTC) + tvClassTime.text = classTime + tvClassPrice.text = getCurrency(item.price) + + if (item.status == ClassType.COMPLETED) { + tvStartClass.gone() + } else { + if (item.isOccupied) { + tvStartClass.text = context.getString(R.string.join_class) + } else { + tvStartClass.text = context.getString(R.string.occupy_class) + } + } + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/classes/ClassesDetailFragment.kt b/app/src/main/java/com/consultantapp/ui/classes/ClassesDetailFragment.kt new file mode 100644 index 0000000..57935bc --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/classes/ClassesDetailFragment.kt @@ -0,0 +1,224 @@ +package com.consultantapp.ui.classes + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.ClassData +import com.consultantapp.data.models.responses.JitsiClass +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentClassDetailBinding +import com.consultantapp.ui.jitsimeet.JitsiActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ClassesDetailFragment() : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentClassDetailBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var progressDialog: ProgressDialog + + private var classData: ClassData? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_class_detail, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + binding.layoutClass.cvClass.elevation = 0f + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.colorWhite)) + + if (requireActivity().intent.hasExtra(CLASS_ID)) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = requireActivity().intent.getStringExtra(CLASS_ID) ?: "" + viewModel.classDetail(hashMap) + } + } else { + binding.toolbar.performClick() + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.layoutClass.tvStartClass.setOnClickListener { + startCall() + } + } + + private fun setData() { + binding.tvHeader.text = classData?.name + binding.layoutClass.tvName.text = getDoctorName(classData?.created_by) + binding.layoutClass.tvDesc.text = classData?.created_by?.categoryData?.name + ?: getString(R.string.na) + + loadImage("profile",binding.layoutClass.ivPic, classData?.created_by?.profile_image, + R.drawable.ic_profile_placeholder + ) + + binding.layoutClass.tvClassName.text = classData?.name + + val classTime = DateUtils.dateTimeFormatFromUTC(DateFormat.DATE_TIME_FORMAT, classData?.bookingDateUTC) + binding.layoutClass.tvClassTime.text = classTime + binding.layoutClass.tvClassPrice.text = getCurrency(classData?.price) + + if (classData?.status == ClassType.COMPLETED) { + binding.layoutClass.tvStartClass.gone() + } else { + if (classData?.isOccupied == true) { + binding.layoutClass.tvStartClass.text = getString(R.string.join_class) + } else { + binding.layoutClass.tvStartClass.text = getString(R.string.occupy_class) + } + } + } + + private fun bindObservers() { + viewModel.classDetail.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundColor(0) + + classData = it.data + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.enrollUser.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + val hashMap = HashMap() + hashMap["class_id"] = classData?.id ?: "" + viewModel.classDetail(hashMap) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.joinClass.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = classData?.id + jitsiClass.name = classData?.name + jitsiClass.isClass = true + + startActivity(Intent(requireActivity(), JitsiActivity::class.java) + .putExtra(EXTRA_CALL_NAME, jitsiClass)) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun startCall() { + if (classData?.isOccupied == false) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.occupy_class, + R.string.occupy_class_message, R.string.occupy_class, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = classData?.id ?: "" + viewModel.enrollUser(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } else if (classData?.isOccupied == true) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = classData?.id ?: "" + viewModel.joinClass(hashMap) + } + } else if (classData?.status == ClassType.ADDED) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.join_class, + R.string.join_class_message, R.string.ok, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + } + + override fun onCancelButtonClicked() { + } + }).show() + } + } + + companion object { + const val CLASS_DATA = "CLASS_DATA" + const val CLASS_ID = "CLASS_ID" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/classes/ClassesFragment.kt b/app/src/main/java/com/consultantapp/ui/classes/ClassesFragment.kt new file mode 100644 index 0000000..7474ac4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/classes/ClassesFragment.kt @@ -0,0 +1,286 @@ +package com.consultantapp.ui.classes + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.models.responses.ClassData +import com.consultantapp.data.models.responses.JitsiClass +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.ui.jitsimeet.JitsiActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class ClassesFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: ClassesAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var classSelectedData: ClassData? = null + + private var categoryData: Categories? = null + + private var doctorData: UserData? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvHeader.text = getString(R.string.classes) + if (requireActivity().intent.hasExtra(DoctorDetailActivity.DOCTOR_ID)) { + doctorData = requireActivity().intent.getSerializableExtra(DoctorDetailActivity.DOCTOR_ID) as UserData + binding.tvHeader.text = doctorData?.name + } else if (requireActivity().intent.hasExtra(CATEGORY_PARENT_ID)) { + categoryData = requireActivity().intent.getSerializableExtra(CATEGORY_PARENT_ID) as Categories + binding.tvHeader.text = categoryData?.name + } + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_classes) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_classes_desc) + } + + private fun setAdapter() { + adapter = ClassesAdapter(this, null, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["type"] = "USER_SIDE" + + if (requireActivity().intent.hasExtra(DoctorDetailActivity.DOCTOR_ID)) + hashMap["doctor_id"] = doctorData?.id ?: "" + else if(requireActivity().intent.hasExtra(CATEGORY_PARENT_ID)) + hashMap["CategoryId"] = categoryData?.id ?: "" + + viewModel.classesList(hashMap) + }else + binding.swipeRefresh.isRefreshing = false + } + + override fun onResume() { + super.onResume() + hitApi(true) + } + + private fun bindObservers() { + viewModel.classes.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.classes ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModel.enrollUser.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.joinClass.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = classSelectedData?.id + jitsiClass.name = classSelectedData?.name + jitsiClass.isClass = true + + startActivity(Intent(requireActivity(), JitsiActivity::class.java) + .putExtra(EXTRA_CALL_NAME, jitsiClass)) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + + fun startCall(item: ClassData?) { + classSelectedData = item + + if (classSelectedData?.isOccupied == false) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.occupy_class, + R.string.occupy_class_message, R.string.occupy_class, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = classSelectedData?.id ?: "" + viewModel.enrollUser(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } else if (classSelectedData?.isOccupied == true) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = classSelectedData?.id ?: "" + viewModel.joinClass(hashMap) + } + } else if (classSelectedData?.status == ClassType.ADDED) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.join_class, + R.string.join_class_message, R.string.ok, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + } + + override fun onCancelButtonClicked() { + } + }).show() + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/classes/ClassesViewModel.kt b/app/src/main/java/com/consultantapp/ui/classes/ClassesViewModel.kt new file mode 100644 index 0000000..73d42b4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/classes/ClassesViewModel.kt @@ -0,0 +1,174 @@ +package com.consultantapp.ui.classes + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.ClassData +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class ClassesViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val enrollUser by lazy { SingleLiveEvent>() } + + val joinClass by lazy { SingleLiveEvent>() } + + val categories by lazy { SingleLiveEvent>() } + + val classes by lazy { SingleLiveEvent>() } + + val classDetail by lazy { SingleLiveEvent>() } + + val getFilters by lazy { SingleLiveEvent>() } + + + fun enrollUser(hashMap: HashMap) { + enrollUser.value = Resource.loading() + + webService.enrollUser(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + enrollUser.value = Resource.success(response.body()?.data) + } else { + enrollUser.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + enrollUser.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun joinClass(hashMap: HashMap) { + joinClass.value = Resource.loading() + + webService.joinClass(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + joinClass.value = Resource.success(response.body()?.data) + } else { + joinClass.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + joinClass.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun categories(hashMap: HashMap) { + categories.value = Resource.loading() + + webService.categories(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + categories.value = Resource.success(response.body()?.data) + } else { + categories.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + categories.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun classesList(hashMap: HashMap) { + classes.value = Resource.loading() + + webService.classesList(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + classes.value = Resource.success(response.body()?.data) + } else { + classes.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + classes.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun classDetail(hashMap: HashMap) { + classDetail.value = Resource.loading() + + webService.classDetail(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + classDetail.value = Resource.success(response.body()?.data) + } else { + classDetail.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + classDetail.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getFilters(hashMap: HashMap) { + getFilters.value = Resource.loading() + + webService.getFilters(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getFilters.value = Resource.success(response.body()?.data) + } else { + getFilters.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getFilters.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/CategoriesAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/CategoriesAdapter.kt new file mode 100644 index 0000000..d77cbf8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/CategoriesAdapter.kt @@ -0,0 +1,173 @@ +package com.consultantapp.ui.dashboard + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemCategoryBinding +import com.consultantapp.databinding.RvItemCategoryReverseBinding +import com.consultantapp.ui.classes.CategoriesFragment +import com.consultantapp.ui.dashboard.home.HomeFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.utils.gone +import com.consultantapp.utils.loadImage +import com.consultantapp.utils.visible + + +class CategoriesAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) { + when (BuildConfig.FLAVOR) { + "heal" -> + (holder as ViewHolderReverse).bind(items[position]) + else -> + (holder as ViewHolder).bind(items[position]) + } + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + when (BuildConfig.FLAVOR) { + "heal" -> + ViewHolderReverse(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_category_reverse, parent, false)) + else -> + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_category, parent, false)) + } + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemCategoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + val userRepo = when (fragment) { + is HomeFragment -> fragment.userRepository + is CategoriesFragment -> fragment.userRepository + is SubCategoryFragment -> fragment.userRepository + else -> null + } + + if (userRepo?.getUserLanguage() == "ar") + binding.ivCategory.rotationY = 180f + + if(BuildConfig.FLAVOR=="taradoc") + binding.tvName.setTextColor(Color.parseColor("#1b1616")) + + binding.ivInfo.setOnClickListener { + when (fragment) { + is HomeFragment -> fragment.showInformationDialog(items[bindingAdapterPosition]) + is CategoriesFragment -> fragment.showInformationDialog(items[bindingAdapterPosition]) + is SubCategoryFragment -> fragment.showInformationDialog(items[bindingAdapterPosition]) + } + } + + binding.clMain.setOnClickListener { + when (fragment) { + is HomeFragment -> fragment.clickItem(items[bindingAdapterPosition]) + is CategoriesFragment -> fragment.clickItem(items[bindingAdapterPosition]) + is SubCategoryFragment -> fragment.clickItem(items[bindingAdapterPosition]) + } + } + } + + fun bind(item: Categories) = with(binding) { + ivCategory.gone() + ivCategoryFull.gone() + tvName.gone() + + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + /* if(!item.image.isNullOrEmpty()){ + ivCategoryFull.visible() + loadImage(ivCategoryFull , item.image, 0) + }else if(!item.image_icon.isNullOrEmpty()){*/ + tvName.visible() + ivCategory.visible() + + tvName.text = item.name + loadImage("tag",ivCategory, item.image, 0) + +// } + } + } + + inner class ViewHolderReverse(val binding: RvItemCategoryReverseBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + val userRepo = when (fragment) { + is HomeFragment -> fragment.userRepository + is CategoriesFragment -> fragment.userRepository + is SubCategoryFragment -> fragment.userRepository + else -> null + } + + if (userRepo?.getUserLanguage() == "ar") + binding.ivCategory.rotationY = 180f + + binding.ivInfo.setOnClickListener { + when (fragment) { + is HomeFragment -> fragment.showInformationDialog(items[bindingAdapterPosition]) + is CategoriesFragment -> fragment.showInformationDialog(items[bindingAdapterPosition]) + is SubCategoryFragment -> fragment.showInformationDialog(items[bindingAdapterPosition]) + } + } + + binding.clMain.setOnClickListener { + when (fragment) { + is HomeFragment -> fragment.clickItem(items[bindingAdapterPosition]) + is CategoriesFragment -> fragment.clickItem(items[bindingAdapterPosition]) + is SubCategoryFragment -> fragment.clickItem(items[bindingAdapterPosition]) + } + } + } + + fun bind(item: Categories) = with(binding) { + + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + tvName.text = item.name + loadImage("tag",ivCategory, item.image, 0) + +// loadImage(ivCategoryFull , item.image, 0) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/DoctorViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/DoctorViewModel.kt new file mode 100644 index 0000000..777bbb3 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/DoctorViewModel.kt @@ -0,0 +1,245 @@ +package com.consultantapp.ui.dashboard + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.requests.CreateRequest +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class DoctorViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val doctorList by lazy { SingleLiveEvent>() } + + val doctorDetails by lazy { SingleLiveEvent>() } + + val reviewList by lazy { SingleLiveEvent>() } + + val createRequest by lazy { SingleLiveEvent>() } + + val confirmRequest by lazy { SingleLiveEvent>() } + + val services by lazy { SingleLiveEvent>() } + + fun doctorList(hashMap: HashMap) { + + doctorList.value = Resource.loading() + + webService.doctorList(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + doctorList.value = Resource.success(response.body()?.data) + } else { + doctorList.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + doctorList.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun doctorListV2(hashMap: HashMap) { + + doctorList.value = Resource.loading() + + webService.doctorListV2(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + doctorList.value = Resource.success(response.body()?.data) + } else { + doctorList.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + doctorList.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun doctorDetails(hashMap: HashMap) { + doctorDetails.value = Resource.loading() + + webService.doctorDetails(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + doctorDetails.value = Resource.success(response.body()?.data) + } else { + doctorDetails.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + doctorDetails.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun reviewList(hashMap: HashMap) { + reviewList.value = Resource.loading() + + webService.reviewList(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + reviewList.value = Resource.success(response.body()?.data) + } else { + reviewList.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + reviewList.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun createRequest(createRequestModel: CreateRequest) { + createRequest.value = Resource.loading() + + webService.createRequest(createRequestModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + createRequest.value = Resource.success(response.body()?.data) + } else { + createRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + createRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun createRequestV2(createRequestModel: CreateRequest) { + createRequest.value = Resource.loading() + + webService.createRequestV2(createRequestModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + createRequest.value = Resource.success(response.body()?.data) + } else { + createRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + createRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun confirmRequest(createRequestModel: CreateRequest) { + confirmRequest.value = Resource.loading() + + webService.confirmRequest(createRequestModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + confirmRequest.value = Resource.success(response.body()?.data) + } else { + confirmRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + confirmRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun confirmRequestV2(createRequestModel: CreateRequest) { + confirmRequest.value = Resource.loading() + + webService.confirmRequestV2(createRequestModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + confirmRequest.value = Resource.success(response.body()?.data) + } else { + confirmRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + confirmRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun services(hashMap: HashMap) { + services.value = Resource.loading() + + webService.services(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + services.value = Resource.success(response.body()?.data) + } else { + services.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + services.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/DoctorsAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/DoctorsAdapter.kt new file mode 100644 index 0000000..b0ed0b8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/DoctorsAdapter.kt @@ -0,0 +1,80 @@ +package com.consultantapp.ui.dashboard + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemPopularBinding +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.utils.getDoctorName +import com.consultantapp.utils.getUserRating +import com.consultantapp.utils.hideShowView +import com.consultantapp.utils.loadImage + + +class DoctorsAdapter(private val activity: DoctorListActivity, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_popular, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemPopularBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clDoctor.setOnClickListener { + activity.clickItem(bindingAdapterPosition) + } + } + + fun bind(doctor: UserData) = with(binding) { + + val context = binding.root.context + + tvName.text = getDoctorName(doctor.doctor_data) + binding.tvDesc.text = doctor.doctor_data?.categoryData?.name + ?: context.getString(R.string.na) + loadImage("tag",binding.ivPic, doctor.doctor_data?.profile_image, R.drawable.ic_profile_placeholder) + + binding.tvRating.text = context.getString(R.string.s_s_reviews, + getUserRating(doctor.doctor_data?.totalRating), doctor.doctor_data?.reviewCount) + + binding.ivActiveStatus.hideShowView(doctor.doctor_data?.isAvailable == true) + + binding.tvDistance.hideShowView(!doctor.distance.isNullOrEmpty()) + binding.tvDistance.text = "${context.getString(R.string.distance)} : ${doctor.distance ?: ""} km" + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/HomeActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/HomeActivity.kt new file mode 100644 index 0000000..a87601f --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/HomeActivity.kt @@ -0,0 +1,333 @@ +package com.consultantapp.ui.dashboard + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.location.Geocoder +import android.location.Location +import android.location.LocationManager +import android.os.Build +import android.os.Bundle +import android.os.Looper +import android.provider.Settings +import android.util.AttributeSet +import android.util.Log +import android.view.View +import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.LiveData +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.NavController +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appFeatures +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityHomeBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.adapter.CommonFragmentPagerAdapter +import com.consultantapp.ui.dashboard.appointment.AppointmentFragment +import com.consultantapp.ui.dashboard.chat.ChatFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.SignUpActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.PermissionUtils.ensureNotificationChannelExists +import com.consultantapp.utils.PermissionUtils.hasPermission +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.android.gms.location.* +import com.google.android.material.snackbar.Snackbar +import dagger.android.support.DaggerAppCompatActivity +import java.util.* +import javax.inject.Inject + +class HomeActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var appSocket: AppSocket + + lateinit var binding: ActivityHomeBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelDoctor: DoctorViewModel + + private lateinit var adapter: CommonFragmentPagerAdapter + + lateinit var mFusedLocationClient: FusedLocationProviderClient + + private lateinit var geoCoder: Geocoder + + private var currentNavController: LiveData? = null + + val launcher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { + if (!it.any()) { + Snackbar.make(binding.root, "Notification permission denied", Snackbar.LENGTH_SHORT) + .show() + return@registerForActivityResult + } + ensureNotificationChannelExists() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_home) + initialise() + setNavigation() + listeners() + + val launcher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { + if (!it.any()) { + Snackbar.make(binding.root, "Notification permission denied", Snackbar.LENGTH_SHORT) + .show() + return@registerForActivityResult + } + ensureNotificationChannelExists() + } + + if (hasPermission(Manifest.permission.POST_NOTIFICATIONS).not()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + launcher.launch(arrayOf( Manifest.permission.POST_NOTIFICATIONS,Manifest.permission.FOREGROUND_SERVICE)) + } + } + + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + appSocket.init() + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelDoctor = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + progressDialog = ProgressDialog(this) + + val permissionState = + ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) + if (permissionState == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.POST_NOTIFICATIONS), + 1 + ) + + } + + /*Update Token*/ + userRepository.pushTokenUpdate() + + if (appFeatures.needLocation) { + /*Ask for location*/ + geoCoder = Geocoder(this, Locale.getDefault()) + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + getLastLocation() + } + + /*Ask for phone number if not added*/ + if (BuildConfig.FLAVOR == "homeDoctor" && userRepository.isUserLoggedIn() && userRepository.getUser()?.phone.isNullOrEmpty()) { + startActivity( + Intent(this, SignUpActivity::class.java) + .putExtra(UPDATE_NUMBER, true) + ) + } + } + + + private fun setNavigation() { + val navGraphIds = listOf( + R.navigation.navigation_home, + R.navigation.navigation_appointment, + R.navigation.navigation_chat, + R.navigation.navigation_profile + ) + + // Setup the bottom navigation view with a list of navigation graphs + val controller = binding.bottomNav.setupWithNavController( + navGraphIds = navGraphIds, + fragmentManager = supportFragmentManager, + containerId = R.id.nav_host_fragment, + intent = intent, + activity = this, + userRepository = userRepository + ) + + currentNavController = controller + + if (intent.hasExtra(EXTRA_TAB)) { + if (intent.getStringExtra(EXTRA_TAB) == "1") { + binding.bottomNav.selectedItemId = R.id.navigation_appointment + } + } + } + + override fun onSupportNavigateUp(): Boolean { + return currentNavController?.value?.navigateUp() ?: false + } + + private fun listeners() { + + } + + + @SuppressLint("MissingPermission") + private fun getLastLocation() { + if (checkPermissions()) { + if (isLocationEnabled()) { + mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task -> + val location: Location? = task.result + if (location != null) { + getLocationName(location.latitude, location.longitude) + } + } + + + requestNewLocationData() + + } else { + Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show() + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + } else { + requestPermissions() + } + } + + @SuppressLint("MissingPermission") + private fun requestNewLocationData() { + runOnUiThread { + val mLocationRequest = LocationRequest.create().apply { + interval = 0 + fastestInterval = 0 + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + numUpdates = 1 + } + + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + mFusedLocationClient.requestLocationUpdates( + mLocationRequest, mLocationCallback, + Looper.myLooper() + ) + } + } + + private val mLocationCallback = object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult) { + val mLastLocation: Location = locationResult.lastLocation + getLocationName(mLastLocation.latitude, mLastLocation.longitude) + } + } + + private fun isLocationEnabled(): Boolean { + val locationManager: LocationManager = + getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER + ) + } + + private fun checkPermissions(): Boolean { + if (ActivityCompat.checkSelfPermission( + this, Manifest.permission.ACCESS_COARSE_LOCATION + ) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission( + this, Manifest.permission.ACCESS_FINE_LOCATION + ) == PackageManager.PERMISSION_GRANTED + ) { + return true + } + return false + } + + private fun requestPermissions() { + registerActivityResult.launch( + Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.LOCATION) + ) + } + + + private val registerActivityResult = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + getLastLocation() + } + } + + private fun getLocationName(lat: Double, lng: Double) { + runOnUiThread { + try { + var locationName = "" + + val addresses = geoCoder.getFromLocation( + lat, + lng, + 1 + )!! // Here 1 represent max location result to returned, by documents it recommended 1 to 5 + + if (addresses.isNotEmpty()) { + locationName = when { + addresses[0].getAddressLine(1) != null -> addresses[0].getAddressLine( + 1 + ) + + addresses[0].featureName == null -> addresses[0].adminArea + else -> String.format( + "%s, %s", addresses[0].featureName, + addresses[0].locality + ) + } + } + + /*Save Address*/ + val address = SaveAddress(locationName = locationName, lat = lat, long = lng) + + prefsManager.save(USER_ADDRESS, address) + + val hashMap = HashMap() + hashMap["name"] = userRepository.getUser()?.name ?: "" + hashMap["location_name"] = locationName + hashMap["lat"] = lat + hashMap["long"] = lng + viewModel.updateProfile(hashMap) + + // binding.itemMain.tvLocation.text = name + } catch (e: Exception) { + } + } + } + + + override fun onResume() { + super.onResume() + refreshAllPages() + } + + private fun refreshAllPages() { + try { + /*Refresh pages*/ + (adapter.fragments[1] as AppointmentFragment).hitApiRefresh() + (adapter.fragments[2] as ChatFragment).hitApiRefresh() + } catch (e: Exception) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentAdapter.kt new file mode 100644 index 0000000..04d8136 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentAdapter.kt @@ -0,0 +1,123 @@ + package com.consultantapp.ui.dashboard.appointment + +import android.content.Intent +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemAppointmentBinding +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* + + + class AppointmentAdapter(private val fragment: AppointmentFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_appointment, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemAppointmentBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.registerActivityResult.launch(Intent(fragment.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, items[bindingAdapterPosition].id)) + } + } + + fun bind(request: Request) = with(binding) { + val context = binding.root.context + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorPrimary)) + + tvName.text = getDoctorName(request.to_user) + Log.e("profilePic",binding.ivPic.toString()) + loadImage("profile",binding.ivPic, request.to_user?.profile_image, R.drawable.ic_profile_placeholder) + + tvDateTime.text = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} · " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)}" + + tvRequestType.text = request.service_type + tvPrice.text = getCurrency(request.price) + + when (request.status) { + CallAction.ACCEPT -> { + tvStatus.text = context.getString(R.string.accepted) + } + CallAction.PENDING -> { + tvStatus.text = context.getString(R.string.new_request) + } + CallAction.COMPLETED -> { + tvStatus.text = context.getString(R.string.completed) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.textColorGreen)) + } + CallAction.START -> { + tvStatus.text = context.getString(R.string.inprogess) + } + CallAction.REACHED -> { + tvStatus.text = context.getString(R.string.reached_destination) + } + CallAction.START_SERVICE -> { + tvStatus.text = context.getString(R.string.started) + } + CallAction.INPROGRESS, CallAction.BUSY -> { + tvStatus.text = context.getString(R.string.inprogess) + } + CallAction.FAILED -> { + tvStatus.text = context.getString(R.string.no_show) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + } + CallAction.CANCELED -> { + tvStatus.text = context.getString(R.string.canceled) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + } + CallAction.CANCEL_SERVICE -> { + tvStatus.text = context.getString(R.string.canceled_service) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + } + else -> { + tvStatus.text = context.getString(R.string.new_request) + } + } + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + + + + + diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentFragment.kt new file mode 100644 index 0000000..7abe465 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentFragment.kt @@ -0,0 +1,292 @@ +package com.consultantapp.ui.dashboard.appointment + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class AppointmentFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: AppointmentAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var isReceiverRegistered = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + + hitApi(true) + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.toolbar.title = getString(R.string.appointments) + binding.toolbar.navigationIcon = null + binding.tvHeader.gone() + binding.tvWallet.visible() + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_requests) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_requests_desc) + + binding.tvRequestType.hideShowView(BuildConfig.FLAVOR == "homeDoctor") + + } + + private fun setAdapter() { + adapter = AppointmentAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvWallet.setOnClickListener { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.WALLET)) + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLastPage && lastVisibleItemPosition >= totalItemCount) { + hitApi(false) + } + } + }) + + binding.tvRequestType.setOnClickListener { + binding.spnRequestType.performClick() + } + + binding.spnRequestType.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvRequestType.text = binding.spnRequestType.selectedItem.toString() + hitApi(true) + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + } + + + fun hitApiRefresh() { + hitApi(true) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true) && !isLoadingMoreItems) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + hashMap["service_type"] = CallType.ALL + + if (binding.spnRequestType.selectedItemPosition > 0) + hashMap["type"] = when (binding.spnRequestType.selectedItemPosition) { + 1 -> RequestStatus.NEW + 2 -> RequestStatus.COMPLETED + 3 -> RequestStatus.CANCELLED + else -> "" + } + + isLoadingMoreItems = true + viewModel.request(hashMap) + } else { + binding.swipeRefresh.isRefreshing = false + } + } + + private fun bindObservers() { + viewModel.request.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.requests ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefresh.isRefreshing && isFirstPage) + binding.clLoader.visible() + } + } + }) + } + + val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + hitApi(true) + } + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.BOOKING_RESERVED) + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.REQUEST_ACCEPTED) + intentFilter.addAction(PushType.CANCELED_REQUEST) + intentFilter.addAction(PushType.REQUEST_FAILED) + intentFilter.addAction(PushType.CHAT_STARTED) + intentFilter.addAction(PushType.START) + intentFilter.addAction(PushType.START_SERVICE) + intentFilter.addAction(PushType.CANCEL_SERVICE) + intentFilter.addAction(PushType.REACHED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.BOOKING_RESERVED, PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.REQUEST_ACCEPTED, + PushType.CANCELED_REQUEST, PushType.REQUEST_FAILED, PushType.CHAT_STARTED, + PushType.START, PushType.START_SERVICE, PushType.CANCEL_SERVICE, + PushType.REACHED, NetworkIssueFragment.NETWORK_ISSUE -> + hitApi(true) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentViewModel.kt new file mode 100644 index 0000000..46d75aa --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/AppointmentViewModel.kt @@ -0,0 +1,226 @@ +package com.consultantapp.ui.dashboard.appointment + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.Extra_payment +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class AppointmentViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val request by lazy { SingleLiveEvent>() } + + val requestDetail by lazy { SingleLiveEvent>() } + + val cancelRequest by lazy { SingleLiveEvent>() } + + val addReview by lazy { SingleLiveEvent>() } + + val approveWorkingHour by lazy { SingleLiveEvent>() } + + val completeChat by lazy { SingleLiveEvent>() } + + val notifications by lazy { SingleLiveEvent>() } + + val payExtra by lazy { SingleLiveEvent>() } + + + fun request(hashMap: HashMap) { + request.value = Resource.loading() + + webService.request(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + request.value = Resource.success(response.body()?.data) + } else { + request.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + request.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun requestDetail(hashMap: HashMap) { + requestDetail.value = Resource.loading() + + webService.requestDetail(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + requestDetail.value = Resource.success(response.body()?.data) + } else { + requestDetail.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + requestDetail.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun cancelRequest(hashMap: HashMap) { + cancelRequest.value = Resource.loading() + + webService.cancelRequest(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + cancelRequest.value = Resource.success(response.body()?.data) + } else { + cancelRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + cancelRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addReview(hashMap: HashMap) { + addReview.value = Resource.loading() + + webService.addReview(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addReview.value = Resource.success(response.body()?.data) + } else { + addReview.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addReview.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun approveWorkingHour(hashMap: HashMap) { + approveWorkingHour.value = Resource.loading() + + webService.approveWorkingHour(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + approveWorkingHour.value = Resource.success(response.body()?.data) + } else { + approveWorkingHour.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + approveWorkingHour.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun completeChat(hashMap: HashMap) { + completeChat.value = Resource.loading() + + webService.completeChat(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + completeChat.value = Resource.success(response.body()?.data) + } else { + completeChat.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + completeChat.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun notifications(hashMap: HashMap) { + notifications.value = Resource.loading() + + webService.notifications(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + notifications.value = Resource.success(response.body()?.data) + } else { + notifications.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + notifications.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun payExtra(extraPaymentModel: Extra_payment) { + payExtra.value = Resource.loading() + + webService.payExtra(extraPaymentModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + payExtra.value = Resource.success(response.body()?.data) + } else { + payExtra.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + payExtra.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/AppointmentStatusActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/AppointmentStatusActivity.kt new file mode 100644 index 0000000..e645990 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/AppointmentStatusActivity.kt @@ -0,0 +1,538 @@ +package com.consultantapp.ui.dashboard.appointment.appointmentStatus + +import android.Manifest +import android.animation.ValueAnimator +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.location.Location +import android.location.LocationManager +import android.net.Uri +import android.os.Bundle +import android.view.WindowManager +import android.view.animation.LinearInterpolator +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.models.responses.directions.Overview_polyline +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityAppointmentStatusBinding +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.PermissionUtils +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.* +import dagger.android.support.DaggerAppCompatActivity +import io.socket.emitter.Emitter +import org.json.JSONObject +import permissions.dispatcher.* +import timber.log.Timber +import java.util.* +import javax.inject.Inject +import kotlin.math.sign + +@RuntimePermissions +class AppointmentStatusActivity : DaggerAppCompatActivity(), OnMapReadyCallback { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: ActivityAppointmentStatusBinding + + private lateinit var viewModelDirection: DirectionViewModel + + private lateinit var viewModel: AppointmentViewModel + + private var mapFragment: SupportMapFragment? = null + + private var mMap: GoogleMap? = null + + private lateinit var placeLatLng: LatLng + + private lateinit var finalLatLng: LatLng + + private var request: Request? = null + + private var polyline: Polyline? = null + + private var markerToMove: Marker? = null + + private var markerToReach: Marker? = null + + private var isReceiverRegistered = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_appointment_status) + + initialise() + setListeners() + bindObservers() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment + mapFragment?.getMapAsync(this) + viewModelDirection = + ViewModelProvider(this, viewModelFactory)[DirectionViewModel::class.java] + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + + // These flags ensure that the activity can be launched when the screen is locked. + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + + private fun setRequestData() { + binding.cvDetails.visible() + + finalLatLng = LatLng(request?.extra_detail?.lat?.toDouble() + ?: 0.0, request?.extra_detail?.long?.toDouble() ?: 0.0) + + if (markerToReach == null && ::finalLatLng.isInitialized) { + markerToReach = mMap?.addMarker(MarkerOptions() + .position(finalLatLng) + .icon(bitmapDescriptorFromVector(this, R.drawable.ic_drop_location_mrkr)) + .anchor(0.5f, 0.5f) + .flat(true)) + } + + binding.tvName.text = request?.to_user?.name + + loadImage("profile",binding.ivPic, request?.to_user?.profile_image, + R.drawable.ic_profile_placeholder) + + if (request?.to_user?.totalRating != null && request?.to_user?.totalRating != "0") { + binding.tvRating.visible() + binding.tvRating.text = getUserRating(request?.to_user?.totalRating) + } + + binding.ivCall.hideShowView(!request?.to_user?.phone.isNullOrEmpty()) + + when (request?.status) { + CallAction.START -> { + if (request?.last_location != null) { + placeLatLng = LatLng(request?.last_location?.lat + ?: 0.0, request?.last_location?.long ?: 0.0) + + if (request?.status == CallAction.START && markerToMove == null && ::placeLatLng.isInitialized) { + markerToMove = mMap?.addMarker( + MarkerOptions() + .position(placeLatLng) + .icon(bitmapDescriptorFromVector(this, R.drawable.ic_location_arrow)) + .anchor(0.5f, 0.5f) + .flat(true)) + } + + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(placeLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + drawPolyLineApi() + } else { + mMap?.moveCamera(CameraUpdateFactory.newLatLng(finalLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } + } + CallAction.REACHED -> { + binding.tvTime.gone() + + binding.tvStatusV.text = getString(R.string.reached_destination) + + polyline?.remove() + markerToMove?.remove() + mMap?.moveCamera(CameraUpdateFactory.newLatLng(finalLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } + CallAction.START_SERVICE -> { + binding.tvTime.gone() + binding.tvStatusV.text = getString(R.string.started) + + polyline?.remove() + markerToMove?.remove() + mMap?.moveCamera(CameraUpdateFactory.newLatLng(finalLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } + CallAction.CANCEL_SERVICE -> { + finish() + } + } + } + + private fun hitApi() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["request_id"] = intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + viewModel.requestDetail(hashMap) + } + } + + + private fun setListeners() { + binding.toolbar.setNavigationOnClickListener { + onBackPressed() + } + + binding.ivCall.setOnClickListener { + getCallWithPermissionCheck() + } + } + + private fun drawPolyLineApi() { + runOnUiThread { + if (request?.status == CallAction.START && markerToMove == null) { + markerToMove = mMap?.addMarker( + MarkerOptions() + .position(placeLatLng) + .icon(bitmapDescriptorFromVector(this, R.drawable.ic_location_arrow)) + .anchor(0.5f, 0.5f) + .flat(true)) + } else + animateMarker() + + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["origin"] = "${placeLatLng.latitude},${placeLatLng.longitude}" + hashMap["destination"] = "${finalLatLng.latitude},${finalLatLng.longitude}" + hashMap["key"] = getString(R.string.google_places_api_key) + viewModelDirection.directions(hashMap) + } + } + } + + + override fun onMapReady(googleMap: GoogleMap) { + mMap = googleMap + mMap?.isTrafficEnabled = false + + if (BuildConfig.FLAVOR == "homeDoctor") { + /*Default to Saudi Arabia*/ + val current = LatLng(23.8859, 45.0792) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(current)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(6f)) + } + + // mMap?.isMyLocationEnabled = true + mMap?.uiSettings?.isMyLocationButtonEnabled = true + + hitApi() + } + + private fun animateMarker() { + if (markerToMove != null) { + val locationStart = Location(LocationManager.GPS_PROVIDER) + locationStart.latitude = placeLatLng.latitude + locationStart.longitude = placeLatLng.longitude + + val startPosition = markerToMove?.position ?: LatLng(0.0, 0.0) + val endPosition = placeLatLng + val startRotation = markerToMove?.rotation ?: 0f + val latLngInterpolator: LatLngInterpolator = LatLngInterpolator.LinearFixed() + val valueAnimator = ValueAnimator.ofFloat(0f, 1f) + valueAnimator.duration = 1000 // duration 1 second + valueAnimator.interpolator = LinearInterpolator() + valueAnimator.addUpdateListener { animation -> + try { + val v = animation.animatedFraction + val newPosition = latLngInterpolator.interpolate(v, startPosition, endPosition) + ?: LatLng(0.0, 0.0) + markerToMove?.position = newPosition + markerToMove?.rotation = + computeRotation(v, startRotation, locationStart.bearing) + } catch (ex: Exception) { + // I don't care atm.. + } + } + valueAnimator.start() + } + } + + private interface LatLngInterpolator { + fun interpolate(fraction: Float, a: LatLng, b: LatLng): LatLng? + class LinearFixed : LatLngInterpolator { + override fun interpolate(fraction: Float, a: LatLng, b: LatLng): LatLng { + val lat = (b.latitude - a.latitude) * fraction + a.latitude + var lngDelta = b.longitude - a.longitude + // Take the shortest path across the 180th meridian. + if (Math.abs(lngDelta) > 180) { + lngDelta -= sign(lngDelta) * 360 + } + val lng = lngDelta * fraction + a.longitude + return LatLng(lat, lng) + } + } + } + + private fun computeRotation(fraction: Float, start: Float, end: Float): Float { + val normalizeEnd = end - start // rotate start to 0 + val normalizedEndAbs = (normalizeEnd + 360) % 360 + val direction = + if (normalizedEndAbs > 180) (-1).toFloat() else 1.toFloat() // -1 = anticlockwise, 1 = clockwise + val rotation: Float + rotation = if (direction > 0) { + normalizedEndAbs + } else { + normalizedEndAbs - 360 + } + val result = fraction * rotation + start + return (result + 360) % 360 + } + + + private fun bindObservers() { + viewModel.requestDetail.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + runOnUiThread { + request = it.data?.request_detail ?: Request() + setRequestData() + } + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModelDirection.directions.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + if (request?.status == CallAction.START) { + try { + if (!it.data?.routes?.get(0)?.legs?.get(0)?.duration?.text.isNullOrEmpty()) { + binding.tvTime.visible() + binding.tvTime.text = getString(R.string.estimate_time_of_arrival_s, + it.data?.routes?.get(0)?.legs?.get(0)?.duration?.text) + } + drawDirectionToStop(it.data?.routes?.get(0)?.overview_polyline) + } catch (e: Exception) { + binding.tvTime.visible() + binding.tvTime.text = getString(R.string.estimate_time_of_arrival_s, + getString(R.string.na)) + } + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + + } + } + }) + } + + override fun onBackPressed() { + if (request?.status == CallAction.START) { + AlertDialogUtil.instance.createOkCancelDialog(this, R.string.quit, + R.string.quit_message, R.string.yes, R.string.no, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + finish() + } + + override fun onCancelButtonClicked() { + } + }).show() + } else + super.onBackPressed() + } + + private fun drawDirectionToStop(overviewPolyline: Overview_polyline?) { + runOnUiThread { + if (overviewPolyline != null) { + val polyz = decodeOverviewPolyLinePonts(overviewPolyline.points) + if (polyz != null) { + val lineOptions = PolylineOptions() + lineOptions.addAll(polyz) + lineOptions.width(20f) + lineOptions.color(ContextCompat.getColor(this, R.color.colorBlack)) + + polyline?.remove() + + polyline = mMap?.addPolyline(lineOptions) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(placeLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + } + } + } + } + + + //This function is to parse the value of "points" + private fun decodeOverviewPolyLinePonts(encoded: String?): List? { + val poly = ArrayList() + if (encoded != null && encoded.isNotEmpty() && encoded.trim { it <= ' ' }.isNotEmpty()) { + var index = 0 + val len = encoded.length + var lat = 0 + var lng = 0 + while (index < len) { + var b: Int + var shift = 0 + var result = 0 + do { + b = encoded[index++].toInt() - 63 + result = result or (b and 0x1f shl shift) + shift += 5 + } while (b >= 0x20) + val dlat = if (result and 1 != 0) (result shr 1).inv() else result shr 1 + lat += dlat + shift = 0 + result = 0 + do { + b = encoded[index++].toInt() - 63 + result = result or (b and 0x1f shl shift) + shift += 5 + } while (b >= 0x20) + val dlng = if (result and 1 != 0) (result shr 1).inv() else result shr 1 + lng += dlng + val p = LatLng( + lat.toDouble() / 1E5, + lng.toDouble() / 1E5 + ) + poly.add(p) + } + } + return poly + } + + override fun onStart() { + super.onStart() + appSocket.on(AppSocket.Events.SEND_LIVE_LOCATION, listener) + } + + override fun onDestroy() { + super.onDestroy() + appSocket.off(AppSocket.Events.SEND_LIVE_LOCATION, listener) + unregisterReceiver() + } + + private val listener = Emitter.Listener { + Timber.e("SEND_LIVE_LOCATION $it") + + val data = it[0] as JSONObject + val senderId = data.getString("senderId") + val receiverId = data.getString("receiverId") + val request_id = data.getString("request_id") + val lat = data.getString("lat") + val long = data.getString("long") + + if (request_id == request?.id) { + placeLatLng = LatLng(lat.toDouble(), long.toDouble()) + + drawPolyLineApi() + } + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REACHED) + intentFilter.addAction(PushType.START_SERVICE) + intentFilter.addAction(PushType.CANCEL_SERVICE) + LocalBroadcastManager.getInstance(this) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (request?.id == intent.getStringExtra(EXTRA_REQUEST_ID)) { + setResult(Activity.RESULT_OK) + when (intent.action) { + PushType.REACHED -> { + hitApi() + } + PushType.CANCEL_SERVICE -> { + finish() + } + PushType.COMPLETED, PushType.START_SERVICE -> { + /*startActivityForResult( + Intent(this@AppointmentStatusActivity, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.UPDATE_SERVICE) + .putExtra(EXTRA_REQUEST_ID, request?.id), + AppRequestCode.APPOINTMENT_DETAILS + )*/ + finish() + + } + } + } + } + } + + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CALL_PHONE) + fun getCall() { + val user = request?.to_user + val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "${user?.country_code}${user?.phone}")) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + + @OnShowRationale(Manifest.permission.CALL_PHONE) + fun showCallRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.we_will_need_call, request) + } + + @OnNeverAskAgain(Manifest.permission.CALL_PHONE) + fun onNeverAskAgainCallRationale() { + PermissionUtils.showAppSettingsDialog( + this, + R.string.we_will_need_call) + } + + @OnPermissionDenied(Manifest.permission.CALL_PHONE) + fun showDeniedForCall() { + PermissionUtils.showAppSettingsDialog( + this, R.string.we_will_need_call) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/CompletedRequestFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/CompletedRequestFragment.kt new file mode 100644 index 0000000..c6d5322 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/CompletedRequestFragment.kt @@ -0,0 +1,157 @@ +package com.consultantapp.ui.dashboard.appointment.appointmentStatus + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentRequestCompletedBinding +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class CompletedRequestFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentRequestCompletedBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var request: Request + + private lateinit var userData: UserData + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_request_completed, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + hitApi() + } + return rootView + } + + private fun initialise() { + editTextScroll(binding.etReasonHour) + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + + request = requireActivity().intent.getSerializableExtra(EXTRA_REQUEST_ID) as Request + setData() + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvAccept.setOnClickListener { + binding.tvAccept.hideKeyboard() + approveHour(CallAction.APPROVED) + } + + binding.tvDecline.setOnClickListener { + binding.tvDecline.hideKeyboard() + approveHour(CallAction.DECLINED) + } + } + + private fun approveHour(status: String) { + when { + (status == CallAction.DECLINED && binding.etHour.text.toString().isEmpty()) -> { + binding.etHour.showSnackBar(getString(R.string.error_working_hour)) + } + binding.etReasonHour.text.toString().isEmpty() -> { + binding.etReasonHour.showSnackBar(getString(R.string.error_working_hour_message)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?:"" + hashMap["status"] = status + if (binding.etHour.text.toString().isNotEmpty()) + hashMap["valid_hours"] = binding.etHour.text.toString().trim() + hashMap["comment"] = binding.etReasonHour.text.toString().trim() + + viewModel.approveWorkingHour(hashMap) + } + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + viewModel.requestDetail(hashMap) + } + } + + private fun bindObservers() { + viewModel.requestDetail.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + request = it.data?.request_detail ?: Request() + setData() + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModel.approveWorkingHour.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + userData = request.to_user ?: UserData() + + binding.etHour.setText((request.total_hours?.toInt() ?: "").toString()) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/DirectionViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/DirectionViewModel.kt new file mode 100644 index 0000000..bbee0e6 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/DirectionViewModel.kt @@ -0,0 +1,41 @@ +package com.consultantapp.ui.dashboard.appointment.appointmentStatus + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.directions.Direction +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class DirectionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val directions by lazy { SingleLiveEvent>() } + + fun directions(hashMap: HashMap) { + directions.value = Resource.loading() + + webService.directions(hashMap) + .enqueue(object : Callback { + + override fun onResponse(call: Call, + response: Response) { + if (response.isSuccessful) { + directions.value = Resource.success(response.body()) + } else { + directions.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call, throwable: Throwable) { + directions.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/StatusUpdateFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/StatusUpdateFragment.kt new file mode 100644 index 0000000..3757a33 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/appointmentStatus/StatusUpdateFragment.kt @@ -0,0 +1,164 @@ +package com.consultantapp.ui.dashboard.appointment.appointmentStatus + +/*import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentStatusUpdateBinding +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class StatusUpdateFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentStatusUpdateBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var request: Request + + private var isReceiverRegistered = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_status_update, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + hitApi() + } + return rootView + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + binding.clLoader.setBackgroundResource(R.color.colorWhite) + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + viewModel.requestDetail(hashMap) + } + } + + private fun setData() { + if (request.status == CallAction.COMPLETED) { + binding.tvComplete.isChecked = true + binding.viewComplete.alpha = 1f + + + } + } + + private fun bindObservers() { + viewModel.requestDetail.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + request = it.data?.request_detail ?: Request() + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.COMPLETED) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.COMPLETED -> { + hitApi() + + val intent = Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.RATE) + .putExtra(EXTRA_REQUEST_ID, intent.getStringExtra(EXTRA_REQUEST_ID)) + + startActivity(intent) + } + } + } + } + +}*/ diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/detail/AppointmentDetailFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/detail/AppointmentDetailFragment.kt new file mode 100644 index 0000000..788145a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/detail/AppointmentDetailFragment.kt @@ -0,0 +1,619 @@ +package com.consultantapp.ui.dashboard.appointment.detail + +import android.app.Activity +import android.app.AlertDialog +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import android.widget.TextView +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.GridLayoutManager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.data.models.responses.* +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentAppointmentDetailsBinding +import com.consultantapp.ui.adapter.CheckItemAdapter +import com.consultantapp.ui.adapter.ImagesDocumentAdapter +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.ui.dashboard.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantapp.ui.dashboard.appointment.medicalhistory.MedicalHistoryFragment +import com.consultantapp.ui.dashboard.careplan.CarePlanAdapter +import com.consultantapp.ui.dashboard.doctor.DoctorActionActivity +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment.Companion.SERVICE_ID +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.addmoney.AddMoneyActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + +class AppointmentDetailFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentAppointmentDetailsBinding + + private var rootView: View? = null + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var progressDialog: ProgressDialog + + private lateinit var request: Request + + private var isReceiverRegistered = false + + private var alertDialog: AlertDialog? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_appointment_details, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + hitApi() + } + return rootView + } + + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.tvMedicalHistory.hideShowView(BuildConfig.FLAVOR == "homeDoctor") + } + + private fun + hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + viewModel.requestDetail(hashMap) + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvReSchedule.setOnClickListener { + rescheduleAppointment() + } + + binding.tvMedicalHistory.setOnClickListener { + val fragment = MedicalHistoryFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_REQUEST_ID, request) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, fragment, R.id.container) + } + + binding.tvTrack.setOnClickListener { + checkStatus() + } + + binding.tvCancel.setOnClickListener { + cancelAppointment() + } + + binding.tvRate.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.RATE) + .putExtra(USER_DATA, request.to_user) + .putExtra(EXTRA_REQUEST_ID, request.id)) + } + + binding.tvApprove.setOnClickListener { + if (request.user_status == CallAction.PENDING) { + registerActivityResult.launch(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPROVE_HOUR) + .putExtra(EXTRA_REQUEST_ID, request)) + } + } + + binding.tvViewMap.setOnClickListener { + val address = request.service?.clinic_address + mapIntent(requireActivity(), address?.locationName ?: "", + address?.lat ?: 0.0, address?.long ?: 0.0) + } + + binding.tvViewPrescription.setOnClickListener { + val link = getString(R.string.pdf_link, BuildConfig.BASE_URL, request.id, BuildConfig.APP_UNIQUE_ID) + openPdf(requireActivity(), link, true, request) + + //downloadFile(link) + } + + binding.tvPayExtra.setOnClickListener { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.pay_extra, + R.string.pay_extra_message, R.string.pay, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireActivity(), true)) { + val extraPayment = Extra_payment() + extraPayment.request_id = request.id + viewModel.payExtra(extraPayment) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + } + + private fun checkStatus() { +// item.status = CallAction.REACHED + when (request.status) { + CallAction.START, CallAction.REACHED -> + registerActivityResult.launch(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, request.id)) + CallAction.START_SERVICE -> + registerActivityResult.launch(Intent(requireContext(), DrawerActivity::class.java) + /* .putExtra(PAGE_TO_OPEN, DrawerActivity.UPDATE_SERVICE)*/ + .putExtra(EXTRA_REQUEST_ID, request.id)) + } + } + + private fun rescheduleAppointment() { + if (BuildConfig.FLAVOR == "nurseLynx" && request.categoryData != null && request.service != null) { + val intentDate = Intent(requireActivity(), DoctorActionActivity::class.java) + .putExtra(PAGE_TO_OPEN, RequestType.DATE_TIME) + if (request.categoryData != null) { + intentDate.putExtra(CATEGORY_PARENT_ID, request.categoryData) + } + + if (request.service != null) { + intentDate.putExtra(SERVICE_ID, request.service) + } + + startActivity(intentDate) + + } else { + val service = Service() + service.service_id = request.service_id + service.service_name = request.service_type + service.main_service_type = request.main_service_type + + val intent = Intent(requireContext(), DoctorActionActivity::class.java) + .putExtra(PAGE_TO_OPEN, request.schedule_type) + .putExtra(SERVICE_ID, service) + .putExtra(USER_DATA, request.to_user) + + if (request.status != CallAction.COMPLETED) { + intent.putExtra(EXTRA_REQUEST_ID, request.id) + } + registerActivityResult.launch(intent) + } + } + + private fun cancelAppointment() { + val dialogBuilder = AlertDialog.Builder(requireContext()) + + val dialogView = layoutInflater.inflate(R.layout.alert_cancel_request, null) + dialogBuilder.setView(dialogView) + + val etReason: EditText = dialogView.findViewById(R.id.etReason) + val tvCancel: TextView = dialogView.findViewById(R.id.tvCancel) + val tvClose: TextView = dialogView.findViewById(R.id.tvClose) + + alertDialog = dialogBuilder.create() + alertDialog?.show() + + tvCancel.setOnClickListener { + if (etReason.text.toString().trim().isEmpty()) { + etReason.showSnackBar(getString(R.string.reason)) + } else { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["cancel_reason"] = etReason.text.toString().trim() + viewModel.cancelRequest(hashMap) + } + } + } + + tvClose.setOnClickListener { + alertDialog?.dismiss() + } + } + + private fun bindObservers() { + viewModel.requestDetail.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + request = it.data?.request_detail ?: Request() + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.cancelRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + alertDialog?.dismiss() + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.payExtra.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (it.data?.amountNotSufficient == true) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.insufficient_amount)) + .setMessage(it.data.message + ?: getString( + R.string.money_insufficient, + it.data.minimum_balance + )) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + } + .setNegativeButton(getString(R.string.add_money)) { dialog, which -> + startActivity(Intent(requireContext(), AddMoneyActivity::class.java)) + }.show() + + } else { + hitApi() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + binding.tvCancel.hideShowView(request.canCancel) + // binding.tvReSchedule.hideShowView(request.canReschedule) + // binding.tvReSchedule.text = getString(R.string.re_schedule) + binding.tvRate.gone() + binding.tvApprove.gone() + binding.tvViewPrescription.gone() + binding.tvTrack.gone() + + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) + + binding.tvName.text = getDoctorName(request.to_user) + binding.tvDesc.text = request.to_user?.categoryData?.name ?: getString(R.string.na) + + if (request.to_user?.totalRating != null && request.to_user?.totalRating != "0") { + binding.tvRating.visible() + binding.tvRating.text = getUserRating(request.to_user?.totalRating) + } + + binding.tvBookingPriceV.text = getCurrency(request.price) + binding.tvServiceTypeV.text = request.service_type + loadImage("profile",binding.ivPic, request.to_user?.profile_image, + R.drawable.ic_profile_placeholder) + + if (BuildConfig.FLAVOR == "nurseLynx" && !request.booking_end_date.isNullOrEmpty()) { + val dateBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.booking_end_date)}" + binding.tvBookingDateV.text = dateBooking + + val timeBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.booking_end_date)}" + binding.tvBookingTimeV.text = timeBooking + } else { + binding.tvBookingDateV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC) + binding.tvBookingTimeV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC) + } + + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) + + /*Cancel reason*/ + binding.tvCancelReason.hideShowView(!request.cancel_reason.isNullOrEmpty()) + binding.tvCancelReason.text = getString(R.string.reason_of_cancel, request.cancel_reason ?: "") + + when (request.status) { + CallAction.ACCEPT -> { + binding.tvStatus.text = getString(R.string.accepted) + binding.tvReSchedule.gone() + binding.tvCancel.gone() + } + CallAction.PENDING -> { + binding.tvStatus.text = getString(R.string.new_request) + binding.tvCancel.visible() + binding.tvReSchedule.gone() + } + CallAction.COMPLETED -> { + binding.tvStatus.text = getString(R.string.completed) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.textColorGreen)) + binding.tvReSchedule.text = getString(R.string.book_again) + binding.tvReSchedule.visible() + binding.tvCancel.gone() + binding.tvRate.hideShowView(request.rating.isNullOrEmpty()) + + binding.tvViewPrescription.hideShowView(request.is_prescription == true) + + if (BuildConfig.FLAVOR == "nurseLynx") { + when (request.user_status) { + CallAction.PENDING -> { + binding.tvApprove.visible() + } + else -> { + binding.tvApprove.gone() + binding.tvUserApprovalT.visible() + binding.tvUserApproval.visible() + binding.tvUserApprovalComment.visible() + binding.view1.visible() + + binding.tvUserApproval.text = request.user_status + binding.tvUserApprovalComment.text = request.user_comment + + if (request.user_status == CallAction.APPROVED) + binding.tvUserApproval.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) + else if (request.user_status == CallAction.DECLINED) + binding.tvUserApproval.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + } + } + } + + } + CallAction.INPROGRESS, CallAction.BUSY -> { + binding.tvStatus.text = getString(R.string.inprogess) + binding.tvReSchedule.gone() + binding.tvCancel.gone() + } + CallAction.START -> { + binding.tvStatus.text = getString(R.string.inprogess) + binding.tvTrack.visible() + binding.tvCancel.gone() + } + CallAction.REACHED -> { + binding.tvStatus.text = getString(R.string.reached_destination) + binding.tvTrack.visible() + binding.tvCancel.gone() + } + CallAction.START_SERVICE -> { + binding.tvStatus.text = getString(R.string.started) + binding.tvTrack.gone() + binding.tvCancel.gone() + } + CallAction.FAILED -> { + binding.tvStatus.text = getString(R.string.no_show) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + } + CallAction.CANCELED -> { + binding.tvStatus.text = getString(R.string.canceled) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + binding.tvReSchedule.gone() + binding.tvCancel.gone() + } + CallAction.CANCEL_SERVICE -> { + binding.tvStatus.text = getString(R.string.canceled_service) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + binding.tvCancel.gone() + } + else -> { + binding.tvStatus.text = getString(R.string.new_request) + binding.tvReSchedule.gone() + // binding.tvCancel.visible() + } + } + + when (request.service?.main_service_type) { + ConsultType.CLINIC_VISIT -> { + if (request.service?.clinic_address != null) { + binding.tvLocation.visible() + binding.tvViewMap.visible() + binding.tvLocation.text = request.service?.clinic_address?.locationName ?: "" + } + } + } + + /*Symptom*/ + binding.tvSymptomDec.text = request.symptom_details + binding.tvSymptomDec.hideShowView(binding.tvSymptomDec.text.isNotEmpty()) + + binding.rvSymptomListing.layoutManager = GridLayoutManager(requireContext(), 3) + + val symptomImages = ArrayList() + symptomImages.addAll(request.symptom_images ?: emptyList()) + val adapterSymptomImage = ImagesDocumentAdapter(this, symptomImages) + binding.rvSymptomDoc.adapter = adapterSymptomImage + binding.rvSymptomDoc.hideShowView(symptomImages.isNotEmpty()) + + val items = ArrayList() + items.addAll(request.symptoms ?: emptyList()) + val adapterSymptom = CheckItemAdapter(this, true, items) + binding.rvSymptomListing.adapter = adapterSymptom + + binding.tvSymptom.hideShowView(binding.tvSymptomDec.text.isNotEmpty() || items.isNotEmpty()) + + /*Extra Payment*/ + extraPayment() + + /*CarePlan*/ + val itemsCarePlan = ArrayList() + if (request.tier_detail != null) { + request.tier_detail?.isSelected = true + itemsCarePlan.add(request.tier_detail ?: Filter()) + } + binding.tvCarePlan.hideShowView(itemsCarePlan.isNotEmpty()) + binding.rvCatePlan.hideShowView(itemsCarePlan.isNotEmpty()) + val adapterCarePlan = CarePlanAdapter(this, CarePlanAdapter.PlanOption.MAIN, itemsCarePlan) + binding.rvCatePlan.adapter = adapterCarePlan + + /*Pre Assessment*/ + val itemsPreAssessment = ArrayList() + itemsPreAssessment.addAll(request.question_answers ?: emptyList()) + binding.tvPreAssessment.hideShowView(itemsPreAssessment.isNotEmpty()) + binding.tvPreAssessmentV.hideShowView(itemsPreAssessment.isNotEmpty()) + + var answers = "" + itemsPreAssessment.forEachIndexed { index, page -> + answers += when (index) { + 1 -> "${index + 1}. ${page.question}\nAns: ${page.answer} Kg\n\n" + 2 -> "${index + 1}. ${page.question}\nAns: ${page.answer} cm\n\n" + else -> "${index + 1}. ${page.question}\nAns: ${page.answer}\n\n" + } + } + binding.tvPreAssessmentV.text = answers + + } + + private fun extraPayment() { + if (request.extra_payment != null) { + binding.tvExtraPayment.visible() + binding.tvExtraPaymentAmount.visible() + binding.tvExtraPaymentDesc.visible() + binding.tvExtraStatus.visible() + binding.tvExtraPaymentAmount.text = + getString(R.string.amount_s, getCurrency(request.extra_payment?.balance)) + binding.tvExtraPaymentDesc.text = request.extra_payment?.description + binding.tvExtraStatus.text = "(${request.extra_payment?.status})" + + when (request.extra_payment?.status) { + CallAction.PENDING -> { + binding.tvPayExtra.visible() + binding.tvExtraStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPending)) + } + CallAction.PAID -> { + binding.tvPayExtra.gone() + binding.tvExtraStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.textColorGreen)) + } + else -> + binding.tvPayExtra.gone() + } + } + } + + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + } + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.BOOKING_RESERVED) + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.REQUEST_ACCEPTED) + intentFilter.addAction(PushType.CANCELED_REQUEST) + intentFilter.addAction(PushType.REQUEST_FAILED) + intentFilter.addAction(PushType.CHAT_STARTED) + intentFilter.addAction(PushType.START) + intentFilter.addAction(PushType.START_SERVICE) + intentFilter.addAction(PushType.CANCEL_SERVICE) + intentFilter.addAction(PushType.REACHED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(PushType.UPCOMING_APPOINTMENT) + intentFilter.addAction(PushType.PRESCRIPTION_ADDED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + intentFilter.addAction(PushType.REQUEST_EXTRA_PAYMENT) + intentFilter.addAction(PushType.CARE_PLAN_DONE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.BOOKING_RESERVED, PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.REQUEST_ACCEPTED, + PushType.CANCELED_REQUEST, PushType.REQUEST_FAILED, PushType.CHAT_STARTED, PushType.UPCOMING_APPOINTMENT, + PushType.START, PushType.START_SERVICE, PushType.CANCEL_SERVICE, PushType.PRESCRIPTION_ADDED, + PushType.REACHED, NetworkIssueFragment.NETWORK_ISSUE, PushType.REQUEST_EXTRA_PAYMENT, PushType.CARE_PLAN_DONE -> { + if (request.id == intent.getStringExtra(EXTRA_REQUEST_ID)) + hitApi() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryAdapter.kt new file mode 100644 index 0000000..59b5c2a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantapp.ui.dashboard.appointment.medicalhistory + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.MedicalHistory +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemMedicalHistoryBinding +import com.consultantapp.utils.getDoctorName +import com.consultantapp.utils.loadImage + + +class MedicalHistoryAdapter(private val fragmentMain: MedicalHistoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_medical_history, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemMedicalHistoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: UserData) = with(binding) { + tvName.text = getDoctorName(item) + tvDesc.text = item.category ?: fragmentMain.getString(R.string.na) + loadImage("tag",binding.ivPic, item.profile_image, + R.drawable.image_placeholder) + + val medical_history = ArrayList() + medical_history.addAll(item.medical_history ?: emptyList()) + val adapter = MedicalHistoryItemAdapter(fragmentMain, medical_history) + rvListingItems.adapter = adapter + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryFragment.kt new file mode 100644 index 0000000..0a5f0b8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryFragment.kt @@ -0,0 +1,181 @@ +package com.consultantapp.ui.dashboard.appointment.medicalhistory + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentMedicalHistoryBinding +import com.consultantapp.ui.dashboard.home.questions.QuestionViewModel +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class MedicalHistoryFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentMedicalHistoryBinding + + private var rootView: View? = null + + private lateinit var viewModel: QuestionViewModel + + private var items = ArrayList() + + private lateinit var adapter: MedicalHistoryAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private lateinit var request: Request + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_medical_history, + container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + + request = arguments?.getSerializable(EXTRA_REQUEST_ID) as Request + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_medical_history) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_medical_history_desc) + + } + + private fun setAdapter() { + adapter = MedicalHistoryAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + hashMap["request_id"] = request.id ?: "" + viewModel.getMedicalHistory(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getMedicalHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.doctors ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryItemAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryItemAdapter.kt new file mode 100644 index 0000000..812a5b2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/medicalhistory/MedicalHistoryItemAdapter.kt @@ -0,0 +1,60 @@ +package com.consultantapp.ui.dashboard.appointment.medicalhistory + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.MedicalHistory +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemMedicalHistoryItemBinding +import com.consultantapp.utils.DateFormat +import com.consultantapp.utils.DateUtils + + +class MedicalHistoryItemAdapter(private val fragmentMain: MedicalHistoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_medical_history_item, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemMedicalHistoryItemBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: MedicalHistory) = with(binding) { + tvDate.text = fragmentMain.getString(R.string.appointment_date_s, DateUtils.dateTimeFormatFromUTC( + DateFormat.MON_DATE_YEAR, item.request?.booking_date)) + tvComment.text = item.comment ?: fragmentMain.getString(R.string.na) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/appointment/rating/AddRatingFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/rating/AddRatingFragment.kt new file mode 100644 index 0000000..31fcac7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/appointment/rating/AddRatingFragment.kt @@ -0,0 +1,118 @@ +package com.consultantapp.ui.dashboard.appointment.rating + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentAddRatingBinding +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class AddRatingFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + + private lateinit var binding: FragmentAddRatingBinding + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var progressDialog: ProgressDialog + + private var rootView: View? = null + + private lateinit var userData: UserData + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_add_rating, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + + userData = requireActivity().intent.getSerializableExtra(USER_DATA) as UserData + + binding.tvName.text = getDoctorName(userData) + loadImage("tag", + binding.ivPic, userData.profile_image, + R.drawable.ic_profile_placeholder + ) + + editTextScroll(binding.etDescription) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvSubmit.setOnClickListener { + binding.tvSubmit.hideKeyboard() + + when { + binding.ratingBar.rating <= 0 -> { + binding.ratingBar.showSnackBar(getString(R.string.error_select_rating)) + } + else -> { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["consultant_id"] = userData.id ?: "" + if (requireActivity().intent.hasExtra(EXTRA_REQUEST_ID)) + hashMap["request_id"] = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) ?:"" + hashMap["rating"] = binding.ratingBar.rating.toString() + hashMap["review"] = binding.etDescription.text.toString().trim() + + viewModel.addReview(hashMap) + } + } + } + } + } + + private fun bindObservers() { + viewModel.addReview.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/careplan/CarePlanAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/careplan/CarePlanAdapter.kt new file mode 100644 index 0000000..ff8cc54 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/careplan/CarePlanAdapter.kt @@ -0,0 +1,173 @@ +package com.consultantapp.ui.dashboard.careplan + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.databinding.RvItemCarePlanBinding +import com.consultantapp.databinding.RvItemCarePlanOptionBinding +import com.consultantapp.databinding.RvItemCarePlanSelectBinding +import com.consultantapp.databinding.RvSelectCarePlanBinding +import com.consultantapp.ui.dashboard.appointment.detail.AppointmentDetailFragment +import com.consultantapp.ui.dashboard.doctor.schedule.DateTimeFragment +import com.consultantapp.utils.CallAction +import com.consultantapp.utils.hideShowView + + +class CarePlanAdapter(private val fragment: Fragment, private val planOption: PlanOption, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (planOption) { + PlanOption.SELECTION -> + (holder as ViewHolderSelectTier).bind(items[position]) + PlanOption.FIRST_OPTION -> + (holder as ViewHolderOption).bind(items[position]) + PlanOption.SELECT_OPTION -> + (holder as ViewHolderSelect).bind(items[position]) + else -> + (holder as ViewHolder).bind(items[position]) + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (planOption) { + PlanOption.SELECTION -> + ViewHolderSelectTier(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_select_care_plan, parent, false)) + PlanOption.FIRST_OPTION -> + ViewHolderOption(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_care_plan_option, parent, false)) + PlanOption.SELECT_OPTION -> + ViewHolderSelect(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_care_plan_select, parent, false)) + else -> + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_care_plan, parent, false)) + } + + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemCarePlanBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + + binding.root.setOnClickListener { + if (!(fragment is AppointmentDetailFragment)) { + val selectedPos = bindingAdapterPosition + + if (!items[selectedPos].isSelected) { + items.forEachIndexed { index, filter -> + items[index].isSelected = index == selectedPos + } + notifyDataSetChanged() + } + } + } + + } + + fun bind(item: Filter) = with(binding) { + tvPlan.text = item.title + + binding.rvListing.hideShowView(item.isSelected) + + val listOptions = ArrayList() + listOptions.addAll(items[bindingAdapterPosition].tier_options ?: emptyList()) + val adapter = CarePlanAdapter(fragment, PlanOption.FIRST_OPTION, listOptions) + binding.rvListing.adapter = adapter + } + } + + inner class ViewHolderSelectTier(val binding: RvSelectCarePlanBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.cvMain.setOnClickListener { + val selectedPos = bindingAdapterPosition + + if (items[selectedPos].isSelected) { + items[selectedPos].isSelected = false + } else { + items.forEachIndexed { index, filter -> + items[index].isSelected = index == selectedPos + } + } + + notifyDataSetChanged() + + if (fragment is DateTimeFragment) + fragment.setTierSelected(items[selectedPos]) + } + } + + fun bind(item: Filter) = with(binding) { + tvPlan.text = item.title?.substring(0, 6) + + tvPlan.isChecked = item.isSelected + } + } + + inner class ViewHolderOption(val binding: RvItemCarePlanOptionBinding) : + RecyclerView.ViewHolder(binding.root) { + + + fun bind(item: Filter) = with(binding) { + val context = binding.root.context + + tvPlan.text = item.title + + if (fragment is AppointmentDetailFragment) + cbDone.hideShowView(item.status != CallAction.PENDING) + + if (fragment is AppointmentDetailFragment) { + val help = if (item.type == "1") context.getString(R.string.need_some_help) + else context.getString(R.string.need_much_help) + + tvPlan.text = "${item.title} ($help)" + + } else { + item.tier_options_select = ArrayList() + item.tier_options_select?.add(Filter(title = context.getString(R.string.need_some_help))) + item.tier_options_select?.add(Filter(title = context.getString(R.string.need_much_help))) + val prefrenceItemAdapter = CarePlanAdapter(fragment, PlanOption.SELECT_OPTION, item.tier_options_select + ?: ArrayList()) + rvListing.adapter = prefrenceItemAdapter + } + } + } + + inner class ViewHolderSelect(val binding: RvItemCarePlanSelectBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + if (!(fragment is AppointmentDetailFragment)) { + binding.clMain.setOnClickListener { + items.forEachIndexed { index, filterOption -> + items[index].isSelected = bindingAdapterPosition == index + } + notifyDataSetChanged() + } + } + } + + fun bind(item: Filter) = with(binding) { + rbName.text = item.title + + rbName.isChecked = item.isSelected + + } + } + + enum class PlanOption { + SELECTION, MAIN, FIRST_OPTION, SELECT_OPTION + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/careplan/CarePlanFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/careplan/CarePlanFragment.kt new file mode 100644 index 0000000..b5a6f3a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/careplan/CarePlanFragment.kt @@ -0,0 +1,165 @@ +package com.consultantapp.ui.dashboard.careplan + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentCarePlanBinding +import com.consultantapp.ui.dashboard.doctor.confirm.ConfirmBookingFragment.Companion.CARE_PLAN +import com.consultantapp.ui.dashboard.doctor.symptom.PandemicViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class CarePlanFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentCarePlanBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private var itemsPlans = ArrayList() + + private lateinit var adapter: CarePlanAdapter + + private lateinit var viewModel: PandemicViewModel + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_care_plan, container, false) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + } + return rootView + } + + private fun initialise() { + //binding.toolbar.navigationIcon = null + binding.tvSkip.gone() + + viewModel = ViewModelProvider(this, viewModelFactory)[PandemicViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + + viewModel.carePlanTier() + } + + private fun setAdapter() { + adapter = CarePlanAdapter(this, CarePlanAdapter.PlanOption.MAIN, itemsPlans) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + onBackClick() + } + + binding.tvDone.setOnClickListener { + var isSelected = false + var carePlan = Filter() + itemsPlans.forEach { + if (it.isSelected) { + carePlan = it + it.tier_options?.forEach { + it.tier_options_select?.forEach { + if (it.isSelected) { + isSelected = true + return@forEach + } + } + } + } + } + + + if (!isSelected) { + binding.tvDone.showSnackBar(getString(R.string.select_care_plan)) + } else if (isConnectedToInternet(requireContext(), true)) { + val intent = Intent() + intent.putExtra(CARE_PLAN, carePlan) + requireActivity().setResult(Activity.RESULT_OK, intent) + requireActivity().finish() + } + + } + } + + private fun bindObservers() { + viewModel.carePlanTier.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + itemsPlans.clear() + itemsPlans.addAll(it.data?.tiers ?: emptyList()) + adapter.notifyDataSetChanged() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.updateCarePlan.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + val intent = Intent() + intent.action = PushType.REQUEST_ACCEPTED + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + onBackClick() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun onBackClick() { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + private fun setData() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/careplan/QuestionAnswerFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/careplan/QuestionAnswerFragment.kt new file mode 100644 index 0000000..1cd8d12 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/careplan/QuestionAnswerFragment.kt @@ -0,0 +1,157 @@ +package com.consultantapp.ui.dashboard.careplan + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.requests.UpdateSymptom +import com.consultantapp.data.models.responses.Page +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentQuestionAnswerBinding +import com.consultantapp.ui.dashboard.doctor.symptom.PandemicViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class QuestionAnswerFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentQuestionAnswerBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: PandemicViewModel + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_question_answer, container, false) + rootView = binding.root + + initialise() + listeners() + setQuestions() + bindObservers() + } + return rootView + } + + private fun initialise() { + binding.toolbar.navigationIcon = null + + viewModel = ViewModelProvider(this, viewModelFactory)[PandemicViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + onBackClick() + } + + binding.tvSkip.setOnClickListener { + onBackClick() + } + + binding.tvDone.setOnClickListener { + binding.etQue1Description.hideKeyboard() + when { + binding.etQue1Description.text.toString().trim().isEmpty() -> { + binding.etQue1Description.showSnackBar(getString(R.string.how_long_have_you_felt_this_way)) + } + binding.etQue2Description.text.toString().trim().isEmpty() -> { + binding.etQue2Description.showSnackBar(getString(R.string.what_your_weight)) + } + binding.etQue3Description.text.toString().trim().isEmpty() -> { + binding.etQue3Description.showSnackBar(getString(R.string.what_your_height)) + } + isConnectedToInternet(requireContext(), true) -> { + val itemsQuestions = ArrayList() + itemsQuestions.add(Page(question = getString(R.string.how_long_have_you_felt_this_way), answer = binding.etQue1Description.text.toString().trim())) + itemsQuestions.add(Page(question = getString(R.string.what_your_weight), answer = binding.etQue2Description.text.toString().trim())) + itemsQuestions.add(Page(question = getString(R.string.what_your_height), answer = binding.etQue3Description.text.toString().trim())) + + var answer = if (binding.rgQue4.rgQue.checkedRadioButtonId == R.id.rbYes) getString(R.string.yes) else getString(R.string.no) + itemsQuestions.add(Page(question = getString(R.string.are_you_taking_any_medication), answer = answer)) + answer = if (binding.rgQue5.rgQue.checkedRadioButtonId == R.id.rbYes) getString(R.string.yes) else getString(R.string.no) + itemsQuestions.add(Page(question = getString(R.string.do_you_have_allergies), answer = answer)) + answer = if (binding.rgQue6.rgQue.checkedRadioButtonId == R.id.rbYes) getString(R.string.yes) else getString(R.string.no) + itemsQuestions.add(Page(question = getString(R.string.do_you_smoke), answer = answer)) + answer = if (binding.rgQue7.rgQue.checkedRadioButtonId == R.id.rbYes) getString(R.string.yes) else getString(R.string.no) + itemsQuestions.add(Page(question = getString(R.string.do_you_drink), answer = answer)) + + val updateSymptom = UpdateSymptom() + updateSymptom.request_id = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) + ?: "" + updateSymptom.question_answers = ArrayList() + updateSymptom.question_answers?.addAll(itemsQuestions) + updateSymptom.type = "question_answers" + viewModel.updateCarePlan(updateSymptom) + } + } + } + } + + private fun setQuestions() { + binding.rgQue1.rgQue.gone() + binding.rgQue2.rgQue.gone() + binding.rgQue3.rgQue.gone() + + binding.rgQue1.tvQue.text = getString(R.string.how_long_have_you_felt_this_way) + binding.rgQue2.tvQue.text = getString(R.string.what_your_weight) + binding.rgQue3.tvQue.text = getString(R.string.what_your_height) + binding.rgQue4.tvQue.text = getString(R.string.are_you_taking_any_medication) + binding.rgQue5.tvQue.text = getString(R.string.do_you_have_allergies) + binding.rgQue6.tvQue.text = getString(R.string.do_you_smoke) + binding.rgQue7.tvQue.text = getString(R.string.do_you_drink) + + } + + private fun bindObservers() { + viewModel.updateCarePlan.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + val intent = Intent() + intent.action = PushType.REQUEST_ACCEPTED + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + onBackClick() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun onBackClick() { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + private fun setData() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/BottomAudioPlayerFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/BottomAudioPlayerFragment.kt new file mode 100644 index 0000000..e62e940 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/BottomAudioPlayerFragment.kt @@ -0,0 +1,156 @@ +package com.consultantapp.ui.dashboard.chat + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.media.MediaPlayer +import android.net.Uri +import android.os.Bundle +import android.os.Handler +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.BottomAudioPlayerBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.longToast +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import java.io.IOException +import java.util.concurrent.TimeUnit +import javax.inject.Inject + + +class BottomAudioPlayerFragment(private val link: String) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomAudioPlayerBinding + + private var mPlayer: MediaPlayer? = null + + private val hdlr: Handler = Handler() + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_audio_player, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + binding.sBar.isClickable = false + binding.btnPause.isEnabled = false + + startPlaying(link) + } + + private fun listeners() { + binding.btnPlay.setOnClickListener { + // requireActivity().longToast( "Playing Audio") + mPlayer?.start() + setAudioStart() + } + + binding.btnPause.setOnClickListener(object : View.OnClickListener { + override fun onClick(v: View?) { + mPlayer?.pause() + binding.btnPause.isEnabled = false + binding.btnPlay.isEnabled = true + requireActivity().longToast("Pausing Audio") + } + }) + + mPlayer?.setOnCompletionListener { + binding.btnPause.isEnabled = false + binding.btnPlay.isEnabled = true + } + + mPlayer?.setOnPreparedListener { + setAudioStart() + } + } + + private fun setAudioStart() { + Log.e("MediaPlayer", mPlayer?.currentPosition.toString()) + eTime = mPlayer?.duration ?: 0 + sTime = mPlayer?.currentPosition ?: 0 + if (oTime == 0) { + binding.sBar.max = eTime + oTime = 1 + } + binding.txtSongTime.text = String.format("%dm : %ds", TimeUnit.MILLISECONDS.toMinutes(eTime.toLong()), + TimeUnit.MILLISECONDS.toSeconds(eTime.toLong()) - TimeUnit.MINUTES.toSeconds( + TimeUnit.MILLISECONDS.toMinutes(eTime.toLong()))) + binding.txtStartTime.text = String.format("%dm : %ds", TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()), + TimeUnit.MILLISECONDS.toSeconds(sTime.toLong()) - TimeUnit.MINUTES.toSeconds( + TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()))) + binding.sBar.progress = sTime + hdlr.postDelayed(updateSongTime, 100) + binding.btnPause.isEnabled = true + binding.btnPlay.isEnabled = false + } + + private val updateSongTime: Runnable = object : Runnable { + override fun run() { + sTime = mPlayer?.currentPosition ?: 0 + binding.txtStartTime.text = String.format("%dm : %ds", TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()), + TimeUnit.MILLISECONDS.toSeconds(sTime.toLong()) - TimeUnit.MINUTES.toSeconds( + TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()))) + binding.sBar.progress = sTime + hdlr.postDelayed(this, 100) + } + } + + private fun startPlaying(link: String) { + mPlayer = MediaPlayer().apply { + try { + setDataSource(requireContext(), Uri.parse(link)) + prepare() + start() + } catch (e: IOException) { + Log.e("MediaPlayer", "prepare() failed") + } + } + } + + private fun stopPlaying() { + mPlayer?.release() + mPlayer = null + + } + + companion object { + private var oTime = 0 + private var sTime = 0 + private var eTime = 0 + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatAdapter.kt new file mode 100644 index 0000000..13d014f --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatAdapter.kt @@ -0,0 +1,109 @@ +package com.consultantapp.ui.dashboard.chat + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.chat.ChatList +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemChatListingBinding +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.utils.* +import com.consultantapp.utils.DateFormat.DATE_TIME_FORMAT + +class ChatAdapter(private val fragment: ChatFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_chat_listing, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: ItemChatListingBinding) : + RecyclerView.ViewHolder(binding.root) { + val context: Context = binding.root.context + + fun bind(item: ChatList) = with(binding) { + //slideRecyclerItem(binding.root, binding.root.context) + + when (item.last_message?.messageType) { + DocType.IMAGE -> { + tvTextMessage.gone() + ivCamera.visible() + tvPhoto.visible() + tvPhoto.text = context.getString(R.string.photo) + ivCamera.setImageResource(R.drawable.ic_camera) + } + DocType.PDF -> { + tvTextMessage.gone() + ivCamera.visible() + tvPhoto.visible() + + tvPhoto.text = context.getString(R.string.pdf) + ivCamera.setImageResource(R.drawable.ic_pdf) + } + DocType.AUDIO -> { + tvTextMessage.gone() + ivCamera.visible() + tvPhoto.visible() + + tvPhoto.text = context.getString(R.string.audio) + ivCamera.setImageResource(R.drawable.ic_mic) + } + else -> { + tvTextMessage.visible() + ivCamera.gone() + tvPhoto.gone() + } + } + loadImage("profile",ivUserImage, item.to_user?.profile_image, + R.drawable.ic_profile_placeholder) + + tvUserName.text = "${getDoctorName(item.to_user)} (${item.status})" + tvTextMessage.text = item.last_message?.message + tvDate.text = + DateUtils.dateFormatFromMillis(DATE_TIME_FORMAT, item.last_message?.sentAt) + + if (item.unReadCount > 0) { + tvUnreadCount.visible() + tvUnreadCount.text = getCountFormat(2, item.unReadCount) + } else { + tvUnreadCount.gone() + } + + itemView.setOnClickListener { + fragment.startActivity(item) + item.unReadCount = 0 + notifyItemChanged(bindingAdapterPosition) + } + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatFragment.kt new file mode 100644 index 0000000..4f9942a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatFragment.kt @@ -0,0 +1,367 @@ +package com.consultantapp.ui.dashboard.chat + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.ConnectivityManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.chat.ChatList +import com.consultantapp.data.models.responses.chat.ChatMessage +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentChatBinding +import com.consultantapp.ui.dashboard.chat.chatdetail.ChatDetailActivity +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.AppSocket.Events.Companion.DELIVERED_MESSAGE +import com.google.gson.Gson +import dagger.android.support.DaggerFragment +import io.socket.client.Ack +import kotlinx.android.synthetic.main.item_no_data.view.* +import org.json.JSONObject +import javax.inject.Inject + +class ChatFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + private lateinit var binding: FragmentChatBinding + + private var rootView: View? = null + + private lateinit var adapter: ChatAdapter + + private lateinit var llm: LinearLayoutManager + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private lateinit var viewModel: ChatViewModel + + private var items = ArrayList() + + private var isReceiverRegistered = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_chat, container, false) + rootView = binding.root + + viewModel = ViewModelProvider(this, viewModelFactory)[ChatViewModel::class.java] + bindObservers() + listeners() + setAdapter() + initialise() + } + return rootView + } + + private fun initialise() { + binding.tvWallet.visible() + try { + appSocket.addOnMessageReceiver(messageReceiver) + } catch (e: Exception) { + appSocket.init() + appSocket.addOnMessageReceiver(messageReceiver) + } + + LocalBroadcastManager.getInstance(activity as Context) + .registerReceiver(broadcastChat, IntentFilter(UPDATE_CHAT)) + + requireActivity().registerReceiver(broadcastReceiver, + IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) + ) + + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_chat_empty) + binding.clNoData.tvNoData.text = getString(R.string.no_chat) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_chat_desc) + } + + + private val messageReceiver = object: AppSocket.OnMessageReceiver { + override fun onMessageReceive(message: ChatMessage?) { + refreshChatLogs(message, message?.senderId,message?.request_id?:"", unDeliveredCount = 1) + sendMessageDelivered(message) + } + } + + + private fun sendMessageDelivered(message: ChatMessage?) { + val obj = JSONObject() + obj.put("messageId", message?.messageId) + obj.put("receiverId", message?.senderId) + obj.put("senderId", message?.receiverId) + appSocket.emit(DELIVERED_MESSAGE, obj, Ack { + + }) + } + + private fun refreshChatLogs(message: ChatMessage?, userId: String?, requestChatId: String = "", unDeliveredCount: Int = 0) { + requireActivity().runOnUiThread { + val index = items.indexOf(items.find { + it.to_user?.id == userId && it.id == requestChatId + }) + if (index == -1) { + getListing(true) + } else { + if (message?.request_id != null) + items[index].id = message.request_id + + + items[index].last_message = message + items[index].image = message?.imageUrl + items[index].messageType = message?.messageType + + if (message?.senderId != ChatDetailActivity.otherUserID) + items[index].unReadCount = items[index].unReadCount.plus(unDeliveredCount) + + items.sortByDescending { + it.last_message?.sentAt + } + adapter.notifyDataSetChanged() + + } + } + } + + + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (ConnectivityManager.CONNECTIVITY_ACTION == intent.action) { + getListing(true) + } + } + } + + + override fun onDestroyView() { + super.onDestroyView() + try { + appSocket.removeOnMessageReceiver(messageReceiver) + LocalBroadcastManager.getInstance(activity as Context).unregisterReceiver(broadcastChat) + requireActivity().unregisterReceiver(broadcastReceiver) + } catch (e: Exception) { + } + } + + + fun hitApiRefresh() { + getListing(true) + } + + private fun getListing(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[ApiKeys.AFTER] = items[items.size - 1].id ?: "" + + hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.getChatListing(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvWallet.setOnClickListener { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.WALLET)) + } + + binding.swipeRefresh.setOnRefreshListener { + isLoadingMoreItems = true + getListing(true) + } + + binding.rvChat.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvChat.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + getListing(false) + } + } + }) + + } + + private fun bindObservers() { + viewModel.chatListing.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.lists ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + /*Set Message delivered*/ + items.forEach { + if (it.last_message?.status != AppSocket.MessageStatus.SEEN && + it.last_message?.status != AppSocket.MessageStatus.DELIVERED) { + /*If message is not read*/ + sendMessageDelivered(it.last_message) + } + } + + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + + Status.LOADING -> { + if (!binding.swipeRefresh.isRefreshing && !isLoadingMoreItems) + binding.clLoader.visible() + } + } + }) + } + + private fun setAdapter() { + llm = LinearLayoutManager(activity) + binding.rvChat.layoutManager = llm + + adapter = ChatAdapter(this, items) + binding.rvChat.adapter = adapter + binding.rvChat.itemAnimator = null + } + + fun startActivity(item: ChatList) { + registerActivityResult.launch(Intent(context, ChatDetailActivity::class.java) + .putExtra(USER_ID, item.to_user?.id) + .putExtra(USER_NAME, item.to_user?.name) + .putExtra(EXTRA_REQUEST_ID, item.id) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } + + val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + val data = result.data + if (data != null) { + val lastMsgData = + Gson().fromJson(data.getStringExtra(LAST_MESSAGE), ChatMessage::class.java) + val userId = data.getStringExtra(OTHER_USER_ID) + val requestChatId = data.getStringExtra(EXTRA_REQUEST_ID) + refreshChatLogs(lastMsgData, userId, requestChatId?:"") + } + } + } + + private val broadcastChat = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + getListing(true) + } + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(PushType.CHAT_STARTED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.CHAT_STARTED, + NetworkIssueFragment.NETWORK_ISSUE -> { + getListing(true) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatViewModel.kt new file mode 100644 index 0000000..8f0cde6 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/ChatViewModel.kt @@ -0,0 +1,70 @@ +package com.consultantapp.ui.dashboard.chat + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class ChatViewModel @Inject constructor(private val webService: WebService): ViewModel() { + + val chatListing by lazy { SingleLiveEvent>() } + + val chatMessages by lazy { SingleLiveEvent>() } + + fun getChatListing(hashMap: HashMap) { + chatListing.value = Resource.loading() + + webService.getChatListing(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + chatListing.value = Resource.success(response.body()?.data) + } else { + chatListing.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + chatListing.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun getChatMessage(hashmap: HashMap) { + chatMessages.value = Resource.loading() + webService.getChatMessage(hashmap) + .enqueue(object : Callback> { + override fun onFailure( + call: Call>, + throwable: Throwable) { + chatMessages.value = Resource.error(ApiUtils.failure(throwable)) + } + + override fun onResponse( + call: Call>, + response: Response>) { + if (response.isSuccessful) { + chatMessages.value = Resource.success(response.body()?.data) + } else { + chatMessages.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/UploadFileViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/UploadFileViewModel.kt new file mode 100644 index 0000000..505914e --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/UploadFileViewModel.kt @@ -0,0 +1,43 @@ +package com.consultantapp.ui.dashboard.chat + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class UploadFileViewModel @Inject constructor(private val webService: WebService): ViewModel() { + + val uploadFile by lazy { SingleLiveEvent>() } + + fun uploadFile(hashMap: HashMap) { + uploadFile.value = Resource.loading() + + webService.uploadFile(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + uploadFile.value = Resource.success(response.body()?.data) + } else { + uploadFile.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + uploadFile.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/chatdetail/ChatDetailActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/chatdetail/ChatDetailActivity.kt new file mode 100644 index 0000000..34018cd --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/chatdetail/ChatDetailActivity.kt @@ -0,0 +1,1185 @@ +package com.consultantapp.ui.dashboard.chat.chatdetail + +import android.os.Build +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.media.MediaPlayer +import android.media.MediaRecorder +import android.net.ConnectivityManager +import android.net.Uri +import android.os.Bundle +import android.os.CountDownTimer +import android.provider.MediaStore +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import androidx.annotation.RequiresApi +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.chat.ChatMessage +import com.consultantapp.data.network.* +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityChatDetailBinding +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.ui.dashboard.chat.ChatViewModel +import com.consultantapp.ui.dashboard.chat.UploadFileViewModel +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.AppSocket.Events.* +import com.consultantapp.utils.AppSocket.Events.Companion.BROADCAST +import com.consultantapp.utils.AppSocket.Events.Companion.DELIVERED_MESSAGE +import com.consultantapp.utils.AppSocket.Events.Companion.READ_MESSAGE +import com.consultantapp.utils.AppSocket.Events.Companion.SEND_MESSAGE +import com.consultantapp.utils.AppSocket.Events.Companion.TYPING +import com.consultantapp.utils.AppSocket.MessageStatus.Companion.DELIVERED +import com.consultantapp.utils.AppSocket.MessageStatus.Companion.NOT_SENT +import com.consultantapp.utils.AppSocket.MessageStatus.Companion.SENT +import com.consultantapp.utils.PermissionUtils +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.dialogs.ProgressDialogImage +import com.devlomi.record_view.OnRecordListener +import com.google.gson.Gson +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import io.socket.client.Ack +import io.socket.emitter.Emitter +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.internal.filterList +import org.json.JSONException +import org.json.JSONObject +import permissions.dispatcher.* +import timber.log.Timber +import java.io.File +import java.io.IOException +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList +import kotlin.concurrent.fixedRateTimer +import kotlin.concurrent.schedule + + +@RuntimePermissions +class ChatDetailActivity : BasePhotoUploadActivity(), AppSocket.OnMessageReceiver { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var userRepository: UserRepository + + + companion object { + private const val REQUEST_CODE_RECORD_AUDIO = 1 + const val DELAY: Long = 2000 + var otherUserID = "-1" + var requestId = "-1" + var isActive = false + } + + lateinit var binding: ActivityChatDetailBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var adapter: ChatDetailAdapter + + private lateinit var viewModel: ChatViewModel + + private lateinit var viewModelCall: AppointmentViewModel + + private var userID = "" + + private var userName = "" + + private var hasMoreItems = false + + private lateinit var llm: LinearLayoutManager + + private var items = ArrayList() + + private lateinit var viewModelUpload: UploadFileViewModel + + private var isTyping = false + + private var timer = Timer() + + private var timerTyping = Timer() + + private var countDownTimer: CountDownTimer? = null + + private val TOTAL_TIME = 60000L + + private var isReceiverRegistered = false + + private var audioFileName = "" + + private var timerPendingMessage = Timer() + + private var pageBeforeAfter: String? = null + + private var isLoadingItems = false + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //LocaleHelper.setLocale(this, getUserLanguage()) + binding = DataBindingUtil.setContentView(this, R.layout.activity_chat_detail) + + initialise() + liveData() + + listeners() + setAdapter() + setButtonMicSend() + checkNotSentMessage() + } + + /*override fun attachBaseContext(base: Context?) { + val locale = Locale(getUserLanguage()) + val contxt = ContextWrapper.wrap(base,locale) + super.attachBaseContext(contxt) + }*/ + + private fun initialise() { + audioFileName = "${externalCacheDir?.absolutePath}/${System.currentTimeMillis()}_audio.wav" + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + progressDialog = ProgressDialog(this) + progressDialogImage = ProgressDialogImage(this) + viewModel = ViewModelProvider(this, viewModelFactory)[ChatViewModel::class.java] + viewModelCall = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + registerReceiver(broadcastReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) + + requestId = intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + + userID = userRepository.getUser()?.id ?: "" + userName = intent.getStringExtra(USER_NAME) ?: "" + binding.tvUserName.text = userName + } + + + override fun onStart() { + super.onStart() + + socketEvents(makeOn = true) + } + + private fun socketEvents(makeOn: Boolean = true) { + appSocket.off(TYPING, listener) + appSocket.off(READ_MESSAGE, listenerRead) + appSocket.off(DELIVERED_MESSAGE, listenerDelivered) + appSocket.off(BROADCAST, listenerStatus) + appSocket.removeOnMessageReceiver(this) + + if (makeOn) { + if (!appSocket.isConnected) + appSocket.init() + + appSocket.addOnMessageReceiver(this) + appSocket.on(TYPING, listener) + appSocket.on(READ_MESSAGE, listenerRead) + appSocket.on(DELIVERED_MESSAGE, listenerDelivered) + appSocket.on(BROADCAST, listenerStatus) + } + } + + override fun onDestroy() { + super.onDestroy() + + socketEvents(makeOn = false) + unregisterReceiver(broadcastReceiver) + unregisterReceiver() + timerPendingMessage.cancel() + } + + override fun onBackPressed() { + if (items.isNotEmpty()) { + val intent = Intent() + intent.putExtra(LAST_MESSAGE, Gson().toJson(items[0])) + intent.putExtra(OTHER_USER_ID, otherUserID) + intent.putExtra(EXTRA_REQUEST_ID, requestId) + setResult(Activity.RESULT_OK, intent) + } + otherUserID = "-1" + super.onBackPressed() + } + + private fun getChatData() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + + when { + items.isNotEmpty() && pageBeforeAfter == ApiKeys.AFTER -> { + hashMap[ApiKeys.AFTER] = items[items.size - 1].messageId.toString() + hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD_CHAT.toString() + } + items.isNotEmpty() && pageBeforeAfter == ApiKeys.BEFORE -> { + hashMap[ApiKeys.BEFORE] = items[0].messageId.toString() + hashMap[ApiKeys.PER_PAGE] = "1000" + } + else -> hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD_CHAT.toString() + } + + hashMap["request_id"] = requestId + + if (!isLoadingItems) { + isLoadingItems = true + viewModel.getChatMessage(hashMap) + } + } + } + + private fun distinctList(messagesNew: List?) { + val tempList = ArrayList() + when { + pageBeforeAfter.isNullOrEmpty() -> { + /*If message added from socket*/ + if (items.isNotEmpty()) + tempList.addAll(items) + tempList.addAll(messagesNew ?: emptyList()) + + /*If message is not read*/ + if (items.isNotEmpty()) + sendMessageRead(items[0].messageId) + + } + pageBeforeAfter == ApiKeys.AFTER -> { + tempList.addAll(items) + tempList.addAll(messagesNew ?: emptyList()) + } + pageBeforeAfter == ApiKeys.BEFORE -> { + tempList.addAll(messagesNew ?: emptyList()) + tempList.addAll(items) + } + } + + items.clear() + items.addAll(tempList.distinctBy { it.messageId }) + adapter.notifyDataSetChanged() + + + /*val tempList = ArrayList() + tempList.addAll(items.distinctBy { it.messageId }) + items.clear() + items.addAll(tempList) + + if (size == 0) { + adapter.notifyDataSetChanged() + } else { + adapter.notifyItemRangeInserted(size, items.size) + adapter.notifyItemRangeChanged(size - 1, items.size) + }*/ + } + + private fun liveData() { + viewModel.chatMessages.observe(this, Observer { it -> + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + isLoadingItems = false + + val data = it.data + /*User status*/ + setStatus(data?.isOnline) + /*Has more data*/ + hasMoreItems = + if (pageBeforeAfter.isNullOrEmpty() || pageBeforeAfter == ApiKeys.AFTER) + data?.messages?.size == PER_PAGE_LOAD_CHAT + else true + /*Check for distinct list*/ + distinctList(data?.messages) + /*Show Timer if needed*/ + showTimer(data?.request_status == CallAction.INPROGRESS, data) + /*Hide Loader*/ + binding.clLoader.gone() + if(data?.request_status == CallAction.COMPLETED){ + binding.tvChatData.visible() + }else{ + binding.tvChatData.gone() + } + + binding.clLoader.setBackgroundResource(0) + binding.pbLoaderBottom.gone() + } + + Status.ERROR -> { + isLoadingItems = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + if (pageBeforeAfter.isNullOrEmpty() || pageBeforeAfter == ApiKeys.BEFORE) { + if (items.isEmpty()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.clLoader.visible() + } else + binding.pbLoaderBottom.visible() + } + } + }) + + viewModelUpload.uploadFile.observe(this, Observer { + resources ?: return@Observer + + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + val docImage = DocImage() + docImage.type = it.data?.type + docImage.image = it.data?.image_name + if (isConnectedToInternet(this, false)) { + sendImage(docImage) + } else { + binding.etMessage.showSnackBar(getString(R.string.check_internet)) + } + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + } + } + }) + + viewModelCall.completeChat.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + showTimer(false, null) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + /*Show time and complete button*/ + private fun showTimer(show: Boolean, data: CommonDataModel?) { + if (show) { + binding.tvCompleteChat.visible() + binding.rlChatInput.visible() + + binding.tvTimer.visible() + startTimer(((data?.currentTimer ?: 0) * 1000)) + } else { + binding.tvCompleteChat.gone() + binding.rlChatInput.gone() + + binding.tvTimer.gone() + countDownTimer?.cancel() + binding.tvCompleteChat.hideKeyboard() + } + + } + + private fun startTimer(currentTimer: Long) { + countDownTimer?.cancel() + + val totalTimerToRun = (TOTAL_TIME * 1000) + currentTimer + countDownTimer = object : CountDownTimer(totalTimerToRun, 1000) { + override fun onTick(millisUntilFinished: Long) { + val newTimer = ((totalTimerToRun - millisUntilFinished) + currentTimer) / 1000 + binding.tvTimer.text = convertMiliSecondsToMinute(newTimer) + } + + override fun onFinish() {} + } + countDownTimer?.start() + } + + private fun convertMiliSecondsToMinute(seconds: Long): String { + val s = seconds % 60 + val m = seconds / 60 % 60 + val h = seconds / 3600 + return String.format("%s : %02d : %02d", h.toString(), m, s) + } + + private fun setStatus(isOnline: Boolean?) { + runOnUiThread { + if (isOnline == true) + binding.tvUserStatus.text = getString(R.string.active_now) + else + binding.tvUserStatus.text = "" + } + } + + private fun sendImage(docImage: DocImage) { + val msg = ChatMessage( + imageUrl = docImage.image, + message = "", + senderId = userID, + senderName = userRepository.getUser()?.name, + receiverId = otherUserID, + messageType = docImage.type, + request_id = requestId, + sentAt = Calendar.getInstance().timeInMillis, + status = NOT_SENT + ) + sendMessage(msg) + } + + + @SuppressLint("ClickableViewAccessibility", "UseCompatLoadingForDrawables") + private fun listeners() { + binding.etMessage.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable) { + Log.e("TextChanged", "afterTextChanged") + } + + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + Log.e("TextChanged", "onTextChanged") + setButtonMicSend() + + timer = Timer() + if (!isTyping) { + isTyping = true + startTyping() + } + timer.cancel() + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + isTyping = false + stopTypingSocket() + } + }, DELAY) + } + }) + + + /*Start Recording*/ + binding.recordButton.setRecordView(binding.recordView) + binding.recordButton.isListenForRecord = checkIfPermission() + binding.recordView.setSoundEnabled(false) + binding.recordView.setLessThanSecondAllowed(false) + + binding.recordButton.setOnLongClickListener { + if (checkIfPermission()) { + binding.recordButton.isListenForRecord = true + binding.llChat.invisible() + binding.recordButton.setImageDrawable(getDrawable(R.drawable.ic_mic)) + true + } else { + binding.recordButton.isListenForRecord = false + if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){ + getPermissionForRecordAudio13WithPermissionCheck() + }else{ + getAudioWithPermissionCheck() + } + true + } + } + + binding.recordView.setOnRecordListener(object : OnRecordListener { + @SuppressLint("LogNotTimber") + override fun onFinish(recordTime: Long, limitReached: Boolean) { + binding.llChat.visible() + setButtonMicSend() + stopRecording() + if (File(audioFileName).exists()) { + val docImage = DocImage() + docImage.imageFile = File(audioFileName) + docImage.type = DocType.AUDIO + uploadFileOnServer(docImage) + } + Log.e("RECORDER", "onFinish") + } + + override fun onLessThanSecond() { + binding.llChat.visible() + stopRecording() + setButtonMicSend() + Log.e("RECORDER", "Less than one second") + + } + + override fun onLock() { + + } + + override fun onCancel() { + stopRecording() + binding.llChat.visible() + Log.e("RECORDER", "On Cancel") + + } + + override fun onStart() { + if (checkIfPermission()) { + binding.llChat.invisible() + startRecording() + }else if(checkIfPermission13RecordAudio()){ + binding.llChat.invisible() + startRecording() + } + Log.e("RECORDER", "On Start") + } + }) + + binding.recordView.setOnBasketAnimationEndListener { + binding.llChat.visible() + setButtonMicSend() + } + + binding.ivBack.setOnClickListener { + onBackPressed() + } + + binding.btnCamera.setOnClickListener { + binding.btnCamera.hideKeyboard() + // getStorageWithPermissionCheck() + val galleryPrem = true + showImageDialog(false,galleryPrem) + + } + + binding.ivSend.setOnClickListener { + when { + binding.etMessage.text.toString().trim().isEmpty() -> { + binding.etMessage.error = getString(R.string.enter_message) + return@setOnClickListener + } + isConnectedToInternet(this, true) -> { + val msg = ChatMessage( + imageUrl = String(), + message = binding.etMessage.text.toString().trim(), + senderId = userID, + senderName = userRepository.getUser()?.name, + receiverId = otherUserID, + messageType = DocType.TEXT, + request_id = requestId, + sentAt = Calendar.getInstance().timeInMillis, + status = NOT_SENT + ) + + sendMessage(msg) + } + } + } + + binding.tvCompleteChat.setOnClickListener { + showCompleteRequestDialog() + } + + binding.rvChatData.addOnScrollListener(onScrollListener) + } + + private fun setButtonMicSend() { + runOnUiThread { + if (binding.etMessage.text.toString().trim().isEmpty()) { + binding.ivSend.gone() + binding.recordButton.visible() + } else { + binding.recordButton.gone() + binding.ivSend.visible() + } + + /*if (binding.etMessage.text.toString().trim().isEmpty()) { + binding.ivSend.visible() + binding.recordButton.gone() + } else { + binding.recordButton.gone() + binding.ivSend.visible() + }*/ + } + } + + private var onScrollListener = object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvChatData.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (hasMoreItems && lastVisibleItemPosition >= totalItemCount) { + pageBeforeAfter = ApiKeys.AFTER + getChatData() + } + } + } + + private fun sendMessageRead(id: String?) { + val obj = JSONObject() + obj.put("messageId", id) + obj.put("receiverId", otherUserID) + obj.put("senderId", userID) + appSocket.emit(READ_MESSAGE, obj, Ack { + + }) + } + + /*-------- TYPING ----------*/ + private fun startTyping() { + val obj = JSONObject() + obj.put("isTyping", true.toString()) + obj.put("receiverId", otherUserID) + obj.put("senderId", userID) + appSocket.emit(TYPING, obj) + } + + private fun stopTypingSocket() { + val obj = JSONObject() + obj.put("isTyping", false.toString()) + obj.put("receiverId", otherUserID) + obj.put("senderId", userID) + appSocket.emit(TYPING, obj) + } + + private val listener = Emitter.Listener { + Timber.e("Typing $it") + + val data = it[0] as JSONObject + val senderId = data.getString("senderId") + val isTyping = data.getBoolean("isTyping") + if (senderId == otherUserID) { + if (isTyping) { + runOnUiThread { + binding.tvUserStatus.visible() + binding.tvUserStatus.text = getString(R.string.typing) + } + timerTyping.cancel() + timerTyping.purge() + timerTyping = Timer() + timerTyping.schedule(4000) { + binding.tvUserStatus.invisible() + runOnUiThread { binding.tvUserStatus.text = getString(R.string.active_now) } + } + } /*else { + runOnUiThread { + binding.tvUserStatus.text = getString(R.string.active_now) + } + }*/ + } + } + + private val listenerRead = Emitter.Listener { + Timber.e("Read $it") + + val data = it[0] as JSONObject + val messageId = data.getString("messageId") + + runOnUiThread { + items.forEachIndexed { index, chatMessage -> + if (items[index].status == SENT || items[index].status == DELIVERED) { + items[index].status = AppSocket.MessageStatus.SEEN + + adapter.notifyItemChanged(items.indexOf(chatMessage)) + } + } + } + } + + + private val listenerDelivered = Emitter.Listener { + Timber.e("Delivered $it") + + val data = it[0] as JSONObject + val messageId = data.getString("messageId") + + runOnUiThread { + items.forEachIndexed { index, chatMessage -> + if (items[index].status == SENT) { + items[index].status = AppSocket.MessageStatus.SEEN + + adapter.notifyItemChanged(items.indexOf(chatMessage)) + } + } + } + } + + private val listenerStatus = Emitter.Listener { + Timber.e("BroadCast $it") + val senderId = (it[0] as JSONObject).getString("userId") + val isOnline = (it[0] as JSONObject).getBoolean("isOnline") + if (senderId == otherUserID) + setStatus(isOnline) + } + + + private fun checkNotSentMessage() { + timerPendingMessage.cancel() + + val timeDelay = 15000L + timerPendingMessage = fixedRateTimer("timerMessage", true, timeDelay, timeDelay) { + if (isConnectedToInternet(this@ChatDetailActivity, false)) + sendNotSentMessage() + } + } + + private fun sendNotSentMessage() { + val currentTime = System.currentTimeMillis() + + val messagesNotSent = items.filterList { + this.status == NOT_SENT && this.senderId == userID && (currentTime - (this.sentAt + ?: currentTime) > 8000) + } + + Log.e("messagesNotSent", Gson().toJson(messagesNotSent).toString()) + + messagesNotSent.forEach { + sendMessage(it, true) + } + } + + private fun sendMessage(chatMessage: ChatMessage, notSentMessage: Boolean = false) { + if (appSocket.isConnected && isConnectedToInternet(this@ChatDetailActivity, false)) { + //appSocket.sendMessage(message) {} + + /*Add Message to list*/ + if (!notSentMessage) { + binding.etMessage.setText("") + setButtonMicSend() + + items.add(0, chatMessage) + + adapter.notifyItemInserted(0) + binding.rvChatData.scrollToPosition(0) + } + + /*Send event*/ + try { + val jsonObject = JSONObject(Gson().toJson(chatMessage)) + + appSocket.emit(SEND_MESSAGE, jsonObject, Ack { + + val data = it[0] as JSONObject + Log.e("ack", data.toString()) + + if (data.optString("status") == PushType.REQUEST_COMPLETED) { + runOnUiThread { + showTimer(false, null) + longToast(getString(R.string.request_completed)) + } + } else if (!data.optString("messageId").isNullOrEmpty()) { + runOnUiThread { + Log.e("ack========", data.optString("messageId")) + + val indexOfMessage = items.indexOf(chatMessage) + if (items[indexOfMessage].status == NOT_SENT) { + items[indexOfMessage].status = SENT + if (items[indexOfMessage].messageId.isNullOrEmpty()) + items[indexOfMessage].messageId = data.optString("messageId") + adapter.notifyItemChanged(indexOfMessage) + } + + /* items.forEachIndexed { index, chatMessage -> + if (chatMessage.status == AppSocket.MessageStatus.NOT_SENT) { + *//*If message is not read*//* + items[index].status = AppSocket.MessageStatus.SENT + adapter.notifyItemChanged(items.indexOf(chatMessage)) + } + }*/ + } + } + }) + } catch (e: JSONException) { + e.printStackTrace() + } + } else { + if (!notSentMessage && !isConnectedToInternet(this, false)) + longToast(getString(R.string.check_internet)) + socketEvents(makeOn = true) + } + } + + private fun setAdapter() { + llm = LinearLayoutManager(this) + llm.reverseLayout = true + llm.orientation = LinearLayoutManager.VERTICAL + binding.rvChatData.layoutManager = llm + + adapter = ChatDetailAdapter(this, items) + binding.rvChatData.adapter = adapter + } + + + override fun onMessageReceive(message: ChatMessage?) { + runOnUiThread { + if (message?.senderId == otherUserID && message.request_id == requestId) { + sendMessageRead(message.messageId) + + message.let { items.add(0, it) } + + adapter.notifyItemInserted(0) + binding.rvChatData.scrollToPosition(0) + } + } + } + + + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (ConnectivityManager.CONNECTIVITY_ACTION == intent.action) { + + } + } + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.IMAGE_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll( + data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList() + ) + + val fileToUpload = + compressImage(this, File(ContentUriUtils.getFilePath(this, docPaths[0]))) + + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = fileToUpload + + uploadFileOnServer(docImage)*/ + } + + AppRequestCode.DOC_PICKER -> { + /*val docPaths = ArrayList() + docPaths.addAll( + data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_DOCS) + ?: emptyList() + ) + + val fileToUpload = File(ContentUriUtils.getFilePath(this, docPaths[0])) + + val docImage = DocImage() + docImage.type = DocType.PDF + docImage.imageFile = fileToUpload + + uploadFileOnServer(docImage)*/ + + } + } + } + } + + + private fun uploadFileOnServer(docImage: DocImage?) { + val hashMap = HashMap() + hashMap["type"] = getRequestBody(docImage?.type) + + val body: RequestBody = docImage?.imageFile?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + docImage?.imageFile?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + askForOption(null, this, binding.btnCamera) + } + + @NeedsPermission(Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_MEDIA_AUDIO) + fun getPermissionForRecordAudio13() { + binding.recordButton.isListenForRecord = true + } + @NeedsPermission(Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.CAMERA/*,Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED*/) + fun getPermissionForImages13() { + askForOption(null, this, binding.btnCamera) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + this, R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + this, R.string.media_permission + ) + } + + @NeedsPermission(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getAudio() { + binding.recordButton.isListenForRecord = true + } + + @OnShowRationale(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showAudioRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.record_audio_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onAudioNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog(this, R.string.record_audio_permission) + } + + @OnPermissionDenied( + Manifest.permission.RECORD_AUDIO, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + fun showAudioDeniedForStorage() { + PermissionUtils.showAppSettingsDialog(this, R.string.record_audio_permission) + } + + private fun showCompleteRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(this, R.string.end_chat, + R.string.end_chat_desc, R.string.end_chat, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["request_id"] = requestId + + viewModelCall.completeChat(hashMap) + } + } + + + override fun onPause() { + super.onPause() + isActive = false + isLoadingItems = false + + otherUserID = "-1" + } + + override fun onResume() { + super.onResume() + isActive = true + registerReceiver() + + otherUserID = intent.getStringExtra(USER_ID) ?: "" + + pageBeforeAfter = if (pageBeforeAfter == null) "" else ApiKeys.BEFORE + getChatData() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(this).registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED -> { + if (intent.getStringExtra(EXTRA_REQUEST_ID) == requestId) { + showTimer(false, null) + longToast(getString(R.string.request_completed)) + } + } + NetworkIssueFragment.NETWORK_ISSUE -> { + pageBeforeAfter = if (pageBeforeAfter == null) "" else ApiKeys.BEFORE + getChatData() + } + } + } + } + + + /*Audio Recoder*/ + private var recorder: MediaRecorder? = null + private var player: MediaPlayer? = null + + private fun startRecording() { + if (File(audioFileName).exists()) + File(audioFileName).delete() + + recorder = MediaRecorder().apply { + setAudioSource(MediaRecorder.AudioSource.MIC) + setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) + setOutputFile(audioFileName) + setAudioEncoder(MediaRecorder.AudioEncoder.AAC) + + try { + prepare() + } catch (e: IOException) { + Log.e("audioFileName", "prepare() failed") + } + + start() + } + } + + private fun stopRecording() { + try { + recorder?.apply { + stop() + release() + } + recorder = null + } catch (ignored: RuntimeException) { + } + } + + fun startPlaying(link: String) { + /* val fragment = BottomAudioPlayerFragment(link) + fragment.show(supportFragmentManager, fragment.tag)*/ + + val viewMediaIntent = Intent() + viewMediaIntent.action = Intent.ACTION_VIEW + viewMediaIntent.setDataAndType(Uri.parse(link), "audio/*") + viewMediaIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(viewMediaIntent) + +// player = MediaPlayer().apply { +// try { +// setDataSource(this@ChatDetailActivity, Uri.parse(link)) +// prepare() +// start() +// } catch (e: IOException) { +// Log.e("MediaPlayer", "prepare() failed") +// } +// } + } + + private fun stopPlaying() { + player?.release() + player = null + + } + + override fun getPdf(uri: String?) { + + } + + override fun getVideo(uri: String?, i: Int) { + + } + + override fun getImage(uri: String?, data: Uri) { + val selectedImageUri: Uri? = data + selectedImageUri?.let { + val file: File? = uriToFile(applicationContext, it) + file?.let { + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = it + uploadFileOnServer(docImage) + } + } + } + + fun uriToFile(context: Context, uri: Uri): File? { + val path = getRealPathFromUri(context, uri) + return path?.let { File(it) } + } + + private fun getRealPathFromUri(context: Context, uri: Uri): String? { + var realPath: String? = null + // Depending on the URI scheme, use different query methods + if (uri.scheme == "content") { + // MediaStore (and general content provider) scheme + context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + realPath = cursor.getString(columnIndex) + } + } + } else if (uri.scheme == "file") { + // File scheme + realPath = uri.path + } + return realPath + } + + private fun checkIfPermission(): Boolean { + return (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( + this, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED) + } + + private fun checkIfPermission13RecordAudio(): Boolean { + return (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_AUDIO + ) == PackageManager.PERMISSION_GRANTED) + } + private fun checkIfPermissionImages(): Boolean { + return (ContextCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED) + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/chat/chatdetail/ChatDetailAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/chat/chatdetail/ChatDetailAdapter.kt new file mode 100644 index 0000000..fb8d735 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/chat/chatdetail/ChatDetailAdapter.kt @@ -0,0 +1,267 @@ +package com.consultantapp.ui.dashboard.chat.chatdetail + + +import android.app.Activity +import android.text.format.DateUtils +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.chat.ChatMessage +import com.consultantapp.databinding.ItemChatLeftBinding +import com.consultantapp.databinding.ItemChatRightBinding +import com.consultantapp.databinding.ItemChatTypingBinding +import com.consultantapp.utils.* +import com.consultantapp.utils.DateUtils.dateFormatFromMillis +import java.util.* + +class ChatDetailAdapter(private var context: ChatDetailActivity, + private var data: ArrayList +) : RecyclerView.Adapter() { + + companion object { + private const val UI_LEFT = 0 + private const val UI_RIGHT = 1 + private const val TYPING = 2 + } + + override fun getItemViewType(position: Int): Int { + return when { + data[position].messageType == DocType.MESSAGE_TYPING -> { + TYPING + } + data[position].receiverId == context.userRepository.getUser()?.id -> { + UI_LEFT + } + else -> { + UI_RIGHT + } + } + } + + override fun onCreateViewHolder(viewGroup: ViewGroup, position: Int): RecyclerView.ViewHolder { + return when (position) { + + UI_RIGHT -> { + ViewHolderRight(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_right, viewGroup, false)) + } + UI_LEFT -> { + ViewHolderLeft(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_left, viewGroup, false)) + } + TYPING -> { + ViewHolderType(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_typing, viewGroup, false)) + } + else -> ViewHolderRight(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_right, viewGroup, false)) + } + } + + inner class ViewHolderType(val binding: ItemChatTypingBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind() { + + } + } + + + override fun getItemCount(): Int { + return data.size + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val showDateHeader: Boolean + if (position == data.size - 1) { + showDateHeader = true + } else { + val cal1 = Calendar.getInstance() + cal1.timeInMillis = data[position + 1].sentAt ?: 0 + val cal2 = Calendar.getInstance() + cal2.timeInMillis = data[position].sentAt ?: 0 + showDateHeader = !(cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && + cal1.get(Calendar.DAY_OF_YEAR) == cal2.get( + Calendar.DAY_OF_YEAR + )) + } + when (holder) { + is ViewHolderRight -> holder.bind(data[position], showDateHeader) + is ViewHolderLeft -> holder.bind(data[position], showDateHeader) + is ViewHolderType -> holder.bind() + } + } + + + inner class ViewHolderRight(val binding: ItemChatRightBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + /*Click*/ + binding.cvImageRight.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.IMAGE -> { + val itemImages = ArrayList() + // itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, chat.imageUrl?:"")) + itemImages.add(chat.imageUrl.toString()) + viewImageFull(context as Activity, itemImages, 0) + } + } + } + + binding.tvPdfRight.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.PDF -> { + val link = getImageBaseUrl(ImageFolder.PDF, chat.imageUrl) + openPdf(context, link) + } + } + } + + binding.tvAudioRight.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.AUDIO -> { + context.startPlaying(getImageBaseUrl(ImageFolder.AUDIO, chat.imageUrl)) + } + } + } + } + + fun bind(chat: ChatMessage, showDateHeader: Boolean) = with(binding) { + tvDateRight.gone() + tvTextRight.gone() + cvImageRight.gone() + tvPdfRight.gone() + tvAudioRight.gone() + + tvTimeRight.text = chat.sentAt?.let { DateUtils.formatDateTime(context, it, DateUtils.FORMAT_SHOW_TIME) + } + if (showDateHeader) { + tvDateRight.visible() + tvDateRight.text = chat.sentAt?.let { getDateHeader(it) } + } + + when (chat.messageType) { + DocType.TEXT -> { + tvTextRight.visible() + tvTextRight.text = chat.message + } + DocType.IMAGE -> { + cvImageRight.visible() + loadImage("profile",ivImageRight, chat.imageUrl, R.drawable.image_placeholder) + } + DocType.PDF -> { + tvPdfRight.visible() + tvPdfRight.text = chat.imageUrl + } + DocType.AUDIO -> { + tvAudioRight.visible() + tvAudioRight.text = chat.imageUrl + } + } + ivTick.setImageResource(getTickValue(chat.status)) + } + } + + inner class ViewHolderLeft(val binding: ItemChatLeftBinding) : + RecyclerView.ViewHolder(binding.root) { + init { + /*Click*/ + binding.cvImageLeft.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.IMAGE -> { + val itemImages = ArrayList() + // itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, chat.imageUrl)) + itemImages.add(chat.imageUrl.toString()) + viewImageFull(context as Activity, itemImages, 0) + } + } + } + + binding.tvPdfLeft.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.PDF -> { + val link = getImageBaseUrl(ImageFolder.PDF, chat.imageUrl) + openPdf(context, link) + } + } + } + + binding.tvAudioLeft.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.AUDIO -> { + context.startPlaying(getImageBaseUrl(ImageFolder.AUDIO, chat.imageUrl)) + } + } + } + } + + fun bind(chat: ChatMessage, showDateHeader: Boolean) = with(binding) { + tvDateLeft.gone() + tvTextLeft.gone() + cvImageLeft.gone() + tvPdfLeft.gone() + tvAudioLeft.gone() + + tvTimeLeft.text = chat.sentAt?.let { + DateUtils.formatDateTime(context, it, DateUtils.FORMAT_SHOW_TIME) + } + if (showDateHeader) { + tvDateLeft.visible() + tvDateLeft.text = chat.sentAt?.let { getDateHeader(it) } + } + + + when (chat.messageType) { + DocType.TEXT -> { + tvTextLeft.visible() + tvTextLeft.text = chat.message + } + DocType.IMAGE -> { + cvImageLeft.visible() + loadImage("profile",ivImageLeft, chat.imageUrl, R.drawable.image_placeholder) + } + DocType.PDF -> { + tvPdfLeft.visible() + tvPdfLeft.text = chat.imageUrl + } + DocType.AUDIO -> { + tvAudioLeft.visible() + tvAudioLeft.text = chat.imageUrl + } + } + } + } + + private fun getDateHeader(millis: Long): String? { + val calendar = Calendar.getInstance() + calendar.timeInMillis = millis + val dateString: String? + dateString = when { + DateUtils.isToday(calendar.timeInMillis) -> context.getString(R.string.today) + isYesterday(calendar) -> String.format("%s", context.getString(R.string.yesterday)) + else -> dateFormatFromMillis(DateFormat.DATE_FORMAT, calendar.timeInMillis) + } + return dateString + } + + private fun getTickValue(status: String?): Int { + return when (status) { + AppSocket.MessageStatus.NOT_SENT -> R.drawable.ic_wait + AppSocket.MessageStatus.SENT -> R.drawable.ic_sent + AppSocket.MessageStatus.DELIVERED -> R.drawable.ic_delivered + AppSocket.MessageStatus.SEEN -> R.drawable.ic_seen + else -> R.drawable.ic_wait + } + } +} + + + diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/DoctorActionActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/DoctorActionActivity.kt new file mode 100644 index 0000000..ffefb2f --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/DoctorActionActivity.kt @@ -0,0 +1,53 @@ +package com.consultantapp.ui.dashboard.doctor + +import android.os.Bundle +import androidx.databinding.DataBindingUtil +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityContainerBinding +import com.consultantapp.ui.dashboard.doctor.confirm.ConfirmBookingFragment +import com.consultantapp.ui.dashboard.doctor.detail.prefrence.PrefrenceFragment +import com.consultantapp.ui.dashboard.doctor.schedule.DateTimeFragment +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment +import com.consultantapp.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + +class DoctorActionActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + lateinit var binding: ActivityContainerBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + //makeFullScreen(this) + } + + private fun initialise() { + binding = DataBindingUtil.setContentView(this, R.layout.activity_container) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + when (intent.getStringExtra(PAGE_TO_OPEN)) { + FILTER -> + addFragment(supportFragmentManager, PrefrenceFragment(), R.id.container) + RequestType.SCHEDULE -> + addFragment(supportFragmentManager, ScheduleFragment(), R.id.container) + RequestType.INSTANT -> + addFragment(supportFragmentManager, ConfirmBookingFragment(), R.id.container) + RequestType.DATE_TIME -> + addFragment(supportFragmentManager, DateTimeFragment(), R.id.container) + } + } + + companion object { + const val FILTER = "FILTER" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/confirm/ConfirmBookingFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/confirm/ConfirmBookingFragment.kt new file mode 100644 index 0000000..fcd33dd --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/confirm/ConfirmBookingFragment.kt @@ -0,0 +1,429 @@ +package com.consultantapp.ui.dashboard.doctor.confirm + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.text.method.LinkMovementMethod +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.requests.CarePlan +import com.consultantapp.data.models.requests.CreateRequest +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.models.responses.Service +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentConfirmBookingBinding +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment +import com.consultantapp.ui.dashboard.location.AddAddressActivity +import com.consultantapp.ui.dashboard.success.SuccessFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.addmoney.AddMoneyActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.DateUtils.dateFormatFromMillis +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ConfirmBookingFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentConfirmBookingBinding + + private var rootView: View? = null + + private lateinit var viewModel: DoctorViewModel + + private lateinit var progressDialog: ProgressDialog + + private var doctorData: UserData? = null + + private var address: SaveAddress? = null + + private var scheduleType = "" + + private var couponStatus = 0 + + private var carePlan: Filter? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_confirm_booking, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + hitApi(true) + + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.clLoader.setBackgroundResource(R.color.colorWhite) + scheduleType = requireActivity().intent.getStringExtra(PAGE_TO_OPEN) ?: "" + + handleServiceId() + setData() + } + + private fun setData() { + doctorData = requireActivity().intent.getSerializableExtra(USER_DATA) as UserData + if (scheduleType == RequestType.INSTANT) { + binding.tvEditAppointment.gone() + binding.tvConfirm.text = getString(R.string.confirm_booking) + } + + binding.tvName.text = getDoctorName(doctorData) + binding.tvDesc.text = doctorData?.categoryData?.name + ?: binding.root.context.getString(R.string.na) + loadImage("tag",binding.ivPic, doctorData?.profile_image, R.drawable.ic_profile_placeholder) + + + if (doctorData?.phone != null ) + binding.etPhone.setText(getString(R.string.phone_s_s, doctorData?.country_code, doctorData?.phone)) + + if (doctorData?.email != null) + binding.etEmail.setText(doctorData?.email) + + if (arguments?.containsKey(DATE_SELECTED) == true) { + val date = dateFormatFromMillis(DateFormat.DAY_DATE_FORMAT, arguments?.getLong(DATE_SELECTED)) + binding.etAppointment.setText(getString(R.string.date_time, date, arguments?.getString(TIME_SELECTED))) + } else if (arguments?.containsKey(START_DATE) == true) { + binding.tvEditAppointment.gone() + val date = "${arguments?.getString(START_DATE)} · ${arguments?.getString(START_TIME)} - ${arguments?.getString(END_DATE)} · ${arguments?.getString(END_TIME)}" + binding.etAppointment.setText(date) + } + + + when (BuildConfig.FLAVOR) { + "nurseLynx" -> { + binding.ilCarePlan.visible() + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setSaleContract(requireActivity()), TextView.BufferType.SPANNABLE) + } + else -> { + binding.tvTerms.setButtonDrawable(R.color.black) + binding.tvTerms.gravity = Gravity.CENTER_HORIZONTAL + } + } + + } + + private fun handleServiceId() { + if (requireActivity().intent.hasExtra(ScheduleFragment.SERVICE_ID)) { + val service = + requireActivity().intent.getSerializableExtra(ScheduleFragment.SERVICE_ID) as Service + when (service.main_service_type) { + ConsultType.HOME_VISIT -> { + binding.ilAddress.visible() + binding.ilAddress.hint = getString(R.string.address_for_s, service.service_name) + + /*User Address*/ + address = prefsManager.getObject(USER_ADDRESS, SaveAddress::class.java) + if (address != null) { + binding.etAddress.setText(address?.locationName) + } + } + ConsultType.CLINIC_VISIT -> { + /*Clinic Address*/ + if (service.clinic_address != null) { + binding.ilAddress.hint = getString(R.string.address_for_s, service.service_name) + binding.ilAddress.visible() + binding.tvView.visible() + binding.etAddress.isEnabled = false + binding.etAddress.setText(service.clinic_address?.locationName) + } + } + } + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvEditAppointment.setOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.tvView.setOnClickListener { + if (requireActivity().intent.hasExtra(ScheduleFragment.SERVICE_ID)) { + val service = + requireActivity().intent.getSerializableExtra(ScheduleFragment.SERVICE_ID) as Service + mapIntent(requireActivity(), service.clinic_address?.locationName ?: "", + service.clinic_address?.lat ?: 0.0, + service.clinic_address?.long ?: 0.0) + } + } + + binding.tvConfirm.setOnClickListener { + binding.tvConfirm.hideKeyboard() + + when { + binding.ilAddress.visibility == View.VISIBLE && binding.etAddress.text.toString() + .trim().isEmpty() -> { + binding.etAddress.showSnackBar(getString(R.string.address)) + } + BuildConfig.FLAVOR == "nurseLynx" && !binding.tvTerms.isChecked -> { + binding.tvTerms.showSnackBar(getString(R.string.you_agree_to_the_terms_conditions)) + } + else -> hitApi(false) + } + } + + binding.etAddress.setOnClickListener { + //placePicker(this, requireActivity()) + + val intent = Intent(requireContext(), AddAddressActivity::class.java) + if (address != null) + intent.putExtra(AddAddressActivity.EXTRA_ADDRESS, address) + startActivityForResult(intent, AppRequestCode.ASK_FOR_LOCATION) + } + + binding.tvApply.setOnClickListener { + binding.tvApply.hideKeyboard() + if (binding.etCoupon.text.toString().length < 5) { + binding.etCoupon.showSnackBar(getString(R.string.add_valid_coupon)) + } else { + couponStatus = 1 + hitApi(true) + } + } + + binding.tvCarePlan.setOnClickListener { + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CARE_PLAN), AppRequestCode.CARE_PLAN) + } + } + + private fun hitApi(confirm: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + + val createRequest = CreateRequest() + + /*Category id auto pic backend*/ + createRequest.consultant_id = doctorData?.id ?: "" + createRequest.schedule_type = scheduleType + + createRequest.service_id = + (requireActivity().intent.getSerializableExtra(ScheduleFragment.SERVICE_ID) as Service).service_id + ?: "" + if (requireActivity().intent.hasExtra(EXTRA_REQUEST_ID)) + createRequest.request_id = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) + ?: "" + + if (scheduleType == RequestType.SCHEDULE) { + val date = + DateUtils.dateFormatFromMillisBackend(DateFormat.DATE_FORMAT, arguments?.getLong(DATE_SELECTED)) + createRequest.date = date + createRequest.time = DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT_24, arguments?.getString(TIME_SELECTED) ?: "") + } + + if (address != null) { + createRequest.service_address = address?.locationName ?: "" + createRequest.lat = address?.lat ?: 0.0 + createRequest.long = address?.long ?: 0.0 + } + + if (carePlan != null) { + createRequest.tier_id = carePlan?.id + + val arrayList = ArrayList() + carePlan?.tier_options?.forEach { + it.tier_options_select?.forEachIndexed { index, filter -> + if (filter.isSelected) { + arrayList.add(CarePlan(id = it.id, type = (index + 1))) + return@forEach + } + } + } + if (arrayList.isNotEmpty()) { + createRequest.tier_options = ArrayList() + createRequest.tier_options?.addAll(arrayList) + } + } + + if (confirm) { + if (couponStatus == 1) + createRequest.coupon_code = binding.etCoupon.text.toString() + viewModel.confirmRequest(createRequest) + } else { + if (couponStatus == 2) + createRequest.coupon_code = binding.etCoupon.text.toString() + viewModel.createRequest(createRequest) + } + } + } + + + private fun bindObservers() { + viewModel.createRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*If amount not sufficient then add money*/ + if (it.data?.amountNotSufficient == true) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.insufficient_amount)) + .setMessage(it.data.message + ?: getString( + R.string.money_insufficient, + it.data.minimum_balance + )) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + } + .setNegativeButton(getString(R.string.add_money)) { dialog, which -> + startActivity(Intent(requireContext(), AddMoneyActivity::class.java)) + }.show() + + } else { + requireActivity().setResult(Activity.RESULT_OK) + val fragment = SuccessFragment(this) + val bundle = Bundle() + bundle.putString(EXTRA_REQUEST_ID, it.data?.request?.id) + fragment.arguments = bundle + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.confirmRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.tvConfirm.visible() + binding.clLoader.setBackgroundResource(0) + + setDataConfirm(it.data) + } + Status.ERROR -> { + binding.clLoader.gone() + couponStatus = 1 + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + + if (binding.etCoupon.text.toString().isEmpty()) + binding.tvConfirm.gone() + } + } + }) + } + + private fun setDataConfirm(data: CommonDataModel?) { + + if (couponStatus == 1) + couponStatus = 2 + + binding.tvSubTotalV.text = getCurrency(data?.total) + + /*Promo Code*/ + binding.tvPromoApplied.visible() + binding.tvPromoAppliedV.visible() + if (!data?.discount.isNullOrEmpty() || data?.discount != "0") { + binding.tvPromoAppliedV.text = getCurrency(data?.discount) + } + + /*Tax*/ + if (!data?.service_tax.isNullOrEmpty() && data?.service_tax != "0") { + binding.tvTax.visible() + binding.tvTaxV.visible() + binding.tvTaxV.text = getCurrency(data?.service_tax) + } + + if (!data?.tier_charges.isNullOrEmpty() && data?.tier_charges != "0") { + binding.tvCarePlanP.visible() + binding.tvCarePlanV.visible() + binding.tvCarePlanV.text = getCurrency(data?.tier_charges) + } + + binding.tvTotalV.text = getCurrency(data?.grand_total) + + if (scheduleType == RequestType.INSTANT) { + val date = DateUtils.dateFormatChange( + DateFormat.DATE_FORMAT, DateFormat.DAY_DATE_FORMAT, data?.book_slot_date + ?: "" + ) + binding.etAppointment.setText(getString(R.string.date_time, date, data?.book_slot_time)) + } + } + + companion object { + const val DATE_SELECTED = "DATE_SELECTED" + const val TIME_SELECTED = "TIME_SELECTED" + const val CARE_PLAN = "CARE_PLAN" + const val START_DATE = "START_DATE" + const val END_DATE = "END_DATE" + const val START_TIME = "START_TIME" + const val END_TIME = "END_TIME" + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.ASK_FOR_LOCATION -> { + address = SaveAddress() + address = + data?.getSerializableExtra(AddAddressActivity.EXTRA_ADDRESS) as SaveAddress + binding.etAddress.setText(address?.locationName) + } + AppRequestCode.CARE_PLAN -> { + carePlan = data?.getSerializableExtra(CARE_PLAN) as Filter + binding.tvCarePlan.setText(carePlan?.title) + + hitApi(true) + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/BottomRequestFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/BottomRequestFragment.kt new file mode 100644 index 0000000..3e8742d --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/BottomRequestFragment.kt @@ -0,0 +1,73 @@ +package com.consultantapp.ui.dashboard.doctor.detail + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.BottomFilterRequestBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.utils.PrefsManager +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomRequestFragment(private val activity: DoctorDetailActivity) + : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomFilterRequestBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_filter_request, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + + + } + + private fun listeners() { + + binding.tvNow.setOnClickListener { + activity.hiApiDoctorRequest(false) + dialog?.dismiss() + } + + binding.tvSchedule.setOnClickListener { + activity.hiApiDoctorRequest(true) + dialog?.dismiss() + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/DoctorDetailActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/DoctorDetailActivity.kt new file mode 100644 index 0000000..f97ac99 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/DoctorDetailActivity.kt @@ -0,0 +1,455 @@ +package com.consultantapp.ui.dashboard.doctor.detail + +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appFeatures +import com.consultantapp.data.models.requests.CreateRequest +import com.consultantapp.data.models.responses.* +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityDoctorDetailBinding +import com.consultantapp.ui.classes.ClassesAdapter +import com.consultantapp.ui.classes.ClassesViewModel +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.dashboard.doctor.DoctorActionActivity +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment.Companion.SERVICE_ID +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.DrawerActivity.Companion.WALLET +import com.consultantapp.ui.jitsimeet.JitsiActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + +class DoctorDetailActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + lateinit var binding: ActivityDoctorDetailBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: DoctorViewModel + + private lateinit var viewModelClasses: ClassesViewModel + + private lateinit var adapter: RatingAdapter + + private var items = ArrayList() + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var doctorId = "" + + private var doctorData: UserData? = null + + private var serviceSelected: Service? = null + + private var classSelectedData: ClassData? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_doctor_detail) + + initialise() + listeners() + setAdapter() + bindObservers() + hiApiDoctorDetail() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + viewModelClasses = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + progressDialog = ProgressDialog(this) + + doctorId = intent.getStringExtra(DOCTOR_ID) ?: "" + + binding.clLoader.setBackgroundResource(R.color.colorWhite) + } + + private fun setAdapter() { + adapter = RatingAdapter(false, items) + binding.rvReview.adapter = adapter + } + + private fun listeners() { + binding.ivBack.setOnClickListener { + finish() + } + + binding.ivMark.setOnClickListener { + if (isConnectedToInternet(this, true)) { + shareDeepLink(DeepLink.USER_PROFILE, this, doctorData) + } + } + + binding.tvMoreClasses.setOnClickListener { + startActivity(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES) + .putExtra(DOCTOR_ID, doctorData)) + } + + binding.tvBook.setOnClickListener { + hiApiDoctorRequest(true) + } + } + + private fun hiApiDoctorDetail() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["doctor_id"] = doctorId + viewModel.doctorDetails(hashMap) + + viewModel.reviewList(hashMap) + } + } + + + fun hiApiDoctorRequest(schedule: Boolean) { + if (schedule) { + startActivity(Intent(this, DoctorActionActivity::class.java) + .putExtra(PAGE_TO_OPEN, RequestType.SCHEDULE) + .putExtra(SERVICE_ID, serviceSelected) + .putExtra(USER_DATA, doctorData)) + } else { + if (isConnectedToInternet(this, true)) { + val createRequest = CreateRequest() + + createRequest.consultant_id = doctorId + createRequest.service_id = serviceSelected?.service_id ?: "" + createRequest.schedule_type = RequestType.INSTANT + + viewModel.confirmRequest(createRequest) + } + } + } + + private fun bindObservers() { + viewModel.doctorDetails.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.ivMark.visible() + + doctorData = it.data?.dcotor_detail + setDoctorData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + binding.ivMark.gone() + binding.clLoader.visible() + } + } + }) + + viewModel.reviewList.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + isLoadingMoreItems = false + + val tempList = it.data?.review_list ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + + } + } + }) + + viewModel.confirmRequest.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*If amount not sufficient then add money*/ + if (it.data?.amountNotSufficient == true) { + AlertDialog.Builder(this) + .setCancelable(false) + .setTitle(getString(R.string.added_to_wallet)) + .setMessage(getString(R.string.money_insufficient)) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + } + .setNegativeButton(getString(R.string.add_money)) { dialog, which -> + startActivity(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, WALLET)) + }.show() + + } else { + startActivity( + Intent(this, DoctorActionActivity::class.java) + .putExtra(PAGE_TO_OPEN, RequestType.INSTANT) + .putExtra(SERVICE_ID, serviceSelected) + .putExtra(USER_DATA, doctorData) + ) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelClasses.classes.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + val items = ArrayList() + items.addAll(it.data?.classes ?: emptyList()) + + val adapter = ClassesAdapter(null, this, items) + binding.rvClasses.adapter = adapter + adapter.setAllItemsLoaded(true) + + binding.tvClasses.hideShowView(items.isNotEmpty()) + binding.rvClasses.hideShowView(items.isNotEmpty()) + binding.tvMoreClasses.hideShowView(items.size >= 2) + + } + Status.ERROR -> { + //ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + + + viewModelClasses.enrollUser.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + getClasses() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelClasses.joinClass.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = classSelectedData?.id + jitsiClass.name = classSelectedData?.name + jitsiClass.isClass = true + + startActivity(Intent(this, JitsiActivity::class.java) + .putExtra(EXTRA_CALL_NAME, jitsiClass)) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + } + + private fun setDoctorData() { + binding.tvName.text = getDoctorName(doctorData) + loadImage("tag", + binding.ivPic, doctorData?.profile_image, + R.drawable.image_placeholder + ) + binding.tvAboutV.text = doctorData?.profile?.bio ?: getString(R.string.na) + + binding.tvDesc.text = doctorData?.categoryData?.name ?: getString(R.string.na) + + binding.tvRating.text = getString(R.string.s_s_reviews, + getUserRating(doctorData?.totalRating), + doctorData?.reviewCount) + binding.tvPatientV.text = doctorData?.patientCount ?: getString(R.string.na) + + if (doctorData?.profile?.working_since == null) { + binding.tvExperience.gone() + binding.tvExperienceV.gone() + } else + binding.tvExperienceV.text = + "${getAge(doctorData?.profile?.working_since)} ${getString(R.string.years)}" + + binding.tvReviewsV.text = doctorData?.reviewCount ?: getString(R.string.na) + binding.tvReviewCount.text = getUserRating(doctorData?.totalRating) + + /*No Need of Services*/ + when (val extraConsultType = intent.getStringExtra(EXTRA_CONSULT_TYPE)) { + ConsultType.HOME_VISIT, ConsultType.CLINIC_VISIT -> { + binding.tvBook.visible() + binding.view2.gone() + + var serviceType = "" + doctorData?.services?.forEach { + if (extraConsultType == it.main_service_type) { + when (extraConsultType) { + ConsultType.HOME_VISIT -> serviceType = getString(R.string.home_care_appointment) + ConsultType.CLINIC_VISIT -> serviceType = getString(R.string.clinic_appointment) + } + + serviceSelected = it + return@forEach + } + } + + val price = getString(R.string.price_s, getCurrency(serviceSelected?.price), + getUnitPrice(serviceSelected?.unit_price, binding.root.context)) + + binding.tvBook.text = getString(R.string.consult_for, serviceType, price) + } + else -> { + binding.tvBook.gone() + val serviceList = ArrayList() + serviceList.addAll(doctorData?.services ?: emptyList()) + val adapter = ServicesAdapter(this, serviceList) + binding.rvServices.adapter = adapter + } + } + + /*Classes*/ + if (appFeatures.needClasses || BuildConfig.FLAVOR == "heal") + getClasses() + } + + private fun getClasses() { + if (userRepository.isUserLoggedIn()) { + val hashMap = HashMap() + + hashMap[ApiKeys.PER_PAGE] = "2" + hashMap["type"] = "USER_SIDE" + hashMap["doctor_id"] = doctorData?.id ?: "" + + viewModelClasses.classesList(hashMap) + } + } + + + fun serviceClick(item: Service) { + serviceSelected = item + if (userRepository.isUserLoggedIn()) { + bottomOption() + } else { + val fragment = WelcomeFragment() + fragment.show(supportFragmentManager, fragment.tag) + } + } + + private fun bottomOption() { + when { + serviceSelected?.need_availability == "1" -> { + val fragment = BottomRequestFragment(this) + fragment.show(supportFragmentManager, fragment.tag) + } + else -> { + hiApiDoctorRequest(false) + } + } + } + + + fun startCall(item: ClassData?) { + classSelectedData = item + + if (classSelectedData?.isOccupied == false) { + AlertDialogUtil.instance.createOkCancelDialog(this, R.string.occupy_class, + R.string.occupy_class_message, R.string.occupy_class, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(this@DoctorDetailActivity, true)) { + val hashMap = HashMap() + hashMap["class_id"] = classSelectedData?.id ?: "" + viewModelClasses.enrollUser(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } else if (classSelectedData?.isOccupied == true) { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["class_id"] = classSelectedData?.id ?: "" + viewModelClasses.joinClass(hashMap) + } + } else if (classSelectedData?.status == ClassType.ADDED) { + AlertDialogUtil.instance.createOkCancelDialog(this, R.string.join_class, + R.string.join_class_message, R.string.ok, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + } + + override fun onCancelButtonClicked() { + } + }).show() + } + } + + companion object { + const val DOCTOR_ID = "DOCTOR_ID" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/RatingAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/RatingAdapter.kt new file mode 100644 index 0000000..1a1c82f --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/RatingAdapter.kt @@ -0,0 +1,78 @@ +package com.consultantapp.ui.dashboard.doctor.detail + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Review +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemRatingBinding +import com.consultantapp.utils.loadImage +import com.consultantapp.utils.pxFromDp + + +class RatingAdapter(private val needExpert: Boolean, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_rating, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemRatingBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + /*Set banner height*/ + if (needExpert) { + val widthScreen = binding.root.resources.displayMetrics.widthPixels - pxFromDp(binding.root.context, 32f) + val widthFinal = (widthScreen * 0.8).toInt() + + binding.clMain.layoutParams.width = widthFinal + } + } + + fun bind(item: Review) = with(binding) { + + if (needExpert) { + tvName.text = item.consultant?.name + loadImage("tag",binding.ivPic, item.consultant?.profile_image, + R.drawable.ic_profile_placeholder) + } else { + tvName.text = item.user?.name + loadImage("tag",binding.ivPic, item.user?.profile_image, + R.drawable.ic_profile_placeholder) + } + + tvRating.text = item.rating.toString() + tvComment.text = (item.comment ?: "").toString() + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/ServicesAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/ServicesAdapter.kt new file mode 100644 index 0000000..ea0396b --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/ServicesAdapter.kt @@ -0,0 +1,62 @@ +package com.consultantapp.ui.dashboard.doctor.detail + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Service +import com.consultantapp.databinding.RvItemServiceBinding +import com.consultantapp.utils.getCurrency +import com.consultantapp.utils.getUnitPrice + + +class ServicesAdapter(private val activity: DoctorDetailActivity, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ServicesAdapter.ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ServicesAdapter.ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_service, parent, false)) + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemServiceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clService.setOnClickListener { + activity.serviceClick(items[bindingAdapterPosition]) + } + } + + fun bind(item: Service) = with(binding) { + + try { + clService.setBackgroundColor(Color.parseColor(item.color_code)) + } catch (e: Exception) { + clService.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + } + + tvName.text = item.service_name + if(BuildConfig.FLAVOR=="taradoc"){ + tvName.setTextColor(Color.parseColor("#1b1616")) + } + val price = if (item.price_type == "price_range") + item.price + else + item.price + + tvPrice.text = binding.root.context.getString(R.string.price_s, getCurrency(price), + getUnitPrice(item.unit_price,binding.root.context)) + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceAdapter.kt new file mode 100644 index 0000000..6b91bce --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceAdapter.kt @@ -0,0 +1,78 @@ +package com.consultantapp.ui.dashboard.doctor.detail.prefrence + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.models.responses.FilterOption +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemPrefrenceBinding + + +class PrefrenceAdapter(private val fragment: PrefrenceFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_prefrence, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemPrefrenceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.clickItem(items[adapterPosition]) + } + + } + + fun bind(item: Filter) = with(binding) { + tvName.text = item.filter_name + + + val listOptions = ArrayList() + listOptions.addAll(item.options ?: emptyList()) + val prefrenceItemAdapter = PrefrenceItemAdapter(item.is_multi == "1", listOptions) + rvListing.adapter = prefrenceItemAdapter + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceFragment.kt new file mode 100644 index 0000000..9581b77 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceFragment.kt @@ -0,0 +1,171 @@ +package com.consultantapp.ui.dashboard.doctor.detail.prefrence + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentServiceBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.classes.ClassesViewModel +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class PrefrenceFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentServiceBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var viewModelLogin: LoginViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: PrefrenceAdapter + + private var categoryData: Categories? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_service, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + + if (requireActivity().intent.hasExtra(FILTER_DATA)) { + val filterSet = requireActivity().intent.getSerializableExtra(FILTER_DATA) as ArrayList + if (filterSet.isNotEmpty()) { + items.clear() + items.addAll(filterSet) + adapter.notifyDataSetChanged() + } else + hitApi() + } else + hitApi() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + viewModelLogin = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvHeader.text = getString(R.string.set_prefrences) + binding.tvClearFilter.visible() + categoryData = requireActivity().intent?.getSerializableExtra(CATEGORY_PARENT_ID) as Categories + + } + + private fun setAdapter() { + adapter = PrefrenceAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi() + } + + binding.tvNext.setOnClickListener { + val intent = Intent() + intent.putExtra(FILTER_DATA, items) + requireActivity().setResult(Activity.RESULT_OK, intent) + requireActivity().finish() + } + + binding.tvClearFilter.setOnClickListener { + hitApi() + } + } + + private fun hitApi() { + + val hashMap = HashMap() + if (isConnectedToInternet(requireContext(), true)) { + + hashMap["category_id"] = categoryData?.id ?: "" + + viewModel.getFilters(hashMap) + } + } + + private fun bindObservers() { + viewModel.getFilters.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + val tempList = it.data?.filters ?: emptyList() + items.clear() + + items.addAll(tempList) + adapter.notifyDataSetChanged() + if (items.isNotEmpty()) + binding.tvNext.visible() + + adapter.setAllItemsLoaded(true) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + binding.tvNext.gone() + } + } + }) + } + + + fun clickItem(item: Filter?) { + + } + + companion object { + const val FILTER_DATA = "FILTER_DATA" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceItemAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceItemAdapter.kt new file mode 100644 index 0000000..c993fd5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/detail/prefrence/PrefrenceItemAdapter.kt @@ -0,0 +1,81 @@ +package com.consultantapp.ui.dashboard.doctor.detail.prefrence + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.FilterOption +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemPrefrenceOptionBinding +import com.consultantapp.utils.gone +import com.consultantapp.utils.visible + + +class PrefrenceItemAdapter(private val multiSelect: Boolean, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_prefrence_option, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemPrefrenceOptionBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: FilterOption) = with(binding) { + if (multiSelect) { + cbName.visible() + rbName.gone() + } else { + cbName.gone() + rbName.visible() + } + + cbName.text = item.option_name + rbName.text = item.option_name + + rbName.isChecked = item.isSelected + cbName.isChecked = item.isSelected + + clMain.setOnClickListener { + if (multiSelect) { + items[bindingAdapterPosition].isSelected = !items[bindingAdapterPosition].isSelected + notifyDataSetChanged() + } else { + items.forEachIndexed { index, filterOption -> + items[index].isSelected = bindingAdapterPosition == index + } + notifyDataSetChanged() + } + } + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/listing/DoctorListActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/listing/DoctorListActivity.kt new file mode 100644 index 0000000..2e2d341 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/listing/DoctorListActivity.kt @@ -0,0 +1,438 @@ +package com.consultantapp.ui.dashboard.doctor.listing + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.View +import android.view.inputmethod.EditorInfo +import android.widget.TextView.OnEditorActionListener +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.models.responses.* +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityDoctorListingBinding +import com.consultantapp.ui.adapter.CommonFragmentPagerAdapter +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.dashboard.DoctorsAdapter +import com.consultantapp.ui.dashboard.doctor.DoctorActionActivity +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity +import com.consultantapp.ui.dashboard.doctor.detail.prefrence.PrefrenceFragment.Companion.FILTER_DATA +import com.consultantapp.ui.dashboard.home.BannerViewModel +import com.consultantapp.ui.dashboard.home.banner.BannerFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerAppCompatActivity +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + + +class DoctorListActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + lateinit var binding: ActivityDoctorListingBinding + + private var items = ArrayList() + + private var itemsService = ArrayList() + + + private lateinit var adapter: DoctorsAdapter + + private lateinit var serviceAdapter: ServiceAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: DoctorViewModel + + private lateinit var viewModelBanner: BannerViewModel + + private var categoryData: Categories? = null + + private var serviceId = "" + + var filters = ArrayList() + + var filtersOptionId = "" + + var searchText = "" + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_doctor_listing) + + initialise() + listeners() + bindObservers() + setAdapter() + + binding.clLoader.visible() + hitApi(true) + } + + private fun initialise() { + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + viewModelBanner = ViewModelProvider(this, viewModelFactory)[BannerViewModel::class.java] + progressDialog = ProgressDialog(this) + + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_profile_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_vendor) + + if (intent.hasExtra(EXTRA_CONSULT_TYPE)) { + val consult = when (intent.getStringExtra(EXTRA_CONSULT_TYPE)) { + ConsultType.CONSULT_ONLINE -> getString(R.string.consult_online) + ConsultType.EMERGENCY_CONSULTATION -> getString(R.string.emergency_consultation) + ConsultType.FREE_EXPERT -> getString(R.string.free_expert_advice) + ConsultType.HOME_VISIT -> getString(R.string.home_care_appointment) + ConsultType.CLINIC_VISIT -> getString(R.string.clinic_appointment) + ConsultType.ALL -> getString(R.string.consult_a_doctor) + else -> getString(R.string.consult_online) + } + + binding.tvHeader.text = consult + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_vendor_desc, consult) + + binding.etSearch.hint = getString(R.string.search_for_consultant, consult) + + } else if (intent.hasExtra(CATEGORY_PARENT_ID)) { + categoryData = intent.getSerializableExtra(CATEGORY_PARENT_ID) as Categories + binding.tvHeader.text = categoryData?.name + + binding.etSearch.hint = getString(R.string.search_for_consultant, categoryData?.name) + + binding.ivFilter.hideShowView(categoryData?.is_filters == true) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_vendor_desc, categoryData?.name) + + if (isConnectedToInternet(this, false)) { + val hashMap = HashMap() + hashMap["category_id"] = categoryData?.id ?: "" + + viewModel.services(hashMap) + viewModelBanner.coupons(hashMap) + } + } + } + + private fun setAdapter() { + adapter = DoctorsAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + + serviceAdapter = ServiceAdapter(this, itemsService) + binding.rvServices.adapter = serviceAdapter + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + finish() + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLastPage && lastVisibleItemPosition >= totalItemCount) { + hitApi(false) + } + } + }) + + binding.ivFilter.setOnClickListener { + startActivityForResult(Intent(this, DoctorActionActivity::class.java) + .putExtra(PAGE_TO_OPEN, DoctorActionActivity.FILTER) + .putExtra(CATEGORY_PARENT_ID, categoryData) + .putExtra(FILTER_DATA, filters), AppRequestCode.ADD_FILTER) + } + + binding.etSearch.setOnEditorActionListener(OnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + searchDoctorName() + return@OnEditorActionListener true + } + false + }) + + binding.ivSearch.setOnClickListener { + searchDoctorName() + } + } + + private fun searchDoctorName() { + binding.etSearch.hideKeyboard() + + if (searchText != binding.etSearch.text.toString().trim()) { + searchText = binding.etSearch.text.toString().trim() + binding.clLoader.visible() + + isLoadingMoreItems=false + hitApi(true) + } + } + + + fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(this, true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + /*if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: ""*/ + + hashMap["page"] = if (isFirstPage) "1" else ((items.size / PER_PAGE_LOAD) + 1).toString() + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + if (serviceId.isNotEmpty()) + hashMap["service_id"] = serviceId + + if (filtersOptionId.isNotEmpty()) + hashMap["filter_option_ids"] = filtersOptionId.removeSuffix(",") + + if (intent.hasExtra(CATEGORY_PARENT_ID)) + hashMap["category_id"] = categoryData?.id ?: "" + + if (searchText.isNotEmpty()) + hashMap["search"] = searchText + + if (intent.hasExtra(EXTRA_CONSULT_TYPE)) + hashMap["service_type"] = intent.getStringExtra(EXTRA_CONSULT_TYPE) ?: "" + + /*User Address*/ + val userAddress = prefsManager.getObject(USER_ADDRESS, SaveAddress::class.java) + if (userAddress != null) { + hashMap["lat"] = (userAddress.lat ?: "").toString() + hashMap["long"] = (userAddress.long ?: "").toString() + } + + if (!isLoadingMoreItems) { + isLoadingMoreItems = true + viewModel.doctorList(hashMap) + } + } + } + + private fun bindObservers() { + viewModel.doctorList.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + binding.clLoaderSearch.gone() + + isLoadingMoreItems = false + + val tempList = it.data?.doctors ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + binding.clLoaderSearch.gone() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && binding.clLoaderSearch.visibility != View.VISIBLE) + binding.clLoader.visible() + } + } + }) + + viewModel.services.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + itemsService.clear() + + if (it.data?.services?.size ?: 0 > 1) { + val service = Service() + service.name = getString(R.string.all) + service.service_id = "" + service.isSelected = true + itemsService.add(service) + } + + itemsService.addAll(it.data?.services ?: emptyList()) + serviceAdapter.notifyDataSetChanged() + + binding.rvServices.hideShowView(itemsService.size > 1) + + serviceAdapter.setAllItemsLoaded(true) + + } + Status.ERROR -> { + serviceAdapter.setAllItemsLoaded(true) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + + } + } + }) + + viewModelBanner.coupons.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + val itemsBanner = ArrayList() + itemsBanner.addAll(it.data?.coupons ?: emptyList()) + + val adapter = CommonFragmentPagerAdapter(this.supportFragmentManager) + itemsBanner.forEach { + adapter.addTab("", BannerFragment(null, it)) + } + binding.viewPagerBanner.adapter = adapter + binding.pageIndicatorView.setViewPager(binding.viewPagerBanner) + + if (itemsBanner.isNotEmpty()) + slideItem(binding.viewPagerBanner, this) + + binding.viewPagerBanner.hideShowView(itemsBanner.isNotEmpty()) + binding.pageIndicatorView.hideShowView(itemsBanner.size > 1) + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + fun clickItem(pos: Int) { + val intent = Intent(binding.root.context, DoctorDetailActivity::class.java) + .putExtra(DoctorDetailActivity.DOCTOR_ID, items[pos].doctor_data?.id) + + if (this.intent.hasExtra(EXTRA_CONSULT_TYPE)) + intent.putExtra(EXTRA_CONSULT_TYPE, this.intent.getStringExtra(EXTRA_CONSULT_TYPE)) + + startActivity(intent) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.ADD_FILTER) { + filters.clear() + + val filterSet = data?.getSerializableExtra(FILTER_DATA) as ArrayList + filters.addAll(filterSet) + + filtersOptionId = "" + filters.forEach { + it.options?.forEach { + if (it.isSelected) + filtersOptionId += it.id + "," + } + } + + binding.clLoader.visible() + hitApi(true) + + } + } + } + + fun onServiceSelected(item: Service) { + binding.etSearch.hideKeyboard() + serviceId = item.service_id ?: "" + + binding.clLoader.visible() + hitApi(true) + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + val intentFilter = IntentFilter() + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(this) + .registerReceiver(refreshData, intentFilter) + + } + + private fun unregisterReceiver() { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshData) + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + NetworkIssueFragment.NETWORK_ISSUE -> + hitApi(true) + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/listing/ServiceAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/listing/ServiceAdapter.kt new file mode 100644 index 0000000..6455708 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/listing/ServiceAdapter.kt @@ -0,0 +1,79 @@ +package com.consultantapp.ui.dashboard.doctor.listing + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Service +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.ItemServiceBinding + + +class ServiceAdapter(private val activity: DoctorListActivity, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_service, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: ItemServiceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clService.setOnClickListener { + + } + } + + fun bind(item: Service) = with(binding) { + + cbName.text = item.name ?: "" + + cbName.isChecked = item.isSelected + if (item.isSelected) { + clService.setBackgroundResource(R.drawable.drawable_theme_60) + } else { + clService.setBackgroundResource(R.drawable.drawable_service_inactive) + } + + clService.setOnClickListener { + if (!item.isSelected) { + items.forEachIndexed { index, service -> + items[index].isSelected = index == adapterPosition + } + notifyDataSetChanged() + activity.onServiceSelected(item) + } + } + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/DateTimeFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/DateTimeFragment.kt new file mode 100644 index 0000000..185b6ff --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/DateTimeFragment.kt @@ -0,0 +1,634 @@ +package com.consultantapp.ui.dashboard.doctor.schedule + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.location.Address +import android.location.Geocoder +import android.os.Bundle +import android.text.method.LinkMovementMethod +import android.util.Log +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.requests.CarePlan +import com.consultantapp.data.models.requests.CreateRequest +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.models.responses.Service +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentDateTimeBinding +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.dashboard.careplan.CarePlanAdapter +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment.Companion.SERVICE_ID +import com.consultantapp.ui.dashboard.doctor.schedule.request.BottomServiceRequestFragment +import com.consultantapp.ui.dashboard.doctor.symptom.PandemicViewModel +import com.consultantapp.ui.dashboard.location.AddAddressActivity +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.CameraPosition +import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.MarkerOptions +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.fragment_date_time.* +import java.text.SimpleDateFormat +import java.util.* +import javax.inject.Inject + + +class DateTimeFragment : DaggerFragment(), OnTimeSelected, OnDateSelected, GoogleMap.OnCameraChangeListener, OnMapReadyCallback { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentDateTimeBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: DoctorViewModel + + private lateinit var viewModelPandemic: PandemicViewModel + + private var isSelectedStart = true + + private var address: SaveAddress? = null + + private var carePlan: Filter? = null + + private var categoryData: Categories? = null + + private var selectedService: Service? = null + + private var mapFragment: SupportMapFragment? = null + + private var mMap: GoogleMap? = null + + private var createRequest: CreateRequest? = null + + private var itemsPlans = ArrayList() + + private var itemsPlansOptions = ArrayList() + + private lateinit var adapter: CarePlanAdapter + + private lateinit var adapterTitle: CarePlanAdapter + + private var clickOnSubmitButton = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_date_time, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + setAdapter() + } + return rootView + } + + private fun initialise() { + mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment + mapFragment?.getMapAsync(this) + + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setSaleContract(requireActivity()), TextView.BufferType.SPANNABLE) + + categoryData = requireActivity().intent.getSerializableExtra(CATEGORY_PARENT_ID) as Categories + selectedService = requireActivity().intent.getSerializableExtra(SERVICE_ID) as Service + + viewModel = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + viewModelPandemic = ViewModelProvider(this, viewModelFactory)[PandemicViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + when (selectedService?.main_service_type) { + ConsultType.HOME_VISIT, ConsultType.CLINIC_VISIT -> { + binding.ilAddress.visible() + binding.tvChange.visible() + binding.transparentImage.visible() + + /*User Address*/ + address = prefsManager.getObject(USER_ADDRESS, SaveAddress::class.java) + hitApiDoctorList() + } + } + viewModelPandemic.carePlanTier() + + if(BuildConfig.FLAVOR=="nurseLynx"){ + address = prefsManager.getObject(USER_ADDRESS, SaveAddress::class.java) + if(address?.lat!=null && address?.long!=null) + binding.etAddress.setText(getAddressFromLatLong(requireContext(), address?.lat!!, address?.long!!)) + + binding.ilAddress.visible() + binding.tvChange.visible() + binding.transparentImage.visible() + binding.tvAgeTerms.visible() + binding.tvPlans.visible() + }else { + binding.tvAgeTerms.gone() + binding.tvPlans.gone() + } + + /* val doctorData = requireActivity().intent.getSerializableExtra(USER_DATA) as UserData + binding.tvName.text = getDoctorName(doctorData) + binding.tvDesc.text = doctorData.categoryData?.name + ?: binding.root.context.getString(R.string.na) + loadImage(binding.ivPic, doctorData.profile_image, R.drawable.ic_profile_placeholder)*/ + + } + + private fun getAddressFromLatLong(context: Context, latitude: Double, longitude: Double): String? { + val geocoder = Geocoder(context, Locale.getDefault()) + return try { + val addresses = geocoder.getFromLocation(latitude, longitude, 1) + if (addresses != null && addresses.isNotEmpty()) { + val address = addresses[0] + "${address.getAddressLine(0)}" + } else { + "Address not found" + } + } catch (e: Exception) { + e.printStackTrace() + "Unable to get address" + } + } + + private fun setAdapter() { + adapterTitle = CarePlanAdapter(this, CarePlanAdapter.PlanOption.SELECTION, itemsPlans) + binding.rvCarePlanTitle.adapter = adapterTitle + + adapter = CarePlanAdapter(this, CarePlanAdapter.PlanOption.MAIN, itemsPlansOptions) + binding.rvCarePlan.adapter = adapter + } + + private fun hitApiDoctorList(){ + if (address != null) { + binding.etAddress.setText(address?.locationName) + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["category_id"] = categoryData?.id ?: "" + hashMap["service_id"] = selectedService?.service_id ?: "" + hashMap["service_type"] = selectedService?.main_service_type ?: "" + + hashMap["lat"] = (address?.lat ?: "").toString() + hashMap["long"] = (address?.long ?: "").toString() + + viewModel.doctorListV2(hashMap) + } + } + } + + fun setTierSelected(tierSelected: Filter) { + if (binding.etStartDate.text.toString().isEmpty() || binding.etEndDate.text.toString().isEmpty()) { + binding.etStartDate.showSnackBar(getString(R.string.select_date)) + val index=itemsPlans.indexOf(tierSelected) + itemsPlans[index].isSelected=false + adapterTitle.notifyDataSetChanged() + + } else if (binding.etStartTime.text.toString().isEmpty() || binding.etEndTime.text.toString().isEmpty()) { + binding.etStartDate.showSnackBar(getString(R.string.select_time)) + val index=itemsPlans.indexOf(tierSelected) + itemsPlans[index].isSelected=false + adapterTitle.notifyDataSetChanged() + + } else { + if (tierSelected.isSelected) { + carePlan = tierSelected + + binding.rvCarePlan.visible() + + itemsPlansOptions.clear() + itemsPlansOptions.add(tierSelected) + + adapter.notifyDataSetChanged() + + //ckeckDateTime() + } else { + carePlan = null + binding.rvCarePlan.gone() + binding.tvCarePlanP.gone() + binding.tvCarePlanV.gone() + } + } + } + + override fun onCameraChange(cameraPosition: CameraPosition) { + + } + + override fun onMapReady(googleMap: GoogleMap) { + mMap = googleMap + mMap?.isTrafficEnabled = false + mMap?.setOnCameraChangeListener(this) + + // mMap?.isMyLocationEnabled = true + mMap?.uiSettings?.isMyLocationButtonEnabled = true + + if (address?.lat != null && address?.long != null) { + val current = LatLng(address?.lat ?: 0.0, address?.long ?: 0.0) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(current)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(9f)) + } + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.etStartDate.setOnClickListener { + isSelectedStart = true + DateUtils.openDatePicker(requireActivity(), this, null, (System.currentTimeMillis() - 86400000)) + } + + binding.tvPlans.setOnClickListener { + val fragment = ServicePlansFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + binding.etEndDate.setOnClickListener { + isSelectedStart = false + DateUtils.openDatePicker(requireActivity(), this, null, (System.currentTimeMillis() - 86400000)) + } + + binding.etStartTime.setOnClickListener { + openTimePicker(true) + } + + binding.etEndTime.setOnClickListener { + openTimePicker(false) + } + + binding.etAddress.setOnClickListener { + //placePicker(this, requireActivity()) + + val intent = Intent(requireContext(), AddAddressActivity::class.java) + if (address != null) + intent.putExtra(AddAddressActivity.EXTRA_ADDRESS, address) + startActivityForResult(intent, AppRequestCode.ASK_FOR_LOCATION) + } + + binding.tvChange.setOnClickListener { + //placePicker(this, requireActivity()) + + val intent = Intent(requireContext(), AddAddressActivity::class.java) + if (address != null) + intent.putExtra(AddAddressActivity.EXTRA_ADDRESS, address) + startActivityForResult(intent, AppRequestCode.ASK_FOR_LOCATION) + } + +// binding.tvPdf.setOnClickListener { +// +// // create a new renderer +// val renderer = PdfRenderer() +// +// // let us just render all pages +// val pageCount = renderer.pageCount +// for (i in 0 until pageCount) { +// val page: PdfRenderer.Page = renderer.openPage(i) +// +// // say we render for showing on the screen +// page.render(mBitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY) +// +// // do stuff with the bitmap +// +// // close the page +// page.close() +// } +// +// // close the renderer +// renderer.close() +// } + + binding.transparentImage.setOnTouchListener { v, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> { + // Disallow ScrollView to intercept touch events. + binding.scrollMap.requestDisallowInterceptTouchEvent(true) + // Disable touch on transparent view + false + } + + MotionEvent.ACTION_UP -> { + // Allow ScrollView to intercept touch events. + binding.scrollMap.requestDisallowInterceptTouchEvent(false) + true + } + + MotionEvent.ACTION_MOVE -> { + binding.scrollMap.requestDisallowInterceptTouchEvent(true) + false + } + + else -> true + } + } + + binding.tvBookAppointment.setOnClickListener { + if (askForLogin()) { + when { + binding.etStartDate.text.toString().isEmpty() -> { + binding.etStartDate.showSnackBar(getString(R.string.start_date)) + return@setOnClickListener + } + binding.etEndDate.text.toString().isEmpty() -> { + binding.etEndDate.showSnackBar(getString(R.string.end_date)) + return@setOnClickListener + } + binding.etStartTime.text.toString().isEmpty() -> { + binding.etStartTime.showSnackBar(getString(R.string.start_time)) + return@setOnClickListener + } + binding.etEndTime.text.toString().isEmpty() -> { + binding.etEndTime.showSnackBar(getString(R.string.end_time)) + return@setOnClickListener + } + !binding.tvTerms.isChecked -> { + binding.tvTerms.showSnackBar(getString(R.string.you_agree_to_the_terms_conditions)) + } + (BuildConfig.FLAVOR=="nurseLynx") && !binding.tvAgeTerms.isChecked -> { + binding.tvAgeTerms.showSnackBar(getString(R.string.please_check_age_terms)) + } + else -> ckeckDateTime(true) + } + } + } + } + + private fun askForLogin(): Boolean { + if (!userRepository.isUserLoggedIn()) { + val fragment = WelcomeFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + return userRepository.isUserLoggedIn() + } + + private fun ckeckDateTime(clickOnButton: Boolean = false) { + clickOnSubmitButton = clickOnButton + + val sdf = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.US) + + val startDate = sdf.parse(binding.etStartDate.text.toString()) + val endDate = sdf.parse(binding.etEndDate.text.toString()) + + if (startDate?.before(endDate) == false) { + val sdfTime = SimpleDateFormat(DateFormat.TIME_FORMAT, Locale.US) + + val startTime = sdfTime.parse(binding.etStartTime.text.toString()) + val endTime = sdfTime.parse(binding.etEndTime.text.toString()) + + if (endTime?.before(startTime) == true || endTime?.equals(startTime) == true) { + binding.etStartTime.showSnackBar(getString(R.string.greater_time)) + return + } + } + + if (isConnectedToInternet(requireContext(), true)) { + + createRequest = CreateRequest() + + createRequest!!.category_id = categoryData?.id + createRequest!!.service_id = selectedService?.service_id + + createRequest!!.date = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etStartDate.text.toString()) + createRequest!!.time = DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT_24, binding.etStartTime.text.toString()) + + createRequest!!.end_date = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etEndDate.text.toString()) + createRequest!!.end_time = DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT_24, binding.etEndTime.text.toString()) + + if (binding.ilAddress.visibility == View.VISIBLE && address != null) { + createRequest!!.service_address = address?.locationName ?: "" + createRequest!!.lat = address?.lat ?: 0.0 + createRequest!!.long = address?.long ?: 0.0 + } + + if (carePlan != null) { + createRequest!!.tier_id = carePlan?.id + + val arrayList = ArrayList() + carePlan?.tier_options?.forEach { + it.tier_options_select?.forEachIndexed { index, filter -> + if (filter.isSelected) { + arrayList.add(CarePlan(id = it.id, type = (index + 1))) + return@forEach + } + } + } + if (arrayList.isNotEmpty()) { + createRequest!!.tier_options = ArrayList() + createRequest!!.tier_options?.addAll(arrayList) + } else if (clickOnButton) { + binding.etStartDate.showSnackBar(getString(R.string.select_care_plan)) + return + } + } + + createRequest!!.schedule_type = RequestType.SCHEDULE + viewModel.confirmRequestV2(createRequest!!) + } + } + + private fun openTimePicker(isStart: Boolean) { + if (binding.etStartDate.text.toString().isEmpty() || binding.etEndDate.text.toString() + .isEmpty()) + binding.etStartDate.showSnackBar(getString(R.string.select_date)) + else { + val sdf = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.US) + + val startDate = sdf.parse(binding.etStartDate.text.toString()) + val endDate = sdf.parse(binding.etEndDate.text.toString()) + + /* if (startDate?.before(endDate) == true) + DateUtils.getTime(requireContext(), "", "", isStart = isStart, listener = this) + else*/ + DateUtils.getTime(requireContext(), binding.etStartTime.text.toString(), + binding.etEndTime.text.toString(), isStart = isStart, listener = this) + } + } + + private fun bindObservers() { + + viewModel.confirmRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (clickOnSubmitButton) { + val fragment = createRequest?.let { it1 -> + BottomServiceRequestFragment(it.data, + it1, selectedService) + } + fragment?.show(requireActivity().supportFragmentManager, fragment.tag) + } else { + val tier_charges = it.data?.tier_charges + if (!tier_charges.isNullOrEmpty() && tier_charges != "0") { + binding.tvCarePlanP.visible() + binding.tvCarePlanV.visible() + binding.tvCarePlanV.text = getCurrency(tier_charges) + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.doctorList.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + it.data?.doctors?.forEach { + val latLng = LatLng(it.address_data?.lat ?: 0.0, it.address_data?.long ?: 0.0) + mMap?.addMarker(MarkerOptions() + .position(latLng) + .icon(bitmapDescriptorFromVector(requireContext(), R.drawable.ic_drop_location_mrkr)) + .anchor(0.5f, 0.5f) + .title(getDoctorName(it.doctor_data)) + .flat(true)) + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelPandemic.carePlanTier.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoaderCarePlan.gone() + + itemsPlans.clear() + itemsPlans.addAll(it.data?.tiers ?: emptyList()) + adapterTitle.notifyDataSetChanged() + + } + Status.ERROR -> { + binding.clLoaderCarePlan.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoaderCarePlan.visible() + } + } + }) + } + + override fun onTimeSelected(time: Triple) { + if (!time.third) { + if (time.second) + binding.etStartTime.setText(time.first) + else + binding.etEndTime.setText(time.first) + + /* if (binding.etStartTime.text.toString().isNotEmpty() && binding.etEndTime.text.toString().isNotEmpty()) { + ckeckDateTime() + }*/ + + } else { + binding.etStartTime.showSnackBar(getString(R.string.greater_time)) + } + } + + + override fun onDateSelected(date: String) { + val sdf = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.US) + + val startTime = when { + isSelectedStart -> sdf.parse(date) + binding.etStartDate.text.toString() + .isNotEmpty() -> sdf.parse(binding.etStartDate.text.toString()) + else -> null + } + + val endTime = when { + !isSelectedStart -> sdf.parse(date) + binding.etEndDate.text.toString() + .isNotEmpty() -> sdf.parse(binding.etEndDate.text.toString()) + else -> null + } + + var compareDate = true + if (startTime == null || endTime == null) + compareDate = false + + if (compareDate && endTime?.before(startTime) == true) { + binding.etStartTime.showSnackBar(getString(R.string.greater_date)) + return + } + + if (isSelectedStart) + binding.etStartDate.setText(date) + else + binding.etEndDate.setText(date) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.ASK_FOR_LOCATION -> { + address = SaveAddress() + address = data?.getSerializableExtra(AddAddressActivity.EXTRA_ADDRESS) as SaveAddress + binding.etAddress.setText(address?.locationName) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(LatLng(address?.lat ?: 0.0, address?.long ?: 0.0))) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(9f)) + hitApiDoctorList() + } + } + } + } +} + +interface OnTimeSelected { + fun onTimeSelected(time: Triple) +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/DatesAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/DatesAdapter.kt new file mode 100644 index 0000000..e9d240a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/DatesAdapter.kt @@ -0,0 +1,66 @@ +package com.consultantapp.ui.dashboard.doctor.schedule + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.requests.DatesAvailability +import com.consultantapp.databinding.ItemDatesBinding +import com.consultantapp.utils.DateFormat +import com.consultantapp.utils.DateUtils.dateFormatFromMillis +import com.consultantapp.utils.gone +import com.consultantapp.utils.visible +import java.util.* + +class DatesAdapter(private val fragment: ScheduleFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_dates, parent, false)) + } + + inner class ViewHolder(val binding: ItemDatesBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: DatesAvailability) = with(binding) { + + cbName.text = when (adapterPosition) { + 0 -> fragment.getString(R.string.today) + 1 -> fragment.getString(R.string.tomorrow) + else -> item.displayName + } + + cbDate.text = dateFormatFromMillis(DateFormat.MON_DATE_YEAR, item.date ?: 0) + + cbName.isChecked = item.isSelected + cbDate.isChecked = item.isSelected + + if (item.isSelected) { + view.visible() + } else { + view.gone() + } + + + clDate.setOnClickListener { + if (!item.isSelected) { + for (count: Int in 0 until items.size) { + items[count].isSelected = count == adapterPosition + notifyItemChanged(count) + } + fragment.onDateSelected(item) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/GetSlotsViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/GetSlotsViewModel.kt new file mode 100644 index 0000000..b5c2d81 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/GetSlotsViewModel.kt @@ -0,0 +1,42 @@ +package com.consultantapp.ui.dashboard.doctor.schedule + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class GetSlotsViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val getSlots by lazy { SingleLiveEvent>() } + + fun getSlots(hashMap: HashMap) { + getSlots.value = Resource.loading() + + webService.getSlots(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getSlots.value = Resource.success(response.body()?.data) + } else { + getSlots.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getSlots.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/IntervalAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/IntervalAdapter.kt new file mode 100644 index 0000000..e9799d8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/IntervalAdapter.kt @@ -0,0 +1,59 @@ +package com.consultantapp.ui.dashboard.doctor.schedule + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Interval +import com.consultantapp.databinding.ItemIntervalBinding + + +class IntervalAdapter(private val fragment: ScheduleFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: IntervalAdapter.ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IntervalAdapter.ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_interval, parent, false)) + + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: ItemIntervalBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Interval) = with(binding) { + + cbName.text = item.time ?: "" + clService.isEnabled = item.available ?: true + if (item.available == true) + clService.alpha = 1.0f + else + clService.alpha = 0.5f + + cbName.isChecked = item.isSelected + if (item.isSelected) { + clService.setBackgroundResource(R.drawable.drawable_theme_stroke_60) + } else { + clService.setBackgroundResource(R.drawable.drawable_stroke_inactive) + } + + clService.setOnClickListener { + items.forEachIndexed { index, service -> + items[index].isSelected = index == adapterPosition + } + notifyDataSetChanged() + fragment.onIntervalSelected(item) + } + + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/ScheduleFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/ScheduleFragment.kt new file mode 100644 index 0000000..5650413 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/ScheduleFragment.kt @@ -0,0 +1,322 @@ +package com.consultantapp.ui.dashboard.doctor.schedule + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.requests.DatesAvailability +import com.consultantapp.data.models.responses.Interval +import com.consultantapp.data.models.responses.Service +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentScheduleBinding +import com.consultantapp.ui.dashboard.doctor.confirm.ConfirmBookingFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.DateUtils.dateFormatFromMillisBackend +import dagger.android.support.DaggerFragment +import java.text.SimpleDateFormat +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + +class ScheduleFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentScheduleBinding + + private var rootView: View? = null + + private lateinit var viewModel: GetSlotsViewModel + + private var itemDays = ArrayList() + + private var itemIntervalAll = ArrayList() + + private var itemIntervalMorning = ArrayList() + + private var itemIntervalAfternoon = ArrayList() + + private var itemIntervalEvening = ArrayList() + + private lateinit var datesAdapter: DatesAdapter + + private lateinit var intervalAdapterMorning: IntervalAdapter + + private lateinit var intervalAdapterAfternoon: IntervalAdapter + + private lateinit var intervalAdapterEvening: IntervalAdapter + + private var dateSelected = DatesAvailability() + + private var doctorData: UserData? = null + + private var selectedSlotTime = 0 + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_schedule, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + setDatesAdapter() + setIntervalAdapter() + + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[GetSlotsViewModel::class.java] + doctorData = requireActivity().intent.getSerializableExtra(USER_DATA) as UserData + + binding.tvName.text = getDoctorName(doctorData) + binding.tvDesc.text = doctorData?.categoryData?.name + ?: binding.root.context.getString(R.string.na) + loadImage("tag",binding.ivPic, doctorData?.profile_image, R.drawable.ic_profile_placeholder) + } + + + private fun setDatesAdapter() { + itemDays.clear() + var calendar: Calendar + var date: DatesAvailability + for (i in 0..30) { + calendar = Calendar.getInstance() + calendar.add(Calendar.DAY_OF_MONTH, i) + + date = DatesAvailability() + date.displayName = + calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault()) + date.date = calendar.timeInMillis + itemDays.add(date) + } + + /*Make 1st item selected*/ + val selectedPos = 0 + if (itemDays.size >= selectedPos) { + itemDays[selectedPos].isSelected = true + dateSelected = itemDays[selectedPos] + onDateSelected(dateSelected) + } + + datesAdapter = DatesAdapter(this, itemDays) + binding.rvWeek.adapter = datesAdapter + + } + + private fun setIntervalAdapter() { + intervalAdapterMorning = IntervalAdapter(this, itemIntervalMorning) + binding.rvListingMorning.adapter = intervalAdapterMorning + + intervalAdapterAfternoon = IntervalAdapter(this, itemIntervalAfternoon) + binding.rvListingAfternoon.adapter = intervalAdapterAfternoon + + intervalAdapterEvening = IntervalAdapter(this, itemIntervalEvening) + binding.rvListingEvening.adapter = intervalAdapterEvening + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvMorning.setOnClickListener { + setDataIntervals(SlotTime.MORNING) + } + + binding.tvAfternoon.setOnClickListener { + setDataIntervals(SlotTime.AFTERNOON) + } + + binding.tvEvening.setOnClickListener { + setDataIntervals(SlotTime.EVENING) + } + } + + + private fun hitApi(date: String) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["doctor_id"] = doctorData?.id ?: "" + hashMap["date"] = date + hashMap["category_id"] = doctorData?.categoryData?.id ?: "" + hashMap["service_id"] = (requireActivity().intent.getSerializableExtra(SERVICE_ID) as Service).service_id ?:"" + + viewModel.getSlots(hashMap) + } + } + + private fun bindObservers() { + viewModel.getSlots.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + selectedSlotTime = 0 + itemIntervalAll.clear() + itemIntervalAll.addAll(it.data?.interval ?: emptyList()) + + differIntervals() + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.colorWhite + ) + ) + binding.clLoader.visible() + } + } + }) + } + + private fun differIntervals() { + itemIntervalMorning.clear() + itemIntervalAfternoon.clear() + itemIntervalEvening.clear() + + val sdf = SimpleDateFormat(DateFormat.TIME_FORMAT, Locale.ENGLISH) + + val timeMorning = sdf.parse("12:00 pm") + val timeAfternoon = sdf.parse("4:00 pm") + var intervalTime: Date + + /*Pick out interval for morning, afternoon, evening*/ + itemIntervalAll.forEach { + intervalTime = sdf.parse(it.time) + + when { + intervalTime.before(timeMorning) -> { + itemIntervalMorning.add(it) + } + intervalTime.before(timeAfternoon) -> { + itemIntervalAfternoon.add(it) + } + else -> { + itemIntervalEvening.add(it) + } + } + } + + setDataIntervals(SlotTime.MORNING) + + } + + private fun setDataIntervals(interval: Int) { + if (selectedSlotTime != interval) { + /*Set previous values unselected*/ + when (selectedSlotTime) { + SlotTime.MORNING -> { + itemIntervalMorning.forEachIndexed { index, _ -> + itemIntervalMorning[index].isSelected = false + } + intervalAdapterMorning.notifyDataSetChanged() + } + SlotTime.AFTERNOON -> { + itemIntervalAfternoon.forEachIndexed { index, _ -> + itemIntervalAfternoon[index].isSelected = false + } + intervalAdapterAfternoon.notifyDataSetChanged() + } + SlotTime.EVENING -> { + itemIntervalEvening.forEachIndexed { index, _ -> + itemIntervalEvening[index].isSelected = false + } + intervalAdapterEvening.notifyDataSetChanged() + } + } + +/*Set updated value*/ + selectedSlotTime = interval + + binding.ivMorning.rotation = 0f + binding.ivAfternoon.rotation = 0f + binding.ivEvening.rotation = 0f + binding.rvListingMorning.gone() + binding.rvListingAfternoon.gone() + binding.rvListingEvening.gone() + binding.tvNoDataMorning.gone() + binding.tvNoDataAfternoon.gone() + binding.tvNoDataEvening.gone() + + /*Show views acc to selected position*/ + when (interval) { + SlotTime.MORNING -> { + binding.ivMorning.rotation = 180f + binding.rvListingMorning.visible() + intervalAdapterMorning.notifyDataSetChanged() + binding.tvNoDataMorning.hideShowView(itemIntervalMorning.isEmpty()) + } + SlotTime.AFTERNOON -> { + binding.ivAfternoon.rotation = 180f + binding.rvListingAfternoon.visible() + intervalAdapterAfternoon.notifyDataSetChanged() + binding.tvNoDataAfternoon.hideShowView(itemIntervalAfternoon.isEmpty()) + } + SlotTime.EVENING -> { + binding.ivEvening.rotation = 180f + binding.rvListingEvening.visible() + intervalAdapterEvening.notifyDataSetChanged() + binding.tvNoDataEvening.hideShowView(itemIntervalEvening.isEmpty()) + } + } + } + } + + + fun onDateSelected(item: DatesAvailability) { + binding.rvWeek.smoothScrollToPosition(itemDays.indexOf(item)) + + dateSelected = item + hitApi(dateFormatFromMillisBackend(DateFormat.DATE_FORMAT, item.date ?: 0)) + } + + fun onIntervalSelected(item: Interval) { + + val fragment = ConfirmBookingFragment() + val bundle = Bundle() + bundle.putLong(ConfirmBookingFragment.DATE_SELECTED, dateSelected.date ?: 0) + bundle.putString(ConfirmBookingFragment.TIME_SELECTED, item.time) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + companion object { + const val SERVICE_ID = "SERVICE_ID" + } + + object SlotTime { + const val MORNING = 1 + const val AFTERNOON = 2 + const val EVENING = 3 + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/ServicePlansFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/ServicePlansFragment.kt new file mode 100644 index 0000000..dce29e2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/ServicePlansFragment.kt @@ -0,0 +1,96 @@ +package com.consultantapp.ui.dashboard.doctor.schedule + +import android.app.Activity +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Build +import android.os.Bundle +import android.text.SpannableString +import android.text.method.LinkMovementMethod +import android.text.style.ForegroundColorSpan +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.WebChromeClient +import android.webkit.WebSettings +import android.webkit.WebView +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.ProviderType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentServicePlansBinding +import com.consultantapp.databinding.FragmentWelcomeBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.loginSignUp.SignUpActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +/*import com.facebook.CallbackManager +import com.facebook.FacebookCallback +import com.facebook.FacebookException +import com.facebook.login.LoginManager +import com.facebook.login.LoginResult*/ +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInClient +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.api.ApiException +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.snapchat.kit.sdk.SnapLogin +import com.snapchat.kit.sdk.core.controller.LoginStateController +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject + + +class ServicePlansFragment : DaggerBottomSheetDialogFragment() { + + + private lateinit var binding: FragmentServicePlansBinding + + private var rootView: View? = null + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_service_plans, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + private fun initialise() { + /*binding.pdfView.fromAsset("description_of_service_recommended.pdf") + .load()*/ + binding.tvTitle.setOnClickListener { + this.dismiss() + } + } +} + + + diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/BottomServiceFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/BottomServiceFragment.kt new file mode 100644 index 0000000..653329b --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/BottomServiceFragment.kt @@ -0,0 +1,131 @@ +package com.consultantapp.ui.dashboard.doctor.schedule.request + +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.models.responses.Service +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.BottomServiceBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.dashboard.doctor.DoctorActionActivity +import com.consultantapp.ui.dashboard.doctor.schedule.ScheduleFragment.Companion.SERVICE_ID +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap +import kotlin.collections.set + + +class BottomServiceFragment(private val categoryData: Categories?) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomServiceBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: DoctorViewModel + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_service, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + bindObservers() + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + if (isConnectedToInternet(requireContext(), false)) { + val hashMap = HashMap() + hashMap["category_id"] = categoryData?.id ?: "" + + viewModel.services(hashMap) + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + dismiss() + } + } + + fun serviceClick(item: Service) { + if (BuildConfig.FLAVOR == "nurseLynx") { + val intentDate = Intent(requireActivity(), DoctorActionActivity::class.java) + .putExtra(PAGE_TO_OPEN, RequestType.DATE_TIME) + if (categoryData!=null) + intentDate.putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, categoryData) + + intentDate.putExtra(SERVICE_ID, item) + + startActivity(intentDate) + dismiss() + } + } + + private fun bindObservers() { + viewModel.services.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + val serviceList = ArrayList() + serviceList.addAll(it.data?.services ?: emptyList()) + val adapter = ServiceRequestAdapter(this, serviceList) + binding.rvServices.adapter = adapter + + binding.rvServices.hideShowView(serviceList.isNotEmpty()) + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/BottomServiceRequestFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/BottomServiceRequestFragment.kt new file mode 100644 index 0000000..a58041e --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/BottomServiceRequestFragment.kt @@ -0,0 +1,271 @@ +package com.consultantapp.ui.dashboard.doctor.schedule.request + +import android.annotation.SuppressLint +import android.app.Dialog +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.graphics.Rect +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.requests.CreateRequest +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.Service +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentServiceRequestBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.ui.calling.Constants +import com.consultantapp.ui.dashboard.DoctorViewModel +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.addmoney.AddMoneyActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomServiceRequestFragment(private val data: CommonDataModel?, private val createRequest: CreateRequest, + private val service: Service?) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentServiceRequestBinding + + private var timeLimit = 125000L + + private var timer: CountDownTimer? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: DoctorViewModel + + private var isReceiverRegistered = false + private var requestId: String = "" + + + /* override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + }*/ + + @SuppressLint("ClickableViewAccessibility") + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) // Allow dismiss on outside touch + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + dialog.setOnShowListener { dialogInterface -> + val bottomSheet = (dialogInterface as BottomSheetDialog).findViewById(com.google.android.material.R.id.design_bottom_sheet) + bottomSheet?.setOnTouchListener { _, event -> + if (event.action == MotionEvent.ACTION_DOWN) { + val bounds = Rect() + bottomSheet.getGlobalVisibleRect(bounds) + if (!bounds.contains(event.rawX.toInt(), event.rawY.toInt())) { + dismiss() // Dismiss the dialog if the touch is outside + } + } + false + } + } + + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_service_request, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + setProgressTimer() + listeners() + setData() + bindObservers() + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[DoctorViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun setProgressTimer() { + // timeLimit -= (1) * 1000 + timeLimit += 60000 + binding.progressBar.max = timeLimit.toInt() + timer = object : CountDownTimer(timeLimit, 16) { + override fun onFinish() { + try { + dismiss() + requireActivity().longToast(getString(R.string.no_vendor_desc, service?.name)) + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, requestId)) + requireActivity().finish() + }catch (e:Exception){} + //onAcceptRequest.onOrderTimeoutOrError() + } + + override fun onTick(millisUntilFinished: Long) { + binding.progressBar.progress = timeLimit.toInt() - millisUntilFinished.toInt() + } + } + + binding.progressBar.visibility = View.VISIBLE + } + + private fun setData() { + binding.tvBookingDateV.text = "${ + DateUtils.dateFormatForBackend(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, createRequest.date ?: "")} - ${ + DateUtils.dateFormatForBackend(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, createRequest.end_date ?: "")}" + binding.tvBookingTimeV.text = "${DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT_24, + DateFormat.TIME_FORMAT, createRequest?.time ?: "")} - ${ + DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT_24, + DateFormat.TIME_FORMAT, createRequest?.end_time ?: "")}" + + binding.tvServiceTypeV.text = service?.name + + /*Price*/ + binding.tvSubTotalV.text = getCurrency(data?.total) + + if (!data?.tier_charges.isNullOrEmpty() && data?.tier_charges != "0") { + binding.tvCarePlanP.visible() + binding.tvCarePlanV.visible() + binding.tvCarePlanV.text = getCurrency(data?.tier_charges) + } + + binding.tvTotalV.text = getCurrency(data?.grand_total) + } + + private fun listeners() { + binding.tvPay.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) + viewModel.createRequestV2(createRequest) + } + } + + private fun startTimer() { + timer?.start() + } + + + private fun bindObservers() { + viewModel.createRequest.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + requestId = it.data?.request?.id.toString() + + + /*If amount not sufficient then add money*/ + if (it.data?.amountNotSufficient == true) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.insufficient_amount)) + .setMessage(it.data.message ?: getString(R.string.money_insufficient, + it.data.minimum_balance)) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + } + .setNegativeButton(getString(R.string.add_money)) { dialog, which -> + startActivity(Intent(requireContext(), AddMoneyActivity::class.java)) + }.show() + + } else { + binding.tvPay.gone() + startTimer() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_ACCEPTED) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_ACCEPTED -> { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, intent.getStringExtra(EXTRA_REQUEST_ID))) + try{ + dismiss() + }catch (ex : Exception){ + + } + + requireActivity().finish() + timer?.cancel() + } + } + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/ServiceRequestAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/ServiceRequestAdapter.kt new file mode 100644 index 0000000..57ae8bc --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/schedule/request/ServiceRequestAdapter.kt @@ -0,0 +1,60 @@ +package com.consultantapp.ui.dashboard.doctor.schedule.request + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Service +import com.consultantapp.databinding.RvRequestServiceBinding +import com.consultantapp.utils.hideShowView + + +class ServiceRequestAdapter(private val fragment: BottomServiceFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ServiceRequestAdapter.ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ServiceRequestAdapter.ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_request_service, parent, false)) + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvRequestServiceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clService.setOnClickListener { + fragment.serviceClick(items[bindingAdapterPosition]) + + val posSelected = bindingAdapterPosition + items.forEachIndexed { index, service -> + items[index].isSelected = index == posSelected + } + notifyDataSetChanged() + } + + + } + + fun bind(item: Service) = with(binding) { + + ivBorder.hideShowView(item.isSelected) + + try { + clService.setBackgroundColor(Color.parseColor(item.color_code)) + } catch (e: Exception) { + clService.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + } + + tvName.text = item.service_name ?: item.name + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/symptom/PandemicViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/symptom/PandemicViewModel.kt new file mode 100644 index 0000000..f8b68f9 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/symptom/PandemicViewModel.kt @@ -0,0 +1,123 @@ +package com.consultantapp.ui.dashboard.doctor.symptom + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.requests.UpdateSymptom +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class PandemicViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + + val symptom by lazy { SingleLiveEvent>() } + + val updateSymptom by lazy { SingleLiveEvent>() } + + val carePlanTier by lazy { SingleLiveEvent>() } + + val updateCarePlan by lazy { SingleLiveEvent>() } + + + fun symptom(hashMap: HashMap) { + symptom.value = Resource.loading() + + webService.symptom(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + symptom.value = Resource.success(response.body()?.data) + } else { + symptom.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + symptom.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateSymptom(updateSymptomModel: UpdateSymptom) { + updateSymptom.value = Resource.loading() + + webService.updateSymptom(updateSymptomModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateSymptom.value = Resource.success(response.body()?.data) + } else { + updateSymptom.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateSymptom.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun carePlanTier() { + carePlanTier.value = Resource.loading() + + webService.carePlanTier() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + carePlanTier.value = Resource.success(response.body()?.data) + } else { + carePlanTier.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + carePlanTier.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateCarePlan(updateSymptomModel: UpdateSymptom) { + updateCarePlan.value = Resource.loading() + + webService.carePlans(updateSymptomModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateCarePlan.value = Resource.success(response.body()?.data) + } else { + updateCarePlan.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateCarePlan.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/doctor/symptom/SymptomDetailFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/symptom/SymptomDetailFragment.kt new file mode 100644 index 0000000..d28907c --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/doctor/symptom/SymptomDetailFragment.kt @@ -0,0 +1,338 @@ +package com.consultantapp.ui.dashboard.doctor.symptom + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.GridLayoutManager +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.data.models.requests.UpdateSymptom +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentSymptomDetailsBinding +import com.consultantapp.ui.adapter.CheckItemAdapter +import com.consultantapp.ui.adapter.ImagesAdapter +import com.consultantapp.ui.dashboard.chat.UploadFileViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.PermissionUtils +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.dialogs.ProgressDialogImage +import dagger.android.support.DaggerFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import javax.inject.Inject + +@RuntimePermissions +class SymptomDetailFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSymptomDetailsBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var viewModel: PandemicViewModel + + private lateinit var viewModelUpload: UploadFileViewModel + + private val items = ArrayList() + + private lateinit var adapter: CheckItemAdapter + + private var symptomIds = "" + + private var imagesAdapter: ImagesAdapter? = null + + private var itemImages = ArrayList() + + private var updateSymptom: UpdateSymptom? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_symptom_details, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[PandemicViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + progressDialogImage = ProgressDialogImage(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.tvTitle.gone() + editTextScroll(binding.etDesc) + + binding.toolbar.title = getString(R.string.select_from_symptom) + binding.tvDone.visible() + binding.tvAdd.visible() + binding.tvAdd.text = getString(R.string.skip) + binding.etDesc.visible() + binding.tvDescTitle.visible() + binding.rvImages.visible() + + hitApi() + } + + + private fun setAdapter() { + binding.rvListing.layoutManager = GridLayoutManager(requireContext(), 3) + + adapter = CheckItemAdapter(this, true, items) + binding.rvListing.adapter = adapter + + imagesAdapter = ImagesAdapter(this, itemImages) + binding.rvImages.adapter = imagesAdapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + onBackClick() + } + + binding.tvAdd.setOnClickListener { + onBackClick() + } + + binding.tvDone.setOnClickListener { + symptomIds = "" + items.forEach { + if (it.isSelected) + symptomIds += it.id.toString() + "," + } + + when { + binding.etDesc.text.toString().trim().isEmpty() && symptomIds.isEmpty() && itemImages.isEmpty() -> { + binding.etDesc.showSnackBar(getString(R.string.tell_something_more)) + } + isConnectedToInternet(requireContext(), true) -> { + updateSymptom = UpdateSymptom() + if (itemImages.isEmpty()) { + updateSymptom?.request_id = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) + ?: "" + if (symptomIds.removePrefix(",").isNotEmpty()) + updateSymptom?.option_ids = symptomIds.removePrefix(",") + if (binding.etDesc.text.toString().trim().isNotEmpty()) + updateSymptom?.symptom_details = binding.etDesc.text.toString().trim() + viewModel.updateSymptom(updateSymptom ?: UpdateSymptom()) + } else { + updateSymptom?.images = ArrayList() + uploadFileOnServer(itemImages[0]) + } + } + } + + } + } + + /*Adapter item click*/ + fun clickItem() { + getStorageWithPermissionCheck() + } + + private fun onBackClick() { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["type"] = PandemicType.SYMPTOM_OPTIONS_ALL + viewModel.symptom(hashMap) + } + } + + private fun bindObservers() { + viewModel.symptom.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + items.clear() + items.addAll(it.data?.symptoms ?: emptyList()) + adapter.notifyDataSetChanged() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.updateSymptom.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + val intent = Intent() + intent.action = PushType.REQUEST_ACCEPTED + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + onBackClick() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelUpload.uploadFile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + val docImage = DocImage() + docImage.image = it.data?.image_name + docImage.type = it.data?.type + updateSymptom?.images?.add(docImage) + + if (updateSymptom?.images?.size ?: 0 < itemImages.size) { + uploadFileOnServer(itemImages[updateSymptom?.images?.size ?: 0]) + } else if (isConnectedToInternet(requireContext(), true)) { + updateSymptom?.request_id = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) + ?: "" + if (symptomIds.removePrefix(",").isNotEmpty()) + updateSymptom?.option_ids = symptomIds.removePrefix(",") + if (binding.etDesc.text.toString().trim().isNotEmpty()) + updateSymptom?.symptom_details = binding.etDesc.text.toString().trim() + + viewModel.updateSymptom(updateSymptom ?: UpdateSymptom()) + } + + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + } + + private fun uploadFileOnServer(docImage: DocImage?) { + val hashMap = java.util.HashMap() + hashMap["type"] = getRequestBody(docImage?.type) + + val body: RequestBody = docImage?.imageFile?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + docImage?.imageFile?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.IMAGE_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + val fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = fileToUpload + + itemImages.add(docImage) + imagesAdapter?.notifyDataSetChanged()*/ + } + AppRequestCode.DOC_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_DOCS) + ?: emptyList()) + + val fileToUpload = File(ContentUriUtils.getFilePath(requireContext(), docPaths[0])) + + val docImage = DocImage() + docImage.type = DocType.PDF + docImage.imageFile = fileToUpload + itemImages.add(docImage) + + imagesAdapter?.notifyDataSetChanged()*/ + + } + } + } + } + + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + askForOption(this, requireActivity(), binding.rvImages) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedDetailsFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedDetailsFragment.kt new file mode 100644 index 0000000..e9113ad --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedDetailsFragment.kt @@ -0,0 +1,177 @@ +package com.consultantapp.ui.dashboard.feeds + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentFeedDetailsBinding +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.android.material.appbar.AppBarLayout +import dagger.android.support.DaggerFragment +import javax.inject.Inject +import kotlin.math.abs + + +class FeedDetailsFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentFeedDetailsBinding + + private var rootView: View? = null + + private var details: Feed? = null + + private lateinit var viewModel: FeedViewModel + + private lateinit var progressDialog: ProgressDialog + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_feed_details, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + details = arguments?.getSerializable(EXTRA_REQUEST_ID) as Feed + setData() + + if (userRepository.isUserLoggedIn() && isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + binding.toolbar.title = "" + + when { + abs(verticalOffset) == appBarLayout.totalScrollRange -> { + // Collapsed + binding.toolbar.title = details?.title + binding.tvName.invisible() + } + verticalOffset == 0 -> { + // Expanded + binding.tvName.visible() + } + else -> { + // Somewhere in between + binding.tvName.visible() + } + } + }) + + binding.ivFavourite.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["favorite"] = if (details?.is_favorite == true) "0" else "1" + viewModel.addFavorite(details?.id ?: "", hashMap) + } + } + } + + private fun setData() { + binding.tvName.text = getDoctorName(details?.user_data) + binding.tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, details?.created_at) + + binding.toolbarLayout.isTitleEnabled = false + loadImage("tag",binding.ivImage, details?.image, R.drawable.image_placeholder) + binding.tvTitle.text = details?.title + binding.tvDec.text = details?.description + + /*if (details?.is_favorite == true) + binding.ivFavourite.setImageResource(R.drawable.ic_like_red) + else + binding.ivFavourite.setImageResource(R.drawable.ic_like_white)*/ + } + + private fun bindObservers() { + viewModel.viewFeeds.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + details = it.data?.feed + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + //binding.clLoader.visible() + } + } + }) + + viewModel.addFavorite.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + } + + + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + resultFragmentIntentNoPop(this, targetFragment ?: this, + AppRequestCode.ARTICLE_CHANGES, Intent()) + else + requireActivity().setResult(Activity.RESULT_OK) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + } + + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedViewModel.kt new file mode 100644 index 0000000..9f4ab1d --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedViewModel.kt @@ -0,0 +1,175 @@ +package com.consultantapp.ui.dashboard.feeds + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class FeedViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val getFeeds by lazy { SingleLiveEvent>() } + + val getFeedsComment by lazy { SingleLiveEvent>() } + + val viewFeeds by lazy { SingleLiveEvent>() } + + val addFavorite by lazy { SingleLiveEvent>() } + + val addLike by lazy { SingleLiveEvent>() } + + val addComment by lazy { SingleLiveEvent>() } + + + fun getFeeds(hashMap: HashMap) { + getFeeds.value = Resource.loading() + + webService.getFeeds(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getFeeds.value = Resource.success(response.body()?.data) + } else { + getFeeds.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getFeeds.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getFeedsComment(feed_id: String,hashMap: HashMap) { + getFeedsComment.value = Resource.loading() + + webService.getFeedsComment(feed_id,hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getFeedsComment.value = Resource.success(response.body()?.data) + } else { + getFeedsComment.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getFeedsComment.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun viewFeeds(feed_id: String) { + viewFeeds.value = Resource.loading() + + webService.viewFeeds(feed_id) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + viewFeeds.value = Resource.success(response.body()?.data) + } else { + viewFeeds.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + viewFeeds.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addFavorite(feed_id: String,hashMap: HashMap) { + addFavorite.value = Resource.loading() + + webService.addFavorite(feed_id,hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addFavorite.value = Resource.success(response.body()?.data) + } else { + addFavorite.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addFavorite.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun addLike(feed_id: String,hashMap: HashMap) { + addLike.value = Resource.loading() + + webService.addLike(feed_id,hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addLike.value = Resource.success(response.body()?.data) + } else { + addLike.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addLike.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addComment(feed_id: String,hashMap: HashMap) { + addComment.value = Resource.loading() + + webService.addComment(feed_id,hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addComment.value = Resource.success(response.body()?.data) + } else { + addComment.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addComment.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedsAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedsAdapter.kt new file mode 100644 index 0000000..1ec318b --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedsAdapter.kt @@ -0,0 +1,68 @@ +package com.consultantapp.ui.dashboard.feeds + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemArticleBinding +import com.consultantapp.utils.* + + +class FeedsAdapter(private val fragment: FeedsFragment, private val items: ArrayList) + : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_article, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemArticleBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.cvBlog.setOnClickListener { + val feedDetailsFragment = FeedDetailsFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_REQUEST_ID, items[adapterPosition]) + feedDetailsFragment.arguments = bundle + replaceFragment(fragment.requireActivity().supportFragmentManager, feedDetailsFragment, R.id.container) + } + } + + fun bind(item: Feed) = with(binding) { + tvName.text = item.title + tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, item.created_at) + loadImage("tag",ivImage, item.image, R.drawable.image_placeholder) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedsFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedsFragment.kt new file mode 100644 index 0000000..8a518af --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/feeds/FeedsFragment.kt @@ -0,0 +1,178 @@ +package com.consultantapp.ui.dashboard.feeds + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class FeedsFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: FeedViewModel + + private var items = ArrayList() + + private lateinit var adapter: FeedsAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var typeOfBlog = BlogType.BLOG + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + when (requireActivity().intent.getStringExtra(PAGE_TO_OPEN)) { + BlogType.BLOG -> { + typeOfBlog = BlogType.BLOG + binding.tvHeader.text = getString(R.string.latest_blogs) + } + BlogType.ARTICLE -> { + typeOfBlog = BlogType.ARTICLE + + binding.tvHeader.text = getString(R.string.latest_articles) + } + else -> { + typeOfBlog = BlogType.ARTICLE + binding.tvHeader.text = getString(R.string.latest_articles) + } + } + + viewModel = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + } + + private fun setAdapter() { + adapter = FeedsAdapter(this, items) + binding.rvListing.layoutManager = GridLayoutManager(requireContext(), 2) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["type"] = typeOfBlog + + viewModel.getFeeds(hashMap) + }else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getFeeds.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.feeds ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/BannerViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/BannerViewModel.kt new file mode 100644 index 0000000..31240ab --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/BannerViewModel.kt @@ -0,0 +1,217 @@ +package com.consultantapp.ui.dashboard.home + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class BannerViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val banners by lazy { SingleLiveEvent>() } + + val coupons by lazy { SingleLiveEvent>() } + + val packSub by lazy { SingleLiveEvent>() } + + val packDetail by lazy { SingleLiveEvent>() } + + val purchasePack by lazy { SingleLiveEvent>() } + + val subscriptions by lazy { SingleLiveEvent>() } + + val subscriptionDetail by lazy { SingleLiveEvent>() } + + val subscriptionPack by lazy { SingleLiveEvent>() } + + fun banners() { + banners.value = Resource.loading() + + webService.banners().enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + banners.value = Resource.success(response.body()?.data) + } else { + banners.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + banners.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun coupons(hashMap: HashMap) { + coupons.value = Resource.loading() + + webService.coupons(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + coupons.value = Resource.success(response.body()?.data) + } else { + coupons.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + coupons.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun packSub(hashMap: HashMap) { + packSub.value = Resource.loading() + + webService.packSub(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + packSub.value = Resource.success(response.body()?.data) + } else { + packSub.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + packSub.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun packDetail(hashMap: HashMap) { + packDetail.value = Resource.loading() + + webService.packDetail(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + packDetail.value = Resource.success(response.body()?.data) + } else { + packDetail.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + packDetail.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun purchasePack(hashMap: HashMap) { + purchasePack.value = Resource.loading() + + webService.purchasePack(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + purchasePack.value = Resource.success(response.body()?.data) + } else { + purchasePack.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + purchasePack.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun subscriptions(hashMap: HashMap) { + subscriptions.value = Resource.loading() + + webService.subscriptions(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + subscriptions.value = Resource.success(response.body()?.data) + } else { + subscriptions.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + subscriptions.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun subscriptionDetail(hashMap: HashMap) { + subscriptionDetail.value = Resource.loading() + + webService.subscriptionDetail(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + subscriptionDetail.value = Resource.success(response.body()?.data) + } else { + subscriptionDetail.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + subscriptionDetail.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun subscriptionPack(hashMap: HashMap) { + subscriptionPack.value = Resource.loading() + + webService.subscriptionPack(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + subscriptionPack.value = Resource.success(response.body()?.data) + } else { + subscriptionPack.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + subscriptionPack.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeFragment.kt new file mode 100644 index 0000000..2370d9b --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeFragment.kt @@ -0,0 +1,538 @@ +package com.consultantapp.ui.dashboard.home + +import android.annotation.SuppressLint +import android.app.AlertDialog +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appFeatures +import com.consultantapp.data.models.requests.ConsultTypeModel +import com.consultantapp.data.models.responses.Banner +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.models.responses.Review +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.HOME_CATEGORIES +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentHomeBinding +import com.consultantapp.ui.adapter.CommonFragmentPagerAdapter +import com.consultantapp.ui.classes.ClassesViewModel +import com.consultantapp.ui.dashboard.CategoriesAdapter +import com.consultantapp.ui.dashboard.doctor.detail.RatingAdapter +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.dashboard.doctor.schedule.request.BottomServiceFragment +import com.consultantapp.ui.dashboard.home.banner.BannerFragment +import com.consultantapp.ui.dashboard.home.items.ConsultTypeAdapter +import com.consultantapp.ui.dashboard.home.items.HealthToolsAdapter +import com.consultantapp.ui.dashboard.home.items.LatestBlogAdapter +import com.consultantapp.ui.dashboard.settings.contactlist.ContactViewModel +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CLASSES_PAGE +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.BlogType +import com.consultantapp.utils.ConsultType +import com.consultantapp.utils.PAGE_TO_OPEN +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.gone +import com.consultantapp.utils.hideShowView +import com.consultantapp.utils.isConnectedToInternet +import com.consultantapp.utils.pxFromDp +import com.consultantapp.utils.visible +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.tvNoData +import kotlinx.android.synthetic.main.item_no_data.view.tvNoDataDesc +import javax.inject.Inject + + +class HomeFragment/*(private val homeMainFragment: HomeMainFragment)*/ : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentHomeBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var viewModelBanner: BannerViewModel + + private lateinit var viewModelHome: HomeViewModel + private lateinit var viewModelContact: ContactViewModel + + private var items = ArrayList() + + private lateinit var adapter: CategoriesAdapter + + var homeData: CommonDataModel? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + + hitApi() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + viewModelBanner = ViewModelProvider(this, viewModelFactory)[BannerViewModel::class.java] + viewModelHome = ViewModelProvider(this, viewModelFactory)[HomeViewModel::class.java] + viewModelContact = ViewModelProvider(this, viewModelFactory)[ContactViewModel::class.java] + binding.clLoader.setBackgroundResource(R.color.colorWhite) + binding.clLoader.visible() + + binding.clNoCategory.tvNoData.text = getString(R.string.no_category) + binding.clNoCategory.tvNoDataDesc.text = getString(R.string.no_category_desc) + + if (arguments?.getBoolean(CLASSES_PAGE) == true) + binding.tvPopular.text = getString(R.string.classes) + else + binding.tvPopular.text = getString(R.string.meet) + + /*Set banner height*/ + val widthScreen = resources.displayMetrics.widthPixels - pxFromDp(requireContext(), 32f) + val heightOfImage = (widthScreen * 0.6).toInt() + + binding.viewPagerBanner.layoutParams.height = heightOfImage + + //throw RuntimeException("Test Crash") // Force a crash + + // binding.ivEmergency.hideShowView(BuildConfig.FLAVOR == "nurseLynx") + + } + + private fun setAdapter() { + /* val layoutManager = GridLayoutManager(activity, 6) + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (items.size % 2 != 0) { + when (position) { + items.size - 3, items.size - 2, items.size - 1 -> + 2 + else -> 3 + } + } else 3 + } + } + binding.rvCategory.layoutManager = layoutManager*/ + + adapter = CategoriesAdapter(this, items) + binding.rvCategory.adapter = adapter + + /*Only if Health tools needed*/ + if (appFeatures.needHealthTools) { + binding.tvHealthTools.visible() + binding.rvHealthTools.visible() + + val itemsHealth = arrayListOf( + getString(R.string.health_tool_1), getString(R.string.health_tool_2), + getString(R.string.health_tool_3), getString(R.string.health_tool_4) + ) + val adapterHealth = HealthToolsAdapter(this, itemsHealth) + binding.rvHealthTools.adapter = adapterHealth + } + } + + private fun setConsultTypes(needTip: Boolean) { + /*Only if Consult option needed*/ + if (appFeatures.homeConsultIcons) { + binding.rvConsult.visible() + val itemsConsult = ArrayList() + when (BuildConfig.FLAVOR) { + "consult", "edu", "marketplace", "healthcare", "meetMd" -> { + itemsConsult.add( + ConsultTypeModel( + getString(R.string.home_care_appointment), + R.drawable.ic_consult_home, ConsultType.HOME_VISIT + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.consult_online), + R.drawable.ic_consult_online, ConsultType.CONSULT_ONLINE + ) + ) + if (!appFeatures.needClasses) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.online_programs), + R.drawable.ic_consult_online_programs, ConsultType.ONLINE_PROGRAMS + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.free_expert_advice), + R.drawable.ic_consult_free_advice, ConsultType.FREE_EXPERT + ) + ) + } + "heal" -> { + itemsConsult.add( + ConsultTypeModel( + getString(R.string.home_care_appointment), + R.drawable.ic_consult_home, ConsultType.HOME_VISIT + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.consult_online), + R.drawable.ic_consult_online, ConsultType.CONSULT_ONLINE + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.online_programs), + R.drawable.ic_consult_online_programs, ConsultType.ONLINE_PROGRAMS + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.emergency_consultation), + R.drawable.ic_consult_emergency, ConsultType.EMERGENCY_CONSULTATION + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.free_expert_advice), + R.drawable.ic_consult_free_advice, ConsultType.FREE_EXPERT + ) + ) + } + "homeDoctor" -> { + itemsConsult.add( + ConsultTypeModel( + getString(R.string.consult_online), + R.drawable.ic_consult_online, ConsultType.CONSULT_ONLINE + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.home_care_appointment), + R.drawable.ic_consult_home, ConsultType.HOME_VISIT + ) + ) + itemsConsult.add( + ConsultTypeModel( + getString(R.string.clinic_appointment), + R.drawable.ic_consult_clinic, ConsultType.CLINIC_VISIT + ) + ) + } + } + + if (needTip) { + itemsConsult.add( + ConsultTypeModel( + getString(R.string.tip_of_the_day), + R.drawable.ic_consult_tip, ConsultType.TIP_OF_DAY + ) + ) + } + + val adapterConsult = ConsultTypeAdapter(this, itemsConsult) + binding.rvConsult.adapter = adapterConsult + } + } + + private fun listeners() { + binding.swipeRefresh.setOnRefreshListener { + hitApi() + } + + binding.tvMoreArticles.setOnClickListener { + startActivity( + Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, BlogType.ARTICLE) + ) + } + + binding.tvMoreBlogs.setOnClickListener { + startActivity( + Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, BlogType.BLOG) + ) + } + + binding.tvMoreCategories.setOnClickListener { + startActivity( + Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CATEGORIES) + .putExtra(CLASSES_PAGE, arguments?.getBoolean(CLASSES_PAGE)) + ) + } + + binding.ivEmergency.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) { + androidx.appcompat.app.AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.notify)) + .setMessage(getString(R.string.notifying_to_contacts)) + .setPositiveButton(getString(R.string.notify)) { dialog, which -> + viewModelContact.sendMessage() + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + /*Banner api*/ + viewModelBanner.banners() + /*Home*/ + viewModelHome.home() + + val hashMap = HashMap() + if (BuildConfig.FLAVOR == "taradoc") { + hashMap[PER_PAGE] = "50" + } else { + hashMap[PER_PAGE] = HOME_CATEGORIES.toString() + } + + viewModel.categories(hashMap) + + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.categories.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + items.clear() + items.addAll(it.data?.classes_category ?: emptyList()) + adapter.notifyDataSetChanged() + + binding.tvMoreCategories.hideShowView(items.size == HOME_CATEGORIES) + binding.clNoCategory.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + /* if (!binding.swipeRefresh.isRefreshing) + binding.clLoader.visible()*/ + } + } + }) + + viewModelHome.home.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + homeData = it.data + /*Check Notification count*/ + // homeMainFragment.checkNotificationCount(homeData?.notification_count) + + if (appFeatures.needArticles) { + val itemsArticle = ArrayList() + itemsArticle.addAll(homeData?.top_articles ?: emptyList()) + val adapterArticle = LatestBlogAdapter(this, itemsArticle) + binding.rvArticle.adapter = adapterArticle + + binding.tvArticles.visible() + binding.tvMoreArticles.hideShowView(itemsArticle.size >= 4) + binding.rvArticle.hideShowView(itemsArticle.isNotEmpty()) + + //binding.clNoArticle.ivNoData.invisible() + binding.clNoArticle.tvNoData.text = getString(R.string.no_article) + binding.clNoArticle.tvNoDataDesc.text = getString(R.string.no_article_desc) + binding.clNoArticle.hideShowView(itemsArticle.isEmpty()) + } + + binding.tvLatestBlog.hideShowView(appFeatures.needBlogs) + if (appFeatures.needBlogs) { + val itemsBlogs = ArrayList() + itemsBlogs.addAll(homeData?.top_blogs ?: emptyList()) + val adapterBlogs = LatestBlogAdapter(this, itemsBlogs) + binding.rvLatestBlog.adapter = adapterBlogs + + binding.tvMoreBlogs.hideShowView(itemsBlogs.size >= 4) + binding.rvLatestBlog.hideShowView(itemsBlogs.isNotEmpty()) + + binding.clNoBlog.tvNoData.text = getString(R.string.no_blog) + binding.clNoBlog.tvNoDataDesc.text = getString(R.string.no_blog_desc) + binding.clNoBlog.hideShowView(itemsBlogs.isEmpty()) + } + + if (appFeatures.needTestimonials) { + val itemsTestimonials = ArrayList() + itemsTestimonials.addAll(homeData?.testimonials ?: emptyList()) + val ratingAdapter = RatingAdapter(true, itemsTestimonials) + binding.rvTestimonials.adapter = ratingAdapter + + binding.tvTestimonials.hideShowView(itemsTestimonials.isNotEmpty()) + binding.rvTestimonials.hideShowView(itemsTestimonials.isNotEmpty()) + } + + /*Consult Types*/ + setConsultTypes(homeData?.tips?.isNotEmpty() == true) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModelBanner.banners.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + val itemsBanner = ArrayList() + itemsBanner.addAll(it.data?.banners ?: emptyList()) + + val adapter = CommonFragmentPagerAdapter(childFragmentManager) + itemsBanner.forEach { + adapter.addTab("", BannerFragment(this, it)) + } + binding.viewPagerBanner.adapter = adapter + binding.pageIndicatorView.setViewPager(binding.viewPagerBanner) + + binding.viewPagerBanner.hideShowView(itemsBanner.isNotEmpty()) + binding.pageIndicatorView.hideShowView(itemsBanner.size > 1) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + + fun clickItem(item: Categories?) { + when { + item?.is_subcategory == true -> { + startActivity( + Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.SUB_CATEGORY) + .putExtra(CLASSES_PAGE, arguments?.getBoolean(CLASSES_PAGE)) + .putExtra(CATEGORY_PARENT_ID, item) + ) + } + arguments?.getBoolean(CLASSES_PAGE) == true -> { + if (userRepository.isUserLoggedIn()) { + startActivity( + Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES) + .putExtra(CATEGORY_PARENT_ID, item) + ) + } else { + val fragment = WelcomeFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + } + BuildConfig.FLAVOR == "nurseLynx" -> { + val fragment = BottomServiceFragment(item) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + else -> { + startActivity( + Intent(requireContext(), DoctorListActivity::class.java) + .putExtra(CATEGORY_PARENT_ID, item) + ) + } + } + } + + + fun showInformationDialog(item: Categories?) { + AlertDialog.Builder(context) + .setTitle(item?.name) + .setMessage(item?.description) + .setPositiveButton(R.string.ok) { dialog, which -> + dialog.dismiss() + } + .setCancelable(true) + .show() + } + + override fun onResume() { + super.onResume() + unregisterReceiver() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + val intentFilter = IntentFilter() + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + + } + + private fun unregisterReceiver() { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + NetworkIssueFragment.NETWORK_ISSUE -> + hitApi() + PushType.REQUEST_ACCEPTED, PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.REQUEST_FAILED, + PushType.CANCELED_REQUEST, PushType.RESCHEDULED_REQUEST, PushType.UPCOMING_APPOINTMENT, + PushType.PRESCRIPTION_ADDED, PushType.REQUEST_EXTRA_PAYMENT, PushType.CARE_PLAN_DONE, PushType.START -> { + if (isConnectedToInternet(requireContext(), false)) + viewModelHome.home() + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeMainFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeMainFragment.kt new file mode 100644 index 0000000..2b1f8dd --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeMainFragment.kt @@ -0,0 +1,220 @@ +package com.consultantapp.ui.dashboard.home + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appFeatures +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentHomeMainBinding +import com.consultantapp.ui.adapter.CommonFragmentPagerAdapter +import com.consultantapp.ui.dashboard.home.addfamily.BottomFamilyFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.DrawerActivity.Companion.NOTIFICATION +import com.consultantapp.ui.drawermenu.DrawerActivity.Companion.WALLET +import com.consultantapp.ui.drawermenu.wallet.WalletViewModel +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class HomeMainFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentHomeMainBinding + + private var rootView: View? = null + + private lateinit var adapter: CommonFragmentPagerAdapter + + private lateinit var viewModel: WalletViewModel + + private var notification_count: Int? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_home_main, container, false) + rootView = binding.root + + initialise() + setTabs() + listeners() + bindObservers() + + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + } + + private fun listeners() { + binding.tvWallet.setOnClickListener { + if (userRepository.isUserLoggedIn()) { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, WALLET)) + } + } + + binding.ivNotification.setOnClickListener { + binding.tvUnreadCount.gone() + notification_count = 0 + if (userRepository.isUserLoggedIn()) { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, NOTIFICATION)) + } + } + + binding.tvAddPatients.setOnClickListener { + val fragment = BottomFamilyFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + } + + private fun setTabs() { + adapter = CommonFragmentPagerAdapter(requireActivity().supportFragmentManager) + + /*Check if Tabs Needed or not*/ + val titles = if (appFeatures.needClasses) + arrayOf(getString(R.string.consult), getString(R.string.classes)) + else + arrayOf(getString(R.string.consult)) + + binding.tabLayout.hideShowView(appFeatures.needClasses) + + var fragment: HomeFragment + titles.forEachIndexed { index, s -> + + val bundle = Bundle() + when (index) { + 0 -> bundle.putBoolean(SubCategoryFragment.CLASSES_PAGE, false) + 1 -> bundle.putBoolean(SubCategoryFragment.CLASSES_PAGE, true) + else -> bundle.putBoolean(SubCategoryFragment.CLASSES_PAGE, false) + } + + fragment = HomeFragment() + fragment.arguments = bundle + adapter.addTab(titles[index], fragment) + } + + binding.viewPager.adapter = adapter + + binding.tabLayout.setupWithViewPager(binding.viewPager) + + } + + private fun bindObservers() { + + viewModel.wallet.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + // binding.tvWallet.text = getCurrency(it.data?.balance) + val balance = it.data?.balance ?: "0" + binding.tvWallet.text = getCurrency(balance) + + } + Status.ERROR -> { + //ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + + } + } + }) + } + + fun checkNotificationCount(count: Int?) { + if (userRepository.isUserLoggedIn() && BuildConfig.FLAVOR == "homeDoctor") { + notification_count = count + requireActivity().runOnUiThread { + binding.tvUnreadCount.hideShowView(notification_count != null && notification_count ?: 0 > 0) + binding.tvUnreadCount.text = getCountFormat(1, notification_count) + } + }else binding.tvUnreadCount.gone() + } + + override fun onResume() { + super.onResume() + if (userRepository.isUserLoggedIn()) + viewModel.wallet(HashMap()) + + binding.tvWallet.hideShowView(userRepository.isUserLoggedIn()) + binding.tvAddPatients.hideShowView(userRepository.isUserLoggedIn() && appFeatures.needHomePatients) + binding.ivNotification.hideShowView(userRepository.isUserLoggedIn() && BuildConfig.FLAVOR == "homeDoctor") + + unregisterReceiver() + registerReceiver() + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_ACCEPTED) + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(PushType.REQUEST_FAILED) + intentFilter.addAction(PushType.CANCELED_REQUEST) + intentFilter.addAction(PushType.RESCHEDULED_REQUEST) + intentFilter.addAction(PushType.UPCOMING_APPOINTMENT) + intentFilter.addAction(PushType.PRESCRIPTION_ADDED) + intentFilter.addAction(PushType.REQUEST_EXTRA_PAYMENT) + intentFilter.addAction(PushType.CARE_PLAN_DONE) + intentFilter.addAction(PushType.START) + intentFilter.addAction(PushType.BOOKING_RESERVED) + intentFilter.addAction(PushType.BALANCE_ADDED) + intentFilter.addAction(PushType.BALANCE_FAILED) + intentFilter.addAction(PushType.AMOUNT_RECEIVED) + intentFilter.addAction(PushType.BALANCE_DEDUCTED) + intentFilter.addAction(PushType.BALANCE_REFUNDED) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + + } + + private fun unregisterReceiver() { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_ACCEPTED, PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.REQUEST_FAILED, + PushType.CANCELED_REQUEST, PushType.RESCHEDULED_REQUEST, PushType.UPCOMING_APPOINTMENT, + PushType.PRESCRIPTION_ADDED, PushType.REQUEST_EXTRA_PAYMENT, PushType.CARE_PLAN_DONE, PushType.START, + PushType.BOOKING_RESERVED, PushType.BALANCE_ADDED, PushType.BALANCE_FAILED, + PushType.AMOUNT_RECEIVED, PushType.BALANCE_REFUNDED, PushType.BALANCE_DEDUCTED -> { + checkNotificationCount((notification_count ?: 0) + 1) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeViewModel.kt new file mode 100644 index 0000000..1de2799 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/HomeViewModel.kt @@ -0,0 +1,43 @@ +package com.consultantapp.ui.dashboard.home + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class HomeViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val home by lazy { SingleLiveEvent>() } + + + fun home() { + home.value = Resource.loading() + + webService.home() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + home.value = Resource.success(response.body()?.data) + } else { + home.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + home.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/addfamily/AddFamilyFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/addfamily/AddFamilyFragment.kt new file mode 100644 index 0000000..b3a76ef --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/addfamily/AddFamilyFragment.kt @@ -0,0 +1,408 @@ +package com.consultantapp.ui.dashboard.home.addfamily + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.models.responses.appdetails.Insurance +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentAddFamilyBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.adapter.CheckItemAdapter +import com.consultantapp.ui.dashboard.chat.UploadFileViewModel +import com.consultantapp.ui.loginSignUp.insurance.InsuranceAdapter +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.PermissionUtils +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.dialogs.ProgressDialogImage +import dagger.android.support.DaggerFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import javax.inject.Inject + +@RuntimePermissions +class AddFamilyFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentAddFamilyBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelUpload: UploadFileViewModel + + private var relation = "" + + private var chronic_diseases = "" + + private var fileToUpload: File? = null + + private lateinit var adapterRelation: CheckItemAdapter + + private var itemsRelation = ArrayList() + + private val itemsChronic = ArrayList() + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_add_family, container, false) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + } + return rootView + } + + private fun setAdapter() { + val familyType = requireActivity().intent.getStringExtra(EXTRA_NAME) + ?: BottomFamilyFragment.Companion.UserFamilyType.ELDER + val listHomeCare = if (familyType == BottomFamilyFragment.Companion.UserFamilyType.ELDER) + resources.getStringArray(R.array.relation) + else + resources.getStringArray(R.array.relationChildren) + + itemsRelation.clear() + listHomeCare.forEach { + val item = Filter() + item.option_name = it + itemsRelation.add(item) + } + + adapterRelation = CheckItemAdapter(this, false, itemsRelation) + binding.rvRelation.adapter = adapterRelation + + + /*Chronic*/ + val list = resources.getStringArray(R.array.choose_chronic_disease) + var insurance: Insurance + list.forEach { + insurance = Insurance() + insurance.name = it + + itemsChronic.add(insurance) + } + + val adapter = InsuranceAdapter(itemsChronic) + binding.rvChronic.adapter = adapter + } + + + private fun initialise() { + binding.ccpCountryCode.setCountryForNameCode(appClientDetails.country_name_code ?: "IN") + + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + progressDialogImage = ProgressDialogImage(requireActivity()) + + binding.rgQue1.tvQue.text = getString(R.string.do_you_have_any_medical_allergies) + binding.rgQue2.tvQue.text = getString(R.string.any_chronic_diseases) + binding.rgQue3.tvQue.text = getString(R.string.any_previous_surgeries) + binding.rgQue4.tvQue.text = getString(R.string.are_you_taking_medication) + + editTextScroll(binding.etDescription) + editTextScroll(binding.etChronicDescription) + editTextScroll(binding.etQue3Description) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.rgQue1.rgQue.setOnCheckedChangeListener { radioGroup, i -> + binding.ilQue1Desc.hideShowView(i == R.id.rbYes) + } + + binding.rgQue2.rgQue.setOnCheckedChangeListener { radioGroup, i -> + binding.tvChronic.hideShowView(i == R.id.rbYes) + binding.rvChronic.hideShowView(i == R.id.rbYes) + binding.ilQue2Desc.hideShowView(i == R.id.rbYes) + } + + binding.rgQue3.rgQue.setOnCheckedChangeListener { radioGroup, i -> + binding.ilQue3Desc.hideShowView(i == R.id.rbYes) + } + + + binding.rgQue4.rgQue.setOnCheckedChangeListener { radioGroup, i -> + binding.ilQue4Medicine.hideShowView(i == R.id.rbYes) + } + + binding.tvContinue.setOnClickListener { + binding.tvContinue.hideKeyboard() + checkValidation() + } + + binding.ivPic.setOnClickListener { + getStorageWithPermissionCheck() + } + } + + private fun checkValidation() { + relation = "" + itemsRelation.forEachIndexed { index, filterOption -> + if (filterOption.isSelected) { + relation = if (index == itemsRelation.size - 1) + binding.etRelation.text.toString().trim() + else + filterOption.option_name ?: "" + } + } + + chronic_diseases = "" + itemsChronic.forEachIndexed { index, filterOption -> + if (filterOption.isSelected) { + chronic_diseases += "${filterOption.name}, " + } + } + + when { + binding.etName.text.toString().trim().isEmpty() -> { + binding.etName.showSnackBar(getString(R.string.enter_name)) + } + binding.etAge.text.toString().trim().isEmpty() || binding.etAge.text.toString().trim().toInt() < 1 -> { + binding.etAge.showSnackBar(getString(R.string.enter_age)) + } + /* binding.etEmail.text.toString().trim().isEmpty() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + !Patterns.EMAIL_ADDRESS.matcher(binding.etEmail.text.toString().trim()).matches() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + }*/ + (binding.etMobileNumber.text.toString().isNotEmpty() && binding.etMobileNumber.text.toString().length < 6) -> { + binding.etMobileNumber.showSnackBar(getString(R.string.enter_correct_phone_number)) + } + binding.rgQue1.rgQue.checkedRadioButtonId == R.id.rbYes && binding.etDescription.text.toString().trim().isEmpty() -> { + binding.etDescription.showSnackBar(getString(R.string.do_you_have_any_medical_allergies)) + } + binding.rgQue2.rgQue.checkedRadioButtonId == R.id.rbYes && chronic_diseases.isEmpty() + && binding.etChronicDescription.text.toString().trim().isEmpty() -> { + binding.etDescription.showSnackBar(getString(R.string.any_chronic_diseases)) + } + binding.rgQue3.rgQue.checkedRadioButtonId == R.id.rbYes && binding.etQue3Description.text.toString().trim().isEmpty() -> { + binding.etDescription.showSnackBar(getString(R.string.any_previous_surgeries)) + } + binding.rgQue4.rgQue.checkedRadioButtonId == R.id.rbYes && binding.etMedicineName.text.toString().trim().isEmpty() -> { + binding.etDescription.showSnackBar(getString(R.string.are_you_taking_medication)) + } + relation.isEmpty() -> { + binding.etRelation.showSnackBar(getString(R.string.relation)) + } + + isConnectedToInternet(requireContext(), true) -> { + if (fileToUpload != null && fileToUpload?.exists() == true) { + uploadFileOnServer(fileToUpload) + } else { + hitAddFamily(null) + } + } + } + } + + private fun uploadFileOnServer(fileToUpload: File?) { + val hashMap = HashMap() + + hashMap["type"] = getRequestBody(DocType.IMAGE) + + val body: RequestBody = fileToUpload?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + fileToUpload?.name] = body + + viewModelUpload.uploadFile(hashMap) + + } + + private fun hitAddFamily(image: String?) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["first_name"] = binding.etName.text.toString().trim() + hashMap["age"] = binding.etAge.text.toString().trim() +// hashMap["email"] = binding.etEmail.text.toString() + if (binding.etMobileNumber.text.toString().isNotEmpty()) { + hashMap["country_code"] = binding.ccpCountryCode.selectedCountryCodeWithPlus + hashMap["phone"] = binding.etMobileNumber.text.toString() + } + hashMap["patient_type"] = requireActivity().intent.getStringExtra(EXTRA_NAME) ?: "" + hashMap["relation"] = relation + + /*For heal*/ + hashMap["optionals"] = true + + if (binding.rgQue1.rgQue.checkedRadioButtonId == R.id.rbYes) + hashMap["medical_allergies"] = binding.etDescription.text.toString().trim() + if (binding.rgQue2.rgQue.checkedRadioButtonId == R.id.rbYes) { + if (chronic_diseases.isNotEmpty()) + hashMap["chronic_diseases"] = chronic_diseases.removeSuffix(", ") + if (binding.etChronicDescription.text.toString().trim().isNotEmpty()) + hashMap["chronic_diseases_desc"] = binding.etChronicDescription.text.toString().trim() + } + if (binding.rgQue3.rgQue.checkedRadioButtonId == R.id.rbYes) + hashMap["previous_surgeries"] = binding.etQue3Description.text.toString().trim() + if (binding.rgQue4.rgQue.checkedRadioButtonId == R.id.rbYes) + hashMap["previous_medication"] = binding.etMedicineName.text.toString().trim() + + if (image != null) + hashMap["image"] = image + + viewModel.addFamily(hashMap) + } + } + + + private fun bindObservers() { + viewModel.addFamily.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + val userData = userRepository.getUser() + if (userData?.family_members.isNullOrEmpty()) + userData?.family_members = ArrayList() + + userData?.family_members?.add(it.data?.family ?: UserData()) + + prefsManager.save(USER_DATA, userData) + + + val fragment = InsuranceFragment() + val bundle = Bundle() + bundle.putBoolean(EXTRA_FAMILY, true) + bundle.putSerializable(USER_DATA, it.data?.family) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + + /* val fragment = SuccessFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag)*/ + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelUpload.uploadFile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + hitAddFamily(it.data?.image_name ?: "") + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + } + + fun itemRelationClick(pos: Int) { + binding.ilRelation.hideShowView(pos == itemsRelation.size - 1) + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + + if (requestCode == AppRequestCode.IMAGE_PICKER) { + /*val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(fileToUpload).into(binding.ivPic) +*/ + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + selectImages(this, requireActivity()) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + companion object { + const val EXTRA_FAMILY = "EXTRA_FAMILY" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/addfamily/BottomFamilyFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/addfamily/BottomFamilyFragment.kt new file mode 100644 index 0000000..d9933e5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/addfamily/BottomFamilyFragment.kt @@ -0,0 +1,99 @@ +package com.consultantapp.ui.dashboard.home.addfamily + +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.BottomFamilyBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.EXTRA_NAME +import com.consultantapp.utils.PAGE_TO_OPEN +import com.consultantapp.utils.PrefsManager +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomFamilyFragment : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomFamilyBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_family, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + + + } + + private fun listeners() { + binding.tvElderly.setOnClickListener { + addFamily(UserFamilyType.ELDER) + dialog?.dismiss() + } + + binding.ivElderly.setOnClickListener { + addFamily(UserFamilyType.ELDER) + dialog?.dismiss() + } + + binding.tvChildren.setOnClickListener { + addFamily(UserFamilyType.CHILDREN) + dialog?.dismiss() + } + + binding.ivChildren.setOnClickListener { + addFamily(UserFamilyType.CHILDREN) + dialog?.dismiss() + } + + } + + private fun addFamily(value: String) { + startActivity(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_FAMILY) + .putExtra(EXTRA_NAME, value)) + } + + companion object { + object UserFamilyType { + const val ELDER = "Elder" + const val CHILDREN = "Children" + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/bank/BankInfoFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/bank/BankInfoFragment.kt new file mode 100644 index 0000000..cc2b96e --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/bank/BankInfoFragment.kt @@ -0,0 +1,147 @@ +package com.consultantapp.ui.dashboard.home.bank + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Bank +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentBankInfoBinding +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.gone +import com.consultantapp.utils.showSnackBar +import com.consultantapp.utils.visible +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class BankInfoFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + + private lateinit var binding: FragmentBankInfoBinding + + private var rootView: View? = null + + + private lateinit var viewModel: BankViewModel + + private lateinit var progressDialog: ProgressDialog + + private var bank: Bank? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bank_info, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + viewModel = ViewModelProvider(this, viewModelFactory)[BankViewModel::class.java] + viewModel.bankAccounts(HashMap()) + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + + binding.btnAddBank.setOnClickListener { + + when { + binding.etAccountName.text.toString().trim().isEmpty() -> { + binding.etAccountName.showSnackBar(getString(R.string.name)) + } + binding.etBankName.text.toString().trim().isEmpty() -> { + binding.etBankName.showSnackBar(getString(R.string.bank_name)) + } + binding.etAccountNumber.text.toString().trim().isEmpty() -> { + binding.etAccountNumber.showSnackBar(getString(R.string.iban)) + } + else -> { + + val hashMap = HashMap() + + if (bank != null) + hashMap["bank_id"] = bank?.id ?: "" + + hashMap["account_number"] = binding.etAccountNumber.text.toString() + hashMap["account_holder_name"] = binding.etAccountName.text.toString() + hashMap["bank_name"] = binding.etBankName.text.toString() + + viewModel.addBank(hashMap) + + } + } + + } + } + + private fun bindObservers() { + + viewModel.bankAccounts.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + if (!it.data?.bank_accounts.isNullOrEmpty()) { + bank = it.data?.bank_accounts?.get(0) + + binding.etAccountNumber.setText(bank?.account_number ?: "") + binding.etAccountName.setText(bank?.name ?: "") + binding.etBankName.setText(bank?.bank_name ?: "") + } + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.addBank.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + viewModel.bankAccounts(HashMap()) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/bank/BankViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/bank/BankViewModel.kt new file mode 100644 index 0000000..6ab3652 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/bank/BankViewModel.kt @@ -0,0 +1,74 @@ +package com.consultantapp.ui.dashboard.home.bank + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class BankViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val addBank by lazy { SingleLiveEvent>() } + + val bankAccounts by lazy { SingleLiveEvent>() } + + val payout by lazy { SingleLiveEvent>() } + + fun addBank(hashMap: HashMap) { + addBank.value = Resource.loading() + + webService.addBank(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addBank.value = Resource.success(response.body()?.data) + } else { + addBank.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addBank.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun bankAccounts(hashMap: HashMap) { + bankAccounts.value = Resource.loading() + + webService.bankAccounts(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + bankAccounts.value = Resource.success(response.body()?.data) + } else { + bankAccounts.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + bankAccounts.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/banner/BannerFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/banner/BannerFragment.kt new file mode 100644 index 0000000..4ce3065 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/banner/BannerFragment.kt @@ -0,0 +1,116 @@ +package com.consultantapp.ui.dashboard.home.banner + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Banner +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentBannerBinding +import com.consultantapp.ui.classes.ClassesDetailFragment.Companion.CLASS_ID +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity +import com.consultantapp.ui.dashboard.doctor.detail.DoctorDetailActivity.Companion.DOCTOR_ID +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.dashboard.home.HomeFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.PAGE_TO_OPEN +import com.consultantapp.utils.getHtmlText +import com.consultantapp.utils.loadImage +import com.consultantapp.utils.visible +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class BannerFragment(private val fragment: Fragment?, private val banner: Banner) : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentBannerBinding + + private var rootView: View? = null + + + override fun onCreateView(inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_banner, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + private fun initialise() { + if (fragment is HomeFragment) { + binding.clBanner.setBackgroundResource(0) + loadImage("tag",binding.ivImage, banner.image_mobile, R.drawable.drawable_alternate_button) + + if(BuildConfig.FLAVOR != "taradoc") + binding.ivImage.setOnClickListener { + when (banner.banner_type) { + BannerType.SERVICE_PROVIDER -> { + startActivity(Intent(binding.root.context, DoctorDetailActivity::class.java) + .putExtra(DOCTOR_ID, banner.sp_id)) + } + BannerType.CATEGORY -> { + if (banner.category?.is_subcategory == true) { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.SUB_CATEGORY) + .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, banner.category)) + } else { + startActivity(Intent(requireContext(), DoctorListActivity::class.java) + .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, banner.category)) + } + } + BannerType.CLASS_ -> { + if (userRepository.getUser() == null) { + val fragment = WelcomeFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } else { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES_DETAILS) + .putExtra(CLASS_ID, banner.class_id)) + } + } + } + } + } else { + binding.clBanner.setBackgroundResource(R.drawable.drawable_theme_trans) + binding.tvCode.visible() + binding.tvText.visible() + binding.tvUsers.visible() + + val discount = if (banner.discount_type == "percentage") + "${banner.discount_value}%" + else + banner.discount_value + + val service = when { + banner.service != null -> banner.service?.name + banner.category != null -> banner.category?.name + else -> "" + } + + binding.tvText.text = getHtmlText(getString(R.string.code_text, discount, + service, banner.end_date)) + binding.tvCode.text = getHtmlText(getString(R.string.use_code_s, banner.coupon_code)) + binding.tvUsers.text = getHtmlText(getString(R.string.s_user_remaining, banner.limit.toString())) + } + } +} + +object BannerType { + const val SERVICE_PROVIDER = "service_provider" + const val CATEGORY = "category" + const val CLASS_ = "class" +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/bmichecker/BmiCheckerFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/bmichecker/BmiCheckerFragment.kt new file mode 100644 index 0000000..e458779 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/bmichecker/BmiCheckerFragment.kt @@ -0,0 +1,175 @@ +package com.consultantapp.ui.dashboard.home.healthtool.bmichecker + +import android.graphics.Color +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentBmiCheckerBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.hideKeyboard +import com.consultantapp.utils.showSnackBar +import com.ekn.gruzer.gaugelibrary.Range +import dagger.android.support.DaggerFragment +import java.text.DecimalFormat +import javax.inject.Inject + +class BmiCheckerFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentBmiCheckerBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private val decimalFormat = DecimalFormat("0.00") + + private var selectedGender = "" + + private lateinit var viewModel: LoginViewModel + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bmi_checker, container, false) + rootView = binding.root + + initialise() + listeners() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + selectedGender = getString(R.string.male) + setSpinnerGender() + setGauge() + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivCalculateBmi.setOnClickListener { + + binding.ivCalculateBmi.hideKeyboard() + val weight = binding.etWeight.text.toString().trim() + val height = binding.etHeight.text.toString().trim() + if (weight.isEmpty() || weight.toInt() <= 0) { + binding.etWeight.showSnackBar(getString(R.string.error_empty_weight)) + return@setOnClickListener + } else if (height.isEmpty() || height.toInt() <= 0) { + binding.etHeight.showSnackBar(getString(R.string.height_empty_validation)) + return@setOnClickListener + } + val bmi: Double = calculateBmi(weight.toDouble(), height.toDouble()) ?: 0.0 + binding.tvBmi.text = decimalFormat.format(bmi) + binding.halfGauge.value = decimalFormat.format(bmi).toDouble() + + if (bmi > 0 && bmi < 18.5) { + binding.tvBmiStatus.text = getString(R.string.underweight) + binding.tvRange.text = getString(R.string.range0to18) + binding.tvBmiStatus.setTextColor(Color.parseColor("#FF52C1F6")) + setGaugeValue(bmi, 10.0, 18.4) + + } else if (bmi >= 18.5 && bmi < 25) { + binding.tvBmiStatus.text = getString(R.string.normal) + binding.tvRange.text = getString(R.string.range18to25) + binding.tvBmiStatus.setTextColor(Color.parseColor("#FF48D3B3")) + setGaugeValue(bmi, 20.0, 24.9) + + + } else if (bmi >= 25) { + binding.tvBmiStatus.text = getString(R.string.overweight) + binding.tvRange.text = getString(R.string.range_above25) + binding.tvBmiStatus.setTextColor(Color.parseColor("#FFFD5E5E")) + // setGaugeValue(bmi,3.0,40.0) + val perc = (100 * bmi) / 40.0 + binding.halfGauge.value = perc / 3 + } + } + } + + private fun setGauge() { + val range = Range() + range.color = Color.parseColor("#FF52C1F6") + range.from = 0.0 + range.to = 10.0 + + val range2 = Range() + range2.color = Color.parseColor("#FF48D3B3") + range2.from = 10.0 + range2.to = 20.0 + + val range3 = Range() + range3.color = Color.parseColor("#FFFD5E5E") + range3.from = 20.0 + range3.to = 30.0 + + binding.halfGauge.addRange(range) + binding.halfGauge.addRange(range2) + binding.halfGauge.addRange(range3) + + binding.halfGauge.minValue = 0.0 + binding.halfGauge.maxValue = 30.0 + binding.halfGauge.value = 0.0 + } + + private fun calculateBmi(weight: Double, height: Double): Double? { + val bmi: Double? = (weight / (height * height)) * 10000 + return bmi + } + + private fun setGaugeValue(bmi: Double, blockValue: Double, range: Double) { + val perc = (100 * bmi) / range + binding.halfGauge.value = (blockValue * perc) / 100 + } + + private fun setSpinnerGender() { + val genders = arrayOf(getString(R.string.male), getString(R.string.female)) + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, genders) + adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line) + binding.spinnerGender.adapter = adapter + + binding.spinnerGender.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>, + view: View, + position: Int, + id: Long + ) { + selectedGender = genders[position] + } + + override fun onNothingSelected(parent: AdapterView<*>) { + // Another interface callback + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/pregnancycalculator/BottomPregnancyFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/pregnancycalculator/BottomPregnancyFragment.kt new file mode 100644 index 0000000..259cfcc --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/pregnancycalculator/BottomPregnancyFragment.kt @@ -0,0 +1,160 @@ +package com.consultantapp.ui.dashboard.home.healthtool.pregnancycalculator + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.BottomPregnancyBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.utils.DateFormat +import com.consultantapp.utils.DateFormat.MON_DATE +import com.consultantapp.utils.DateUtils +import com.consultantapp.utils.DateUtils.dateFormatFromMillis +import com.consultantapp.utils.PrefsManager +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import java.util.* +import javax.inject.Inject + + +class BottomPregnancyFragment(private val dueDate: Long) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomPregnancyBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_pregnancy, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + dataSetup() + } + + private fun initialise() { + + } + + private fun listeners() { + + } + + private fun dataSetup() { + val pregnancyDays = 280 + val date = dateFormatFromMillis(DateFormat.MON_DATE_YEAR, dueDate) + binding.tvDueDate.text = getString(R.string.your_due_date_is_s, date) + + val pregnancyStartDate = calculateDate(-pregnancyDays) + + val calendarCurrent = Calendar.getInstance(Locale.ENGLISH) + val diff: Long = calendarCurrent.timeInMillis - pregnancyStartDate + val dayCount = diff.toFloat() / (24 * 60 * 60 * 1000) + + val weeks = (dayCount / 7).toInt() + val days = (dayCount % 7).toInt() + binding.tvPregnancyDate.text = getString(R.string.your_are_s_s_pregnant, weeks.toString(), days.toString()) + + val trimesterDifference = pregnancyDays / 3 + val trimester1StartDate = pregnancyStartDate + val trimester1EndDate = calculateDateSetTime(pregnancyStartDate, trimesterDifference - 3) + val trimester2StartDate = calculateDateSetTime(trimester1EndDate, 1) + val trimester2EndDate = calculateDateSetTime(trimester2StartDate, trimesterDifference + 4) + val trimester3StartDate = calculateDateSetTime(trimester2EndDate, 1) + val trimester3EndDate = calculateDateSetTime(trimester3StartDate, trimesterDifference - 2) + + binding.tvTimeline1Date.text = "${dateFormatFromMillis(MON_DATE, trimester1StartDate)} ${getString(R.string.to)} ${dateFormatFromMillis(MON_DATE, trimester1EndDate)}" + binding.tvTimeline2Date.text = "${dateFormatFromMillis(MON_DATE, trimester2StartDate)} ${getString(R.string.to)} ${dateFormatFromMillis(MON_DATE, trimester2EndDate)}" + binding.tvTimeline3Date.text = "${dateFormatFromMillis(MON_DATE, trimester3StartDate)} ${getString(R.string.to)} ${dateFormatFromMillis(MON_DATE, trimester3EndDate)}" + + when { + calendarCurrent.timeInMillis < trimester1EndDate -> { //Lies in 1st Trimester + val percentage = (calendarCurrent.timeInMillis - trimester1StartDate) * 100 / (trimester1EndDate - trimester1StartDate) + binding.progress1st.progress = percentage.toInt() + binding.progress2nd.progress = 0 + binding.progress3rd.progress = 0 + } + calendarCurrent.timeInMillis < trimester2EndDate -> { //Lies in 2nd Trimester + binding.progress1st.progress = 100 + val percentage = (calendarCurrent.timeInMillis - trimester2StartDate) * 100 / (trimester2EndDate - trimester2StartDate) + binding.progress2nd.progress = percentage.toInt() + binding.progress3rd.progress = 0 + } + else -> { //Lies in 3rd Trimester + binding.progress1st.progress = 100 + binding.progress2nd.progress = 100 + val percentage = (calendarCurrent.timeInMillis - trimester3StartDate) * 100 / (trimester3EndDate - trimester3StartDate) + binding.progress3rd.progress = percentage.toInt() + } + } + + binding.tvYourBaby.text = getString(R.string.your_baby_will_be_a_s, getZodiacSign()) + } + + private fun calculateDate(days: Int): Long { + val calendar = Calendar.getInstance(Locale.ENGLISH) + val dateSelected = dateFormatFromMillis(DateFormat.MON_DATE_YEAR, dueDate) + val date = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.DATE, dateSelected).toInt() + val month = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.MONTH, dateSelected).toInt() + val year = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.YEAR, dateSelected).toInt() + calendar.set(year, (month - 1), date) + + calendar.add(Calendar.DAY_OF_MONTH, days) + return calendar.timeInMillis + } + + private fun calculateDateSetTime(timeInMilis: Long, days: Int): Long { + val calendar = Calendar.getInstance(Locale.ENGLISH) + calendar.timeInMillis = timeInMilis + calendar.add(Calendar.DAY_OF_MONTH, days) + return calendar.timeInMillis + } + + private fun getZodiacSign(): String { + val calendar = Calendar.getInstance(Locale.ENGLISH) + calendar.timeInMillis = dueDate + val day = calendar.get(Calendar.DATE) + val month = calendar.get(Calendar.MONTH) + 1 + + return when { + day in 22..30 && month == 1 || day in 1..19 && month == 2 -> getString(R.string.aquarius) + day in 20..29 && month == 2 || day in 1..20 && month == 3 -> getString(R.string.pisces) + day in 21..31 && month == 3 || day in 1..20 && month == 4 -> getString(R.string.aries) + day in 21..30 && month == 4 || day in 1..21 && month == 5 -> getString(R.string.taurus) + day in 22..31 && month == 5 || day in 1..21 && month == 6 -> getString(R.string.gemini) + day in 22..30 && month == 6 || day in 1..22 && month == 7 -> getString(R.string.cancer_) + day in 23..31 && month == 7 || day in 1..22 && month == 8 -> getString(R.string.leo) + day in 23..31 && month == 8 || day in 1..23 && month == 9 -> getString(R.string.virgo) + day in 24..30 && month == 9 || day in 1..23 && month == 10 -> getString(R.string.libra) + day in 24..31 && month == 10 || day in 1..22 && month == 11 -> getString(R.string.scorpio) + day in 23..30 && month == 11 || day in 1..21 && month == 12 -> getString(R.string.sagittarius) + else -> getString(R.string.capricorn) + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/pregnancycalculator/PregnancyCalculatorFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/pregnancycalculator/PregnancyCalculatorFragment.kt new file mode 100644 index 0000000..240192a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/pregnancycalculator/PregnancyCalculatorFragment.kt @@ -0,0 +1,323 @@ +package com.consultantapp.ui.dashboard.home.healthtool.pregnancycalculator + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentPregnancyCalculatorBinding +import com.consultantapp.ui.adapter.CheckItemAdapter +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList + + +class PregnancyCalculatorFragment : DaggerFragment(), OnDateSelected { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private var rootView: View? = null + + private lateinit var binding: FragmentPregnancyCalculatorBinding + + private lateinit var adapterCalMethod: CheckItemAdapter + + private var itemsCalMethod = ArrayList() + + private lateinit var adapterIvf: CheckItemAdapter + + private var itemsIvf = ArrayList() + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_pregnancy_calculator, container, false) + rootView = binding.root + + initialisation() + listeners() + setAdapter() + } + return rootView + } + + private fun initialisation() { + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvDate.setOnClickListener { + var calendar = Calendar.getInstance() + calendar.set(Calendar.MONTH, -3) + val min = calendar.timeInMillis + calendar = Calendar.getInstance() + calendar.set(Calendar.MONTH, +3) + val max = calendar.timeInMillis + DateUtils.openDatePicker(requireActivity(), this, null, null) + } + + binding.tvCycle.setOnClickListener { + binding.spnCycleLength.performClick() + } + + binding.spnCycleLength.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvCycle.text = binding.spnCycleLength.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.tvWeek.setOnClickListener { + binding.spnWeek.performClick() + } + + binding.spnWeek.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvWeek.text = binding.spnWeek.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.tvDay.setOnClickListener { + binding.spnDays.performClick() + } + + binding.spnDays.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvDay.text = binding.spnDays.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.tvCalculate.setOnClickListener { + if (binding.tvDate.text.toString().isEmpty()) { + itemsCalMethod.forEachIndexed { index, filter -> + if (filter.isSelected == (index == 0)) binding.tvDate.showSnackBar(getString(R.string.the_first_day_of_your_last_period)) + else if (filter.isSelected == (index == 1)) binding.tvDate.showSnackBar(getString(R.string.date_of_conception)) + else if (filter.isSelected == (index == 2)) binding.tvDate.showSnackBar(getString(R.string.date_of_transfer)) + else if (filter.isSelected == (index == 3)) binding.tvDate.showSnackBar(getString(R.string.date_of_ultrasound)) + } + return@setOnClickListener + } else { + var dateTime = 0L + itemsCalMethod.forEachIndexed { index, filter -> + if (filter.isSelected) { + when (index) { + 0 -> dateTime = calculateViaLastPeriod() + 1 -> dateTime = calculateViaConceptionDate() + 2 -> dateTime = calculateViaIVF() + 3 -> dateTime = calculateViaUltrasound() + } + return@forEachIndexed + } + } + + val fragment = BottomPregnancyFragment(dateTime) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + + } + } + } + + private fun calculateViaLastPeriod(): Long { + val pregnancyDays = 280 + + when (binding.spnCycleLength.selectedItemPosition) { + 0 -> { + //Period cycle not known + return calculateDate(pregnancyDays) + } + 1 -> { + //Default menstural cycle 21 days then subtract 7 days + return calculateDate(pregnancyDays - 7) + } + else -> { + //Period Cycle Range 22 to 35 days + //if mestural cycle is more than 21 days than subtract your menstural cycle days count by 21 (default menstural cycle) + //And add it to date generated by adding 280 days + + val daysToAdd = (binding.spnCycleLength.selectedItemPosition + 20) - 21 + return calculateDate(pregnancyDays + daysToAdd - 7) + } + } + } + + private fun calculateViaConceptionDate(): Long { + //Add 266 days to conception date + return calculateDate(266) + } + + private fun calculateViaIVF(): Long { + if (itemsIvf[0].isSelected) + return calculateDate((266 - 3)) + else if (itemsIvf[1].isSelected) + return calculateDate((266 - 5)) + else + return calculateDate((266 - 3)) + } + + private fun calculateViaUltrasound(): Long { + val pregnancyDays = 280 + val embryoAge = ((binding.spnWeek.selectedItemPosition + 1) * 7) + binding.spnDays.selectedItemPosition + val daysToAdd = pregnancyDays - embryoAge + return calculateDate(daysToAdd) + } + + private fun calculateDate(days: Int): Long { + val calendar = Calendar.getInstance(Locale.ENGLISH) + val dateSelected = binding.tvDate.text.toString() + val date = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.DATE, dateSelected).toInt() + val month = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.MONTH, dateSelected).toInt() + val year = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.YEAR, dateSelected).toInt() + calendar.set(year, (month - 1), date) + + calendar.add(Calendar.DAY_OF_MONTH, days) + return calendar.timeInMillis + } + + private fun setAdapter() { + val list = resources.getStringArray(R.array.calculationMethod) + itemsCalMethod.clear() + list.forEachIndexed { index, s -> + val item = Filter() + if (index == 0) + item.isSelected = true + item.option_name = s + itemsCalMethod.add(item) + } + + adapterCalMethod = CheckItemAdapter(this, false, itemsCalMethod) + binding.rvList.adapter = adapterCalMethod + + /*ivf list*/ + itemsIvf.clear() + for (i in 0..1) { + val item = Filter() + if (i == 0) { + item.isSelected = true + item.option_name = "3 ${getString(R.string.days)}" + } else if (i == 1) { + item.option_name = "5 ${getString(R.string.days)}" + } + itemsIvf.add(item) + } + + adapterIvf = CheckItemAdapter(this, false, itemsIvf) + binding.rvListIVF.adapter = adapterIvf + + /*Cycle Length*/ + val itemCycle = ArrayList() + for (i in 20..35) { + if (i == 20) itemCycle.add(getString(R.string.i_dont_know)) + else itemCycle.add("$i ${getString(R.string.days)}") + } + + val adapterCycle = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, itemCycle) + binding.spnCycleLength.adapter = adapterCycle + + /*Days*/ + val itemDays = ArrayList() + for (i in 0..6) { + if (i == 1) itemDays.add("$i ${getString(R.string.day)}") + else itemDays.add("$i ${getString(R.string.days)}") + } + + val adapterDays = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, itemDays) + binding.spnDays.adapter = adapterDays + + /*Weeks*/ + val itemWeeks = ArrayList() + for (i in 1..24) { + if (i == 1) itemWeeks.add("$i ${getString(R.string.week)}") + else itemWeeks.add("$i ${getString(R.string.weeks)}") + } + + val adapterWeek = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, itemWeeks) + binding.spnWeek.adapter = adapterWeek + } + + + fun itemRelationClick(pos: Int) { + binding.rvListIVF.gone() + binding.tvTitle2.gone() + binding.tvCycle.gone() + binding.tvWeek.gone() + binding.tvDay.gone() + + binding.tvDate.text = "" + binding.spnCycleLength.setSelection(0) + binding.spnWeek.setSelection(0) + binding.spnDays.setSelection(0) + + when (pos) { + 0 -> { + binding.tvTitle2.visible() + binding.tvCycle.visible() + + binding.tvTitleDate.text = getString(R.string.the_first_day_of_your_last_period) + binding.tvTitle2.text = getString(R.string.cycle_length) + + } + 1 -> { + binding.tvTitleDate.text = getString(R.string.date_of_conception) + } + 2 -> { + binding.tvTitle2.visible() + binding.rvListIVF.visible() + + binding.tvTitleDate.text = getString(R.string.date_of_transfer) + binding.tvTitle2.text = getString(R.string.ivf_transfer_date) + + } + 3 -> { + binding.tvTitleDate.text = getString(R.string.date_of_ultrasound) + binding.tvWeek.visible() + binding.tvDay.visible() + + } + } + } + + override fun onDateSelected(date: String) { + binding.tvDate.text = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, + DateFormat.MON_DATE_YEAR, date) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/protienintake/ProteinIntakeFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/protienintake/ProteinIntakeFragment.kt new file mode 100644 index 0000000..20816d1 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/protienintake/ProteinIntakeFragment.kt @@ -0,0 +1,241 @@ +package com.consultantapp.ui.dashboard.home.healthtool.protienintake + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.requests.DatesAvailability +import com.consultantapp.data.models.responses.WaterIntake +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentProteinIntakeBinding +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.BottomWaterLimitFragment +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.WaterIntakeAdapter +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.WaterIntakeViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + +class ProteinIntakeFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentProteinIntakeBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var adapterIntake: WaterIntakeAdapter + + private var itemsIntake = ArrayList() + + private var intakeSelected = 0 + + private lateinit var viewModel: WaterIntakeViewModel + + var waterIntake: WaterIntake? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate( + inflater, + R.layout.fragment_protein_intake, + container, + false + ) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + hitApi() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WaterIntakeViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvTakeProtein.setOnClickListener { + when { + waterIntake?.limit == null -> { + bottomDailyLimit() + } + intakeSelected == 0 -> { + binding.tvTakeProtein.showSnackBar(getString(R.string.select_amount_protein)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["quantity"] = intakeSelected + + viewModel.setProteinIntake(hashMap) + } + } + } + + binding.tvSet.setOnClickListener { + bottomDailyLimit() + } + } + + private fun bottomDailyLimit() { + val fragment = BottomWaterLimitFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + private fun setAdapter() { + itemsIntake.clear() + var date: DatesAvailability + var waterIntake = 0 + for (i in 0..4) { + date = DatesAvailability() + waterIntake += 25 + date.intakeAmount = waterIntake + + itemsIntake.add(date) + } + + adapterIntake = WaterIntakeAdapter(this, itemsIntake) + binding.rvProteinIntake.adapter = adapterIntake + + } + + fun onWaterSelected(item: DatesAvailability) { + binding.rvProteinIntake.smoothScrollToPosition(itemsIntake.indexOf(item)) + intakeSelected = item.intakeAmount ?: 0 + } + + fun setDailyLimit(limit: String) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["limit"] = limit + + viewModel.setProteinDailyLimit(hashMap) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + viewModel.getProteinIntake(HashMap()) + } + } + + private fun bindObservers() { + viewModel.getProteinIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.setProteinIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + itemsIntake.forEachIndexed { index, datesAvailability -> + itemsIntake[index].isSelected = false + } + adapterIntake.notifyDataSetChanged() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.setProteinDailyLimit.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + binding.tvSet.visible() + binding.tvDailyLimitV.text = + getProteinUnit(requireActivity(), waterIntake?.limit?.toInt() ?: 0, true) + binding.tvIntakeV.text = + getProteinUnit(requireActivity(), waterIntake?.today_intake?.toInt() ?: 0, true) + + binding.tvDaysCompletedV.text = waterIntake?.total_achieved_goal ?: getString(R.string.na) + + val todayIntake = waterIntake?.today_intake ?: 0.0 + val dailyLimit = waterIntake?.limit ?: 0.0 + + val percentage = ((todayIntake / dailyLimit) * 100).toInt() + binding.progress.progress = if (percentage > 100) 100 else percentage + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/BottomWaterLimitFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/BottomWaterLimitFragment.kt new file mode 100644 index 0000000..c321347 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/BottomWaterLimitFragment.kt @@ -0,0 +1,94 @@ +package com.consultantapp.ui.dashboard.home.healthtool.waterintake + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.BottomWaterLimitBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.hideKeyboard +import com.consultantapp.utils.showSnackBar +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomWaterLimitFragment(private val fragment: Fragment) : + DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomWaterLimitBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_water_limit, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + if (fragment is WaterIntakeFragment) { + if (fragment.waterIntake?.limit != null) + binding.etWaterIntake.setText(fragment.waterIntake?.limit.toString()) + } else if (fragment is ProteinIntakeFragment) { + binding.tvDailyLimit.text = getString(R.string.set_you_protein_limit) + binding.ilWaterIntake.hint = getString(R.string.protein_intake_grams) + binding.tvSymbol.text = getString(R.string.g) + + if (fragment.waterIntake?.limit != null) + binding.etWaterIntake.setText(fragment.waterIntake?.limit.toString()) + } + + } + + private fun listeners() { + binding.tvSetLimit.setOnClickListener { + binding.etWaterIntake.hideKeyboard() + if (binding.etWaterIntake.text.toString().isEmpty()) { + binding.etWaterIntake.showSnackBar(getString(R.string.set_daily_limit)) + } else { + if (fragment is WaterIntakeFragment) + fragment.setDailyLimit(binding.etWaterIntake.text.toString()) + else if (fragment is ProteinIntakeFragment) + fragment.setDailyLimit(binding.etWaterIntake.text.toString()) + + dialog?.dismiss() + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeAdapter.kt new file mode 100644 index 0000000..168b129 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeAdapter.kt @@ -0,0 +1,71 @@ +package com.consultantapp.ui.dashboard.home.healthtool.waterintake + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.requests.DatesAvailability +import com.consultantapp.databinding.ItemWaterIntakeBinding +import com.consultantapp.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantapp.utils.getProteinUnit +import com.consultantapp.utils.getWaterLiters +import java.util.* + +class WaterIntakeAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_water_intake, parent, false)) + } + + inner class ViewHolder(val binding: ItemWaterIntakeBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: DatesAvailability) = with(binding) { + + if (fragment is WaterIntakeFragment) + cbName.text = getWaterLiters(fragment.requireActivity(), item.intakeAmount + ?: 0, true) + else + cbName.text = getProteinUnit(fragment.requireActivity(), item.intakeAmount + ?: 0, true) + + cbName.isChecked = item.isSelected + + if (item.isSelected) { + cbName.setBackgroundResource(R.drawable.drawable_theme_60) + cbName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorWhite)) + } else { + cbName.setBackgroundResource(R.drawable.drawable_stroke_inactive) + cbName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorBlack)) + } + + + clWater.setOnClickListener { + if (!item.isSelected) { + for (count: Int in 0 until items.size) { + items[count].isSelected = count == adapterPosition + notifyItemChanged(count) + } + + if (fragment is WaterIntakeFragment) + fragment.onWaterSelected(item) + else if (fragment is ProteinIntakeFragment) + fragment.onWaterSelected(item) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeFragment.kt new file mode 100644 index 0000000..29e87f3 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeFragment.kt @@ -0,0 +1,240 @@ +package com.consultantapp.ui.dashboard.home.healthtool.waterintake + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.requests.DatesAvailability +import com.consultantapp.data.models.responses.WaterIntake +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentWaterIntakeBinding +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + +class WaterIntakeFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentWaterIntakeBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var adapterIntake: WaterIntakeAdapter + + private var itemsIntake = ArrayList() + + private var intakeSelected = 0 + + private lateinit var viewModel: WaterIntakeViewModel + + var waterIntake: WaterIntake? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_water_intake, container, false) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + hitApi() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WaterIntakeViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvDrink.setOnClickListener { + when { + waterIntake?.limit == null -> { + bottomDailyLimit() + } + intakeSelected == 0 -> { + binding.tvDrink.showSnackBar(getString(R.string.select_amount)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["quantity"] = + getWaterLiters(requireActivity(), intakeSelected, false) + + viewModel.setWaterIntake(hashMap) + } + } + } + + binding.tvSet.setOnClickListener { + bottomDailyLimit() + } + } + + private fun bottomDailyLimit() { + val fragment = BottomWaterLimitFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + private fun setAdapter() { + itemsIntake.clear() + var date: DatesAvailability + var waterIntake = 0 + for (i in 0..4) { + date = DatesAvailability() + if (i == 0) + date.intakeAmount = 100 + else { + waterIntake += 250 + date.intakeAmount = waterIntake + } + itemsIntake.add(date) + } + + adapterIntake = WaterIntakeAdapter(this, itemsIntake) + binding.rvWaterIntake.adapter = adapterIntake + + } + + fun onWaterSelected(item: DatesAvailability) { + binding.rvWaterIntake.smoothScrollToPosition(itemsIntake.indexOf(item)) + intakeSelected = item.intakeAmount ?: 0 + } + + fun setDailyLimit(limit: String) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["limit"] = limit + + viewModel.setDailyLimit(hashMap) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + viewModel.getWaterIntake(HashMap()) + } + } + + private fun bindObservers() { + viewModel.getWaterIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.setWaterIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + itemsIntake.forEachIndexed { index, datesAvailability -> + itemsIntake[index].isSelected = false + } + adapterIntake.notifyDataSetChanged() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.setDailyLimit.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + binding.tvSet.visible() + binding.tvDailyLimitV.text = + getWaterUnit(requireActivity(), waterIntake?.limit ?: 0.0, true) + binding.tvIntakeV.text = + getWaterUnit(requireActivity(), waterIntake?.today_intake ?: 0.0, true) + + binding.tvDaysCompletedV.text = waterIntake?.total_achieved_goal ?: getString(R.string.na) + + val todayIntake = waterIntake?.today_intake ?: 0.0 + val dailyLimit = waterIntake?.limit ?: 0.0 + + var percentage = todayIntake / dailyLimit + if (percentage > 1) + percentage = 1.0 + binding.animationView.setMinAndMaxProgress(0.0f, percentage.toFloat()) + binding.animationView.playAnimation() + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeViewModel.kt new file mode 100644 index 0000000..5dea578 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/healthtool/waterintake/WaterIntakeViewModel.kt @@ -0,0 +1,168 @@ +package com.consultantapp.ui.dashboard.home.healthtool.waterintake + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.WaterIntake +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class WaterIntakeViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val setDailyLimit by lazy { SingleLiveEvent>() } + + val getWaterIntake by lazy { SingleLiveEvent>() } + + val setWaterIntake by lazy { SingleLiveEvent>() } + + val setProteinDailyLimit by lazy { SingleLiveEvent>() } + + val getProteinIntake by lazy { SingleLiveEvent>() } + + val setProteinIntake by lazy { SingleLiveEvent>() } + + + fun setDailyLimit(hashMap: HashMap) { + setDailyLimit.value = Resource.loading() + + webService.setDailyLimit(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setDailyLimit.value = Resource.success(response.body()?.data) + } else { + setDailyLimit.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setDailyLimit.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun setWaterIntake(hashMap: HashMap) { + setWaterIntake.value = Resource.loading() + + webService.setWaterIntake(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setWaterIntake.value = Resource.success(response.body()?.data) + } else { + setWaterIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setWaterIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun getWaterIntake(hashMap: HashMap) { + getWaterIntake.value = Resource.loading() + + webService.getWaterLimit(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getWaterIntake.value = Resource.success(response.body()?.data) + } else { + getWaterIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getWaterIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun setProteinDailyLimit(hashMap: HashMap) { + setProteinDailyLimit.value = Resource.loading() + + webService.setProteinDailyLimit(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setProteinDailyLimit.value = Resource.success(response.body()?.data) + } else { + setProteinDailyLimit.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setProteinDailyLimit.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun setProteinIntake(hashMap: HashMap) { + setProteinIntake.value = Resource.loading() + + webService.setProteinIntake(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setProteinIntake.value = Resource.success(response.body()?.data) + } else { + setProteinIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setProteinIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getProteinIntake(hashMap: HashMap) { + getProteinIntake.value = Resource.loading() + + webService.getProteinIntake(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getProteinIntake.value = Resource.success(response.body()?.data) + } else { + getProteinIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getProteinIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/items/ConsultTypeAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/items/ConsultTypeAdapter.kt new file mode 100644 index 0000000..51ec9c2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/items/ConsultTypeAdapter.kt @@ -0,0 +1,118 @@ +package com.consultantapp.ui.dashboard.home.items + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.requests.ConsultTypeModel +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemConsultBinding +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.dashboard.home.HomeFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.SignUpActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_INFO_USER +import com.consultantapp.utils.* + + +class ConsultTypeAdapter(private val fragmentMain: HomeFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + val widthScreen = fragmentMain.resources.displayMetrics.widthPixels - pxFromDp(fragmentMain.requireContext(), 8f) + var itemWidth = pxFromDp(fragmentMain.requireContext(), 94f) + var itemFitCount = (widthScreen / itemWidth).toInt() + val itemFinalWidth = widthScreen / (itemFitCount + 0.5).toFloat() + + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_consult, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemConsultBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clConsult.layoutParams.width = itemFinalWidth.toInt() + + binding.clConsult.setOnClickListener { + when (items[bindingAdapterPosition].type) { + ConsultType.TIP_OF_DAY -> { + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.TIP_OF_DAY) + .putExtra(EXTRA_REQUEST_ID, fragmentMain.homeData?.tips?.get(0))) + } + ConsultType.FREE_EXPERT -> { + if (fragmentMain.userRepository.isUserLoggedIn()) { + fragmentMain.startActivity(Intent(fragmentMain.requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.MY_QUESTION)) + } else { + val fragment = WelcomeFragment() + fragment.show(fragmentMain.requireActivity().supportFragmentManager, fragment.tag) + } + } + ConsultType.HOME_VISIT -> { + if (fragmentMain.userRepository.isUserLoggedIn()) + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DoctorListActivity::class.java) + .putExtra(EXTRA_CONSULT_TYPE, items[bindingAdapterPosition].type)) + else + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), SignUpActivity::class.java) + .putExtra(EXTRA_INFO_USER, true)) + } + ConsultType.CONSULT_ONLINE, ConsultType.CLINIC_VISIT, ConsultType.EMERGENCY_CONSULTATION -> { + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DoctorListActivity::class.java) + .putExtra(EXTRA_CONSULT_TYPE, items[bindingAdapterPosition].type)) + } + ConsultType.ONLINE_PROGRAMS -> { + if (fragmentMain.userRepository.getUser() == null) { + val fragment = WelcomeFragment() + fragment.show(fragmentMain.requireActivity().supportFragmentManager, fragment.tag) + } else { + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES)) + } + } + else -> { + /* fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DoctorListActivity::class.java) + .putExtra(DoctorListActivity.EXTRA_CONSULT_TYPE, items[adapterPosition].type))*/ + } + } + } + + } + + fun bind(item: ConsultTypeModel) = with(binding) { + tvName.text = item.name + ivImage.setImageResource(item.image ?: 0) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/items/HealthToolsAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/items/HealthToolsAdapter.kt new file mode 100644 index 0000000..4848f3a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/items/HealthToolsAdapter.kt @@ -0,0 +1,81 @@ +package com.consultantapp.ui.dashboard.home.items + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.databinding.RvItemHealthToolsBinding +import com.consultantapp.ui.dashboard.home.HomeFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.PAGE_TO_OPEN + + +class HealthToolsAdapter(private val fragmentMain: HomeFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_health_tools, parent, false)) + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: RvItemHealthToolsBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clHealthTools.setOnClickListener { + if (fragmentMain.userRepository.isUserLoggedIn()) { + when (adapterPosition) { + 0 -> openPage(DrawerActivity.BMI_CHECKER) + 1 -> openPage(DrawerActivity.WATER_INTAKE) + 2 -> openPage(DrawerActivity.PROTEIN_INTAKE) + 3 -> openPage(DrawerActivity.PREGNANCY_CALCULATOR) + } + } else { + val fragment = WelcomeFragment() + fragment.show(fragmentMain.requireActivity().supportFragmentManager, fragment.tag) + } + } + } + + private fun openPage(page: String) { + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, page)) + } + + fun bind(item: String) = with(binding) { + val context = binding.root.context + tvName.text = item + + when (adapterPosition) { + 0 -> { + tvDesc.text = context.getString(R.string.health_tool_1_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_1) + } + 1 -> { + tvDesc.text = context.getString(R.string.health_tool_2_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_2) + } + 2 -> { + tvDesc.text = context.getString(R.string.health_tool_3_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_3) + } + 3 -> { + tvDesc.text = context.getString(R.string.health_tool_4_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_4) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/items/LatestBlogAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/items/LatestBlogAdapter.kt new file mode 100644 index 0000000..dededd2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/items/LatestBlogAdapter.kt @@ -0,0 +1,76 @@ +package com.consultantapp.ui.dashboard.home.items + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemLatestBlogBinding +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* + + +class LatestBlogAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_latest_blog, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemLatestBlogBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.cvBlog.setOnClickListener { + fragment.startActivity(Intent(fragment.requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.BLOGS_DETAILS) + .putExtra(EXTRA_REQUEST_ID, items[adapterPosition])) + } + } + + fun bind(item: Feed) = with(binding) { + tvName.text = item.title + tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, item.created_at) + loadImage("tag",ivImage, item.image, R.drawable.image_placeholder) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/AskQuestionFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/AskQuestionFragment.kt new file mode 100644 index 0000000..618b1b7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/AskQuestionFragment.kt @@ -0,0 +1,134 @@ +package com.consultantapp.ui.dashboard.home.questions + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentAskQuestionBinding +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.editTextScroll +import com.consultantapp.utils.isConnectedToInternet +import com.consultantapp.utils.showSnackBar +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class AskQuestionFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentAskQuestionBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: QuestionViewModel + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_ask_question, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + editTextScroll(binding.etDesc) + + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvSubmit.setOnClickListener { + checkValidation() + } + } + + + private fun checkValidation() { + when { + binding.etTitle.text.toString().trim().isEmpty() -> { + binding.etTitle.showSnackBar(getString(R.string.question)) + } + binding.etDesc.text.toString().trim().isEmpty() -> { + binding.etDesc.showSnackBar(getString(R.string.description)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["title"] = binding.etTitle.text.toString().trim() + hashMap["description"] = binding.etDesc.text.toString().trim() + + if (arguments?.containsKey(CATEGORY_PARENT_ID) == true) { + val categoryData = arguments?.getSerializable(CATEGORY_PARENT_ID) as Categories + hashMap["category_id"] = categoryData.id ?: "" + } + viewModel.askQuestion(hashMap) + } + } + } + + private fun bindObservers() { + viewModel.askQuestion.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionViewModel.kt new file mode 100644 index 0000000..6d4e5e7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionViewModel.kt @@ -0,0 +1,123 @@ +package com.consultantapp.ui.dashboard.home.questions + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class QuestionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val getQuestions by lazy { SingleLiveEvent>() } + + val getQuestionsDetails by lazy { SingleLiveEvent>() } + + val askQuestion by lazy { SingleLiveEvent>() } + + val getMedicalHistory by lazy { SingleLiveEvent>() } + + + fun getQuestions(hashMap: HashMap) { + getQuestions.value = Resource.loading() + + webService.getQuestions(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getQuestions.value = Resource.success(response.body()?.data) + } else { + getQuestions.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getQuestions.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getQuestionsDetails(hashMap: HashMap) { + getQuestionsDetails.value = Resource.loading() + + webService.getQuestionsDetails(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getQuestionsDetails.value = Resource.success(response.body()?.data) + } else { + getQuestionsDetails.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getQuestionsDetails.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun askQuestion(hashMap: HashMap) { + askQuestion.value = Resource.loading() + + webService.askQuestion(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + askQuestion.value = Resource.success(response.body()?.data) + } else { + askQuestion.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + askQuestion.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getMedicalHistory(hashMap: HashMap) { + getMedicalHistory.value = Resource.loading() + + webService.getMedicalHistory(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getMedicalHistory.value = Resource.success(response.body()?.data) + } else { + getMedicalHistory.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getMedicalHistory.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionsAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionsAdapter.kt new file mode 100644 index 0000000..c876813 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionsAdapter.kt @@ -0,0 +1,72 @@ +package com.consultantapp.ui.dashboard.home.questions + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemQuestionBinding +import com.consultantapp.ui.dashboard.home.questions.detail.QuestionDetailFragment +import com.consultantapp.utils.EXTRA_REQUEST_ID +import com.consultantapp.utils.replaceFragment + + +class QuestionsAdapter(private val fragmentMain: QuestionsFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_question, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemQuestionBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clQuestion.setOnClickListener { + val fragment = QuestionDetailFragment() + val bundle = Bundle() + bundle.putString(EXTRA_REQUEST_ID, items[adapterPosition].id) + fragment.arguments = bundle + replaceFragment(fragmentMain.requireActivity().supportFragmentManager, + fragment, R.id.container) + } + } + + fun bind(item: Feed) = with(binding) { + + tvName.text = item.title + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionsFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionsFragment.kt new file mode 100644 index 0000000..5cf342a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/QuestionsFragment.kt @@ -0,0 +1,204 @@ +package com.consultantapp.ui.dashboard.home.questions + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class QuestionsFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: QuestionViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: QuestionsAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var questionData: CommonDataModel? = null + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate( + inflater, R.layout.activity_listing_toolbar, + container, false + ) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvHeader.text=getString(R.string.my_question) + binding.tvAdd.text = getString(R.string.ask_plus) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_question) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_question_desc) + + } + + private fun setAdapter() { + adapter = QuestionsAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.tvAdd.setOnClickListener { + if (questionData?.can_ask_question == true) { + startActivity(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CATEGORIES) + .putExtra(EXTRA_NAME, DrawerActivity.MY_QUESTION)) + } else + requireActivity().longToast(getString(R.string.ask_question_limit)) + + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + hashMap["service_type"] = CallType.ALL + viewModel.getQuestions(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getQuestions.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + binding.tvAdd.visible() + + isLoadingMoreItems = false + + questionData = it.data + + val tempList = questionData?.questions ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing && items.isEmpty()) + binding.clLoader.visible() + } + } + }) + } + + override fun onResume() { + super.onResume() + hitApi(true) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/detail/AnswersAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/detail/AnswersAdapter.kt new file mode 100644 index 0000000..3dec1d3 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/detail/AnswersAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantapp.ui.dashboard.home.questions.detail + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemAnswerBinding +import com.consultantapp.utils.DateUtils +import com.consultantapp.utils.getDoctorName +import com.consultantapp.utils.loadImage + + +class AnswersAdapter(private val fragment: Fragment, private val items: List) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_answer, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemAnswerBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + } + + fun bind(item: Feed) = with(binding) { + loadImage("tag",binding.ivPic, item.user?.profile_image, R.drawable.ic_profile_placeholder) + tvName.text = getDoctorName(item.user) + + tvComment.text = item.answer + tvTime.text= DateUtils.getTimeAgo(item.created_at) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/detail/QuestionDetailFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/detail/QuestionDetailFragment.kt new file mode 100644 index 0000000..a68675b --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/questions/detail/QuestionDetailFragment.kt @@ -0,0 +1,178 @@ +package com.consultantapp.ui.dashboard.home.questions.detail + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentQuestionDetailBinding +import com.consultantapp.ui.dashboard.home.questions.QuestionViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + + +class QuestionDetailFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentQuestionDetailBinding + + private var rootView: View? = null + + private var questionId: String? = null + + private var details: Feed? = null + + private var items = ArrayList() + + private lateinit var adapter: AnswersAdapter + + private lateinit var viewModel: QuestionViewModel + + private lateinit var progressDialog: ProgressDialog + + private var isReceiverRegistered = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_question_detail, + container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_answer) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_answer_desc) + + questionId = arguments?.getString(EXTRA_REQUEST_ID) + hitApi() + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["question_id"] = questionId ?:"" + + viewModel.getQuestionsDetails(hashMap) + } + } + + private fun setAdapter() { + adapter = AnswersAdapter(this, items) + binding.rvAnswer.adapter = adapter + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + } + + private fun setData() { + binding.tvTitle.text = details?.title + binding.tvDec.text = details?.description + + items.clear() + items.addAll(details?.answers ?: emptyList()) + adapter.notifyDataSetChanged() + + binding.clNoData.hideShowView(items.isEmpty()) + } + + private fun bindObservers() { + viewModel.getQuestionsDetails.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + details = it.data?.question + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onPause() { + super.onPause() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.QUESTION_ANSWERED) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.QUESTION_ANSWERED -> { + hitApi() + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/tipofday/TipOfDayCommentsAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/tipofday/TipOfDayCommentsAdapter.kt new file mode 100644 index 0000000..a470939 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/tipofday/TipOfDayCommentsAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantapp.ui.dashboard.home.tipofday + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemTipCommentsBinding +import com.consultantapp.utils.DateUtils +import com.consultantapp.utils.getDoctorName +import com.consultantapp.utils.loadImage + + +class TipOfDayCommentsAdapter(private val fragment: Fragment, private val items: List) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_tip_comments, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemTipCommentsBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + } + + fun bind(item: Feed) = with(binding) { + loadImage("tag",binding.ivPic, item.user?.profile_image, R.drawable.ic_profile_placeholder) + tvName.text = getDoctorName(item.user) + + tvComment.text = item.comment + tvTime.text= DateUtils.getTimeAgo(item.created_at) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/home/tipofday/TipOfDayFragmentFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/home/tipofday/TipOfDayFragmentFragment.kt new file mode 100644 index 0000000..08737df --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/home/tipofday/TipOfDayFragmentFragment.kt @@ -0,0 +1,331 @@ +package com.consultantapp.ui.dashboard.home.tipofday + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Feed +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentTipOfDayBinding +import com.consultantapp.ui.dashboard.feeds.FeedViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.android.material.appbar.AppBarLayout +import dagger.android.support.DaggerFragment +import javax.inject.Inject +import kotlin.math.abs + + +class TipOfDayFragmentFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentTipOfDayBinding + + private var rootView: View? = null + + private var details: Feed? = null + + private var items = ArrayList() + + private lateinit var adapter: TipOfDayCommentsAdapter + + private lateinit var viewModel: FeedViewModel + + private lateinit var progressDialog: ProgressDialog + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_tip_of_day, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + editTextScroll(binding.etMessage) + + details = requireActivity().intent?.getSerializableExtra(EXTRA_REQUEST_ID) as Feed + setData() + + if (isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + + hitApi(true) + } + } + + private fun hitApi(firstHit: Boolean) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[ApiKeys.AFTER] = items[items.size - 1].id ?: "" + + hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.getFeedsComment(details?.id ?: "",hashMap) + } + } + + private fun setAdapter() { + adapter = TipOfDayCommentsAdapter(this, items) + binding.rvComments.adapter = adapter + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + binding.toolbar.title = "" + + when { + abs(verticalOffset) == appBarLayout.totalScrollRange -> { + // Collapsed + binding.toolbar.title = details?.title + } + verticalOffset == 0 -> { + // Expanded + } + else -> { + // Somewhere in between + } + } + }) + + binding.ivFavourite.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["favorite"] = if (details?.is_favorite == true) "0" else "1" + viewModel.addFavorite(details?.id ?: "", hashMap) + } + } + + binding.ivThumb.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["like"] = if (details?.is_like == true) "0" else "1" + viewModel.addLike(details?.id ?: "", hashMap) + } + } + + binding.rvComments.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvComments.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + + binding.ivSend.setOnClickListener { + when { + binding.etMessage.text.toString().trim().isEmpty()->{ + binding.etMessage.showSnackBar(getString(R.string.enter_message)) + } + isConnectedToInternet(requireContext(), true)->{ + val hashMap = HashMap() + hashMap["comment"] = binding.etMessage.text.toString().trim() + viewModel.addComment(details?.id ?: "", hashMap) + } + } + } + } + + private fun setData() { + binding.toolbarLayout.isTitleEnabled = false + loadImage("tag",binding.ivImage, details?.image, R.drawable.image_placeholder) + binding.tvTitle.text = details?.title + binding.tvDec.text = details?.description + + if (details?.is_favorite == true) + binding.ivFavourite.setImageResource(R.drawable.ic_like_red) + else + binding.ivFavourite.setImageResource(R.drawable.ic_like_white) + + if (details?.is_like == true) + binding.ivThumb.setImageResource(R.drawable.ic_like) + else + binding.ivThumb.setImageResource(R.drawable.ic_not_selected) + } + + private fun bindObservers() { + viewModel.viewFeeds.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + binding.rlMessage.visible() + + details = it.data?.feed + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.addFavorite.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + } + + + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + resultFragmentIntentNoPop( + this, targetFragment ?: this, + AppRequestCode.ARTICLE_CHANGES, Intent() + ) + else + requireActivity().setResult(Activity.RESULT_OK) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.addLike.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.addComment.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + items.add(0,it.data?.comment ?: Feed()) + adapter.notifyDataSetChanged() + + binding.tvAllComments.hideShowView(items.isNotEmpty()) + binding.etMessage.setText("") + binding.etMessage.hideKeyboard() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.getFeedsComment.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + isLoadingMoreItems = false + + val tempList = it.data?.comments ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvAllComments.hideShowView(items.isNotEmpty()) + + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + } + + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/language/LanguageFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/language/LanguageFragment.kt new file mode 100644 index 0000000..c64f938 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/language/LanguageFragment.kt @@ -0,0 +1,101 @@ +package com.consultantapp.ui.dashboard.language + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.app.ActivityCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentLanguageBinding +import com.consultantapp.ui.dashboard.HomeActivity +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class LanguageFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentLanguageBinding + + private var rootView: View? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_language, container, false) + rootView = binding.root + + initialise() + listeners() + } + return rootView + } + + private fun initialise() { + requireActivity().setResult(Activity.RESULT_OK) + + if (userRepository.isUserLoggedIn()) { + binding.toolbar.visible() + + val lan = userRepository.getUserLanguage() + if (lan == "en") + binding.rbEnglish.isChecked = true + else if (lan == "ar") + binding.rbArabic.isChecked = true + } else { + binding.toolbar.gone() + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.rbLanguage.setOnCheckedChangeListener { radioGroup, i -> + if (isConnectedToInternet(requireContext(), true)) { + if (i == R.id.rbEnglish) { + prefsManager.save(USER_LANGUAGE, "en") + LocaleHelper.setLocale(requireActivity(), "en", prefsManager) + } else { + prefsManager.save(USER_LANGUAGE, "ar") + LocaleHelper.setLocale(requireActivity(), "ar", prefsManager) + } + + /*prefsManager.save(USER_LANGUAGE, "en") + LocaleHelper.setLocale(requireActivity(), "en", prefsManager)*/ + + /*get updated pages*/ + if (BuildConfig.FLAVOR == "homeDoctor") + userRepository.getPages() + + if (userRepository.isUserLoggedIn()) { + requireActivity().setResult(Activity.RESULT_CANCELED) + ActivityCompat.finishAffinity(requireActivity()) + + startActivity(Intent(activity, HomeActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } else + requireActivity().finish() + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/location/AddAddressActivity.kt b/app/src/main/java/com/consultantapp/ui/dashboard/location/AddAddressActivity.kt new file mode 100644 index 0000000..6696b70 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/location/AddAddressActivity.kt @@ -0,0 +1,459 @@ +package com.consultantapp.ui.dashboard.location + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.location.Address +import android.location.Geocoder +import android.location.Location +import android.location.LocationManager +import android.os.Bundle +import android.os.Looper +import android.provider.Settings +import android.util.Log +import android.view.MotionEvent +import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityAddAddressBinding +import com.consultantapp.utils.* +import com.consultantapp.utils.AppRequestCode.AUTOCOMPLETE_REQUEST_CODE +import com.consultantapp.utils.PermissionUtils +import com.google.android.gms.location.* +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.CameraPosition +import com.google.android.gms.maps.model.LatLng +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.widget.Autocomplete +import com.google.android.libraries.places.widget.AutocompleteActivity +import com.google.android.libraries.places.widget.model.AutocompleteActivityMode +import dagger.android.support.DaggerAppCompatActivity +import permissions.dispatcher.* +import java.io.IOException +import java.util.* +import javax.inject.Inject + + +@RuntimePermissions +class AddAddressActivity : DaggerAppCompatActivity(), GoogleMap.OnCameraChangeListener, OnMapReadyCallback { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: ActivityAddAddressBinding + + private var saveAddress = SaveAddress() + + private var mapFragment: SupportMapFragment? = null + + private var isPlacePicker = false + + private var mMap: GoogleMap? = null + + private lateinit var geoCoder: Geocoder + + lateinit var mFusedLocationClient: FusedLocationProviderClient + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_add_address) + + initialise() + setListeners() + } + + override fun onStart() { + super.onStart() + setEditAddress() + } + + private fun initialise() { + mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment + mapFragment?.getMapAsync(this) + geoCoder = Geocoder(this, Locale.getDefault()) + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + getLocationWithPermissionCheck() + } + + private fun setEditAddress() { + if (intent.hasExtra(EXTRA_ADDRESS)) { + saveAddress = intent.getSerializableExtra(EXTRA_ADDRESS) as SaveAddress + saveAddress.addressId = saveAddress._id + binding.etLocation.setText(getAddressFromLatLong(this@AddAddressActivity, saveAddress.lat!!.toDouble(), saveAddress.long!!.toDouble())) + isPlacePicker = true + } + } + + private fun setListeners() { + binding.toolbar.setNavigationOnClickListener { + onBackPressed() + } + + binding.tvChange.setOnClickListener { + // placePicker(null, this) + + val fields = listOf( + Place.Field.ID, + Place.Field.NAME, + Place.Field.ADDRESS, + Place.Field.LAT_LNG + ) + + val intent = this.let { + Autocomplete.IntentBuilder( + AutocompleteActivityMode.FULLSCREEN, fields + ) + .build(it) + } + + startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE) + } + + binding.btnSave.setOnClickListener { + checkValidations() + } + + binding.transparentImage.setOnTouchListener { v, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> { + // Disallow ScrollView to intercept touch events. + binding.scrollMap.requestDisallowInterceptTouchEvent(true) + // Disable touch on transparent view + false + } + + MotionEvent.ACTION_UP -> { + // Allow ScrollView to intercept touch events. + binding.scrollMap.requestDisallowInterceptTouchEvent(false) + true + } + + MotionEvent.ACTION_MOVE -> { + binding.scrollMap.requestDisallowInterceptTouchEvent(true) + false + } + + else -> true + } + } + } + + private fun checkValidations() { + binding.btnSave.hideKeyboard() + when { + binding.etLocation.text.toString().isEmpty() -> { + binding.etLocation.showSnackBar(getString(R.string.address)) + } + else -> { + val intent = Intent() + intent.putExtra(EXTRA_ADDRESS, saveAddress) + setResult(Activity.RESULT_OK, intent) + finish() + } + } + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + /* Log.e("AUTOCOMPLETE_REQUEST_CODE","000000") + if (resultCode == Activity.RESULT_OK) { + Log.e("AUTOCOMPLETE_REQUEST_CODE","111111") + try { + if (requestCode == AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) { + Log.e("AUTOCOMPLETE_REQUEST_CODE","222222222") + val place = Autocomplete.getPlaceFromIntent(data!!) + binding.etLocation.setText(getAddress(place)) + + saveAddress.locationName = binding.etLocation.text.toString() + saveAddress.long = place.latLng?.longitude + saveAddress.lat = place.latLng?.latitude + + isPlacePicker = true + mMap?.moveCamera(CameraUpdateFactory.newLatLng(place.latLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + }else{ + Log.e("AUTOCOMPLETE_REQUEST_CODE","333333333") + } + }catch (ex: Exception){ + Log.e("Exception",ex.message.toString()) + } + + }else{ + Log.e("AUTOCOMPLETE_REQUEST_CODE","4444444444"+"//"+requestCode+"//"+AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + }*/ + + if (requestCode == AUTOCOMPLETE_REQUEST_CODE /*&& resultCode == Activity.RESULT_OK*/) { + + when (resultCode) { + Activity.RESULT_OK -> { + val place = data?.let { Autocomplete.getPlaceFromIntent(it) } + + /* println("aaaaaaa Place: " + place?.name + ", " + place?.id) + binding.etAddress.setText(place?.address.toString()) + + address = place?.address.toString() + lat = place?.latLng?.latitude.toString() + lng = place?.latLng?.longitude.toString()*/ + + // val place = Autocomplete.getPlaceFromIntent(data!!) + binding.etLocation.setText(getAddress(place!!)) + + saveAddress.locationName = binding.etLocation.text.toString() + saveAddress.long = place.latLng?.longitude + saveAddress.lat = place.latLng?.latitude + + isPlacePicker = true + mMap?.moveCamera(CameraUpdateFactory.newLatLng(place.latLng!!)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + } + + AutocompleteActivity.RESULT_ERROR -> { + var status = data?.let { Autocomplete.getStatusFromIntent(it) } + } + AutocompleteActivity.RESULT_CANCELED -> { + // The user canceled the operation. + } + } + + } + } + + + override fun onCameraChange(cameraPosition: CameraPosition) { + if (!isPlacePicker) { + val latLng = mMap?.cameraPosition?.target + + saveAddress.long = latLng?.longitude + saveAddress.lat = latLng?.latitude + saveAddress.locationName = getAddress() + binding.etLocation.setText(saveAddress.locationName) + // binding.etLocation.setText(getAddressFromLatLong(this@AddAddressActivity, latLng?.longitude!!.toDouble(), latLng?.longitude!!.toDouble())) + } + isPlacePicker = false + } + + override fun onMapReady(googleMap: GoogleMap) { + mMap = googleMap + mMap?.isTrafficEnabled = false + mMap?.setOnCameraChangeListener(this) + + // mMap?.isMyLocationEnabled = true + mMap?.uiSettings?.isMyLocationButtonEnabled = true + if (saveAddress.lat != null && saveAddress.long != null) { + // binding.etLocation.setText(saveAddress.locationName) + binding.etLocation.setText(getAddressFromLatLong(this@AddAddressActivity, saveAddress.lat!!.toDouble(), saveAddress.long!!.toDouble())) + val current = LatLng(saveAddress.lat ?: 0.0, saveAddress.long ?: 0.0) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(current)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } /*else if (BuildConfig.FLAVOR == "homeDoctor") { + *//*Default to Saudi Arabia*//* + val current = LatLng(23.8859, 45.0792) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(current)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(6f)) + }*/ + } + + @SuppressLint("MissingPermission") + private fun getLastLocation() { + if (checkPermissions()) { + if (isLocationEnabled()) { + mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task -> + val mLastLocation: Location? = task.result + if (mLastLocation != null) { + val latLng = LatLng(mLastLocation.latitude, mLastLocation.longitude) + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(latLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + saveAddress.long = latLng.longitude + saveAddress.lat = latLng.latitude + saveAddress.locationName = getAddress() + + // binding.etLocation.setText(saveAddress.locationName) + binding.etLocation.setText(getAddressFromLatLong(this@AddAddressActivity, saveAddress.lat!!.toDouble(), saveAddress.long!!.toDouble())) + } + } + requestNewLocationData() + } else { + Toast.makeText(this, R.string.we_will_need_your_location, Toast.LENGTH_LONG).show() + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + } else { + getLocationWithPermissionCheck() + } + } + + private fun checkPermissions(): Boolean { + if (ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + return true + } + return false + } + + + @SuppressLint("MissingPermission") + private fun requestNewLocationData() { + runOnUiThread { + val mLocationRequest = LocationRequest.create().apply { + interval = 0 + fastestInterval = 0 + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + numUpdates = 1 + } + + //mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, + Looper.myLooper()) + + } + } + + private val mLocationCallback = object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult) { + val mLastLocation: Location = locationResult.lastLocation + val latLng = LatLng(mLastLocation.latitude, mLastLocation.longitude) + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(latLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + saveAddress.long = latLng.longitude + saveAddress.lat = latLng.latitude + saveAddress.locationName = getAddress() + + // binding.etLocation.setText(saveAddress.locationName) + binding.etLocation.setText(getAddressFromLatLong(this@AddAddressActivity, saveAddress.lat!!.toDouble(), saveAddress.long!!.toDouble())) + // binding.etLocation.setText(getAddressFromLatLong(this@AddAddressActivity, saveAddress.lat!!, saveAddress.long!!)) + //placeLatLng = LatLng(30.7457, 76.7332) + } + } + + private fun getAddressFromLatLong(context: Context, latitude: Double, longitude: Double): String? { + val geocoder = Geocoder(context, Locale.getDefault()) + return try { + val addresses = geocoder.getFromLocation(latitude, longitude, 1) + if (!addresses.isNullOrEmpty()) { + val address = addresses[0] + "${address.getAddressLine(0)}" + } else { + "" + } + } catch (e: Exception) { + e.printStackTrace() + "" + } + } + + private fun isLocationEnabled(): Boolean { + val locationManager: LocationManager = + getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER) + } + + + /* private fun getAddress(): String { + var locationName = "" + val addresses: List

= geoCoder.getFromLocation(saveAddress.lat ?: 0.0, + saveAddress.long ?: 0.0, 1)!! // Here 1 represent max location result to returned, by documents it recommended 1 to 5 + + if (addresses.isNotEmpty()) { + locationName = when { + addresses[0].getAddressLine(0) != null -> addresses[0].getAddressLine(0) + addresses[0].featureName != null -> addresses[0].featureName + addresses[0].locality != null -> addresses[0].locality + else -> addresses[0].adminArea + } + } + + return locationName + }*/ + + + private fun getAddress(): String { + var locationName = "" + try { + val addresses: List
? = geoCoder.getFromLocation( + saveAddress.lat ?: 0.0, + saveAddress.long ?: 0.0, + 1 + ) + + if (!addresses.isNullOrEmpty()) { + val address = addresses[0] + locationName = when { + address.getAddressLine(0) != null -> address.getAddressLine(0) + address.featureName != null -> address.featureName + address.locality != null -> address.locality + else -> address.adminArea.orEmpty() + } + } + } catch (e: IOException) { + e.printStackTrace() + locationName = "Service unavailable. Please try again later." + } + return locationName + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.ACCESS_FINE_LOCATION) + fun getLocation() { + if (saveAddress.lat == null) + getLastLocation() + } + + @OnShowRationale(Manifest.permission.ACCESS_FINE_LOCATION) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.we_will_need_your_location, request) + } + + @OnNeverAskAgain(Manifest.permission.ACCESS_FINE_LOCATION) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + this, + R.string.we_will_need_your_location) + } + + @OnPermissionDenied(Manifest.permission.ACCESS_FINE_LOCATION) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + this, R.string.we_will_need_your_location) + } + + companion object { + const val EXTRA_ADDRESS = "EXTRA_ADDRESS" + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/location/LocationFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/location/LocationFragment.kt new file mode 100644 index 0000000..9d91f0f --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/location/LocationFragment.kt @@ -0,0 +1,104 @@ +package com.consultantapp.ui.dashboard.location + +import android.Manifest +import android.app.Activity +import android.content.pm.PackageManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.app.ActivityCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.FragmentLocationBinding +import com.consultantapp.utils.PermissionUtils +import com.consultantapp.utils.PrefsManager +import dagger.android.support.DaggerFragment +import permissions.dispatcher.* +import javax.inject.Inject + +@RuntimePermissions +class LocationFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentLocationBinding + + private var rootView: View? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_location, container, false) + rootView = binding.root + + initialise() + listeners() + } + return rootView + } + + private fun initialise() { + + + } + + + private fun listeners() { + binding.tvSkip.setOnClickListener { + requireActivity().finish() + } + + binding.tvUseLocation.setOnClickListener { + getLocationWithPermissionCheck() + } + + } + + private fun checkPermissions() { + if (ActivityCompat.checkSelfPermission(requireContext(), + Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission( + requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + + } else { + getLocationWithPermissionCheck() + } + } + + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun getLocation() { + checkPermissions() + } + + @OnShowRationale(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.we_will_need_your_location, request) + } + + @OnNeverAskAgain(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.we_will_need_your_location) + } + + @OnPermissionDenied(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.we_will_need_your_location) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/settings/PagesAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/settings/PagesAdapter.kt new file mode 100644 index 0000000..94aea0b --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/settings/PagesAdapter.kt @@ -0,0 +1,69 @@ +package com.consultantapp.ui.dashboard.settings + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Page +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagesTitleBinding +import com.consultantapp.databinding.ItemPagingLoaderBinding + + +class PagesAdapter(private val fragment: SettingsFragment, private val items: List) : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_pages_title, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: ItemPagesTitleBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.itemClicked(adapterPosition) + } + } + + fun bind(item: Page) = with(binding) { + ivIcon.setImageResource(item.icon ?: R.drawable.ic_info) + tvPage.text = item.title + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/settings/SettingsFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/settings/SettingsFragment.kt new file mode 100644 index 0000000..661a1aa --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/settings/SettingsFragment.kt @@ -0,0 +1,295 @@ +package com.consultantapp.ui.dashboard.settings + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appFeatures +import com.consultantapp.data.models.responses.Page +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.ProviderType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentSettingsBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.dashboard.home.BannerViewModel +import com.consultantapp.ui.dashboard.settings.idcard.IdCardFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class SettingsFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSettingsBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelBanner: BannerViewModel + + private var items = ArrayList() + + private lateinit var adapter: PagesAdapter + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_settings, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + setUserProfile() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelBanner = ViewModelProvider(this, viewModelFactory)[BannerViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + } + + private fun setAdapter() { + items.clear() + + items.add(Page(title = getString(R.string.account_setting), icon = R.drawable.ic_profile_setting)) + when (BuildConfig.FLAVOR) { + "homeDoctor" -> items.add(Page(title = getString(R.string.bank_info), icon = R.drawable.ic_bank)) + "clouddoc" -> items.add(Page(title = getString(R.string.id_card), icon = R.drawable.ic_id_card)) + "nurseLynx" -> items.add(Page(title = getString(R.string.contacts), icon = R.drawable.ic_contacts)) + } + + if (userRepository.getUser()?.provider_type == ProviderType.email) + items.add(Page(title = getString(R.string.change_password), icon = R.drawable.ic_password)) + if (appFeatures.needLanguageScreen) + items.add(Page(title = getString(R.string.language), icon = R.drawable.ic_language)) + + items.add(Page(title = getString(R.string.history), icon = R.drawable.ic_history)) + items.add(Page(title = getString(R.string.notification), icon = R.drawable.ic_notification_drawer)) + items.add(Page(title = getString(R.string.invite_people), icon = R.drawable.ic_invite)) + if (appFeatures.needPackage){ + items.add(Page(title = getString(R.string.packages), icon = R.drawable.ic_packages)) + } + + + + if (BuildConfig.FLAVOR!="taradoc") { + /* appClientDetails.pages?.forEach { + items.add( + Page( + title = it.title, + slug = it.slug, + app_type = it.app_type, + icon = R.drawable.ic_info + ) + ) + }*/ + } + + items.add(Page(title = getString(R.string.logout), icon = R.drawable.ic_logout)) + + adapter = PagesAdapter(this, items) + binding.rvPages.adapter = adapter + } + + private fun setUserProfile() { + val userData = userRepository.getUser() + + binding.tvName.text = userData?.name + binding.tvAge.text = + "${getString(R.string.age)} ${getAge(userData?.profile?.dob)}" + loadImage("profile",binding.ivPic, userData?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.tvVersion.text = getString(R.string.version, getVersion(requireActivity()).versionName) + + binding.tvLocation.hideShowView(BuildConfig.FLAVOR=="taradoc" && !(userData?.profile?.city.isNullOrEmpty())) + binding.tvLocation.text = userData?.profile?.city ?: "" + + } + + private fun listeners() { + binding.ivPic.setOnClickListener { + val itemImages = java.util.ArrayList() + // itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, userRepository.getUser()?.profile_image)) + itemImages.add( userRepository.getUser()?.profile_image.toString()) + viewImageFull(requireActivity(), itemImages, 0) + } + + binding.tvName.setOnClickListener { + goToProfile() + } + + binding.tvWallet.setOnClickListener { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.WALLET)) + } + } + + fun itemClicked(pos: Int) { + when (items[pos].title) { + getString(R.string.account_setting) -> { + goToProfile() + } + getString(R.string.id_card) -> { + if (isConnectedToInternet(requireContext(), true)) + viewModelBanner.subscriptions(HashMap()) + } + getString(R.string.bank_info) -> { + openScreen(DrawerActivity.BANK_INFO) + } + getString(R.string.change_password) -> { + openScreen(DrawerActivity.CHANGE_PASSWORD) + } + getString(R.string.language) -> { + openScreen(DrawerActivity.LANGUAGE_SCREEN) + } + getString(R.string.history) -> { + openScreen(DrawerActivity.HISTORY) + } + getString(R.string.notification) -> { + openScreen(DrawerActivity.NOTIFICATION) + } + getString(R.string.invite_people) -> { + shareContent("Check out this NurseLynx User App: ", "https://play.google.com/store/apps/details?id=com.nurseLynx.user") + // shareDeepLink(DeepLink.INVITE, requireActivity(), userRepository.getUser()) + } + getString(R.string.packages) -> { + openScreen(DrawerActivity.SUBSCRIPTION) + } + getString(R.string.logout) -> { + showLogoutDialog() + } + getString(R.string.contacts) -> { + openScreen(DrawerActivity.CONTACT_LIST) + } + else -> { + openPageLink(requireContext(), items[pos].title, items[pos].slug, items[pos].app_type) + } + } + } + + + private fun shareContent(text: String, url: String) { + val shareIntent = Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, "$text\n$url") + } + + try { + startActivity(Intent.createChooser(shareIntent, "Share via")) + } catch (e: Exception) { + Toast.makeText(requireContext(), "No apps available to share.", Toast.LENGTH_SHORT).show() + } + } + + private fun goToProfile() { + registerActivityResult.launch(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.PROFILE)) + } + + private fun openScreen(page: String) { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, page)) + } + + private fun showLogoutDialog() { + AlertDialogUtil.instance.createOkCancelDialog( + requireContext(), R.string.logout, + R.string.logout_dialog_message, R.string.yes, R.string.no, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + viewModel.logout() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun bindObservers() { + viewModel.logout.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + logoutUser(requireActivity(), prefsManager) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelBanner.subscriptions.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (it.data?.active_plan == true) { + val fragment = IdCardFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } else { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.no_available)) + .setMessage(getString(R.string.no_available_desc)) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + }.show() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + setUserProfile() + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactListAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactListAdapter.kt new file mode 100644 index 0000000..fe99859 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactListAdapter.kt @@ -0,0 +1,70 @@ +package com.consultantapp.ui.dashboard.settings.contactlist + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.ContactEmergency +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemContactBinding + + +class ContactListAdapter(private val fragment: ContactListFragment, private val items: ArrayList) : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_contact, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemContactBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.ivDelete.setOnClickListener { + fragment.deleteContact(items[bindingAdapterPosition]) + } + + binding.contactList.setOnClickListener { + fragment.callContact(items[bindingAdapterPosition]) + } + } + + fun bind(item: ContactEmergency) = with(binding) { + tvName.text = item.name + + var phoneNumbers = "" + item.phone_numbers?.forEach { + // phoneNumbers += "${it.type_label} ${it.phone}\n" + phoneNumbers += "${it.phone}\n" + } + + tvPhoneNumberV.text = phoneNumbers.removeSuffix("\n") + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactListFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactListFragment.kt new file mode 100644 index 0000000..570c3d7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactListFragment.kt @@ -0,0 +1,413 @@ +package com.consultantapp.ui.dashboard.settings.contactlist + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Bundle +import android.provider.ContactsContract +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.ContactEmergency +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.onegravity.contactpicker.contact.Contact +import com.onegravity.contactpicker.contact.ContactDescription +import com.onegravity.contactpicker.contact.ContactSortOrder +import com.onegravity.contactpicker.core.ContactPickerActivity +import com.onegravity.contactpicker.picture.ContactPictureType +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + + +class ContactListFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: ContactViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: ContactListAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private val REQUEST_CALL_PERMISSION : Int = 121 + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ContactViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.tvHeader.text = getString(R.string.contacts) + binding.tvAdd.visible() + + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_contact) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_contact_desc) + } + + private fun setAdapter() { + adapter = ContactListAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvAdd.setOnClickListener { + if (checkContactPermission()) + pickContact() + else + requestContactPermission() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.contactList(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.contactList.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.contacts ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModel.addContact.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.deletContact.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == AppRequestCode.REQUEST_CONTACT && resultCode == Activity.RESULT_OK && + data != null && data.hasExtra(ContactPickerActivity.RESULT_CONTACT_DATA)) { + + // Process contacts + val contacts = data.getSerializableExtra(ContactPickerActivity.RESULT_CONTACT_DATA) as? List + contacts?.forEach { contact -> + // Process each contact + hitApiContacts(contacts) + } + +// // Process groups +// val groups = data.getSerializableExtra(ContactPickerActivity.RESULT_GROUP_DATA) as? List +// groups?.forEach { group -> +// // Process each group +// } + } + } + +// override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +// super.onActivityResult(requestCode, resultCode, data) +// if (resultCode == Activity.RESULT_OK) { +// when (requestCode) { +// AppRequestCode.SELECT_CONTACT -> { +// /* val results: List = MultiContactPicker.obtainResult(data) +// Log.d("MyTag", Gson().toJson(results).toString()) +// +// hitApiContacts(results)*/ +// } +// } +// } + + + /*if (requestCode === AppRequestCode.REQUEST_CONTACT ( + ContactPickerActivity.RESULT_CONTACT_DATA + ) + ) { + // we got a result from the contact picker + + // process contacts + + val contacts = + attr.data.getSerializableExtra(ContactPickerActivity.RESULT_CONTACT_DATA) as List + for (contact in contacts) { + // process the contacts... + } + + val results: List = data.data + Log.d("MyTag", Gson().toJson(results).toString()) + + hitApiContacts(results) + }*/ + + // } + + private fun hitApiContacts(contacts: List) { + if (isConnectedToInternet(requireContext(), true)) { + val contactList = ContactEmergency() + contactList.contacts = ArrayList() + contacts.forEach { + val contact = ContactEmergency() + contact.name = it.displayName + contact.phone_numbers = ArrayList() + it.mapPhone.forEach { + contact.phone_numbers?.add(ContactEmergency(phone = it.toString().replace("2=",""), type_label = it.toString().replace("2=",""))) + Log.e("phone_numberdcefv", it.toString().replace("2=","")) + } + + contactList.contacts?.add(contact) + + } + viewModel.addContact(contactList) + } + } + + fun deleteContact(contact: ContactEmergency) { + if (isConnectedToInternet(requireContext(), true)) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.delete)) + .setMessage(getString(R.string.delete_contact, contact.name)) + .setPositiveButton(getString(R.string.delete)) { dialog, which -> + val hashMap = HashMap() + hashMap["id"] = contact.id ?: "" + viewModel.deletContact(hashMap) + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + + fun callContact(contact: ContactEmergency) { + if (isConnectedToInternet(requireContext(), true)) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.call)) + .setMessage(getString(R.string.call_contact, contact.name)) + .setPositiveButton(getString(R.string.yes)) { dialog, which -> + val phoneNumber = "tel:"+contact.phone_numbers?.get(0)?.phone.toString() + val callIntent = Intent(Intent.ACTION_CALL).apply { + data = Uri.parse(phoneNumber) + } + + if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { + startActivity(callIntent) + } else { + ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.CALL_PHONE), REQUEST_CALL_PERMISSION) + } + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_CALL_PERMISSION) { + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + // Permission granted, retry the call + } else { + Toast.makeText(requireContext(), "Permission denied to make calls", Toast.LENGTH_SHORT).show() + } + } + } + + + + private fun checkContactPermission(): Boolean { + //check if permission was granted/allowed or not, returns true if granted/allowed, false if not + return ContextCompat.checkSelfPermission(requireContext(), + android.Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED + } + + private fun requestContactPermission() { + //request the READ_CONTACTS permission + val permission = arrayOf(android.Manifest.permission.READ_CONTACTS) + ActivityCompat.requestPermissions(requireActivity(), permission, 100) + } + + private fun pickContact() { + //intent ti pick contact + /* MultiContactPicker.Builder(this@ContactListFragment) //Activity/fragment context + .theme(R.style.AppTheme) //Optional - default: MultiContactPicker.Azure + .hideScrollbar(false) //Optional - default: false + .showTrack(true) //Optional - default: true + .searchIconColor(Color.WHITE) //Option - default: White + .setChoiceMode(MultiContactPicker.CHOICE_MODE_MULTIPLE) //Optional - default: CHOICE_MODE_MULTIPLE + .handleColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) //Optional - default: Azure Blue + .bubbleColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) //Optional - default: Azure Blue + .bubbleTextColor(Color.WHITE) //Optional - default: White + .setTitleText(getString(R.string.select_contacts)) //Optional - default: Select Contacts + .setSelectedContacts("10", "5") //Optional - will pre-select contacts of your choice. String... or List + .setLoadingType(MultiContactPicker.LOAD_ASYNC) //Optional - default LOAD_ASYNC (wait till all loaded vs stream results) + .limitToColumn(LimitColumn.NONE) //Optional - default NONE (Include phone + email, limiting to one can improve loading time) + .setActivityAnimations(android.R.anim.fade_in, android.R.anim.fade_out, + android.R.anim.fade_in, + android.R.anim.fade_out) //Optional - default: No animation overrides + .showPickerForResult(AppRequestCode.SELECT_CONTACT)*/ + + + val intent: Intent = Intent(requireActivity(), ContactPickerActivity::class.java) +// .putExtra( +// ContactPickerActivity.EXTRA_THEME, +// if (mDarkTheme) R.style.Theme_Dark else com.consultantapp.R.style.Theme_Light +// ) + .putExtra(ContactPickerActivity.EXTRA_WITH_GROUP_TAB, false) + .putExtra(ContactPickerActivity.EXTRA_CONTACT_BADGE_TYPE, ContactPictureType.ROUND.name) + .putExtra(ContactPickerActivity.EXTRA_SHOW_CHECK_ALL, true) + .putExtra( + ContactPickerActivity.EXTRA_CONTACT_DESCRIPTION, + ContactDescription.ADDRESS.name + ) + .putExtra( + ContactPickerActivity.EXTRA_CONTACT_DESCRIPTION_TYPE, + ContactsContract.CommonDataKinds.Email.TYPE_WORK + ) + .putExtra( + ContactPickerActivity.EXTRA_CONTACT_SORT_ORDER, + ContactSortOrder.AUTOMATIC.name + ) + startActivityForResult(intent, AppRequestCode.REQUEST_CONTACT) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactViewModel.kt b/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactViewModel.kt new file mode 100644 index 0000000..cc9d460 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/settings/contactlist/ContactViewModel.kt @@ -0,0 +1,120 @@ +package com.consultantapp.ui.dashboard.settings.contactlist + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.models.responses.ContactEmergency +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class ContactViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val contactList by lazy { SingleLiveEvent>() } + + val sendMessage by lazy { SingleLiveEvent>() } + + val addContact by lazy { SingleLiveEvent>() } + + val deletContact by lazy { SingleLiveEvent>() } + + fun contactList(hashMap: HashMap) { + contactList.value = Resource.loading() + + webService.contactList(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + contactList.value = Resource.success(response.body()?.data) + } else { + contactList.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + contactList.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addContact(contactList: ContactEmergency) { + addContact.value = Resource.loading() + + webService.addContact(contactList) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addContact.value = Resource.success(response.body()?.data) + } else { + addContact.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addContact.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun sendMessage() { + sendMessage.value = Resource.loading() + + webService.sendMessage() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + sendMessage.value = Resource.success(response.body()?.data) + } else { + sendMessage.value = Resource.error(ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + sendMessage.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun deletContact(hashMap: HashMap) { + deletContact.value = Resource.loading() + + webService.deletContact(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + deletContact.value = Resource.success(response.body()?.data) + } else { + deletContact.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + deletContact.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/settings/idcard/IdCardFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/settings/idcard/IdCardFragment.kt new file mode 100644 index 0000000..c6f6802 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/settings/idcard/IdCardFragment.kt @@ -0,0 +1,71 @@ +package com.consultantapp.ui.dashboard.settings.idcard + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.DialogIdCardBinding +import com.consultantapp.utils.DateFormat +import com.consultantapp.utils.DateUtils +import com.consultantapp.utils.loadImage +import dagger.android.support.DaggerDialogFragment +import javax.inject.Inject + + +class IdCardFragment : DaggerDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: DialogIdCardBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.dialog_id_card, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + } + + private fun initialise() { + val userData = userRepository.getUser() + + loadImage("profile",binding.ivPic, userData?.profile_image, + R.drawable.ic_profile_placeholder) + binding.tvNameV.text = userData?.name + + binding.tvEmailV.text = userData?.email ?: getString(R.string.na) + binding.tvPhoneV.text = "${userData?.country_code ?: ""} ${userData?.phone ?: ""}" + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.tvDobV.text = DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "") + + } + + +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/subcategory/SubCategoryAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/subcategory/SubCategoryAdapter.kt new file mode 100644 index 0000000..e7bba1f --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/subcategory/SubCategoryAdapter.kt @@ -0,0 +1,138 @@ +package com.consultantapp.ui.dashboard.subcategory + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.* +import com.consultantapp.utils.loadImage + + +class SubCategoryAdapter(private val fragment: SubCategoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (BuildConfig.FLAVOR) { + "heal", "homeDoctor", "taradoc" -> (holder as ViewHolderCenter).bind(items[position]) + "" -> (holder as ViewHolderReverse).bind(items[position]) + else -> (holder as ViewHolder).bind(items[position]) + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + when (BuildConfig.FLAVOR) { + "heal", "homeDoctor", "taradoc" -> + ViewHolderCenter(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_subcategory, parent, false)) + "" -> ViewHolderReverse(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_category_reverse, parent, false)) + else -> ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_category, parent, false)) + } + + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemCategoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + } + + fun bind(item: Categories) = with(binding) { + + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + tvName.text = item.name + loadImage("tag",binding.ivCategory, item.image, 0) + } + } + + inner class ViewHolderReverse(val binding: RvItemCategoryReverseBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + } + + fun bind(item: Categories) = with(binding) { + + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + tvName.text = item.name + loadImage("tag",binding.ivCategory, item.image,0) + } + } + + inner class ViewHolderCenter(val binding: RvItemSubcategoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + } + + fun bind(item: Categories) = with(binding) { + + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + tvName.text = item.name + loadImage("tag",binding.ivCategory, item.image,0) + } + } + + inner class ViewHolderFullCard(val binding: RvItemCategoryCardBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.clickItem(items[absoluteAdapterPosition]) + } + } + + fun bind(item: Categories) = with(binding) { + tvName.text = item.name + loadImage("tag",binding.ivCategory, item.image, 0) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/subcategory/SubCategoryFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/subcategory/SubCategoryFragment.kt new file mode 100644 index 0000000..87c89f2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/subcategory/SubCategoryFragment.kt @@ -0,0 +1,276 @@ +package com.consultantapp.ui.dashboard.subcategory + +import android.app.Activity +import android.app.AlertDialog +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Banner +import com.consultantapp.data.models.responses.Categories +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentSubCategoryBinding +import com.consultantapp.ui.adapter.CommonFragmentPagerAdapter +import com.consultantapp.ui.classes.ClassesViewModel +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.dashboard.home.BannerViewModel +import com.consultantapp.ui.dashboard.home.banner.BannerFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class SubCategoryFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSubCategoryBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var viewModelBanner: BannerViewModel + + private var items = ArrayList() + + private lateinit var adapter: SubCategoryAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var categoryData: Categories? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_sub_category, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + viewModelBanner = ViewModelProvider(this, viewModelFactory)[BannerViewModel::class.java] + + binding.rvListing.layoutManager = GridLayoutManager(requireContext(), 2) + categoryData = requireActivity().intent.getSerializableExtra(CATEGORY_PARENT_ID) as Categories + + binding.tvConsult.text = categoryData?.name + } + + private fun setAdapter() { + adapter = SubCategoryAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + + if (isConnectedToInternet(requireContext(), true)) { + var hashMap = HashMap() + if (!requireActivity().intent.getBooleanExtra(CLASSES_PAGE, false)) { + hashMap["category_id"] = categoryData?.id ?: "" + if (requireActivity().intent.getStringExtra(EXTRA_NAME) != DrawerActivity.MY_QUESTION) + viewModelBanner.coupons(hashMap) + } + + + hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["parent_id"] = categoryData?.id ?: "" + + viewModel.categories(hashMap) + } + } + + private fun bindObservers() { + viewModel.categories.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + isLoadingMoreItems = false + + val tempList = it.data?.classes_category ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + + viewModelBanner.coupons.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + val itemsBanner = ArrayList() + itemsBanner.addAll(it.data?.coupons ?: emptyList()) + + val adapter = CommonFragmentPagerAdapter(requireActivity().supportFragmentManager) + itemsBanner.forEach { + adapter.addTab("", BannerFragment(this, it)) + } + binding.viewPagerBanner.adapter = adapter + binding.pageIndicatorView.setViewPager(binding.viewPagerBanner) + + if (itemsBanner.isNotEmpty()) + slideItem(binding.viewPagerBanner, requireContext()) + + binding.viewPagerBanner.hideShowView(itemsBanner.isNotEmpty()) + binding.pageIndicatorView.hideShowView(itemsBanner.size > 1) + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + + fun clickItem(item: Categories?) { + when { + item?.is_subcategory == true -> { + registerActivityResult.launch(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.SUB_CATEGORY) + .putExtra(EXTRA_NAME, requireActivity().intent.getStringExtra(EXTRA_NAME)) + .putExtra(CLASSES_PAGE, requireActivity().intent.getBooleanExtra(CLASSES_PAGE, false)) + .putExtra(CATEGORY_PARENT_ID, item)) + } + requireActivity().intent.getStringExtra(EXTRA_NAME) == DrawerActivity.MY_QUESTION -> { + registerActivityResult.launch(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ASK_QUESTION) + .putExtra(CATEGORY_PARENT_ID, item)) + } + requireActivity().intent.getBooleanExtra(CLASSES_PAGE, false) -> { + if (userRepository.getUser() == null) { + val fragment = WelcomeFragment() + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } else { + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES) + .putExtra(CATEGORY_PARENT_ID, item)) + } + } + else -> { + startActivity(Intent(requireContext(), DoctorListActivity::class.java) + .putExtra(CATEGORY_PARENT_ID, item)) + } + } + } + + + fun showInformationDialog(item: Categories?) { + AlertDialog.Builder(context) + .setTitle(item?.name) + .setMessage(item?.description) + .setPositiveButton(R.string.ok) { dialog, which -> + dialog.dismiss() + } + .setCancelable(true) + .show() + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + } + + companion object { + const val CATEGORY_PARENT_ID = "CATEGORY_PARENT_ID" + const val CLASSES_PAGE = "CLASSES_PAGE" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionAdapter.kt new file mode 100644 index 0000000..b62c462 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionAdapter.kt @@ -0,0 +1,75 @@ +package com.consultantapp.ui.dashboard.subscription + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Packages +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemSubscriptionItemBinding +import com.consultantapp.utils.hideShowView +import com.consultantapp.utils.loadImage + + +class SubscriptionAdapter( + private val fragment: SubscriptionListFragment, + private val items: ArrayList +) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_subscription_item, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemSubscriptionItemBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.ivImage.setOnClickListener { + fragment.onItemClick(adapterPosition) + } + } + + fun bind(item: Packages) = with(binding) { + loadImage("tag",ivImage, item.image, R.drawable.image_placeholder) + + tvStatus.hideShowView(item.subscribe == true) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionDetailFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionDetailFragment.kt new file mode 100644 index 0000000..615d8b5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionDetailFragment.kt @@ -0,0 +1,247 @@ +package com.consultantapp.ui.dashboard.subscription + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Packages +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentSubscriptionDetailsBinding +import com.consultantapp.ui.dashboard.home.BannerViewModel +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class SubscriptionDetailFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSubscriptionDetailsBinding + + private var rootView: View? = null + + private lateinit var viewModelBanner: BannerViewModel + + private lateinit var progressDialog: ProgressDialog + + private var packages: Packages? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_subscription_details, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + viewModelBanner = ViewModelProvider(this, viewModelFactory)[BannerViewModel::class.java] + + packages = arguments?.getSerializable(EXTRA_NAME) as Packages + + /*get package details*/ + when (BuildConfig.FLAVOR) { + "clouddoc" -> { + val hashMap = HashMap() + hashMap["plan_id"] = packages?.id ?: "" + viewModelBanner.subscriptionDetail(hashMap) + } + else -> { + val hashMap = HashMap() + hashMap["package_id"] = packages?.id ?: "" + viewModelBanner.packDetail(hashMap) + } + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.btnBuy.setOnClickListener { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.buy_subscriptions)) + .setMessage(getString(R.string.buy_subscriptions)) + .setPositiveButton(getString(R.string.buy_subscriptions)) { dialog, which -> + when (BuildConfig.FLAVOR) { + "clouddoc" -> { + val hashMap = HashMap() + hashMap["plan_id"] = packages?.id ?: "" + viewModelBanner.subscriptionPack(hashMap) + } + else -> { + val hashMap = HashMap() + hashMap["plan_id"] = packages?.id ?: "" + viewModelBanner.purchasePack(hashMap) + } + } + + }.setNegativeButton(getString(R.string.cancel)) { dialog, which -> + + }.show() + } + } + + private fun bindObservers() { + viewModelBanner.packDetail.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + packages = it.data?.detail + setData() + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModelBanner.subscriptionDetail.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + packages = it.data?.detail + setData() + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModelBanner.purchasePack.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*If amount not sufficient then add money*/ + if (it.data?.amountNotSufficient == true) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.added_to_wallet)) + .setMessage(getString(R.string.money_insufficient)) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + } + .setNegativeButton(getString(R.string.add_money)) { dialog, which -> + startActivity( + Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.WALLET)) + }.show() + + } else { + requireActivity().longToast(getString(R.string.added_subscriptions)) + requireActivity().setResult(Activity.RESULT_OK) + + binding.btnBuy.gone() + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelBanner.subscriptionPack.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*If amount not sufficient then add money*/ + if (it.data?.amountNotSufficient == true) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.added_to_wallet)) + .setMessage(getString(R.string.money_insufficient)) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + + } + .setNegativeButton(getString(R.string.add_money)) { dialog, which -> + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.WALLET)) + }.show() + + } else { + requireActivity().longToast(getString(R.string.added_subscriptions)) + requireActivity().setResult(Activity.RESULT_OK) + + binding.btnBuy.gone() + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + binding.tvTitle.text = packages?.title + val request = if (packages?.subscribe == true) + "${getString(R.string.available_request_s, packages?.available_requests)} " + + "\n${getString(R.string.exp_on,DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, packages?.expired_on_plan))}" + else + getString(R.string.total_request_s, packages?.total_requests) + + binding.tvPrice.text = "${getString(R.string.price_ss, packages?.price)}\n$request" + + binding.tvDesc.text = packages?.description + + + if (packages?.subscribe == true) + binding.btnBuy.gone() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionListAdapter.kt b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionListAdapter.kt new file mode 100644 index 0000000..9694aa4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionListAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantapp.ui.dashboard.subscription + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemSubscriptionBinding + + +class SubscriptionListAdapter(private val fragment: SubscriptionListFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_subscription, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemSubscriptionBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvName.setOnClickListener { + fragment.onItemClick(adapterPosition) + } + } + + fun bind(item: String) = with(binding) { + tvName.text = item + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionListFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionListFragment.kt new file mode 100644 index 0000000..eb4a691 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/subscription/SubscriptionListFragment.kt @@ -0,0 +1,197 @@ +package com.consultantapp.ui.dashboard.subscription + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Packages +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.dashboard.home.BannerViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class SubscriptionListFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModelBanner: BannerViewModel + + private lateinit var progressDialog: ProgressDialog + + private val items = ArrayList() + + private val itemsSubScription = ArrayList() + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, + container, false) + rootView = binding.root + + initialise() + listeners() + setSubscriptionList() + bindObservers() + } + return rootView + } + + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModelBanner = ViewModelProvider(this, viewModelFactory)[BannerViewModel::class.java] + binding.rvListing.isEnabled = false + } + + private fun setSubscriptionList() { + binding.swipeRefresh.isEnabled = false + when (arguments?.getString(PAGE_TO_OPEN)) { + LIST -> { + binding.tvHeader.text = getString(R.string.subscription) + + items.add(getString(R.string.subscriptions)) + items.add(getString(R.string.packages)) + items.add(getString(R.string.buy_subscriptions)) + items.add(getString(R.string.buy_health_packages)) + val adapter = SubscriptionListAdapter(this, items) + binding.rvListing.adapter = adapter + } + LIST_ITEM -> { + binding.tvHeader.text = arguments?.getString(EXTRA_NAME) + /*Subscriptions*/ + when (BuildConfig.FLAVOR) { + "clouddoc" -> { + viewModelBanner.subscriptions(HashMap()) + } + else -> { + val hashMap = HashMap() + hashMap["type"] = "open" + viewModelBanner.packSub(hashMap) + } + } + } + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + } + + private fun bindObservers() { + viewModelBanner.packSub.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + itemsSubScription.clear() + itemsSubScription.addAll(it.data?.packages ?: emptyList()) + val adapter = SubscriptionAdapter(this, itemsSubScription) + binding.rvListing.adapter = adapter + + binding.clNoData.hideShowView(itemsSubScription.isEmpty()) + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModelBanner.subscriptions.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + itemsSubScription.clear() + itemsSubScription.addAll(it.data?.plans ?: emptyList()) + val adapter = SubscriptionAdapter(this, itemsSubScription) + binding.rvListing.adapter = adapter + + binding.clNoData.hideShowView(itemsSubScription.isEmpty()) + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } + + fun onItemClick(pos: Int) { + when (arguments?.getString(PAGE_TO_OPEN)) { + LIST -> { + val fragment = SubscriptionListFragment() + val bundle = Bundle() + bundle.putString(PAGE_TO_OPEN, LIST_ITEM) + bundle.putString(EXTRA_NAME, items[pos]) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + LIST_ITEM -> { + val fragment = SubscriptionDetailFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_NAME, itemsSubScription[pos]) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + } + } + + companion object { + const val LIST = "LIST" + const val LIST_ITEM = "LIST_ITEM" + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.PACKAGE_UPDATE -> { + /*Subscriptions*/ + val hashMap = HashMap() + hashMap["type"] = "open" + viewModelBanner.packSub(hashMap) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/success/NetworkIssueFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/success/NetworkIssueFragment.kt new file mode 100644 index 0000000..1585ac7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/success/NetworkIssueFragment.kt @@ -0,0 +1,54 @@ +package com.consultantapp.ui.dashboard.success + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.databinding.ItemNoInternetBinding +import com.consultantapp.utils.isConnectedToInternet +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class NetworkIssueFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ItemNoInternetBinding + + private var rootView: View? = null + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.item_no_internet, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + + private fun initialise() { + binding.tvRetry.setOnClickListener { + if (isConnectedToInternet(requireContext(), false)) { + + val intent = Intent() + intent.action = NETWORK_ISSUE + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + + requireActivity().finish() + } + } + } + + companion object { + const val NETWORK_ISSUE = "NETWORK_ISSUE" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/dashboard/success/SuccessFragment.kt b/app/src/main/java/com/consultantapp/ui/dashboard/success/SuccessFragment.kt new file mode 100644 index 0000000..4df3589 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/dashboard/success/SuccessFragment.kt @@ -0,0 +1,128 @@ +package com.consultantapp.ui.dashboard.success + +import android.app.Activity +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.network.PushType +import com.consultantapp.databinding.ItemRequestSuccessBinding +import com.consultantapp.ui.dashboard.doctor.confirm.ConfirmBookingFragment +import com.consultantapp.ui.dashboard.home.addfamily.AddFamilyFragment +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.loginSignUp.changepassword.ChangePasswordFragment +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.utils.EXTRA_REQUEST_ID +import com.consultantapp.utils.PAGE_TO_OPEN +import dagger.android.support.DaggerDialogFragment +import java.util.* +import javax.inject.Inject +import kotlin.concurrent.schedule + + +class SuccessFragment(private val fragment: Fragment) : DaggerDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ItemRequestSuccessBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.item_request_success, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + setTextForMessage() + initialise() + } + + private fun setTextForMessage() { + when (fragment) { + is ConfirmBookingFragment -> { + binding.tvTitle.text = getString(R.string.request_sent) + } + is ChangePasswordFragment -> { + binding.tvTitle.text = getString(R.string.password_changed_successfully) + } + is AddFamilyFragment -> { + binding.tvTitle.text = getString(R.string.family_added_successfully) + } + is InsuranceFragment -> { + binding.tvTitle.text = getString(R.string.family_added_successfully) + } + else -> { + binding.tvTitle.text = getString(R.string.transaction_success) + } + } + } + + private fun initialise() { + binding.animationView.speed = 1.5f + + requireActivity().setResult(Activity.RESULT_OK) + + Timer().schedule(3000) { + when (fragment) { + is ConfirmBookingFragment -> { + val intent = Intent() + intent.action = PushType.BOOKING_RESERVED + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + + when (BuildConfig.FLAVOR) { + "heal","airdoc","meetMd" -> { + startActivity(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.SYMPTOMS) + .putExtra(EXTRA_REQUEST_ID, arguments?.getString(EXTRA_REQUEST_ID))) + } + /*"nurseLynx" -> { + startActivity(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CARE_PLAN) + .putExtra(EXTRA_REQUEST_ID, arguments?.getString(EXTRA_REQUEST_ID))) + }*/ + "clouddoc" -> { + startActivity(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.QUESTION_ANSWER) + .putExtra(EXTRA_REQUEST_ID, arguments?.getString(EXTRA_REQUEST_ID))) + } + } + + requireActivity().finish() + } + is ChangePasswordFragment -> { + requireActivity().finish() + } + is AddFamilyFragment -> { + requireActivity().finish() + } + is InsuranceFragment -> { + requireActivity().finish() + } + } + dialog?.dismiss() + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/DrawerActivity.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/DrawerActivity.kt new file mode 100644 index 0000000..8b92b88 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/DrawerActivity.kt @@ -0,0 +1,185 @@ +package com.consultantapp.ui.drawermenu + +import android.Manifest +import android.content.pm.PackageManager +import android.os.Bundle +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityContainerBinding +import com.consultantapp.ui.classes.CategoriesFragment +import com.consultantapp.ui.classes.ClassesDetailFragment +import com.consultantapp.ui.classes.ClassesFragment +import com.consultantapp.ui.dashboard.appointment.AppointmentFragment +import com.consultantapp.ui.dashboard.appointment.appointmentStatus.CompletedRequestFragment +import com.consultantapp.ui.dashboard.appointment.detail.AppointmentDetailFragment +import com.consultantapp.ui.dashboard.appointment.rating.AddRatingFragment +import com.consultantapp.ui.dashboard.careplan.CarePlanFragment +import com.consultantapp.ui.dashboard.careplan.QuestionAnswerFragment +import com.consultantapp.ui.dashboard.chat.ChatFragment +import com.consultantapp.ui.dashboard.doctor.symptom.SymptomDetailFragment +import com.consultantapp.ui.dashboard.feeds.FeedDetailsFragment +import com.consultantapp.ui.dashboard.feeds.FeedsFragment +import com.consultantapp.ui.dashboard.home.addfamily.AddFamilyFragment +import com.consultantapp.ui.dashboard.home.bank.BankInfoFragment +import com.consultantapp.ui.dashboard.home.healthtool.bmichecker.BmiCheckerFragment +import com.consultantapp.ui.dashboard.home.healthtool.pregnancycalculator.PregnancyCalculatorFragment +import com.consultantapp.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantapp.ui.dashboard.home.healthtool.waterintake.WaterIntakeFragment +import com.consultantapp.ui.dashboard.home.questions.AskQuestionFragment +import com.consultantapp.ui.dashboard.home.questions.QuestionsFragment +import com.consultantapp.ui.dashboard.home.questions.detail.QuestionDetailFragment +import com.consultantapp.ui.dashboard.home.tipofday.TipOfDayFragmentFragment +import com.consultantapp.ui.dashboard.language.LanguageFragment +import com.consultantapp.ui.dashboard.location.LocationFragment +import com.consultantapp.ui.dashboard.settings.contactlist.ContactListFragment +import com.consultantapp.ui.dashboard.subcategory.SubCategoryFragment +import com.consultantapp.ui.dashboard.subscription.SubscriptionListFragment +import com.consultantapp.ui.dashboard.success.NetworkIssueFragment +import com.consultantapp.ui.drawermenu.addmoney.AddCardFragment +import com.consultantapp.ui.drawermenu.history.HistoryFragment +import com.consultantapp.ui.drawermenu.notification.NotificationFragment +import com.consultantapp.ui.drawermenu.profile.ProfileFragment +import com.consultantapp.ui.drawermenu.wallet.WalletFragment +import com.consultantapp.ui.loginSignUp.changepassword.ChangePasswordFragment +import com.consultantapp.ui.walkthrough.WalkThroughFragment +import com.consultantapp.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + +class DrawerActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + lateinit var binding: ActivityContainerBinding + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + } + + private fun initialise() { + binding = DataBindingUtil.setContentView(this, R.layout.activity_container) + + val permissionState = + ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) + if (permissionState == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1) + + } + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + when (intent.getStringExtra(PAGE_TO_OPEN)) { + NETWORK_ERROR -> addFragment(NetworkIssueFragment()) + HISTORY -> addFragment(HistoryFragment()) + CHANGE_PASSWORD -> addFragment(ChangePasswordFragment()) + CATEGORIES -> addFragment(CategoriesFragment()) + SUB_CATEGORY -> addFragment(SubCategoryFragment()) + LANGUAGE_SCREEN -> addFragment(LanguageFragment()) + PROFILE -> addFragment(ProfileFragment()) + NOTIFICATION -> addFragment(NotificationFragment()) + WALLET -> addFragment(WalletFragment()) + REQUEST -> addFragment(AppointmentFragment()) + RATE -> addFragment(AddRatingFragment()) + USER_CHAT -> addFragment(ChatFragment()) + CLASSES -> addFragment(ClassesFragment()) + CLASSES_DETAILS -> addFragment(ClassesDetailFragment()) + LOCATION -> addFragment(LocationFragment()) + ADD_CARD -> addFragment(AddCardFragment()) + SUBSCRIPTION -> { + val fragment = SubscriptionListFragment() + val bundle = Bundle() + bundle.putSerializable(PAGE_TO_OPEN, SubscriptionListFragment.LIST_ITEM) + bundle.putSerializable(EXTRA_NAME, getString(R.string.choose_package)) + fragment.arguments = bundle + + addFragment(fragment) + } + BlogType.BLOG, BlogType.ARTICLE -> addFragment(FeedsFragment()) + BLOGS_DETAILS -> { + val fragment = FeedDetailsFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_REQUEST_ID, intent.getSerializableExtra(EXTRA_REQUEST_ID)) + fragment.arguments = bundle + addFragment(fragment) + } + WalkThroughFragment.WALK_THROUGH_SCREEN -> addFragment(WalkThroughFragment()) + TIP_OF_DAY -> addFragment(TipOfDayFragmentFragment()) + BMI_CHECKER -> addFragment(BmiCheckerFragment()) + WATER_INTAKE -> addFragment(WaterIntakeFragment()) + PROTEIN_INTAKE -> addFragment(ProteinIntakeFragment()) + PREGNANCY_CALCULATOR -> addFragment(PregnancyCalculatorFragment()) + MY_QUESTION -> addFragment(QuestionsFragment()) + ASK_QUESTION -> addFragment(AskQuestionFragment()) + QUESTION_DETAILS -> { + val fragment = QuestionDetailFragment() + val bundle = Bundle() + bundle.putString(EXTRA_REQUEST_ID, intent.getStringExtra(EXTRA_REQUEST_ID)) + fragment.arguments = bundle + + addFragment(fragment) + } + ADD_FAMILY -> addFragment(AddFamilyFragment()) + APPOINTMENT_DETAILS -> addFragment(AppointmentDetailFragment()) + SYMPTOMS -> addFragment(SymptomDetailFragment()) + CARE_PLAN -> addFragment(CarePlanFragment()) + QUESTION_ANSWER -> addFragment(QuestionAnswerFragment()) + BANK_INFO -> addFragment(BankInfoFragment()) + APPROVE_HOUR -> addFragment(CompletedRequestFragment()) + CONTACT_LIST -> addFragment(ContactListFragment()) + } + } + + private fun addFragment(fragment: Fragment) { + addFragment(supportFragmentManager, fragment, R.id.container) + } + + companion object { + const val NETWORK_ERROR = "NETWORK_ERROR" + const val HISTORY = "HISTORY" + const val CHANGE_PASSWORD = "CHANGE_PASSWORD" + const val CATEGORIES = "CATEGORIES" + const val SUB_CATEGORY = "SUB_CATEGORY" + const val LANGUAGE_SCREEN = "LANGUAGE_SCREEN" + const val PROFILE = "PROFILE" + const val NOTIFICATION = "NOTIFICATION" + const val WALLET = "WALLET" + const val SUBSCRIPTION = "SUBSCRIPTION" + const val REQUEST = "REQUEST" + const val USER_CHAT = "USER_CHAT" + const val RATE = "RATE" + const val CLASSES = "CLASSES" + const val CLASSES_DETAILS = "CLASSES_DETAILS" + const val LOCATION = "LOCATION" + const val ADD_CARD = "ADD_CARD" + const val BLOGS_DETAILS = "BLOGS_DETAILS" + const val TIP_OF_DAY = "TIP_OF_DAY" + const val UPDATE_SERVICE = "UPDATE_SERVICE" + const val BMI_CHECKER = "BMI_CHECKER" + const val WATER_INTAKE = "WATER_INTAKE" + const val PROTEIN_INTAKE = "PROTEIN_INTAKE" + const val PREGNANCY_CALCULATOR = "PREGNANCY_CALCULATOR" + const val MY_QUESTION = "MY_QUESTION" + const val ASK_QUESTION = "ASK_QUESTION" + const val QUESTION_DETAILS = "QUESTION_DETAILS" + const val ADD_FAMILY = "ADD_FAMILY" + const val APPOINTMENT_DETAILS="APPOINTMENT_DETAILS" + const val SYMPTOMS = "SYMPTOMS" + const val CARE_PLAN = "CARE_PLAN" + const val QUESTION_ANSWER = "QUESTION_ANSWER" + const val BANK_INFO = "BANK_INFO" + const val APPROVE_HOUR = "APPROVE_HOUR" + const val CONTACT_LIST = "CONTACT_LIST" + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/AddCardFragment.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/AddCardFragment.kt new file mode 100644 index 0000000..b082ff2 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/AddCardFragment.kt @@ -0,0 +1,157 @@ +package com.consultantapp.ui.drawermenu.addmoney + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentAddCardBinding +import com.consultantapp.ui.drawermenu.wallet.WalletViewModel +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class AddCardFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentAddCardBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: WalletViewModel + + private var cardDetails: Wallet? = null + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_add_card, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + val card = binding.cardForm + + if (requireActivity().intent?.hasExtra(CARD_DETAILS) == true) { + binding.tvHeader.text = getString(R.string.edit_card) + cardDetails = requireActivity().intent?.getSerializableExtra(CARD_DETAILS) as Wallet + card.cardRequired(false) + .cvvRequired(false) + + binding.tvCardDetails.visible() + binding.tvCardDetails.text = getString(R.string.card_ending_with, + cardDetails?.card_brand, cardDetails?.last_four_digit) + binding.btnAddCard.text = getString(R.string.update) + } else { + card.cardRequired(true) + .cvvRequired(true) + } + + card.expirationRequired(true) + .setup(requireActivity() as AppCompatActivity) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.btnAddCard.setOnClickListener { + if (binding.cardForm.isValid) { + disableButton(binding.btnAddCard) + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + + hashMap["exp_month"] = binding.cardForm.expirationMonth + hashMap["exp_year"] = binding.cardForm.expirationYear + + if (arguments?.containsKey(CARD_DETAILS) == true) { + hashMap["card_id"] = cardDetails?.id ?: "" + viewModel.updateCard(hashMap) + } else { + hashMap["card_number"] = binding.cardForm.cardNumber + hashMap["cvc"] = binding.cardForm.cvv + viewModel.addCard(hashMap) + } + + + } + } + } + } + + + private fun bindObservers() { + viewModel.addCard.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.updateCard.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + resultFragmentIntent(this, targetFragment ?: this, + AppRequestCode.ADD_MONEY, null) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + companion object { + const val CARD_DETAILS = "CARD_DETAILS" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/AddMoneyActivity.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/AddMoneyActivity.kt new file mode 100644 index 0000000..65a3986 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/AddMoneyActivity.kt @@ -0,0 +1,584 @@ +package com.consultantapp.ui.drawermenu.addmoney + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentAddMoenyBinding +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.ui.drawermenu.addmoney.AddCardFragment.Companion.CARD_DETAILS +import com.consultantapp.ui.drawermenu.wallet.WalletViewModel +import com.consultantapp.ui.webview.WebViewActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.oppwa.mobile.connect.checkout.dialog.CheckoutActivity +import com.oppwa.mobile.connect.checkout.meta.CheckoutSettings +import com.oppwa.mobile.connect.checkout.meta.CheckoutSkipCVVMode +import com.oppwa.mobile.connect.exception.PaymentError +import com.oppwa.mobile.connect.provider.Connect +import com.oppwa.mobile.connect.provider.Transaction +import com.oppwa.mobile.connect.provider.TransactionType +import com.razorpay.Checkout +import com.razorpay.PaymentResultListener +import dagger.android.support.DaggerAppCompatActivity +import org.json.JSONObject +import javax.inject.Inject + + +open class AddMoneyActivity : DaggerAppCompatActivity(), PaymentResultListener { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentAddMoenyBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: WalletViewModel + + private lateinit var adapter: CardsAdapter + + private var items = ArrayList() + + var selectedCardId = "" + + private var order_id: String? = null + + private var paymentFrom = PaymentFrom.STRIPE + + private var listAddAmount = ArrayList() + + //HypEr Pay + var resourcePath: String? = null + private val STATE_RESOURCE_PATH = "STATE_RESOURCE_PATH" + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.fragment_add_moeny) + if (savedInstanceState != null) { + resourcePath = savedInstanceState.getString(STATE_RESOURCE_PATH) + } + initialise() + listeners() + bindObservers() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putString(STATE_RESOURCE_PATH, resourcePath) + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + progressDialog = ProgressDialog(this) + binding.ilPayment.prefixText = getCurrencySymbol() + + + listAddAmount = ArrayList() + if (BuildConfig.FLAVOR == "clouddoc") { + listAddAmount.addAll(listOf(1000, 2000, 3000)) + } else { + listAddAmount.addAll(listOf(500, 1000, 1500)) + } + binding.tvMoney1.text = "+ ${getCurrency(listAddAmount[0].toString())}" + binding.tvMoney2.text = "+ ${getCurrency(listAddAmount[1].toString())}" + binding.tvMoney3.text = "+ ${getCurrency(listAddAmount[2].toString())}" + + /*Get from details*/ + paymentFrom = appClientDetails.payment_type ?: PaymentFrom.STRIPE + //paymentFrom = PaymentFrom.HYPER_PAY + + when (paymentFrom) { + PaymentFrom.STRIPE -> { + binding.tvAddCard.visible() + binding.tvSelectCard.visible() + binding.rvListing.visible() + setAdapter() + if (isConnectedToInternet(this, true)) + viewModel.cardListing(HashMap()) + } + PaymentFrom.RAZOR_PAY -> { + binding.tvAddCard.gone() + loadRazorPay() + } + PaymentFrom.HYPER_PAY -> { + binding.tvAddCard.gone() + } + PaymentFrom.CCA_VENUE -> { + binding.tvAddCard.gone() + } + PaymentFrom.AL_RAJHI_BANK, PaymentFrom.PAYSTACK -> { + binding.tvAddCard.gone() + } + + } + } + + + private fun setAdapter() { + adapter = CardsAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + finish() + } + + binding.tvAddCard.setOnClickListener { + disableButton(binding.tvAddCard) + + startActivityForResult(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_CARD), AppRequestCode.ADD_CARD) + } + + binding.tvPay.setOnClickListener { + disableButton(binding.tvPay) + if (binding.etAmount.text.toString().isEmpty() || binding.etAmount.text.toString() + .toInt() == 0) { + binding.etAmount.showSnackBar(getString(R.string.enter_amount)) + } else if (paymentFrom == PaymentFrom.STRIPE && selectedCardId.isEmpty()) { + binding.etAmount.showSnackBar(getString(R.string.select_card)) + } else { + if (isConnectedToInternet(this, true)) { + when (paymentFrom) { + PaymentFrom.STRIPE -> { + val hashMap = HashMap() + hashMap["balance"] = binding.etAmount.text.toString() + hashMap["card_id"] = selectedCardId + viewModel.addMoney(hashMap) + } + PaymentFrom.AL_RAJHI_BANK, PaymentFrom.PAYSTACK -> { + val hashMap = HashMap() + hashMap["balance"] = binding.etAmount.text.toString() + viewModel.addMoney(hashMap) + } + PaymentFrom.RAZOR_PAY -> { + val hashMap = HashMap() + val amount = (binding.etAmount.text.toString().toInt()) * 100 + hashMap["balance"] = amount.toString() + viewModel.paymentCreateOrder(hashMap) + } + PaymentFrom.HYPER_PAY -> { + val fragment = BottomCardTypeFragment(this) + fragment.show(supportFragmentManager, fragment.tag) + } + + PaymentFrom.CCA_VENUE -> { + //startActivity(Intent(this, InitialScreenActivity::class.java)) + } + } + } + } + } + + binding.tvMoney1.setOnClickListener { + updateMoney(listAddAmount[0]) + } + + binding.tvMoney2.setOnClickListener { + updateMoney(listAddAmount[1]) + } + + binding.tvMoney3.setOnClickListener { + updateMoney(listAddAmount[2]) + } + + } + + private fun updateMoney(amount: Int) { + val newAmount = if (binding.etAmount.text.toString().isEmpty()) + amount + else + binding.etAmount.text.toString().toInt() + amount + + if (newAmount.toString().length < 5) { + binding.etAmount.setText(newAmount.toString()) + } + } + + + fun hyperPayCardType(cardType: String) { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + val amount = (binding.etAmount.text.toString().toInt()) * 100 + hashMap["balance"] = amount.toString() + hashMap["payment_method"] = cardType + + /*User Address*/ + val userAddress = prefsManager.getObject(USER_ADDRESS, SaveAddress::class.java) + if (userAddress != null) { + hashMap["lat"] = (userAddress.lat ?: "").toString() + hashMap["long"] = (userAddress.long ?: "").toString() + } + + viewModel.paymentCreateOrder(hashMap) + } + } + + private fun bindObservers() { + viewModel.addMoney.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*If need authuntication*/ + if (it.data?.requires_source_action == true) { + startActivityForResult(Intent(this, WebViewActivity::class.java) + .putExtra(WebViewActivity.LINK_TITLE, getString(R.string.payment)) + .putExtra(WebViewActivity.PAYMENT_URL, it.data.url) + .putExtra(EXTRA_REQUEST_ID, it.data.transaction_id), + AppRequestCode.ADD_MONEY) + } else { + setResult(Activity.RESULT_OK) + finish() + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cardListing.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + items.clear() + items.addAll(it.data?.cards ?: emptyList()) + if (items.isNotEmpty()) { + items[0].isSelected = true + selectedCardId = items[0].id ?: "" + } + + adapter.notifyDataSetChanged() + + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.paymentCreateOrder.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + order_id = it.data?.order_id + + when (paymentFrom) { + PaymentFrom.RAZOR_PAY -> { + if (order_id?.isNotEmpty() == true) + startRazorPayPayment( + binding.etAmount.text.toString(), order_id + ?: "" + ) + } + PaymentFrom.HYPER_PAY -> { + if (order_id?.isNotEmpty() == true) + startHyperPayPayment(order_id ?: "") + } + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.deleteCard.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + viewModel.cardListing(HashMap()) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.razorPayWebhook.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + setResult(Activity.RESULT_OK) + finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(false) + } + } + }) + + + viewModel.hyperPayCompleteTrans.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + longToast("Payment Done") + progressDialog.setLoading(false) + + setResult(Activity.RESULT_OK) + finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + + fun editCard(item: Wallet) { + startActivityForResult(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_CARD) + .putExtra(CARD_DETAILS, item), AppRequestCode.ADD_MONEY) + } + + fun deleteCard(item: Wallet) { + AlertDialogUtil.instance.createOkCancelDialog( + this, R.string.delete, + R.string.delete_message, R.string.delete, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(this@AddMoneyActivity, true)) { + val hashMap = HashMap() + + hashMap["card_id"] = item.id ?: "" + viewModel.deleteCard(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.ADD_CARD) { + viewModel.cardListing(HashMap()) + } else if (requestCode == AppRequestCode.ADD_MONEY) { + setResult(Activity.RESULT_OK) + finish() + } + + } + + + //Hyper Pay + if (requestCode == CheckoutActivity.REQUEST_CODE_CHECKOUT) { + when (resultCode) { + CheckoutActivity.RESULT_OK -> { + val transaction: Transaction = + data?.getParcelableExtra(CheckoutActivity.CHECKOUT_RESULT_TRANSACTION)!! + + resourcePath = + data.getStringExtra(CheckoutActivity.CHECKOUT_RESULT_RESOURCE_PATH) + ?: "" + if (transaction.transactionType === TransactionType.SYNC) { + /* check the result of synchronous transaction */ + //Call api here to success purchase + paymentDoneHyper() + } else { + + /* wait for the asynchronous transaction callback in the onNewIntent() */ + } + } + CheckoutActivity.RESULT_CANCELED -> { + longToast("Canceled") + } + CheckoutActivity.RESULT_ERROR -> { + val error: PaymentError? = data?.getParcelableExtra( + CheckoutActivity.CHECKOUT_RESULT_ERROR) + longToast(error?.errorMessage ?: "Something went wrong") + } /* error occurred */ + + + } + } + } + + val TAG: String = AddMoneyActivity::class.toString() + + private fun loadRazorPay() { + /* + * To ensure faster loading of the Checkout form, + * call this method as early as possible in your checkout flow + * */ + Checkout.preload(this) + } + + private fun startRazorPayPayment(amount: String, orderId: String) { + /* + * You need to pass current activity in order to let Razorpay create CheckoutActivity + * */ + + val activity: Activity = this + val co = Checkout() + co.setKeyID(appClientDetails.gateway_key ?: "") + + try { + val userData = userRepository.getUser() + + val options = JSONObject() + options.put("name", getString(R.string.app_name)) + options.put("description", "Charges") + //You can omit the image option to fetch the image from dashboard + options.put("image", getImageBaseUrl(ImageFolder.UPLOADS, appClientDetails.applogo)) + options.put("currency", "INR") + val colorTheme = "#" + Integer.toHexString(ContextCompat.getColor(this, R.color.colorPrimary) and 0x00ffffff) + options.put("theme.color", colorTheme) + options.put("order_id", orderId) + options.put("amount", (amount.toInt() * 100)) + + options.put("user_id", userData?.id) + val prefill = JSONObject() + prefill.put("email", userData?.email) + prefill.put("contact", "${userData?.country_code}${userData?.phone}") + + options.put("prefill", prefill) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + co.open(activity, options) + } catch (e: Exception) { + Toast.makeText(activity, "Error in payment: " + e.message, Toast.LENGTH_LONG).show() + e.printStackTrace() + } + } + + override fun onPaymentError(errorCode: Int, response: String?) { + try { + Toast.makeText(this, "Payment failed $errorCode \n $response", Toast.LENGTH_LONG).show() + } catch (e: Exception) { + Log.e(TAG, "Exception in onPaymentSuccess", e) + } + } + + override fun onPaymentSuccess(razorpayPaymentId: String?) { + try { + Toast.makeText(this, "Payment Successful $razorpayPaymentId", Toast.LENGTH_LONG).show() + + binding.clCompletePayment.visible() + val hashMap = HashMap() + hashMap["razorpayPaymentId"] = razorpayPaymentId ?: "" + hashMap["order_id"] = order_id ?: "" + viewModel.razorPayWebhook(hashMap) + + /* setResult(Activity.RESULT_OK) + finish()*/ + } catch (e: Exception) { + Log.e(TAG, "Exception in onPaymentSuccess", e) + } + } + + + //Hyper Pay + + private fun startHyperPayPayment(orderId: String) { + val checkoutSettings = createCheckoutSettings(orderId) + val intent = checkoutSettings?.createCheckoutActivityIntent(this) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivityForResult(intent!!, CheckoutActivity.REQUEST_CODE_CHECKOUT) + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + setIntent(intent) + if (resourcePath != null && hasCallbackScheme(intent ?: Intent())) { + //Call api here to success purchase + paymentDoneHyper() + } + } + + protected open fun createCheckoutSettings(checkoutId: String): CheckoutSettings? { + val paymentBrands: MutableSet = LinkedHashSet() + paymentBrands.add(HyperPay.VISA) + paymentBrands.add(HyperPay.MASTER) + paymentBrands.add(HyperPay.MADA) + + /*Check if payment mode is live or test*/ + val paymentProviderMode = if (appClientDetails.payment_provider_mode == "live") + Connect.ProviderMode.LIVE + else Connect.ProviderMode.TEST + + return CheckoutSettings(checkoutId, paymentBrands, paymentProviderMode) + .setSkipCVVMode(CheckoutSkipCVVMode.FOR_STORED_CARDS) + .setShopperResultUrl(getString(R.string.checkout_ui_callback_scheme) + "://callback") + } + + private fun hasCallbackScheme(intent: Intent): Boolean { + val scheme = intent.scheme + return getString(R.string.checkout_ui_callback_scheme) == scheme + } + + private fun paymentDoneHyper() { + val hashMap = HashMap() + hashMap["resourcePath"] = resourcePath ?: "" + viewModel.hyperPayCompleteTrans(hashMap) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/BottomCardTypeFragment.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/BottomCardTypeFragment.kt new file mode 100644 index 0000000..385c64a --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/BottomCardTypeFragment.kt @@ -0,0 +1,83 @@ +package com.consultantapp.ui.drawermenu.addmoney + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.databinding.BottomCardTypeBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.utils.PrefsManager +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomCardTypeFragment(private val activity: AddMoneyActivity) : + DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomCardTypeBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_card_type, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + + + } + + private fun listeners() { + binding.tv1st.setOnClickListener { + activity.hyperPayCardType(HyperPayCardType.VISA_MASTER) + dialog?.dismiss() + } + + binding.tv2nd.setOnClickListener { + activity.hyperPayCardType(HyperPayCardType.MADA) + dialog?.dismiss() + } + } + + companion object { + object HyperPayCardType { + const val VISA_MASTER = "visa_master" + const val MADA = "Mada" + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/CardsAdapter.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/CardsAdapter.kt new file mode 100644 index 0000000..974a709 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/addmoney/CardsAdapter.kt @@ -0,0 +1,87 @@ +package com.consultantapp.ui.drawermenu.addmoney + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemCardsBinding + + +class CardsAdapter(private val activity: AddMoneyActivity, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_cards, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemCardsBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clCard.setOnClickListener { + val clickedPosition = adapterPosition + if (!items[clickedPosition].isSelected) { + activity.selectedCardId = items[clickedPosition].id ?: "" + items.forEachIndexed { index, wallet -> + items[index].isSelected = index == clickedPosition + notifyDataSetChanged() + } + } + } + + binding.tvEdit.setOnClickListener { + activity.editCard(items[adapterPosition]) + } + + binding.tvDelete.setOnClickListener { + activity.deleteCard(items[adapterPosition]) + } + } + + fun bind(wallet: Wallet) = with(binding) { + + binding.rbSelect.isChecked = wallet.isSelected + binding.tvCardName.text = binding.root.context.getString(R.string.card_ending_with, + wallet.card_brand, wallet.last_four_digit) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/history/HistoryAdapter.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/history/HistoryAdapter.kt new file mode 100644 index 0000000..7944cd7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/history/HistoryAdapter.kt @@ -0,0 +1,80 @@ +package com.consultantapp.ui.drawermenu.history + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemHistoryBinding +import com.consultantapp.utils.* + + +class HistoryAdapter(private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_history, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemHistoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Wallet) = with(binding) { + tvName.text = getDoctorName(item.from) + if(item.from?.profile_image.isNullOrBlank()) + loadImage("profile",binding.ivPic, "https://nurselynx.netsolutionindia.com/default/user.jpg", R.drawable.image_placeholder) + else + loadImage("profile",binding.ivPic, item.from?.profile_image, R.drawable.image_placeholder) + + + tvPrice.text = "-${getCurrency(item.amount)}" + tvCallTime.text = DateUtils.dateTimeFormatFromUTC(DateFormat.DATE_TIME_FORMAT, item.created_at) + + tvRequestType.text = item.service_type + } + } + + private fun convertSecondsToMinute(seconds: Long): String { + val s = seconds % 60 + val m = seconds / 60 % 60 + return String.format("%02d:%02d min.", m, s) + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/history/HistoryFragment.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/history/HistoryFragment.kt new file mode 100644 index 0000000..6eb7a08 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/history/HistoryFragment.kt @@ -0,0 +1,167 @@ +package com.consultantapp.ui.drawermenu.history + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.drawermenu.wallet.WalletAdapter +import com.consultantapp.ui.drawermenu.wallet.WalletViewModel +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class HistoryFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: WalletViewModel + + private var items = ArrayList() + + private lateinit var adapter: WalletAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + binding.tvHeader.text = getString(R.string.history) + + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_history) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_history_desc) + } + + private fun setAdapter() { + adapter = WalletAdapter(items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["transaction_type"] = "all" + + viewModel.walletHistory(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.walletHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.payments ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/notification/NotificationAdapter.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/notification/NotificationAdapter.kt new file mode 100644 index 0000000..75b0eb3 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/notification/NotificationAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantapp.ui.drawermenu.notification + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Notification +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemNotificationBinding +import com.consultantapp.utils.DateUtils.getTimeAgo +import com.consultantapp.utils.loadImage + + +class NotificationAdapter(private val fragment: NotificationFragment,private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_notification, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemNotificationBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clMain.setOnClickListener { + fragment.clickItem(bindingAdapterPosition) + } + } + + fun bind(item: Notification) = with(binding) { + tvName.text = item.message + + loadImage("tag",binding.ivPic, item.form_user?.profile_image, + R.drawable.image_placeholder) + + tvCallDuration.text = getTimeAgo(item.created_at) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/notification/NotificationFragment.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/notification/NotificationFragment.kt new file mode 100644 index 0000000..c194b93 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/notification/NotificationFragment.kt @@ -0,0 +1,203 @@ +package com.consultantapp.ui.drawermenu.notification + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Notification +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ActivityListingToolbarBinding +import com.consultantapp.ui.dashboard.appointment.AppointmentViewModel +import com.consultantapp.ui.drawermenu.DrawerActivity +import com.consultantapp.utils.* +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class NotificationFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: AppointmentViewModel + + private var items = ArrayList() + + private lateinit var adapter: NotificationAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + binding.tvHeader.text = getString(R.string.notification) + + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_notifications_empty) + binding.clNoData.tvNoData.text = getString(R.string.no_notification) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_notification_desc) + } + + private fun setAdapter() { + adapter = NotificationAdapter(this, items) + binding.rvListing.adapter = adapter + + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.notifications(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.notifications.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.notifications ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + } + + fun clickItem(pos: Int) { + val item = items[pos] + + when (item.pushType) { + PushType.REQUEST_ACCEPTED, PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.REQUEST_FAILED, + PushType.CANCELED_REQUEST, PushType.RESCHEDULED_REQUEST, PushType.UPCOMING_APPOINTMENT, + PushType.PRESCRIPTION_ADDED, PushType.REQUEST_EXTRA_PAYMENT, PushType.CARE_PLAN_DONE, PushType.START -> { + openScreen(DrawerActivity.APPOINTMENT_DETAILS, item.module_id ?: "") + } + PushType.BOOKING_RESERVED, PushType.BALANCE_ADDED, PushType.BALANCE_FAILED, + PushType.AMOUNT_RECEIVED, PushType.BALANCE_REFUNDED,PushType.BALANCE_DEDUCTED -> { + openScreen(DrawerActivity.WALLET) + } + PushType.WATER_INTAKE -> { + openScreen(DrawerActivity.WATER_INTAKE) + } + } + } + + private fun openScreen(page: String, id: String = "") { + val intent = Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, page) + + if (id.isNotEmpty()) + intent.putExtra(EXTRA_REQUEST_ID, id) + + startActivity(intent) + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/profile/ProfileFragment.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/profile/ProfileFragment.kt new file mode 100644 index 0000000..9809c14 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/profile/ProfileFragment.kt @@ -0,0 +1,117 @@ +package com.consultantapp.ui.drawermenu.profile + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentProfileBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.loginSignUp.SignUpActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ProfileFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentProfileBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private var userData: UserData? = null + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_profile, container, false) + rootView = binding.root + + initialise() + setUserProfile() + listeners() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun setUserProfile() { + userData = userRepository.getUser() + + binding.tvBio.hideShowView(BuildConfig.FLAVOR!="taradoc") + binding.tvBioV.hideShowView(BuildConfig.FLAVOR!="taradoc") + binding.tvLocation.hideShowView(BuildConfig.FLAVOR=="taradoc" && !(userData?.profile?.city.isNullOrEmpty())) + + binding.tvName.text = userData?.name ?: "" + binding.tvAge.text = "${getString(R.string.age)} ${getAge(userData?.profile?.dob)}" + binding.tvBioV.text = userData?.profile?.bio ?: getString(R.string.na) + binding.tvLocation.text = userData?.profile?.city ?: "" + binding.tvEmailV.text = userData?.email ?: getString(R.string.na) + binding.tvPhoneV.text = "${userData?.country_code ?: ""} ${userData?.phone ?: ""}" + binding.tvDOBV.text = userData?.profile?.dob ?: getString(R.string.na) + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.tvDOBV.text = DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "") + + loadImage("profile",binding.ivPic, userData?.profile_image.toString(), R.drawable.ic_profile_placeholder) + + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvEdit.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(UPDATE_PROFILE, true)) + } + + binding.tvPhoneUpdate.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(UPDATE_NUMBER, true)) + } + + binding.ivPic.setOnClickListener { + val itemImages = java.util.ArrayList() + itemImages.add(userRepository.getUser()?.profile_image.toString()) + // itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS,userRepository.getUser()?.profile_image)) + viewImageFull(requireActivity(), itemImages, 0) + } + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + setUserProfile() + requireActivity().setResult(Activity.RESULT_OK) + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletAdapter.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletAdapter.kt new file mode 100644 index 0000000..5d8f815 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletAdapter.kt @@ -0,0 +1,106 @@ +package com.consultantapp.ui.drawermenu.wallet + +import android.graphics.Color +import android.provider.CalendarContract.Colors +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.LoadingStatus.ITEM +import com.consultantapp.data.network.LoadingStatus.LOADING +import com.consultantapp.databinding.ItemPagingLoaderBinding +import com.consultantapp.databinding.RvItemWalletBinding +import com.consultantapp.utils.* + + +class WalletAdapter(private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_wallet, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemWalletBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(wallet: Wallet) = with(binding) { + + when (wallet.type) { + WalletMoney.WITHDRAWAL -> { + tvMoneyFrom.text = binding.root.context.getString(R.string.money_sent_from, + getDoctorName(wallet.from)) + tvMoneyAmount.text = "-${getCurrency(wallet.amount)}" + tvMoneyAmount.setTextColor(ContextCompat.getColor(binding.root.context, R.color.red)) + + } + WalletMoney.REFUND -> { + tvMoneyFrom.text = binding.root.context.getString(R.string.money_refund_from,getDoctorName(wallet.from)) + tvMoneyAmount.text = "+${getCurrency(wallet.amount)}" + tvMoneyAmount.setTextColor(ContextCompat.getColor(binding.root.context, R.color.quantum_googgreen600)) + } + WalletMoney.ADD_PACKAGE -> { + tvMoneyFrom.text = binding.root.context.getString(R.string.added_packages) + tvMoneyAmount.text = "-${getCurrency(wallet.amount)}" + tvMoneyAmount.setTextColor(ContextCompat.getColor(binding.root.context, R.color.red)) + + } + WalletMoney.DEPOSIT, WalletMoney.ADD_MONEY -> { + if (wallet.status == WalletMoney.FAILED) { + tvMoneyFrom.text = binding.root.context.getString(R.string.failed_transaction) + tvMoneyAmount.text = "${getCurrency(wallet.amount)}" + tvMoneyAmount.setTextColor(ContextCompat.getColor(binding.root.context, R.color.black)) + } else { + tvMoneyFrom.text = binding.root.context.getString(R.string.added_to_wallet) + tvMoneyAmount.text = "+${getCurrency(wallet.amount)}" + tvMoneyAmount.setTextColor(ContextCompat.getColor(binding.root.context, R.color.quantum_googgreen600)) + } + } + else -> { + tvMoneyFrom.text = binding.root.context.getString(R.string.na) + tvMoneyAmount.text = "${getCurrency(wallet.amount)}" + tvMoneyAmount.setTextColor(ContextCompat.getColor(binding.root.context, R.color.black)) + } + } + + tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, wallet.created_at) + tvTime.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, wallet.created_at) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletFragment.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletFragment.kt new file mode 100644 index 0000000..117b47c --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletFragment.kt @@ -0,0 +1,283 @@ +package com.consultantapp.ui.drawermenu.wallet + +import android.app.Activity.RESULT_OK +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.R +import com.consultantapp.data.models.responses.Wallet +import com.consultantapp.data.network.ApiKeys.AFTER +import com.consultantapp.data.network.ApiKeys.PER_PAGE +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PER_PAGE_LOAD +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentWalletBinding +import com.consultantapp.ui.drawermenu.addmoney.AddMoneyActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class WalletFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentWalletBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: WalletViewModel + + private var items = ArrayList() + + private lateinit var adapter: WalletAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var isReceiverRegistered = false + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_wallet, container, false) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + + if (isConnectedToInternet(requireContext(), false)) + viewModel.wallet(HashMap()) + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_wallet_empty) + binding.clNoData.tvNoData.text = getString(R.string.no_transaction) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_transaction_desc) + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvAddMoney.setOnClickListener { + + /*val jitsiClass = JitsiClass() + jitsiClass.id = "123" + jitsiClass.call_id = "123" + jitsiClass.callType = CallFrom.VIDEO_CALL + jitsiClass.name = "" + + val intent = Intent(requireContext(), JitsiActivity::class.java) + intent.putExtra(EXTRA_CALL_NAME, jitsiClass) + startActivity(intent)*/ + + disableButton(binding.tvAddMoney) + startActivityForResult(Intent(requireContext(), AddMoneyActivity::class.java), AppRequestCode.ADD_MONEY) + } + + binding.swipeRefreshLayout.setOnRefreshListener { + viewModel.wallet(HashMap()) + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLastPage && lastVisibleItemPosition >= totalItemCount) { + hitApi(false) + } + } + }) + } + + + private fun setAdapter() { + adapter = WalletAdapter(items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["transaction_type"] = "all" + + if (!isLoadingMoreItems) { + isLoadingMoreItems = true + viewModel.walletHistory(hashMap) + } + } else + binding.swipeRefreshLayout.isRefreshing = false + } + + private fun bindObservers() { + viewModel.wallet.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.tvAmount.text = getCurrency(it.data?.balance) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + + } + } + }) + + viewModel.walletHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.swipeRefreshLayout.isRefreshing = false + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + + isLoadingMoreItems = false + + val tempList = it.data?.payments ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + binding.swipeRefreshLayout.isRefreshing = false + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefreshLayout.isRefreshing) + binding.clLoader.visible() + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (resultCode == RESULT_OK) { + if (requestCode == AppRequestCode.ADD_MONEY) { + requireActivity().runOnUiThread { + viewModel.wallet(HashMap()) + hitApi(true) + } + } + } + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.AMOUNT_RECEIVED) + intentFilter.addAction(PushType.BALANCE_ADDED) + intentFilter.addAction(PushType.BALANCE_FAILED) + intentFilter.addAction(PushType.BOOKING_RESERVED) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.AMOUNT_RECEIVED, PushType.BALANCE_ADDED, PushType.BALANCE_FAILED, + PushType.BOOKING_RESERVED -> { + viewModel.wallet(HashMap()) + hitApi(true) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletViewModel.kt b/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletViewModel.kt new file mode 100644 index 0000000..2e069a4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/drawermenu/wallet/WalletViewModel.kt @@ -0,0 +1,306 @@ +package com.consultantapp.ui.drawermenu.wallet + +import androidx.lifecycle.ViewModel +import com.consultantapp.data.apis.WebService +import com.consultantapp.data.models.responses.CommonDataModel +import com.consultantapp.data.network.responseUtil.ApiResponse +import com.consultantapp.data.network.responseUtil.ApiUtils +import com.consultantapp.data.network.responseUtil.Resource +import com.consultantapp.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class WalletViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val walletHistory by lazy { SingleLiveEvent>() } + + val wallet by lazy { SingleLiveEvent>() } + + val addCard by lazy { SingleLiveEvent>() } + + val updateCard by lazy { SingleLiveEvent>() } + + val deleteCard by lazy { SingleLiveEvent>() } + + val paymentCreateOrder by lazy { SingleLiveEvent>() } + + val addMoney by lazy { SingleLiveEvent>() } + + val cardListing by lazy { SingleLiveEvent>() } + + val razorPayWebhook by lazy { SingleLiveEvent>() } + + val requestCheck by lazy { SingleLiveEvent>() } + + + fun walletHistory(hashMap: HashMap) { + walletHistory.value = Resource.loading() + + webService.walletHistory(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + walletHistory.value = Resource.success(response.body()?.data) + } else { + walletHistory.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + walletHistory.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun paymentCreateOrder(hashMap: HashMap) { + paymentCreateOrder.value = Resource.loading() + + webService.orderCreate(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + paymentCreateOrder.value = Resource.success(response.body()?.data) + } else { + paymentCreateOrder.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + paymentCreateOrder.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun wallet(hashMap: HashMap) { + wallet.value = Resource.loading() + + webService.wallet(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + wallet.value = Resource.success(response.body()?.data) + } else { + wallet.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + wallet.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addCard(hashMap: HashMap) { + addCard.value = Resource.loading() + + webService.addCard(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addCard.value = Resource.success(response.body()?.data) + } else { + addCard.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addCard.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateCard(hashMap: HashMap) { + updateCard.value = Resource.loading() + + webService.updateCard(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateCard.value = Resource.success(response.body()?.data) + } else { + updateCard.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateCard.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun deleteCard(hashMap: HashMap) { + deleteCard.value = Resource.loading() + + webService.deleteCard(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + deleteCard.value = Resource.success(response.body()?.data) + } else { + deleteCard.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + deleteCard.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addMoney(hashMap: HashMap) { + addMoney.value = Resource.loading() + + webService.addMoney(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addMoney.value = Resource.success(response.body()?.data) + } else { + addMoney.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addMoney.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun cardListing(hashMap: HashMap) { + cardListing.value = Resource.loading() + + webService.cardListing(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + cardListing.value = Resource.success(response.body()?.data) + } else { + cardListing.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + cardListing.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun razorPayWebhook(hashMap: HashMap) { + razorPayWebhook.value = Resource.loading() + + webService.razorPayWebhook(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + razorPayWebhook.value = Resource.success(response.body()?.data) + } else { + razorPayWebhook.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + razorPayWebhook.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun requestCheck(hashMap: HashMap) { + requestCheck.value = Resource.loading() + + webService.requestCheck(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + requestCheck.value = Resource.success(response.body()?.data) + } else { + requestCheck.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + requestCheck.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + + val hyperPayCompleteTrans by lazy { SingleLiveEvent>() } + + fun hyperPayCompleteTrans(hashMap: HashMap) { + hyperPayCompleteTrans.value = Resource.loading() + + webService.hyperPayCompleteTrans(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + hyperPayCompleteTrans.value = Resource.success(response.body()?.data) + } else { + hyperPayCompleteTrans.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + hyperPayCompleteTrans.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/jitsimeet/JitsiActivity.kt b/app/src/main/java/com/consultantapp/ui/jitsimeet/JitsiActivity.kt new file mode 100644 index 0000000..d88e977 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/jitsimeet/JitsiActivity.kt @@ -0,0 +1,240 @@ +package com.consultantapp.ui.jitsimeet + + +import android.Manifest +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.os.Bundle +import android.util.Log +import android.view.WindowManager +import androidx.core.app.ActivityCompat +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.models.responses.JitsiClass +import com.consultantapp.data.network.PushType +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.pushNotifications.MessagingService +import com.consultantapp.ui.calling.Constants +import com.consultantapp.ui.calling.SoundPoolManager +import com.consultantapp.utils.* +import com.facebook.react.modules.core.PermissionListener +import dagger.android.support.DaggerAppCompatActivity +import org.jitsi.meet.sdk.* +import org.jitsi.meet.sdk.log.JitsiMeetLogger +import java.net.MalformedURLException +import java.net.URL +import javax.inject.Inject + + +class JitsiActivity : DaggerAppCompatActivity(), JitsiMeetActivityInterface, JitsiMeetViewListener { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + private var isReceiverRegistered = false + + private var jitsiMeetView: JitsiMeetView? = null + + private var jitsiClass: JitsiClass? = null + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) +// setContentView(R.layout.activity_jitsi) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) + + checkPermission() + + MessagingService.mHandler.removeCallbacksAndMessages(null) + jitsiMeetView = JitsiMeetView(this) + + + jitsiClass = intent.getSerializableExtra(EXTRA_CALL_NAME) as JitsiClass + val roomName: String + val subjectName: String + + if (jitsiClass?.isClass == false) { + roomName = "Call_${appClientDetails.jitsi_id}_${jitsiClass?.id}" + subjectName = "Call" + } else { + roomName = "Class_${appClientDetails.jitsi_id}_${jitsiClass?.id}" + subjectName = jitsiClass?.name ?: "" + } + Log.d("Call Name", roomName) + + + // Initialize default options for Jitsi Meet conferences. + val serverURL: URL = try { + URL(appClientDetails.jitsi_meet_url) + } catch (e: MalformedURLException) { + e.printStackTrace() + throw RuntimeException("Invalid server URL!") + } + val defaultOptions = JitsiMeetConferenceOptions.Builder() + .setServerURL(serverURL) +// .setWelcomePageEnabled(false) + .setFeatureFlag("invite.enabled", false) + .setFeatureFlag("chat.enabled", false) + .setFeatureFlag("calendar.enabled", false) + .setFeatureFlag("call-integration.enabled", false) + .setFeatureFlag("live-streaming.enabled", true) + .setFeatureFlag("recording.enabled", false) + .setFeatureFlag("tile-view.enabled", false) + .setFeatureFlag("meeting-password.enabled", false) + .setFeatureFlag("pip.enabled", true) + .setFeatureFlag("close-captions.enabled", false) + .build() + JitsiMeet.setDefaultConferenceOptions(defaultOptions) + + + if (roomName.isNotEmpty()) { + // Build options object for joining the conference. The SDK will merge the default + // one we set earlier and this one when joining. + val userInfo = JitsiMeetUserInfo() + val userData = userRepository.getUser() + userInfo.displayName = userData?.name + userInfo.avatar = URL(getImageBaseUrl(ImageFolder.UPLOADS, userData?.profile_image)) + + val setAudioOnly = jitsiClass?.callType?.toLowerCase() == ConsultType.AUDIO_CALL + + val options = JitsiMeetConferenceOptions.Builder() + .setUserInfo(userInfo) + .setRoom(roomName) + .setSubject(subjectName) + .setAudioOnly(setAudioOnly) + .build() + // Launch the new activity with the given options. The launch() method takes care + // of creating the required Intent and passing the options. + + /* JitsiMeetActivity.launch(this, options) + finish()*/ + + jitsiMeetView?.join(options) + + setContentView(jitsiMeetView) + jitsiMeetView?.listener = this + + SoundPoolManager.getInstance(this)?.stopRinging() + + } + + //finish() + } + + override fun onBackPressed() { + } + + + override fun requestPermissions(p0: Array?, p1: Int, p2: PermissionListener?) { + JitsiMeetActivityDelegate.requestPermissions(this, p0, p1, p2) + } + + override fun onConferenceJoined(data: Map) { + JitsiMeetLogger.i("Conference joined: $data") + // Launch the service for the ongoing notification. + // JitsiMeetOngoingConferenceService.launch(this); + } + + override fun onConferenceTerminated(data: Map) { + JitsiMeetLogger.i("Conference terminated: $data") + + if (isConnectedToInternet(this, true) && jitsiClass?.isClass == false) { + userRepository.callStatus( + jitsiClass?.id ?: "", jitsiClass?.call_id ?: "", + PushType.CALL_CANCELED) + + longToast(getString(R.string.disconnecting)) + } + + jitsiMeetView?.listener = null + jitsiMeetView?.leave() + finish() + } + + override fun onConferenceWillJoin(data: Map) { + JitsiMeetLogger.i("Conference will join: $data") + } + + private fun checkPermission() { + val PERMISSIONS = arrayOf( + Manifest.permission.RECORD_AUDIO, + Manifest.permission.CAMERA + ) + if (!hasPermissions(*PERMISSIONS)) { + ActivityCompat.requestPermissions(this, PERMISSIONS, 100) + } + } + + fun hasPermissions(vararg permissions: String?): Boolean { + if (permissions != null) { + for (permission in permissions) { + if (ActivityCompat.checkSelfPermission(this, permission!!) != PackageManager.PERMISSION_GRANTED) { + return false + } + } + } + return true + } + + override fun onResume() { + super.onResume() + registerReceiver() + JitsiMeetActivityDelegate.onHostResume(this) + } + + + override fun onStop() { + super.onStop() + JitsiMeetActivityDelegate.onHostPause(this) + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + JitsiMeetActivityDelegate.onHostDestroy(this) + jitsiMeetView?.leave() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(Constants.ACTION_INCOMING_CALL) + intentFilter.addAction(Constants.ACTION_CANCEL_CALL) + intentFilter.addAction(PushType.REQUEST_COMPLETED) + LocalBroadcastManager.getInstance(this).registerReceiver( + callCancelledReceiver, intentFilter + ) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(callCancelledReceiver) + isReceiverRegistered = false + } + } + + private val callCancelledReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.getStringExtra(EXTRA_REQUEST_ID) == jitsiClass?.call_id) { + if (intent.action == Constants.ACTION_CANCEL_CALL || intent.action == PushType.REQUEST_COMPLETED) { + jitsiMeetView?.listener = null + jitsiMeetView?.leave() + finish() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/SignUpActivity.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/SignUpActivity.kt new file mode 100644 index 0000000..cb682f0 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/SignUpActivity.kt @@ -0,0 +1,88 @@ +package com.consultantapp.ui.loginSignUp + +import android.os.Bundle +import android.widget.Toast +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityContainerBinding +import com.consultantapp.ui.loginSignUp.login.InfoUserFragment +import com.consultantapp.ui.loginSignUp.login.LoginFragment +import com.consultantapp.ui.loginSignUp.loginemail.LoginEmailFragment +import com.consultantapp.ui.loginSignUp.signup.SignUpFragment +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_INFO_USER +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_LOGIN +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_LOGIN_EMAIL +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_SIGNUP +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_SIGNUP_EMAIL +import com.consultantapp.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + +class SignUpActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + lateinit var binding: ActivityContainerBinding + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + //makeFullScreen(this) + } + + private fun initialise() { + binding = DataBindingUtil.setContentView(this, R.layout.activity_container) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + var fragment = Fragment() + val bundle = Bundle() + + when { + intent.hasExtra(UPDATE_PROFILE) -> { + fragment = SignUpFragment() + } + intent.hasExtra(EXTRA_SIGNUP_EMAIL) -> { + fragment = SignUpFragment() + } + intent.hasExtra(UPDATE_NUMBER)|| intent.hasExtra(EXTRA_LOGIN) || intent.hasExtra(EXTRA_SIGNUP) -> { + fragment = LoginFragment() + } + intent.hasExtra(EXTRA_LOGIN_EMAIL) -> { + fragment = LoginEmailFragment() + } + intent.hasExtra(EXTRA_INFO_USER) -> { + fragment = InfoUserFragment() + } + } + + if (intent.hasExtra(UPDATE_NUMBER)) + bundle.putBoolean(UPDATE_NUMBER, true) + if (intent.hasExtra(UPDATE_PROFILE)) + bundle.putBoolean(UPDATE_PROFILE, true) + + fragment.arguments = bundle + addFragment(supportFragmentManager, fragment, R.id.container) + } + + override fun onBackPressed() { + val currentFragment = supportFragmentManager.findFragmentById(R.id.container) + + if (currentFragment is SignUpFragment) { + this.finish() + + } else { + super.onBackPressed() // Default back press behavior + } + } + + +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/changepassword/ChangePasswordFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/changepassword/ChangePasswordFragment.kt new file mode 100644 index 0000000..efa459d --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/changepassword/ChangePasswordFragment.kt @@ -0,0 +1,117 @@ +package com.consultantapp.ui.loginSignUp.changepassword + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentChangePasswordBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.dashboard.success.SuccessFragment +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.isConnectedToInternet +import com.consultantapp.utils.showSnackBar +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ChangePasswordFragment : DaggerFragment() { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentChangePasswordBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_change_password, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivNext.setOnClickListener { + when { + binding.etOldPassword.text.toString().trim().isEmpty() -> { + binding.etOldPassword.showSnackBar(getString(R.string.old_password)) + } + binding.etNewPassword.text.toString().trim().isEmpty() -> { + binding.etNewPassword.showSnackBar(getString(R.string.new_password)) + } + binding.etConfirmPassword.text.toString().trim().isEmpty() -> { + binding.etConfirmPassword.showSnackBar(getString(R.string.confirm_password)) + } + binding.etConfirmPassword.text.toString().trim() != binding.etNewPassword.text.toString().trim() -> { + binding.etConfirmPassword.showSnackBar(getString(R.string.confirm_password)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["current_password"] = binding.etOldPassword.text.toString() + hashMap["new_password"] = binding.etNewPassword.text.toString() + + viewModel.changePassword(hashMap) + } + } + } + } + + + private fun bindObservers() { + viewModel.changePassword.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + val fragment = SuccessFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/forgotpassword/ForgotPasswordFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/forgotpassword/ForgotPasswordFragment.kt new file mode 100644 index 0000000..9f265ba --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/forgotpassword/ForgotPasswordFragment.kt @@ -0,0 +1,109 @@ +package com.consultantapp.ui.loginSignUp.forgotpassword + +import android.os.Bundle +import android.util.Patterns +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentForgotPasswordBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.isConnectedToInternet +import com.consultantapp.utils.longToast +import com.consultantapp.utils.showSnackBar +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ForgotPasswordFragment : DaggerFragment() { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentForgotPasswordBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_forgot_password, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.ivNext.setOnClickListener { + when { + binding.etEmail.text.toString().isEmpty() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + !Patterns.EMAIL_ADDRESS.matcher(binding.etEmail.text.toString()).matches() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["email"] = binding.etEmail.text.toString() + + viewModel.forgotPassword(hashMap) + } + } + } + } + + + private fun bindObservers() { + + viewModel.forgotPassword.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().longToast(getString(R.string.sent_password)) + requireActivity().supportFragmentManager.popBackStack() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/CustomSpinnerAdapter.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/CustomSpinnerAdapter.kt new file mode 100644 index 0000000..989a757 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/CustomSpinnerAdapter.kt @@ -0,0 +1,45 @@ +package com.consultantapp.ui.loginSignUp.insurance + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import android.widget.TextView +import com.consultantapp.R +import com.consultantapp.data.models.responses.CountryCity + +class CustomSpinnerAdapter(private val context: Context, private var items: List) : BaseAdapter() { + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val vh: ViewHolder + if (convertView == null) { + view = LayoutInflater.from(context).inflate(R.layout.item_spinner, parent, false) + vh = ViewHolder(view) + view?.tag = vh + } else { + view = convertView + vh = view.tag as ViewHolder + } + vh.tvTitle.text = items[position].name + return view + } + + override fun getItem(position: Int): Any? { + return null + } + + override fun getItemId(position: Int): Long { + return 0 + } + + override fun getCount(): Int { + return items.size + } + + private class ViewHolder(view: View?) { + val tvTitle: TextView = view?.findViewById(R.id.tvSpinner) as TextView + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/ImagesUploadedAdapter.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/ImagesUploadedAdapter.kt new file mode 100644 index 0000000..02f99e5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/ImagesUploadedAdapter.kt @@ -0,0 +1,61 @@ +package com.consultantapp.ui.loginSignUp.insurance + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.databinding.RvItemImageInsuranceBinding +import com.consultantapp.utils.DocType +import com.consultantapp.utils.gone +import com.consultantapp.utils.loadImage + + +class ImagesUploadedAdapter(private val fragment: InsuranceFragment, + private val items: ArrayList) : RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_image_insurance, parent, false + ) + ) + + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemImageInsuranceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.ivDelete.gone() + binding.ivDelete.setOnClickListener { + items.removeAt(adapterPosition) + + notifyDataSetChanged() + } + } + + + fun bind(item: DocImage?) = with(binding) { + tvNumber.text = binding.root.context.getString(R.string.insurance_no,item?.insuranceNumber) + tvDate.text = binding.root.context.getString(R.string.expiry_date_s,item?.expiry) + if (item?.type == DocType.PDF) { + ivImage.setBackgroundResource(R.drawable.ic_pdf) + Glide.with(binding.root.context).load("").into(ivImage) + } else + loadImage("tag",binding.ivImage, item?.image, R.drawable.image_placeholder) + + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceAdapter.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceAdapter.kt new file mode 100644 index 0000000..97a1329 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceAdapter.kt @@ -0,0 +1,73 @@ +package com.consultantapp.ui.loginSignUp.insurance + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.appdetails.Insurance +import com.consultantapp.databinding.ItemInsuranceBinding + + +class InsuranceAdapter(private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: InsuranceAdapter.ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InsuranceAdapter.ViewHolder { + return ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_insurance, parent, false + ) + ) + + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: ItemInsuranceBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Insurance) = with(binding) { + + cbName.text = item.name ?: "" + cbName.isChecked = item.isSelected + if (item.isSelected) { + clInsurance.setBackgroundResource(R.color.colorPrimary) + } else { + clInsurance.setBackgroundResource(R.color.colorWhite) + } + + clInsurance.setOnClickListener { + val selectedPos=adapterPosition + when (BuildConfig.FLAVOR) { + "heal" -> { + /*Single Selection*/ + items.forEachIndexed { index, service -> + items[index].isSelected = index == selectedPos + } + notifyDataSetChanged() + } + "nurseLynx" -> { + /*Single Selection*/ + items.forEachIndexed { index, service -> + items[index].isSelected = index == selectedPos + } + notifyDataSetChanged() + } + else -> { + /*Multiple Selection*/ + items[selectedPos].isSelected = !items[selectedPos].isSelected + notifyDataSetChanged() + } + } + } + } + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceFragment.kt new file mode 100644 index 0000000..7352486 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceFragment.kt @@ -0,0 +1,606 @@ +package com.consultantapp.ui.loginSignUp.insurance + +import android.app.Activity +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.appFeatures +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.data.models.responses.CountryCity +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.models.responses.appdetails.AppVersion +import com.consultantapp.data.models.responses.appdetails.Insurance +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentInsauranceBinding +import com.consultantapp.ui.AppVersionViewModel +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.dashboard.home.addfamily.AddFamilyFragment +import com.consultantapp.ui.dashboard.success.SuccessFragment +import com.consultantapp.ui.loginSignUp.insurance.add.DialogAddDocumentFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import com.google.gson.Gson +import dagger.android.support.DaggerFragment +import permissions.dispatcher.* +import javax.inject.Inject + +class InsuranceFragment : DaggerFragment() { + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentInsauranceBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelVersion: AppVersionViewModel + + private val items = ArrayList() + + private var userData: UserData? = null + + private var spinnerCountryAdapter: CustomSpinnerAdapter? = null + + private var spinnerStateAdapter: CustomSpinnerAdapter? = null + + private var spinnerCityAdapter: CustomSpinnerAdapter? = null + + private val itemsCountry = ArrayList() + + private val itemsState = ArrayList() + + private val itemsCity = ArrayList() + + private var openFirstCountry = true + + private var openFirstState = true + + private var openFirstCity = true + + private var needCountry = false + + private var countryId = "" + + private var stateId = "" + + private var cityId = "" + + private var imagesAdapter: InsuranceImagesAdapter? = null + + private var itemImages = ArrayList() + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_insaurance, container, false) + rootView = binding.root + + initialise() + setUpdateInsurance() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelVersion = + ViewModelProvider(this, viewModelFactory)[AppVersionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + if (arguments?.containsKey(AddFamilyFragment.EXTRA_FAMILY) == true) { + binding.tvHeader.text = getString(R.string.insurance_information) + binding.cbTerm1.gone() + binding.cbTerm2.gone() + binding.cbTerm3.gone() + } + + + userData = arguments?.getSerializable(USER_DATA) as UserData + /*If need country List*/ + if (appClientDetails.country_id == null) { + needCountry = true + binding.ilCountry.visible() + } else countryId = appClientDetails.country_id ?: "" + + if (appFeatures.needInsuranceDocument) { + binding.tvAddImage.gone() + binding.rvImages.gone() + setImageAdapter() + + if (!userData?.insurance_info.isNullOrEmpty()) { + binding.tvImageUploaded.visible() + binding.rvImagesUploaded.visible() + + val itemImagesUploaded = ArrayList() + itemImagesUploaded.addAll(userData?.insurance_info ?: emptyList()) + val imagesAdapter = ImagesUploadedAdapter(this, itemImagesUploaded) + binding.rvImagesUploaded.adapter = imagesAdapter + } + } + } + + private fun setAdapters() { + spinnerCountryAdapter = CustomSpinnerAdapter(requireContext(), itemsCountry) + binding.spnCountry.adapter = spinnerCountryAdapter + + spinnerStateAdapter = CustomSpinnerAdapter(requireContext(), itemsState) + binding.spnState.adapter = spinnerStateAdapter + + spinnerCityAdapter = CustomSpinnerAdapter(requireContext(), itemsCity) + binding.spnCity.adapter = spinnerCityAdapter + + if (isConnectedToInternet(requireContext(), true)) { + var hashMap = HashMap() + + /*If need country list*/ + if (needCountry) { + hashMap["type"] = CountryListType.COUNTRY + viewModelVersion.countryCity(hashMap) + } + + if (!needCountry || !userData?.profile?.country_id.isNullOrEmpty()) { + if (needCountry) + countryId = userData?.profile?.country_id ?: "" + + hashMap = HashMap() + hashMap["type"] = CountryListType.STATE + hashMap["country_id"] = countryId + + viewModelVersion.countryCity(hashMap) + } + + if (!userData?.profile?.state_id.isNullOrEmpty()) { + stateId = userData?.profile?.state_id ?: "" + + hashMap = HashMap() + hashMap["type"] = CountryListType.CITY + hashMap["state_id"] = stateId + + viewModelVersion.countryCity(hashMap) + } + } + } + + /*Get and update address insurance*/ + private fun setUpdateInsurance() { + if (appClientDetails.clientFeaturesKeys.isAddress == true) { + setAdapters() + binding.groupAddress.visible() + + binding.etAddress.setText(userData?.profile?.address ?: "") + binding.etCountry.setText(userData?.profile?.country ?: "") + binding.etState.setText(userData?.profile?.state ?: "") + binding.etCity.setText(userData?.profile?.city ?: "") + + userData?.custom_fields?.forEach { + if (it.field_name == CustomFields.ZIP_CODE) { + binding.etZipCode.setText(it.field_value ?: "") + return@forEach + } + } + + } else { + binding.groupAddress.gone() + } + + items.addAll(appClientDetails.insurances ?: emptyList()) + + if (appClientDetails.insurance == true) { + binding.groupInsurance.visible() + + /*Check Selected Insurance*/ + when { + userData?.insurance_enable == "1" -> { + binding.cbYes.isChecked = true + binding.cbNo.isChecked = false + + items.forEachIndexed { index, item -> + userData?.insurances?.forEachIndexed { _, insurance -> + if (item.id == insurance.id) { + items[index].isSelected = true + return@forEachIndexed + } + } + } + } + userData?.insurance_enable != null -> { + binding.cbNo.isChecked = true + binding.groupInsurance.gone() + } + else -> { + binding.cbNo.isChecked = true + binding.groupInsurance.gone() + } + } + } else { + binding.tvHaveInsurance.gone() + binding.cbYes.gone() + binding.cbNo.gone() + binding.groupInsurance.gone() + + binding.tvAddImage.gone() + binding.rvImages.gone() + } + + val adapter = InsuranceAdapter(items) + binding.rvInsurance.adapter = adapter + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.btnSubmit.setOnClickListener { + binding.btnSubmit.hideKeyboard() + + checkValidations() + } + + binding.etCountry.setOnClickListener { + binding.etCountry.hideKeyboard() + binding.spnCountry.performClick() + } + + binding.spnCountry.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + if (openFirstCountry) + openFirstCountry = false + else { + binding.etState.setText("") + binding.etCity.setText("") + if (position == 0) { + binding.etCountry.setText("") + } else { + binding.etCountry.setText(itemsCountry[position].name) + countryId = itemsCountry[position].id ?: "" + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["type"] = CountryListType.STATE + hashMap["country_id"] = countryId + viewModelVersion.countryCity(hashMap) + } + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etState.setOnClickListener { + binding.etState.hideKeyboard() + binding.spnState.performClick() + } + + binding.spnState.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + if (openFirstState) + openFirstState = false + else { + binding.etCity.setText("") + if (position == 0) { + binding.etState.setText("") + } else { + binding.etState.setText(itemsState.get(position).name) + stateId = itemsState[position].id ?: "" + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["type"] = CountryListType.CITY + hashMap["state_id"] = stateId + + viewModelVersion.countryCity(hashMap) + } + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etCity.setOnClickListener { + binding.etCity.hideKeyboard() + binding.spnCity.performClick() + } + + binding.spnCity.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + if (openFirstCity) + openFirstCity = false + else { + if (position == 0) + binding.etCity.setText("") + else { + cityId = itemsCity[position].id ?: "" + binding.etCity.setText(itemsCity.get(position).name) + } + } + } + + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.cbYes.setOnCheckedChangeListener { compoundButton, b -> + if (b) { + binding.cbNo.isChecked = false + binding.groupInsurance.visible() + binding.tvAddImage.visible() + binding.rvImages.visible() + } else { + binding.groupInsurance.gone() + binding.tvAddImage.gone() + binding.rvImages.gone() + } + } + + binding.cbNo.setOnCheckedChangeListener { compoundButton, b -> + if (b) { + binding.cbYes.isChecked = false + binding.groupInsurance.gone() + binding.tvAddImage.gone() + binding.rvImages.gone() + } + } + } + + private fun checkValidations() { + /*Get if insurance selected*/ + var idsInsurance = "" + items.forEach { + if (it.isSelected) + idsInsurance += it.id + "," + } + + when { + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etAddress.text.toString() + .isEmpty() -> { + binding.etAddress.showSnackBar(getString(R.string.address)) + } + needCountry && appClientDetails.clientFeaturesKeys.isAddress == true && binding.etCountry.text.toString() + .isEmpty() -> { + binding.etState.showSnackBar(getString(R.string.select_country)) + } + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etState.text.toString() + .isEmpty() -> { + binding.etState.showSnackBar(getString(R.string.select_state)) + } + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etCity.text.toString() + .isEmpty() -> { + binding.etCity.showSnackBar(getString(R.string.select_city)) + } + appClientDetails.clientFeaturesKeys?.isAddress == true && binding.etZipCode.text.toString() + .isEmpty() -> { + binding.etZipCode.showSnackBar(getString(R.string.zip)) + } + appClientDetails.insurance == true && (!binding.cbYes.isChecked && !binding.cbNo.isChecked) -> { + binding.etCity.showSnackBar(getString(R.string.do_you_have_insurance)) + } + appClientDetails.insurance == true && (binding.cbYes.isChecked && idsInsurance.isEmpty()) -> { + binding.etCity.showSnackBar(getString(R.string.select_insurance)) + } +// appClientDetails.insurance == true && (binding.cbYes.isChecked && itemImages.isEmpty()) -> { +// binding.etCity.showSnackBar(getString(R.string.insurance_information)) +// } + + appClientDetails.insurance == true && (binding.cbYes.isChecked && items.isEmpty()) -> { + binding.etCity.showSnackBar(getString(R.string.insurance_information)) + } + + appClientDetails.insurance == true && (!binding.cbTerm1.isChecked || !binding.cbTerm3.isChecked + || !binding.cbTerm3.isChecked) -> { + binding.etCity.showSnackBar(getString(R.string.check_all_terms)) + binding.nsvInsurance.fullScroll(View.FOCUS_DOWN) + } + else -> { + /*Check if images Uploaded or not*/ + hitApiUpdate() + } + } + } + + private fun hitApiUpdate() { + if (isConnectedToInternet(requireContext(), true)) { + /*Get if insurance selected*/ + var idsInsurance = "" + items.forEach { + if (it.isSelected) + idsInsurance += it.id + "," + } + + val hashMap = HashMap() + hashMap["name"] = userRepository.getUser()?.name ?: "" + hashMap["address"] = binding.etAddress.text.toString() + hashMap["country"] = countryId + hashMap["state"] = stateId + hashMap["city"] = cityId + hashMap["insurance_enable"] = if (binding.cbYes.isChecked) "1" else "0" + + /*Get selected insurance*/ + if (binding.cbYes.isChecked) { + hashMap["insurances"] = idsInsurance.removeSuffix(",") + } + + /*Check if zip id is there in custom fields*/ + + appClientDetails.custom_fields?.customer?.forEach { + if (it.field_name == CustomFields.ZIP_CODE) { + val customer = ArrayList() + val item = it + item.field_value = binding.etZipCode.text.toString() + + customer.add(item) + + hashMap["custom_fields"] = Gson().toJson(customer) + return@forEach + } + } + + if (itemImages.isNotEmpty()) { + /* if (!userData?.insurance_images.isNullOrEmpty()) + itemImagesUploaded.addAll(userData?.insurance_images ?: emptyList())*/ + hashMap["insurance_info"] = Gson().toJson(itemImages) + } + + if (arguments?.containsKey(AddFamilyFragment.EXTRA_FAMILY) == true) { + hashMap["family_id"] = userData?.id ?: "" + viewModel.addFamily(hashMap) + } else { + viewModel.updateProfile(hashMap) + } + } + } + + + private fun bindObservers() { + viewModel.updateProfile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelVersion.countryCity.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + when (it.data?.type) { + CountryListType.COUNTRY -> { + itemsCountry.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_country) + itemsCountry.add(countryCity) + + itemsCountry.addAll(it.data.country ?: emptyList()) + spinnerCountryAdapter?.notifyDataSetChanged() + + } + CountryListType.STATE -> { + itemsState.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_state) + itemsState.add(countryCity) + + itemsState.addAll(it.data.state ?: emptyList()) + spinnerStateAdapter?.notifyDataSetChanged() + + } + CountryListType.CITY -> { + itemsCity.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_city) + itemsCity.add(countryCity) + + itemsCity.addAll(it.data.city ?: emptyList()) + spinnerCityAdapter?.notifyDataSetChanged() + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.addFamily.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + val fragment = SuccessFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setImageAdapter() { + imagesAdapter = InsuranceImagesAdapter(this, itemImages) + binding.rvImages.adapter = imagesAdapter + } + + + /*Adapter item click*/ + fun clickItem() { + val fragment = DialogAddDocumentFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + fun addedDocument(document: DocImage) { + itemImages.add(document) + imagesAdapter?.notifyDataSetChanged() + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceImagesAdapter.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceImagesAdapter.kt new file mode 100644 index 0000000..422a487 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/InsuranceImagesAdapter.kt @@ -0,0 +1,74 @@ +package com.consultantapp.ui.loginSignUp.insurance + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.databinding.RvItemImageInsuranceBinding +import com.consultantapp.utils.DocType +import com.consultantapp.utils.gone +import com.consultantapp.utils.visible + + +class InsuranceImagesAdapter(private val fragment: InsuranceFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + val MAX_ITEM = 1 + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + if (items.isEmpty() || (position == 0 && items.size < MAX_ITEM)) + holder.bind(null) + else if (items.size == MAX_ITEM) + holder.bind(items[position]) + else + holder.bind(items[position - 1]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_image_insurance, parent, false)) + + } + + override fun getItemCount(): Int = if (items.size == MAX_ITEM) items.size else items.size + 1 + + inner class ViewHolder(val binding: RvItemImageInsuranceBinding) : + RecyclerView.ViewHolder(binding.root) { + + val context = binding.root.context + + init { + binding.ivImage.setOnClickListener { + if (items.size < MAX_ITEM && adapterPosition == 0) { + fragment.clickItem() + } + } + } + + + fun bind(item: DocImage?) = with(binding) { + ivImage.setBackgroundResource(R.drawable.drawable_grey_stroke) + if (items.size < MAX_ITEM && adapterPosition == 0) { + ivImage.setImageResource(R.drawable.ic_attach) + tvNumber.text = "" + tvDate.text = "" + tvDelete.gone() + } else { + tvNumber.text = binding.root.context.getString(R.string.insurance_no,item?.insuranceNumber) + tvDate.text = binding.root.context.getString(R.string.expiry_date_s,item?.expiry) + + if (item?.type == DocType.PDF) { + ivImage.setBackgroundResource(R.drawable.ic_pdf) + Glide.with(context).load("").into(ivImage) + } else + Glide.with(context).load(item?.imageFile).into(ivImage) + tvDelete.visible() + } + } + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/add/DialogAddDocumentFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/add/DialogAddDocumentFragment.kt new file mode 100644 index 0000000..32b68ed --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/insurance/add/DialogAddDocumentFragment.kt @@ -0,0 +1,256 @@ +package com.consultantapp.ui.loginSignUp.insurance.add + +import android.Manifest +import android.app.Activity +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.consultantapp.R +import com.consultantapp.data.models.requests.DocImage +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.ItemAddDocumentBinding +import com.consultantapp.ui.dashboard.chat.UploadFileViewModel +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.PermissionUtils +import com.consultantapp.utils.dialogs.ProgressDialogImage +import dagger.android.support.DaggerDialogFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import javax.inject.Inject + + +@RuntimePermissions +class DialogAddDocumentFragment(private val fragment: Fragment) : DaggerDialogFragment(), OnDateSelected { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: ItemAddDocumentBinding + + private lateinit var viewModelUpload: UploadFileViewModel + + private lateinit var progressDialogImage: ProgressDialogImage + + private var docImage: DocImage? = null + + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.item_add_document, container, false) + return binding.root + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + val dialog = super.onCreateDialog(savedInstanceState) + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + return dialog + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + binObservers() + } + + private fun initialise() { + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + progressDialogImage = ProgressDialogImage(requireActivity()) + + } + + private fun listeners() { + binding.ivBack.setOnClickListener { + dialog?.dismiss() + } + + binding.etDesc.setOnClickListener { + DateUtils.openDatePickerDialog( + requireActivity(), + this, + null, + (System.currentTimeMillis() - 36000) + ) + } + + binding.ivImage.setOnClickListener { + getStorageWithPermissionCheck() + } + + binding.tvAdd.setOnClickListener { + binding.tvAdd.hideKeyboard() + when { + docImage == null || docImage?.imageFile == null -> { + binding.etName.showSnackBar(getString(R.string.select_document)) + } + binding.etName.text.toString().trim().isEmpty() -> { + binding.etName.showSnackBar(getString(R.string.insurance_number)) + } + binding.etDesc.text.toString().trim().isEmpty() -> { + binding.etDesc.showSnackBar(getString(R.string.expiry_date)) + } + isConnectedToInternet(requireContext(), true) -> { + if (docImage != null || docImage?.imageFile != null) + uploadFileOnServer() + } + } + } + } + + private fun uploadFileOnServer() { + val hashMap = java.util.HashMap() + hashMap["type"] = getRequestBody(docImage?.type) + + val body: RequestBody = docImage?.imageFile?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + docImage?.imageFile?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + private fun binObservers() { + viewModelUpload.uploadFile.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + docImage?.insuranceNumber = binding.etName.text.toString().trim() + docImage?.expiry = DateUtils.dateFormatChange( + DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etDesc.text.toString() + ) + docImage?.image = it.data?.image_name + + if (fragment is InsuranceFragment) + fragment.addedDocument(docImage ?: DocImage()) + dialog?.dismiss() + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + + when (requestCode) { + AppRequestCode.IMAGE_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll( + data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList() + ) + + val fileToUpload = compressImage( + requireActivity(), File( + ContentUriUtils.getFilePath( + requireContext(), + docPaths[0] + ) + ) + ) + Glide.with(requireContext()).load(fileToUpload).centerCrop() + .into(binding.ivImage) + + docImage = DocImage() + docImage?.type = DocType.IMAGE + docImage?.imageFile = fileToUpload*/ + } + + AppRequestCode.DOC_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll( + data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_DOCS) + ?: emptyList() + ) + + val fileToUpload = File( + ContentUriUtils.getFilePath( + requireContext(), + docPaths[0] + ) + ) + Glide.with(requireContext()).load(R.drawable.ic_pdf).centerCrop() + .into(binding.ivImage) + + docImage = DocImage() + docImage?.type = DocType.PDF + docImage?.imageFile = fileToUpload*/ + + } + } + } + } + + override fun onDateSelected(date: String) { + binding.etDesc.setText(date) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + askForOption(this, requireActivity(), binding.ivImage) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/login/InfoUserFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/login/InfoUserFragment.kt new file mode 100644 index 0000000..a3156e4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/login/InfoUserFragment.kt @@ -0,0 +1,116 @@ +package com.consultantapp.ui.loginSignUp.login + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentInfoUserBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class InfoUserFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentInfoUserBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_info_user, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + binding.ccpCountryCode.setCountryForNameCode(appClientDetails.country_name_code ?: "IN") + + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvTitle.text = getString(R.string.countinue_for_s, getString(R.string.home_care_appointment)) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivNext.setOnClickListener { + when { + binding.etMobileNumber.text.toString().isEmpty() || binding.etMobileNumber.text.toString().length < 6 -> { + binding.etMobileNumber.showSnackBar(getString(R.string.enter_phone_number)) + } + binding.etName.text.toString().trim().isEmpty() -> { + binding.etName.showSnackBar(getString(R.string.enter_name)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["country_code"] = binding.ccpCountryCode.selectedCountryCodeWithPlus + hashMap["phone"] = binding.etMobileNumber.text.toString() + + viewModel.sendSms(hashMap) + } + } + } + } + + private fun bindObservers() { + viewModel.sendSMS.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + val fragment = VerifyOTPFragment() + val bundle = Bundle() + bundle.putString(COUNTRY_CODE, binding.ccpCountryCode.selectedCountryCodeWithPlus) + bundle.putString(PHONE_NUMBER, binding.etMobileNumber.text.toString()) + bundle.putString(EXTRA_NAME, binding.etName.text.toString()) + bundle.putString(EXTRA_CONSULT_TYPE, ConsultType.HOME_VISIT) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/login/LoginFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/login/LoginFragment.kt new file mode 100644 index 0000000..1c33171 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/login/LoginFragment.kt @@ -0,0 +1,143 @@ +package com.consultantapp.ui.loginSignUp.login + +import android.os.Bundle +import android.text.method.LinkMovementMethod +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.databinding.FragmentLoginBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.loginSignUp.loginemail.LoginEmailFragment +import com.consultantapp.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class LoginFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentLoginBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + binding.ccpCountryCode.setCountryForNameCode(appClientDetails.country_name_code ?: "IN") + + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setAcceptTerms(requireActivity()), TextView.BufferType.SPANNABLE) + + if (requireActivity().intent?.hasExtra(WelcomeFragment.EXTRA_SIGNUP) == true) { + binding.tvLoginScreen.gone() + binding.tvLoginTitle.gone() + binding.tvTerms.visible() + binding.cbTerms.visible() + } else if (arguments?.containsKey(UPDATE_NUMBER) == true) { + binding.tvTitle.text = getString(R.string.update) + + binding.tvLoginScreen.gone() + binding.tvLoginTitle.gone() + binding.tvTerms.gone() + binding.cbTerms.gone() + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvLoginScreen.setOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + replaceFragment(requireActivity().supportFragmentManager, LoginEmailFragment(), R.id.container) + } + + binding.ivNext.setOnClickListener { + when { + binding.etMobileNumber.text.toString().isEmpty() || binding.etMobileNumber.text.toString().length < 6 -> { + binding.etMobileNumber.showSnackBar(getString(R.string.enter_phone_number)) + } + binding.tvTerms.visibility==View.VISIBLE && !binding.cbTerms.isChecked -> { + binding.tvTerms.showSnackBar(getString(R.string.agree_to_terms)) + } + isConnectedToInternet(requireContext(), true) -> { + + val hashMap = HashMap() + hashMap["country_code"] = binding.ccpCountryCode.selectedCountryCodeWithPlus + hashMap["phone"] = binding.etMobileNumber.text.toString() + + viewModel.sendSms(hashMap) + } + } + } + } + + private fun bindObservers() { + viewModel.sendSMS.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + val fragment = VerifyOTPFragment() + val bundle = Bundle() + bundle.putString(COUNTRY_CODE, binding.ccpCountryCode.selectedCountryCodeWithPlus) + bundle.putString(PHONE_NUMBER, binding.etMobileNumber.text.toString()) + + if (arguments?.containsKey(UPDATE_NUMBER) == true) + bundle.putBoolean(UPDATE_NUMBER, true) + + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/loginemail/LoginEmailFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/loginemail/LoginEmailFragment.kt new file mode 100644 index 0000000..655f374 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/loginemail/LoginEmailFragment.kt @@ -0,0 +1,155 @@ +package com.consultantapp.ui.loginSignUp.loginemail + +import android.app.Activity +import android.os.Bundle +import android.util.Patterns +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.ProviderType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentLoginEmailBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.loginSignUp.forgotpassword.ForgotPasswordFragment +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.ui.loginSignUp.login.LoginFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class LoginEmailFragment : DaggerFragment() { + + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentLoginEmailBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_login_email, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivNext.setOnClickListener { + when { + binding.etEmail.text.toString().isEmpty() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + !Patterns.EMAIL_ADDRESS.matcher(binding.etEmail.text.toString()).matches() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + } + binding.etPassword.text.toString().length < 8 -> { + binding.etPassword.showSnackBar(getString(R.string.enter_password)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.email + hashMap["provider_id"] = binding.etEmail.text.toString() + hashMap[ApiKeys.PROVIDER_VERIFICATION] = binding.etPassword.text.toString() + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + } + } + + binding.tvForgetPass.setOnClickListener { + replaceFragment(requireActivity().supportFragmentManager, ForgotPasswordFragment(), R.id.container) + } + + binding.tvLoginScreen.setOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + replaceFragment(requireActivity().supportFragmentManager, LoginFragment(), R.id.container) + } + } + + + private fun bindObservers() { + viewModel.login.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + if (userRepository.isUserLoggedIn()) { + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } else if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + val fragment = InsuranceFragment() + val bundle = Bundle() + bundle.putSerializable(USER_DATA, userRepository.getUser()) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} + + + diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/signup/SignUpFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/signup/SignUpFragment.kt new file mode 100644 index 0000000..4a8ba74 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/signup/SignUpFragment.kt @@ -0,0 +1,819 @@ +package com.consultantapp.ui.loginSignUp.signup + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Matrix +import android.net.Uri +import android.os.Bundle +import android.os.Environment +import android.provider.MediaStore +import android.text.method.LinkMovementMethod +import android.util.Log +import android.util.Patterns +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.TextView +import androidx.databinding.DataBindingUtil +import androidx.exifinterface.media.ExifInterface +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.appFeatures +import com.consultantapp.data.models.requests.SaveAddress +import com.consultantapp.data.models.requests.SetFilter +import com.consultantapp.data.models.responses.CountryCity +import com.consultantapp.data.models.responses.Filter +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.ProviderType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentSignupBinding +import com.consultantapp.ui.AppVersionViewModel +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.dashboard.chat.UploadFileViewModel +import com.consultantapp.ui.loginSignUp.insurance.CustomSpinnerAdapter +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.ui.loginSignUp.loginemail.LoginEmailFragment +import com.consultantapp.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_SOCIAL +import com.consultantapp.utils.* +import com.consultantapp.utils.PermissionUtils +import com.consultantapp.utils.dialogs.ProgressDialog +import com.consultantapp.utils.dialogs.ProgressDialogImage +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.libraries.places.widget.Autocomplete +import com.google.gson.Gson +import dagger.android.support.DaggerFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import kotlinx.android.synthetic.main.fragment_signup.* +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import javax.inject.Inject +import com.consultantapp.data.models.requests.DocImage +import java.io.FileOutputStream + +@RuntimePermissions +class SignUpFragment : BasePhotoUplaodFragment(), OnDateSelected { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentSignupBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelUpload: UploadFileViewModel + + private lateinit var viewModelVersion: AppVersionViewModel + + private var userData: UserData? = null + + private var isUpdate = false + + private var fileToUpload: File? = null + + private var openFirstCountry = true + + private var countryId = "" + + private var spinnerCountryAdapter: CustomSpinnerAdapter? = null + + private val itemsCountry = ArrayList() + + private var openFirstGender = true + + private var spinnerGenderAdapter: CustomSpinnerAdapter? = null + + private val itemsGender = ArrayList() + + private var prefrences: ArrayList? = null + + private var hashMap = HashMap() + + private var saveAddress = SaveAddress() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_signup, container, false) + rootView = binding.root + + initialise() + listeners() + setEditInformation() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + viewModelVersion = + ViewModelProvider(this, viewModelFactory)[AppVersionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + progressDialogImage = ProgressDialogImage(requireActivity()) + + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setAcceptTerms(requireActivity()), TextView.BufferType.SPANNABLE) + + /*If need country list*/ + if (appFeatures.signUpAddition) { + binding.ilCountry.visible() + binding.ilGender.visible() + + spinnerCountryAdapter = CustomSpinnerAdapter(requireContext(), itemsCountry) + binding.spnCountry.adapter = spinnerCountryAdapter + var hashMap = HashMap() + hashMap["type"] = CountryListType.COUNTRY + viewModelVersion.countryCity(hashMap) + + spinnerGenderAdapter = CustomSpinnerAdapter(requireContext(), itemsGender) + binding.spnGender.adapter = spinnerGenderAdapter + hashMap = HashMap() + hashMap["type"] = PreferencesType.GENDER + viewModelVersion.preferences(hashMap) + } + + binding.ilNationalId.hideShowView(BuildConfig.FLAVOR=="homeDoctor") + + binding.ilBio.hideShowView(BuildConfig.FLAVOR !="taradoc") + binding.ilCity.hideShowView(BuildConfig.FLAVOR =="taradoc") + + + binding.clPhone.hideShowView(BuildConfig.FLAVOR =="taradoc") + binding.ccpCountryCode.setCountryForNameCode(appClientDetails.country_name_code ?: "IN") + } + + private fun setEditInformation() { + editTextScroll(binding.etBio) + userData = userRepository.getUser() + + binding.ilInviteCode.hideShowView(appFeatures.needInviteCode) + if (arguments?.containsKey(UPDATE_PROFILE) == true) { + binding.tvHeader.text = getString(R.string.update) + + binding.etName.setText(userData?.name ?: "") + binding.etBio.setText(userData?.profile?.bio ?: "") + binding.etEmail.setText(userData?.email ?: "") + binding.etNationalId.setText(userData?.national_id ?: "") + + binding.etCity.setText(userData?.profile?.city) + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.etDob.setText(DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "")) + + if (appFeatures.signUpAddition) { + binding.etCountry.setText(userData?.profile?.country ?: "") + countryId = userData?.profile?.country_id ?: "" + + userData?.master_preferences?.forEach { + when (it.preference_name) { + PreferencesType.GENDER -> { + it.options?.forEachIndexed { index, filterOption -> + if (filterOption.isSelected) + binding.etGender.setText(filterOption.option_name) + } + } + } + } + } + + loadImage("profile",binding.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + + /*If Social login email not editable*/ + if (binding.etEmail.text.toString().isNotEmpty() && (userData?.provider_type == ProviderType.facebook || + userData?.provider_type == ProviderType.google)) { + binding.ilEmail.isEnabled = false + } + + binding.ilPassword.gone() + binding.ilConfirmPassword.gone() + binding.tvAlreadyRegister.gone() + binding.tvLogin.gone() + binding.tvTerms.gone() + binding.cbTerms.gone() + binding.ilInviteCode.gone() + binding.clPhone.gone() + + isUpdate = true + } else if (arguments?.containsKey(UPDATE_NUMBER) == true) { + binding.etName.setText(userData?.name ?: "") + binding.etEmail.setText(userData?.email ?: "") + binding.etBio.setText(userData?.profile?.bio ?: "") + binding.etNationalId.setText(userData?.national_id ?: "") + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.etDob.setText(DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "")) + + loadImage("profile",binding.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + + /*If Social login email not editable*/ + if (binding.etEmail.text.toString().isNotEmpty() && (userData?.provider_type == ProviderType.facebook || + userData?.provider_type == ProviderType.google)) { + binding.ilEmail.isEnabled = false + } + + binding.ilPassword.gone() + binding.ilConfirmPassword.gone() + binding.tvAlreadyRegister.gone() + binding.clPhone.gone() + binding.tvLogin.gone() + binding.tvTerms.hideShowView(requireActivity().intent.hasExtra(EXTRA_SOCIAL)) + binding.cbTerms.hideShowView(requireActivity().intent.hasExtra(EXTRA_SOCIAL)) + + isUpdate = true + } + } + @SuppressLint("NewApi") + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + when { + arguments?.containsKey(UPDATE_PROFILE) == true -> requireActivity().finish() + requireActivity().supportFragmentManager.backStackEntryCount > 0 -> + requireActivity().supportFragmentManager.popBackStack() + else -> requireActivity().finish() + + } + } + + binding.etDob.setOnClickListener { + DateUtils.openDatePicker(requireActivity(), this, (System.currentTimeMillis() - 36000), null) + } + + binding.tvLogin.setOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + replaceFragment(requireActivity().supportFragmentManager, LoginEmailFragment(), R.id.container) + } + + binding.ivNext.setOnClickListener { + checkValidation() + } + binding.etCity.setOnClickListener { + placePicker(this, requireActivity()) + } + binding.ivPic.setOnClickListener { + showImageDialog(false) + //getStorageWithPermissionCheck() + } + + binding.etGender.setOnClickListener { + binding.etGender.hideKeyboard() + binding.spnGender.performClick() + } + + binding.spnGender.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + when { + openFirstGender -> openFirstGender = false + position == 0 -> binding.etGender.setText("") + else -> binding.etGender.setText(itemsGender[position].name) + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etCountry.setOnClickListener { + binding.etCountry.hideKeyboard() + binding.spnCountry.performClick() + } + + binding.spnCountry.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + when { + openFirstCountry -> openFirstCountry = false + position == 0 -> binding.etCountry.setText("") + else -> { + binding.etCountry.setText(itemsCountry[position].name) + countryId = itemsCountry[position].id ?: "" + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + } + + private fun checkValidation() { + when { + binding.etName.text.toString().trim().isEmpty() -> { + binding.etName.showSnackBar(getString(R.string.enter_name)) + } + binding.etDob.text.toString().isEmpty() -> { + binding.etDob.showSnackBar(getString(R.string.select_dob)) + } + (!isUpdate && binding.etEmail.text.toString().trim().isEmpty()) -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + (binding.etEmail.text.toString().trim().isNotEmpty() && !Patterns.EMAIL_ADDRESS.matcher( + binding.etEmail.text.toString().trim()).matches()) -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + } + (!isUpdate && binding.etPassword.text.toString().trim().length < 8) -> { + binding.etPassword.showSnackBar(getString(R.string.enter_password)) + } + appFeatures.signUpAddition && binding.etGender.text.toString().isEmpty() -> { + binding.etGender.showSnackBar(getString(R.string.select_gender)) + } + appFeatures.signUpAddition && binding.etCountry.text.toString().isEmpty() -> { + binding.etCountry.showSnackBar(getString(R.string.select_country)) + } + (binding.ilNationalId.visibility==View.VISIBLE && binding.etNationalId.text.toString().trim().isEmpty()) -> { + binding.etNationalId.showSnackBar(getString(R.string.national_id_number)) + } + binding.clPhone.visibility==View.VISIBLE &&( binding.etMobileNumber.text.toString().isEmpty() || binding.etMobileNumber.text.toString().length < 6 )-> { + binding.etMobileNumber.showSnackBar(getString(R.string.enter_phone_number)) + } + binding.etBio.text.toString().trim().isEmpty() && BuildConfig.FLAVOR!= "taradoc"-> { + binding.etBio.showSnackBar(getString(R.string.enter_bio)) + } + binding.etCity.text.toString().trim().isEmpty() && BuildConfig.FLAVOR== "taradoc"-> { + binding.etCity.showSnackBar(getString(R.string.select_city)) + } + binding.tvTerms.visibility==View.VISIBLE && !binding.cbTerms.isChecked -> { + binding.tvTerms.showSnackBar(getString(R.string.agree_to_terms)) + } + isConnectedToInternet(requireContext(), true) -> { + if (fileToUpload != null && fileToUpload?.exists() == true) { + uploadFileOnServer(fileToUpload) + } else { + hitApi(null) + } + } + } + } + + private fun uploadFileOnServer(fileToUpload: File?) { + val hashMap = HashMap() + + hashMap["type"] = getRequestBody(DocType.IMAGE) + + val body: RequestBody = fileToUpload?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + fileToUpload?.name] = body + + viewModelUpload.uploadFile(hashMap) + + } + + private fun hitApi(image: String?) { + hashMap = HashMap() + hashMap["name"] = binding.etName.text.toString().trim() + try { + hashMap["dob"] = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etDob.text.toString()) + }catch (e:Exception){} + hashMap["bio"] = binding.etBio.text.toString().trim() + + if (binding.etNationalId.text.toString().trim().isNotEmpty()) + hashMap["national_id"] = binding.etNationalId.text.toString().trim() + + if (binding.etInviteCode.text.toString().trim().isNotEmpty()) + hashMap["referral_code"] = binding.etInviteCode.text.toString().trim() + + if (binding.ilCity.visibility==View.VISIBLE && binding.etCity.text.toString().trim().isNotEmpty()) + hashMap["city"] = binding.etCity.text.toString().trim() + + if(binding.clPhone.visibility==View.VISIBLE){ + hashMap["country_code"] = binding.ccpCountryCode.selectedCountryCodeWithPlus + hashMap["phone"] = binding.etMobileNumber.text.toString() + } + if (appFeatures.signUpAddition) { + hashMap["country"] = countryId + + /*Gender*/ + val filterArray = ArrayList() + + var setFilter: SetFilter + prefrences?.forEach { + setFilter = SetFilter() + setFilter.preference_id = it.id + when (it.preference_name) { + PreferencesType.GENDER -> { + if (binding.spnGender.selectedItemPosition != 0) { + setFilter.option_ids = ArrayList() + setFilter.option_ids?.add( + itemsGender[spnGender.selectedItemPosition].id + ?: "" + ) + filterArray.add(setFilter) + } + } + } + } + + hashMap["master_preferences"] = Gson().toJson(filterArray) + } + + if (image != null) + hashMap["profile_image"] = image + + if (binding.etEmail.text.toString().trim().isNotEmpty()) + hashMap["email"] = binding.etEmail.text.toString().trim() + + + /*Update profile or register*/ + when { + arguments?.containsKey(UPDATE_NUMBER) == true -> { + viewModel.updateProfile(hashMap) + } + arguments?.containsKey(UPDATE_PROFILE) == true -> { + viewModel.updateProfile(hashMap) + } + BuildConfig.FLAVOR == "nurseLynx"|| BuildConfig.FLAVOR == "homeDoctor" -> { + val hashMapOtp = HashMap() + hashMapOtp["email"] = binding.etEmail.text.toString().trim() + viewModel.sendEmailOtp(hashMapOtp) + } + else->{ + hashMap["password"] = binding.etPassword.text.toString().trim() + hashMap["user_type"] = APP_TYPE + viewModel.register(hashMap) + } + } + } + + + private fun bindObservers() { + viewModel.sendEmailOtp.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hashMap["password"] = binding.etPassword.text.toString().trim() + hashMap["user_type"] = APP_TYPE + + val fragment = VerifyOTPFragment() + val bundle = Bundle() + bundle.putString(VerifyOTPFragment.EXTRA_EMAIL, binding.etEmail.text.toString().trim()) + bundle.putSerializable(VerifyOTPFragment.EXTRA_EMAIL_DATA, hashMap) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.register.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + /*Handle feature keys*/ + if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + val fragment = InsuranceFragment() + val bundle = Bundle() + bundle.putSerializable(USER_DATA, userRepository.getUser()) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } else { + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + requireActivity().finish() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelUpload.uploadFile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + hitApi(it.data?.image_name ?: "") + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + + + viewModel.updateProfile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + requireActivity().setResult(Activity.RESULT_OK) + + /*Handle feature keys*/ + if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + val fragment = InsuranceFragment() + val bundle = Bundle() + bundle.putSerializable(USER_DATA, userRepository.getUser()) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } else { + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + requireActivity().finish() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelVersion.countryCity.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + when (it.data?.type) { + CountryListType.COUNTRY -> { + itemsCountry.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_country) + itemsCountry.add(countryCity) + + itemsCountry.addAll(it.data.country ?: emptyList()) + spinnerCountryAdapter?.notifyDataSetChanged() + + } + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModelVersion.preferences.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + prefrences = ArrayList() + prefrences?.addAll(it.data?.preferences ?: emptyList()) + + prefrences?.forEach { + when (it.preference_name) { + PreferencesType.GENDER -> { + itemsGender.clear() + + var countryCity = CountryCity() + countryCity.name = getString(R.string.select_gender) + itemsGender.add(countryCity) + + it.options?.forEach { + countryCity = CountryCity() + countryCity.id = it.id + countryCity.name = it.option_name + + itemsGender.add(countryCity) + } + + spinnerGenderAdapter?.notifyDataSetChanged() + + } + } + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + override fun onDateSelected(date: String) { + binding.etDob.setText(date) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + + /* if (requestCode == AppRequestCode.IMAGE_PICKER) { + val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList() + ) + + fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(fileToUpload).into(binding.ivPic) + + }else*/ if (requestCode == AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) { + val place = Autocomplete.getPlaceFromIntent(data!!) + binding.etCity.setText(getCity(place,requireContext())) + + saveAddress.locationName = binding.etCity.text.toString() + saveAddress.long = place.latLng?.longitude + saveAddress.lat = place.latLng?.latitude + + } + } + } + + override fun getPdf(uri: String?) { + + } + + override fun getImage(uri: String?, data: Uri) { + val selectedImageUri: Uri? = data + selectedImageUri?.let { it2 -> + val file = uriToFile(requireContext(), it2) + file?.let { originalFile -> + val compressedFile = compressImage(requireContext(), originalFile) + compressedFile?.let { + fileToUpload = it + Glide.with(requireContext()) + .load(it) + .into(binding.ivPic) + } ?: run { + Log.e("ImageError", "Unable to compress image.") + } + } ?: run { + Log.e("ImageError", "Unable to convert Uri to File.") + } + } + } + + fun uriToFile(context: Context, uri: Uri): File? { + return try { + val inputStream = context.contentResolver.openInputStream(uri) ?: return null + val tempFile = File.createTempFile("temp_image", ".jpg", context.cacheDir) + tempFile.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + tempFile + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + fun compressImage(context: Context, originalFile: File): File? { + return try { + // Decode the image file + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + BitmapFactory.decodeFile(originalFile.absolutePath, options) + + // Calculate inSampleSize + options.inSampleSize = calculateInSampleSize(options, 800, 800) // target dimensions + options.inJustDecodeBounds = false + + // Create scaled Bitmap + val bitmap = BitmapFactory.decodeFile(originalFile.absolutePath, options) + + // Check and handle image orientation + val rotatedBitmap = handleImageOrientation(originalFile, bitmap) + + // Save compressed image to a temporary file + val compressedFile = File.createTempFile("compressed_image", ".jpg", context.cacheDir) + compressedFile.outputStream().use { outputStream -> + rotatedBitmap?.compress(Bitmap.CompressFormat.JPEG, 40, outputStream) + } + compressedFile + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + fun handleImageOrientation(file: File, bitmap: Bitmap?): Bitmap? { + return try { + val exif = ExifInterface(file.absolutePath) + val orientation = exif.getAttributeInt( + ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_UNDEFINED + ) + + val matrix = Matrix() + when (orientation) { + ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f) + ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f) + ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f) + } + + // Create a new bitmap with the correct orientation + Bitmap.createBitmap(bitmap!!, 0, 0, bitmap.width, bitmap.height, matrix, true) + } catch (e: Exception) { + e.printStackTrace() + bitmap + } + } + + /* fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int { + val (height: Int, width: Int) = options.run { outHeight to outWidth } + var inSampleSize = 1 + + if (height > reqHeight || width > reqWidth) { + val halfHeight: Int = height / 2 + val halfWidth: Int = width / 2 + + while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { + inSampleSize *= 2 + } + } + return inSampleSize + }*/ + override fun getVideo(uri: String?, i: Int) { + + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + selectImages(this, requireActivity()) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/verifyotp/VerifyOTPFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/verifyotp/VerifyOTPFragment.kt new file mode 100644 index 0000000..1e65908 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/verifyotp/VerifyOTPFragment.kt @@ -0,0 +1,359 @@ +package com.consultantapp.ui.loginSignUp.verifyotp + +import android.app.Activity +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.ProviderType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentVerifyOtpBinding +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.dashboard.doctor.listing.DoctorListActivity +import com.consultantapp.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantapp.ui.loginSignUp.signup.SignUpFragment +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class VerifyOTPFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var appSocket: AppSocket + + + private lateinit var binding: FragmentVerifyOtpBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private var phoneNumber = "" + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_verify_otp, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + phoneNumber = when { + arguments?.containsKey(EXTRA_EMAIL) == true -> { + arguments?.getString(EXTRA_EMAIL) ?: "" + } + arguments?.containsKey(COUNTRY_CODE) == true -> { + arguments?.getString(COUNTRY_CODE).toString() + arguments?.getString(PHONE_NUMBER).toString() + } + else -> "" + } + binding.tvMsg.text = getString(R.string.we_sent_you_a_code, phoneNumber) + if(BuildConfig.FLAVOR=="taradoc"){ + binding.tvResentOTP.setTextColor(Color.parseColor("#E7D27C")) + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.ivNext.setOnClickListener { + when { + binding.pvOtp.text.toString().length < 4 -> { + binding.pvOtp.showSnackBar(getString(R.string.enter_otp)) + } + binding.pvOtp.text.toString().length == 4 -> { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["country_code"] = arguments?.getString(COUNTRY_CODE).toString() + + when { + arguments?.containsKey(EXTRA_EMAIL) == true -> { + hashMap["email"] = arguments?.getString(EXTRA_EMAIL).toString() + hashMap["otp"] = binding.pvOtp.text.toString() + viewModel.emailVerify(hashMap) + } + arguments?.containsKey(UPDATE_NUMBER) == true -> { + hashMap["phone"] = arguments?.getString(PHONE_NUMBER).toString() + hashMap["otp"] = binding.pvOtp.text.toString() + viewModel.updateNumber(hashMap) + } + else -> { + hashMap["provider_id"] = arguments?.getString(PHONE_NUMBER).toString() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.phone + hashMap[ApiKeys.PROVIDER_VERIFICATION] = binding.pvOtp.text.toString() + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + } + + } + } + } + } + + binding.tvResentOTP.setOnClickListener { + val hashMap = HashMap() + if (arguments?.containsKey(EXTRA_EMAIL) == true) { + hashMap["email"] = arguments?.getString(EXTRA_EMAIL).toString() + viewModel.sendEmailOtp(hashMap) + } else { + hashMap["country_code"] = arguments?.getString(COUNTRY_CODE).toString() + hashMap["phone"] = arguments?.getString(PHONE_NUMBER).toString() + + viewModel.sendSms(hashMap) + } + } + } + + private fun bindObservers() { + viewModel.emailVerify.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + viewModel.register(arguments?.getSerializable(EXTRA_EMAIL_DATA) as HashMap) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.sendEmailOtp.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireContext().longToast(getString(R.string.code_sent_to, phoneNumber)) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.register.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + requireActivity().supportFragmentManager.popBackStack() + + /*Handle feature keys*/ + if (userRepository.isUserLoggedIn()) { + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + requireActivity().finish() + } else if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + val fragment = InsuranceFragment() + val bundle = Bundle() + bundle.putSerializable(USER_DATA, userRepository.getUser()) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.login.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + when { + userRepository.isUserLoggedIn() -> { + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + + if (arguments?.containsKey(EXTRA_CONSULT_TYPE) == true) { + startActivity(Intent(requireContext(), DoctorListActivity::class.java) + .putExtra(EXTRA_CONSULT_TYPE, ConsultType.HOME_VISIT)) + } + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + arguments?.containsKey(EXTRA_CONSULT_TYPE) == true -> { + val hashMap = HashMap() + hashMap["name"] = arguments?.getString(EXTRA_NAME) ?:"" + hashMap["user_type"] = APP_TYPE + viewModel.updateProfile(hashMap) + + } + else -> { + val fragment = SignUpFragment() + val bundle = Bundle() + bundle.putBoolean(UPDATE_NUMBER, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.sendSMS.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireContext().longToast(getString(R.string.code_sent_to, phoneNumber)) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + + viewModel.updateNumber.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + if (userRepository.isUserLoggedIn()) { + /*Connect socket and update token*/ + appSocket.init() + userRepository.pushTokenUpdate() + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } else { + /*Handle feature keys*/ + if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + replaceFragment(requireActivity().supportFragmentManager, + InsuranceFragment(), R.id.container) + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.updateProfile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + requireActivity().setResult(Activity.RESULT_OK) + + appSocket.init() + userRepository.pushTokenUpdate() + + if (arguments?.containsKey(EXTRA_CONSULT_TYPE) == true) { + startActivity(Intent(requireContext(), DoctorListActivity::class.java) + .putExtra(EXTRA_CONSULT_TYPE, + ConsultType.HOME_VISIT)) + + requireActivity().finish() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + companion object { + const val EXTRA_EMAIL = "EXTRA_EMAIL" + const val EXTRA_EMAIL_DATA = "EXTRA_EMAIL_DATA" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/loginSignUp/welcome/WelcomeFragment.kt b/app/src/main/java/com/consultantapp/ui/loginSignUp/welcome/WelcomeFragment.kt new file mode 100644 index 0000000..231e181 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/loginSignUp/welcome/WelcomeFragment.kt @@ -0,0 +1,295 @@ +package com.consultantapp.ui.loginSignUp.welcome + +import android.app.Activity +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.text.SpannableString +import android.text.method.LinkMovementMethod +import android.text.style.ForegroundColorSpan +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.network.ApiKeys +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.ProviderType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentWelcomeBinding +import com.consultantapp.di.DaggerBottomSheetDialogFragment +import com.consultantapp.ui.LoginViewModel +import com.consultantapp.ui.loginSignUp.SignUpActivity +import com.consultantapp.utils.* +import com.consultantapp.utils.dialogs.ProgressDialog +//import com.facebook.CallbackManager +//import com.facebook.FacebookCallback +//import com.facebook.FacebookException +//import com.facebook.login.LoginManager +//import com.facebook.login.LoginResult +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInClient +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.api.ApiException +import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.snapchat.kit.sdk.SnapLogin +import com.snapchat.kit.sdk.core.controller.LoginStateController +import javax.inject.Inject + + +class WelcomeFragment : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentWelcomeBinding + + private var rootView: View? = null + + /* private var callbackManager: CallbackManager? = CallbackManager.Factory.create()*/ + + lateinit var mGoogleSignInClient: GoogleSignInClient + + lateinit var gso: GoogleSignInOptions + + private val RC_SIGN_IN = 111 + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + + override fun onCreateView(inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_welcome, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + binding.tvTitle.text = formatString() + + //initial google sign in + gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestIdToken(getString(R.string.server_client_id)) + .requestEmail() + .build() + + mGoogleSignInClient = GoogleSignIn.getClient(requireActivity(), gso) + + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setAcceptTerms(requireActivity()), TextView.BufferType.SPANNABLE) + } + + private fun formatString(): SpannableString { + val appName = if (BuildConfig.FLAVOR == "homeDoctor") "" + else getString(R.string.app_name) + + val createAccount = getString(R.string.create_a_account, appName) + val stringFinal = SpannableString.valueOf(createAccount) + stringFinal.setSpan(ForegroundColorSpan(ContextCompat.getColor(requireContext(), R.color.colorPrimary)), + createAccount.indexOf(appName), + (createAccount.indexOf(appName) + appName.length), 0) + + return stringFinal + } + + private fun listeners() { + binding.ivCross.setOnClickListener { + dialog?.dismiss() + } + + binding.tvMobile.setOnClickListener { + startActivity(Intent(activity, SignUpActivity::class.java) + .putExtra(EXTRA_SIGNUP, true)) + dialog?.dismiss() + } + + binding.tvLogin.setOnClickListener { + startActivity(Intent(activity, SignUpActivity::class.java) + .putExtra(EXTRA_LOGIN, true)) + + dialog?.dismiss() + } + + binding.tvEmail.setOnClickListener { + startActivity(Intent(activity, SignUpActivity::class.java) + .putExtra(EXTRA_SIGNUP_EMAIL, false)) + + dialog?.dismiss() + } + + binding.tvFacebook.setOnClickListener { + loginFacebook() +// snapKitLogin() + } + + binding.tvGoogle.setOnClickListener { + loginGoogle() + } + } + + + private fun loginGoogle() { + mGoogleSignInClient.signOut() + mGoogleSignInClient.revokeAccess() + val signInIntent = mGoogleSignInClient.signInIntent + startActivityForResult(signInIntent, RC_SIGN_IN) + } + + + /*Login with Facebook*/ + private fun loginFacebook() { + /* LoginManager.getInstance().logOut() + + LoginManager.getInstance() + .logInWithReadPermissions(this, listOf("public_profile", "email")) + + LoginManager.getInstance().registerCallback(callbackManager, object : + FacebookCallback { + + override fun onSuccess(loginResult: LoginResult) { + if (isConnectedToInternet(requireActivity(), true)) { + + val hashMap = HashMap() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.facebook + hashMap[ApiKeys.PROVIDER_VERIFICATION] = loginResult.accessToken.token + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + } + + override fun onCancel() { + Log.e("FBLOGIN_FAILD", "Cancel") + } + + override fun onError(error: FacebookException) { + Log.e("FBLOGIN_FAILD", "ERROR", error) + } + })*/ + } + + + private fun snapKitLogin(){ + SnapLogin.getAuthTokenManager(requireContext()).startTokenGrant(); + + SnapLogin.getLoginStateController(getContext()).addOnLoginStateChangedListener(object : LoginStateController.OnLoginStateChangedListener{ + override fun onLoginSucceeded() { + Log.d("SnapKit Login", "Successful") + } + + override fun onLoginFailed() { + Log.e("SnapKit Login", "Failed") +// TODO("Not yet implemented") + } + + override fun onLogout() { + Log.d("SnapKit Login", "Logout") +// TODO("Not yet implemented") + } + }); + } + + private fun bindObservers() { + viewModel.login.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + if (userRepository.isUserLoggedIn()) { + requireActivity().setResult(Activity.RESULT_OK) + dialog?.dismiss() + } else { + startActivity(Intent(activity, SignUpActivity::class.java) + .putExtra(EXTRA_SIGNUP_EMAIL, true) + .putExtra(UPDATE_NUMBER, true) + .putExtra(EXTRA_SOCIAL, true)) + dialog?.dismiss() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + // callbackManager?.onActivityResult(requestCode, resultCode, data) + + if (requestCode == RC_SIGN_IN) { + + val task = GoogleSignIn.getSignedInAccountFromIntent(data) + try { + val account = task.getResult(ApiException::class.java) + + if (isConnectedToInternet(requireActivity(), true)) { + + val hashMap = HashMap() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.google + hashMap[ApiKeys.PROVIDER_VERIFICATION] = account?.idToken ?: "" + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + + } catch (e: ApiException) { + Log.e("Google_FAILD", "ERROR", e) + } + } + } + + companion object { + const val EXTRA_LOGIN = "EXTRA_LOGIN" + const val EXTRA_SIGNUP = "EXTRA_SIGNUP" + const val EXTRA_LOGIN_EMAIL = "EXTRA_LOGIN_EMAIL" + const val EXTRA_SIGNUP_EMAIL = "EXTRA_SIGNUP_EMAIL" + const val EXTRA_SOCIAL = "EXTRA_SOCIAL" + const val EXTRA_INFO_USER = "EXTRA_INFO_USER" + } + +} diff --git a/app/src/main/java/com/consultantapp/ui/walkthrough/WalkThroughDetailFragment.kt b/app/src/main/java/com/consultantapp/ui/walkthrough/WalkThroughDetailFragment.kt new file mode 100644 index 0000000..5e9fd24 --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/walkthrough/WalkThroughDetailFragment.kt @@ -0,0 +1,42 @@ +package com.consultantapp.ui.walkthrough + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import com.consultantapp.R +import com.consultantapp.data.models.responses.Page +import com.consultantapp.databinding.FragmentWalkthroughDetailBinding +import com.consultantapp.utils.POSITION +import dagger.android.support.DaggerFragment + + +class WalkThroughDetailFragment : DaggerFragment() { + + private lateinit var binding: FragmentWalkthroughDetailBinding + + private var rootView: View? = null + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_walkthrough_detail, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + private fun initialise() { + val data = arguments?.getSerializable(POSITION) as Page + + binding.ivImage.setImageResource(data.icon ?: R.drawable.ic_1) + binding.tvTitle.text = data.title + binding.tvDesc.text = data.desc + } +} diff --git a/app/src/main/java/com/consultantapp/ui/walkthrough/WalkThroughFragment.kt b/app/src/main/java/com/consultantapp/ui/walkthrough/WalkThroughFragment.kt new file mode 100644 index 0000000..68861fc --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/walkthrough/WalkThroughFragment.kt @@ -0,0 +1,129 @@ +package com.consultantapp.ui.walkthrough + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.viewpager.widget.ViewPager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.data.models.responses.Page +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.FragmentWalkthroughBinding +import com.consultantapp.ui.adapter.CommonFragmentPagerAdapter +import com.consultantapp.utils.POSITION +import com.consultantapp.utils.PrefsManager +import com.consultantapp.utils.hideShowView +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class WalkThroughFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentWalkthroughBinding + + private var rootView: View? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_walkthrough, container, false) + rootView = binding.root + + initialise() + listeners() + setBanners() + } + return rootView + } + + private fun initialise() { + requireActivity().setResult(Activity.RESULT_OK) + } + + private fun setBanners() { + val adapter = CommonFragmentPagerAdapter(requireActivity().supportFragmentManager) + + val items = ArrayList() + + when (BuildConfig.FLAVOR) { + "consult", "edu", "marketplace", "healthcare" -> { + items.add(Page(icon = R.drawable.ic_1, title = getString(R.string.walkthrough_1), desc = getString(R.string.walk_through_desc_1))) + items.add(Page(icon = R.drawable.ic_2, title = getString(R.string.walkthrough_2), desc = getString(R.string.walk_through_desc_2))) + items.add(Page(icon = R.drawable.ic_3, title = getString(R.string.walkthrough_3), desc = getString(R.string.walk_through_desc_3))) + items.add(Page(icon = R.drawable.ic_4, title = getString(R.string.walkthrough_4), desc = getString(R.string.walk_through_desc_4))) + } + "heal" -> { + items.add(Page(icon = R.drawable.ic_6, title = getString(R.string.walkthrough_6), desc = getString(R.string.walk_through_desc_6))) + items.add(Page(icon = R.drawable.ic_2, title = getString(R.string.walkthrough_2), desc = getString(R.string.walk_through_desc_2))) + items.add(Page(icon = R.drawable.ic_1, title = getString(R.string.walkthrough_1), desc = getString(R.string.walk_through_desc_1))) + items.add(Page(icon = R.drawable.ic_4, title = getString(R.string.walkthrough_4), desc = getString(R.string.walk_through_desc_4))) + items.add(Page(icon = R.drawable.ic_5, title = getString(R.string.walkthrough_5), desc = getString(R.string.walk_through_desc_5))) + } + } + + items.forEach { + val fragment = WalkThroughDetailFragment() + val bundle = Bundle() + bundle.putSerializable(POSITION, it) + fragment.arguments = bundle + adapter.addTab("", fragment) + } + + binding.viewPager.adapter = adapter + + binding.pageIndicatorView.setViewPager(binding.viewPager) + } + + private fun listeners() { + binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + } + + override fun onPageSelected(position: Int) { + val show = position == binding.viewPager.adapter?.count?.minus(1) + + binding.tvSkip.hideShowView(!show) + binding.tvGetStarted.hideShowView(show) + } + + }) + + binding.tvGetStarted.setOnClickListener { + doneWalkThrough() + } + + binding.tvSkip.setOnClickListener { + doneWalkThrough() + } + } + + private fun doneWalkThrough() { + prefsManager.save(WALK_THROUGH_SCREEN, true) + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + + companion object { + const val WALK_THROUGH_SCREEN = "WALK_THROUGH_SCREEN" + } +} diff --git a/app/src/main/java/com/consultantapp/ui/webview/WebViewActivity.kt b/app/src/main/java/com/consultantapp/ui/webview/WebViewActivity.kt new file mode 100644 index 0000000..af3fe5d --- /dev/null +++ b/app/src/main/java/com/consultantapp/ui/webview/WebViewActivity.kt @@ -0,0 +1,245 @@ +package com.consultantapp.ui.webview + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.util.Log +import android.webkit.CookieManager +import android.webkit.WebChromeClient +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.network.ApisRespHandler +import com.consultantapp.data.network.PushType +import com.consultantapp.data.network.responseUtil.Status +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.databinding.ActivityWebViewBinding +import com.consultantapp.ui.drawermenu.wallet.WalletViewModel +import com.consultantapp.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + + +class WebViewActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityWebViewBinding + + private lateinit var viewModel: WalletViewModel + + private var isReceiverRegistered = false + + private var transactionId = "" + + private var loadUrl = "" + + private val mHandler = Handler() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_web_view) + + initialise() + bindViews() + setListeners() + bindObservers() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + + binding.tvHeader.text = intent.getStringExtra(LINK_TITLE) + when { + intent.hasExtra(PAYMENT_URL) -> { + transactionId = intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + loadUrl = intent.getStringExtra(PAYMENT_URL) ?: "" + } + intent.hasExtra(PDF_LINK) -> { + binding.webView.settings.builtInZoomControls = true + loadUrl = intent.getStringExtra(PDF_LINK) ?: "" + } + else -> { + loadUrl = "${appClientDetails.domain_url}/${intent.getStringExtra(LINK_URL)}" + } + } + } + + @SuppressLint("SetJavaScriptEnabled") + private fun bindViews() { + + if (android.os.Build.VERSION.SDK_INT >= 21) { + CookieManager.getInstance().setAcceptThirdPartyCookies(binding.webView, true) + } else { + CookieManager.getInstance().setAcceptCookie(true) + } + + binding.webView.setBackgroundColor(Color.TRANSPARENT) + binding.webView.settings.setSupportZoom(true) + binding.webView.settings.javaScriptEnabled = true + binding.webView.webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + + Log.e("url====", url ?: "") + /*If Payment success*/ + if (url?.contains(PaymentFrom.AL_RAJHI_BANK_SUCCESS) == true || url?.contains(PaymentFrom.PAYSTACK_SUCCESS) == true) { + setResult(RESULT_OK) + finish() +// keepCheckingRequestStatus() + } + } + } + + +// binding.webView.settings.setAppCacheEnabled(true) + binding.webView.settings.javaScriptEnabled = true + binding.webView.settings.domStorageEnabled = true + binding.webView.settings.loadWithOverviewMode = true + binding.webView.settings.useWideViewPort = true + binding.webView.setInitialScale(100) + binding.webView.webChromeClient = WebChromeClient() + + /*Ser headers*/ + val map = HashMap() + map["language"] = prefsManager.getString(USER_LANGUAGE, "en") + + binding.webView.loadUrl(loadUrl,map) + + binding.webView.webChromeClient = object : WebChromeClient() { + override fun onProgressChanged(view: WebView, progress: Int) { + + // Return the app name after finish loading + if (progress == 100) { + binding.clLoader.gone() + if (intent.hasExtra(PDF_LINK)) + binding.ivDownload.visible() + } + } + } + } + + private fun setListeners() { + binding.toolbar.setNavigationOnClickListener { finish() } + + binding.ivDownload.setOnClickListener { + if (BuildConfig.FLAVOR == "clouddoc" && intent.hasExtra(EXTRA_REQUEST_ID)) { + val request = intent.getSerializableExtra(EXTRA_REQUEST_ID) as Request + if (request.pre_scription?.type == PrescriptionType.MANUAL && request.pre_scription?.images?.isNotEmpty() == true) { + request.pre_scription?.images?.forEach { + downloadFile(this, getImageBaseUrl(ImageFolder.UPLOADS, it),request.id) + } + } else + downloadFile(this, loadUrl) + } else + downloadFile(this, loadUrl) + } + + } + + companion object { + const val LINK_TITLE = "LINK_TITLE" + const val LINK_URL = "LINK_URL" + const val PDF_LINK = "PDF_LINK" + const val PAYMENT_URL = "PAYMENT_URL" + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.BALANCE_ADDED) + intentFilter.addAction(PushType.BALANCE_FAILED) + LocalBroadcastManager.getInstance(this).registerReceiver( + callCancelledReceiver, intentFilter + ) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(callCancelledReceiver) + isReceiverRegistered = false + } + } + + private val callCancelledReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.getStringExtra(EXTRA_REQUEST_ID) == transactionId) { + if (intent.action == PushType.BALANCE_ADDED) { + longToast(getString(R.string.transaction_success)) + setResult(Activity.RESULT_OK) + finish() + } else if (intent.action == PushType.BALANCE_FAILED) { + longToast(getString(R.string.transaction_failed)) + finish() + } + } + } + } + + private fun bindObservers() { + viewModel.requestCheck.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + if (it.data?.transactionCompleted == true) { + mHandler.removeCallbacksAndMessages(null) + setResult(RESULT_OK) + finish() + } else + keepCheckingRequestStatus() + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + private fun keepCheckingRequestStatus() { + mHandler.removeCallbacksAndMessages(null) + mHandler.postDelayed({ + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["transaction_id"] = transactionId + hashMap["transaction_type"] = "wallet" + viewModel.requestCheck(hashMap) + } + }, 5000) + } +} diff --git a/app/src/main/java/com/consultantapp/utils/AlertDialogUtil.kt b/app/src/main/java/com/consultantapp/utils/AlertDialogUtil.kt new file mode 100644 index 0000000..a5d6448 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/AlertDialogUtil.kt @@ -0,0 +1,64 @@ +package com.consultantapp.utils + +import android.content.Context +import android.content.DialogInterface +import androidx.annotation.StringRes +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import com.consultantapp.R + + +class AlertDialogUtil { + + fun createOkCancelDialog(context: Context, @StringRes titleResourceId: Int, @StringRes messageResourceId: Int, + @StringRes positiveResourceId: Int, @StringRes negativeResourceId: Int, cancelable: Boolean, + listener: OnOkCancelDialogListener?): AlertDialog { + val alertDialog = AlertDialog.Builder(context) + if (titleResourceId != 0) { + alertDialog.setTitle(titleResourceId) + } + if (titleResourceId != 0) { + alertDialog.setMessage(messageResourceId) + } + alertDialog.setCancelable(cancelable) + alertDialog.setPositiveButton(positiveResourceId + ) { dialog, which -> + listener?.onOkButtonClicked() + dialog.dismiss() + } + if (negativeResourceId != 0) { + alertDialog.setNegativeButton(negativeResourceId) { dialog, which -> + listener?.onCancelButtonClicked() + dialog.dismiss() + } + } + val dialog = alertDialog.create() + dialog.setOnShowListener { dialogInterface -> + dialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(ContextCompat + .getColor(context, R.color.colorPrimary)) + dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(ContextCompat + .getColor(context, R.color.colorPrimary)) + } + return dialog + } + + + interface OnOkCancelDialogListener { + fun onOkButtonClicked() + + fun onCancelButtonClicked() + } + + companion object { + + private var mInstance: AlertDialogUtil? = null + + val instance: AlertDialogUtil + get() { + if (null == mInstance) { + mInstance = AlertDialogUtil() + } + return mInstance ?: AlertDialogUtil() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/AppConstant.kt b/app/src/main/java/com/consultantapp/utils/AppConstant.kt new file mode 100644 index 0000000..8a4eba7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/AppConstant.kt @@ -0,0 +1,227 @@ +package com.consultantapp.utils + +/*Links*/ +const val PLAY_STORE = "https://play.google.com/store/apps/details?id=" + +const val FILE_PATH_DIRECTORY = "file://" + +const val ANDROID = "ANDROID" +const val APP_TYPE = "customer" + +const val USER_DATA = "user data" +const val APP_DETAILS = "APP_DETAILS" +const val POSITION = "POSITION" +const val USER_LANGUAGE = "user language" +const val COUNTRY_CODE = "COUNTRY_CODE" +const val PHONE_NUMBER = "PHONE_NUMBER" +const val UPDATE_NUMBER = "UPDATE_NUMBER" +const val UPDATE_PROFILE = "UPDATE_PROFILE" +const val USER_ADDRESS = "user address" +const val EXTRA_CONSULT_TYPE = "CONSULT_TYPE" + +const val PUSH_DATA = "PUSH_DATA" +const val PAGE_TO_OPEN = "PAGE_TO_OPEN" + +const val LAST_MESSAGE = "last message" +const val USER_ID = "user id" +const val USER_NAME = "user name" +const val OTHER_USER_ID = "other user id" +const val UPDATE_CHAT = "updateChat" +const val EXTRA_REQUEST_ID = "EXTRA_REQUEST_ID" +const val EXTRA_CALL_NAME = "extra call name" +const val EXTRA_NAME = "extra name" +const val EXTRA_TAB = "extra tab" +const val CUT_FROM = "CUT_FROM" + +object CallType { + const val CALL = "call" + const val CHAT = "chat" + const val ALL = "all" +} + +object ClassType { + const val ADDED = "added" + const val STARTED = "started" + const val COMPLETED = "completed" +} + +object PaymentFrom { + const val STRIPE = "stripe" + const val RAZOR_PAY = "razor pay" + const val CCA_VENUE = "cca venue" + const val AL_RAJHI_BANK = "al_rajhi_bank" + const val HYPER_PAY = "hyperpay" + const val PAYSTACK = "paystack" + + /*Success*/ + const val AL_RAJHI_BANK_SUCCESS = "https://calladmin.inhomed.com/al_rajhi_bank/webhook" + const val PAYSTACK_SUCCESS = "https://airdoc.royoconsult.com/webhook/paystack" +} + +object HyperPay { + const val VISA = "VISA" + const val MASTER = "MASTER" + const val MADA = "MADA" + const val DIRECTDEBIT_SEPA = "DIRECTDEBIT_SEPA" + const val PAYPAL = "PAYPAL" + const val GOOGLEPAY = "GOOGLEPAY" +} + +object RequestType { + const val INSTANT = "instant" + const val SCHEDULE = "schedule" + const val DATE_TIME = "date_time" +} + +object RequestStatus { + const val COMPLETED = "completed" + const val CANCELLED = "cancelled" + const val NEW = "new" +} + +object ConsultType { + const val AUDIO_CALL = "audio_call" + const val VIDEO_CALL = "video_call" + const val HOME_VISIT = "home_visit" + const val CLINIC_VISIT = "clinic_visit" + const val OTHER = "other" + const val ONLINE_PROGRAMS = "online_programs" + + const val CONSULT_ONLINE = "consult_online" + const val EMERGENCY_CONSULTATION = "Emergency" + const val FREE_EXPERT = "Free_Expert_Advice" + const val TIP_OF_DAY = "Tip of day" + const val ALL = "all" +} + +object CallAction { + const val PENDING = "pending" + const val ACCEPT = "accept" + const val REJECT = "reject" + const val INPROGRESS = "in-progress" + const val BUSY = "busy" + const val COMPLETED = "completed" + const val FAILED = "failed" + const val CANCELED = "canceled" + + const val START = "start" + const val REACHED = "reached" + const val START_SERVICE = "start_service" + const val CANCEL_SERVICE = "cancel_service" + + const val PAID = "paid" + + const val DECLINED = "declined" + const val APPROVED = "approved" +} + +object WalletMoney { + const val DEPOSIT = "deposit" + const val WITHDRAWAL = "withdrawal" + const val REFUND = "refund" + const val FAILED = "failed" + const val ADD_PACKAGE = "add_package" + const val ADD_MONEY = "add_money" +} + +object AppRequestCode { + const val AUTOCOMPLETE_REQUEST_CODE: Int = 100 + const val IMAGE_PICKER: Int = 101 + const val ADD_MONEY: Int = 102 + const val PROFILE_UPDATE: Int = 103 + const val PACKAGE_UPDATE: Int = 104 + const val LOCATION_PERMISSION_ID = 105 + const val REQ_CHAT = 106 + const val ASK_FOR_LOCATION: Int = 107 + const val ADD_FILTER: Int = 108 + const val NEW_APPOINTMENT: Int = 109 + const val ADD_CARD: Int = 110 + const val ARTICLE_CHANGES: Int = 111 + const val WALK_THROUGH_SCREENS: Int = 112 + const val APPOINTMENT_DETAILS: Int = 113 + const val LANGUAGE_SCREENS: Int = 114 + const val CATEGORIES: Int = 115 + const val DOC_PICKER: Int = 116 + const val CARE_PLAN: Int = 117 + + const val SELECT_CONTACT: Int = 118 + const val REQUEST_CONTACT: Int = 119 + + +} + +object DocType { + const val TEXT = "TEXT" + const val IMAGE = "IMAGE" + const val PDF = "PDF" + const val AUDIO = "AUDIO" + const val MESSAGE_TYPING = "TYPING" +} + +object ImageFolder { + const val ORIGINAL = "original/" + const val ASSETS = "assets/" + const val UPLOADS = "uploads/" + const val THUMBS = "thumbs/" + const val PDF = "pdf/" + const val AUDIO = "audio/" +} + +object MediaUploadStatus { + const val NOT_UPLOADED = "not_uploaded" + const val UPLOADING = "uploading" + const val CANCELED = "canceled" + const val UPLOADED = "unloaded" + +} + +object DeepLink { + const val USER_PROFILE = "userProfile" + const val INVITE = "Invite" +} + +object PageLink { + const val TERMS_CONDITIONS = "term-conditions" + const val PRIVACY_POLICY = "privacy-policy" + const val SALES_CONTRACT = "sales-agreement" +} + +object CustomFields { + const val ZIP_CODE = "Zip Code" +} + +object ClientFeatures { + const val ADDRESS = "Address Required" +} + +object CountryListType { + const val COUNTRY = "country" + const val STATE = "state" + const val CITY = "city" +} + +object BlogType { + const val BLOG = "blog" + const val ARTICLE = "article" +} + +object PreferencesType { + const val LANGUAGES = "Languages" + const val GENDER = "Gender" + const val SIGNUP_AS = "Signup As" +} + +object PandemicType { + const val HOME = "home" + const val PREVENTION = "prevention" + const val SYMPTOM = "symptom" + + const val SYMPTOM_CATEGORY = "symptom_category" + const val SYMPTOM_OPTIONS = "symptom_options" + const val SYMPTOM_OPTIONS_ALL = "all_symptom_options" +} + +object PrescriptionType { + const val MANUAL = "manual" + const val DIGITAL = "digital" +} diff --git a/app/src/main/java/com/consultantapp/utils/AppSocket.kt b/app/src/main/java/com/consultantapp/utils/AppSocket.kt new file mode 100644 index 0000000..2ce58b1 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/AppSocket.kt @@ -0,0 +1,262 @@ +package com.consultantapp.utils + +import android.os.Handler +import android.os.Looper +import android.util.Log +import com.consultantapp.appClientDetails +import com.consultantapp.data.models.responses.chat.ChatMessage +import com.consultantapp.data.repos.UserRepository +import com.google.gson.Gson +import io.socket.client.Ack +import io.socket.client.IO +import io.socket.client.Socket +import io.socket.emitter.Emitter +import org.json.JSONException +import org.json.JSONObject +import timber.log.Timber +import java.net.URISyntaxException +import java.util.* +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Created by Rishi Sharma on 9/8/17. + */ +@Singleton +class AppSocket @Inject internal constructor(private val userRepository: UserRepository, gson: Gson?) { + private var mSocket: Socket? = null + private var manualReconnectTimer = Timer() + private val onMessageReceiverList: MutableList = ArrayList() + private val onConnectionListeners: MutableList = ArrayList() + private val onConnect = Emitter.Listener { args: Array? -> + manualReconnectTimer.cancel() + Timber.e("AppSocket - onConnect called") + notifyConnectionListeners(Socket.EVENT_CONNECT) + } + private val onDisconnect = Emitter.Listener { args: Array? -> + Timber.e("AppSocket - onDisconnect called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_DISCONNECT) + } + private val onError = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onError called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_ERROR) + } + private val onTimeOut = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onTimeOut called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_CONNECT_TIMEOUT) + } + private val onReconnecting = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onReconnecting called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_RECONNECTING) + } + private val onReconnectError = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onReconnectError called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_RECONNECT_ERROR) + } + + fun init(): Boolean { + onMessageReceiverList.clear() + onConnectionListeners.clear() + return try { + if (mSocket != null) { + mSocket?.off() + mSocket?.close() + } + + if (userRepository.isUserLoggedIn()) { + Timber.e("Socket${appClientDetails.socket_url.toString()}${userRepository.getUser()?.id}".trimIndent()) + Log.e("Socket123","Socket${appClientDetails.socket_url.toString()}${userRepository.getUser()?.id}") + val options = IO.Options() + options.forceNew = false + options.reconnection = true + options.query = "user_id=" + userRepository.getUser()?.id + "&domain=" + userRepository.getAppSetting().domain + mSocket = IO.socket(appClientDetails.socket_url?:"", options) + connect() + mSocket?.on(Socket.EVENT_CONNECT, onConnect) + mSocket?.on(Socket.EVENT_DISCONNECT, onDisconnect) + mSocket?.on(Socket.EVENT_CONNECT_ERROR, onError) + mSocket?.on(Socket.EVENT_ERROR, onError) + mSocket?.on(Socket.EVENT_CONNECT_TIMEOUT, onTimeOut) + mSocket?.on(Socket.EVENT_RECONNECTING, onReconnecting) + mSocket?.on(Socket.EVENT_RECONNECT_ERROR, onReconnectError) + mSocket?.on(Socket.EVENT_RECONNECT_FAILED, onReconnectError) + true + } else { + false + } + } catch (e: URISyntaxException) { + e.printStackTrace() + false + } + } + + val isConnected: Boolean + get() = (mSocket?.connected()==true) + + private fun restartManualReconnection() { + manualReconnectTimer.cancel() + manualReconnectTimer = Timer() + val MANUAL_RECONNECT_INTERVAL = 10000 + manualReconnectTimer.schedule(object : TimerTask() { + override fun run() { + mSocket?.io()?.reconnection(true) + connect() + Timber.e("AppSocket --> ManualReconnection Timer Task Called") + } + }, MANUAL_RECONNECT_INTERVAL.toLong()) + } + + val socket: Socket? + get() { + if (mSocket?.connected()==false) connect() + return mSocket + } + + fun connect() { + if (mSocket?.connected()==false) mSocket?.connect() + } + + fun disconnect() { + mSocket?.disconnect() + } + + fun emit(event: String?, vararg args: Any?) { + mSocket?.emit(event, *args) + } + + fun on(event: String?, fn: Emitter.Listener?) { + mSocket?.on(event, fn) + } + + fun off() { + mSocket?.off() + } + + fun off(event: String?) { + mSocket?.off(event) + } + + fun off(event: String?, fn: Emitter.Listener?) { + mSocket?.off(event, fn) + } + + fun sendMessage(message: ChatMessage?, msgAck: OnMessageReceiver) { + var jsonObject: JSONObject? = null + try { + jsonObject = JSONObject(Gson().toJson(message)) + } catch (e: JSONException) { + e.printStackTrace() + } + mSocket?.emit(Events.SEND_MESSAGE, jsonObject, Ack { args: Array -> + Handler(Looper.getMainLooper()).post { + msgAck.onMessageReceive( + Gson().fromJson( + args[0].toString(), ChatMessage::class.java + ) + ) + } + }) + } + + fun sendMessageDelivery(id: String?, receiverID: String?) { + try { + val jsonObject = JSONObject() + jsonObject.put("messageId", id) + jsonObject.put("receiverId", receiverID) + mSocket?.emit(Events.DELIVERED_MESSAGE, jsonObject) + } catch (e: JSONException) { + e.printStackTrace() + } + } + + fun addConnectionListener(listener: ConnectionListener) { + onConnectionListeners.add(listener) + } + + fun removeConnectionListener(listener: ConnectionListener) { + onConnectionListeners.remove(listener) + } + + fun removeAllConnectionListeners() { + onConnectionListeners.clear() + } + + private fun notifyConnectionListeners(status: String) { + for (listener in onConnectionListeners) { + Handler(Looper.getMainLooper()).post { listener.onConnectionStatusChanged(status) } + } + } + + fun addOnMessageReceiver(receiver: OnMessageReceiver) { + if (onMessageReceiverList.isEmpty()) { + onReceiveMessageEvent() + } + onMessageReceiverList.add(receiver) + } + + fun removeOnMessageReceiver(receiver: OnMessageReceiver) { + onMessageReceiverList.remove(receiver) + if (onMessageReceiverList.isEmpty()) { + mSocket?.off(Events.RECEIVE_MESSAGE) + } + } + + fun removeAllMessageReceivers() { + onMessageReceiverList.clear() + mSocket?.off(Events.RECEIVE_MESSAGE) + } + + private fun onReceiveMessageEvent() { + mSocket?.on(Events.RECEIVE_MESSAGE) { args: Array -> + val chat: ChatMessage + chat = Gson().fromJson(args[0].toString(), ChatMessage::class.java) + notifyMessageReceivers(chat) + } + } + + private fun notifyMessageReceivers(message: ChatMessage) { + for (receiver in onMessageReceiverList) { + Handler(Looper.getMainLooper()).post { receiver.onMessageReceive(message) } + } + } + + interface Events { + companion object { + const val SEND_MESSAGE = "sendMessage" + const val RECEIVE_MESSAGE = "messageFromServer" + const val TYPING = "typing" + const val BROADCAST = "broadcast" + const val ACKNOWLEDGE_MESSAGE = "acknowledgeMessage" + const val READ_MESSAGE = "readMessage" + const val DELIVERED_MESSAGE = "deliveredMessage" + const val SEND_LIVE_LOCATION = "sendlivelocation" + } + } + + interface MessageStatus { + companion object { + const val NOT_SENT = "NOT_SENT" + const val SENDING = "SENDING" + const val SENT = "SENT" + const val DELIVERED = "DELIVERED" + const val SEEN = "SEEN" + } + } + + interface OnMessageReceiver { + fun onMessageReceive(message: ChatMessage?) + } + + interface ConnectionListener { + fun onConnectionStatusChanged(status: String?) + } + + init { + init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/BasePhotoUplaodFragment.kt b/app/src/main/java/com/consultantapp/utils/BasePhotoUplaodFragment.kt new file mode 100644 index 0000000..42eb81e --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/BasePhotoUplaodFragment.kt @@ -0,0 +1,969 @@ +package com.consultantapp.utils + +import android.Manifest +import android.app.AlertDialog +import android.app.Dialog +import android.content.ContentUris +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.Matrix +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.media.ExifInterface +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.provider.OpenableColumns +import android.provider.Settings +import android.util.Log +import android.view.Window +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.Nullable +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.content.FileProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.target.CustomTarget +import com.consultantapp.databinding.ItemDialogImageBinding +import com.karumi.dexter.Dexter +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionDeniedResponse +import com.karumi.dexter.listener.PermissionGrantedResponse +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.single.PermissionListener + +import dagger.android.support.DaggerFragment + + +import java.io.* +import java.util.Calendar + + +abstract class BasePhotoUplaodFragment : DaggerFragment() { + + var is_video = false + private val JPEG_FILE_PREFIX = "IMG_" + private val JPEG_FILE_SUFFIX = ".jpg" + + + var mPicturePath: String? = null + var mIsGallery: Boolean? = null + var bitmap: Bitmap? = null + var reqcode = 0 + var triescamera = 0 + var triesgallary = 0 + + + @RequiresApi(Build.VERSION_CODES.M) + fun showImageDialog(b: Boolean) { + is_video = b + + + val dialog: Dialog = Dialog(requireActivity()) + var view = ItemDialogImageBinding.inflate(layoutInflater) + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + dialog.setContentView(view.root) + + view.tvGallery.setOnClickListener { + mIsGallery = true + if (!is_video) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditongallary() + + } else { + + checkgallry() + + + } + } else { + openVideoGallery() + } + + dialog.dismiss() + } + + view.ivClose.setOnClickListener { dialog.dismiss() } + + view.tvCamera.setOnClickListener { + mIsGallery = false + + if (!is_video) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditioncamera() + + } else { + + checkcamera() + + } + } else { + startCameraIntentVideo(requireActivity()) + } + + + + dialog.dismiss() + } + dialog.show() + } + +// fun showImageDialogForPdfAndVideo() { +// +// +// val dialog: Dialog = Dialog(requireActivity()) +// var view = DialogProfileBinding.inflate(layoutInflater) +// dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) +// dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) +// dialog.setContentView(view.root) +// +// view.tvGallery.text= "PDF" +// view.tvCamera.text= "Video" +// view.tvGallery.setOnClickListener { +// +// openPdf() +// +// dialog.dismiss() +// } +// +// view.ivClose.setOnClickListener { dialog.dismiss() } +// +// view.tvCamera.setOnClickListener { +// +// showImageDialog(true) +// +// dialog.dismiss() +// } +// dialog.show() +// } + + open fun startCameraIntentVideo(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) + takePictureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); + + cameraIntentVideo.launch(takePictureIntent) + } + + open fun openVideoGallery() { + val intent = Intent() + intent.type = "video/*" + intent.action = Intent.ACTION_GET_CONTENT + cameraIntentVideo.launch(intent) + } + + var cameraIntentVideo = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val videoUri = it!!.data?.data + if (it!!.data?.data != null) { + + val mimeType: String = + requireActivity().contentResolver.getType(videoUri!!)!! //Save file to upload on server + val file = saveVideoToAppScopeStorage(requireActivity(), videoUri, mimeType) + getVideo(file.toString(), 2) + } + } + + fun saveVideoToAppScopeStorage(context: Context, videoUri: Uri?, mimeType: String?): File? { + if (videoUri == null || mimeType == null) { + return null + } + + val fileName = "capturedVideo${Calendar.getInstance().time.time}.mp4" + + val inputStream = context.contentResolver.openInputStream(videoUri) + val file = File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM), fileName) + file.deleteOnExit() + file.createNewFile() + val out = FileOutputStream(file) + val bos = BufferedOutputStream(out) + + val buf = ByteArray(1024) + inputStream?.read(buf) + do { + bos.write(buf) + } while (inputStream?.read(buf) !== -1) + + //out.close() + bos.close() + inputStream.close() + + return file + } + + abstract fun getVideo(uri: String?, i: Int) + + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkcamera() { +// + + + reqcode = 2 + requestPermissionsFOR(Manifest.permission.CAMERA) + +// if (checkForCameraPermission()) { +// startCameraIntent(requireActivity()) +// +//// if (checkForWritePermission()) { +//// startCameraIntent(requireActivity()) +//// }else{ +//// setting() +//// +//// } +// }else{ +// setting() +// } + } + + private fun setting() { + val ifFailed = { + Log.e("tries", "checkconditioncamera: " + triescamera) + + if (triescamera >= 2) { + showAlert() + + + } + + } + ifFailed.invoke() + + } + + private fun settinggallary() { + val ifFailed = { + Log.e("tries", "checkconditioncamera: " + triesgallary) + + if (triesgallary >= 2) { + showAlert() + + + } + + } + ifFailed.invoke() + + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkgallry() { + + + reqcode = 1 + + requestPermissionsFOR(Manifest.permission.READ_EXTERNAL_STORAGE) + +// if (checkForReadPermission()) { +// +// openGallery() +// +// }else{ +// settinggallary() +// } + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkconditioncamera() { + + reqcode = 4 + + requestPermissionsFOR(Manifest.permission.CAMERA) + +// if (checkForCameraPermission()) { +// startCameraIntent(requireActivity()) +// +// }else{ +// setting() +// } + + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkconditongallary() { + + + reqcode = 3 + + requestPermissionsFOR(Manifest.permission.READ_MEDIA_IMAGES) + + +// if (checkForReadPermission33()) { +// openGallery() +// +// }else{ +// settinggallary() +// } + + } + + + open fun openPdf() { + var chooseFileIntent = Intent(Intent.ACTION_GET_CONTENT) + chooseFileIntent.type = "application/pdf" + chooseFileIntent.action = Intent.ACTION_GET_CONTENT + chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE) + chooseFileIntent = Intent.createChooser(chooseFileIntent, "Choose a file") + startActivityForResult(chooseFileIntent, 3) + } + + + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + + + when (requestCode) { + 1 -> { + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkgallry() + } + } + + +// prefManager.settriesgallary(triesgallary) + + } + } + + + 2 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkcamera() + } + } + +// prefManager.settriescamera(triescamera) + + } + + } + + 3 -> { + + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary() + } + } + +// prefManager.settriesgallary(triesgallary) + + } + + + } + + 4 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary() + } + } +// prefManager.settriescamera(triescamera) + + } + } + } + } + + @RequiresApi(Build.VERSION_CODES.M) + fun checkForReadPermission(): Boolean { + return if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), + reqcode + ) + false + } else { + true + } + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun checkForReadPermission33(): Boolean { + return if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_MEDIA_IMAGES + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.READ_MEDIA_IMAGES), + reqcode + ) + false + } else { + true + } + } + + + @RequiresApi(Build.VERSION_CODES.M) + fun checkForWritePermission(): Boolean { + return if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + reqcode + ) + false + } else { + true + } + } + + @RequiresApi(Build.VERSION_CODES.M) + fun checkForCameraPermission(): Boolean { + return if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.CAMERA + ) != PackageManager.PERMISSION_GRANTED + ) { + + requestPermissions(arrayOf(Manifest.permission.CAMERA), reqcode) + false + } else { + true + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == 1) { + if (data != null) { + if (getRealPath(data.data!!, requireActivity()) != null) { + getImage(getRealPath(data.data!!, requireActivity()), data.data!!) + } else { + Glide.with(this) + .asBitmap() + .load(data.data) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .into(object : CustomTarget() { + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} + override fun onResourceReady( + resource: Bitmap, + transition: com.bumptech.glide.request.transition.Transition? + ) { + val file: String = getRealPath( + Uri.fromFile(saveImageToExternalStorage(resource)), + requireActivity() + )!! + getImage( + file, + Uri.fromFile(saveImageToExternalStorage(resource)) + ) + } + }) + } + } + } else if (requestCode == 2 && resultCode == -1) { + try{ + val file: String = getRealPath( + Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, requireActivity())!! + + ) + ), requireActivity() + )!! + getImage( + file, Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, requireActivity())!! + ) + ) + ) + }catch (ex: Exception){ + Toast.makeText(requireContext(),"This functionality is under development", Toast.LENGTH_LONG).show() + } + + + } else if (requestCode == 3 && resultCode == -1) { + val uri: Uri = data?.data!! + val a = getPDFPath(uri); + +// val file = File(a) // /document/document:30082 +// val profReq = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) +// var request_image = MultipartBody.Part.createFormData("doc", file.name, profReq) +// val pdfDocument=request_image + getPdf(a) + } else { + Log.e("gndnfkfnkn", "onActivityResult: " + data?.data) + } + + + } + + abstract fun getPdf(uri: String?) + abstract fun getImage(uri: String?, data: Uri) + fun getPDFPath(uri: Uri?): String? { + var absolutePath = "" + try { + val inputStream = requireActivity()!!.contentResolver.openInputStream( + uri!! + ) + val pdfInBytes = ByteArray(inputStream!!.available()) + inputStream.read(pdfInBytes) + var offset = 0 + var numRead = 0 + while (offset < pdfInBytes.size && inputStream.read( + pdfInBytes, + offset, + pdfInBytes.size - offset + ).also { + numRead = it + } >= 0 + ) { + offset += numRead + } + val returnCursor: Cursor? = + requireActivity().contentResolver.query(uri, null, null, null, null) + val nameIndex = returnCursor?.getColumnIndex(OpenableColumns.DISPLAY_NAME) + returnCursor?.moveToFirst() + var mPath = "" + mPath = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) { + requireActivity()!!.getExternalFilesDir(Environment.DIRECTORY_DCIM) + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } else { + Environment.getExternalStorageDirectory() + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } + val pdfFile = File(mPath) + val op: OutputStream = FileOutputStream(pdfFile) + op.write(pdfInBytes) + absolutePath = pdfFile.path + } catch (ae: Exception) { + ae.printStackTrace() + } + return absolutePath + } + + fun openGallery() { + val i = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(i, 1) + } + + open fun isNougatDevice(): Boolean { + return Build.VERSION.SDK_INT >= 24 + } + + open fun startCameraIntent(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + var f: File? = null + try { + val LOCAL_STORAGE_BASE_PATH_FOR_MEDIA = context.getExternalFilesDir("") + .toString() + "/" + "consultantapp" + val LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES: String = + LOCAL_STORAGE_BASE_PATH_FOR_MEDIA + "/User/Images/" + f = setUpImageFile(LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES) + mPicturePath = f!!.absolutePath + /* add provider in xml and + * manifest then add following code for Nougat devices + * to overcome file uri exposed app crash + */if (isNougatDevice()) { + takePictureIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + val contentUri: Uri = FileProvider.getUriForFile( + requireActivity(), "com.consultantapp", f + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri) + } else { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)) + } + } catch (e: Exception) { + e.printStackTrace() + f = null + mPicturePath = null + } + startActivityForResult(takePictureIntent, 2) + } + + private fun showAlert() { + // we are displaying an alert dialog for permissions + val builder = AlertDialog.Builder(requireContext()) + + // below line is the title for our alert dialog. + builder.setTitle("Need Permissions") + + // below line is our message for our dialog + builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.") + + builder.setPositiveButton("GOTO SETTINGS") { dialog, which -> + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + val uri = Uri.fromParts("package", activity?.packageName, null) + intent.data = uri + } else { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:" + activity?.packageName) + } + + startActivity(intent) + } + + builder.setNegativeButton("Cancel") { dialog, which -> + // this method is called when user clicks on the negative button. + dialog.cancel() + } + + // below line is used to display our dialog + builder.show() + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getRealPath(uri: Uri, context: Context): String? { + val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + return (Environment.getExternalStorageDirectory() + .toString() + "/" + split[1]) + } else { + val splitIndex = docId.indexOf(':', 1) + val tag = docId.substring(0, splitIndex) + val path = docId.substring(splitIndex + 1) + val nonPrimaryVolume = + getPathToNonPrimaryVolume(context, tag) + if (nonPrimaryVolume != null) { + val result = "$nonPrimaryVolume/$path" + val file = File(result) + if (file.exists() && file.canRead()) { + return result + } + } + } + } else if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + + ) + return getDataColumn(context, contentUri, null, null) + } else if (isMediaDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + var contentUri: Uri? = null + if ("image" == type) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } else if ("video" == type) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } else if ("audio" == type) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + val selection = "_id=?" + val selectionArgs = + arrayOf(split[1]) + return getDataColumn(context, contentUri, selection, selectionArgs) + } + } else if ("content".equals(uri.scheme, ignoreCase = true)) { + return getDataColumn(context, uri, null, null) + } else if ("file".equals(uri.scheme, ignoreCase = true)) { + return uri.path + } + return null + } + + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getPathToNonPrimaryVolume(context: Context, tag: String): String? { + val volumes = context.externalCacheDirs + if (volumes != null) { + for (volume in volumes) { + if (volume != null) { + val path = volume.absolutePath + if (path != null) { + val index = path.indexOf(tag) + if (index != -1) { + return path.substring(0, index) + tag + } + } + } + } + } + return null + } + + private fun getDataColumn( + context: Context, uri: Uri?, selection: String?, selectionArgs: + Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf(column) + try { + cursor = context.contentResolver.query( + uri!!, projection, + selection, selectionArgs, null + ) + if (cursor != null && cursor.moveToFirst()) { + val column_index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(column_index) + } + } finally { + cursor?.close() + } + return null + } + + fun setUpImageFile(imageDirectory: String?): File? { + var imageFile: File? = null + if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) { + val storageDir = File(imageDirectory) + if (null != storageDir) { + if (!storageDir.mkdirs()) { + if (!storageDir.exists()) { + Log.d("CameraSample", "failed to create directory") + return null + } + } + } + imageFile = File.createTempFile( + JPEG_FILE_PREFIX + + System.currentTimeMillis() + "_", + JPEG_FILE_SUFFIX, storageDir + ) + } + return imageFile + } + + fun saveImageToExternalStorage(finalBitmap: Bitmap): File? { + val file: File + val root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + .toString() + val myDir = File("$root/Mojo") + myDir.mkdirs() + val fname = (JPEG_FILE_PREFIX + System.currentTimeMillis() + "_" + JPEG_FILE_SUFFIX) + + file = File(myDir, fname) + if (file.exists()) file.delete() + try { + val out = FileOutputStream(file) + finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) + out.flush() + out.close() + return file + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + return file + } + + fun getFile(imgPath: String?, mContext: Context?): Bitmap? { + val mOrientation: Int + var bMapRotate: Bitmap? = null + try { + if (imgPath != null) { + val exif = ExifInterface(imgPath) + mOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1) + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeFile(imgPath, options) + options.inSampleSize = calculateInSampleSize(options, 400, 400) + options.inJustDecodeBounds = false + bMapRotate = BitmapFactory.decodeFile(imgPath, options) + when (mOrientation) { + 6 -> { + val matrix = Matrix() + matrix.postRotate(90f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 8 -> { + val matrix = Matrix() + matrix.postRotate(270f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 3 -> { + val matrix = Matrix() + matrix.postRotate(180f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + } + } else { + + } + } catch (e: OutOfMemoryError) { + bMapRotate = null + e.printStackTrace() + } catch (e: IOException) { + e.printStackTrace() + } catch (e: java.lang.Exception) { + bMapRotate = null + e.printStackTrace() + } + return bMapRotate + } + + fun calculateInSampleSize( + options: BitmapFactory.Options, + reqWidth: Int, + reqHeight: Int + ): Int { + try { + val height = options.outHeight + val width = options.outWidth + var inSampleSize = 1 + if (height > reqHeight || width > reqWidth) { + val halfHeight = height / 2 + val halfWidth = width / 2 + while (halfHeight / inSampleSize > reqHeight + && halfWidth / inSampleSize > reqWidth + ) { + inSampleSize *= 2 + } + } + return inSampleSize + } catch (e: Exception) { + e.printStackTrace() + } + return 0 + } + + + private fun requestPermissionsFOR(readMediaImages: String) { + Dexter.withContext(requireContext()) + .withPermission(readMediaImages) + .withListener(object : PermissionListener { + override fun onPermissionGranted(response: PermissionGrantedResponse) { +// Toast.makeText(requireContext(), "Camera permission granted", Toast.LENGTH_SHORT).show() +// // Reset the denial count +// // Proceed with camera access + + + when (reqcode) { + 1 -> { + + openGallery() + } + + 2 -> { + startCameraIntent(requireActivity()) + } + + 3 -> { + + openGallery() + + } + + 4 -> { + startCameraIntent(requireActivity()) + + } + } + } + + override fun onPermissionDenied(response: PermissionDeniedResponse) { + if (response.isPermanentlyDenied) { + showAlert() + } else { + Toast.makeText(requireContext(), "permission denied", Toast.LENGTH_SHORT) + .show() + } + } + + override fun onPermissionRationaleShouldBeShown( + permission: PermissionRequest?, + token: PermissionToken? + ) { + Toast.makeText( + requireContext(), + "permission is needed to use this feature", + Toast.LENGTH_SHORT + ).show() + token?.continuePermissionRequest() + } + }).check() + } +} + + + diff --git a/app/src/main/java/com/consultantapp/utils/BasePhotoUploadActivity.kt b/app/src/main/java/com/consultantapp/utils/BasePhotoUploadActivity.kt new file mode 100644 index 0000000..02580d3 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/BasePhotoUploadActivity.kt @@ -0,0 +1,968 @@ +package com.consultantapp.utils + +import android.Manifest +import android.app.AlertDialog +import android.app.Dialog +import android.content.ContentUris +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.Matrix +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.media.ExifInterface +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.provider.OpenableColumns +import android.provider.Settings +import android.util.Log +import android.view.Window +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.Nullable +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.content.FileProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.target.CustomTarget +import com.consultantapp.databinding.ItemDialogImageBinding +import com.karumi.dexter.Dexter +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionDeniedResponse +import com.karumi.dexter.listener.PermissionGrantedResponse +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.single.PermissionListener +import dagger.android.support.DaggerAppCompatActivity +import java.io.* +import java.util.* + +abstract class BasePhotoUploadActivity : DaggerAppCompatActivity() { + + var is_video = false + var galleryPrem = false + private val JPEG_FILE_PREFIX = "IMG_" + private val JPEG_FILE_SUFFIX = ".jpg" + + + var mPicturePath: String? = null + var mIsGallery: Boolean? = null + var bitmap: Bitmap? = null + var reqcode = 0 + var triescamera = 0 + var triesgallary = 0 + + + @RequiresApi(Build.VERSION_CODES.M) + fun showImageDialog(b: Boolean, galleryPrem: Boolean) { + is_video = b + + + val dialog: Dialog = Dialog(this) + var view = ItemDialogImageBinding.inflate(layoutInflater) + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + dialog.setContentView(view.root) + + view.tvGallery.setOnClickListener { + mIsGallery = true + if (!is_video) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditongallary(galleryPrem) + + } else { + + checkgallry(galleryPrem) + + + } + } else { + openVideoGallery() + } + + dialog.dismiss() + } + + view.ivClose.setOnClickListener { dialog.dismiss() } + + view.tvCamera.setOnClickListener { + mIsGallery = false + + if (!is_video) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditioncamera() + + } else { + + checkcamera() + + } + } else { + startCameraIntentVideo(this) + } + + + + dialog.dismiss() + } + dialog.show() + } + +// fun showImageDialogForPdfAndVideo() { +// +// +// val dialog: Dialog = Dialog(requireActivity()) +// var view = DialogProfileBinding.inflate(layoutInflater) +// dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) +// dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) +// dialog.setContentView(view.root) +// +// view.tvGallery.text= "PDF" +// view.tvCamera.text= "Video" +// view.tvGallery.setOnClickListener { +// +// openPdf() +// +// dialog.dismiss() +// } +// +// view.ivClose.setOnClickListener { dialog.dismiss() } +// +// view.tvCamera.setOnClickListener { +// +// showImageDialog(true) +// +// dialog.dismiss() +// } +// dialog.show() +// } + + open fun startCameraIntentVideo(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) + takePictureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); + + cameraIntentVideo.launch(takePictureIntent) + } + + open fun openVideoGallery() { + val intent = Intent() + intent.type = "video/*" + intent.action = Intent.ACTION_GET_CONTENT + cameraIntentVideo.launch(intent) + } + + var cameraIntentVideo = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val videoUri = it!!.data?.data + if (it!!.data?.data != null) { + + val mimeType: String = + this.contentResolver.getType(videoUri!!)!! //Save file to upload on server + val file = saveVideoToAppScopeStorage(this, videoUri, mimeType) + getVideo(file.toString(), 2) + } + } + + fun saveVideoToAppScopeStorage(context: Context, videoUri: Uri?, mimeType: String?): File? { + if (videoUri == null || mimeType == null) { + return null + } + + val fileName = "capturedVideo${Calendar.getInstance().time.time}.mp4" + + val inputStream = context.contentResolver.openInputStream(videoUri) + val file = File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM), fileName) + file.deleteOnExit() + file.createNewFile() + val out = FileOutputStream(file) + val bos = BufferedOutputStream(out) + + val buf = ByteArray(1024) + inputStream?.read(buf) + do { + bos.write(buf) + } while (inputStream?.read(buf) !== -1) + + //out.close() + bos.close() + inputStream.close() + + return file + } + + abstract fun getVideo(uri: String?, i: Int) + + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkcamera() { +// + + + reqcode = 2 + requestPermissionsFOR(Manifest.permission.CAMERA,galleryPrem) + +// if (checkForCameraPermission()) { +// startCameraIntent(requireActivity()) +// +//// if (checkForWritePermission()) { +//// startCameraIntent(requireActivity()) +//// }else{ +//// setting() +//// +//// } +// }else{ +// setting() +// } + } + + private fun setting() { + val ifFailed = { + Log.e("tries", "checkconditioncamera: " + triescamera) + + if (triescamera >= 2) { + showAlert() + + + } + + } + ifFailed.invoke() + + } + + private fun settinggallary() { + val ifFailed = { + Log.e("tries", "checkconditioncamera: " + triesgallary) + + if (triesgallary >= 2) { + showAlert() + + + } + + } + ifFailed.invoke() + + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkgallry(galleryPrem : Boolean) { + + + reqcode = 1 + + requestPermissionsFOR(Manifest.permission.READ_EXTERNAL_STORAGE,galleryPrem) + +// if (checkForReadPermission()) { +// +// openGallery() +// +// }else{ +// settinggallary() +// } + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkconditioncamera() { + + reqcode = 4 + + requestPermissionsFOR(Manifest.permission.CAMERA,galleryPrem) + +// if (checkForCameraPermission()) { +// startCameraIntent(requireActivity()) +// +// }else{ +// setting() +// } + + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkconditongallary(galleryPrem : Boolean) { + + + reqcode = 3 + + requestPermissionsFOR(Manifest.permission.READ_MEDIA_IMAGES,galleryPrem) + + +// if (checkForReadPermission33()) { +// openGallery() +// +// }else{ +// settinggallary() +// } + + } + + + open fun openPdf() { + var chooseFileIntent = Intent(Intent.ACTION_GET_CONTENT) + chooseFileIntent.type = "application/pdf" + chooseFileIntent.action = Intent.ACTION_GET_CONTENT + chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE) + chooseFileIntent = Intent.createChooser(chooseFileIntent, "Choose a file") + startActivityForResult(chooseFileIntent, 3) + } + + + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + + Log.e("grantResults", "onRequestPermissionsResult: " + grantResults) + Log.e("grantResults", "onRequestPermissionsResult: " + permissions) + + + when (requestCode) { + 1 -> { + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkgallry(galleryPrem) + } + } + + +// prefManager.settriesgallary(triesgallary) + + } + } + + + 2 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkcamera() + } + } + +// prefManager.settriescamera(triescamera) + + } + Log.e("triestries", "onRequestPermissionsResult: " + triescamera) + } + + 3 -> { + + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary(galleryPrem) + } + } + +// prefManager.settriesgallary(triesgallary) + + } + Log.e("triestries", "onRequestPermissionsResult: " + triesgallary) + + + } + + 4 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary(galleryPrem) + } + } +// prefManager.settriescamera(triescamera) + + } + } + } + } + + @RequiresApi(Build.VERSION_CODES.M) + fun checkForReadPermission(): Boolean { + return if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.READ_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), + reqcode + ) + false + } else { + true + } + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun checkForReadPermission33(): Boolean { + return if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_IMAGES + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.READ_MEDIA_IMAGES), + reqcode + ) + false + } else { + true + } + } + + + @RequiresApi(Build.VERSION_CODES.M) + fun checkForWritePermission(): Boolean { + return if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + reqcode + ) + false + } else { + true + } + } + + @RequiresApi(Build.VERSION_CODES.M) + fun checkForCameraPermission(): Boolean { + return if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) != PackageManager.PERMISSION_GRANTED + ) { + + requestPermissions(arrayOf(Manifest.permission.CAMERA), reqcode) + false + } else { + true + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == 1) { + if (data != null) { + if (getRealPath(data.data!!, this) != null) { + getImage(getRealPath(data.data!!, this), data.data!!) + } else { + Glide.with(this) + .asBitmap() + .load(data.data) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .into(object : CustomTarget() { + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} + override fun onResourceReady( + resource: Bitmap, + transition: com.bumptech.glide.request.transition.Transition? + ) { + val file: String = getRealPath( + Uri.fromFile(saveImageToExternalStorage(resource)), + this@BasePhotoUploadActivity + )!! + getImage( + file, + Uri.fromFile(saveImageToExternalStorage(resource)) + ) + } + }) + } + } + } else if (requestCode == 2 && resultCode == -1) { + try{ + val file: String = getRealPath( + Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, this)!! + + ) + ), this + )!! + getImage( + file, Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath,this)!! + ) + ) + ) + }catch (ex: Exception){ + Toast.makeText(this,"This functionality is under development", Toast.LENGTH_LONG).show() + } + + + } else if (requestCode == 3 && resultCode == -1) { + val uri: Uri = data?.data!! + val a = getPDFPath(uri); + +// val file = File(a) // /document/document:30082 +// val profReq = file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) +// var request_image = MultipartBody.Part.createFormData("doc", file.name, profReq) +// val pdfDocument=request_image + getPdf(a) + } else { + Log.e("gndnfkfnkn", "onActivityResult: " + data?.data) + } + + + } + + abstract fun getPdf(uri: String?) + abstract fun getImage(uri: String?, data: Uri) + fun getPDFPath(uri: Uri?): String? { + var absolutePath = "" + try { + val inputStream = this.contentResolver.openInputStream( + uri!! + ) + val pdfInBytes = ByteArray(inputStream!!.available()) + inputStream.read(pdfInBytes) + var offset = 0 + var numRead = 0 + while (offset < pdfInBytes.size && inputStream.read( + pdfInBytes, + offset, + pdfInBytes.size - offset + ).also { + numRead = it + } >= 0 + ) { + offset += numRead + } + val returnCursor: Cursor? = + this.contentResolver.query(uri, null, null, null, null) + val nameIndex = returnCursor?.getColumnIndex(OpenableColumns.DISPLAY_NAME) + returnCursor?.moveToFirst() + var mPath = "" + mPath = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) { + this.getExternalFilesDir(Environment.DIRECTORY_DCIM) + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } else { + Environment.getExternalStorageDirectory() + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } + val pdfFile = File(mPath) + val op: OutputStream = FileOutputStream(pdfFile) + op.write(pdfInBytes) + absolutePath = pdfFile.path + } catch (ae: Exception) { + ae.printStackTrace() + } + return absolutePath + } + + fun openGallery(galleryPrem : Boolean) { + if (galleryPrem){ + val i = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(i, 1) + } + + } + + open fun isNougatDevice(): Boolean { + return Build.VERSION.SDK_INT >= 24 + } + + open fun startCameraIntent(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + var f: File? = null + try { + val LOCAL_STORAGE_BASE_PATH_FOR_MEDIA = context.getExternalFilesDir("") + .toString() + "/" + "consultantapp" + val LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES: String = + LOCAL_STORAGE_BASE_PATH_FOR_MEDIA + "/User/Images/" + f = setUpImageFile(LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES) + mPicturePath = f!!.absolutePath + /* add provider in xml and + * manifest then add following code for Nougat devices + * to overcome file uri exposed app crash + */if (isNougatDevice()) { + takePictureIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + val contentUri: Uri = FileProvider.getUriForFile(this, "com.consultantapp", f) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri) + } else { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)) + } + } catch (e: Exception) { + e.printStackTrace() + f = null + mPicturePath = null + } + startActivityForResult(takePictureIntent, 2) + } + + private fun showAlert() { + // we are displaying an alert dialog for permissions + val builder = AlertDialog.Builder(this) + + // below line is the title for our alert dialog. + builder.setTitle("Need Permissions") + + // below line is our message for our dialog + builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.") + + builder.setPositiveButton("GOTO SETTINGS") { dialog, which -> + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + val uri = Uri.fromParts("package", this.packageName, null) + intent.data = uri + } else { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:" + this.packageName) + } + + startActivity(intent) + } + + builder.setNegativeButton("Cancel") { dialog, which -> + // this method is called when user clicks on the negative button. + dialog.cancel() + } + + // below line is used to display our dialog + builder.show() + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getRealPath(uri: Uri, context: Context): String? { + val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + return (Environment.getExternalStorageDirectory() + .toString() + "/" + split[1]) + } else { + val splitIndex = docId.indexOf(':', 1) + val tag = docId.substring(0, splitIndex) + val path = docId.substring(splitIndex + 1) + val nonPrimaryVolume = + getPathToNonPrimaryVolume(context, tag) + if (nonPrimaryVolume != null) { + val result = "$nonPrimaryVolume/$path" + val file = File(result) + if (file.exists() && file.canRead()) { + return result + } + } + } + } else if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + + ) + return getDataColumn(context, contentUri, null, null) + } else if (isMediaDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + var contentUri: Uri? = null + if ("image" == type) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } else if ("video" == type) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } else if ("audio" == type) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + val selection = "_id=?" + val selectionArgs = + arrayOf(split[1]) + return getDataColumn(context, contentUri, selection, selectionArgs) + } + } else if ("content".equals(uri.scheme, ignoreCase = true)) { + return getDataColumn(context, uri, null, null) + } else if ("file".equals(uri.scheme, ignoreCase = true)) { + return uri.path + } + return null + } + + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getPathToNonPrimaryVolume(context: Context, tag: String): String? { + val volumes = context.externalCacheDirs + if (volumes != null) { + for (volume in volumes) { + if (volume != null) { + val path = volume.absolutePath + if (path != null) { + val index = path.indexOf(tag) + if (index != -1) { + return path.substring(0, index) + tag + } + } + } + } + } + return null + } + + private fun getDataColumn( + context: Context, uri: Uri?, selection: String?, selectionArgs: + Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf(column) + try { + cursor = context.contentResolver.query( + uri!!, projection, + selection, selectionArgs, null + ) + if (cursor != null && cursor.moveToFirst()) { + val column_index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(column_index) + } + } finally { + cursor?.close() + } + return null + } + + fun setUpImageFile(imageDirectory: String?): File? { + var imageFile: File? = null + if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) { + val storageDir = File(imageDirectory) + if (null != storageDir) { + if (!storageDir.mkdirs()) { + if (!storageDir.exists()) { + Log.d("CameraSample", "failed to create directory") + return null + } + } + } + imageFile = File.createTempFile( + JPEG_FILE_PREFIX + + System.currentTimeMillis() + "_", + JPEG_FILE_SUFFIX, storageDir + ) + } + return imageFile + } + + fun saveImageToExternalStorage(finalBitmap: Bitmap): File? { + val file: File + val root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + .toString() + val myDir = File("$root/Mojo") + myDir.mkdirs() + val fname = (JPEG_FILE_PREFIX + System.currentTimeMillis() + "_" + JPEG_FILE_SUFFIX) + + file = File(myDir, fname) + if (file.exists()) file.delete() + try { + val out = FileOutputStream(file) + finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) + out.flush() + out.close() + return file + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + return file + } + + fun getFile(imgPath: String?, mContext: Context?): Bitmap? { + val mOrientation: Int + var bMapRotate: Bitmap? = null + try { + if (imgPath != null) { + val exif = ExifInterface(imgPath) + mOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1) + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeFile(imgPath, options) + options.inSampleSize = calculateInSampleSize(options, 400, 400) + options.inJustDecodeBounds = false + bMapRotate = BitmapFactory.decodeFile(imgPath, options) + when (mOrientation) { + 6 -> { + val matrix = Matrix() + matrix.postRotate(90f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 8 -> { + val matrix = Matrix() + matrix.postRotate(270f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 3 -> { + val matrix = Matrix() + matrix.postRotate(180f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + } + } else { + + } + } catch (e: OutOfMemoryError) { + bMapRotate = null + e.printStackTrace() + } catch (e: IOException) { + e.printStackTrace() + } catch (e: java.lang.Exception) { + bMapRotate = null + e.printStackTrace() + } + return bMapRotate + } + + fun calculateInSampleSize( + options: BitmapFactory.Options, + reqWidth: Int, + reqHeight: Int + ): Int { + try { + val height = options.outHeight + val width = options.outWidth + var inSampleSize = 1 + if (height > reqHeight || width > reqWidth) { + val halfHeight = height / 2 + val halfWidth = width / 2 + while (halfHeight / inSampleSize > reqHeight + && halfWidth / inSampleSize > reqWidth + ) { + inSampleSize *= 2 + } + } + return inSampleSize + } catch (e: Exception) { + e.printStackTrace() + } + return 0 + } + + + private fun requestPermissionsFOR(readMediaImages: String,galleryPrem : Boolean) { + Dexter.withContext(this) + .withPermission(readMediaImages) + .withListener(object : PermissionListener { + override fun onPermissionGranted(response: PermissionGrantedResponse) { +// Toast.makeText(requireContext(), "Camera permission granted", Toast.LENGTH_SHORT).show() +// // Reset the denial count +// // Proceed with camera access + + + when (reqcode) { + 1 -> { + + openGallery(galleryPrem) + } + + 2 -> { + startCameraIntent(this@BasePhotoUploadActivity) + } + + 3 -> { + + openGallery(galleryPrem) + + } + + 4 -> { + startCameraIntent(this@BasePhotoUploadActivity) + + } + } + } + + override fun onPermissionDenied(response: PermissionDeniedResponse) { + if (response.isPermanentlyDenied) { + showAlert() + } else { + Toast.makeText(applicationContext, "permission denied", Toast.LENGTH_SHORT) + .show() + } + } + + override fun onPermissionRationaleShouldBeShown( + permission: PermissionRequest?, + token: PermissionToken? + ) { + Toast.makeText( + applicationContext, + "permission is needed to use this feature", + Toast.LENGTH_SHORT + ).show() + token?.continuePermissionRequest() + } + }).check() + } +} diff --git a/app/src/main/java/com/consultantapp/utils/BroadcastReceiverModule.kt b/app/src/main/java/com/consultantapp/utils/BroadcastReceiverModule.kt new file mode 100644 index 0000000..0f7bc20 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/BroadcastReceiverModule.kt @@ -0,0 +1,11 @@ +package com.consultantapp.utils + +import com.consultantapp.pushNotifications.MyNotificationReceiver +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class BroadcastReceiverModule { + @ContributesAndroidInjector + abstract fun contributesMyTestReceiver(): MyNotificationReceiver +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/CallRingManager.kt b/app/src/main/java/com/consultantapp/utils/CallRingManager.kt new file mode 100644 index 0000000..fc98879 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/CallRingManager.kt @@ -0,0 +1,29 @@ +package com.consultantapp.utils + +import android.content.Context +import android.media.MediaPlayer +import com.consultantapp.R + +object CallRingManager { + var mediaPlayer:MediaPlayer?=null + + + fun playRingtone(context:Context) { + mediaPlayer = MediaPlayer.create(context, R.raw.incoming_call) + mediaPlayer?.isLooping = true + mediaPlayer?.start() + + } + + fun stopRingtone() { + if(mediaPlayer!=null){ + mediaPlayer?.isLooping = false + mediaPlayer?.stop() + } + } + + fun isPlaying():Boolean { + return if(mediaPlayer!=null) mediaPlayer!!.isPlaying else false + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/ConnectionDetector.kt b/app/src/main/java/com/consultantapp/utils/ConnectionDetector.kt new file mode 100644 index 0000000..6f0f4a4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/ConnectionDetector.kt @@ -0,0 +1,64 @@ +package com.consultantapp.utils + +import android.content.Context +import android.content.Intent +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build +import com.consultantapp.ui.drawermenu.DrawerActivity + +private fun showNoInternetDialog(context: Context?) { + /* AlertDialog.Builder(context) + .setCancelable(false) + .setTitle(context.getString(R.string.internet)) + .setMessage(context.getString(R.string.check_internet)) + .setPositiveButton(context.getString(R.string.ok)) { _, _ -> + *//*val intent = Intent(Settings.ACTION_SETTINGS) + context.startActivity(intent)*//* + }.show()*/ + + context?.startActivity(Intent(context, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.NETWORK_ERROR)) +} + +/* fun showRetrofitErrorToast() { + Toast.makeText(context, context.getString(R.string.might_problem), Toast.LENGTH_LONG).show() + }*/ + + +fun isConnectedToInternet(context: Context?, showAlert: Boolean): Boolean { + val isConnected = isConnectedToInternet(context) + + return when { + isConnected -> true + showAlert -> { + showNoInternetDialog(context) + false + } + else -> false + } +} + + + +private fun isConnectedToInternet(context: Context?): Boolean { + val connectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + val activeNetwork = connectivityManager.activeNetwork ?: return false + val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) + ?: return false + return when { + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true + //for other device how are able to connect with Ethernet + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true + //for check internet over Bluetooth + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true + else -> false + } + } else { + val nwInfo = connectivityManager.activeNetworkInfo ?: return false + return nwInfo.isConnected + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/CustomTimePickerDialog.kt b/app/src/main/java/com/consultantapp/utils/CustomTimePickerDialog.kt new file mode 100644 index 0000000..65787d4 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/CustomTimePickerDialog.kt @@ -0,0 +1,89 @@ +package com.consultantapp.utils + +import android.app.TimePickerDialog +import android.content.Context +import android.content.DialogInterface +import android.view.View +import android.widget.NumberPicker +import android.widget.TimePicker +import java.util.* + +class CustomTimePickerDialog( + context: Context, private val mTimeSetListener: OnTimeSetListener?, + hourOfDay: Int, minute: Int, is24HourView: Boolean +) : + TimePickerDialog( + context, THEME_HOLO_LIGHT, mTimeSetListener, hourOfDay, + minute / TIME_PICKER_INTERVAL, is24HourView + ) { + private var mTimePicker: TimePicker? = null + + var savedHour = 0 + var savedMinute = 0 + + init { + savedHour = hourOfDay + savedMinute = minute / TIME_PICKER_INTERVAL + } + + override fun updateTime(hourOfDay: Int, minuteOfHour: Int) { + mTimePicker?.currentHour = hourOfDay + mTimePicker?.currentMinute = minuteOfHour / TIME_PICKER_INTERVAL + } + + override fun onTimeChanged(view: TimePicker?, hourOfDay: Int, minute: Int) { + + if (savedHour != 0) { + if (savedMinute != minute && savedHour != hourOfDay) { + mTimePicker?.currentHour = savedHour + }else{ + savedMinute = minute + savedHour = hourOfDay + } + }else{ + savedHour = hourOfDay + savedMinute = minute + } + super.onTimeChanged(view, savedHour, savedMinute) + } + + override fun onClick(dialog: DialogInterface, which: Int) { + when (which) { + DialogInterface.BUTTON_POSITIVE -> mTimeSetListener?.onTimeSet( + mTimePicker, (mTimePicker?.currentHour ?: 0), + (mTimePicker?.currentMinute ?: 0) * TIME_PICKER_INTERVAL + ) + DialogInterface.BUTTON_NEGATIVE -> cancel() + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + try { + val classForid = Class.forName("com.android.internal.R\$id") + val timePickerField = classForid.getField("timePicker") + mTimePicker = findViewById(timePickerField.getInt(null)) as TimePicker? + val field = classForid.getField("minute") + + val minuteSpinner = mTimePicker?.findViewById(field.getInt(null)) as NumberPicker + minuteSpinner.minValue = 0 + minuteSpinner.maxValue = 60 / TIME_PICKER_INTERVAL - 1 + val displayedValues = ArrayList() + var i = 0 + while (i < 60) { + displayedValues.add(String.format("%02d", i)) + i += TIME_PICKER_INTERVAL + } + minuteSpinner.displayedValues = displayedValues + .toTypedArray() + } catch (e: Exception) { + e.printStackTrace() + } + + } + + companion object { + + private val TIME_PICKER_INTERVAL = 30 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/DateUtils.kt b/app/src/main/java/com/consultantapp/utils/DateUtils.kt new file mode 100644 index 0000000..2480e55 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/DateUtils.kt @@ -0,0 +1,358 @@ +package com.consultantapp.utils + +import android.app.Activity +import android.app.DatePickerDialog +import android.content.Context +import android.graphics.Color +import android.text.format.DateUtils +import androidx.core.content.ContextCompat +import com.consultantapp.R +import com.consultantapp.ui.dashboard.doctor.schedule.OnTimeSelected +import com.github.florent37.singledateandtimepicker.dialog.SingleDateAndTimePickerDialog +import java.text.SimpleDateFormat +import java.util.* + + +object DateUtils { + + val utcFormat = SimpleDateFormat(DateFormat.UTC_FORMAT_NORMAL, Locale.ENGLISH) + + /* fun openDatePicker(activity: Activity, listener: OnDateSelected,max: Long?, min: Long?) { + val c = Calendar.getInstance() + val year = c.get(Calendar.YEAR) + val month = c.get(Calendar.MONTH) + val day = c.get(Calendar.DAY_OF_MONTH) + + val dpd = DatePickerDialog(activity, { view, year, monthOfYear, dayOfMonth -> + var selectedDate = "$dayOfMonth/${monthOfYear.plus(1)}/$year" + + selectedDate = + dateFormatChange(DateFormat.DATE_FORMAT_SLASH_YEAR, DateFormat.DATE_FORMAT_SLASH, selectedDate) + listener.onDateSelected(selectedDate) + + }, year, month, day + ) + + if (max != null) + dpd.datePicker.maxDate = max + if (min != null) + dpd.datePicker.minDate = min + + dpd.show() + }*/ + + fun openDatePicker(activity: Activity, listener: OnDateSelected, max: Long?, min: Long?) { + + val picker = SingleDateAndTimePickerDialog.Builder(activity) + .customLocale(Locale.ENGLISH) + .bottomSheet() + .focusable() + .backgroundColor(Color.BLACK) + .displayHours(false) + .displayMinutes(false) + .displayDays(false) + .displayMonth(true) + .displayYears(true) + .titleTextSize(16) + .displayDaysOfMonth(true) + .title(activity.getString(R.string.select_date)) + .mainColor(ContextCompat.getColor(activity, R.color.colorWhite)) + .titleTextColor(ContextCompat.getColor(activity, R.color.colorWhite)) + .listener { + //Toast.makeText(activity, it.toString(), Toast.LENGTH_SHORT).show() + when { + (min == null || it.time > min) && (max == null || it.time < max) -> { + var selectedDate = dateFormatFromMillis(DateFormat.DATE_FORMAT, it.time) + selectedDate = dateFormatChange( + DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, + selectedDate + ) + listener.onDateSelected(selectedDate) + } + min != null && it.time < min -> { + activity.longToast(activity.getString(R.string.select_future_date)) + } + max != null && it.time > max -> { + activity.longToast(activity.getString(R.string.select_previos_date)) + } + } + } + + if (min != null) { + picker.minDateRange(Date(min)) + picker.defaultDate(Date((min + 86400000))) + } + if (max != null) { + picker.maxDateRange(Date(max)) + picker.defaultDate(Date((max - 86400000))) + } + + picker.display() + } + + + fun openDatePickerDialog(activity: Activity, listener: OnDateSelected, max: Long?, min: Long?) { + val c = Calendar.getInstance() + val year = c.get(Calendar.YEAR) + val month = c.get(Calendar.MONTH) + val day = c.get(Calendar.DAY_OF_MONTH) + + val dpd = DatePickerDialog( + activity, { view, year, monthOfYear, dayOfMonth -> + var selectedDate = "$dayOfMonth/${monthOfYear.plus(1)}/$year" + + selectedDate = + dateFormatChange( + DateFormat.DATE_FORMAT_SLASH_YEAR, + DateFormat.MON_DATE_YEAR, + selectedDate + ) + listener.onDateSelected(selectedDate) + + }, year, month, day + ) + + if (max != null) + dpd.datePicker.maxDate = max + if (min != null) + dpd.datePicker.minDate = min + + dpd.show() + } + + fun dateFormatFromMillisBackend(format: String, timeInMillis: Long?): String { + val fmt = SimpleDateFormat(format, Locale.ENGLISH) + return if (timeInMillis == null || timeInMillis == 0L) + "" + else + fmt.format(timeInMillis) + } + + fun dateFormatFromMillis(format: String, timeInMillis: Long?): String { + val fmt = SimpleDateFormat(format, Locale.ENGLISH) + return if (timeInMillis == null || timeInMillis == 0L) + "" + else + fmt.format(timeInMillis) + } + + + fun dateFormatChange(formatFrom: String, formatTo: String, value: String): String { + val originalFormat = SimpleDateFormat(formatFrom, Locale.ENGLISH) + val originalFormatDefault = SimpleDateFormat(formatFrom, Locale.ENGLISH) + + val targetFormat = SimpleDateFormat(formatTo, Locale.ENGLISH) + + val date = try { + originalFormat.parse(value) + } catch (e: Exception) { + originalFormatDefault.parse(value) + } + return targetFormat.format(date) + } + + fun dateFormatForBackend(formatFrom: String, formatTo: String, value: String): String { + val originalFormat = SimpleDateFormat(formatFrom, Locale.ENGLISH) + val originalFormatDefault = SimpleDateFormat(formatFrom, Locale.ENGLISH) + + val targetFormat = SimpleDateFormat(formatTo, Locale.ENGLISH) + + val date = try { + originalFormat.parse(value) + } catch (e: Exception) { + originalFormatDefault.parse(value) + } + + return targetFormat.format(date) + } + + + /* fun dateFormatForBackend(formatFrom: String, formatTo: String, value: String): String { + val originalFormat = SimpleDateFormat(formatFrom, Locale.ENGLISH).apply { + timeZone = TimeZone.getDefault() // Input time zone (local time zone) + } + + val targetFormat = SimpleDateFormat(formatTo, Locale.ENGLISH).apply { + timeZone = TimeZone.getTimeZone("UTC") // Output time zone (UTC) + } + + val date = try { + originalFormat.parse(value) + } catch (e: Exception) { + null // Handle parse error gracefully + } + + return date?.let { targetFormat.format(it) } ?: "" + } +*/ + + + fun getTimeAgo(createdAt: String?): String { + val agoString: String + + if (createdAt == null) { + return "" + } + + utcFormat.timeZone = TimeZone.getTimeZone("Etc/UTC") + val time = utcFormat.parse(createdAt).time + val now = System.currentTimeMillis() + + val ago = DateUtils.getRelativeTimeSpanString( + time, now, DateUtils.SECOND_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE + ) + + + return ago.toString() + } + + fun getTimeAgoForMillis(millis: Long): String { + + val now = System.currentTimeMillis() + + return DateUtils.getRelativeTimeSpanString( + millis, now, DateUtils.SECOND_IN_MILLIS, + DateUtils.FORMAT_ABBREV_RELATIVE + ).toString() + } + + fun getLocalTimeAgo(timeString: Long?, removeAgo: String): String { + var agoString = "" + + timeString?.let { + val now = System.currentTimeMillis() + + val ago = DateUtils.getRelativeTimeSpanString( + timeString, now, + DateUtils.SECOND_IN_MILLIS, DateUtils.FORMAT_SHOW_TIME + ) + + agoString = ago.toString() + } + + return agoString + } + + fun dateTimeFormatFromUTC(format: String, createdDate: String?): String { + return if (createdDate == null || createdDate.isEmpty()) + "" + else { + utcFormat.timeZone = TimeZone.getTimeZone("UTC") + + val fmt = SimpleDateFormat(format, Locale.ENGLISH) + fmt.format(utcFormat.parse(createdDate)) + } + } + + fun getTime( + context: Context, startTime: String, endTime: String?, + isStart: Boolean, listener: OnTimeSelected + ) { + var compareDate = true + if (endTime == null) + compareDate = false + else if (isStart && endTime.isEmpty()) { + compareDate = false + } else if (startTime.isEmpty()) { + compareDate = false + } + + val sdf = SimpleDateFormat(DateFormat.TIME_FORMAT, Locale.ENGLISH) + + val endTime = if (endTime != null && endTime.isNotEmpty()) + sdf.parse(endTime) + else Date() + + val startTime = if (startTime.isNotEmpty()) + sdf.parse(startTime) + else Date() + + val cal = Calendar.getInstance() + var selectedTime = "" + var isError = false + + val picker = SingleDateAndTimePickerDialog.Builder(context) + .customLocale(Locale.ENGLISH) + .bottomSheet() + .focusable() + .curved() + .backgroundColor(Color.BLACK) + .displayHours(true) + .displayMinutes(true) + .displayDays(false) + .displayMonth(false) + .displayYears(false) + .titleTextSize(16) + .minutesStep(30) + .displayDaysOfMonth(false) + .title(context.getString(R.string.select_time)) + .mainColor(ContextCompat.getColor(context, R.color.colorWhite)) + .titleTextColor(ContextCompat.getColor(context, R.color.colorWhite)) + .listener { + //Toast.makeText(activity, it.toString(), Toast.LENGTH_SHORT).show() + cal.set( + Calendar.HOUR_OF_DAY, + dateFormatFromMillisBackend(DateFormat.HH_24, it.time).toInt() + ) + cal.set( + Calendar.MINUTE, + dateFormatFromMillisBackend(DateFormat.MM, it.time).toInt() + ) + + val newTime = sdf.parse(sdf.format(cal.time)) + val time = sdf.format(cal.time) + + /* val different = if (isStart) newTime.time - endTime.time + else + newTime.time - startTime.time*/ + + if (isStart) { + if (!compareDate || newTime.before(endTime)) { + selectedTime = time + } else { + isError = true + } + + } else { + if (!compareDate || startTime.before(newTime)) { + selectedTime = sdf.format(cal.time) + } else { + isError = true + } + } + + listener.onTimeSelected(Triple(selectedTime, isStart, isError)) + } + picker.display() + } +} + +/*On Date selected listener*/ +interface OnDateSelected { + fun onDateSelected(date: String) +} + +fun isYesterday(calendar: Calendar): Boolean { + val tempCal = Calendar.getInstance() + tempCal.add(Calendar.DAY_OF_MONTH, -1) + return calendar.get(Calendar.DAY_OF_MONTH) == tempCal.get(Calendar.DAY_OF_MONTH) +} + +object DateFormat { + const val DATE_FORMAT = "yyyy-MM-dd" + const val DATE_TIME_FORMAT = "MMM dd, yyyy · hh:mm a" + const val DAY_DATE_FORMAT = "EEE · MMM dd, yyyy" + const val TIME_FORMAT = "hh:mm a" + const val TIME_FORMAT_24 = "HH:mm" + const val MON_DATE_YEAR = "MMM dd, yyyy" + const val MON_DATE = "MMM dd" + const val DATE_FORMAT_SLASH_YEAR = "dd/MM/yyyy" + const val UTC_FORMAT_NORMAL = "yyyy-MM-dd HH:mm:ss" + const val UTC_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" + const val DATE = "dd" + const val MONTH = "MM" + const val YEAR = "yyyy" + const val HH_24 = "HH" + const val MM = "mm" +} diff --git a/app/src/main/java/com/consultantapp/utils/GeneralFunction.kt b/app/src/main/java/com/consultantapp/utils/GeneralFunction.kt new file mode 100644 index 0000000..2fdfa2c --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/GeneralFunction.kt @@ -0,0 +1,939 @@ +package com.consultantapp.utils + +//import com.stfalcon.frescoimageviewer.ImageViewer +//import droidninja.filepicker.FilePickerBuilder +//import droidninja.filepicker.models.sort.SortingTypes +import android.annotation.SuppressLint +import android.app.Activity +import android.app.Activity.RESULT_OK +import android.app.DownloadManager +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInfo +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Typeface +import android.location.Address +import android.location.Geocoder +import android.net.Uri +import android.os.Environment +import android.os.Handler +import android.provider.MediaStore +import android.text.SpannableString +import android.text.Spanned +import android.text.TextPaint +import android.text.style.ClickableSpan +import android.text.style.ForegroundColorSpan +import android.text.style.StyleSpan +import android.util.Log +import android.view.MotionEvent +import android.view.View +import android.view.animation.Animation +import android.view.animation.AnimationUtils +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.widget.PopupMenu +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.core.text.HtmlCompat +import androidx.core.text.toSpanned +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.consultantapp.BuildConfig +import com.consultantapp.R +import com.consultantapp.appClientDetails +import com.consultantapp.appFeatures +import com.consultantapp.data.models.responses.Request +import com.consultantapp.data.models.responses.UserData +import com.consultantapp.data.network.Config +import com.consultantapp.ui.dashboard.HomeActivity +import com.consultantapp.ui.webview.WebViewActivity +import com.consultantapp.utils.DateUtils.dateFormatForBackend +import com.consultantapp.utils.dialogs.ProgressDialog +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder +import com.google.android.gms.maps.model.BitmapDescriptor +import com.google.android.gms.maps.model.BitmapDescriptorFactory +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.api.model.TypeFilter +import com.google.android.libraries.places.widget.Autocomplete +import com.google.android.libraries.places.widget.model.AutocompleteActivityMode +import com.google.android.material.snackbar.Snackbar +import com.google.firebase.dynamiclinks.ktx.* +import com.google.firebase.ktx.Firebase +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody +import java.io.File +import java.text.NumberFormat +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.* + + +fun View.gone() { + visibility = View.GONE +} + +fun View.visible() { + visibility = View.VISIBLE +} + +fun View.invisible() { + visibility = View.INVISIBLE +} + +fun View.hideShowView(listIsEmpty: Boolean) { + visibility = if (listIsEmpty) View.VISIBLE + else View.GONE +} + +fun getRequestBody(string: String?): RequestBody { + return RequestBody.create("text/plain".toMediaTypeOrNull(), string ?: "") +} + +fun View.showSnackBar(msg: String) { + try { + val snackBar = Snackbar.make(this, msg, Snackbar.LENGTH_LONG) + val snackBarView = snackBar.view + val textView = + snackBarView.findViewById(R.id.snackbar_text) as TextView + textView.maxLines = 3 + snackBar.setAction(R.string.ok) { snackBar.dismiss() } + snackBarView.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimary)) + snackBar.setActionTextColor(ContextCompat.getColor(context, R.color.colorPrimary)) + snackBar.show() + } catch (e: Exception) { + e.printStackTrace() + } +} + +fun logoutUser(activity: Activity?, prefsManager: PrefsManager) { + + Log.d("logoutCalled", "clearData") + + val notificationManager = + activity?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.cancelAll() + + prefsManager.remove(USER_DATA) + prefsManager.remove("token") + + activity.setResult(Activity.RESULT_CANCELED) + ActivityCompat.finishAffinity(activity) + + activity.startActivity(Intent(activity, HomeActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + + /* val fragment = WelcomeFragment() + fragment.show(activity.supportFragmentManager, fragment.tag)*/ +} + + +/*Digits should be 0,1,2,3*/ +fun getCountFormat(digits: Int, count: Int?): String { + when (digits) { + 1 -> return if (count ?: 0 <= 9) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 9) + 2 -> return if (count ?: 0 <= 99) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 99) + 3 -> return if (count ?: 0 <= 999) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 999) + else -> return if (count ?: 0 <= 9999) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 9999) + } +} + + +fun Context.longToast(text: CharSequence) { + Toast.makeText(this, text, Toast.LENGTH_LONG).show() +} + +fun addFragment(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction() + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + ?.add(id, fragment)?.commit() +} + +fun addFragmentAnim(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction() + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + ?.add(id, fragment)?.commit() +} + +fun addFragmentToBackStack(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction()?.setCustomAnimations(0, 0, 0, 0) + ?.add(id, fragment)?.addToBackStack("")?.commit() +} + +fun replaceFragmentNoBackStack(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction()?.replace(id, fragment)?.commit() +} + +fun replaceFragment(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction() + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + ?.replace(id, fragment, fragment::class.simpleName)?.addToBackStack(null)?.commit() +} + +fun addTabFragment(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction() + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + ?.add(id, fragment, fragment::class.simpleName)?.addToBackStack(null)?.commit() +} + + +fun replaceFragmentWithoutBackStack(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction()?.setCustomAnimations( + android.R.anim.fade_in, + android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out + )?.replace(id, fragment)?.commit() +} + + +fun replaceResultFragment(fragment: Fragment, targetFragment: Fragment, + container: Int, requestCode: Int) { + val ft = fragment.requireActivity().supportFragmentManager.beginTransaction() + targetFragment.setTargetFragment(fragment, requestCode) + ft.addToBackStack("") + ft.replace(container, targetFragment, fragment.tag) + ft.commit() +} + +fun resultFragmentIntent( + fragment: Fragment, + fragmentTarget: Fragment, + requestCode: Int, + intent: Intent? +) { + val intentMain = intent ?: Intent(fragment.requireContext(), fragmentTarget::class.java) + fragmentTarget.onActivityResult(requestCode, RESULT_OK, intentMain) + fragment.activity?.supportFragmentManager?.popBackStack() +} + +fun resultFragmentIntentNoPop( + fragment: Fragment, + fragmentTarget: Fragment, + requestCode: Int, + intent: Intent? +) { + val intentMain = intent ?: Intent(fragment.requireContext(), fragmentTarget::class.java) + fragmentTarget.onActivityResult(requestCode, RESULT_OK, intentMain) +} + +fun View.hideKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(windowToken, 0) +} + +fun View.showKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.toggleSoftInputFromWindow( + applicationWindowToken, + InputMethodManager.SHOW_FORCED, 0 + ) +} + +fun makeFullScreen(activity: Activity) { + activity.window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + activity.window.statusBarColor = Color.TRANSPARENT +} + + +fun getAge(date: String?): String { + if (date == null) + return "NA" + else { + val dob = Calendar.getInstance() + val today = Calendar.getInstance() + + val dateChange = dateFormatForBackend(DateFormat.DATE_FORMAT, DateFormat.MON_DATE_YEAR, date) + val formatter = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.ENGLISH) + try { + dob.time = formatter.parse(dateChange) + } catch (e: ParseException) { + e.printStackTrace() + } + + var age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR) + + if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) { + age-- + } + + val ageInt = age + + return ageInt.toString() + } +} + + +val requestOptions = RequestOptions() + .dontAnimate() + .dontTransform() + +fun loadImage(tag:String, ivImage: ImageView, image: String?, placeholder: Int) { + if(tag.equals("profile")){ + val imageLink = image + val imageThumbnail = image + + val glide = Glide.with(ivImage.context) + + glide.load(imageLink) + .apply(requestOptions) + .placeholder(placeholder) + .thumbnail(glide.load(imageThumbnail)) + .dontAnimate() + .into(ivImage) + + }else{ + val imageLink = getImageBaseUrl(ImageFolder.ASSETS+ImageFolder.ORIGINAL, image) + val imageThumbnail = getImageBaseUrl(ImageFolder.ASSETS+ImageFolder.ORIGINAL, image) + val glide = Glide.with(ivImage.context) + + glide.load(imageLink) + .apply(requestOptions) + .placeholder(placeholder) + .thumbnail(glide.load(imageThumbnail)) + .dontAnimate() + .into(ivImage) + } + +} + +fun getImageBaseUrl(folderType: String, image: String?): String { + // return "${appClientDetails.media_url}$folderType$image" + // return "https://consultants3assets.blob.core.windows.net/assets/consultants3assets/"+"$folderType$image" + return "${appClientDetails.media_url}$folderType$image" +} + +fun pxFromDp(context: Context, dp: Float): Float { + return dp * context.resources.displayMetrics.density +} + +fun getVersion(activity: Activity): PackageInfo { + return activity.packageManager.getPackageInfo(activity.packageName, 0) +} + +fun disableButton(btn: View?) { + btn?.isEnabled = false + + Handler().postDelayed({ + btn?.isEnabled = true + }, 1500)// set time as per your requirement +} + +fun getDoctorName(userData: UserData?): String { + return if (userData?.profile?.title.isNullOrEmpty()) + userData?.name ?: "" + else + "${userData?.profile?.title ?: ""} ${userData?.name}" +} + +/*fun getCurrency(amount: String?): String { + + val format = NumberFormat.getCurrencyInstance(Locale.ENGLISH) + format.maximumFractionDigits = 2 + format.currency = Currency.getInstance(appClientDetails.currency) + + return if (amount.isNullOrEmpty()) + format.format(0).replace("0.00", " NA") + else { + format.format(amount.toDouble()).replace(".00", "") + } +}*/ + + +fun getCurrency(amount: String?): String { + val currencyCode = appClientDetails.currency ?: "USD" // Default to "USD" if currency is null + val format = NumberFormat.getCurrencyInstance(Locale.ENGLISH) + format.maximumFractionDigits = 2 + + try { + format.currency = Currency.getInstance(currencyCode) + } catch (e: IllegalArgumentException) { + // Handle invalid currency code gracefully + format.currency = Currency.getInstance("USD") + } + + return if (amount.isNullOrEmpty()) + format.format(0).replace("0.00", " NA") + else { + format.format(amount.toDouble()).replace(".00", "") + } +} + +fun getCurrencySymbol(): String { + val format = NumberFormat.getCurrencyInstance() + format.currency = Currency.getInstance(appClientDetails.currency) + + return format.currency.symbol +} + +fun getUnitPrice(unit: Double?, context: Context): String { + return when { + unit == null -> "NA" + unit >= 3600 -> "${(unit / 3600)} ${context.getString(R.string.hr)}" + else -> "${(unit / 60)} ${context.getString(R.string.min)}" + } +} + +@SuppressLint("ClickableViewAccessibility") +fun editTextScroll(editText: EditText) { + editText.setOnTouchListener { v, event -> + v.parent.requestDisallowInterceptTouchEvent(true) + if ((event.action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) { + v.parent.requestDisallowInterceptTouchEvent(false) + } + false + } +} + +fun getUserRating(rating: String?): String { + return if (rating == null || rating == "0") + "NA" + else + String.format(Locale.ENGLISH, "%.1f", rating.toFloat()) +} + +fun compressImage(activity: Activity?, actualImageFile: File?): File { + /* Log.e("File Size", actualImageFile?.length().toString()) + + *//*mb approximate*//* + val resultFile: File? = when { + actualImageFile?.length() ?: 0 < (1 * 1024 * 1024) -> actualImageFile + actualImageFile?.length() ?: 0 < (3 * 1024 * 1024) -> { + Compressor(activity) + .setQuality(70) + .setCompressFormat(Bitmap.CompressFormat.JPEG) + .compressToFile(actualImageFile) + } + else -> { + Compressor(activity) + .setQuality(50) + .setCompressFormat(Bitmap.CompressFormat.JPEG) + .compressToFile(actualImageFile) + } + } + + Log.e("File Size New", resultFile?.length().toString()) +*/ + // return resultFile ?: File("") + return File("") +} + + +fun viewImageFull(activity: Activity, itemsImage: ArrayList, pos: Int) { + + val hierarchyBuilder = GenericDraweeHierarchyBuilder + .newInstance(activity.resources) + .setFailureImage(R.drawable.image_placeholder) + .setProgressBarImage(R.drawable.image_placeholder) + .setPlaceholderImage(R.drawable.image_placeholder) + + /* ImageViewer.Builder(activity, itemsImage) + .setStartPosition(pos) + .hideStatusBar(false) + .setCustomDraweeHierarchyBuilder(hierarchyBuilder) + .show()*/ +} + +fun placePicker(fragment: Fragment?, activityMain: Activity) { + val activity: Activity = if (fragment != null) + fragment.activity as Activity + else + activityMain + + val fields = + listOf(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG, Place.Field.ADDRESS) + val intent = Autocomplete.IntentBuilder( + AutocompleteActivityMode.FULLSCREEN, fields + ) + .build(activity) + + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) { + if (fragment == null) + activity.startActivityForResult(intent, AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + else + fragment.startActivityForResult(intent, AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + } +} + +fun cityPicker(fragment: Fragment?, activityMain: Activity) { + val activity: Activity = if (fragment != null) + fragment.activity as Activity + else + activityMain + + val fields = + listOf(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG, Place.Field.ADDRESS) + val intent = Autocomplete.IntentBuilder( + AutocompleteActivityMode.FULLSCREEN, fields + ) + .setTypeFilter(TypeFilter.CITIES) + .build(activity) + + + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) { + if (fragment == null) + activity.startActivityForResult(intent, AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + else + fragment.startActivityForResult(intent, AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + } +} + +fun getAddress(place: Place): String { + val finalAddress: String + val name = place.name.toString() + val placeAddress = place.address.toString() + + if (place.address?.contains(name) == true) { + finalAddress = placeAddress + } else { + finalAddress = "$name, $placeAddress" + } + return finalAddress +} +fun getCity(place: Place,context: Context): String { + var finalAddress: String = "" + + try { + + val geocoder = Geocoder(context, Locale.getDefault()) + var addresses: List
= ArrayList() + addresses = geocoder.getFromLocation(place.latLng!!.latitude, place.latLng!!.longitude, 1)!! + finalAddress = addresses[0].locality + + }catch (e: Exception){ + + } + return finalAddress +} + +fun getPathUri(context: Context, uri: Uri): String? { + val projection = + arrayOf(MediaStore.Images.Media.DATA) + val cursor = context.contentResolver.query(uri, projection, null, null, null) + ?: return "" + val column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + cursor.moveToFirst() + val result = cursor.getString(column_index) + cursor.close() + return result +} + + +fun setAcceptTerms(activity: Activity): SpannableString { + val termText= if (BuildConfig.FLAVOR=="taradoc"){ + activity.getString(R.string.terms2) + }else + activity.getString(R.string.terms) + + val term = String.format( + "%s%s %s %s", activity.getString(R.string.you_agree_to_our_terms), + termText, activity.getString(R.string.and), + activity.getString(R.string.privacy) + ) + + val string = SpannableString.valueOf(term) + /*Color*/ + string.setSpan( + ForegroundColorSpan(ContextCompat.getColor(activity, R.color.colorPrimary)), + term.indexOf(termText), + term.indexOf(" " + activity.getString(R.string.and) + " "), + 0 + ) + string.setSpan( + ForegroundColorSpan(ContextCompat.getColor(activity, R.color.colorPrimary)), + term.indexOf(activity.getString(R.string.privacy)), term.length, 0 + ) + /*Bold*/ +// string.setSpan( +// StyleSpan(Typeface.BOLD), term.indexOf(termText), +// term.indexOf(" " + activity.getString(R.string.and) + " "), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE +// ) +// string.setSpan( +// StyleSpan(Typeface.BOLD), term.indexOf(activity.getString(R.string.privacy)), +// term.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE +// ) + /*Click*/ + string.setSpan( + Terms(), term.indexOf(termText), + term.indexOf(" " + activity.getString(R.string.and) + " "), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + string.setSpan( + Privacy(), term.indexOf(activity.getString(R.string.privacy)), + term.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + + return string +} + +class Privacy : ClickableSpan() { + + override fun onClick(tv: View) { + // tv.context.longToast("Clicked") + + appClientDetails.pages?.forEach { + if (it.slug == PageLink.PRIVACY_POLICY) { + openPageLink(tv.context, tv.context.getString(R.string.privacy), + it.slug, it.app_type) + } + } + } + + override fun updateDrawState(ds: TextPaint) {// override updateDrawState + ds.isUnderlineText = false // set to false to remove underline + } +} + +class Terms : ClickableSpan() { + + override fun onClick(tv: View) { + //viewPage(PageLink.TERMS) + openPageLink(tv.context, tv.context.getString(R.string.terms2),"","") + +// appClientDetails.pages?.forEach { +// if (it.slug == PageLink.TERMS_CONDITIONS) { +// if(BuildConfig.FLAVOR=="taradoc") +// openPageLink(tv.context, tv.context.getString(R.string.terms2), +// it.slug, it.app_type) +// if(BuildConfig.FLAVOR=="nurseLynx") +// openPageLink(tv.context, tv.context.getString(R.string.terms), +// it.slug, it.app_type) +// else +// openPageLink(tv.context, tv.context.getString(R.string.terms_and_conditions), +// it.slug, it.app_type) +// } +// } + } + + override fun updateDrawState(ds: TextPaint) {// override updateDrawState + ds.isUnderlineText = false // set to false to remove underline + } +} + +fun setSaleContract(activity: Activity): SpannableString { + val term = String.format("%s %s", activity.getString(R.string.please_accept), + activity.getString(R.string.sales_contract)) + + val string = SpannableString.valueOf(term) + /*Color*/ + string.setSpan(ForegroundColorSpan(ContextCompat.getColor(activity, R.color.colorPrimary)), + term.indexOf(activity.getString(R.string.sales_contract)), term.length, 0) + /*Bold*/ + string.setSpan(StyleSpan(Typeface.BOLD), term.indexOf(activity.getString(R.string.sales_contract)), + term.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + /*Click*/ + string.setSpan(SaleContract(), term.indexOf(activity.getString(R.string.sales_contract)), + term.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + + return string +} + +class SaleContract : ClickableSpan() { + + override fun onClick(tv: View) { + // tv.context.longToast("Clicked") + + appClientDetails.pages?.forEach { + if (it.slug == PageLink.SALES_CONTRACT) { + openPageLink(tv.context, tv.context.getString(R.string.sales_contract), + it.slug, it.app_type) + } + } + } + + override fun updateDrawState(ds: TextPaint) {// override updateDrawState + ds.isUnderlineText = false // set to false to remove underline + } +} + +fun openPageLink(context: Context, name: String?, link: String?, app_type: String?) { + val intentLink = Intent(context, WebViewActivity::class.java) + .putExtra(WebViewActivity.LINK_TITLE, name) + + if (app_type != null) + intentLink.putExtra(WebViewActivity.LINK_URL, "$link?app_type=$app_type") + else + intentLink.putExtra(WebViewActivity.LINK_URL, link) + + context.startActivity(intentLink) +} + +fun getHtmlText(string: String): Spanned { + return HtmlCompat.fromHtml(string, HtmlCompat.FROM_HTML_MODE_LEGACY).toSpanned() +} + + +/*Share*/ +fun shareDeepLink(deepLink: String, activity: Activity, userData: UserData?) { + val progressDialog = ProgressDialog(activity) + progressDialog.setLoading(true) + + var longLink = "" + var titleM = "" + var descriptionM = "" + var imageUrlM = Uri.parse("") + when (deepLink) { + DeepLink.USER_PROFILE -> { + longLink = "${Config.baseURL}${deepLink}?id=${userData?.id}" + + titleM = "${userData?.categoryData?.name} | ${userData?.name}" + descriptionM = userData?.profile?.bio ?: "" + imageUrlM = if (userData?.profile_image == null) + Uri.parse(getImageBaseUrl(ImageFolder.UPLOADS, appClientDetails.applogo ?: "")) + else + Uri.parse(getImageBaseUrl(ImageFolder.UPLOADS, userData.profile_image ?: "")) + } + DeepLink.INVITE -> { + longLink = "${Config.baseURL}${deepLink}" + + titleM = activity.getString(R.string.app_name) + descriptionM = activity.getString(R.string.invite_text) + imageUrlM = + Uri.parse(getImageBaseUrl(ImageFolder.UPLOADS, appClientDetails.applogo ?: "")) + } + } + + val shortLinkTask = Firebase.dynamicLinks.shortLinkAsync { + link = Uri.parse(longLink) + domainUriPrefix = "https://${activity.getString(R.string.deep_link_url)}" + // Open links with this app on Android + androidParameters(BuildConfig.APPLICATION_ID) { } + // Open links with com.example.ios on iOS + iosParameters(activity.getString(R.string.deep_link_ios_bundle)) { } + + socialMetaTagParameters { + title = titleM + description = descriptionM + imageUrl = imageUrlM + } + }.addOnSuccessListener { result -> + progressDialog.setLoading(false) + + // Short link created + val shortLink = result.shortLink + + /*Share Intent*/ + val shareIntent = Intent() + shareIntent.action = Intent.ACTION_SEND + shareIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.share)) + + val completeMsg = if (appFeatures.needInviteCode) + "${activity.getString(R.string.app_name)}\n$shortLink\n${ + activity.getString( + R.string.use_code, + userData?.reference_code + ) + }" + else + "${activity.getString(R.string.app_name)}\n$shortLink" + + shareIntent.putExtra(Intent.EXTRA_TEXT, completeMsg) + + shareIntent.type = "text/plain" + shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) + activity.startActivity( + Intent.createChooser( + shareIntent, + activity.getString(R.string.share) + ) + ) + + }.addOnFailureListener { + // Error + //ivShare.showSnackBar(getString(R.string.error)) + progressDialog.setLoading(false) + } +} + +fun mapIntent(activity: Activity, name: String, lat: Double, lng: Double) { + try { + val url = "http://maps.google.com/maps?daddr=$lat,$lng($name)" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + intent.setPackage("com.google.android.apps.maps") + + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) + activity.startActivity(intent) + } catch (e: Exception) { + activity.longToast(activity.getString(R.string.map_not_found)) + } +} + +fun slideItem(viewToAnimate: View, context: Context) { + val animation: Animation = AnimationUtils.loadAnimation(context, R.anim.up_to_down) + viewToAnimate.startAnimation(animation) +} + + +fun slideRecyclerItem(viewToAnimate: View, context: Context) { + val animation: Animation = AnimationUtils.loadAnimation(context, R.anim.slide_out_bottom) + viewToAnimate.startAnimation(animation) +} + +fun askForOption(fragment: Fragment?, activity: Activity, view: View) { + val context: Context = fragment?.requireContext() ?: activity + + val popup = PopupMenu(context, view) + popup.menuInflater.inflate(R.menu.menu_attach, popup.menu) + + popup.setOnMenuItemClickListener { item -> + when (item.itemId) { + R.id.item_image -> { + selectImages(fragment, activity) + } + R.id.item_pdf -> { + selectDocument(fragment, activity) + } + } + true + } + + popup.show() +} + + +fun selectImages(fragment: Fragment?, activity: Activity) { + /*val filePickerBuilder = FilePickerBuilder.instance + .setMaxCount(1) + .setActivityTheme(R.style.LibAppTheme) + .setActivityTitle(activity.getString(R.string.select_image)) + .enableVideoPicker(false) + .enableCameraSupport(false) + .showGifs(false) + .showFolderView(true) + .enableSelectAll(false) + .enableImagePicker(true) + .setCameraPlaceholder(R.drawable.ic_camera) + .withOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + + if (fragment != null) + filePickerBuilder.pickPhoto(fragment, AppRequestCode.IMAGE_PICKER) + else + filePickerBuilder.pickPhoto(activity, AppRequestCode.IMAGE_PICKER)*/ +} + +fun selectDocument(fragment: Fragment?, activity: Activity) { + /* val pdfs = arrayOf("pdf") + + val filePickerBuilder = FilePickerBuilder.Companion.instance + .setMaxCount(1) + .setActivityTheme(R.style.LibAppTheme) + .sortDocumentsBy(SortingTypes.NAME) + .setActivityTitle(activity.getString(R.string.select_document)) + .addFileSupport(activity.getString(R.string.pdf_title), pdfs, R.drawable.ic_pdf) + .showFolderView(true) + .enableDocSupport(false) + .withOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + + if (fragment != null) + filePickerBuilder.pickFile(fragment, AppRequestCode.DOC_PICKER) + else + filePickerBuilder.pickFile(activity, AppRequestCode.DOC_PICKER)*/ +} + +fun getWaterLiters(activity: Activity, value: Int, unitNeeded: Boolean): String { + val valueInLiters = String.format(Locale.ENGLISH, "%.3f", value / 1000.0) + + return if (unitNeeded) { + if (value < 1000) + "$value ${activity.getString(R.string.ml)}" + else + "${valueInLiters.removeSuffix(".000")} ${activity.getString(R.string.lt)}" + } else valueInLiters.removeSuffix(".000") +} + +fun getWaterUnit(activity: Activity, value: Double, unitNeeded: Boolean): String { + val valueInLiters = String.format(Locale.ENGLISH, "%.3f", value) + + return if (unitNeeded) { + if (value < 1) + "$value ${activity.getString(R.string.ml)}" + else + "${valueInLiters.removeSuffix(".000")} ${activity.getString(R.string.lt)}" + } else valueInLiters.removeSuffix(".000") +} + +fun getProteinUnit(activity: Activity, value: Int, unitNeeded: Boolean): String { + val valueUnit = String.format(Locale.ENGLISH, "%.2f", value / 1000.0) + + return if (unitNeeded) { + if (value < 1000) + "$value ${activity.getString(R.string.g)}" + else + "${valueUnit.removeSuffix(".000")} ${activity.getString(R.string.kg)}" + } else valueUnit.removeSuffix(".000") +} + +fun openPdf( + activity: Activity, + link: String, + prescription: Boolean = false, + request: Request? = null +) { + + Log.e("PDG======", link) + + if (prescription) { + val intentPrescription = Intent(activity, WebViewActivity::class.java) + .putExtra(WebViewActivity.LINK_TITLE, activity.getString(R.string.prescription_details)) + .putExtra(WebViewActivity.PDF_LINK, link) + + if (request != null && request.pre_scription?.type == PrescriptionType.MANUAL) + intentPrescription.putExtra(EXTRA_REQUEST_ID, request) + activity.startActivity(intentPrescription) + } else { + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) + + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) + activity.startActivity(browserIntent) + } +} + + +fun downloadFile(activity: Activity, url: String, imageRequestId: String? = null) { + try { + val requestId = imageRequestId ?: Uri.parse(url).getQueryParameter("request_id") + + // Create request for android download manager + val downloadManager = activity.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager + + val downloadUrl = if (imageRequestId != null) url else "$url&download" + val request = DownloadManager.Request(Uri.parse(downloadUrl)) + val fileName = "${activity.getString(R.string.app_name)}_$requestId" + request.setTitle(fileName) + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName) + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + request.setVisibleInDownloadsUi(true) + + downloadManager.enqueue(request) + activity.longToast(activity.getString(R.string.downloading)) + } catch (e: java.lang.Exception) { + } +} + +fun bitmapDescriptorFromVector(context: Context, vectorResId: Int): BitmapDescriptor? { + return ContextCompat.getDrawable(context, vectorResId)?.run { + setBounds(0, 0, intrinsicWidth, intrinsicHeight) + val bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888) + draw(Canvas(bitmap)) + BitmapDescriptorFactory.fromBitmap(bitmap) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/LocaleHelper.kt b/app/src/main/java/com/consultantapp/utils/LocaleHelper.kt new file mode 100644 index 0000000..5f0e8c5 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/LocaleHelper.kt @@ -0,0 +1,55 @@ +package com.consultantapp.utils + +import android.content.Context +import android.preference.PreferenceManager +import java.util.* + + +/** + * Created by cbl29 on 22/2/17. + */ +object LocaleHelper { + + fun onCreate(context: Context): Context { + val lang = PreferenceManager.getDefaultSharedPreferences(context).getString(USER_LANGUAGE, "")?:"" + return updateResources(context, lang) + } + + fun onCreate(context: Context, defaultLanguage: String) { + val lang = getPersistedData(context, defaultLanguage) + //setLocale(context, lang) + } + + fun getLanguage(context: Context): String { + return getPersistedData( + context, + Locale.getDefault().language + ) + } + + fun setLocale(context: Context, language: String, prefsManager: PrefsManager) { + persist(context, language, prefsManager) + updateResources(context, language) + } + + private fun getPersistedData(context: Context, defaultLanguage: String): String { + //return PrefsManager.get().getString(USER_LANGUAGE, "en") + return "" + } + + private fun persist(context: Context, language: String, prefsManager: PrefsManager) { + prefsManager.save(language, USER_LANGUAGE) + } + + private fun updateResources(context: Context, language: String): Context { + val locale = Locale(language) + Locale.setDefault(locale) + val resources = context.resources + val configuration = resources.configuration + configuration.setLocale(locale) + configuration.setLayoutDirection(locale) + resources.updateConfiguration(configuration, resources.displayMetrics) + return context.createConfigurationContext(configuration) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/NavigationExtensions.kt b/app/src/main/java/com/consultantapp/utils/NavigationExtensions.kt new file mode 100644 index 0000000..63a20d8 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/NavigationExtensions.kt @@ -0,0 +1,233 @@ +/* + * Copyright 2019, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.consultantapp.utils + +import android.content.Intent +import android.util.SparseArray +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import com.consultantapp.R +import com.consultantapp.data.repos.UserRepository +import com.consultantapp.ui.dashboard.HomeActivity +import com.consultantapp.ui.loginSignUp.welcome.WelcomeFragment +import com.google.android.material.bottomnavigation.BottomNavigationView + +/** + * Manages the various graphs needed for a [BottomNavigationView]. + * + * This sample is a workaround until the Navigation Component supports multiple back stacks. + */ +fun BottomNavigationView.setupWithNavController( + navGraphIds: List, + fragmentManager: FragmentManager, + containerId: Int, + intent: Intent, + activity: HomeActivity, + userRepository: UserRepository): LiveData { + + // Map of tags + val graphIdToTagMap = SparseArray() + // Result. Mutable live data with the selected controlled + val selectedNavController = MutableLiveData() + + var firstFragmentGraphId = 0 + + // First create a NavHostFragment for each NavGraph ID + navGraphIds.forEachIndexed { index, navGraphId -> + val fragmentTag = getFragmentTag(index) + + // Find or create the Navigation host fragment + val navHostFragment = obtainNavHostFragment( + fragmentManager, + fragmentTag, + navGraphId, + containerId + ) + + // Obtain its id + val graphId = navHostFragment.navController.graph.id + + if (index == 0) { + firstFragmentGraphId = graphId + } + + // Save to the map + graphIdToTagMap.put(graphId, fragmentTag) + + // Attach or detach nav host fragment depending on whether it's the selected item. + if (this.selectedItemId == graphId) { + // Update livedata with the selected graph + selectedNavController.value = navHostFragment.navController + attachNavHostFragment(fragmentManager, navHostFragment, index == 0) + } else { + detachNavHostFragment(fragmentManager, navHostFragment) + } + } + + // Now connect selecting an item with swapping Fragments + var selectedItemTag = graphIdToTagMap[this.selectedItemId] + val firstFragmentTag = graphIdToTagMap[firstFragmentGraphId] + var isOnFirstFragment = selectedItemTag == firstFragmentTag + + // For the navigation item that is selected... + setOnNavigationItemSelectedListener { item -> + // Don't do anything if the state is state has already been saved. + if (fragmentManager.isStateSaved) { + false + } else if (!userRepository.isUserLoggedIn()) { + if (item.itemId != R.id.home) { + val fragment = WelcomeFragment() + fragment.show(activity.supportFragmentManager, fragment.tag) + } + false + } else { + val newlySelectedItemTag = graphIdToTagMap[item.itemId] + if (selectedItemTag != newlySelectedItemTag) { + // Pop everything above the first fragment (the "fixed start destination") + fragmentManager.popBackStack( + firstFragmentTag, + FragmentManager.POP_BACK_STACK_INCLUSIVE + ) + val selectedFragment = fragmentManager.findFragmentByTag(newlySelectedItemTag) + as NavHostFragment + + // Exclude the first fragment tag because it's always in the back stack. + if (firstFragmentTag != newlySelectedItemTag) { + // Commit a transaction that cleans the back stack and adds the first fragment + // to it, creating the fixed started destination. + fragmentManager.beginTransaction() + .attach(selectedFragment) + .setPrimaryNavigationFragment(selectedFragment) + .apply { + // Detach all other Fragments + for (i in 0 until graphIdToTagMap.size()) { + if (graphIdToTagMap.get(i) != newlySelectedItemTag) { + detach(fragmentManager.findFragmentByTag(firstFragmentTag)!!) + } + } + } + .addToBackStack(firstFragmentTag) + .setCustomAnimations( + R.anim.nav_default_enter_anim, + R.anim.nav_default_exit_anim, + R.anim.nav_default_pop_enter_anim, + R.anim.nav_default_pop_exit_anim + ) + .setReorderingAllowed(true) + .commit() + } + selectedItemTag = newlySelectedItemTag + isOnFirstFragment = selectedItemTag == firstFragmentTag + selectedNavController.value = selectedFragment.navController + true + } else { + false + } + } + } + + // handle deep link + navGraphIds.forEachIndexed { index, navGraphId -> + val fragmentTag = getFragmentTag(index) + + // Find or create the Navigation host fragment + val navHostFragment = obtainNavHostFragment( + fragmentManager, + fragmentTag, + navGraphId, + containerId + ) + // Handle Intent + if (navHostFragment.navController.handleDeepLink(intent)) { + this.selectedItemId = navHostFragment.navController.graph.id + } + } + + // Finally, ensure that we update our BottomNavigationView when the back stack changes + fragmentManager.addOnBackStackChangedListener { + if (!isOnFirstFragment && !fragmentManager.isOnBackStack(firstFragmentTag)) { + this.selectedItemId = firstFragmentGraphId + } + + // Reset the graph if the currentDestination is not valid (happens when the back + // stack is popped after using the back button). + selectedNavController.value?.let { controller -> + if (controller.currentDestination == null) { + controller.navigate(controller.graph.id) + } + } + } + return selectedNavController +} + +private fun detachNavHostFragment( + fragmentManager: FragmentManager, + navHostFragment: NavHostFragment +) { + fragmentManager.beginTransaction() + .detach(navHostFragment) + .commitNow() +} + +private fun attachNavHostFragment( + fragmentManager: FragmentManager, + navHostFragment: NavHostFragment, + isPrimaryNavFragment: Boolean +) { + fragmentManager.beginTransaction() + .attach(navHostFragment) + .apply { + if (isPrimaryNavFragment) { + setPrimaryNavigationFragment(navHostFragment) + } + } + .commitNow() + +} + +private fun obtainNavHostFragment( + fragmentManager: FragmentManager, + fragmentTag: String, + navGraphId: Int, + containerId: Int +): NavHostFragment { + // If the Nav Host fragment exists, return it + val existingFragment = fragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment? + existingFragment?.let { return it } + + // Otherwise, create it and return it. + val navHostFragment = NavHostFragment.create(navGraphId) + fragmentManager.beginTransaction() + .add(containerId, navHostFragment, fragmentTag) + .commitNow() + return navHostFragment +} + +private fun FragmentManager.isOnBackStack(backStackName: String): Boolean { + val backStackCount = backStackEntryCount + for (index in 0 until backStackCount) { + if (getBackStackEntryAt(index).name == backStackName) { + return true + } + } + return false +} + +private fun getFragmentTag(index: Int) = "bottomNavigation#$index" diff --git a/app/src/main/java/com/consultantapp/utils/PermissionUtils.kt b/app/src/main/java/com/consultantapp/utils/PermissionUtils.kt new file mode 100644 index 0000000..9cc9189 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/PermissionUtils.kt @@ -0,0 +1,64 @@ +package com.consultantapp.utils + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.content.Context.NOTIFICATION_SERVICE +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.annotation.StringRes +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import com.consultantapp.BuildConfig +import com.consultantapp.R +import permissions.dispatcher.PermissionRequest +import kotlin.reflect.cast + +object PermissionUtils { + + fun Context.hasPermission(perm:String):Boolean= + ContextCompat.checkSelfPermission(this,perm)== PackageManager.PERMISSION_GRANTED + + fun Context.ensureNotificationChannelExists() { + val name = "Call" + val descriptionText = "Calling Notification" + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return + val importance = NotificationManager.IMPORTANCE_DEFAULT + val mChannel = NotificationChannel( + getString(R.string.default_notification_channel_id), + name, + importance + ) + mChannel.description = descriptionText + NotificationManager::class.cast(getSystemService(NOTIFICATION_SERVICE)) + .createNotificationChannel(mChannel) + + } + fun showRationalDialog(context: Context, @StringRes messageResId: Int, request: PermissionRequest) { + AlertDialog.Builder(context) + .setPositiveButton(context.getString(R.string.allow), { _, _ -> request.proceed() }) + .setNegativeButton(context.getString(R.string.deny), { _, _ -> request.cancel() }) + .setCancelable(false) + .setMessage(messageResId) + .show() + } + + fun showAppSettingsDialog(context: Context, @StringRes messageResId: Int) { + AlertDialog.Builder(context) + .setPositiveButton(context.getString(R.string.settings)) { _, _ -> + val intent = Intent() + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.data = Uri.fromParts("package", context.packageName, null) + + if (context.packageName.equals(BuildConfig.APPLICATION_ID)) + context.startActivity(intent) + } + .setNegativeButton(android.R.string.cancel) { dialog, which -> dialog?.dismiss() } + .setCancelable(false) + .setMessage(messageResId) + .show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/PrefsManager.kt b/app/src/main/java/com/consultantapp/utils/PrefsManager.kt new file mode 100644 index 0000000..acba9ba --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/PrefsManager.kt @@ -0,0 +1,139 @@ +package com.consultantapp.utils + +import android.content.SharedPreferences +import androidx.annotation.StringDef +import com.google.gson.Gson +import java.util.concurrent.atomic.AtomicBoolean +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class PrefsManager @Inject constructor(private val preferences: SharedPreferences, private val gson: Gson) { + private val sharedPrefName = "ArabLife" + companion object { + const val PREF_PROFILE = "PREF_PROFILE" + const val PREF_API_TOKEN = "PREF_API_TOKEN" + const val NOTIFICATION_SOUND = "notification_sound_enabled" + const val KEY_CHANGE_FLAG = "is_notification_channel_needed" + @StringDef(PREF_PROFILE, PREF_API_TOKEN) + @Retention(AnnotationRetention.SOURCE) + annotation class PrefKey + private lateinit var instance: PrefsManager + private val isInitialized = + AtomicBoolean() // To check if instance was previously initialized or not + fun get(): PrefsManager = instance } + + fun save(@PrefKey key: String, value: String) { + preferences.edit().putString(key, value).apply() + } + + fun save(@PrefKey key: String, value: Int) { + preferences.edit().putInt(key, value).apply() + } + + fun save(@PrefKey key: String, value: Boolean) { + preferences.edit().putBoolean(key, value).apply() + } + + fun save(@PrefKey key: String, `object`: Any?) { + if (`object` == null) { + throw IllegalArgumentException("object is null") + } + + // Convert the provided object to JSON string + save(key, gson.toJson(`object`)) + } + + fun getString(@PrefKey key: String, defValue: String): String = + preferences.getString(key, defValue) ?:"" + + fun getInt(@PrefKey key: String, defValue: Int): Int = preferences.getInt(key, defValue) + + fun getFloat(@PrefKey key: String, defValue: Float): Float = preferences.getFloat(key, defValue) + + fun getBoolean(@PrefKey key: String, defValue: Boolean): Boolean = + preferences.getBoolean(key, defValue) + + fun getObject(@PrefKey key: String, objectClass: Class): T? { + val jsonString = preferences.getString(key, null) + return if (jsonString == null) { + null + } else { + try { + gson.fromJson(jsonString, objectClass) + } catch (e: Exception) { + throw IllegalArgumentException("Object stored with key $key is instance of other class") + } + } + } + + fun removeAll() { + preferences.edit().clear().apply() + } + + fun remove(key: String) { + preferences.edit().remove(key).apply() + } + + /** + * Store boolean in preference. + * + * @param key the key + * @param value the value + */ + fun storeBooleanInPreference(key: String, value: Boolean) { + save(key, value) + } + + /** + * Gets the boolean from preference. + * + * @param key the key + * @return boolean Value from preference + */ + fun getBooleanFromPreference(key: String): Boolean { + return getBoolean(key, false) + } + + /** + * Gets the int from preference. + * + * @param key the key + * @return String Value from preference + */ + fun getIntFromPreference(key: String): Int { + return getInt(key, 0) + } + + + /** + * Clear all preference. + */ + fun clearAllPreference() { + clearAllPreference() + } + + /** + * Store string in preference. + * + * @param key the key + * @param value the value + */ + fun storeStringInPreference(key: String, value: String?) { + save(key, value) + } + + /** + * Store int in preference. + * + * @param key the key + * @param value the value + */ + fun storeIntInPreference(key: String, value: Int) { + save(key, value) + } + + fun getBooleanFromPreferenceDefaultTrueValue(key: String): Boolean { + return getBoolean(key, true) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioBuffer.kt b/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioBuffer.kt new file mode 100644 index 0000000..9de9556 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioBuffer.kt @@ -0,0 +1,43 @@ +package com.consultantapp.utils.audioRecoder + +/** + * A buffer that grabs the smallest supported sample rate for [android.media.AudioTrack] and + * [android.media.AudioRecord]. + */ +abstract class AudioBuffer protected constructor() { + @JvmField + val size: Int + @JvmField + val sampleRate: Int + @JvmField + val data: ByteArray + protected abstract fun validSize(size: Int): Boolean + protected abstract fun getMinBufferSize(sampleRate: Int): Int + + companion object { + private val POSSIBLE_SAMPLE_RATES = intArrayOf(8000, 11025, 16000, 22050, 44100, 48000) + } + + init { + var size = -1 + var sampleRate = -1 + + // Iterate over all possible sample rates, and try to find the shortest one. The shorter + // it is, the faster it'll stream. + for (rate in POSSIBLE_SAMPLE_RATES) { + sampleRate = rate + size = getMinBufferSize(sampleRate) + if (validSize(size)) { + break + } + } + + // If none of them were good, then just pick 1kb + if (!validSize(size)) { + size = 1024 + } + this.size = size + this.sampleRate = sampleRate + data = ByteArray(size) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioPlayer.kt b/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioPlayer.kt new file mode 100644 index 0000000..e73cd96 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioPlayer.kt @@ -0,0 +1,105 @@ +package com.consultantapp.utils.audioRecoder + +import android.media.AudioFormat +import android.media.AudioManager +import android.media.AudioTrack +import android.os.Process +import android.util.Log +import com.consultantapp.utils.audioRecoder.Constants.TAG +import java.io.IOException +import java.io.InputStream + +/** + * A fire-once class. When created, you must pass a [InputStream]. Once [.start] is + * called, the input stream will be read from until either [.stop] is called or the stream + * ends. + */ +class AudioPlayer +/** + * A simple audio player. + * + * @param inputStream The input stream of the recording. + */( + /** The audio stream we're reading from. */ + private val mInputStream: InputStream +) { + /** @return True if currently playing. + */ + /** + * If true, the background thread will continue to loop and play audio. Once false, the thread + * will shut down. + */ + @Volatile + var isPlaying = false + private set + + /** The background thread recording audio for us. */ + private var mThread: Thread? = null + + /** Starts playing the stream. */ + fun start() { + isPlaying = true + mThread = object : Thread() { + override fun run() { + Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO) + val buffer = Buffer() + val audioTrack = AudioTrack( + AudioManager.STREAM_MUSIC, + buffer.sampleRate, + AudioFormat.CHANNEL_OUT_MONO, + AudioFormat.ENCODING_PCM_16BIT, + buffer.size, + AudioTrack.MODE_STREAM + ) + audioTrack.play() + var len=0 + try { + while (isPlaying && mInputStream.read(buffer.data).also { len = it } > 0) { + audioTrack.write(buffer.data, 0, len) + } + } catch (e: IOException) { + Log.e(TAG, "Exception with playing stream", e) + } finally { + stopInternal() + audioTrack.release() + onFinish() + } + } + } + mThread?.start() + } + + private fun stopInternal() { + isPlaying = false + try { + mInputStream.close() + } catch (e: IOException) { + Log.e(TAG, "Failed to close input stream", e) + } + } + + /** Stops playing the stream. */ + fun stop() { + stopInternal() + try { + mThread!!.join() + } catch (e: InterruptedException) { + Log.e(TAG, "Interrupted while joining AudioRecorder thread", e) + Thread.currentThread().interrupt() + } + } + + /** The stream has now ended. */ + protected fun onFinish() {} + private class Buffer : AudioBuffer() { + override fun validSize(size: Int): Boolean { + return size != AudioTrack.ERROR && size != AudioTrack.ERROR_BAD_VALUE + } + + override fun getMinBufferSize(sampleRate: Int): Int { + return AudioTrack.getMinBufferSize( + sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioRecorder.kt b/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioRecorder.kt new file mode 100644 index 0000000..8ee813f --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/audioRecoder/AudioRecorder.kt @@ -0,0 +1,126 @@ +package com.consultantapp.utils.audioRecoder + +import android.media.AudioFormat +import android.media.AudioRecord +import android.media.MediaRecorder +import android.os.ParcelFileDescriptor +import android.os.Process +import android.util.Log +import com.consultantapp.utils.audioRecoder.Constants.TAG +import java.io.IOException +import java.io.OutputStream + +/** + * When created, you must pass a [ParcelFileDescriptor]. Once [.start] is called, the + * file descriptor will be written to until [.stop] is called. + */ +class AudioRecorder(file: ParcelFileDescriptor?) { + /** The stream to write to. */ + private val mOutputStream: OutputStream + /** @return True if actively recording. False otherwise. + */ + /** + * If true, the background thread will continue to loop and record audio. Once false, the thread + * will shut down. + */ + @Volatile + var isRecording = false + private set + + /** The background thread recording audio for us. */ + private var mThread: Thread? = null + + /** Starts recording audio. */ + fun start() { + if (isRecording) { + Log.w(TAG, "Already running") + return + } + isRecording = true + mThread = object : Thread() { + override fun run() { + Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO) + val buffer = Buffer() + val record = AudioRecord( + MediaRecorder.AudioSource.DEFAULT, + buffer.sampleRate, + AudioFormat.CHANNEL_IN_MONO, + AudioFormat.ENCODING_PCM_16BIT, + buffer.size + ) + if (record.state != AudioRecord.STATE_INITIALIZED) { + Log.w(TAG, "Failed to start recording") + isRecording = false + return + } + record.startRecording() + + // While we're running, we'll read the bytes from the AudioRecord and write them + // to our output stream. + try { + while (isRecording) { + val len = record.read(buffer.data, 0, buffer.size) + if (len >= 0 && len <= buffer.size) { + mOutputStream.write(buffer.data, 0, len) + mOutputStream.flush() + } else { + Log.w(TAG, "Unexpected length returned: $len") + } + } + } catch (e: IOException) { + Log.e(TAG, "Exception with recording stream", e) + } finally { + stopInternal() + try { + record.stop() + } catch (e: IllegalStateException) { + Log.e(TAG, "Failed to stop AudioRecord", e) + } + record.release() + } + } + } + mThread?.start() + } + + private fun stopInternal() { + isRecording = false + try { + mOutputStream.close() + } catch (e: IOException) { + Log.e(TAG, "Failed to close output stream", e) + } + } + + /** Stops recording audio. */ + fun stop() { + stopInternal() + try { + mThread!!.join() + } catch (e: InterruptedException) { + Log.e(TAG, "Interrupted while joining AudioRecorder thread", e) + Thread.currentThread().interrupt() + } + } + + private class Buffer : AudioBuffer() { + override fun validSize(size: Int): Boolean { + return size != AudioRecord.ERROR && size != AudioRecord.ERROR_BAD_VALUE + } + + override fun getMinBufferSize(sampleRate: Int): Int { + return AudioRecord.getMinBufferSize( + sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT + ) + } + } + + /** + * A simple audio recorder. + * + * @param file The output stream of the recording. + */ + init { + mOutputStream = ParcelFileDescriptor.AutoCloseOutputStream(file) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/audioRecoder/Constants.kt b/app/src/main/java/com/consultantapp/utils/audioRecoder/Constants.kt new file mode 100644 index 0000000..b9856a7 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/audioRecoder/Constants.kt @@ -0,0 +1,6 @@ +package com.consultantapp.utils.audioRecoder + +/** A set of constants used within the app. */ +object Constants { + const val TAG = "AudioRecorderView" +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/dialogs/ProgressDialog.kt b/app/src/main/java/com/consultantapp/utils/dialogs/ProgressDialog.kt new file mode 100644 index 0000000..2976843 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/dialogs/ProgressDialog.kt @@ -0,0 +1,37 @@ +package com.consultantapp.utils.dialogs + +import android.app.Activity +import android.app.Dialog +import android.view.View +import android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND +import com.consultantapp.R + +class ProgressDialog() { + + private lateinit var dialog: Dialog + + constructor(context: Activity) : this() { + val dialogView = View.inflate(context, R.layout.dialog_progress, null) + dialog = Dialog(context, R.style.CustomDialog) + dialog.window?.clearFlags(FLAG_DIM_BEHIND) + dialog.setContentView(dialogView) + dialog.setCancelable(false) + } + + private fun show() { + if (!dialog.isShowing) + dialog.show() + } + + private fun dismiss() { + if (dialog.isShowing) + dialog.dismiss() + } + + fun setLoading(isLoading: Boolean) { + if (isLoading) + show() + else + dismiss() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantapp/utils/dialogs/ProgressDialogImage.kt b/app/src/main/java/com/consultantapp/utils/dialogs/ProgressDialogImage.kt new file mode 100644 index 0000000..63ea666 --- /dev/null +++ b/app/src/main/java/com/consultantapp/utils/dialogs/ProgressDialogImage.kt @@ -0,0 +1,38 @@ +package com.consultantapp.utils.dialogs + +import android.app.Activity +import android.app.Dialog +import android.view.View +import android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND +import com.consultantapp.R + +class ProgressDialogImage() { + + private lateinit var dialog: Dialog + + constructor(context: Activity) : this() { + val dialogView = View.inflate(context, R.layout.dialog_progress_image, null) + dialog = Dialog(context, R.style.CustomDialog) + dialog.window?.clearFlags(FLAG_DIM_BEHIND) + + dialog.setContentView(dialogView) + dialog.setCancelable(false) + } + + private fun show() { + if (!dialog.isShowing) + dialog.show() + } + + private fun dismiss() { + if (dialog.isShowing) + dialog.dismiss() + } + + fun setLoading(isLoading: Boolean) { + if (isLoading) + show() + else + dismiss() + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_bottom.xml b/app/src/main/res/anim/slide_out_bottom.xml new file mode 100644 index 0000000..0b81b64 --- /dev/null +++ b/app/src/main/res/anim/slide_out_bottom.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/up_to_down.xml b/app/src/main/res/anim/up_to_down.xml new file mode 100644 index 0000000..789aa21 --- /dev/null +++ b/app/src/main/res/anim/up_to_down.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_date_text_color.xml b/app/src/main/res/color/selector_date_text_color.xml new file mode 100644 index 0000000..dc9f007 --- /dev/null +++ b/app/src/main/res/color/selector_date_text_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_language_text_color.xml b/app/src/main/res/color/selector_language_text_color.xml new file mode 100644 index 0000000..889bb07 --- /dev/null +++ b/app/src/main/res/color/selector_language_text_color.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_primary_white.xml b/app/src/main/res/color/selector_primary_white.xml new file mode 100644 index 0000000..d22b502 --- /dev/null +++ b/app/src/main/res/color/selector_primary_white.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_date_color.xml b/app/src/main/res/color/selector_text_date_color.xml new file mode 100644 index 0000000..c98782b --- /dev/null +++ b/app/src/main/res/color/selector_text_date_color.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_nav.xml b/app/src/main/res/color/selector_text_nav.xml new file mode 100644 index 0000000..a584b93 --- /dev/null +++ b/app/src/main/res/color/selector_text_nav.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_service.xml b/app/src/main/res/color/selector_text_service.xml new file mode 100644 index 0000000..869a1b5 --- /dev/null +++ b/app/src/main/res/color/selector_text_service.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_white_black.xml b/app/src/main/res/color/selector_text_white_black.xml new file mode 100644 index 0000000..c49f523 --- /dev/null +++ b/app/src/main/res/color/selector_text_white_black.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_white_theme.xml b/app/src/main/res/color/selector_text_white_theme.xml new file mode 100644 index 0000000..889bb07 --- /dev/null +++ b/app/src/main/res/color/selector_text_white_theme.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/checked.png b/app/src/main/res/drawable-hdpi/checked.png new file mode 100644 index 0000000..5fc98fe Binary files /dev/null and b/app/src/main/res/drawable-hdpi/checked.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_account.png b/app/src/main/res/drawable-hdpi/ic_account.png new file mode 100644 index 0000000..4b3b20d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_account_active.png b/app/src/main/res/drawable-hdpi/ic_account_active.png new file mode 100644 index 0000000..fb011c2 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_afternoon.png b/app/src/main/res/drawable-hdpi/ic_afternoon.png new file mode 100644 index 0000000..96d89f4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_afternoon.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_appointment.png b/app/src/main/res/drawable-hdpi/ic_appointment.png new file mode 100644 index 0000000..434a717 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_appointment.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_appointment_active.png b/app/src/main/res/drawable-hdpi/ic_appointment_active.png new file mode 100644 index 0000000..26ecba5 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_appointment_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_banner_empty_state.png b/app/src/main/res/drawable-hdpi/ic_banner_empty_state.png new file mode 100644 index 0000000..e0789ea Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_banner_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_call.png b/app/src/main/res/drawable-hdpi/ic_call.png new file mode 100644 index 0000000..7612e1b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_call.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-hdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..8177487 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_capture_camera.png b/app/src/main/res/drawable-hdpi/ic_capture_camera.png new file mode 100644 index 0000000..cbfef5a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_capture_camera.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_chat.png b/app/src/main/res/drawable-hdpi/ic_chat.png new file mode 100644 index 0000000..9f2f32a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_chat.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_chat_active.png b/app/src/main/res/drawable-hdpi/ic_chat_active.png new file mode 100644 index 0000000..6ee7d46 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_chat_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_chat_empty.png b/app/src/main/res/drawable-hdpi/ic_chat_empty.png new file mode 100644 index 0000000..c8a8e2f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_doctor.png b/app/src/main/res/drawable-hdpi/ic_doctor.png new file mode 100644 index 0000000..d9646f7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_evening.png b/app/src/main/res/drawable-hdpi/ic_evening.png new file mode 100644 index 0000000..f8aa1f7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_evening.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_facebbok.png b/app/src/main/res/drawable-hdpi/ic_facebbok.png new file mode 100644 index 0000000..adf8fc1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_filter.png b/app/src/main/res/drawable-hdpi/ic_filter.png new file mode 100644 index 0000000..ef7c363 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_filter.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_google.png b/app/src/main/res/drawable-hdpi/ic_google.png new file mode 100644 index 0000000..37eaa95 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_home.png b/app/src/main/res/drawable-hdpi/ic_home.png new file mode 100644 index 0000000..a2aac70 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_home_active.png b/app/src/main/res/drawable-hdpi/ic_home_active.png new file mode 100644 index 0000000..66b5380 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_img_empty_state.png b/app/src/main/res/drawable-hdpi/ic_img_empty_state.png new file mode 100644 index 0000000..fd08620 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_like.png b/app/src/main/res/drawable-hdpi/ic_like.png new file mode 100644 index 0000000..273ad19 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_like_red.png b/app/src/main/res/drawable-hdpi/ic_like_red.png new file mode 100644 index 0000000..47c21b9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_like_white.png b/app/src/main/res/drawable-hdpi/ic_like_white.png new file mode 100644 index 0000000..cc04b95 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_more.png b/app/src/main/res/drawable-hdpi/ic_more.png new file mode 100644 index 0000000..abad534 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_morning.png b/app/src/main/res/drawable-hdpi/ic_morning.png new file mode 100644 index 0000000..4a2e4e1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_morning.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_not_selected.png b/app/src/main/res/drawable-hdpi/ic_not_selected.png new file mode 100644 index 0000000..2ba5d16 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_not_selected.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_notifications_empty.png b/app/src/main/res/drawable-hdpi/ic_notifications_empty.png new file mode 100644 index 0000000..31c003e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_patient.png b/app/src/main/res/drawable-hdpi/ic_patient.png new file mode 100644 index 0000000..f3e5b25 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_pick_call_green.png b/app/src/main/res/drawable-hdpi/ic_pick_call_green.png new file mode 100644 index 0000000..d23f716 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_pick_call_green.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-hdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..bcc82ed Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-hdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..b5c7353 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-hdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..cd68a5d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_star.png b/app/src/main/res/drawable-hdpi/ic_star.png new file mode 100644 index 0000000..ff62d75 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_wallet_empty.png b/app/src/main/res/drawable-hdpi/ic_wallet_empty.png new file mode 100644 index 0000000..86d382e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/checked.png b/app/src/main/res/drawable-mdpi/checked.png new file mode 100644 index 0000000..76657c0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/checked.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_account.png b/app/src/main/res/drawable-mdpi/ic_account.png new file mode 100644 index 0000000..480e31b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_account_active.png b/app/src/main/res/drawable-mdpi/ic_account_active.png new file mode 100644 index 0000000..55f228a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_afternoon.png b/app/src/main/res/drawable-mdpi/ic_afternoon.png new file mode 100644 index 0000000..ac91124 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_afternoon.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_appointment.png b/app/src/main/res/drawable-mdpi/ic_appointment.png new file mode 100644 index 0000000..0f6659e Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_appointment.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_appointment_active.png b/app/src/main/res/drawable-mdpi/ic_appointment_active.png new file mode 100644 index 0000000..2759fa0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_appointment_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_banner_empty_state.png b/app/src/main/res/drawable-mdpi/ic_banner_empty_state.png new file mode 100644 index 0000000..2d01fba Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_banner_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_call.png b/app/src/main/res/drawable-mdpi/ic_call.png new file mode 100644 index 0000000..27c8fb3 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_call.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-mdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..61d68bd Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_capture_camera.png b/app/src/main/res/drawable-mdpi/ic_capture_camera.png new file mode 100644 index 0000000..b9d788a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_capture_camera.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_chat.png b/app/src/main/res/drawable-mdpi/ic_chat.png new file mode 100644 index 0000000..7cbe060 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_chat.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_chat_active.png b/app/src/main/res/drawable-mdpi/ic_chat_active.png new file mode 100644 index 0000000..340a6ec Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_chat_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_chat_empty.png b/app/src/main/res/drawable-mdpi/ic_chat_empty.png new file mode 100644 index 0000000..6d81412 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_doctor.png b/app/src/main/res/drawable-mdpi/ic_doctor.png new file mode 100644 index 0000000..30659bc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_evening.png b/app/src/main/res/drawable-mdpi/ic_evening.png new file mode 100644 index 0000000..f712621 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_evening.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_facebbok.png b/app/src/main/res/drawable-mdpi/ic_facebbok.png new file mode 100644 index 0000000..d59cb54 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_filter.png b/app/src/main/res/drawable-mdpi/ic_filter.png new file mode 100644 index 0000000..783587d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_filter.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_google.png b/app/src/main/res/drawable-mdpi/ic_google.png new file mode 100644 index 0000000..18fbf89 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_home.png b/app/src/main/res/drawable-mdpi/ic_home.png new file mode 100644 index 0000000..4a5b1ea Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_home_active.png b/app/src/main/res/drawable-mdpi/ic_home_active.png new file mode 100644 index 0000000..0de6529 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_img_empty_state.png b/app/src/main/res/drawable-mdpi/ic_img_empty_state.png new file mode 100644 index 0000000..ad7ce31 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_like.png b/app/src/main/res/drawable-mdpi/ic_like.png new file mode 100644 index 0000000..bfbac8e Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_like_red.png b/app/src/main/res/drawable-mdpi/ic_like_red.png new file mode 100644 index 0000000..97723d3 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_like_white.png b/app/src/main/res/drawable-mdpi/ic_like_white.png new file mode 100644 index 0000000..3d4e455 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_more.png b/app/src/main/res/drawable-mdpi/ic_more.png new file mode 100644 index 0000000..effb085 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_morning.png b/app/src/main/res/drawable-mdpi/ic_morning.png new file mode 100644 index 0000000..ee893b1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_morning.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_not_selected.png b/app/src/main/res/drawable-mdpi/ic_not_selected.png new file mode 100644 index 0000000..9f568dc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_not_selected.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_notifications_empty.png b/app/src/main/res/drawable-mdpi/ic_notifications_empty.png new file mode 100644 index 0000000..12f20e0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_patient.png b/app/src/main/res/drawable-mdpi/ic_patient.png new file mode 100644 index 0000000..0d00bfc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_pick_call_green.png b/app/src/main/res/drawable-mdpi/ic_pick_call_green.png new file mode 100644 index 0000000..893bf02 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_pick_call_green.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-mdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..f6768d7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-mdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..9d9ebf0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-mdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..95ca5c2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_star.png b/app/src/main/res/drawable-mdpi/ic_star.png new file mode 100644 index 0000000..b758b1f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_wallet_empty.png b/app/src/main/res/drawable-mdpi/ic_wallet_empty.png new file mode 100644 index 0000000..633e2b8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable-xhdpi/checked.png b/app/src/main/res/drawable-xhdpi/checked.png new file mode 100644 index 0000000..4025be3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/checked.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_account.png b/app/src/main/res/drawable-xhdpi/ic_account.png new file mode 100644 index 0000000..e284cb2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_account_active.png b/app/src/main/res/drawable-xhdpi/ic_account_active.png new file mode 100644 index 0000000..95009c2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_afternoon.png b/app/src/main/res/drawable-xhdpi/ic_afternoon.png new file mode 100644 index 0000000..819153d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_afternoon.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_appointment.png b/app/src/main/res/drawable-xhdpi/ic_appointment.png new file mode 100644 index 0000000..2d38ecc Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_appointment.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_appointment_active.png b/app/src/main/res/drawable-xhdpi/ic_appointment_active.png new file mode 100644 index 0000000..4cd63f1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_appointment_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_banner_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_banner_empty_state.png new file mode 100644 index 0000000..c569685 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_banner_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_call.png b/app/src/main/res/drawable-xhdpi/ic_call.png new file mode 100644 index 0000000..8009e76 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_call.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-xhdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..7432195 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_capture_camera.png b/app/src/main/res/drawable-xhdpi/ic_capture_camera.png new file mode 100644 index 0000000..ad15c7a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_capture_camera.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_chat.png b/app/src/main/res/drawable-xhdpi/ic_chat.png new file mode 100644 index 0000000..d69be6f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_chat.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_chat_active.png b/app/src/main/res/drawable-xhdpi/ic_chat_active.png new file mode 100644 index 0000000..90ade78 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_chat_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_chat_empty.png b/app/src/main/res/drawable-xhdpi/ic_chat_empty.png new file mode 100644 index 0000000..699f942 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_doctor.png b/app/src/main/res/drawable-xhdpi/ic_doctor.png new file mode 100644 index 0000000..8915fe7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_evening.png b/app/src/main/res/drawable-xhdpi/ic_evening.png new file mode 100644 index 0000000..728215a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_evening.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_facebbok.png b/app/src/main/res/drawable-xhdpi/ic_facebbok.png new file mode 100644 index 0000000..dc13920 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_feedback_star.png b/app/src/main/res/drawable-xhdpi/ic_feedback_star.png new file mode 100644 index 0000000..efd459c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_feedback_star.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_fillstar_large.png b/app/src/main/res/drawable-xhdpi/ic_fillstar_large.png new file mode 100644 index 0000000..ed68b44 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_fillstar_large.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_filter.png b/app/src/main/res/drawable-xhdpi/ic_filter.png new file mode 100644 index 0000000..a4bc0ee Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_filter.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_google.png b/app/src/main/res/drawable-xhdpi/ic_google.png new file mode 100644 index 0000000..91854f0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home.png b/app/src/main/res/drawable-xhdpi/ic_home.png new file mode 100644 index 0000000..8f9063e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home_active.png b/app/src/main/res/drawable-xhdpi/ic_home_active.png new file mode 100644 index 0000000..c0d4156 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_img_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_img_empty_state.png new file mode 100644 index 0000000..e17c1b5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_like.png b/app/src/main/res/drawable-xhdpi/ic_like.png new file mode 100644 index 0000000..087e56e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_like_red.png b/app/src/main/res/drawable-xhdpi/ic_like_red.png new file mode 100644 index 0000000..87ebd62 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_like_white.png b/app/src/main/res/drawable-xhdpi/ic_like_white.png new file mode 100644 index 0000000..4a6eebb Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_more.png b/app/src/main/res/drawable-xhdpi/ic_more.png new file mode 100644 index 0000000..9e6eb1f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_morning.png b/app/src/main/res/drawable-xhdpi/ic_morning.png new file mode 100644 index 0000000..44a3d3a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_morning.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_not_selected.png b/app/src/main/res/drawable-xhdpi/ic_not_selected.png new file mode 100644 index 0000000..ee85f13 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_not_selected.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_notifications_empty.png b/app/src/main/res/drawable-xhdpi/ic_notifications_empty.png new file mode 100644 index 0000000..77ebb26 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_patient.png b/app/src/main/res/drawable-xhdpi/ic_patient.png new file mode 100644 index 0000000..f6b1e91 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_pick_call_green.png b/app/src/main/res/drawable-xhdpi/ic_pick_call_green.png new file mode 100644 index 0000000..0bcbaec Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_pick_call_green.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..fdf59d6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-xhdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..0f1b290 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..7f6c222 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_star.png b/app/src/main/res/drawable-xhdpi/ic_star.png new file mode 100644 index 0000000..0877289 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_empty.png b/app/src/main/res/drawable-xhdpi/ic_wallet_empty.png new file mode 100644 index 0000000..082143b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/checked.png b/app/src/main/res/drawable-xxhdpi/checked.png new file mode 100644 index 0000000..58b8296 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/checked.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_account.png b/app/src/main/res/drawable-xxhdpi/ic_account.png new file mode 100644 index 0000000..1257234 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_account_active.png b/app/src/main/res/drawable-xxhdpi/ic_account_active.png new file mode 100644 index 0000000..f36a98a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_afternoon.png b/app/src/main/res/drawable-xxhdpi/ic_afternoon.png new file mode 100644 index 0000000..ca56ae3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_afternoon.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_appointment.png b/app/src/main/res/drawable-xxhdpi/ic_appointment.png new file mode 100644 index 0000000..6809abe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_appointment.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_appointment_active.png b/app/src/main/res/drawable-xxhdpi/ic_appointment_active.png new file mode 100644 index 0000000..e67a159 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_appointment_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_banner_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_banner_empty_state.png new file mode 100644 index 0000000..d68fa5c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_banner_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_call.png b/app/src/main/res/drawable-xxhdpi/ic_call.png new file mode 100644 index 0000000..0f2dc9c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_call.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-xxhdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..b7e1b47 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_capture_camera.png b/app/src/main/res/drawable-xxhdpi/ic_capture_camera.png new file mode 100644 index 0000000..029f91b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_capture_camera.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_chat.png b/app/src/main/res/drawable-xxhdpi/ic_chat.png new file mode 100644 index 0000000..7403f03 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_chat.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_chat_active.png b/app/src/main/res/drawable-xxhdpi/ic_chat_active.png new file mode 100644 index 0000000..20a669c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_chat_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_chat_empty.png b/app/src/main/res/drawable-xxhdpi/ic_chat_empty.png new file mode 100644 index 0000000..3cbfcf5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_doctor.png b/app/src/main/res/drawable-xxhdpi/ic_doctor.png new file mode 100644 index 0000000..e7ef48b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_evening.png b/app/src/main/res/drawable-xxhdpi/ic_evening.png new file mode 100644 index 0000000..8307ecd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_evening.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_facebbok.png b/app/src/main/res/drawable-xxhdpi/ic_facebbok.png new file mode 100644 index 0000000..b08d8fb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_filter.png b/app/src/main/res/drawable-xxhdpi/ic_filter.png new file mode 100644 index 0000000..210464f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_filter.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_google.png b/app/src/main/res/drawable-xxhdpi/ic_google.png new file mode 100644 index 0000000..de103ec Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_home.png b/app/src/main/res/drawable-xxhdpi/ic_home.png new file mode 100644 index 0000000..72d4433 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_active.png b/app/src/main/res/drawable-xxhdpi/ic_home_active.png new file mode 100644 index 0000000..7d73713 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_img_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_img_empty_state.png new file mode 100644 index 0000000..64e02b3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_like.png b/app/src/main/res/drawable-xxhdpi/ic_like.png new file mode 100644 index 0000000..cc12b84 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_like_red.png b/app/src/main/res/drawable-xxhdpi/ic_like_red.png new file mode 100644 index 0000000..142eed8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_like_white.png b/app/src/main/res/drawable-xxhdpi/ic_like_white.png new file mode 100644 index 0000000..2ab6dbe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_more.png b/app/src/main/res/drawable-xxhdpi/ic_more.png new file mode 100644 index 0000000..92c4364 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_morning.png b/app/src/main/res/drawable-xxhdpi/ic_morning.png new file mode 100644 index 0000000..fa66fb9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_morning.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_not_selected.png b/app/src/main/res/drawable-xxhdpi/ic_not_selected.png new file mode 100644 index 0000000..a11e374 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_not_selected.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications_empty.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_empty.png new file mode 100644 index 0000000..c771408 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_patient.png b/app/src/main/res/drawable-xxhdpi/ic_patient.png new file mode 100644 index 0000000..c427760 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_pick_call_green.png b/app/src/main/res/drawable-xxhdpi/ic_pick_call_green.png new file mode 100644 index 0000000..a6590e9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pick_call_green.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..d49590e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-xxhdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..de5d8fd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..a056a6a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_star.png b/app/src/main/res/drawable-xxhdpi/ic_star.png new file mode 100644 index 0000000..98d673a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_empty.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_empty.png new file mode 100644 index 0000000..20c0bd1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/checked.png b/app/src/main/res/drawable-xxxhdpi/checked.png new file mode 100644 index 0000000..98ee4b2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/checked.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_account.png b/app/src/main/res/drawable-xxxhdpi/ic_account.png new file mode 100644 index 0000000..ebefe76 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_account_active.png b/app/src/main/res/drawable-xxxhdpi/ic_account_active.png new file mode 100644 index 0000000..e4c7c7d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_afternoon.png b/app/src/main/res/drawable-xxxhdpi/ic_afternoon.png new file mode 100644 index 0000000..1ddf642 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_afternoon.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_appointment.png b/app/src/main/res/drawable-xxxhdpi/ic_appointment.png new file mode 100644 index 0000000..ad791fc Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_appointment.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_appointment_active.png b/app/src/main/res/drawable-xxxhdpi/ic_appointment_active.png new file mode 100644 index 0000000..de1bc87 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_appointment_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_banner_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_banner_empty_state.png new file mode 100644 index 0000000..23ad88f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_banner_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_call.png b/app/src/main/res/drawable-xxxhdpi/ic_call.png new file mode 100644 index 0000000..2d61ace Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_call.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-xxxhdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..1bbc0ab Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_capture_camera.png b/app/src/main/res/drawable-xxxhdpi/ic_capture_camera.png new file mode 100644 index 0000000..c7f85d2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_capture_camera.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_chat.png b/app/src/main/res/drawable-xxxhdpi/ic_chat.png new file mode 100644 index 0000000..dad3b3b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_chat.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_chat_active.png b/app/src/main/res/drawable-xxxhdpi/ic_chat_active.png new file mode 100644 index 0000000..f1c72ce Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_chat_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_chat_empty.png b/app/src/main/res/drawable-xxxhdpi/ic_chat_empty.png new file mode 100644 index 0000000..22f0769 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_doctor.png b/app/src/main/res/drawable-xxxhdpi/ic_doctor.png new file mode 100644 index 0000000..cd27d9d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_evening.png b/app/src/main/res/drawable-xxxhdpi/ic_evening.png new file mode 100644 index 0000000..7ba17ed Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_evening.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_facebbok.png b/app/src/main/res/drawable-xxxhdpi/ic_facebbok.png new file mode 100644 index 0000000..7013eaf Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_filter.png b/app/src/main/res/drawable-xxxhdpi/ic_filter.png new file mode 100644 index 0000000..336fe0d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_filter.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_google.png b/app/src/main/res/drawable-xxxhdpi/ic_google.png new file mode 100644 index 0000000..1892a7a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home.png b/app/src/main/res/drawable-xxxhdpi/ic_home.png new file mode 100644 index 0000000..46d22d8 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home_active.png b/app/src/main/res/drawable-xxxhdpi/ic_home_active.png new file mode 100644 index 0000000..138ba08 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_img_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_img_empty_state.png new file mode 100644 index 0000000..71f0aa6 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like.png b/app/src/main/res/drawable-xxxhdpi/ic_like.png new file mode 100644 index 0000000..ca33980 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like_red.png b/app/src/main/res/drawable-xxxhdpi/ic_like_red.png new file mode 100644 index 0000000..d94dcb5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like_white.png b/app/src/main/res/drawable-xxxhdpi/ic_like_white.png new file mode 100644 index 0000000..20cbab6 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_more.png b/app/src/main/res/drawable-xxxhdpi/ic_more.png new file mode 100644 index 0000000..012dae5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_morning.png b/app/src/main/res/drawable-xxxhdpi/ic_morning.png new file mode 100644 index 0000000..e06707a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_morning.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_not_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_not_selected.png new file mode 100644 index 0000000..710895f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_not_selected.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications_empty.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_empty.png new file mode 100644 index 0000000..9497b2b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_patient.png b/app/src/main/res/drawable-xxxhdpi/ic_patient.png new file mode 100644 index 0000000..80a05d7 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pick_call_green.png b/app/src/main/res/drawable-xxxhdpi/ic_pick_call_green.png new file mode 100644 index 0000000..a7155c7 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_pick_call_green.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..f3cadf8 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-xxxhdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..29f17ea Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..ee9e2b2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_star.png b/app/src/main/res/drawable-xxxhdpi/ic_star.png new file mode 100644 index 0000000..d51335c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_empty.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_empty.png new file mode 100644 index 0000000..7509904 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable/drawable_alternate_button.xml b/app/src/main/res/drawable/drawable_alternate_button.xml new file mode 100644 index 0000000..1195b61 --- /dev/null +++ b/app/src/main/res/drawable/drawable_alternate_button.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_bg_button.xml b/app/src/main/res/drawable/drawable_bg_button.xml new file mode 100644 index 0000000..62eb068 --- /dev/null +++ b/app/src/main/res/drawable/drawable_bg_button.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_bg_rate.xml b/app/src/main/res/drawable/drawable_bg_rate.xml new file mode 100644 index 0000000..c49756e --- /dev/null +++ b/app/src/main/res/drawable/drawable_bg_rate.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_call_image.xml b/app/src/main/res/drawable/drawable_call_image.xml new file mode 100644 index 0000000..05d99ee --- /dev/null +++ b/app/src/main/res/drawable/drawable_call_image.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_chat_left.xml b/app/src/main/res/drawable/drawable_chat_left.xml new file mode 100644 index 0000000..0674eb8 --- /dev/null +++ b/app/src/main/res/drawable/drawable_chat_left.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_chat_right.xml b/app/src/main/res/drawable/drawable_chat_right.xml new file mode 100644 index 0000000..ad09149 --- /dev/null +++ b/app/src/main/res/drawable/drawable_chat_right.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_chat_text.xml b/app/src/main/res/drawable/drawable_chat_text.xml new file mode 100644 index 0000000..890b883 --- /dev/null +++ b/app/src/main/res/drawable/drawable_chat_text.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_coupon.xml b/app/src/main/res/drawable/drawable_coupon.xml new file mode 100644 index 0000000..6f32087 --- /dev/null +++ b/app/src/main/res/drawable/drawable_coupon.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_grey_stroke.xml b/app/src/main/res/drawable/drawable_grey_stroke.xml new file mode 100644 index 0000000..9e4f95a --- /dev/null +++ b/app/src/main/res/drawable/drawable_grey_stroke.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_language_selected.xml b/app/src/main/res/drawable/drawable_language_selected.xml new file mode 100644 index 0000000..f6c6707 --- /dev/null +++ b/app/src/main/res/drawable/drawable_language_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_language_unselected.xml b/app/src/main/res/drawable/drawable_language_unselected.xml new file mode 100644 index 0000000..70027d8 --- /dev/null +++ b/app/src/main/res/drawable/drawable_language_unselected.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_like_gredint.xml b/app/src/main/res/drawable/drawable_like_gredint.xml new file mode 100644 index 0000000..603c343 --- /dev/null +++ b/app/src/main/res/drawable/drawable_like_gredint.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_notification.xml b/app/src/main/res/drawable/drawable_notification.xml new file mode 100644 index 0000000..4cba675 --- /dev/null +++ b/app/src/main/res/drawable/drawable_notification.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_notification_red.xml b/app/src/main/res/drawable/drawable_notification_red.xml new file mode 100644 index 0000000..7410e00 --- /dev/null +++ b/app/src/main/res/drawable/drawable_notification_red.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_rounded_top.xml b/app/src/main/res/drawable/drawable_rounded_top.xml new file mode 100644 index 0000000..839fd96 --- /dev/null +++ b/app/src/main/res/drawable/drawable_rounded_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_service_inactive.xml b/app/src/main/res/drawable/drawable_service_inactive.xml new file mode 100644 index 0000000..dca96e3 --- /dev/null +++ b/app/src/main/res/drawable/drawable_service_inactive.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_stroke_inactive.xml b/app/src/main/res/drawable/drawable_stroke_inactive.xml new file mode 100644 index 0000000..9031c3d --- /dev/null +++ b/app/src/main/res/drawable/drawable_stroke_inactive.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_stroke_red_8.xml b/app/src/main/res/drawable/drawable_stroke_red_8.xml new file mode 100644 index 0000000..5250a63 --- /dev/null +++ b/app/src/main/res/drawable/drawable_stroke_red_8.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme.xml b/app/src/main/res/drawable/drawable_theme.xml new file mode 100644 index 0000000..797ad75 --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_60.xml b/app/src/main/res/drawable/drawable_theme_60.xml new file mode 100644 index 0000000..a93b599 --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_60.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_8.xml b/app/src/main/res/drawable/drawable_theme_8.xml new file mode 100644 index 0000000..0863b9b --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_8.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_rounded_4.xml b/app/src/main/res/drawable/drawable_theme_rounded_4.xml new file mode 100644 index 0000000..ce5032c --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_rounded_4.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_stroke.xml b/app/src/main/res/drawable/drawable_theme_stroke.xml new file mode 100644 index 0000000..9251c3a --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_stroke.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_stroke_4.xml b/app/src/main/res/drawable/drawable_theme_stroke_4.xml new file mode 100644 index 0000000..d73034c --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_stroke_4.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_stroke_60.xml b/app/src/main/res/drawable/drawable_theme_stroke_60.xml new file mode 100644 index 0000000..dd383bd --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_stroke_60.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_trans.xml b/app/src/main/res/drawable/drawable_theme_trans.xml new file mode 100644 index 0000000..22438df --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_trans.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_user_active.xml b/app/src/main/res/drawable/drawable_user_active.xml new file mode 100644 index 0000000..0c799b3 --- /dev/null +++ b/app/src/main/res/drawable/drawable_user_active.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_walkthrough_selected.xml b/app/src/main/res/drawable/drawable_walkthrough_selected.xml new file mode 100644 index 0000000..a9475e1 --- /dev/null +++ b/app/src/main/res/drawable/drawable_walkthrough_selected.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_walkthrough_unselected.xml b/app/src/main/res/drawable/drawable_walkthrough_unselected.xml new file mode 100644 index 0000000..96a7dd0 --- /dev/null +++ b/app/src/main/res/drawable/drawable_walkthrough_unselected.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_4.xml b/app/src/main/res/drawable/drawable_white_4.xml new file mode 100644 index 0000000..a0c1e14 --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_4.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_8.xml b/app/src/main/res/drawable/drawable_white_8.xml new file mode 100644 index 0000000..fa12e8e --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_8.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_rounded.xml b/app/src/main/res/drawable/drawable_white_rounded.xml new file mode 100644 index 0000000..a9c2fd5 --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_rounded.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_rounded_48.xml b/app/src/main/res/drawable/drawable_white_rounded_48.xml new file mode 100644 index 0000000..a9c2fd5 --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_rounded_48.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_1.xml b/app/src/main/res/drawable/ic_1.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_1.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_2.xml b/app/src/main/res/drawable/ic_2.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_2.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_3.xml b/app/src/main/res/drawable/ic_3.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_3.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_4.xml b/app/src/main/res/drawable/ic_4.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_4.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_5.xml b/app/src/main/res/drawable/ic_5.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_5.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_6.xml b/app/src/main/res/drawable/ic_6.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_6.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_ask_location.xml b/app/src/main/res/drawable/ic_ask_location.xml new file mode 100644 index 0000000..6feb20c --- /dev/null +++ b/app/src/main/res/drawable/ic_ask_location.xml @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_attach.xml b/app/src/main/res/drawable/ic_attach.xml new file mode 100644 index 0000000..cc4d9df --- /dev/null +++ b/app/src/main/res/drawable/ic_attach.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_back_white.xml b/app/src/main/res/drawable/ic_back_white.xml new file mode 100644 index 0000000..d8628b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_back_white.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_bank.xml b/app/src/main/res/drawable/ic_bank.xml new file mode 100644 index 0000000..4d82274 --- /dev/null +++ b/app/src/main/res/drawable/ic_bank.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_call_black_24dp.xml b/app/src/main/res/drawable/ic_call_black_24dp.xml new file mode 100644 index 0000000..ce16182 --- /dev/null +++ b/app/src/main/res/drawable/ic_call_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_call_end_white_24dp.xml b/app/src/main/res/drawable/ic_call_end_white_24dp.xml new file mode 100644 index 0000000..cd2552d --- /dev/null +++ b/app/src/main/res/drawable/ic_call_end_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_call_end_white_24px.xml b/app/src/main/res/drawable/ic_call_end_white_24px.xml new file mode 100644 index 0000000..cd2552d --- /dev/null +++ b/app/src/main/res/drawable/ic_call_end_white_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_call_white_24dp.xml b/app/src/main/res/drawable/ic_call_white_24dp.xml new file mode 100644 index 0000000..57b8d12 --- /dev/null +++ b/app/src/main/res/drawable/ic_call_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_calling.xml b/app/src/main/res/drawable/ic_calling.xml new file mode 100644 index 0000000..335bdfd --- /dev/null +++ b/app/src/main/res/drawable/ic_calling.xml @@ -0,0 +1,6776 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml new file mode 100644 index 0000000..a93975e --- /dev/null +++ b/app/src/main/res/drawable/ic_camera.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_children.xml b/app/src/main/res/drawable/ic_children.xml new file mode 100644 index 0000000..553de05 --- /dev/null +++ b/app/src/main/res/drawable/ic_children.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_clear.xml b/app/src/main/res/drawable/ic_clear.xml new file mode 100644 index 0000000..f8ca0c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_clear.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_consult_clinic.xml b/app/src/main/res/drawable/ic_consult_clinic.xml new file mode 100644 index 0000000..181a343 --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_clinic.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_consult_emergency.xml b/app/src/main/res/drawable/ic_consult_emergency.xml new file mode 100644 index 0000000..cca1c57 --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_emergency.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_consult_free_advice.xml b/app/src/main/res/drawable/ic_consult_free_advice.xml new file mode 100644 index 0000000..c6c403f --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_free_advice.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/ic_consult_home.xml b/app/src/main/res/drawable/ic_consult_home.xml new file mode 100644 index 0000000..370922e --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_home.xml @@ -0,0 +1,49 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_consult_online.xml b/app/src/main/res/drawable/ic_consult_online.xml new file mode 100644 index 0000000..5f1f806 --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_online.xml @@ -0,0 +1,37 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_consult_online_programs.xml b/app/src/main/res/drawable/ic_consult_online_programs.xml new file mode 100644 index 0000000..feeac36 --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_online_programs.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_consult_tip.xml b/app/src/main/res/drawable/ic_consult_tip.xml new file mode 100644 index 0000000..c465d64 --- /dev/null +++ b/app/src/main/res/drawable/ic_consult_tip.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_contacts.xml b/app/src/main/res/drawable/ic_contacts.xml new file mode 100644 index 0000000..33c8f0e --- /dev/null +++ b/app/src/main/res/drawable/ic_contacts.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_coupon.xml b/app/src/main/res/drawable/ic_coupon.xml new file mode 100644 index 0000000..32ca3d5 --- /dev/null +++ b/app/src/main/res/drawable/ic_coupon.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_cross.xml b/app/src/main/res/drawable/ic_cross.xml new file mode 100644 index 0000000..4074dc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_cross.xml @@ -0,0 +1,23 @@ + + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..0ffbc97 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_delivered.xml b/app/src/main/res/drawable/ic_delivered.xml new file mode 100644 index 0000000..88d94b0 --- /dev/null +++ b/app/src/main/res/drawable/ic_delivered.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml new file mode 100644 index 0000000..6f5ef5d --- /dev/null +++ b/app/src/main/res/drawable/ic_download.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_drop_location_mrkr.xml b/app/src/main/res/drawable/ic_drop_location_mrkr.xml new file mode 100644 index 0000000..d84acc6 --- /dev/null +++ b/app/src/main/res/drawable/ic_drop_location_mrkr.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_dropdown.xml b/app/src/main/res/drawable/ic_dropdown.xml new file mode 100644 index 0000000..dbecda9 --- /dev/null +++ b/app/src/main/res/drawable/ic_dropdown.xml @@ -0,0 +1,14 @@ + + + diff --git a/app/src/main/res/drawable/ic_elder.xml b/app/src/main/res/drawable/ic_elder.xml new file mode 100644 index 0000000..c998d75 --- /dev/null +++ b/app/src/main/res/drawable/ic_elder.xml @@ -0,0 +1,37 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_emergancy.xml b/app/src/main/res/drawable/ic_emergancy.xml new file mode 100644 index 0000000..c79f271 --- /dev/null +++ b/app/src/main/res/drawable/ic_emergancy.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_fab_next.xml b/app/src/main/res/drawable/ic_fab_next.xml new file mode 100644 index 0000000..3a90712 --- /dev/null +++ b/app/src/main/res/drawable/ic_fab_next.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_health_tool_1.xml b/app/src/main/res/drawable/ic_health_tool_1.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_1.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_health_tool_2.xml b/app/src/main/res/drawable/ic_health_tool_2.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_2.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_health_tool_3.xml b/app/src/main/res/drawable/ic_health_tool_3.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_3.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_health_tool_4.xml b/app/src/main/res/drawable/ic_health_tool_4.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_4.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml new file mode 100644 index 0000000..46df5b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_history.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_id_card.xml b/app/src/main/res/drawable/ic_id_card.xml new file mode 100644 index 0000000..594ad44 --- /dev/null +++ b/app/src/main/res/drawable/ic_id_card.xml @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..0fb4005 --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_invite.xml b/app/src/main/res/drawable/ic_invite.xml new file mode 100644 index 0000000..8dd63f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_invite.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_language.xml b/app/src/main/res/drawable/ic_language.xml new file mode 100644 index 0000000..0c6257b --- /dev/null +++ b/app/src/main/res/drawable/ic_language.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2e5487a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 0000000..a440326 --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_location_arrow.xml b/app/src/main/res/drawable/ic_location_arrow.xml new file mode 100644 index 0000000..5749f22 --- /dev/null +++ b/app/src/main/res/drawable/ic_location_arrow.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml new file mode 100644 index 0000000..d7821a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_mic.xml b/app/src/main/res/drawable/ic_mic.xml new file mode 100644 index 0000000..45cef60 --- /dev/null +++ b/app/src/main/res/drawable/ic_mic.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_next.xml b/app/src/main/res/drawable/ic_next.xml new file mode 100644 index 0000000..4c43dfe --- /dev/null +++ b/app/src/main/res/drawable/ic_next.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_notification_drawer.xml b/app/src/main/res/drawable/ic_notification_drawer.xml new file mode 100644 index 0000000..26f154e --- /dev/null +++ b/app/src/main/res/drawable/ic_notification_drawer.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_packages.xml b/app/src/main/res/drawable/ic_packages.xml new file mode 100644 index 0000000..12b8e5b --- /dev/null +++ b/app/src/main/res/drawable/ic_packages.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_password.xml b/app/src/main/res/drawable/ic_password.xml new file mode 100644 index 0000000..5c13507 --- /dev/null +++ b/app/src/main/res/drawable/ic_password.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_pdf.xml b/app/src/main/res/drawable/ic_pdf.xml new file mode 100644 index 0000000..f7b7a87 --- /dev/null +++ b/app/src/main/res/drawable/ic_pdf.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_play_icon.xml b/app/src/main/res/drawable/ic_play_icon.xml new file mode 100644 index 0000000..b1bdebf --- /dev/null +++ b/app/src/main/res/drawable/ic_play_icon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_profile_setting.xml b/app/src/main/res/drawable/ic_profile_setting.xml new file mode 100644 index 0000000..7d77916 --- /dev/null +++ b/app/src/main/res/drawable/ic_profile_setting.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_search_app.xml b/app/src/main/res/drawable/ic_search_app.xml new file mode 100644 index 0000000..f7ed6ac --- /dev/null +++ b/app/src/main/res/drawable/ic_search_app.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_seen.xml b/app/src/main/res/drawable/ic_seen.xml new file mode 100644 index 0000000..27889d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_seen.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_sent.xml b/app/src/main/res/drawable/ic_sent.xml new file mode 100644 index 0000000..60689a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_sent.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml new file mode 100644 index 0000000..20a892e --- /dev/null +++ b/app/src/main/res/drawable/ic_share.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_skip_location.xml b/app/src/main/res/drawable/ic_skip_location.xml new file mode 100644 index 0000000..1a063ce --- /dev/null +++ b/app/src/main/res/drawable/ic_skip_location.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_wait.xml b/app/src/main/res/drawable/ic_wait.xml new file mode 100644 index 0000000..20a72fa --- /dev/null +++ b/app/src/main/res/drawable/ic_wait.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_wallet.xml b/app/src/main/res/drawable/ic_wallet.xml new file mode 100644 index 0000000..416c745 --- /dev/null +++ b/app/src/main/res/drawable/ic_wallet.xml @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/image_placeholder.xml b/app/src/main/res/drawable/image_placeholder.xml new file mode 100644 index 0000000..44f24cc --- /dev/null +++ b/app/src/main/res/drawable/image_placeholder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/progress_completed.xml b/app/src/main/res/drawable/progress_completed.xml new file mode 100644 index 0000000..e12f677 --- /dev/null +++ b/app/src/main/res/drawable/progress_completed.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rating.xml b/app/src/main/res/drawable/rating.xml new file mode 100644 index 0000000..c438650 --- /dev/null +++ b/app/src/main/res/drawable/rating.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_appointments.xml b/app/src/main/res/drawable/selector_appointments.xml new file mode 100644 index 0000000..e5fe4b0 --- /dev/null +++ b/app/src/main/res/drawable/selector_appointments.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_chat.xml b/app/src/main/res/drawable/selector_chat.xml new file mode 100644 index 0000000..cb1801a --- /dev/null +++ b/app/src/main/res/drawable/selector_chat.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_home.xml b/app/src/main/res/drawable/selector_home.xml new file mode 100644 index 0000000..aa136d4 --- /dev/null +++ b/app/src/main/res/drawable/selector_home.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_language.xml b/app/src/main/res/drawable/selector_language.xml new file mode 100644 index 0000000..3663cff --- /dev/null +++ b/app/src/main/res/drawable/selector_language.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_profile.xml b/app/src/main/res/drawable/selector_profile.xml new file mode 100644 index 0000000..76b0f16 --- /dev/null +++ b/app/src/main/res/drawable/selector_profile.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_question.xml b/app/src/main/res/drawable/selector_question.xml new file mode 100644 index 0000000..a3a6cb9 --- /dev/null +++ b/app/src/main/res/drawable/selector_question.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/campton_book.ttf b/app/src/main/res/font/campton_book.ttf new file mode 100644 index 0000000..212d224 Binary files /dev/null and b/app/src/main/res/font/campton_book.ttf differ diff --git a/app/src/main/res/font/campton_medium.ttf b/app/src/main/res/font/campton_medium.ttf new file mode 100644 index 0000000..739bdb6 Binary files /dev/null and b/app/src/main/res/font/campton_medium.ttf differ diff --git a/app/src/main/res/font/campton_semibold.ttf b/app/src/main/res/font/campton_semibold.ttf new file mode 100644 index 0000000..99ff39a Binary files /dev/null and b/app/src/main/res/font/campton_semibold.ttf differ diff --git a/app/src/main/res/layout/activity_add_address.xml b/app/src/main/res/layout/activity_add_address.xml new file mode 100644 index 0000000..c64a9ee --- /dev/null +++ b/app/src/main/res/layout/activity_add_address.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +