From cb005b3837fab6b722870a476bac2fb01c08ec33 Mon Sep 17 00:00:00 2001 From: Enrique Blasco Date: Mon, 4 May 2020 13:15:24 +0200 Subject: [PATCH] first commit --- .gitignore | 14 ++ .idea/.name | 1 + .idea/codeStyles/Project.xml | 122 ++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/gradle.xml | 20 ++ .idea/misc.xml | 9 + .idea/runConfigurations.xml | 12 ++ app/.gitignore | 1 + app/build.gradle | 75 ++++++++ app/proguard-rules.pro | 21 ++ .../es/verdnatura/ExampleInstrumentedTest.kt | 22 +++ app/src/main/AndroidManifest.xml | 26 +++ .../java/es/verdnatura/MobileApplication.kt | 20 ++ .../java/es/verdnatura/di/viewModelModule.kt | 24 +++ .../es/verdnatura/domain/ApiSalixUtils.kt | 16 ++ .../java/es/verdnatura/domain/ApiUtils.kt | 16 ++ .../java/es/verdnatura/domain/Extensions.kt | 12 ++ .../verdnatura/domain/GetAjustesUserCase.kt | 13 ++ .../es/verdnatura/domain/GetLoginUserCase.kt | 26 +++ .../java/es/verdnatura/domain/RestClient.kt | 13 ++ .../java/es/verdnatura/domain/SalixService.kt | 15 ++ .../es/verdnatura/domain/VerdnaturaService.kt | 38 ++++ .../es/verdnatura/presentation/base/BR.kt | 27 +++ .../presentation/base/BaseActivity.kt | 33 ++++ .../presentation/base/BaseFragment.kt | 61 ++++++ .../presentation/base/BaseViewModel.kt | 6 + .../verdnatura/presentation/common/Event.kt | 24 +++ .../presentation/common/UICallbacks.kt | 12 ++ .../presentation/common/UIExtensions.kt | 80 ++++++++ .../view/component/CustomDialog.kt | 42 ++++ .../feature/ajustes/adapter/AjustesAdapter.kt | 41 ++++ .../ajustes/fragment/AjustesFragment.kt | 127 ++++++++++++ .../ajustes/fragment/AjustesViewModel.kt | 81 ++++++++ .../feature/ajustes/model/AjustesItemVO.kt | 21 ++ .../feature/login/activity/LoginActivity.kt | 19 ++ .../feature/login/fragment/LoginFragment.kt | 130 +++++++++++++ .../feature/login/fragment/LoginViewModel.kt | 92 +++++++++ .../view/feature/login/model/LoginItemVO.kt | 15 ++ .../feature/main/activity/MainActivity.kt | 132 +++++++++++++ .../view/feature/main/model/ItemMenuVO.kt | 10 + .../pasillero/adapter/PasillerosAdapter.kt | 43 +++++ .../pasillero/fragment/PasilleroFragment.kt | 42 ++++ .../pasillero/fragment/PasilleroViewModel.kt | 47 +++++ .../pasillero/model/PasillerosItemVO.kt | 7 + .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../drawable-v24/selector_bottombar_text.xml | 5 + .../main/res/drawable/background_login.jpg | Bin 0 -> 88100 bytes .../res/drawable/background_oval_checked.xml | 13 ++ .../drawable/background_oval_unchecked.xml | 12 ++ app/src/main/res/drawable/border_parental.xml | 9 + app/src/main/res/drawable/btn_ios_like.xml | 5 + app/src/main/res/drawable/btn_orange.xml | 10 + .../res/drawable/btn_white_transparent.xml | 12 ++ .../main/res/drawable/component_progress.xml | 19 ++ .../res/drawable/drawable_white_circle.xml | 9 + .../ic_arrow_drop_down_black_24dp.xml | 5 + .../main/res/drawable/ic_build_black_24dp.xml | 5 + .../drawable/ic_build_black_24dp_selected.xml | 5 + .../drawable/ic_chevron_right_black_24dp.xml | 5 + .../res/drawable/ic_dashboard_black_24dp.xml | 5 + .../res/drawable/ic_device_hub_black_24dp.xml | 5 + .../ic_device_hub_black_24dp_selected.xml | 5 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ .../drawable/ic_local_florist_black_24dp.xml | 5 + .../ic_local_florist_black_24dp_selected.xml | 5 + .../res/drawable/ic_loyalty_black_24dp.xml | 5 + .../drawable/ic_move_to_inbox_black_24dp.xml | 5 + .../main/res/drawable/ic_spa_black_24dp.xml | 6 + .../drawable/ic_verified_user_black_24dp.xml | 5 + .../ic_verified_user_black_24dp_selected.xml | 5 + .../res/drawable/ic_visibility_black_24dp.xml | 5 + app/src/main/res/layout/activity_login.xml | 21 ++ app/src/main/res/layout/activity_main.xml | 34 ++++ .../res/layout/component_custom_dialog.xml | 61 ++++++ app/src/main/res/layout/fragment_ajustes.xml | 118 ++++++++++++ app/src/main/res/layout/fragment_login.xml | 181 ++++++++++++++++++ .../main/res/layout/fragment_pasillero.xml | 28 +++ app/src/main/res/layout/item_ajustes_row.xml | 58 ++++++ .../res/layout/item_pasilleros_main_menu.xml | 45 +++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes app/src/main/res/raw/orange_loading.json | 1 + .../main/res/raw/orange_splash_effect.json | 1 + app/src/main/res/values/colors.xml | 25 +++ app/src/main/res/values/dimens.xml | 73 +++++++ app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/styles.xml | 121 ++++++++++++ .../java/es/verdnatura/ExampleUnitTest.kt | 17 ++ build.gradle | 41 ++++ gradle.properties | 21 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++++++++ gradlew.bat | 84 ++++++++ settings.gradle | 2 + 105 files changed, 3106 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.name create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/es/verdnatura/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/es/verdnatura/MobileApplication.kt create mode 100644 app/src/main/java/es/verdnatura/di/viewModelModule.kt create mode 100644 app/src/main/java/es/verdnatura/domain/ApiSalixUtils.kt create mode 100644 app/src/main/java/es/verdnatura/domain/ApiUtils.kt create mode 100644 app/src/main/java/es/verdnatura/domain/Extensions.kt create mode 100644 app/src/main/java/es/verdnatura/domain/GetAjustesUserCase.kt create mode 100644 app/src/main/java/es/verdnatura/domain/GetLoginUserCase.kt create mode 100644 app/src/main/java/es/verdnatura/domain/RestClient.kt create mode 100644 app/src/main/java/es/verdnatura/domain/SalixService.kt create mode 100644 app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/base/BR.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/base/BaseViewModel.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/common/Event.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/component/CustomDialog.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/adapter/AjustesAdapter.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/model/AjustesItemVO.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/login/activity/LoginActivity.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginViewModel.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/main/model/ItemMenuVO.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/adapter/PasillerosAdapter.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt create mode 100644 app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/model/PasillerosItemVO.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-v24/selector_bottombar_text.xml create mode 100644 app/src/main/res/drawable/background_login.jpg create mode 100644 app/src/main/res/drawable/background_oval_checked.xml create mode 100644 app/src/main/res/drawable/background_oval_unchecked.xml create mode 100644 app/src/main/res/drawable/border_parental.xml create mode 100644 app/src/main/res/drawable/btn_ios_like.xml create mode 100644 app/src/main/res/drawable/btn_orange.xml create mode 100644 app/src/main/res/drawable/btn_white_transparent.xml create mode 100644 app/src/main/res/drawable/component_progress.xml create mode 100644 app/src/main/res/drawable/drawable_white_circle.xml create mode 100644 app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_build_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_build_black_24dp_selected.xml create mode 100644 app/src/main/res/drawable/ic_chevron_right_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_device_hub_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_device_hub_black_24dp_selected.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_local_florist_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_local_florist_black_24dp_selected.xml create mode 100644 app/src/main/res/drawable/ic_loyalty_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_move_to_inbox_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_spa_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_verified_user_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_verified_user_black_24dp_selected.xml create mode 100644 app/src/main/res/drawable/ic_visibility_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/component_custom_dialog.xml create mode 100644 app/src/main/res/layout/fragment_ajustes.xml create mode 100644 app/src/main/res/layout/fragment_login.xml create mode 100644 app/src/main/res/layout/fragment_pasillero.xml create mode 100644 app/src/main/res/layout/item_ajustes_row.xml create mode 100644 app/src/main/res/layout/item_pasilleros_main_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/raw/orange_loading.json create mode 100644 app/src/main/res/raw/orange_splash_effect.json create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/es/verdnatura/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..603b1407 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..dfebefaf --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Gestor Almacén \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..88ea3aa1 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,122 @@ + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+ + +
+
\ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..5cd135a0 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..37a75096 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 00000000..7f68460d --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..69d19b48 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,75 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' + + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "es.verdnatura" + minSdkVersion 21 + targetSdkVersion 29 + versionCode 1 + versionName "5.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + dataBinding { + enabled = true + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + debugImplementation fileTree(dir: 'libs/debug', include: ['*.jar']) + releaseImplementation fileTree(dir: 'libs/release', include: ['*.jar']) + + // Kotlin and Android + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.core:core-ktx:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'com.squareup.retrofit2:retrofit:2.0.2' + implementation 'com.squareup.retrofit2:converter-gson:2.0.2' + implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' + implementation "com.airbnb.android:lottie:$lottieVersion" + + + // Architecture components + implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle" + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + + // Koin for DI + implementation "org.koin:koin-core:$koin" + implementation "org.koin:koin-android:$koin" + implementation "org.koin:koin-androidx-scope:$koin" + implementation "org.koin:koin-androidx-viewmodel:$koin" + + + // Image libraries + implementation "io.coil-kt:coil:$coil" + implementation "com.github.bumptech.glide:glide:$glide" + implementation "com.github.bumptech.glide:okhttp3-integration:$glide" + kapt "com.github.bumptech.glide:compiler:$glide" +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# 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 diff --git a/app/src/androidTest/java/es/verdnatura/ExampleInstrumentedTest.kt b/app/src/androidTest/java/es/verdnatura/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..6a6e2eb3 --- /dev/null +++ b/app/src/androidTest/java/es/verdnatura/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package es.verdnatura + +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("es.verdnatura", appContext.packageName) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..23ef7ad1 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/MobileApplication.kt b/app/src/main/java/es/verdnatura/MobileApplication.kt new file mode 100644 index 00000000..20f831ea --- /dev/null +++ b/app/src/main/java/es/verdnatura/MobileApplication.kt @@ -0,0 +1,20 @@ +package es.verdnatura + +import android.app.Application +import es.verdnatura.di.viewModelModule +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.loadKoinModules +import org.koin.core.context.startKoin + +class MobileApplication: Application() { + override fun onCreate() { + super.onCreate() + + startKoin { androidContext(this@MobileApplication) + val moduleList = listOf(viewModelModule) + loadKoinModules(moduleList) + } + + + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/di/viewModelModule.kt b/app/src/main/java/es/verdnatura/di/viewModelModule.kt new file mode 100644 index 00000000..d428eebd --- /dev/null +++ b/app/src/main/java/es/verdnatura/di/viewModelModule.kt @@ -0,0 +1,24 @@ +package es.verdnatura.di + +import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesViewModel +import es.verdnatura.presentation.view.feature.login.fragment.LoginViewModel +import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroViewModel +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module + +val viewModelModule = module{ + // Login + viewModel { + LoginViewModel() + } + + // Pasilleros + viewModel { + PasilleroViewModel() + } + + // Ajustes + viewModel { + AjustesViewModel() + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/ApiSalixUtils.kt b/app/src/main/java/es/verdnatura/domain/ApiSalixUtils.kt new file mode 100644 index 00000000..d9a70a43 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/ApiSalixUtils.kt @@ -0,0 +1,16 @@ +package es.verdnatura.domain + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class ApiSalixUtils { + companion object { + //const val BASE_URL:String = "http://192.168.1.108:8000/" + const val BASE_URL:String = "https://salix.verdnatura.es/api/" + fun getApiService():SalixService{ + val salixRetrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory( + GsonConverterFactory.create()).build() + return salixRetrofit.create(SalixService::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/ApiUtils.kt b/app/src/main/java/es/verdnatura/domain/ApiUtils.kt new file mode 100644 index 00000000..9317c858 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/ApiUtils.kt @@ -0,0 +1,16 @@ +package es.verdnatura.domain + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class ApiUtils { + companion object { + const val BASE_URL:String = "http://192.168.1.108:8000/" + //const val BASE_URL:String = "https://app.verdnatura.es/" + fun getApiService():VerdnaturaService{ + val retrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory( + GsonConverterFactory.create()).build() + return retrofit.create(VerdnaturaService::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/Extensions.kt b/app/src/main/java/es/verdnatura/domain/Extensions.kt new file mode 100644 index 00000000..7281e0f1 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/Extensions.kt @@ -0,0 +1,12 @@ +package es.verdnatura.domain + +import android.content.Context +import android.widget.Toast + +fun Any.toast(context: Context, duration: Int = Toast.LENGTH_SHORT): Toast { + return Toast.makeText(context, this.toString(), duration).apply { show() } +} + +fun T?.notNull(f: (it: T) -> Unit) { + if (this != null) f(this) +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/GetAjustesUserCase.kt b/app/src/main/java/es/verdnatura/domain/GetAjustesUserCase.kt new file mode 100644 index 00000000..0759d1dc --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/GetAjustesUserCase.kt @@ -0,0 +1,13 @@ +package es.verdnatura.domain + +import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO +import retrofit2.Call + +class GetAjustesUserCase : RestClient() { + + fun getSectors(usuario:String,password:String) : Call> { + return restClient!!.getSectors("json","1",usuario,password,"application/json")!! + } + + +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/GetLoginUserCase.kt b/app/src/main/java/es/verdnatura/domain/GetLoginUserCase.kt new file mode 100644 index 00000000..51ff3898 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/GetLoginUserCase.kt @@ -0,0 +1,26 @@ +package es.verdnatura.domain + +import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO +import retrofit2.Call + +class GetLoginUserCase() : RestClient() { + + fun login(usuario:String,password:String) : Call{ + val params:ArrayList = ArrayList(); + params.add(usuario) + params.add(password) + return restClient!!.login("json","1",usuario,password,"application/json",params)!! + } + + fun salixLogin(usuario:String,password:String) : Call{ + + return salixClient!!.login("application/json", LoginSalixVO(usuario,password))!! + } + + fun checkVersion(usuario:String,password:String,version:String) : Call { + val params:ArrayList = ArrayList(); + params.add(version) + return restClient!!.version("json","1",usuario,password,"application/json",params)!! + } + +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/RestClient.kt b/app/src/main/java/es/verdnatura/domain/RestClient.kt new file mode 100644 index 00000000..1c95a2f8 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/RestClient.kt @@ -0,0 +1,13 @@ +package es.verdnatura.domain + +open class RestClient { + var restClient:VerdnaturaService? = null + var salixClient:SalixService? = null + + init { + restClient = ApiUtils.getApiService() + salixClient = ApiSalixUtils.getApiService() + } + + +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/SalixService.kt b/app/src/main/java/es/verdnatura/domain/SalixService.kt new file mode 100644 index 00000000..02938f32 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/SalixService.kt @@ -0,0 +1,15 @@ +package es.verdnatura.domain + +import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface SalixService { + + @POST("Accounts/login") + fun login(@Header("Content-Type") content_type: String, + @Body params: LoginSalixVO): + Call +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt b/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt new file mode 100644 index 00000000..f850ca25 --- /dev/null +++ b/app/src/main/java/es/verdnatura/domain/VerdnaturaService.kt @@ -0,0 +1,38 @@ +package es.verdnatura.domain + + +import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface VerdnaturaService { + + @POST("security/login") + fun login(@Header("aplicacion") aplicacion: String, + @Header("version") version: String, + @Header("user") user: String, + @Header("pass") pass: String, + @Header("Content-Type") content_type: String, + @Body params: List): + Call + + @POST("almacenv2/version") + fun version(@Header("aplicacion") aplicacion: String, + @Header("version") version: String, + @Header("user") user: String, + @Header("pass") pass: String, + @Header("Content-Type") content_type: String, + @Body params: List): + Call + + @POST("almacenv2/sector_get") + fun getSectors(@Header("aplicacion") aplicacion: String, + @Header("version") version: String, + @Header("user") user: String, + @Header("pass") pass: String, + @Header("Content-Type") content_type: String): + Call> + +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/base/BR.kt b/app/src/main/java/es/verdnatura/presentation/base/BR.kt new file mode 100644 index 00000000..295f0e87 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/base/BR.kt @@ -0,0 +1,27 @@ +package es.verdnatura.presentation.base + +object BR { + const val _all = 0 + const val focused = 1 + const val rating = 2 + const val resumePosition = 3 + const val favorite = 4 + const val selected = 5 + const val toolBarItem = 6 + const val item = 7 + const val loadingInfo = 8 + const val color = 9 + const val icon = 10 + const val episode = 11 + const val title = 12 + const val content = 13 + const val onOptionsItemSelected = 14 + const val vpsActionListener = 15 + const val numberEpisodes = 16 + const val seasonColor = 17 + const val viewModel = 18 + const val action = 19 + const val liveProgram = 20 + const val loadingEpisodes = 21 + const val ratio = 22 +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt b/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt new file mode 100644 index 00000000..2298d325 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt @@ -0,0 +1,33 @@ +package es.verdnatura.presentation.base + +import android.os.Bundle +import androidx.annotation.LayoutRes +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding + +abstract class BaseActivity : AppCompatActivity() { + + + protected lateinit var binding: T + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(getLayoutId()) + initDataBinding() + init() + } + + @LayoutRes + abstract fun getLayoutId(): Int + open fun addBindingVariables() {} + abstract fun init() + + + private fun initDataBinding() { + binding = DataBindingUtil.setContentView(this, getLayoutId()) + binding.lifecycleOwner = this + addBindingVariables() + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt b/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt new file mode 100644 index 00000000..4771a70b --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt @@ -0,0 +1,61 @@ +package es.verdnatura.presentation.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.fragment.app.Fragment +import org.koin.androidx.viewmodel.ext.android.viewModel +import kotlin.reflect.KClass + +abstract class BaseFragment(viewModelClass: KClass) : + Fragment() { + + + protected val PREFS_USER = "es.verdnatura.user.prefs" + protected val USERFK = "userFk" + protected val USER = "user" + protected val PASSWORD = "password" + protected val TOKEN = "token" + protected val SECTORDESCRIP = "sectordescrip" + protected val SECTORFK = "sectorFk" + protected val WAREHOUSEFK = "warehouseFk" + protected val viewModel: V by viewModel(viewModelClass) + protected lateinit var binding: T + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? = inflater.inflate(getLayoutId(), container, false) + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + + initDataBinding() + getBundleArguments() + observeViewModel() + + init() + } + + @LayoutRes + abstract fun getLayoutId(): Int + open fun init() {} + open fun observeViewModel() {} + open fun getBundleArguments() {} + open fun addBindingVariables() {} + + + private fun initDataBinding() { + binding = DataBindingUtil.bind(view!!)!! + binding.lifecycleOwner = viewLifecycleOwner + binding.setVariable(BR.viewModel, this@BaseFragment.viewModel) + lifecycle.addObserver(this@BaseFragment.viewModel) + addBindingVariables() + } +} diff --git a/app/src/main/java/es/verdnatura/presentation/base/BaseViewModel.kt b/app/src/main/java/es/verdnatura/presentation/base/BaseViewModel.kt new file mode 100644 index 00000000..b39bd015 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/base/BaseViewModel.kt @@ -0,0 +1,6 @@ +package es.verdnatura.presentation.base + +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.ViewModel + +abstract class BaseViewModel : ViewModel(), LifecycleObserver \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/common/Event.kt b/app/src/main/java/es/verdnatura/presentation/common/Event.kt new file mode 100644 index 00000000..f0714d4f --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/common/Event.kt @@ -0,0 +1,24 @@ +package es.verdnatura.presentation.common + +open class Event(private val content: T) { + + var hasBeenHandled = false + private set // Allow external read but not write + + /** + * Returns the content and prevents its use again. + */ + fun getContentIfNotHandled(): T? { + return if (hasBeenHandled) { + null + } else { + hasBeenHandled = true + content + } + } + + /** + * Returns the content, even if it's already been handled. + */ + fun peekContent(): T = content +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt b/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt new file mode 100644 index 00000000..090dd41e --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt @@ -0,0 +1,12 @@ +package es.verdnatura.presentation.common + +import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO +import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO + +interface OnPasillerosItemClickListener { + fun onPasillerosItemClickListener(item: PasillerosItemVO) +} + +interface OnAjustesItemClickListener { + fun onAjustesItemClickListener(item: AjustesItemVO) +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt b/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt new file mode 100644 index 00000000..dadaf35c --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt @@ -0,0 +1,80 @@ +package es.verdnatura.presentation.common + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import com.bumptech.glide.Glide + + +inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) = + beginTransaction().func().commit() + + +fun Context.openActivity(it: Class, extras: Bundle.() -> Unit = {}) { + val intent = Intent(this, it) + intent.putExtras(Bundle().apply(extras)) + startActivity(intent) +} + +fun FragmentActivity.replaceFragment( + fragment: Fragment, + frameId: Int, + tag: String, + addToBackStack: Boolean = false +) { + supportFragmentManager.inTransaction { + replace(frameId, fragment, tag) + if (addToBackStack) addToBackStack(tag) + setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + } +} + +fun FragmentActivity.addFragment( + fragment: Fragment, + frameId: Int, + tag: String = "", + addToBackStack: Boolean = false +) { + supportFragmentManager.inTransaction { + add(frameId, fragment, tag) + if (addToBackStack) addToBackStack(tag) + setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + } +} + +fun View.setDimensions(width: Int, height: Int) { + val layoutParams = this.layoutParams + layoutParams?.width = width + layoutParams?.height = height + this.layoutParams = layoutParams +} +fun View.setMargins(left: Int, top: Int, right: Int, bottom: Int) { + val mlp = this.layoutParams as ViewGroup.MarginLayoutParams + mlp.setMargins(left, top, right, bottom) +} + +fun ImageView.loadUrl(url: String) { +// load(url) + Glide.with(context).load(url).into(this) +// Glide.with(context) +// .asBitmap() +// .load(url) +// .into(object : CustomTarget() { +// +// override fun onLoadCleared(placeholder: Drawable?) {} +// +// override fun onResourceReady(resource: Bitmap, transition: Transition?) { +// setImageBitmap(resource) +// } +// }) +} + +inline val T.TAG: String + get() = T::class.java.canonicalName ?: T::class.simpleName ?: T::class.java.simpleName \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialog.kt b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialog.kt new file mode 100644 index 00000000..39bf05ef --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialog.kt @@ -0,0 +1,42 @@ +package es.verdnatura.presentation.view.component + +import android.app.Dialog +import android.content.Context +import android.view.View +import es.verdnatura.R +import kotlinx.android.synthetic.main.component_custom_dialog.* + +class CustomDialog(context: Context) : Dialog(context, R.style.DialogTheme) { + + init { + setContentView(R.layout.component_custom_dialog) + } + + + fun setTitle(title: String): CustomDialog { + custom_dialog_title.visibility = View.VISIBLE + custom_dialog_title.text = title + return this + } + + fun setDescription(description: String): CustomDialog { + custom_dialog_description.visibility = View.VISIBLE + custom_dialog_description.text = description + return this + } + + fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialog { + custom_dialog_button_ok.visibility = View.VISIBLE + custom_dialog_button_ok.text = text + custom_dialog_button_ok.setOnClickListener { onButtonClicked() } + return this + } + + fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialog { + custom_dialog_button_ko.visibility = View.VISIBLE + custom_dialog_button_ko.text = text + custom_dialog_button_ko.setOnClickListener { onButtonClicked() } + return this + } + +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/adapter/AjustesAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/adapter/AjustesAdapter.kt new file mode 100644 index 00000000..0b90bf37 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/adapter/AjustesAdapter.kt @@ -0,0 +1,41 @@ +package es.verdnatura.presentation.view.feature.ajustes.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import es.verdnatura.databinding.ItemAjustesRowBinding +import es.verdnatura.presentation.common.OnAjustesItemClickListener +import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO + +class AjustesAdapter ( + private val items: List, + private val onAjustesItemClickListener: OnAjustesItemClickListener +): RecyclerView.Adapter () { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AjustesItemHolder { + return AjustesItemHolder( + ItemAjustesRowBinding.inflate(LayoutInflater.from(parent.context),parent,false) + ) + } + + override fun getItemCount() =items.size + + override fun onBindViewHolder(holder: AjustesItemHolder, position: Int) { + holder.bind(items[position]) + holder.binding.root.setOnClickListener { + onAjustesItemClickListener.onAjustesItemClickListener(items[position]) + } + } + + + class AjustesItemHolder( + val binding: ItemAjustesRowBinding + ) : RecyclerView.ViewHolder(binding.root){ + fun bind(item: AjustesItemVO) { + binding.apply { + this.item = item + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt new file mode 100644 index 00000000..09851c9b --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt @@ -0,0 +1,127 @@ +package es.verdnatura.presentation.view.feature.ajustes.fragment + +import android.app.AlertDialog +import android.content.DialogInterface +import android.content.SharedPreferences +import android.view.View +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import es.verdnatura.R +import es.verdnatura.databinding.FragmentAjustesBinding +import es.verdnatura.domain.notNull +import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.common.OnAjustesItemClickListener +import es.verdnatura.presentation.view.component.CustomDialog +import es.verdnatura.presentation.view.feature.ajustes.adapter.AjustesAdapter +import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO +import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO +import es.verdnatura.presentation.view.feature.ajustes.model.SectorListVO +import kotlinx.android.synthetic.main.fragment_ajustes.* + +class AjustesFragment : BaseFragment(AjustesViewModel::class) { + + private var user:String? = "" + private var password:String? = "" + private lateinit var customDialog: CustomDialog + private var sectorListVO:List = listOf() + private var prefs: SharedPreferences? = null + private var ajustesAdapter: AjustesAdapter? = null + + companion object { + fun newInstance() = AjustesFragment() + } + override fun getLayoutId(): Int = R.layout.fragment_ajustes + + override fun init() { + prefs = activity!!.getSharedPreferences(PREFS_USER,0) + customDialog = CustomDialog(requireContext()) + viewModel.inititializeDefaultAjusts(prefs!!.getString(SECTORDESCRIP,"Sin sector").toString(),prefs!!.getInt(SECTORFK,0),prefs!!.getInt(WAREHOUSEFK,0)) + user_text.setText(prefs!!.getString(USERFK,"")) + val versionName = activity!!.packageManager.getPackageInfo(activity!!.packageName,0).versionName + item_version.setText(versionName) + user = prefs!!.getString(USER,"") + password = prefs!!.getString(PASSWORD,"") + super.init() + } + + override fun observeViewModel() { + with(viewModel){ + ajustesAdapter = AjustesAdapter(ajustesitem,object: OnAjustesItemClickListener{ + override fun onAjustesItemClickListener(item: AjustesItemVO) { + if (item.id == 0){ + splash_progress.visibility = View.VISIBLE + viewModel.getSectors(user!!,password!!) + } else if (item.id == 1){ + activity!!.onBackPressed() + } + } + }) + ajustess_items.adapter = ajustesAdapter + ajustess_items.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + + loadSectorList.observe(viewLifecycleOwner, Observer { event -> + event.getContentIfNotHandled().notNull { + splash_progress.visibility = View.INVISIBLE + if (it.list != null && it.list.size > 0 && it.list.get(0).isError){ + customDialog.setTitle("Error").setDescription(it.list.get(0).errorMessage).setOkButton("Cerrar"){ + customDialog.hide() + }.show() + }else{ + + if (it.list != null && it.list.size > 0){ + val listSectores : ArrayList = ArrayList() + it.list.forEach { + listSectores.add(it.description) + } + val array = arrayOfNulls(listSectores.size) + sectorListVO = it.list + showDialogSector(listSectores.toArray(array)) + + }else{ + customDialog.setTitle("Sectores").setDescription("No existes sectores.").setOkButton("Cerrar"){ + customDialog.hide() + }.show() + } + + } + } + }) + } + super.observeViewModel() + } + + private fun showDialogSector(array:Array){ + val builder = AlertDialog.Builder(this.context) + + + builder.setTitle("Selecciona un sector") + builder.setItems(array) { _, which -> + val selected = array[which] + sectorListVO.forEach { + if (it.description.equals(selected)){ + val editor = prefs!!.edit() + editor.putString(SECTORDESCRIP,it.description) + editor.putInt(SECTORFK,it.id) + it.warehouseFk?.let { it1 -> editor.putInt(WAREHOUSEFK, it1) } + editor.apply() + + viewModel.ajustesitem.get(0).sectorFk = it.id + viewModel.ajustesitem.get(0).warehouse = it.warehouseFk + viewModel.ajustesitem.get(0).selected = it.description + ajustesAdapter!!.notifyDataSetChanged() + + return@forEach + } + } + + + } + + val dialog = builder.create() + dialog.show() + } + + + + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt new file mode 100644 index 00000000..b8a79a86 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt @@ -0,0 +1,81 @@ +package es.verdnatura.presentation.view.feature.ajustes.fragment + + +import android.content.SharedPreferences +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations +import es.verdnatura.domain.GetAjustesUserCase +import es.verdnatura.presentation.base.BaseViewModel +import es.verdnatura.presentation.common.Event +import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO +import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO +import es.verdnatura.presentation.view.feature.ajustes.model.SectorListVO +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + + +class AjustesViewModel : BaseViewModel() { + + private val getAjustesUserCase:GetAjustesUserCase = GetAjustesUserCase() + val version : String = "5.0.0"; + + private val _ajustesitem by lazy { ArrayList() } + val ajustesitem: List + get() = _ajustesitem + + private val _sectorList by lazy { MutableLiveData() } + val sectorList: LiveData + get() = _sectorList + + + val loadSectorList = Transformations.map(_sectorList) {Event(it)} + + + + + fun inititializeDefaultAjusts(sectorDescrip: String,sectorFk : Int, warehouseFk : Int) { + _ajustesitem.add( + AjustesItemVO(0, + "Sector", + sectorDescrip, + sectorFk, + warehouseFk) + ) + + _ajustesitem.add( + AjustesItemVO(1, + "Cerrar Sesión", + "", + 0, + 0) + ) + + } + + fun getSectors(user:String,password:String){ + getAjustesUserCase.getSectors(user,password).enqueue(object : Callback>{ + override fun onFailure(call: Call>, t: Throwable) { + val listError:ArrayList = ArrayList() + listError.add(SectorItemVO(0,"",0,true,t.message!!)) + _sectorList.value = SectorListVO(listError) + } + + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.body() != null){ + _sectorList.value = response.body()?.let { SectorListVO(it) } + }else{ + val listError:ArrayList = ArrayList() + listError.add(SectorItemVO(0,"",0,true,"Error en la llamada sector_get")) + _sectorList.value = SectorListVO(listError) + } + } + + }) + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/model/AjustesItemVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/model/AjustesItemVO.kt new file mode 100644 index 00000000..2b293657 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/model/AjustesItemVO.kt @@ -0,0 +1,21 @@ +package es.verdnatura.presentation.view.feature.ajustes.model + +class AjustesItemVO ( + var id: Int, + var title: String = "", + var selected: String = "", + var sectorFk : Int?, + var warehouse: Int? +) + +class SectorItemVO ( + var id: Int, + var description:String = "", + val warehouseFk:Int?, + val isError : Boolean = false, + var errorMessage : String = "" +) + +class SectorListVO ( + var list: List = listOf() +) \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/login/activity/LoginActivity.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/login/activity/LoginActivity.kt new file mode 100644 index 00000000..27f05577 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/login/activity/LoginActivity.kt @@ -0,0 +1,19 @@ +package es.verdnatura.presentation.view.feature.login.activity + +import es.verdnatura.R +import es.verdnatura.databinding.ActivityLoginBinding +import es.verdnatura.presentation.base.BaseActivity +import es.verdnatura.presentation.common.TAG +import es.verdnatura.presentation.common.addFragment +import es.verdnatura.presentation.view.feature.login.fragment.LoginFragment + +class LoginActivity : BaseActivity() { + + override fun getLayoutId(): Int = R.layout.activity_login + + override fun init() { + addFragment(LoginFragment.newInstance(),R.id.main_frame_layout,LoginFragment.TAG) + } + + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt new file mode 100644 index 00000000..a2badb4e --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt @@ -0,0 +1,130 @@ +package es.verdnatura.presentation.view.feature.login.fragment + + +import android.content.Intent +import android.content.SharedPreferences +import android.net.Uri +import android.view.View +import androidx.lifecycle.Observer +import es.verdnatura.R +import es.verdnatura.databinding.FragmentLoginBinding +import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.view.component.CustomDialog +import es.verdnatura.presentation.view.feature.login.model.LoginItemVO +import es.verdnatura.presentation.view.feature.main.activity.MainActivity +import kotlinx.android.synthetic.main.fragment_login.* + +class LoginFragment : BaseFragment (LoginViewModel::class) { + + private lateinit var customDialog: CustomDialog + companion object { + fun newInstance() = LoginFragment() + } + + override fun getLayoutId(): Int = R.layout.fragment_login + + override fun init() { + customDialog = CustomDialog(requireContext()) + checkUser() + button_login.setOnClickListener(View.OnClickListener { + splash_progress.visibility = View.VISIBLE + viewModel.login(edittext_username.text.toString(),edittext_password.text.toString()) + }) + } + + private fun checkUser(){ + val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0) + edittext_username.setText(prefs.getString(USER,"")) + edittext_password.setText(prefs.getString(PASSWORD,"")) + if (edittext_password.text.toString().isNotEmpty()){ + switch_remember.isChecked = true + } + } + + override fun observeViewModel() { + with(viewModel){ + loginitem.observe(viewLifecycleOwner, Observer { + splash_progress.visibility = View.INVISIBLE + if (it.isError){ + customDialog.setTitle("Error").setDescription(it.errorMessage).setOkButton("Cerrar"){ + customDialog.hide() + }.show() + }else{ + splash_progress.visibility = View.VISIBLE + saveUserFkPref(it) + if (switch_remember.isChecked) { + saveUserAccesPref(edittext_username.text.toString(),edittext_password.text.toString()) + }else{ + saveUserAccesPref("","") + } + loginSalix(user = edittext_username.text.toString(),password = edittext_password.text.toString()) + } + + }) + loginsalixitem.observe(viewLifecycleOwner, Observer { + splash_progress.visibility = View.INVISIBLE + if (it.isError){ + saveTokenPref("") + customDialog.setTitle("Error").setDescription(it.errorMessage+". Puedes continuar pero algunas funcionalidades no estarán disponibles.").setOkButton("Entendido"){ + customDialog.hide() + getVersion() + }.show() + }else{ + saveTokenPref(it.token) + getVersion() + } + }) + + version.observe(viewLifecycleOwner, Observer { + splash_progress.visibility = View.INVISIBLE + if (it){ + goToMain() + }else{ + customDialog.setTitle("Error").setDescription("Existe una versión nueva, es recomendable actualizar.").setOkButton("Actualizar"){ + val openURL = Intent(Intent.ACTION_VIEW) + openURL.data = Uri.parse("https://app.verdnatura.es/bin/vn-pickingV2.apk") + startActivity(openURL) + }.setKoButton("Omitir"){ + customDialog.hide() + goToMain() + }.show() + } + }) + } + super.observeViewModel() + } + + private fun saveTokenPref(token:String){ + val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0) + val editor = prefs.edit() + editor.putString(TOKEN,token) + editor.apply() + } + + private fun saveUserFkPref(loginitem : LoginItemVO){ + val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0) + val editor = prefs.edit() + editor.putString(USERFK,loginitem.id) + editor.apply() + } + + private fun saveUserAccesPref(user:String,password:String){ + val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0) + val editor = prefs.edit() + editor.putString(USER,user) + editor.putString(PASSWORD,password) + editor.apply() + } + + private fun goToMain(){ + val intent = Intent(activity,MainActivity::class.java) + startActivity(intent) + } + + private fun getVersion(){ + val versionName = activity!!.packageManager.getPackageInfo(activity!!.packageName,0).versionName + splash_progress.visibility = View.VISIBLE + viewModel.checkVersion(user = edittext_username.text.toString(),password = edittext_password.text.toString(),version = versionName) + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginViewModel.kt new file mode 100644 index 00000000..e7ee2363 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginViewModel.kt @@ -0,0 +1,92 @@ +package es.verdnatura.presentation.view.feature.login.fragment + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import es.verdnatura.domain.GetLoginUserCase +import es.verdnatura.presentation.base.BaseViewModel +import es.verdnatura.presentation.view.feature.login.model.LoginItemVO +import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class LoginViewModel() : BaseViewModel() { + + private val getLoginUserCase: GetLoginUserCase = GetLoginUserCase() + + + private val _loginitem by lazy { MutableLiveData ()} + val loginitem : LiveData + get() = _loginitem + + private val _loginsalixitem by lazy { MutableLiveData ()} + val loginsalixitem : LiveData + get() = _loginsalixitem + + + private val _version by lazy { MutableLiveData ()} + val version : LiveData + get() = _version + + + fun login(user:String,password:String){ + getLoginUserCase.login(user,password).enqueue(object : Callback{ + override fun onResponse(call: Call, response: Response) { + + var loginItemVO:LoginItemVO? + if (response.raw().code() == 555){ + loginItemVO = LoginItemVO(id = "0",isError = true, errorMessage = "Usuario o contraseña incorrectos") + }else if (!response.body().isNullOrEmpty()){ + loginItemVO = response.body()?.let { LoginItemVO(id = it) } + }else{ + loginItemVO = LoginItemVO(id = "0",isError = true,errorMessage = "Error desconocido") + } + + _loginitem.value = loginItemVO!! + } + + override fun onFailure(call: Call, t: Throwable) { + val loginItemVO : LoginItemVO? = LoginItemVO(id = "0",isError = true, errorMessage = t.message!!) + _loginitem.value = loginItemVO + } + }) + } + + fun loginSalix(user:String,password:String){ + getLoginUserCase.salixLogin(user,password).enqueue(object : Callback{ + override fun onResponse(call: Call, response: Response) { + + var loginSalixVO:LoginSalixVO? + if(response.body() != null){ + loginSalixVO = response.body()?.token?.let { LoginSalixVO(user,password, it,isError = false,errorMessage = "") } + }else{ + loginSalixVO = LoginSalixVO(user,password,isError = true,errorMessage = "Error al conectar con salix") + } + + _loginsalixitem.value = loginSalixVO + } + + override fun onFailure(call: Call, t: Throwable) { + val loginSalixVO = LoginSalixVO(user,password, "",isError = true,errorMessage = t.message!!) + _loginsalixitem.value = loginSalixVO + } + }) + } + + fun checkVersion(user:String,password:String,version:String){ + getLoginUserCase.checkVersion(user,password,version).enqueue(object : Callback{ + override fun onResponse(call: Call, response: Response) { + if (response.body() != null){ + _version.value = response.body() + }else{ + _version.value = true + } + } + + override fun onFailure(call: Call, t: Throwable) { + _version.value = true + } + }) + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt new file mode 100644 index 00000000..04d4e85d --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt @@ -0,0 +1,15 @@ +package es.verdnatura.presentation.view.feature.login.model + +class LoginItemVO ( + val id:String = "", + var isError:Boolean = false, + var errorMessage:String = "" +) + +class LoginSalixVO ( + val user:String = "", + val password:String = "", + val token:String = "", + var isError:Boolean = false, + var errorMessage:String = "" +) \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt new file mode 100644 index 00000000..c582ebd5 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt @@ -0,0 +1,132 @@ +package es.verdnatura.presentation.view.feature.main.activity + +import android.util.Log +import android.view.Menu +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import es.verdnatura.R +import es.verdnatura.databinding.ActivityMainBinding +import es.verdnatura.domain.toast +import es.verdnatura.presentation.base.BaseActivity +import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.common.TAG +import es.verdnatura.presentation.common.addFragment +import es.verdnatura.presentation.view.component.CustomDialog +import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesFragment +import es.verdnatura.presentation.view.feature.main.model.ItemMenuVO +import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroFragment +import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO +import kotlinx.android.synthetic.main.activity_main.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch + + +class MainActivity : BaseActivity() , OnPasillerosItemClickListener { + + private var lastBottomMenuItemSelected: ItemMenuVO? = null + private lateinit var customDialog: CustomDialog + + override fun getLayoutId(): Int = R.layout.activity_main + + override fun init() { + customDialog = CustomDialog(this) + setBottomMenu() + addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, PasilleroFragment.TAG) + } + + private fun openFragment(fragment: Fragment) { + val transaction = supportFragmentManager.beginTransaction() + transaction.replace(R.id.main_frame_layout, fragment) + transaction.addToBackStack(null) + transaction.commit() + } + + private fun setBottomMenu(){ + val bottomMenu = main_bottom_navigation + bottomMenu.itemIconTintList = null + GlobalScope.launch(Dispatchers.Main){ + val bottomMenuItems : ArrayList = ArrayList() + + bottomMenuItems.add(ItemMenuVO(0,title = "Pasilleros",defaultImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_device_hub_black_24dp),selectedImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_device_hub_black_24dp_selected))) + + bottomMenuItems.add(ItemMenuVO(1,title = "Sacadores",defaultImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_local_florist_black_24dp),selectedImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_local_florist_black_24dp_selected))) + + bottomMenuItems.add(ItemMenuVO(2,title = "Controladores",defaultImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_verified_user_black_24dp),selectedImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_verified_user_black_24dp_selected))) + + bottomMenuItems.add(ItemMenuVO(3,title = "Ajustes",defaultImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_build_black_24dp),selectedImage = ContextCompat.getDrawable( + applicationContext,R.drawable.ic_build_black_24dp_selected))) + + // Add al items to menu view + bottomMenuItems.forEach { + bottomMenu.menu.add(Menu.NONE, it.id, Menu.NONE, it.title).icon = it.defaultImage + } + + // Select first item by default + val firstItem = bottomMenuItems.first() + bottomMenu.selectedItemId = firstItem.id + bottomMenu.menu.findItem(firstItem.id).icon = firstItem.selectedImage + lastBottomMenuItemSelected = firstItem + + bottomMenu.setOnNavigationItemSelectedListener { menuItem -> + // Get selected item from itemList and apply ui changes to menu view + val selectedItemMenu = bottomMenuItems.find { menuItem.itemId == it.id } + menuItem.icon = selectedItemMenu?.selectedImage + + // Get last selected item and disable it + bottomMenu.menu.findItem(lastBottomMenuItemSelected?.id!!).icon = + lastBottomMenuItemSelected?.defaultImage + lastBottomMenuItemSelected = selectedItemMenu + + when (selectedItemMenu?.title) { + "Pasilleros" -> { + addFragment(PasilleroFragment.newInstance(),R.id.main_frame_layout, PasilleroFragment.TAG) + true + } + "Sacadores" -> { + selectedItemMenu.title.toast(this@MainActivity) + true + } + "Controladores" -> { + selectedItemMenu.title.toast(this@MainActivity) + true + } + "Ajustes" -> { + addFragment(AjustesFragment.newInstance(),R.id.main_frame_layout, AjustesFragment.TAG) + true + } + + + else -> false + } + + true + } + bottomMenu.setOnNavigationItemReselectedListener { + + } + } + } + + override fun onPasillerosItemClickListener(item: PasillerosItemVO) { + Log.i("Item: ",item.title) + } + + + override fun onBackPressed() { + customDialog.setTitle("Error").setDescription("¿Estás seguro de cerrar la sesión?").setOkButton("Salir"){ + customDialog.hide() + finish() + }.setKoButton("Cancelar") { + customDialog.hide() + }.show() + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/main/model/ItemMenuVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/main/model/ItemMenuVO.kt new file mode 100644 index 00000000..9de1fb60 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/main/model/ItemMenuVO.kt @@ -0,0 +1,10 @@ +package es.verdnatura.presentation.view.feature.main.model + +import android.graphics.drawable.Drawable + +data class ItemMenuVO( + val id: Int, + val title: String, + val defaultImage: Drawable?, + val selectedImage: Drawable? +) \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/adapter/PasillerosAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/adapter/PasillerosAdapter.kt new file mode 100644 index 00000000..fe4d0830 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/adapter/PasillerosAdapter.kt @@ -0,0 +1,43 @@ +package es.verdnatura.presentation.view.feature.pasillero.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import es.verdnatura.databinding.ItemPasillerosMainMenuBinding +import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO + +class PasillerosAdapter ( + private val items: List, + private val onPasillerosItemClickListener: OnPasillerosItemClickListener +): RecyclerView.Adapter () { + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PasillerosItemHolder { + return PasillerosItemHolder( + ItemPasillerosMainMenuBinding.inflate(LayoutInflater.from(parent.context),parent,false) + ) + } + + override fun getItemCount() =items.size + + override fun onBindViewHolder(holder: PasillerosItemHolder, position: Int) { + holder.bind(items[position]) + holder.binding.root.setOnClickListener { + onPasillerosItemClickListener.onPasillerosItemClickListener(items[position]) + } + + } + + + class PasillerosItemHolder( + val binding: ItemPasillerosMainMenuBinding + ) : RecyclerView.ViewHolder(binding.root){ + fun bind(item: PasillerosItemVO) { + binding.apply { + this.item = item + itemImage.setImageResource(item.iconResource) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt new file mode 100644 index 00000000..afd23b69 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroFragment.kt @@ -0,0 +1,42 @@ +package es.verdnatura.presentation.view.feature.pasillero.fragment + +import android.content.Context +import androidx.recyclerview.widget.LinearLayoutManager +import es.verdnatura.R +import es.verdnatura.databinding.FragmentPasilleroBinding +import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.view.feature.pasillero.adapter.PasillerosAdapter +import kotlinx.android.synthetic.main.fragment_pasillero.* + +class PasilleroFragment : BaseFragment(PasilleroViewModel::class){ + + private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null + + companion object { + fun newInstance() = PasilleroFragment() + } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context + } + + override fun getLayoutId(): Int = R.layout.fragment_pasillero + + override fun init() { + viewModel.inititializeDefaultData() + super.init() + } + + + + override fun observeViewModel() { + with(viewModel){ + pasilleros_items.adapter = PasillerosAdapter(pasillerositem,pasillerosItemClickListener!!) + pasilleros_items.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + } + super.observeViewModel() + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt new file mode 100644 index 00000000..fe24e933 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt @@ -0,0 +1,47 @@ +package es.verdnatura.presentation.view.feature.pasillero.fragment + + +import es.verdnatura.R +import es.verdnatura.presentation.base.BaseViewModel +import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO + +class PasilleroViewModel : BaseViewModel() { + private val _pasillerositem by lazy { ArrayList() } + val pasillerositem: List + get() = _pasillerositem + + + fun inititializeDefaultData() { + _pasillerositem.add( + PasillerosItemVO(0, + R.drawable.ic_loyalty_black_24dp, + "Consultar artículo") + ) + + _pasillerositem.add( + PasillerosItemVO(1, + R.drawable.ic_dashboard_black_24dp, + "Ubicador") + ) + + _pasillerositem.add( + PasillerosItemVO(2, + R.drawable.ic_visibility_black_24dp, + "Buscar item") + ) + + _pasillerositem.add( + PasillerosItemVO(3, + R.drawable.ic_spa_black_24dp, + "Inventario") + ) + + _pasillerositem.add( + PasillerosItemVO(4, + R.drawable.ic_move_to_inbox_black_24dp, + "Faltas") + ) + + + } +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/model/PasillerosItemVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/model/PasillerosItemVO.kt new file mode 100644 index 00000000..e16e17b0 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/model/PasillerosItemVO.kt @@ -0,0 +1,7 @@ +package es.verdnatura.presentation.view.feature.pasillero.model + +class PasillerosItemVO ( + var id: Int, + var iconResource: Int, + val title: String = "" +) \ No newline at end of file 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 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/selector_bottombar_text.xml b/app/src/main/res/drawable-v24/selector_bottombar_text.xml new file mode 100644 index 00000000..b6b2e8a2 --- /dev/null +++ b/app/src/main/res/drawable-v24/selector_bottombar_text.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/background_login.jpg b/app/src/main/res/drawable/background_login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1222ac695d2b1e702e3404fb57896e75ac30112d GIT binary patch literal 88100 zcmbTdcUV)|_b(iJ5l}Hv!GH(|Nf4zZ8k*8V2@p~#5tS|psDywDHV_ewfRxYzB7}56 zK|!(2fEt=cT8M~@gMd^;9Y9AN^&Xt>@B6;@KJOp*c{iLqhm*rTXRW>JXRZBn_~#gC z4c5!o3#6n30{H+xpr5Znu9)MrSP&>60E7U6K$;+>Y#K-vI0J4083G3gq+G51KUb6& zs#X5yTy5vdmp|Wu(D=9`$w!!RM-ol!x7&cw?!E!4D>DG&*ZJ08r)%U!IWI1QZm72I-hQ(s4j&@g3y?J^2#G|k+b+9AaL59aof zNoTdR*KgQpV7S%75(Y;gQ9E~`9UMJ8F<#z2zE~2O5)>Q~N{xz+i9Hxcqcf9JjvhOn znwEJk>wNZwi>$&Tc5z8*SviMW%i{}#BC+Jg&E}R{w_ESrefa3Hw4<}DyJuifKBRa) z{9@$w_{8L!sp*;7xsQJ>E-ioh{P&lyD|9J=RQ@Fk`23f$|AVfz0A0$esw%1)D|9I- zA6p@Ot*Y7movB@hCfL28rm0=a%%1oG5}DMmz1|%8dh5p((tc6)e@EEa z|6i2-m$3hbu9qMWK$upBGVrUStPCub3NTaw5`dwmuJ&uF|7U3Y8k#FZ>%ZeCFv+hO zl$BM1UoCYt_5XhNe|_@v4?rw;{2T%4s3-x#q_P&Y2lV6A43{+(H=_;X8_|YA%Euuv zXl%yk8}L)P2jQS*0wz|8D8%OI*%RUBL&@7UPk{+UG7o~tB#_6ZI2M}p!I?I01(j1R zgiTf8h#FL6(}t}eJ$CaI8r@GD#!c6T#}SHL)wO25H0NE-i9x#QZ$QgpSCtF`O!cdL zDDi?Cm_XgB6bKqGCx&NoWG>kBKX`_&TI2l5J|!rp^I+vDvPla)JPMz`n3GD|9+eX#AM^f z>TPM<#VzN`Ll&$$pUZ-Q{*Ob+ z2Ry0aP~*)cvNYLeSukO2G?;*)m!yM9#YyyibsmMTUUgM1CZI%koOmdmfPrA)AmGy# zxC`|Eb)5Ox_lx<{-mauJ^*l#bQY5=7eGe#^%d%Pna8BHb2geGGm)CTUksn?(bjt!0 z@SeA|%a210&(inX2djo{AjEN513tIFA8aqD#fe>)--X-=nh+T4;>8ew$9gq$F%g$jQtMp@g^B32+jqf<8z!Y;O4ER1-1|qjkmDQrGV{N!BxF(Ft zCcW9NiM^6W1leX{;eWcauVryr2p{0JDjb!oUFd09=k=@{-m1_Va6D8&^ZrcG0s`yL z^mE%mm{srvCKJf7$~AUSRtid8&GGKqGE$$4)Q<0#7ogfbvm4;>V_@af0j?<*Su8hxR6&qIr zbHo88;Qu{fs)LVD|31B39Wb27Dl=srU=t!!zpWvhO(TEHg6h%hp^w4jFC^cVKx94i zdsm$JWXn&`o*#E3yud7?{~>^Dy+8YbRjHlz%M6=#l{m?(l?FH)GB~GV9Dv0HdzpZv zki-cy)<7E;tcP*TCn~J-M%2J~xF&mhs&MfYM~D^%&2Hj>30Ma)`(lDd7c{=XW|a_p5?5tU1GFJ*EL`@0RE( z9=Pg{V}Dh1=`LLu6l>t%@zohUc67?D%vK|?J`?Wku93(L2AAB|eC#xPKv_dMZC-)(?ZsV%XSAw}dSV3H~SF(g-Z&u@oV} z^-fvkpvUC+)%3JJw3y-1s@NxgnBC%B@)o9%hlzb1AsE>6bKu9RIaj4g1}l7?Q=Arz z%**g%_+cRVEAPQm3M7mU(lHxla2NIbF=iJa9*+&RDf6yVJVG9wn+$a}s*nAFd82bStqNgVnQUm)w0PKlq)92b00 zr_EO`hNgc2R*KbnEge`KbPZor9V-BlO$;j<)*;K937F^=!$8~@U;09#t2)s#rbeWOWi0+AoAEYP2g00G34o~so3i@}wK zpwkXA>#f!x;PL-+#B4pPlKu?g)@fY4!DF77&g7&6{}VL3B61ewV_U;ASf>$d7({i5 zz6aZz;N>=pIT*POm>}4e7ebsoB;5*T+PjJ>7m0G6q zvJZIt3THqt{ySgdoA3?lg)I09Pvtzl0PH4bGO~Jt!&|W2RG0^s_o4Zp1TkCU0AV@o zYnmcPfP7|2EGED=E6-mBiA7V##_BmXky&5Zo4D7HGKrey`l0`{^JZ| z9><$1xx@XnPy!{Kar4N2m@+}O!$l3{Ce)UuH~)^sBG^<_zs@MdRlm3nWFKZduY>liu0Pi8 z_(Mnv&JvP)BhLy*RS3fZC9cyt>x;o6@tl%E*iiix5X}ZqvA2UzrNBq2^EIyiYxyn_ zpdmHCIF136@0b9Bej^+Z6!Zhvv=51NYS!rw;<_mK!mmp{+D&++B39M4YCs7nE1p;c z()k#q$B=quKJaz7tB?bWKVt&p^4wlY5M$0Ta5G`=e=Nm+EveF~?YcXKW~S9<&>-eM z*PlZ_&di8*8R8!^!Y(3{0d{G)i07D!ibEz)I1R>srurxYC$g_1AH_!q*^&O2>;2meradoPj{%y$&;q;4=z=D(sf|et6JN4PVV#8hN4dMsg>74-a zv7Sy@E3$_ocxAGUhfI3YBE?2@EHjoA0q{+Avn!y-DDAAf@}YG(Px(L{~Uv~7?8uA3+v(^Go>PCQc z@_(5F%=_z{fNq!h`8+ZMEB#dbipeG@PFIvOUxGihABW15Dfg6iyYWTdW)04J8Y27N z?q)-Y(Z+0|RdJ!Z1y7_T^?v|EY@_a9V&grISwgj`t~R!Q6v<9EV1AV>AM`xFpObGn z0X{fT(_PD07PqeJ_Yc~PJ^I>jWXmuWuBFmoF$VjT5g{iX%Nfrd7gjoi+BJgTwaJly z1>%!vJJ{< zO_fU$Nt=9z>0df}1qjt@gF4lDb(iE9U%e)ZrmxWvY~5OEAAyvit`E0El8q^DS-uZKH zAo1>nfmAG<-!^_T$-hQU-XHPq#~G~3)y1EnIZ=WZZ6=X!(l#jW*r&vmf~79v<-0b8 zO^%hNo*-eL-Zl>l{X6sTH&IMq=1l@FCt8n)pN}X(+8&&&w*rW;1YMB?kE4Y%clm339Otv~nO}HIP@OQf`wa!}ApO zL;)$dDkY?GHI%4sFkY*hAvJLE6(>+)#a@xwVWU&u|sW(2LJg{yq3`?x8CYHa2ldt&c$4}|K}&D zAYc)3k*$5KW@(a$BE$@hR)2!;tuNnY%D)7L(aWJTJ zohTsZf2zYKSslMuvp&1QUuar){SWaVpBn8Kv220}@WzE5YcRiXa|U2+ka-qh?$Y5s ziK&7Cmf|z&(%mN5w`O?PR4p{JY7gPOEw5dM(C_{?FnK z$Zx5_(Td}Oa+f{5vjly$T~9Yp{{#(%+|5cd^)FHsmQSr-k(1hgFNgM2f5Cr6?6CO+ zq+xtm(Q|-NSDWQf0t_vt+{7!dHf2MZd)<%Ou@gcyG*C7U5H+83OV=*g!?}0{Nu{6w zPrh&>*mJW-RlGYEkP%F3m<81`fIn5{f~Cuxdj~4Wx0g;Z8jS zl{Vaged_AQ=NWX%tP{%0h?$ujETX9K5@<4(l@-$9ujyhHy#V+I5@3Y>2MUNnL$x<* zz8fYd6GE}UDnO!`Qi84YWA*qlg9LQvtVe*C1uTK<~uR)-%{EVTQrVGt5AJ#w_`UH}?1$>dCf!dOq{MzZ=a7KKf3b zx%wA;Uq)Oj_y~mbbgJ|zz@bT^(WMjVQ)k;KfxqO(ZAG%!U~Y(A+L@~ZwKT-NJqDoDK+4eN11LAg9dOj`onN z(E>yW7gzi~55QUAqlztl0PoqC%p-lI-niZ;tV4eKp4)6_%|bEnTIBdLaAVO?)P*}z zXLKjZ2vSkpfzw2`fY1*7SFc)jK`x3{DJi(GXjx6&;-m%S#gn~2Y)tYiQq=6IDqgqS zQDG;dX4o=*@e|R+9I0rnvZ|s4K*lpXW(cEV(I$q>t;{7+)5n%x3@ zY6(o#f6uV+c23ULO={SNDg+{_5~{d;*PO$0ZCm2=Hym1VRB~m0aIZR-uc3j|#!miN zBI+#5tjRG^>(2tQ>p3vs^$S_FVJ#2VsbFq1Nm&X}_nGygihY$_kgX6s-+7EBQsq)n z0GB1}83SB^&t@PsKC+g@Y0YDV_B;}a2LiDlQhN!5$jpO$Ttk8Mpn2w=>3G{!9af$m#q|23ooFGie3tN3<`7U^`s&JkMN&6WYjxWGz82*d zN2s}#WaG%6psPPY6q{T0uzG6xr_*T3WfT6fjgrfj4UvDyqSiir%*lG$D5|1}sII5k zxn`SGpqv6n%Bg?kqCbn(it<{ViOg-N);ies74BT0+EYWttbS37Rb- z{I#>8iGMMvj8E6jJ)?0aQ({&_LRX{f-~+e4qPtS1zhZ=IPUU`#Cq+x*nL!VCKqxQjW|u&W8<($PvS-XRvws zjYf34$>+|JO)>6ZSl|gqHhadFAcv;hA@aD7l=%C8aj%d+l}v^9>)V)_GY zHtY5^-erIzKKB6E3UT#m7?v0Bue#<<)nq&A_q#ew6+w6hN1sw*+~zg^yYIE|Vt5#? zXTj>=*DnGR@?o0g+W zLT7y7mimDSPM!IX+qF}3_eNJ!1BP2&`xY_&mwO?3MX}esO`r-~!YiAd>;3cSDa_D# zOH@R3{pb_?j(?vbu`H}BKQ*_$6skBZ=CUkO9i)_`w5hVc7AaMM)NX~fRVK7@Fx9LI zanI)je$#RddB=;Qckcr=AbS~mavj2kBsFiJq>n`p=8t`(JUYntDW57589yC7f6Mx7 z5K_mM+P_mT-pBtLVqfDuDk<=GR0)}?Jy1LNbX4tHseeiB`5>lPZftg5UGM!q`VN7b>sBMQAKv$}O$ z@@xXqP4o^k>pQU%uJZ9cJ~i|9m+ye^0@BY6dtR_UQw0~afVf)z<4l*Z_A7DgAW})A zfVgEE5(EVCV^g;;-O2JP>H8$^n_!8At>X4x)4Q~;H)8#fN~nB@g2VVUWbU&q=td`7 zs%DbZHTc1*hKarOxh%gjROCb8p0>%@Ix7{Tx`|@W6T8b&l~s=OqHCu?QyN}x7wCqS zuvZ*^a{F9VWFpg#Q1gz6AF4VFxQ$yY&Rc2D6=h#W`d%$#=r^W>Tx3=xNo} z=_P@Fz*b*w27t62?El6psH(GyESS7rP$>VZRkT4>E}1q10sw69q6; z?ME1^W|N%%-74jpS&agnCiEI^HUW-0tT`j7f=XTbIFfl)888~8I^;j22-^!FBcoy+zWcV-OD~C ze_0ma##G$SBEj2+b6eG~cRYq_cV8H9Ub`qeIw(o%anbep(+Dy0TiSAc^ASaT-9$sO zxU5J0!Wn8l^e-!C-x<1_$$Kii{BF#L=?Bg>D9nKYe(-V~Y3rk=#GQz6H%Y`t1z+O< zT@V|p0kJVzlJvZkkQ1Om;v#cDQlTy9Y~{ub*0FWL7LsMNooVD`J=>;D%c9w5Nwk({ zFFc@Qk(^CNw6Hw(rC!w_yW!dMXYaft3=~xbY>gny90ouC*1TSsYtDId_)W(K{W_;8 z3qkBgDJB0?J>CAewGZ@@r2YlU>Nb;7-e~nq^z3WmhQw!ZdL7z`*7NslSdaeoYjFiCRUx* z{Wm3j>|j*;RoswGvEAS3sg-y@T>FE9c9AAOtdTj!r??)n^vJl9TZk*ZiTx1?pLr)~C28OfWa&gxyJ2002_Be&=ky|F6SF zHo4GX)paI-0vQ0{RrHIGlvfFh*wgfk=cvEzs8?P640=&C+fd1yGuoxkdLgE7ke+4Z z?A`)akKNUWwTpobVKEWBeI*AxD1Kkby4#PdbN_t57k*T^kLi0)1GQK7nP-=_=uyDP z)c|maJfFyI2bbIaoPqN84`H2U3rVl-j$* z?8%@*!>d#_0+}xBI??JA>Z;R@qNcQ+CYjXyCRt?dr@D{6m-+Fyno8~w&o5&`!+%09 zfvc8NEsW-GT_JH2cM@HXqihnAQS2MyDW3ksgOm<2G-pt6C2Omg-b_vE?WK;OJn|Kx z%pl75_$^_m5MRyty&cDF*}C{i?Z)e0g6Q3|L6Cc_S9W%6UC^uZ0v%nvFXG{CegZ#g zgZ|9PL^@VN~3?_1di9_`1+zY}PEwY%kMSWen7sa~>;fb&7m3sIQSX ziteFUt?DwfosML(A|ZHdP_k6d(pjGHW!B%)nL`V=x^mBur;}(;;T=&_^>(5{EACvQ z7CF*LrUltp!PB(C$s$Wmy{|p9~hVOy<&5rBXI%wloggaaJAX3t1}xpHYO*N zi0*Hq$1(>>>L&BpA0|^I#JEB#yrx|kRJjr#6IX!2UnRDkKuT9mtx8q_~s>U5HR2#aPo+H^YMpTOycRp~R>4fkiWnTSj z{R#@l4u)sSJWpALTx7SL28t!sUGGz|9R{;l!J~6y8O4eaSzGVYW zXvP_rEQIZ{R`0~_o2p)o(_0OBHkRNMQU$m7w}Q^36{E zr2QM|QKl5X2oi3qs#M_0xv}{tb;ubvyXu$EU>mQU2(nAx@JN{vsLGNw6p)ULH^tZZ z(gS}7|0m43wK&4wgBDMEi8m0wBjibAL2>9w(&KZ)NsV<33u&m|StkWJX{fkJQEKmh zIreZvw;9ByLLOw;MR&8Tk>ti2KOI^35xd=L(^D6FqE*qr-3UtdO-Gn;xk2+y*R>=q zC&NJ&Zs-qe!!tTNw>j+&6sV4^?H*~U4UV=*>e-1>Q5oQeYR-rDOj3BKh6c6Du|~O| zi3dJf@5mknQXjok$aOp0%TTfJF`xD{Z47t9>GGyZ%eP_Z_Js&?{WBgPDqOx;$bH^EM#^`hNsUw=}?59~d`3@+pBS4t$_}tp} z3VAl~-~zq=Mr`@E-_A=)ELtUGC-H!C64O5_!{e65N-7mrSS7@|7Zu?SxH9~OJ6=Hw zM-5C1y^(Wp%mJ5k{(3Z8^+%cG&4eDpoWoxA`nsr03WA)FW5_7Z;a%JBCH2?Sqf07T z<(r%hU)ebvH0DduQw>0jzUCvVG52fmK8MiCq{|*YP4Sw*Zg5@2>S4cN0N}D&|+ykJgQBkNAM@5)_bxK`4Y%I8U_^WcaSqscHP3}6)DR+S*S;Q!+ z?w?0FTc*{odkG=CO7XLwtjTtUYrGg_UZzni&`DrKuain+tarhkDkt-IScrUDHyYLP zN_76R+I~E~FfKME5)uA~)V+s1Hn@w)l6FjBsvjr8Uw@~IPNoRoPoSL7Hw`z2=@lC| zOv;^PTO#T51pKFy$-F^f1G4=*F&9KrhG~R+9vEAxOoVOX$`7Peun*1y6+)=it_a{h_Z8I5D|Fu8g zaVUJknP{NqQ3UsFj0U3AWu+qJ>g^|jodxk5*BgA(UQrCag(UjUqCw6yJCBuUesJLg zg=Q|exA-2vzLPpGcDmA-Zg1S&#t7)8`g7hC$>(!iD=P;Gn3yM{{jTsQpT#YvK-%kH z2q4d6K4s42^l463nq02kj@8qn!FW+yBS&r_V$co}x9{|n(?g6{`-{i*9VzLIE(!LJ zTwDWd_S`dg+i$sf59USy$h+)v-U&+aN$mw8eyVa6P&H+v-%}ueFN=>^r*zajLB!-f z@uSQ%xQLCru9~FOCN7KMtCVDxVGz@f4``XP+dSoD`%3`+syYZnx~8@BDxbEtTh@qG zz7B!L*KTW#GuFf};2IfT#4${{ofBJ7(Yq)n5#@ zd#BkUpn#)wl%H^aP`-1yHf`vP?U|K@DSB%3d+)5@$m)X403ID?S}|}<3b?c+cvIid z%+&Jrt1e3m$xTnHij#I3#aHDWF8^olYZ%_1o10O$Dx|Nss+bS1xYwV!4Lyxg$xr|# z=qO_=L)KLPu+UT|XkSlG(7mPl@@D~zCy_b6`IPk?sdbBA6(`nK8g^UdYHQ8J{gK%V zmMuMGbW8B4i(AfMV|@i1j6}K}bhaOMqFw5<$wdw0SBNlQh=)X`Ay5g+VmOk3n1Dot z6=hPuV^cy64bz*IX&KS$<^i0Q0>E6@?3T!(j`E$})PlexSXS|IRK>;m{aLwxi0$*( zeN36PmFXo2V%>nGE<9Xbb3O@?U?=sdcN#jhY+9M4u)|=7 zq*ad7aD#psZ!qU6w0(mH5>7nFUdb`CkM@B-q{@7=v23hvaI<9r#}w;f$tNyqG;IGq zO2)cYzBTmh|da1h>1BYS3q4IcF0 z*i2lPN6W!2I0c&(G{;0@;rCkk&uC1;8k(DQE2NTp5H?(T3`#uTJAogVoPe0G8!T>2 z6?sfFIHmQe<7$ zlRB&`(M$ExB85<2Z@FJvxNU}G8b~ek{aZo*o$u^B4^&uYbEB%rvduP;rB96{>7^~| zfoZ=dbbZ3Sw>h(dv27`0)lPjS{=$|nQldVc#uRPc^$RtoL{70C>i4-1?F{op^!SFh zeTE=@Z#aY#v#aCIt5$i0MpkJAveWgw>Eo$u5sL{lUUej-A$^{V}={NK_z*S%cl{a$J`S-fgK{|iz) zkT&oyT;Rx;z^?wQPkvLs+`Z(t7|XI#bR#mAcLo5{2@|E2l;NpaPLHszKyhFFaw_f4 zZ$(wbN1gJPpP65=4~}9Fz-CQb%?hX=_UW~Bo3}zv!!NuKy+zHwtLj9T~^~+0Hr&qI(lV zPuE{hH+X*wx}Mm|G1r|Z##TcBdm>@LL*?NK-nUk#YkZJX+POD>cW7r2d`94;ty+-tbLX6eLw&soN{O~NcA*P0A zKT>j*A!Eumwa)-vJz9RA^QtAw!>0+n0F_7M)21po6XlI#uH*dI676EQP6#KaeF>^- zZ38u?EnT9&28!N+H?^r)*w*&TdKe(F*9Gf`ssd%sR%gTdO-IzLG%dkumypqNw=Vul zDG5Aqr?O_af=N1;{lI;rF%YXl<(lo6W!rOTQOXY{Rbe+*Ibc9v(Qz&WMd9woI zw#r3vyBQztpx#U}dr|uMYOb@7l{5N1QOjjMWGMD<`AOgR-WBi3I#o*p|3nYneY*eY z{b+-!imB^gP@Y}C9B;+c<`r$I|0Ai`%tLnIuQOlesdYaB0gzIZn!Qr~5&fbKA2~1hU~DQ09K)TgzM@pw_J5W|Gom+eQ*!qt z=agqdp01CTecW4Xur>@vQ1Dh4u~;nJE);gAiD<=;dEV(nwp=cV$vQkP(9x8UJw^oT z`Rj{60(fPYEGVo%<^!n2LGtG@IihEDKn&7x2v^*Q>LGYxN#Oof0)AGI9wHrb(zCVeuvk}<+ax# z%~5?~AL@Qv0O%_(JlNu6i)XxI+iD<{EyVdB5FjQ=hy~r^9Yn=A4q;}4@+VaLESthp z#96M0m|5S8dOU|tunLFTUQ)g)O`eblf2XKn7KM-<&02e4g7sz%Nx$1OmdI|6bXR8R zi^FtoRqf(v-^M)lNWh~_qM+@Mo~-jNbR+@shf>BEMR3dLV)1u6_IlvzycWCch+p_P z>+Dt#-=dIZxJAl!v%C%fq^~nXa5pnPkjb}S5UBv^a%PwC^jL_78L~waEq2r3>l*Yp z=BZ{D5VIk=;0tj#HnoaXGRcqD2I{8)D9pf>u0+h!X}$qu-+@LXuaN0})bd4%%37Qr zQx^P6{@X#|8CISPv9CvOPVE3fpk;j6QIQIq-z9t+Xlkh^xI(!Be__U_Jf1D;$1fm9 zaPFU?U$&!#l(eItz*fr|flVlg-X~tS!1!r}X@0ASrlp)AGClIIGqFz<-DVvr`*TIT z+`>cvtRFDLWqs_ehBjo9GBYXSnc;cjw_K~zY-(de9z8u0UAMM%Hsr!@HyDAh=mjPz z{6#y*fg5n&!h3R^VZjC$arrxsi@eAkB$>~hc>?)Dn!KTKBs7m$oIP~m?{>+uV~!44G#lx6VMV?q;%-Px zn%prWX(ah8xo24Nq*C5C!EsQ2!^(H)ps(>#rw!4SleStvv&E?z)3p;Ltth&x%W@7I zN>Yht0@rA|`r>XWF1v-?4RJn*MwxA|nSjs&Aq2#L@ox6x7jeW%c|_~fl>#4Azt%C% zDgby3vKwt(Q2mVB&ySr@t})k(=hWOix~Vk@&d(4K!emBk{6xgbX`odmDjMBnnh#h8 za6M5Q&+x@;C*J8iIM}dU&H|tM7_8dN=~0DIC^tE-=hP8NJP89eZ%@VRiIvK4CKOkc+X=7 z;kruI((6uSdQ+gsGkCEn^Y0)gHDhatC|Ds7GZbww15|j*vZzoH_#nWuu_4~F zYji{Wi9!6jau;Wmr_h-s8EAsfVK){40#vNF{RDt@HUb&w z+#k8_8x09v^}GeU#4)*Oc%p?2fRtBo47`&e?8H(XHj!RvY#YR$j6F+;P8*mWs2*jo zj(%15TS3FnKuDV+JUoG7*UEYK@n6WY{pxV>r{YIVY>Sx=?4z&)~LalKZ zc-^yFov1aDXdW+&$fbr($r)`qSnEdRWv7Iul?0s><$PmbjcI2Prp!|67u(+_;zxEAVH z@M5Vy!U3gBndbcJFcz^BRE92Nui$ipfMn-UwOCn()1%+0WL{VQBPNOw>0ln08($18bsUwiO*g(Ac45xq=E@c|a2%gB0xe*O7TG z5{`f?6jvU0m7X9*%TIjA>`JZiKe`pLeKbD>%V#x!1_u_*jTkR;8Zv{T@|AT@PFA1j zD@~fxW6lS}ta4@M42It0^gNp;tg2#A0;%PfnfRcOxfcWRfW&j!v;0~=&=E-!&VBR% z>;qaY-x_X}VF&Ev*xRbk7fpirq?Ils143G%UZA2%UCm3&3_N~Z=HXR4!vh1d!?%oR zi{;^p^_PX0OIcpe&Bgf1NUpGEDx*k+1(>a~JZ!nwn18FKI$uQvqKTdo09`h+PFD+D zu_NX9x1n?MzO@c6Pqc^=D18-Db+^oPyH72ve8U4%7*IqoK!&;N$TN?of~$2%oz(5h zk(Je){P3JXNot>_J&Q_^p|_`z?{GS-7-d48Ox(+tElx-1vYVc!-v*^N@CCY?qPFsO zQ;b8MFQ-1!5=B#2rx%oc&0nKVt6}=(7=}Bch3h)#&L3r)8g26s(RXug1+}Nk#E4z9 zVS|pe2R`lXVs%iLNbDvJ?{C@-6kgpMF7x*sLsjIS&mLf55dq|D@Qpk!OI!Q&+wXMe zv&Z>0wLTVs`Lxvccx7*FKH4P?@q9A|Y2%^`|HK=vRO51>hGDEK^5Y8kfwOKr?oGN> zn1p}CcS5Pb%##5Rm1x-uCc9;m06aDCsK=$vt%J97PRLJWj8`f-Ywuv_Zx5uNGR@H; z4nzXNRV+;egv;n53$7(yuM}77BC0M0w(DS&KSdM)9fu)RUcetHy_&a=_+UaX_!7Yz zKtuhDvpq;ET`0e&%PYt#?s{KvHteX&58_|G!-M5F+ay3Qk1(+6<|I6@X4AqRY+ik_ zX?dfumCs{rG?M&^&(FV=?VP0*VkpzK5~s@Hh)6s}LI}SVzo2Al7B#pzMZ1ktaApy`jIPy2h6UKiY=DljPJB- zsZzT}#~^9WSU(=<3Rp(jd2H3eI2{+=SdF!_+EXBjWB<;#M+=UC`~F!ZUq7_UGyN+G zFydu;X@t<5xS(4WqiT-Ts(EacJoftXaD7L@Rcy}Aw7$^vNpiED{{(-#+itcLh^OjD zK}SCck8Bjp9_K%mM(&%(iO@1wLNfS#0LFeLLA&_(5y%sSTF(_|7l4k7M3G9tZeh;TI3hk)Fk-5kqQhl9RL-5AvY4~ zJy4dU_^@p!YT_!!`UzsSa&zS69F9==NO=6wjW?>7#U-82S6+m86v=#URex&mdDoFd zpFBFIIQbOpZ`q6$cq!>*S577ckcKUOX!jecv(qGMx!7X8OFLn zZyI!1h~O|LA;>ypj&GHZ-qni|%fAL0CJmYsUyyFY}#?>ok$8@Ix;o%T&9E`!3x= zEV&kuUqfm)8g$hQ?_Ao}VPhZE&yc#-RzqUWAkO->3Ev@y=7~)zd{ubz7T$Y5->RW! zbZdz5Kbz^tcQ=C;nrjUN(L{L*Gi3L=kFDtEtL#n=mukvl5>DnLF0N=Za z$`CtNQXYS6@oK06Kt&(_=JULby{IsKMA~p$kx|=Jtr!4}ZT@1q<`=I@nc|zXvhGX< z*jUbYr|^Qi;&QUW;swuz!QiQNwro$T$EXL zo(EL~7z!D5jB^wesKDDLY7qSJnHlZkU3%FpF6W_${?u&3EnHRX&;EU|Yst7`vMe_}C~&t2SSuJsqI?Usw?HP+|{D|lUHf9yG1mEiG98YtDU z05Nw-KZZbXXnnEu@A;U*TW z-SYy_6#grFw4>@2XrN#~BY@0b&x_`gPK5~p2N_K>D1voM_vRdvbSoMxu{v+8S2acF zDA-Xh^Sif~)%CA|Bcpi-_P2yXnH2U1U4KnfQSQY%(VMZv6Y?z=1omI$w!-0piWZA; zpze6`1H9bg#$>Fhyh2fQ9A(_W|7)b~MNYnr3;bm+$}B<7wXdQ%CWv|-9jlBiJ>}oX zDsxX$=nIZ$U&u6B;x=43h1pRwvj^Mx!hV0Ud$}3s*8LP-$QN;t{a*L=7DVWMR=Fcl z^E+)Uiq-e@xM~ibB1t9;@LqJlYj;`M6&#>ms7q;ByBP?4EHVu_Ta_f|owmI59~rt9 zu_Q<}yJn?D+DTbk-u$^XqG8MGYTjRrzSG4Ofrz(Ubh)`?8jOll--{Hj~ zp#y_Q7keFee>9J+gyMO7-zEr0Pr;CE@^D=W*cQwt_(YyJ<2#&U%It&~7g%Fuy|3Zq zS4E|72J5=EQg8vIyLz%NXj1fB@vf6(x|6(Rr^BY!Y9hhyaL4((7vQV0T5U4VzZjw2 z*Rs6Ki3};JxQTdgqKIsszaVy^xe`Yg19Y?i!y1TWFC>RFVca-rjVhexzHS(=Yu>MF z2n!3?o#7S7&GWph832g$C5Ka*oii!Hd~ELU^THSJ z{i1@@+sALeTTr)&FS+eT_I6HjYcT3nzLbs1 zu`5eh5~jyTeRK2};TtArigV#If_j$kjUlK(+|C_8_Ox%t3rMst7+8+>A(# zPUa7vF>ECp)A&lWAw629hFNyJ6wwQHbX}PxE2|XBdc)q93@_GvOJ5Hdtt>YY>!U0J zb`*7~$uskE1t%wGND+vwf0D=cvS=!e6mLWsfQCv8AffHjeYv$;0-;KNRrUmxkt!RU zn!P8mYYdLs##pCl*cQomQ)!62;mx^Q@J=YnXcHIPDsCh^OwsVFYKhiKgkNxyUrJA+ zLH{c5b~VB{ayBNBbI{0S9qePNdl9@A|#F&h0fV@n=wA zk$XA*QG9X~^R9BgFDu}WM*0^*ln9)WG3)2su4JR_NSyq7=IXQRZWkIe$RZHq?&Hi+ z3QMjI`=eVV`c+uok`#cv<`-8|WLmZ=jd*V3RD)|(6oCKv&Is(IglYJ;kNX3+m+sCe zVSlc(?e2wOG}Q$f8pwjm>O&qoAWb@d%$KqJqfmV4{j+eKg_Vbp6}H^4@r{g`7{D0< zdJ(6ac%e;?w6B{U6`LjGkX{@k2G-n&Q34&U>!W@9LBDt8NYUQLy*Uhj+1%SG3r>2n z%y}60ZlBFp|mILegJ+!Z3ZmF3pN(b3A8xWSQmN=-A3oJ!R7(axYZG9 z9?oC9m8_s6aq9Vu_AqZbq?4A1c70qY@Ti^(?LnXxzQ$}i-zB?emg1sjK0u|Fh3waw zI;x4u{-JWKSj8l~Jvg`F_3iohtKyB-w~B^mY65aE0KckrKy>z)LYvuohQO+hj1G;6 zYogpgx9M#mi<3=M4?AawRR8T+n=w$-nb4_U^u5$tsb_v?>uvNc(FT)AzXfLAy66AdHW>q0mmP3aK;&0S3H-D4ox>*_Olnh!CHa{1s7Vm(#Q% ze&?P6q&kEgKm;6g%E9JpCb03xk~WbXR}jrb>4PE%7n;aS7XzVjUoIb_40?x0FWpmR ziX%JDTD7bNcLpjHAv*{3G#g3e)4(`9=vc4^$k#cqsoDsnWVeN0dq8;>XLOXO+wudg zreQ9Oo*gYpaPqlm22(I`b0SJzF@7XL3DWtCxh5ejeMh}6`Y%eE0&Ghna!n}bPr7DN zV2yBB*ZKkmv?QRTtePN&It&gxqZoP}q}#`b@!o$`Z;xtiW&?g^v;r~6bP z)q$bw6QYKt^SE$h`Vn1|f|yXb9k|ld`E=utNUgV*-%!tf!MBY{IQBJh3v2Rguqm*Rw(#UezE7!rX~)Z9 z?q5ga0ol>H@>gH&sVKb+@NNg*TjZ1C0O!Zs{= z;T}g=q{^-rarFCr zVx;C*&@=j1P`c$fVH83xxq@8gF#B1~*U{}ZB!BbjFbFf8ahHw?+{pKkrq7{#B~wXu zwW6HUHG*bCYT_yd53MezW0Z{!gU;JB-BxRy9%I+?XJq!pNqi)^&}-z>dk|X_V;26| z-!UZ3^QgRg-xC$d0eg0+IOtJ`c&#kl7O6?AuXUrT9;M}7@-k%F4P9ujq?nO;M=AgR zPigwiURA#A#|C?8mEzEJs~Oh}VN0a<=?Rsh>cBTME<^gQjDhE|A!)Q!dK_MtBxDY6 zh^YMPtEx-BVH*I?X7jlyvS(o-ZE&#+IM1Ni)5&fqy;F6dwP{vFq1U8>x2k7wo+g9f z8mYM^aQdJ>%rK#a53te7vdbT*&2}7BWD`_8=a=$CNssE|2xvJ|@%p4PL@$2OO3fn> z_(p0Au1QBN>~Vu6j$8aL>ZLj#(5bP>S=FvG-?y2|yB-_Vp2iocCmyJHzUFH*n|=j3 z{S=5tK&;Z?I#Ad5PZZbNR-@vGR(kBI4HZ-QdR>0ht5HdEv&AwI2E2~Bk@>-Zh&LWy z@3KyoOx|xFms#&35}Q+rruqq+r-sbe^DyfE;-D*Sp(K|ks+?(uQ>X~7?U>#Hcm$B$ z5}1`H4LZ6Q+ZTZf;9CI)zH#p5-WIw~=`a|lQHPVD-0Vz3q0!W_-p80_$+2_dISFqmjctb$Ct zw$$lB9;opn2b~i7AG-LK3|h&`9q?Q);AZ6wTZ__54_zS2=Phe@Ec+W0`Bf^=S2n0K zu|R>G1@TZ>Y}O1S8oFLnBUYG(`)1K~@%qf9cyhJjvtkDcc;vnry}?yF$cuBUXGWRp zgXBk6hgiJu`D>-90ssLRg#t~Di}ghE1q%c49Xm3E5PnL5&}{+oGm^>qA%N;mh(A74 z?6SyXO*GFO(8@GHi?kgxYNC_OkXnv9?!Oiu%5i{b*W@w*+sLsQ=k;o+57?jL4w8o#jayDpgUGL_11Uv&%mFO z{+#ok939*L5u4a@Jt~3epcqS{)D$XYyzsA%{5MOT?RSCb_vaF8k2nC`ZyTy?SI_nx za7IFUEX;VKF0r$M*#Oibanrd95~efUsQK+&P=yDuU*69-dkc9FH|vTQ?*>*X6i4eY zG1{Pb_t~Ew&);3o%FdPay;72AWaY&GLM^nz@@6-Uz?Q?;MGw9>REHadAHVvXl);bk zTgvB?UIL}sws*kL@^5#^0O2KJ!`Xp2Puz7OjnCNU>%PRizj~TnMEC$l2iG--iub3oc#8b^`$}^RzciUj3;-$p9*8pJkXl%$4~v5MuZ` zEl8Fv3&B(#%x4-bHXL9Ss{|gPHPunkr%qIfKU}ZT{DK$;n$%RNnsdnT zI@a#C&saT`?LrlVP`_Y~u2F?HKWGnTqybe&bRcCie1a2o&QVu{1g@O3$A}F;NR*oi z7yVsSlq{|p)AgFJAT-J!US$zY7^HUYBy%=9}1zthoEdP$2jE}fbtVU zR_C^7Td~Kr$r`ysI^=zp$G&+EJsFSr~T-sriL+&z7CuQ0H|3qXK0m-`jFy@eUo%aqn(tQxYtJgIz z&GAw?jO>|6iSgF6Yh^^%iw-^O-)&}>CNY)->MkD$h1M^vruo3j6cbN+)taFCA;z1& zWCAjb24p4GH7)~=^Uf5*K&UPEnuC=3R;iKq_0Oj>H>65ikNyDJ{`!fE`iJlAqnlFu zi6QCyX-ROao$nRl=pA>SfAJ-)38hG(G65M7YL@JY*=N@3&7LhQti$YL8ENh*JCN61 z8>CR%3EaZtIJiB=Hl5bmT)tA{U_Un8CtizQ)u-pv1x2}B*xG2QnDX?4ka%{bv8Zko zXD{S^02IqW>jLAM-()SgSd2kg-q9oa50TRicMNJy`0mvjnC5v9;Jsgvx5cJcXo+&g zpCthy;tx?Lh>^330F~n*4*~#pB-Zr|@ zOA79Pxulb2mSj?UdJ`@~xE8bT`I{xc*c&+9oSF=f$QTEq){w*d4O#CUipS>kV4$-v zGzC0QbnxxpAOG7MlcnNJSTjXyRim0aBqgj=!!1|Zsvc;8X%ws=XBYQX1W}ujbh!tk zD1)h)T<7co{d|_ULHMcg*7Ybf^UxqXY|O<*=mnuV>!#GN*9N=PYm#xwPDdzhA)NOf z@{unT^K-yo+qxSoIVT^r;bD^cfl zE&o-I4LlAw_9oIm(;EVdR=tOWk%esPI!E6Gcc)W5FV_TX{1fANWU;+6hU{fg14&j_d~<1iFq_sS5#-Op&AC6qhuQ6x=MNG zRe)L)of3|x5{m8X=hb?xQK3Jkm2=xQEMSt}ZDI1a_OW$mDQUbB0PY7sNj$lh`n@j1 z#!GPmyH4-YsCX&lobF$*z~zhP2i|8Gbr+3J4-W)TS2KKvjgvOLmGhDOU@R}$Px!bq z1mb?dYUa6wL#Sot@>fxa*W?r0RMPN5u|h~ob9sTX>y=r7=e%02+L5cG5Oo5q68C5B zUg`4_AlBM022J9JZ^YfDZcykX&p0Ss_PP)mXluWPJhxmwTL5yhggicv1iE<W={152B*xp^zkqHh@!SH z5ws)cHsMPt(;?=v{T6+N(v4jG=guMw&%Th4kGIZI+@1LQAAG-<$Q^bu5Ygr}Ww&Fi zOj_ZBLJHwIFc5apaL`LM%Bjzn86G%=@Tg1`m6R$z_AqIzVY!s?UVYXOAo!uT%_J_| z&fCD8-?@bZXcvm@vyj0X5u%Q|Yn56Q=0)Uhl$MZF>Oz=?M0gLOey?)+3{&pw>@wjS z%Wn{9Gw=!b>&dyYW7J+&XRLZ9UeeqcLXg;SpUSnTH7O8opUNeCXjH9!CZUV_3hES< z+!gO=S0CgGJj0uFM$erDT)|7VtKB4&>MJ;5^E@n$nPKz30Uok5u$~dU5&D)I9WM@_ ztBI;5`CwkN@fvc|t&G9XOPV{Y?Ga-a)oKWTr6>!GKjwPa;fuc zZae&)6x*El384l9pNs6*4!=73aDu|YDHOeak%wp9iCdzJGWK;U{FMi>+U&*q`3m*E za5yb?kl-Iz6op#IO+lUM@2Zzf^3iJ7&Q^R}SeteF2gq4qecYhM zm1H=Tt=~8Pztba(w=Mqd*H|JWx}wc@xsAuScZwh#1EF;^QL+oF%)E_^izx*oz@G~E zV$hQizv@etX~4eVGAH7&f&PfjCognL(ha10oj4X~Dx!<4L}_+>6xvbROGz3VM0TFY zAAqKIZ#v}e1JvrpgI9`LUKMloETo1{bc9v#aYR*n=Kzt%>(DUABJrI~f zW*)B(*?i|(uGDk2S0Swj?PzPI@8glcXxQ;fQ#lUhO#6TH4l0@cGxiW9Wf{UtUtsXWl1aq@wRyr_> z9>%Gb9DjcBSjI7Y<{4Rm3FFU={rb@Rxx|9<^>M(`2!DNvrtJn6jjZoR@t&Z#YP0Z~K2(2X$`Rl{Ll7PlGWXk~oxh=Ds z=TfT2N@1fD@axoToIk8J1rd)Pu6Y##_`kPZpE+@3k8|HVjW0!}3ysdSaoWwP)iZ}5 zsj@_@ciu@?7avk~M6&t25IWj_uB&qzA@&~A%T>l?xc#?w1K z)dqlLANNHC-xF*xX>0)?Cr&_4m-^Kgd{8txz{LMNpz>CoGL9PBw$8!mKQ6GEJPy!E z!Nk?ddh5$CB{BuO)AguP7XV07{XiP?_$M?ZkYG0tt)W`&JKc zqQ9q1U&S(lzLtCyC2g(IcE3W^9W0=1cMr+R7c*{@>KR6{oEzUdy>990w8E^k?Us!* z3CX6DocjCPa3Peeyd&n*s{lnEn@P*c=svFsLV7MarW3J5ZK-8-j z(tt9Tc*$$b7@5yvT%RJ@Ow}Z*HXZ5#T#L6=VD=RG6DD2ujwoQ1+auKfVE@GY;D*Yt z^dzQOIW$k;uFg~c!oPTLnFAvv!>WBzs_Vt6rzrWB+s*{tu98QHB1N>`&-R;LdjshF zI1+9*^%eAI*7%`;2!?_!xSVE^E+72z#GwY?8O^X@K$rm_#<<NsxRZ@`6v5?H|&d^e{-r}B*k{0F|Lp>`cLR2aUrsKi$ElJ2X$Z9Z+{IiqOtuNnNz z5%G%f0sRkb$&uvY>P4UF2w}BT+O&Od&km|8J^O+&rF1S8a0EHS)`?P;c?2MgtjF**#wqMl(+ zD^k)H^xAk`&uJB6^xRcs?ZeiDnl_7I_A{N3u&4VM*DL+|veGCGDd>zozTE~CGCXGo zrU3_Hp%vbw3dcjh|x{M13>C(d7YBjI;%T`lKm0oIR}MYNtU90RVY4GNZX*t zMBSsT+Mv>gIbZ%4fpqvWXLdKpJYab+)tOcCbC&gDpNUXTG&nMNefso<%IG7Q;29ci6AaQ;*RQ{r&otWs=Jjp4phglID0JawH` zhA6GMV420vKAy7fzUOb9H>44x#x)GCG)&#{&J#86vQQ%x9>n0q3rT>|qg-O#aW0wv z0nM%8DqVvlc-x>Y=TCq}I|m8!LCuy2V3ErQ>N7U-ou?H9O4;593ZR6jFTQXK1xXjJ z(LIQQ_Bw1dUPQI|GUMt*dLGbv?!}^Wu9&No3pRSq4nI8z zhH~K{iUUb~^|}t;-wq&pk~cklOOOzW=bf1PtU^lZa37!SidR`7n_|~6@sm*vqi(S< zI}UF@`-qiG_8AkJ zGz~^2)T@2PkCXYBn6@g768Ikw?G8&;xrmNfspvltXgm(;3nWnTZWRZfSZR$7<|Udj z+9Tsxq^3d8Vh1rL*0fOcOQ#h3Nzm?yT+3ZWDOKj&X8j*Q)m5hwSnqZqapM1xig4@= zS>Bp(m`rumlY_&Rj#U(DiGVXM)*{OM|sUXa-9JHMUUD=+z3 zAWC_K{+L3vo)Ea6*SnAiQVjCt zDyh~Ym{~H?OZWD!XA6CuQJ$9Jb2;!#rc_y>r^t$p9g$uAzEXjQuF@_^a~&@~HH_Xr zm@k?cT%NK8tr!jh9Ybo|n$iNi+b-N+I6Ydm<&{e~_2w}0xj2xO8CQ+VQfN;x5 z$7K(toQIj-$w{Jr2CaX|1zVUg2vau{tc1aOrh#Z*Bhom*AdgnNVT+$1b&i_jj)NY& z(jS++;HZ@{t0A>hbZ3}v7;}=xeHfG7$2ll!%&%ywOI7Z~PvJs?+o~R}($*{TDAT#F z^64YG*!AYmJX;VMFtshmU@q5d)Sgj7Z;Hm;p z<>z%eNWNdQT~PaOfLyrfp4ls3F>w%mD5`(cfA+(C*~A4yhj6+X?L+NMM(8Tn>!x|5 z>xVmzFZN8OqyaHvra-JYjYan^|xh;Ry+*|4TjM`VrI#bPEcW^Gzz=g*2;cOS~vBqCJvpwh} z)S3fjH2zUbfzGbH@k_*0d%oj@D89aeCl(&BQA%W$F48q1#gESVG~rND8@>8=TL|cc zN}7pU>ohI7{4q90bPlRB6Hmw4{XnPCU=vu@*b(stlcpVLsfskfw;Edgzk0ryhqz9S z>ALKP9pE$0#DM;5c|=hDJMTdLbz*o>A(j|U@{W3|VGn546w56hV?S&Uq5T9mYFB|? z3cH?1$?!cHa~b|eUwqfyaGSZN?1h7c=(8HWy(KogK;jQ42ZBmRyl;)Jg$mT(B&ezQ z%bQlY9;)`0M+f(_&i>k%u0-%A^K11~zq1b+h>Btn8lSZ`!0cBbh6}VO-iHF$gQQ!Dt-s7`V4yjh?_hQ~*1(Wg0^I){r*Me~LKn*!`6% z5(Dopd&jwUb}fPu{(P}HQihV@(uBIBUYc$-YZY}ZSWMbgq(1!?+$kE@QTT+IJT zr`1}wil!LI+3$6a{&N@lk!nl&)_cNlUIU%^BvmAqBCuO{gDx6Td7@IDjkxd1Qx^DF zL786d>Cgx{S~Cwo{QadbP#-i|G^L~GUTR>2iej|I7;v3yvY3Aa{nTzPA94-8#J@7X zTy*f2>q@+@kN%Nf=Q^pHO+?FTzP(ai@U!!To`R#6{~@AbmkO2z$tg;P`U9;Orubfr z4fEU~HO}S{u2?>Hom@y6PCjJGE~Kvsq`W+cR#{8EF{Vye{bEVDf4ZXwiE*#zVj=H> zW3Eb6cSNbb->%g?fa~oJ70#MQLsn3QRvsl5!vM=I-`FvEtkTapv-+VCva=@Hi+Pab zD*|vO7>_t*0dGe_;Hn`iUtjv_xwU7tRPeMvRD4+&em6JzqLgI=CH~%eM;1*L3g|uP zcn$)4eJe`1K6o04iwNSLv}6OopP z3?#?`sH690!j-$mC~mT|#fuv@MA(~ExKyc?tB$Zf$?gqYeKms%a!R$ zJaoOv$hlT|x$RqE%~G50kQR~b^59&?B9DA(8>=4w%1F8~iJ{QYqq;kg}esokr($-0g@QU!yNyqe2~#&b_=3WnE2_i%rJx1LjkORdfC ziCw_Cdw`uYSNZ<1lVuTE)gJPfH57$iA?D#zwZ%axp#sBY4*MFQGFUH6wZ54q5_Ls_ z^D&!gKIOGhgr?&*GeiT|KG<;zQC}JYQR!ngAunqNb7bb}vQGfnyF1w-#bXgOon1`=Q7f; z2+dtzo?i&sy@gFn_QdxE7yU#nF_EC2n*;Wg9$4g84>H_!$fgpLa}zYL8C+$Om&BZz zZueL>&7tI0%T{O?(uE6D#WYk+*7x#fu7kSy;jCnwaLc|EB_-hwT_{2|n*Y@x&LFJ5 zxC|&Ychvmh4eKkq2;7CC@2!f=~8uZ>^NnS5(?`<8h@ z(DjVZzV}Eg^qL#Ie9rotJfIFh_RePHOH^$*4!0XR&FdTP) zvKLrj8mO#=UyudLQPB~FlqtS;a!Nrrh4ZyR-ix+&fFJIba)=Xw(6CouArxP+CDQ%= zC~f@v*N0!;YO9d+g0Rxa@?B&WEQvE8exkifWuJpRFnAJshuhC)>*L*knzA>TxkiI- zeUgY0P2nsRY&$$oWRR>B?^qr1@lI7B-g?J_j4wZxjK!p%r>1BM=Ec5Dx2Wz?gxz_v zgEtiU$rerXJU(oUJaEc7g$zG)XaE&LI&%2ZDm$GVQgygFiJF-F-uqfcKk+7cu;V)s zRr>(-Qj*Dlutc&)aJ7hb?!M%X5@p442WSJ<4NH8G`VCsHogED^DNfZ{0>(rUe zfyE5Iq4g>Ul6*YfCe;Pmot!X<7G=mW4^YA_QxK(TkPu4fXKU2@FH0IiH$6k+*~Ycb z0Mqcvn{o)?C#=bZ<+gck&F}`>MvW4lZ6$B&c!l<;73xc7(ObgpSZBYhgiX%&H$z=C zw8Fz*Q6;e(c6}zm*a}m1fKqiq8Ul(iuN<2T*n2k&=asZZM;!&7w+q-Nv z=M-VFQ`;G)=SO?Lw_#A@@2(P#hITKMRonZLJYOEt%q`ZdY*vHRcdUITgcQFJBEw~} zNA}qyzgA57c}H^A|*w!!9lwzyv9eaM<^5z6^ll8k++In*Y4s zF$GKEpD4kJfBLm#;9fK~Hx0ICo_t`>`=)n}F37qp-g*p{xY#4yXFMhunS$9glfNDv zI^WzLm?FEit>8_0IkQ)&s=?;8x5-+0JDTLZKY#JESCSg*eNo!Q7m_*+R+uegir(Zk zsZNPrRLNQ*Bp}!+2)AS!&-(Ez^m0>v@Q3%|yjR`Z^mR5apf$Wj_pDCnuCHrr_*C7} z)O|$oYhudu9zAqUyDDfL^a~lSR-bc=IyG(m>U!RFAqTnUEg}DRKs)#4ECE0HdfBe9YZZi!-$I~LW_NGittN697Zcny+8_iZG_ z_pHs?Cd8^`Ltxjx4sk>I*Sc$B(d?VK^$QAJ4`}5+-)q}=HnX~GYja9>$rhF(VY&gY zwnQWvWVE*hik!XEd7+G6e4EI2Gu1Dq?&{^T~sXl-PT z{;4t7Q3y(Eu<wlkzFT+^GFVlcu?2OB7)e{mTP78d@jBg38@7UQe-`Bchrk}@&BO`i(?)W+X1M*LA%LtDN zSM~+kf`CzZWWN?eHI~^?r7q@6ucC%P7a6RG;7;KB-BpF$vB`jJ1+9P6%D$bM{z7oT zfa|K+)UdVWqHHE+$&6l~Ul2tKnvlMu=P_!puuDueKCznhtY;ZKcl$HR5A&l%^mP_u z@4-xK6Rp!M>%@ub8Um8{beQcf&g&lbp;eS_^uQ!r zqB)Q`qa}Af?*ML}WSbodm&YV^a`Wh9 zbTu`&xy~D@=D1Ov%Suk-@`5J_jqiSXSF?UrI}s3y5fpXJT%uFZgvY*NMsKnut&Rz^ z()=Y%ZRF#&-({Wp;{UTx26CT#RoF8uB$eECtBFt6`lqqr#cUU@@50QMzXdZ`%L9DZ z^V@gT#>ST>7p5&DN->%(ye(QB+fcj9FmQ>C!`w}vO9b2rM;8V6b~>`|Uwnaiqaecm zP&cQLFDf}7vCAgVf69lexCapwj)oTS#&c|3l^V)%h>J`Z9$~uQ1sq#RksTONsSCc{ z^d;Z7^^)IT;SlV~QB(mKI_bFknyz1U)G&#k{BF#2g#7N*IB|AgbzBBeShs0kv#S~h zPl8q#87hU7uH$R!B`A~4Ei#hPX9&HLHy}7v?al<+$;qcetEIkw z8*@DJ4LZGi))sU^-|eE{A+Oe$Zy1<@Vo4;_>_2)!%y8xxD5X%IJ#GKn1Kb!Yy7n9= z{i^m3IMIFCD`4?N$h8wgI$DIR!DMc)uSEgzu%`Fybn#nqiJRA@a){IJ`PT<$vn9tk ziYjYDuSwzioNDkO{ttZU4ns=Z9QXcB%=XHzhLG0t$jM%%QTXuNT0%ny81QPkz~4qO6^y?4 z4yi?jU(lxu6pTeqaF{ks)4R%NQBv%{ zbkE^idN&NG<=E!j^HKfmf!G6;hE0+l-de=xMGNO=N4lkBh=pDG#hne~?{0a4AMjGe zlej=|>274`P@)6b@7Q-(6YVS)`TR7Jvf~pvg1&-mP7e#>wv9(>`_2f0c0F|%V^z6D{2^z%c15nolnUfLDBC!S#x zhh3R&77VX*bu$2h;c)yXRgoibgtcW*W1T$Uo_FwWJ7)QL1yckU*pY}ny7Ii6gtE4y9-FzNg+$AtLP#a3M4Vjg$o^?I-MPn(FElMAbzCpSJf-p!1e z+WXU+_wHp?$BvVamC2x8w_r&X8_JMOz=vWYa344S60H@Zx zt$(jOXYG_2v>OuXusr+Rl8u>@m$;5PU$QM10f2|uf){h@H0U?@krR$H`%a6d z#QMx_%~18P)>qn&Nm_Y_1Wq?dsDEzm4AVkdZK9*K_PlKp*!eGM>p`OWQwbJeMfs|H zt$CVg^JwMq(Sz%)zxt9zOn$BlSNEgT$1}$PjVh`4cmD;9U5d3rxAjO!K=?rOptIve z&LE4xWZNx$Ypx&#D&cjTGt%_^atx@nj{jBg>ocL*D;cnfDBd$D^t(+=E5ulYv#?Kd3Y$DaR@th6KE>$NWz zvCMO;cj#E$>J!FZy9Dte>lnCs=iEtwJvKslAD8688VW{+PkB!w#!zKc1E=c5rja2? zvY#zceIZ+n_UcX&{~9N{c-%m)Tlq|Q={x!gm$j`@+cO3u#nd_3fI(TCE26zuBIi!N z_l5m+n+@a@R%QJ?N@iqBJ2TBavLEoL1B6%9G*K~xTR3!5s$p@yI%yzEBUSWw zP98Mzu&{WJd?&aasYvodxF-&YKSeL-uoDl@zd;!=if+^JQSqGV>!o@@B3;dTxe>vq z8x5H~F+dsbl8|a6>hFK9eNw$|b{9$QX+Mwrn}|(Z*18wD3=)R#8A=-Xj zb`d&%2nzlXHx+4o?z50?rjgv$?2Dp@cWQ;$opHMqz&L*VTWCxzNh1w1g)ixD za^@g|%;W9^<@-M^jcd_xetW~2kFe~rh z$aN9zDY_+Z_Bq}65H2%DXLfz}-s1k@HL&{BvO~6l0o(ypN>VkX-UH zJEuaUR$7}lTWOaz*)+RNe=f&H+$n5R_!H#~W4Dv89Eb9(i=jTAVsAX{Yzdx4BEf^_qr1>D zk}4!EKE2ELFWej?sV}_i{c~iP?P0Y-D2J(9MZ&f?_Xr*D>eBY{j@O)N;Fdp9+A9B$ z=q0bEjnp&jjsO~4*VWk}9rqCubV2)UE)=rym=Le&*;Q2sm_Ujx53(w4bqTVUupt4! zPXQ?qYApV@j@g8UD<3zxd7qTqX{)wd>MMvzj2GdH<=Sjq!09#h_ca%Z@$!{!nS2ap z0CPR(A0T3Dw&qwao+i7Yi7t-9#K$GFLBBB7=i}bTJgoZ^wax;IhPmhID3^4{ciFWx zs>uZR^bIQJEY%@xu`=$GE6FwoHg?$+H_)~q8ZJja9k=qjcLgi>`p@qZTbF&F#7f@s zxS4kU8`dE@x0v_s7U@!vD7%?I2iGYrc}02A-NwJBkOfr_jqRlcaxr+d~(bxXJ5FzA7DHPK}RG^ZawmAZqZ-QV{4gb7c}v1%kFDStg1r^(1~$*25%O{=)4dR_Q#QLMY?PvPLI0^EPe*_1w-N65PHOi|kAFNN zAOG#aB{AiI1XmC1QUh|QZ$FNfXRHIs01Vo3RoC=j;O>JvqeW3ZeC+KnA`e>LbwSpM z)KglSo?eg>Eu`f|fy{uE&LqdeYpw3W>(frX-fz6G;8CUXvYxYokoa^DK+Xb>4?HW1tWbAkQ zVq*H-Id?;{-&^K+Z9f;S6KS9kf8I~}+`Yf7F{Z9lzj-D#hGfFO%!PwWshkN&H~Wr9 zk72FKxEK?hms+nXPD0MOrjzXsA7Zq-t`9r+#B(8PmH1o+VJlWLA1lKDVd{k)ETi(3CE_?p-~Ss^dPFPsht0ciCdT z$B|0!oe*FZ8~Yx6~1`MhrO>3ABjEk5l$n-JOPtXxV=XS?2%lpDZmD zc2LD0t^K#-M7KZ`QH|JGZl}sc$Lr!r(-ph_k(DTU1M}%MA-(?E*+V9L_tx;%xRjX; z`mS5P{L6}l0zq}5EfEmPb~$^wRsVHP@$cA{`?O&f!lJX4SFE(MyGT@*ZOM`|P&2P| zpp7DU`dOsq^i@qXn!NnDmnbEZtY3MKZ?dMv;zbLJY3E9rq9J{JQJS#U>i|Erdew%E zR7)BsT`75X_{SWtd zT{>QYuH?g2a5F7t7@Z+Rz#VrD=Rt@Z>G>dGo>Hn{jTW5pzUwEubEVDDMKXLsA-UmB z-U*`BTM|Fv?PuyZa)+$+DxGLV4BMh?uHl4HQ=#g6Z|@||Zlus5+nrIV-~*g+gS3D& zNW&_fjF5xq)I_qZ2t#_V-VrCSMtxy8#UBM8KJW>v-FIT1DV&kw5e4g-AwiSQ&)-4V zhySvKIE)MdK+FaLBw3fpuX)sc;w0@4RUI+m*>2-g>WkUCBaM~MS22U8@F=W@m8^#C zduh$-5@~LV3F}c|@pmAfQlT42o5?5hJ&RJI^=ub&uTn>sqaQ$fK=evr5+8rDN}I>@ zYBfSP;BH6%z|c-yD8`ttp#^Auicxxjna8s=+C{s%qjs#X7c3jCo(AO7k}|{J+n>OGHu1Tn{M7iKmGP<;o(rOk zy43{byUwJ7vyoSWx_~j*f~(m2s{lVr4asDX__(VZ=yyi*JIIV;ope=#E<1O3U9Cac ziMN|eeEP%-CE-8y3OO*i_&wY3J5!udwC}E7`tsy|nOI*@;09eiw)s{!W$q*suf5p> zbGkOx$(r`NyXHmZHqCzGZ6vCj`i`kX22!*biDLL;Gt!pq$^JHsa$(HJ#j2b(T?zeK z2?-UtA>VFyyFRXY)P0MAuZT<9bS{+ILL%J{%1S!38EvDFZf%>pmt~1IlvG~sMLNF; zW63OqKdJqg?)r`%qlwZtL*DHhFfT|Eei!Xx6+A081`D&JDAu5y8}t5^jkz z@YB_=bn>+s+$4YtKl$eN+#@KYoAW{AYh@>1Pj95Lsy`?>Br$Y@StWY-kH6xdc@lN_ zwoZn{e~dKzYrm_5`;F}O-?A^TuIuIHy1!@3Ovsf>1uJYd`Aa>@Bh|~2UfJGSPGT9; z6bD&D{wb)Mir5=xW_~v%y-2je&KXaW`Def{XApc=wBI_RkmA5=DnRvboz>F77}RYWI5uJ(9}@qPUIk{ZqL`g)nr z7VaW3TEsQuzeTySo9dh{t?Q#2v{YxOV7>nldzkVCtN7R~KcKR&Hl1;LY4J(kDy>76 z#!tIRgp;0#w`BtKW43VceRE{UrhA_RKpM*3xC{3ogs&;B2@9aVh~g3%1B9U-%C12w z{E?etw48`BEshxfhw%K^djkF5K=kE$)(tH|IdxO%kMM*2v0(;-JQgnE^Awm&z zoKHbj*&3!dKP(|OD7z*}HxGZC1%HpkT{KO9h5c%43@1Gdu^lLngGXqcy%$Ct8=Sgb{Lm(<@Vm$2`2UC{X$pJD z#~PFt!C49#HSynC@}!9AnYeh)O+gNnzQTjMJd~h(2>aPS@uyR_ey_|M;n;YBf18=P zmiNaex7>%s7~r{Rh)U=|_0PO$mm=C9QtX?-Vg_;dvFk6wt_cmy)_WH|O$ER%2M{kp ztAe%y;yHU?$|NiK4tomfnJr}dtTd*|}VpR+L_=%vveuVvJbT&J? z+3IFa{GjdTe#ryibe%Gg*)1)Fy;Teg{p9sG6BT15AVP7ZoF}@MBq$yFVhIfaZhO*D zmhzS?yPs2qSo(8*liYb61h?Lnl}u)B^>vtGj{8af#adbn{&swJM~@DDGgBEA-1%2K zD&!@m=Xl?$RO90L@-jKCQ^nV3+@G}`TT?F_3uGX(K;IX!i5x(D#voZ?d zZ);}p+PlMITWGz~4x;!?UwhUcSMf*mdzYTb7Q!E)9)yG~nFUu4O9SBg6WUz1^!n4M zh0`x)@@gDVrUt6)Q%bRhVIPUUNUI7@k*!3WcNX@W>&KmWZ{RJM84j%-RW^=V8aXgZ zYoV=uF*2j^yL3oDgzh;3Xxtgy{firs+tCS|HM;2RPp^f%o3^pM0sQbh_CD*`ImeJ~ zjivG42TI%_1U_$nQi9)YcT+bcR=BG_JyYvT|yDlE)V(Wv(z?vNW zn?S>+9V57!Ez_{FpVXgKcj!M<7j;17;;deIIJpxrNEC`OH+0Xw7XROa)CbY(TY$F47-rm0!q|lnV%@)Txmb^Oo8mDD8Gb> z2VxN<*Wqk;dObwWa2yo;tRj3TGT-wN#!-UC+FC-d2NLKH^($X147;Z)kTGvbcm_BX*2*C5IO(_c#p`xgz^_hv4%@A`befF$&(fg-((Dr9mPwzzRMWiF4_dlyo1 z*L=XG*1;%%wQO++0AQExzYlu9YgR&TwR-qY7fszr^UZtgIw>u8#VPZ7b(=}=>#Q(U zRTfnqcgqT;M-)(6nq7Qqnl>Pbubc43CLXc}3469&(;p7$JZ%IG%BMG`vnGU{}ICklC!xT3IbtM>M zL&@hvYlY$@yDCLeuHopX!ew53L9xBUC8I-XhC_G;4mOv{IJ7^>doW}!oU^QQsA z^AzVdbC9dbnzFB-+!aIm`Wp?Im%<*EJ;eAg6c0)f10Z5Z%IOclm*5(a%r}|;!`~=z zPOkpL17ofG1J@H?(_`v1MR%5`vrfCRYYYV3x;h$EfLI!Cf6BPFSlf}+BiC8zd+Yy@ zbRKR=_W#>AO;c0Ll2TJMH5Y0w+*WGN+zPn&1UGK8+!ndFIC3i>m;<-v!i^Jgo4H3? zrq-Qx_kFmZ-yZ-Rzya6wdB4x|^|}*dB(_x@X_&_-cz{|~wpZ+wNwsc{F*4s>wv!=+ za{IO1rzxheRn}xtouunb{4bC*?(+VP)3rdWi=t?4I~GVr_sC{Dkm)}1uuL_t)ruKj zo-ijt3X=jB_vGz#a_^(=I9u)zu9|+!{DSDJM9OwPnX-7ev?^nhe@6=sRQyr}3i{VE zca>ne(3&3x>Y(G3vpa6_siF?}U&ezDre|OtC86LMBf0vYPFI=lzXHX&qf;|l~jdufvX`8L`0zR}XWVFd^Bl%ddJ!dF1q^M#+ZXpg_|Eu&LPa}Mm9??;jwXKOnKT#;aLQQ!!L z{lieeumP~fClu>YD*SSbV`6@Xf zTZ3o2t4=bFKsA9-JseqiTPP$_G{?u({KVNvh#4*|h|G9M#dj-#tZ&$nbM>#dDx+yr z$THdHdyPs}iz4KF`Jn(M0AG|j1V-PHCcA}`p73r+@uK+!yG?$(ecv@SNJkrLaI!OSM=6Z8Ux=d)CzbC{ggwVY$G!uAXo;$j?ee z(%H}BdY8qN&Q%Xou|)&1``#8umh>akAZ-8+JZA9;;UPe8eIu6WD)bL8%&{enFa@c8 zOD$7`)$#4|!j(^A0Qu_syheeYmuV9#5q*%7Qg|~e(?b|X(RrV(_-7-Mx$zzy z32~qx{zq78X;mZZcu62vZ1v(I`ba-YpG9-GH4My`kP+xFshr__2KT!X+d<+VIoK1v! ze+#c;+2G!p-3@^4BL6*XdMD{Q`0H1qp&QAc%j(OnKDRgjFvvst2FWVZAPh3!!6IYV zj=_is?S#3(G|T39#KjZ9ux@Ib+0Mma5p?^}Hxw1dJy(c0V?L}ld@(Zdt`<~0+DY)R zA1Y^0IkSInV^^(ic=5KePUv;KJ?&uo2qtUr8fa!LWDesR5hAWtO7P*oCS3n4E(@vf zql(EF_3q2dxR&yiK%!TbAi!9(A8gnz*_Z}2m*3(TOsSNA`xJj+E zYV+^L&V`BUk1b?|FUhfkjLQ+P8?fiV-V_z4 zngpD$G=+l9GDmf6V2GxrYwF@yYFG*C#D6W@z!%b@V4<}CWx}IXvd=8uM%I=J7#(iS z;vr}+{-QAxa=NHW?cJ=A%!InTqVz^kEEKqH$~hjXebu9R+Yn)8pdgr0%|jE4Q*z}u z*Wgq`k<%oQ>0T8~93%Wr6!4aF0I)1e;0kTW@BM-_`X}{bcR2|id!4H(Wtk2UY7>(P zhkVRH@kxW~$5!zrK=BEwGT7`9YI<%ixUfE`UI`y>Y`ptE8^W_Rjb6@8u6rJ9GpleH zx$D0@?g~l-g=##`c3W70)n=$HG+KExH>Szhg~dw@h@hfSKY&&o{0*pyqYfkdaJ8la zRC?vPp&PP~ET8KfCx<$B-}yPP z9r+n#udd9GaQJ&eHd05I)j-{B@7|DinB?QbCsKxB*d-$jp9a6}$1(et%4rSdk~*bi zN9$@!X&{ZgMJux6XrFQJR#B;~20e1dHiF8}%TRToIRoRd)3>4D)w`~2FD;mDD^ zpka_-@W^I!!n0ENm{s0|$})$+645RVGAzH3i)SGZt>>HuH4?<1y?G#r{K!)LFD!vt zEM?h4?x5fJ^76di=l9u||MRn6RLI%JYY-O^BJ?%XT{=Vk8)Fi6}QQoRi=X>)uvB( zYr!-Khrz(nFFYwJCl2B{DNDFJ)b?m)?*sxW5v12|>O*qsbptCRO5rwEBb@cW9tbvo zMp*{TC0(rc9z=ULInZxn-!Hcl-PTkYwyHxdhH8jns=T~Club5xd23O11dcF)?BzcC zf@c~6rr)*Mp7TVo6eZgJA8Ec((oGd^W-G$bUT(fpqDCy!D0|QA9Yfn*=O&@lpqckT zohgt@@XU;hA^p zqfxF(?MLa`2GnF!Mi$Hk%!M}f=4t!Za3*&wI0L% z1VP>u-Z{%AQ5`KNR1tHU4hQLg!;N#ZgJk|NOV0K?pRp?B;a3t@y$FVUvX4M{v6EUt z@k7)B=DO2%9MkO@$^ z7tBDYutQki@niKte*tbIBy3Y!RKzT1H=B|;>z|Lvvid0m5>4Cfa6z9Dl0GE$+$pt> z1X&qC?wz+hDbJ^6hV4 zo~eXWFn$-bTn4uC?e3gQlS7_)iin_RQFLj zJm#H?bT}qGlzeI_AsuL8c`Y0DaFPEZ*RZ^WO%+9O2tl-c?LGviA*L(%kJDwk5_OL0|$$kxFsgNg&s zh%jv~qJn6mJ-C;Muq=|)VCQT$?Y6@Her4m##R-x>R7D0(k7s~=7Z0HBM30gAeGPja zz|C}ij!gU(*g*p#X~&H)5^y5OU*%5|GbiujpLVt5!Z&ChQ%V-uJwntx-{OE%tqbpN9TAb&8zIUOfwJE(cK=FTS8+%yPF9cg#gVuG>3mP_TrBhsh1stdABc$X#YVN6?A`F?XaM zOjuoPFi4X!;|M@^F?sO5W@yb?y{NTaxw70U_}Znbvhb7U-&$8%s{-c!&e#>unm#SX z=SNIhZWV$rDX5>vQcU0p$#zjpMVqoQ zVUo?S;SilU7MjFF=Z6Q>!Ez2}2)2(h$z9eh$Nl4Q&a2DNZuwDp8-+OJ@dP!gMr?-e znfH#=YNOMoJ-QE#jBbur(iwL_Xgk}huF^RueqOUPd^-g?XbpQX z?eXCn=;d!!ud2;p061S=6tXJT-<|NAYQQ!7%p!*7Tb>rLhDpZZHfb>JA;F$S8#S{NIPSA9eSk`+DB+H&+X$cuCd&@D*$EHVv3I)~xF6y1*|@1^1-wB{K54wm(7eVh9$C>-kpc{6T?hJok<8A-`c#GNT`KR!I9&=H+FNr zd?X>V&)d|;m1`@>Xvr*NLjyM#?N6D@eR^av z0vK0bU6yH7TBa8Rf~oSF|8(Sa?Mm4Sazrg*#x0!inOS2m$?hSViY1f^Vf{WI&QJdy zHZewQM?0I|L;ZAqI9e{9+-+sK%pmSuj4)hVoC_mF%uAI_#=&p`aZ1(HB&QsW_`b36 zvoU6(vH-vmgBGqIe`GTmfgnYlljEEp2riPovc!Vn{z=2@^-G%t7(V@ zP=xT5g2~7rX6^iFCj%>CNIMgJIfEbuF#%#TFNwH}}1< z&o!L1A4;wM2|@@?{E+KO^Rlv=P~;amGBg63hAq|^MS<~2vAR5v`oHIu$w}jiOZyfQqAx3 zUmx*`5vC;Bt4~w|={T0@m354PH23t38DK*UGNzpuHcTmat)4n-9q*)aQEw}Xn4CTj zy9Lb+KoJ*^g2#Hs8!5P&-&rj3c0^TCvDEG7RrmrEEuqJTw~=pM_T&%6VMZ}#ZDBq$ z=7LxH>h^`f3XP?VwbzA)Y4Pa3+CmO0YlxskynW17_^`@Hy1!%Xxqd47)IMs28#Bro zh!i@;fNB-V)Z1D6Z{v4m`=#Me3|dR)`}L}zooff<{Av)o{XndrK#z)b&dv?b2L>pU zLO{zbGxH%XhdSvfCs?ro9k^&V+cBRIZYREvG@f5zMjs3V#1P9JRm0Bqbj&0aRYrPW z1Z4=MvKel<S#e(bCrV!(S}+Rib|;m-yGp~b^KZGRFeS_q_C7TiVq4oX zx()HU3DCm&j!2Ua-?q0`=9|^&&p-ybY z%;>AiFX1(W^z_KHK*=6fw3gX)|J^d|X`C2D!jh=R6A0C1rh0SpDv|`M^{JC|Jr`AS#%~IBb!YE`Q&+Gwm`?hPHQGeM&%Ye6$7+9 z$XLI6?rM`an+9xZ<(^iWHwpo5C0v<(w;dOV^sy+bEzIFrAk9;+E@4C76>ce_Xz?3r z?3sGP4Bcbr?<{Ic>k1T%#i;%*jSTPo2x6eZ4@vB;d2gCOn9&39$g#2PK08#<&J&qc zMm^Xj83tO9MU!$=s33R1+eq?;CsKbkpCfULqf1|1+>I(%x#~)_hI%*O6#_4lhwS?s zBH&bhdI(46ss4kZa*b?WZ-6B@PR?kNFwaZ^-m49|>!gg4HHI{d6nk_WEiCn6Q=iAX ze{4y&@qYIza#wrBe;ICmcLZ?cB#rAT0Aq0FzN@9VmS_Q7MLeZ+pQhpcz(6iv6f{h( ziVlz(EHi>DOs{rbEtRot1p&EO73N4bNj}Jt!d_S7Bp)8;{KhWWFw|dW$jD2gkQZKr z^u?kYc_~It5f|33=3F+U#@vi8C0^L^+}F1tomqiEyIhPALAmU!TuoaC$zMb2Dc*sx zfDahTy9oFmesO2%`19N$JcHAtSqc|_fvx*vQJ9+;UQCkvAhRE&$PH_L(T}$}Fu)Z< zzGmSjftrjt!T9Bndk}$oA6?N-3*l{MB`D*k1W*c7*-?N&x4z)NCd|bg<1jwX$6aJ#nrq}CQI)b={O|&V zNhs~V?5N#+6saYS9G8nV`xhMzdpOZ1vKS&iF-%YwnzFFI@9i*zS{Nxgl<2o4%~~SI zyWHs3n?xu8U7MYdM;x}jY(Htcq{%xXZYgeLvkv+FdkylL_Hm00-T1G>{fQUl#gx*w zxT4Yih3eP6mMO|8+1fX6LpzQ#jN0jJ#PaIb)Md+1pVB0Xp(&ryGb&?)41y_h06o~k z_W(I0Y-M|wkjPfUw-zEU`U}>Q;ja$#(TFwWplwav>X_UKeMJp|c+)0vRgQCFPRDJo z#HT>FgYs(kk<3GGc^ecTioxnnd};|uSeS!P^!sUIQWcN9)OQRQ1|84B2@-J?M3d0l>V%S_$ zmO*^RH2MgiE0kGfqvM}{QOnqa`7xujys(rzY5pByUawj2drZ>H#5qbOsO)gvrWW?0 zg0!7?(|IEyKBu(sykN?1Mws%DakSWBNuqToZDUQEQcbJstwV!CY-1~|B14yBV^IyP z!#HUsALeBF1TOQg`so>OZm#^2{La<+!f|C@37Z1m!%N4A64pTW54*%*is=i&wo9Ew zTJ=nEgDdn{LTo%3LDHcNBGCe}p$&z^_MUW`Y&gO}^}R8xx3*~HW~oaJLH>6u?94rJ zcF(3R1Up+9IO#3uJ8t~)DQIs}!3h$$jtNo1ZqxPE4L;?e1VI%o7#C<8bnhd~bUM_) zy)r~5t39l#X!W7DSn+4WmpPaJiIx;yHVA^EH{|1F{%biuRONrfF$V(b(Td@9&6G(Y zh*nFAB=KV*$ymICz=txlSi3@zrPmU|pokMfDpevZ~YY21x)v)4OHAhC>_ za9P`!TENW?UikjOxE4Tm@FU1|wOkqZNL~?SpfNQsJ9yV{e^geDen7obq{; zq_KTfZ%!RUdl+z^Yscq{6i zG~dPcuE}braEf_hU0x*@K&6}qg3@WB z3s0IozSTirw`tkD-=YI)=vWC{)aon8WQxF!2R_4|ySdv`c+5%wR~mL^Iw@*mAw zbG)-uUw*ci$2=!vE}BuVk4UeFR-l$<_o(r7p;TpDha)Z0TslzS)GE2!tWbjsr{3Wp zUR+7Diy1K7A}CF=BG{KAvUab72@;cE^ja0bnR z9qtHG-NnHv`vZe8fV7sX4}kJR7__4q9E~3#xC!^Q7@~E@c~Hac)B(3X`r@8~J3sW@ zr$qz(hDvKSabWQ)+bk8P7ZxmTCoodckTlIx7x+|zuhLNc6fu$E~|2Pg_ z_vmLbzUFGTgcIv@IFQcTC0|PQgRFXS;UlbeennVaaoSoCxi6q$624i@Yg`y{&ndMf zwpVT5MENPnGVfFazYN#Pssyb+qXU%)Re~}V%4quP_sDnEz0e%&KGXz>E5#6jYUUkQ zqd@<=?XG#F2l^#f^%A)oJTrD95;~*~gIsI}dY@-+mKguub0HCL|&+GtV{ zvcJWK+kX9M=%_RvIsG+1u@R5+vfdMvk6TTv1i%%73bAxMv%IB&Y)xM;dHvQmOOIh4F1xYW z&>fp-R)QcQEZ^)quVua!-9t7I-a_6IN%9))WYI8Ha~vA9NU<44Svc-)dK#lL>Jo;O&{x&M0F zP%>FF^TAHFoDPSA?`h#;e(V9`l5g^u8I)>7H6zHNqQq>Y${t{mI9sEz# zZ%#Gjaqa7$J`)es{o-hK=pCLZ)o3yD!nI9ZnSoOnJZa6B*@GIu5&R!bgP!YNEYu(^ z!P1Zh^fp!;&CHxdwV+D>o2p@?h?e9S5QqhrntL(!HCYSs(o^4?q$o$6Au8Xs+cj&6Mt5P_NV9*=?7giy><%R1o|qtqXype~o$VJf8@wccJ~8Kh2} z@)lsy*6y4HuOIL;Qr1Od3KV2vDG8ncp}EBRLVOa8DJ8YbTe`pPb5=(WpK#Ypl_+Qw zTXqHwVBGO8r>b0q)NjCdq4+c-aN{oz{>uehwmgA!Kb85A**s;I7-%7KaL6q1L0j;+ zbcUrT&Kf*rfaUP*;-#tBeIa!>)=o*S0^D=pmA1I>Mel5|@EWROj*0E|w|cZk=C6J6 zogzO~_`bJ$uuIm?qTSaH+)eg=-VfitT0u>csH^)(qTu(8GrRd2iFQ($(!)kk6eWUg zn@@E?*YEd&Iy|#=wOf=F3OSANLLX2**uHk=$ida&4a@eBC=>@ES+2ye`_jTadEn8(GdcW->S5PxNNWJ3GuTPy|+nxwp(2-i}0p6KKA}s&qji zkB_}jhtK(QpYE1nZ%cz{jx2(U znW2zbs&&K9(||+tDo7yxy&`#oVw{#*1jmKaX7N9Qs7s#4VnSZBDgwscQFN@Xrv?p_ z1|&zNaR2s^Yf@|L*uKQ0m_z^r4mK@D$RGFqiQfb5UDiLaTzEzh(A%`dDby4=W2pRn zyJIT>;wZ1!X(Nj`>lVQ(kz4ml6uE6x=$w4v$hqu!ZC(!ID|>{GSyqf8b`gJxP8*{_86kKQq+7;KQ&H4kJr)r+_s$^{G@5qxFGcT z(6F=wn@8wj(;x+#DxAKv*(WSjizlpHIX17-0=Xy+(c3&=DhzQyIa4Gvy?~;(B>yV?2N!Hdgo5tnA8DfGl(hg#I+4M^F9n0I1%1 zX&3Q_s?1_piL_O#*RF$8S}F|5%6AM*xaz2O-Prixy0MHv&Fkj^`8y79&>k4%a_P*? zz40g{H_5k(;#U;KyXZaa5tF&m z`)U-gqHcPdQvb>;#S=7daz*UHSUp<_9uRqE_}hdBD(e4}XSZ6h+ZD9``Fnns65M68 zRmG%*<)WsjI1Nav>=DGpu|=t8algIr(MBEkWcolW7expw>{YUCk z+Gyak?{U5F2h0Ayx!aq8v--b9KTS-^ugn*ADkdEV{}Wesu-*x3Nj27fv@DPw_e%Wn zivN+rqj~IcOQ1Msnr_~|U z-8vpQu$P?B)<)dbTX_w-XsoEn(wQkNKnTXD!#(<+ybC-A`{L3+3A7%67UT17x2ly& zxcgML*>$<`McH^q5-@bbMQ$Bi-5A2G?J?t>c>v*a^;e$)%-gS2(Q96)!|bJ|#a1Il zG2DbrVxda*PwnuIwTI$?Rk_Gr}5OS<}iSejGTf)=X>iH zq8d7?KNVeu7_|g{9)RD85Az-le(h*&FsS>*vj^GnJZ)T{7As95g0mxXO4FFtij@kgOI%Ag7PIQcm9nZ}m;z@}Kd%PBXQ~rI z<#J{v@6wh`N^n4~j*kfc#34;#`G?$~xHigO)+9Ta}6-R zl1Bf+2Pkx*&Yg48!X(L_Oxx%eoGA!3x~S?^hx=LnP>xuhDZB$Qx<#2Cjy2a!0ax37 z6OYdJo6+(6FKq+gHZ^)`%5IU&kR9)MJ-bWqGBT@E@L3-KOLJb|zrh1ud`JiQ*`grw zrR1szvU!)~)w^%?|F{7J^=%-AA_ecZT*5B7Yw}alD`R-y2nz(8rCs$g~X( zxv>cJok*PQh|)#}>?_uEwp{n*$`y;&`J$L%PV^L?k+-tFb161UTO3=AX zmatKNXHSulLdcwt%8JdRAba$HWZ0^~32(A9}C&iXHLaebWfMIDzf;*vQz2 zcS7j~d!_cr#D~Z0yCNWC28qFix2Z)@0Oov;V@zzULvq#q9O%1cwu{w+TW%~+k_*=w z>tuJ7Rlkj)NQw$LYiyj=iDrhkeRJ^C4#A=x}p=flWZgv%U_(uLw>qhT9eS* zp1NLxNF2okwkg#bZcB-0v-J;Dn zc}<|FxGhWWXXf~u99($mD+WSHiXZlEz1K>obnnJUU0n&jO}UnBC^%9g`~9`*P)c6t zWw1eL3aZVMBgjSj0Q_|%%Pzim13ER07QayTXwfl4`t3aL`W5z~`^s{&&FP0TYCOzd zkM`6$;iq5jalg3ujN)@G?XRAK%rM(WApEOvxGckz840%R?s>HsRqa>yCoNqS%1fQ` z^}i?^PP@pyDQnR92!Y(+9`tU3YKvYdHOj%Ygf~2ukE}cQLXo-nIExPF^3dxZqex`0rJo0+m@6yDvk)0Aun3DMRs$%<~Fvaq^t zIWxhUMp@r1RP%aTyOqKR8>`lPFj~L)<;45g z9vSyIyly+;s?^}AjX6D1PLL(mk^$?ZuUQMa;EGlr6{`+*rv^}$qsunh##hq_@#t`e zODCJ55Ru<_#(&|FQCm!Fx2_nrQox_w2K-*VB}A*M$k+lTWTQ&&*DGKv?eD>7;uq5r zqPY9BEepFArXLGTOAzYRu=R1u5C=@O?my7@qrY5ad9hdFY9qEMdX@2CqFF=42<5vA z17lK0u6)l6?|!d z%Uce@QKxXl73s@`=KZXsH%2c$-2_&JZlF32?&wJa%ie_JgT~Ba;AP0CcRpwXOA8;L zgwAdU*HM`{q7r&^RG#44m$b+h%1*mkRRGpz_SsE(fqLtuU#2^qv*Ue3@UKC|U0FP{ zHqApJ{y;%$&dJlG2P&G9L$p51n`qX9BXBo zMM(9k7G%J^LCiK~w(r(h(`;~mvCw7p3VC$r0`vWQPK5>qHOm4CLh1DhvR%^lX4`G& zRfdGj{aLElk3*9p=7kIOfrW7^Jj@YI5Ujz*e8w1DK5bvFwEew90PxWlXImwF|I;*O z%!j8U)gZHHlo>ab7utc#UC$N8Y3i}STc4x>vwgJ+a=HsHrF&`zKeR_`u3DzcZVAo1 zdJ6;)%)R!Ajtdo+1;3vN+#B!Z$h2d_*72@f!6*Gy&9i8MGDXpkx`f`gJ85zIsSMZA z!+UrrgCb`-xGvgjcC1SuPMgwSPne$G|cx_0=-s6qZjn+)0NC)&{gifTsq9-QOSCBpt2-$cx*WIem_6NZg1o?p64 zi*D?rreEa+<)dapsz&HQcWJ{Tl(13>cv!s<9jaMq?Do|K_lKc|t#aF`5u|{}51ug& z11OH4>S4x_)LZ7esgHGGKfV=&?jW*omX)qkED!Adg)3YHJOwOU@1MbL-51^LTzk~Z z=(pA0t=fNBh(EXk{-vy4l(6r|8Cl!iD%$QA4atY z_LnEzGDx?5JEXxe<8XHxlR2N8{v@>c^))j{FV|*1Q0__gWIb_^&QobTUBg zsVA~^h8TE1?@)vH-s~Ia?4K0`UQzlN{?J>c^%(9e^sjwhjll*TO=}8*(2YHG;c(^@!~V;zFtCp*NI3_(}V9v;XexW z0)~^Q+1?@C=BUIAegCrR4)=m%+2FpRs0(~uRI3Sk7vdKbx*uGhxU&&lI}&qxV9v1I z)pdbKXfISOaPR7Ex;+mQ%lj*!vULC!lS~0cmI%bO^Ljtsqs4gtoOWD(+x5~i>)J-3 zjZ9tWl+6g~phLpUZF`;-^4a`Rb2)Vg4J@QA-`Z<{?NG!TP82S`8_B`0J9swc<8~$ovh*(@yQ`Q36E_)>mFIAU=e3&xsMR70Jn>M%a^&a>dWJgr^6j`6}sw| zy)$l3T<6Q(%Q(6&ln_t(@JfvsG_XWGoIErh`|@=hZO4{d5=6aa4bf|s`Z~a+x8vqVU^XeTbS=A`->kfq9fm>6vY;d_RTI~_;XZ%yBg(A}GoTeQXs`5|n6%o|gtLEY@KqaHs0&Pd26|=pC#wDQF|ZaTFHjwqQ~lUe3h02l(tNJ1Xgtb{L-9tUe|NPPEkl z?1ieF2VFU%v*%FhWJjLb-)U3H$yUh##OmzB)5#K5ECwlnueQ>k-dG8}$hML6nUmsS zT{}8xj~I1$7sM&H9=vuT~d0_kqeJGIiXrb7o0jm^Bo#%M=;dj0Z_ zwS!p4w=G7;hP>gOCnu%z9bWalq4=z^2!2%)-~pI(br+{0{~|ZaJ*3uNy=0RkOD>KT zy!)Z*bU6O_kACgHHPctZIL8!!_Wr&7FK}1Pw>D0T2V;ruyGCg$HW45Hw5qAI*gDl0I;hw)>9_FXC)11xwd~}?Ur?=G}+^A6`>@! zkL2C>w5JWW5Bm_7ds#DF3+AYuH-uLh-J3x6Kk%$h3gBJCe6c|hF-*SqOS6dCV8V$@gZz&*8@(4`plTHOfoQ_G)%(dur6t?55R z$JL#L$*j|@WYzQgs)x5~O1B}M&#bOWde`K0@`}SF<|83lhBa@XJ^*=lUKyF$_aVFwo{k|; z;_1M9F?x(d4~%Lm(FcLjQsIXj+q)E}P_Bj!i2*J334zbnh>VL_9=*NwZ5edN?d>!n z^lR1pv83=(2HgN0-&T{ZYOun7$D4}5!&G={I2+>8%6s^%}pNe@h-Avd_1)i zj%5piuZ-6zj}5a4S0Ls6L+<3h7Jlz9%$$&IEn+$zg2`U}bs}htaP&{^Tl^;O;^(*T zX&yy@J9d@A*XyZW6i2z)_K!>lM}Q_jo{I(pJ#r0ja#F0e-fTXu)21=z1ONe#kRHzA zP#SSX;>6MMbhzN#Pp!VD z$FF1Los$i@|GoBTcy3Vh^i$)Mcve!%(07cR#x!^+p#j8cU(?mW;{KW&6U9upTErP> zhNaeSRWNN7f{w%N@BAt+DZ%Aazn}G?jpM=CAupVO_m0vtE|KL_LF>7Yl}D}CS)*AU zg4YBa03;h^l%KCobJB0l+c0jU)IT=vgS{p)S4=OIaYs0rM?UMMg0c)(AQ=Kh%0oH` z=@#$7zroGPI)d40l?OIQ=npq5oNh9SP`VEZ2mOzKH&PDUJZ}s3!j_*wFL@^tKa7h7 zOhznkJ(G+$wIjP* zQ)1Rqb>mBqJ%xf(v5UswF z#Z~-kxA!CoK6gyESrN@_vJ5hb{B`^JDgE*BpSyQ&`Q^VH5%|0NbxXayq2lrCca1wm zupx6A`mXFF``h`F6Ipu(Lj>Yr{=$QsZlQo?7JYZN8$uT#ws&3<6>B20e6^R%QxyO1 z0%TgvTf)6&E8S89_QhWE32DBM`6amC7f!r$DH$uPIJF4zt48Azu6ccWu!sE4syS{& zIZ2t@X6s#eX93_;RYV`Th;V9a3*gb4&wFgXkRJR(^rDYJ9@?B-SoUz^EkBr8OT@8> zVXPfb%b~i7R7h=9UXe|QbK?D6*H17-Rej-xVYX|a+{lj2uJYKLPHr)M+$1at`^Hu^ zRaQ_?al*(}+ArhEdS}%A8zYBYL>+O0ijH)pSeGF8?33avw!TgiMUD1G=}B?YFQCtY zU*%tg#@oui&F_rl2rzH0&5nK@KZ5y62XqA-HhCRh>BWcsGy;zb5NZo*%WC7jOT(zm zDcYv_l@KpjWnoepJq=ImA^Cx;20@sJOK7Y2B_Xe+V(WQ{d1DwhB$&+-cA6&69lP&&)1p=dvd)+)-c08I++t6Z}9CTziOpEV5mCBRmcrB zOa7Yn&S&8^P`|}Dd_Za|16Q+GYtLNa3f} zdpx^cQ!EEvnqv{Lv(pGS*X!c}3A;PxUw>pVnR>jF{18Fg96T)Wpme@%_tAeT80aWC zweXqADEyAJQM>XTAe|tYX^>_ z&?*G4I^nJce*JagRV3O{tgl4%_z|PfxzVPG|ywB;C?*5*9wK5d0vwOzA&Aru9 zx2=~+vU+WqbTi-9vRJHm>_TbzwHfSS9CaL z)lv*Sfd%k@LDcdza`a_|fls8qNGzmm&NI%vFpB%aJtb*D$u$w(lU^au&Y1|Wj&McF z9#2C7pGU2a7eHive(yfWx;cxB-&;kh5;^!X?WF@b~4s?3B=pcoM&J32wIP0rOrBu!6NB^|=w`^Q*T? z_=*)UKkaV2(5f;{R7$CDv-n#M=0%|4q&Ht8{U3|(tX2XF)FiFXhQi!>E8hzRdc=Te zB@;r!x;XbyWB8@zjk|#)@ZGCU^Ml!uCpJF>PSTkAiCP(O5$jXd7E9t z60JTMij%}J2{~w%%GnW6?Cko=yKV`$)^#mS zBO{94ZeY=F`4ea_XgoQ~zhVxc@R2$raf%EDw9_T;&B0SGkAdUi)2hDHDy|Y`OZL=_7=vPuA$wqrz zw{3)n4@YbroWR8`YsIYZEH@s#!P|(-jRceh<0H=?GYx9WlINLMwMxpnwt6BwUte^k zs&g;d>pQ32zy-uxe?z&x6&hCb@!ewN=xLN}deH>=ZJ zG*kv7=u^VYI;Jcfpr0At+gmNtrDS@UWl-m2mfJqAUV!s&-Y}vG+jg)CR*NSBk$qt2 zyG9(U3@|w76(7eMeaAVrHd$3N1IH)M9vWHug=rRhKMF(S{~cjldZ~|{-p@=6T`=Yc zIO&u@M-95NyFARHtGoZBY2KnTwAd=Efnv**pihJkm##}_8%jyo-C&)|`%ey4UbG(P z0!AFfMEHXnUQy($GWCfO#FHHMvozp-ok!*lxz5c0SwN(Hk;%*QWZIsOCUdvPd7uxf zyvzOQHhUh=(3Vj*cSFkL(&Xy6^0AVBRnciz4*Bb=;Qpsarm72x$}M3;y9v}<1U~3T zuaX*dm-Z24{dvuHrhXb@p{8p$LwD;?8PB}Aw4p|Q#jbzVs3(TfBW_D~t1Z-JahEK7 zEpux#Ab+0EiSr8a*;kTP*X!ODYK2Kc&e4JulAQW@pvg#B|Hw#6ol3R)GFZezB|-~$ zLRh)@FOj&6Nb)!K46(@ryPAed^`gGN!t=)!->Y&)-mSfalYKAr{1`SAvR4S{3d5$eEf;Ufn+Y{IwJ=8)UZ zo38g-Gw%6RwzWpXS13-|z^IMCpsl}(-{>jL4f;`DJAhsh!R>1c%6JJdW81`p5Uz1I zGUQ@AG6r=`@`a--&?%X*Z;(ta-C%@YmQr%%dbf;E4ZAF=r-1>$1At z-Z=nje0uk-8pNpQwUxjWN&2c&l;viibTyy196mRAtrC4?u77KUU!rU3+s{8}7WNA# zpq%#f@%ify=5Dzk{-loI{tIZoR{i3o+#BIFwB!v~2}6GOD{4O2^LZ?I-BbnT+6q*O z&;$HxhE88z5osT`8Ak1IWc~t2jaLw+j3O3LUk5f;Q^e<6iAQfshOAJRZ0*n>KT zeRx8~Nv%bLmaspFjeq3**%ZSCp9L^qob=1STQ?9n?(V^+IPGB`;CZ}Z(% zk%nwBRkp2~yIMe^^Keksv*PBk+}E;X1rsQXyYU$~`N z%TK|YwSR^hK=U_S{3q}dDSI%9wyx+v^bWEwl%TW&;y?iR7X9( z({V!}_}_oofM9aXZ~bSS*NL8Q6LMZ`w*JxZ=N2Df;8_p|>Y);EHsI(vBi=U$<$<4v zNxV-PY~dl*|Bs{derJP!+prFl(iTl?x3x(rCAPMz_8t+twMp#Q)MJlWwTZn&h8e_q zRBd7tyJoCXv#qY@&G-ES@`K|@4)^E2uj@QD_2H0rwvT=)vt8h}6T4$8aS`vI)3Q>1 z1Cm12G@=d`j3C$={Tg_HvV2XFY`NOCBmE5ol5-4n!ceUrnK;7)^W%Jk9F*_;dPHEwav3w|8 z?92FJpHi_ck*)>biRtdQ3Locc>lk%U=E@&_bqPpc1rC^<{mmK`&HRb|Ej=^Raw;MC zG;r%Tv^Oxnx7%D|Trwq2PM{4N@^`y(K5+N#dC5x7cXq@bYKdYWJMnGHC?gIoCSuyVR>Ic`% zem14}_$HgwhzVISI2mpPpM1*N&YK7}O2DBm}%yb52{mNsU%{mdhF*xoWcf92v zEP-}sdio%dbtQPN`yukiz?QGG6#fKUDJZZ@&|RVQ!_?r!r{23*OZr-&7=?p3m3HFc zVAldMZ*6a%n!BJl(FOR&8kFf04{GMU#_`C|Ey}QGfi9rj?%rP(ikuc*CZVN*eTB_N z@y$#vs-6S>5h-(8AVu&>3@c8n(bLpl)t{SK1nuA~nADWY8e8nNx0Q~B8^!^rPnoaD@-|lq*mPw1`+dg%=T-$$Upu?JcKKR6)_Kw%vG~ z{_F!q+CyuJe^IP4H63x&~*qHi>q%iS5?c z=`_wbCa73F%AfQv?+s(NX6{pq@+FQEE-$#}=7-w~g&r9CE=+#Wnn z2iD+-4(4=8a5P`{5~(%507AIUDIVpvFjLxdljQ6Y1(+~b52yAsO(gL67GTS|yHguK~+AhxrwAO$n|Ca>gY_%{u)K|WM`$X)h5+Cy{FQqAKS5QVbk z;-uq`MjU&Q`d0UXTZ+9{DOGyrzQp9vump(@ojZSh#?p6^p{I8)i zG`ng`5=D`##`^H-XoGlX_$YfT178tT+n0;cb?{Lod>o;(gME-YWJ?u==%~Lli)cfM zyACKN-GSLOnIEOH@pOi*QubD0@1E74kZyfeU!Km1w^MP2yFyjpyk$?tyDC!6CyzT1 z{oF2b1yn&?=&?=-pEvZ;7j-HKt98;xCy*dVv1LRP!f{Ry+FP4~x8lB(l>=;w92Me) z)34s0|NW=Xx+TeZOt8{O?JtYz%_JIXPdYzYsOlFF%y5!Z1vLk9_jbcqtqh$mUH8lA zR=F@N${9Ru^qW@g6a9vm?;@{HQBl^)?F9Xsb9A<&4*^Gxa(%qVCczxvI{- z^{%T%!IJFSorcyCBeV2Zffhg8{kHf68-x5BitlR8wxp|qQc{mGy_7F@csVxwBJBk_0+G|9%-(`aRF0&@srIn zFU;{Lpugq5kMYKlL4tVy9PVpzugr3v6?+9;5e$DoCLbWdDH%7cG{cEYgv4*Z{66QZ z->9^O=(5b#@Gp=RWn6LUHKLc}^!C)Rdg?suQ`k~-YhU2UUB%r}Z8@1B{4n%Ai`Dw> zEbN2nowPeL%M^^zeS7%&wL_~SRL$)K#hUJedEcDx@ZXIR{igh;1?BIFu7*tn$5+?O zipW9(OK84dl&kASQ%3_)t^>$*QS%n=Pcrl)(7)Kn_0p-VBhR~D2(x=X8K({YQr4aV z`UpBvR2KRLD-XEo>A55c-t7R}0GZtlsd|xvgjt60%}#yKNWCRzUR+Xjf=&3>FSiJWQEhYSjE)}7t<|b)A4PbjET@@gJb3X4i zwUZ5FIZvaJ7&DOV7rR%E(&2Sj7Z${_Qy9qp5z@F@}Nvf|OS=_h6+J&dC{IM&X2I+rE->7ghx@rd#5`{EHFU z(84AGZk-e{M&%&1N?^hwAlKWvvnn*YFJnGG&G4brgQ0#yEv}E0?!6AA{`$R zhLwN^`f)aN?9v78$xHuHRq8#L{4D|->wXZZ@(X78ceeBGMc^H^V98*}4Ep(1o=sv; zrJy@qC9RQ#8?@}H%YFX}pQ;)TjB$CsBL1CUrz962z50kaG$;FN0BEKqF`p_gF=?y@ zO+qj&Dfn$RKagG5U8UlJO1BLv0n2$X< z=}RtjCcgclKv$V|w$tE07Cj`Xcn{2WSF*RrdD}l0R|T!?bN-)~lsG>zbRk+_$9nD6fte72v3@86K(kmIQYcsGgFnp*Bt$f8$bEF^geq@ z8UTBLBdE@_(6W50+K^|+HVJ93MXk(N8wJV|o!1w@2%3;wKh{|6tFvK@eeSZ6QQAI> zSGrOvsM03Tko`x>pK(Hu0xe&o=mHM*vOj{7-y8>BLLY9=UjL5@V3=d<5kCL4aeEhJ zAju32*7{YzQcG;|nojy&<^F!T%XQxH;YU#Y6C-g|m}sPY>HI^6aQZKzVhjjite<#` zY3s!yP8=wE;AeYaVJd(5aeH>8WbT%u=?zdxw6j3-w>ScOZT}EBWIj5u-&t)0@1h~` z!S%dKPE%?07q!5OZ>`;W6y<-5py}ajH9aIRJi_dI!_%~Tt7xcoZ2cwO^(TXXOp3Wr z-fZ{c>Ms!<(Tlto6^@R-C0EDZMpza&?GN}#QzDRb9Y#K15h&Q(A8C-zX>u+Z=-aHO zrKLpF80WEfvQB(VooCm!f05Ww4-A6meJ5H_@9P-*-SynIFw_3>uax(VZXUzf*G^=N zEz(AdE{(E!^VWI zeyB)K08A*7X4G5@{9MnuSltJCimnMF#v|<($gM~70#p)ZI_Dy`$Y93E)dU8Zq3Cyt z+|Qm1t!&_qsg{(&C^MFA$)d>jmR~!1bj9eLRcL4Q;4BTgB)hL|mK$sN9*@Bq&qvG? zcxw50{j8jB&fE}#>lO0Ds|-EuD;vT05Dkj9lPQ;K1G-Z`!NX#<@s7zNN%4~b;^g|Q zFh@+n?}eWTQv2zHJomBmn%}Sop7-~XDifp3+v9whQ^+A#jlWAckq+}yi-P(7?@!H; zseSL6iHPOouSZtkuL+))EuWt(b;Wqu9lTI0>#dTPnBuw|j4w_0SLxx-iW5xWOKT~` zahvn;CS@4BZcP>vss@~0dNFC|HDwn`3>PK1*ANxMCAL6w%Qb0U3MAh0{ps%8kkX~4 zAbaH1!71g%&G}+L@!Pe1_lrv-SzJuHp<#Hfw^h+xIf`%CHi_pHqOOHu^VTL`TZ`ir zR&Fg-s2>1w81asP{3^N7H;mhs*#LB_nI+S5u2y+ka}_q^hHNh}IqWG_>uS$$Bg}4Mz=)m9o zCbtx0C~=xX-o1F*)jE|wc3I!#{%QO@Q6$h<^r%w=XRZfasq1{nff^wd94xWC>i+<# ziyXIwsCkomN7xIhb3aqawR5_|)$-4!=c^#ic_SDxUAH|8@OW!YfAw-wb8>3QSF;7d z%8<9=_-71(9>X4A9T+Kfy@%=LlRpi;Yv2ktgPr@*50DS?9%MOC-I9AzO+X|3FEEK+ zmbx=#mWjh@fOdz=iAtA2k&&`DJ7x}#pdVX1l-f;r@A~sCO8wY&U#L|BKYd-0MnPYT zKMyf!wFh56*B-c5#TJ>AVfNL(vZZvh8p0r3$HG=*TybTJnV0g2?&@&TO|Wu2Yf4w= zBfWk4Zr&|BB30`OqvkBq*qOYgH>#49GOiW|v%Q$%PpVM|gSr?$&_+;>D~qp>c(L$L z4@ae@3bg`sC3oN69{qOrejm2Sf8ihYpK^AFJ%IC^1owQ6Q@S)+p^dn8*#2#~bn?7H z^gd7Q@BZN5+Pa#(jR&cZ1Zp-bwVOD3Uuqe$p;VPjxbbJ-lyW2~^#%L;EkS5{9|^F^ zIkG@Y9@5wDTvN;Zas?D8KFVo2meN6oiT$-)i|R4{u(vs~JvU@~e@GwnKZT)(k}8{7 ze2KC0({O}uN;v|fsVMyW@ZY=fjZM!Ah#kdtNOD!1T_3sCV=~QZd#Z&o#MhnA$F$~H z!oy6)qTZ~Yx;FBSw!?f`j}CaUEKQQ*xdrH3k<8XP?!4_aDzTL$Vv23k;YY4NQ=Ua<5&#->+lHR>= zoCA>M=PU15Yp{~(My{lN*#)1$90yQIT55{(?%Vh|{*!)#ec%1-jVRJ+ZaXbBm{?AZqureq&AlsE|#G%+2SZ!}F8J!+`a1W!&ZKR;Z37fgCt zv)VG#@A8tT>DYEnT-{pH{ z3dG~o*>HMiYRQejy8J92g1Z`zG7rI3+gQ<0X0(*LrQ{Pu9E=S2khBTn&CN%2xCg_B z$?YPBA?4$rHnHVOPPb!hEv{w70*UT^@4Iw;{eNOSXhEN36^aU=RleAJQlI(2x4x>} z!Fzi^IA>8(*2B?SLg{>YiUfHu+_zBDFu#He=3?p{I(%Re5Fkm8ix@= z;tTy-d1`ODDGyn(|6*v0FC85o5WX0-iR_HDjy|8?KmzfO8^8$DqBQKb}9k5~owlT+(e z)cN%dYRwAh$-#WD?MG1R=55E0#+O+>VRyU4b-o!rY7azL=7S3#g4*SvgXy(#YQcja z#=?w^6Ajsq)6j~mZdOs|GD`&!8jJ|9O>L~XAVLom;vI$wPnxTZuaurHWMG!{p4jPwy0i37v!}qL@C`YTDxk$r0au zcH)|RD=^9Y&|Lma?}UN)a8KAv_M=3jD2>xyBS?o+x+}A;Ul!X&%d%N$R>Kh(k(e>;YKn7za>KWOBc z%WYxQ?rp&(?~{_hOz2uRg9MlEpIeDQ1K9)$|1_2-%|9|tn%*|1_4!$^@$XLH1Bx~ADeg#?HwmKcacs|aWL|HPKmlqBVQ=Z&0k#`yY?P~@ ztkv`8TiivJx93B>f;=rv$ElqyAQtQc(vE#CZ?%H(#>Qxb*E`sRl!O?@1hI)%;vKtb z*CiL3Ms%`TLPteF^qTbc5^Nr`i|Vd&zq}i_JxC(Z$1P=`GF_Ku5MT`ceHqN-_eZRa1Sfx&p_%OxZG zBO}FpHJVL5YIn;}Ry`^PL-Gas571Z+P%{Fa3##o{?mKd%;t|M0o)tmN0|!eHr#2?3)q($#`HM-alcLE z)~80*9}0Ddrj|Us^esZ zP0r;k?xeQ(-Vx(?iogwijtd-YBj)%4`D5y9&VP8{LgN2?vu3+Y*f6k}VBh*Z^zH8d zvqX&|X>Fi*izH`kXry`vzdfb7VPm?bc*FQ90T(8hx@#fcvhh}S@B6KJx5;#)hgf3> zgG*kbkOd}+u~^HyEScYwJp0BU?f&F8VmL*&^Banvu+#=%F84RWI%u6SyWF9|)V&nM zTAI^cN0vJY&2?~yujo1v-3fu%=RPi3udL|5)la$d!mM*A7q_?PQ7ye&fTv6j>)_#6 zuc&Z~ywd5i?s|`-Nwam>W-E{P{0UClc6VOmtI5G0l>$_ndW`Eh_D%eVK|cja)n`JK1dJ6GI++~4S`Fv|QT z@F5~t-bx+si++dq@q?2Bzp)=Qib`P1zWBG%G- zeQTBwF*%VbvSqG8*g$BVeG5Fz{9(fmqm^b>zv@d782QTjO9+6knxj0rD;4HkkLl5% zG_ro1598bi)?hPb$EjKUD%o$ITgewhA$?#*J+JJ+X6thT21KI&K+@a36c9n2i)x2pkg9QY~XWJPm! zZm8ylw z5;Z3=?dSpLKMmKMT_|38jyVtef(P!Z=#Y;3B-Mjx>DR>vv8Gv?vV))op@&G#R?mMQ zQU-`BZhx0vO{wGHfJi?F0%b!nRHuiyVxqiMt~@`})kBY^$=wk+=DBs8Y&n(K^K0oScXBBO0M$_1q7=0#CYgW<@9}4EB zeAq_K6*wk9e@)(B|0|SY6xu>m5i8{zB_Ynb7z=YLIlyVV)(`4KI8GZnqa5MSF?|Gd zlYD3cnew10K;q@aL1ym{h&F>Jj@VISi8FL&XGa#F0taAbw9jt<`sykg@nv*h;8J4H zq;WF)vtgTP61n}4Y;(CloBIoCSBd$qM>>i0K&t_XlmyNn!Xuu>WsT87fR<>XexnvE zhPiPd8K(8+=Pe*l^t4-;NFe_%Nb4}RBIX2ECDAUo^DJ=RR6hsdoxuf-_F?Qi*9nT# zBAdBd%`Hr_825$G8;$Nk9YPC?3Lhkh$^+-%Zgk@!y%fFC2N_n7u%xO!!NelMP}{A- zG>T&#(%2_IP-DNb~=X)KfrP(PZc?i_@;Hx(B4#C()a6K`#A+X}r z3f(o8Kfo33IBM2Q*1Dq0>%PUz2|3B>H-3^x4$|mYlxnd|q3SeRui>Hw{Wxpir1XO} z`%o9_jjOpzH^h}p>9M{srSV~eb>@%s!=17|(>Uuja4}bd$y^IFwgMIqK&@zNIzB##?4Up#qrOE}>H?C@7VMVKdD7M0Hsqe59?n=8XUe=~h+Te#~i7U$4kM zZ3ZR*&GgDGGqc7TBn1J2OUnQ!O9NW1iNHLdmY?yRH+gtR6u^s>1hWl&bdwu4@^Mg$ z)G)`r7#@~2kyN%_$1>Y%M|j&AQdR8tK?Y(CwfB;=(X51tk5DlZ1HL^Rc}4DK;YJ1* zgJUrjxRiAAs>KUnQg`jB71)YN9F~+E)J+traYJ!F)>cniyiY&hxG*PD z7c#C7g8KD4H*qa+p{FAWDb$n1~17R$JSy69|lSpFzPp-Gwi-md2p*Df*94^PO0!uS6r+R5K3X$D$Q*6ld#6o1#!d(LNGVen-+ky67F*JFO%GUlvi5=WvfH~@Yrqcx8XJk`EKKYD{OYGuW!s75 zPvc!R!JS=2lJk}lSGm4;l6Tq?6Tc!jWX;PJa35H&~7=gO%%q#Ehs z7O|`Vy=hYr1GR@Xee}n=8!Ykg97&~6(HCI*(aYQJ;RO&G#PMag^almVy^;Ip7Pf!3 zDrf5(?VUlR)@s_$^X)-|q=>bqp%XOTPq;*_yZM(}**G+o# z?GN4-GFs+Am@pGkdCcri=AW%#845;K25z7#pb9ELe);CIXY4O6XE>kOb@mJQXD07TB*<;L(!*5>4c1xRg*;4eLHY8YY9T>z zr56b&C z$|ncEIoRA5&QjanGX|&Y0Q<&H{*E%qUJw>@CYB76ey36@5c;<6b(SZ@p2wSQ3%D>3 zJeKo6s%L=R@qEQpm#py^++8>_dS$C%UZTL4_}b~n_)CJH-!m(#t74(rWZ~;5#RbJV zIp@dVftzxxDM((5n=JfKqM7mOHl~e>%@Fkv9TIX|lQO>eh zK!-w*BFQf+<;Uh1%y_!Bipu~@L|1tn_N3~m=4I_y!Ae?cZQ_Ca=3DVOsPJLNAavYg z3CZsseWQqxfr1>4ZzGDw(k?ZDZyVdIIBe#4gv?yeAZix8W9N%B<$0XaoCWkz>Q^<# zN{QSpF;oROMSVDWr|bGr?2f9V$&{RNKYUg*54D(IIhR4M&EUx*mzm4fRAeZc-rsPt zs?9`WC}?^+P}KYAld1wk_n zEQO0JdjSGw_gTINmiHMlmc0YsP|kN8%noKh@)HW1dPk9{7DF_xMo7BczD-P)Kcxo8 zmUQ7a#eFIurGdt8vdJ&;vg_0RbJ0&I1@np>zA|6wV6%VSke6H>I*29l`}P2$tMq?V zPWi5!kbm4G%K@iyF#*EnZtrRCq-*Dv;#|cKf}y~DxGGdrRC|<=PFDWRr~Wr9;_rsSC@xa zPeh*(nn(EK@Jd(NqL2cGTjBMXv8>T8cCLrwn*?pO7Yq>jOgij%iEyL$=hj@Oz3Y(Y z$2UwRgY%6S>SU>5i~}5?&PDGCa~1&-c25J&b#KcBWiDZ${tfHQgF!{ypYO)i1dcf3gs5E#t9%^8qqd#?xA zzIYuQ$}O*_x4XE$&(9(dqLhf(_PgzKtxlzlDv9(ggywgW>3v+`P=BTUMCb66(3CkW z%*T@lW20vQU&qj^dRYfeDj%z8=jPJX&g%aVsJD;7J4Y9BGW|%&I`o3F zu@VE_4(8e0{!zn`MU`8~buW8`bxpK=8WlZ7Wppq8$0=4RD?rS)whwl}2_Ml+8tTCW z=nV9suCYpRNW9rMGrFiF&hdh z$WfN;I3P@6YJzNpU-h7EBREOL zTAF5;htx>3(Fb*!biCf)qCyEpcwRL#2`9dDSQOvKZiodNAbK`2%RS$p$8WI-bkTq6$(UdbqGLO(Kp0{5oeuu7~^y!XIA+9jG!J)s0j$@hq6pSWI{-S(uz737duB0DM{5JQ& ziPns~ZuO=1zKxG&S1%=+-DO4$`~5$>0t8VGqh^C6BJR=j+nGO$qNPl4&EANxpr?6} zr6-Ys4^lHF05#_GZd`1l30nZDa)f#7^JpU&n-XIgUi>lypKyy9db;@sGM?L8)%C1j zzWoyie5sS>*r`3Q(qk9#Q;)01#%8X_!`?dd7Vb{4NyHy0gMD`Ot`hJlm8;CF=c4j4 z69P)1N|(8~*VNm+uo&qIoJp06yCtWct-AG#IC(u)t*8VrY>YlVoby& zEZAeiTj{bm5mx~P=i}207h&Zts~+Cj-S?U@>9qXnl&5|3L(JYl+o*iYbs{zrM?Uy; znl3SxBTl@*)dDll<*%6#y1d*W0CN>AY?(n!L{2Ywc2XQPEG$DgL@R5O2`@QZ4r^SF zc#<0LPPbp$CK*0XaY@o2ssD)enk$q;m5zuQ?l?#OmY8FoG0K14=9#UZC;4aR@G5o3 zW_^pM+xt`rI~d#fCWq4W6jo<=N&oXs?@vZ!{X~P-mwdIXVM^+|Hse96(&#}~PFCTi zi_glISbpKde*QqZg`;cc!O4;1@}@P1{rate{hoU7-;DbVjE-J;Pq%I*J+6MLg%RumAW-%Oaw9{m0{0?A>eK&w7%FpT;RSs$;Z;|~yT1`BNV7X4@5`@y z{{P<5kfM6LEmy^?FsBB&Ub#5(0Y=1MP>=-s@bI2Z0+-g1Mm6H{?4YwzXOKw~Z$DTT z(K)SwYtrL+A>!)08iz!s3V$4scx!0Ma`YfBM=OU{>3Xl~V~Fwn5$4Y0fiG0lzTVcy zTcC}RLW(!A4`{ZU_KA}MtsS`SZGzl0nHgV_aGlT=6lbzqP;ro`q4D{WeRfe{wo zwP_L71~DmYFv8{wv1S-->hT_|V)~tS*9*BgZ$!h^veG2qdI)>ndJuJg)bgc7>mF>e z9~Y|l)_$n;j?SBspT(5y^Xu(6*KHGJN<#PM2O8Ex^Yk8ra|qqaX_k5uk5x@|HlJO- zs?Jy?frC4!X8-HH4oYK@`u?TW?6SDzbj)L;1_pak)0FGGCpE8@hfs0@Ks{K!&%v8P zfB``O+o`hx_K(TN6EN&8Q7R0xS?r~>0u?3osB9zoS*big0ji36eLY3E`bH)AW=huc zwh6%4{x=qf!z6D##U%D*eYyK5K9Xj-QUjFr-p87QzFZ)(&hoYY3e=Rdjbc%qE}?u% zNh6LzrgfRX0xBLF&b_MX~_1H(5~Dptu0=^Xx_u3 z0J*(I`AtoC;|jhllx{qu!Ektp(O6zV8Z7o3D&E=Ocl|cXOnrfk?70KnI5o>N$@g)d z-q;&pYLrBdh!q}~VYgKD{cAq*R>Je;%q9(40ph~*O>c4mOzndfBc5$DGF0mK%lHK& z%%*ITF0n$#nVXebpIUuBXGIt^zpgT$t9^A4JO{6D1oH8MB#g>IVkU5~V4(rrd_=XE zUpwzLgbf4LX6Ft86O9d*C?Lb3P+jy`%}Cdw6*t!$G68T<>rLqYQ4WToqnL}a-j|AG zbvR$4uJYT;4IvRPgM_p3^2~zV`CoYU3}gt)q)CV+4p_DqASG(=>cm7rH(hRsKDAsH zsozD_-9Py;UVYE@t?u6G;{-1S$f)-n;i{4rC7qV^fV4?v=Eqd@ZTGk%(I_sF759wG zy1X3tv<`0X+Nu%NEx^-+wEkCdv;c+JJ{D1xYoF|JTKTc62DEOJU+2_;OL{|9HLnzl zu8#XqMVQF2dSU3B=?A~`9=g16T%VWeU3D9ViABg=m0iv37pd!KS}p$}Hz64Bf@ zy%~+zP2amCX*#{leYtC5DnIK1`znwT#B~r)kR_Lel*nO>>@wY4*{*RxpKo7a%Kb8; zAhtf2HpBwbn*~0nd`Px91Z3n$541436q%pJObc(K^zVgb@p=WJ%AV8%XDT_EgbOad zS;p}YMwht=ZjcJi>-HexfdOuX{paWb`0%yaz&or9Z)bP0yb97Mg9gm#-7T zx!?2@_<8_md^z!IX3lbgb}2>09&KmJy(yZ2@^7~n#6sI9+Z2<6O;h5^toQ4L2{sx% zxN>cR^o)ILSHRRqK^ClS!Bzla;!Tbh!$?y3is@WZmG$)94ZwmXP&+nFnL92Gyr%HJ z!|v6;S~csUz%+KNE`7yQ&eyxT+0u%2pq@Y#1M3%OF5BzRDVR=ca;s3v&e4ST@54cy zW@|^N^9im~O0HDI?dr>b9tiN}e>7$d?C~{LxY2OK0Nm;e{2e3S(dh+VFT0&vRKwM7 zHjNVAjFg}0+?>s0fXQ_+m{?e(i3=dn8BwNvLF?cJQ95#i-_vCK5En=+b0E5RfoZyK z5EfAYURa+PwSr^Z^>X0FmW+d-l6D)a&30|rV?BN7yyYwP=~V2Cm`@BTPhCfo>VMZ3 zECr`zt?If*OgB^~sG4{`omt>(mPNVKpCTrF9b`cZx~v$5Ts1uflAogLcS+ZB&e_N7 zUcLp^Fi`I za?8x*E_iPdM@S%K?2%0Hxg^7Y)W&g_-ikC6ak21DLPftjdo7OIf9ex^3biOU93d_b zZo2JX_n{CX=>Pt{>lvC)!mLiKKtoq`M@c9-f(Res(l%;%B1cX~See=p?pNPN5(8FX zYVZ8X4HX*%9JFdmfDutB==jxqqyD{ctQC8|)^c4{QA*doPMMrrkxS7GUufDCzTU5ZC9lj}a-LaF0G>z|rDY|f|E1-rs9BknUAFyP&dthRC#68JF#AjG`d6?+uG={I8Bd4?fELsKTv))kUQjtcU_^!U|G5M!SzeZ z`LG1@D>14NZGh&ks?Yp|v}~wya3hyFkG`8T6tp+xvEEgxX)Dl{c>IfK_7i`iDpXZx zy&7-71WfEqtF$AUYp$#nc#Q2=@MUAJ3a*(7%J$o?T8TI-!7QYX$EzLU1#)N~&v~{0 zKv@9+NfGme!^E>Ynsum8>zq>?^ZhkL$Me6R1vhb*bt!Ll)*oQ*P@A>RRyg%Y)ov#P zo3w(EA>3H5jSnZV*RpFm_Q>svxS&_|HZiuWynyqCcp(L@1FM6bH%)Hy*v@O}pxXM! zRI|)kdNA3!?pTj3Ja-#-7*y!9ey)>#1c@^HE>m&=T8yjkna5;DRoWKJ)(=tJgT{lA zX2%USIs9q;N4W8XU1|w4h=T;kR$F!$lQ`TLWN2ZSQel#TUo@ggepc=*d##;R)jXEF z*;%ba_YX$JW00yvf5Qg{dNDn}Nz7ndRGh%d;$L-AL(LxcDr&YI~Zp7xD21ai0ZcrMI2BHxHW ziMYPF##^b;%TCrv?Mb>8x!Yu)j5NXebx|{ZR zms=+kY_V<yw2n~Lv!x@uwXL+Cc##RCJOx`(o_~RDhAfoHJ&N;%%%@@S%>?apj z9c+|AsQH2jE?}=aznfiQ{kh+0wQuzCJqc|Md81iryB?=%18+pUFvv%U5_V>LQIfT& z)RmM&d)pcpu~8i)GbRa9l&cIHVokvxS~%r4P-&36-%1e+JZ}|i=j^1pYQ3@Wh@c;! znFLn1)|<)GPvMi9g3xysSpjG1ebUDh_6s$cd}(%U&$O;5MllD!5&jkx77Xc)<`9okQ8T~%%$Vd?}Ze!`Pc+n)D} zOL<%w6yxL7H=o$SKG-GN3N#yWEflZ%VhjuKf=O@wxyP()3k{CW-u^0!6WfIZS=zN) z9DH(2N1-TsQ`^$n)x$T;EXbWYyuy{0Dzmg@M8BVfUbY9%oh^YbeVr3xMj!4#hW?;h z-sJ5kINJc+LV=s^ZZtlhVCuhLkY+Pl=6Yt)hvvD!{pFHh;$IFIfjd5UVQ3W;EA5BL zn~5kxDdbXs+y=wXSkd22-NMt%rmx>s41pvJ9fw>jrB9})b3jWB+KNm7Je zdqHPAU*5_WB{vbdob!W4zfu{EfDWey(@{~#JRnltTKiye+vI>kXjU7vD70)t#e7_7 zr{e`N?JiX$$7x}M9pgO{0z&TKXEaCjhFOHr)_3124^@|^WErjPJ91cSwcNe=?o^X{ z7Q&pXv9Q>?{b$2sluk}{eCcu3D6tj$`ic{wwpJKan`ZMg{pw}^zD@ATzN-Z}vcPy~ zMYh6a$ZE2rz;sYjv1wB}T+IDHs^%x0DgPSk{IIO!K$}i_+?}{PmUrA;922}cp3ilO zUM7yT^@kGQbL~ck8nt>~@3!1sNZC3CT*|#yMSL2)D>^@zmKarO2)6WlQQO+O-;Nni z4g}N; zM-a`<>G_p2HO3kXYr9-qjr-D2sk^H)`_@ukSx|Fj4=Kl0t?@;BbD!&u`t=e8^# zzUj^zu0V3EaDBS{pf>xbTbj-T$H%`&rLGN6p%QAI$x!L=v!B9;yxRJW_i8BUJn!uq zKxU&F8eG+-dH~zve{JkM+1`MVSD!syYZSYDU(SZJI0Vz*q9H6Nt5yurba9I5%Mf<$ zB=+5Wn+|sJp+&BdI|U9!u#6P@4l*{-!ITy7<-LBIIkz!p`xtr^lk8&gSd{3rjIu{g zJ+;%r$2E0GC$%Ht;|))6&kX;)Sp;P?Huef_2E}oD0v~+HKwb*lWFxHG%{@?|n#?P)=gq;xz-;1h}Bt8&4@a_;o z<AAUAY_AOI7;89hpM?++!Z) zq6y!xGrl{hk2BtXMR|~Av-aFh>cM?} z$H3WWT#VZCt+%}QM}*Ku4U<`M!XHt!T^ex>Xsyj0?|wD7KI??kwW7>QjjHtoGT#ka zM5dTNPuW|;=}Hx%50OpUGU2&0_7{hr-8D9hEUSZ4*X`bKu2LP_vu;l0v^mcNSB3)`YA<8hK^*oie)i4QV=@8> z%u+q?;H^k^D}p8^XY`w{4Wfv0VIEa&tCmGsih|y3<^;@PTdSBVbe*0}g|VuDgDm4~ zq@H#-|9qStaUR5zzUC&Y$o^B{yFRlpPvWNRa)56^PQ2NQjSE*gGqiQj<^N%{ zQk&mf4TjX4wM*S_3_UD)-$)}~%UoR>D;1+rV;E$_9#a)1QG7Lp-9$HZHE6-I|!h<3c55LX=g+LU!p+c8CV=Z&l;Pk$At&oadOobY7V#J&7qVqM={Leu2- z!w=_(!nXh<-*?o_b+DS9%Ur@=FD2+~0=eJfJe4GF`TPAsFRbsyUlc0Zz;zOuBdAyl>A}1F%cj;aI0K?CrM7&jH zt~M-DZ1{Pt$*D>DJ52uUE`Z*VZ(*=#pmjxbOqAX0Q(DpGSuT#-d$-_)S~{u>P{B~D z`a)_@pnlq4?a=g}W`_5{kYN*)JCk>$(|V>5xpQz+E$#uj>QBqHUqe6tqe}LZJg5Q2 zkV0R7JAEO?okgOc!GQyYya25``9^XRaWBNu2ZW`713hdG6P|`Pao(G^{p3W6p3!xp&n_#QKF^*uj)ndk^_{DNJ!bBA z^efpLd_}of$N#9n$;-Ky{gi3Z(&s}`@QmFJwn0#klkTkn5I^Bd)!H^ZFWOQ&n`)OP z(KuXH@331EfpsrfCr$Oz&#N_PETnQB*bi-@DIFA(zHdBP$qXE`Y$MZ)x}yJ%#igvz zjaD%DZ`OQql&am>Fp@^{co9|>-m1b`i7(EzV|OU*A*XZ8QS!6Zm*X9l+Fe7EZ`o{$ zn`+j7az3|a+eNm<-isU|;MmD*&E&xo#7}026u-gXO%RsN$>{YIdu!O~s8OOt-|3Z~ z=^!BYJ6y|4-{RO!@qwquYPDUOz;h*^5TgTbhT@}S?xKI&zi9r&9~o5N&&<>lHo)@x z2aT4?jk1UL1S9uxQlyr&(y&@DXyPk%t>ah`1#aJcsY{8zH{AFJN00I4T9~fV@uTYN z9k<;v+G4lM63X>P^D@6YUX{TI%o{xDr64V(YJ$aaYje`;7p0yk?}ar@ zL|^TnSN*TQ)3PenVj87fyV`?EN+GD)_cJzg^0nH^a@r`gpMXh|FU~0>|Fut?AgK5~ zrdTNa6JQsz)SN%k2mOR3wyH_D<5M?G*+c}d)39u^cs~c)+$s_jF1ywwTHa>!um$aMT z1EX8r?!n3sUc5L?3&JPLh0|B^?KcYzoJ_r7rO&i=;fl#T=}i*Ir(NC(;2gqb(sZ2w zxbG7lgn>&a-ssoDEgYJw(GN6cSHI5iHqS|qnw`~DxJGogAr6S_8j?(*iSAhu+@0Us0h1Pyjx|+E;=(riRBBE7{ZC}+y#3P z^?V#RD~jRQ&&vK|7%#0z(E@o=hmiwmZY<)mt^L!Z*It$Z-Zx7vjI^E(1<*>NP4zyB zbqeN6+mKv+CjymkPHvto`XozQ z`9#N7@HPxjxT^&MEKE8XDB$gG?^)$yvhiobtVw8+^{eJ}9lW*YQqO%stanC3VLE)j zP-n6CWEUK-zW=(|=;p4qSjBJTjY{68$&PtCp2X0k=pde<<|<{Bb<=w~<0#ZXbXUnk zmI!u626L;RVwqr$(&#(hh|S_;^N@^3<;yL%OuBsa@1oxu=AQNr=J)H$O(_(ACx#iy zWe)XUGhAM1zpB_izVY0|yNqkT8^W^}FUKji7Po2P|8IL&hc3_0HQxUwW9&m-%D-ub z1?ESIF6M_dv6<^3`(w$8OW3H^18{kHo$3mDu{awh+51_SPV4oVw5Z}b@Nq}ar`P^_ zu*wz1@o1rNIo`}li+vR>3k-bAu`K090Kj<`N?$ShXM#RXr2nTOe6X=CEJ(6(r4GV2 zxQsXNkOfJ2IE>_YzAn51s_HD8)vQ4sL!-5Xxvz?wzTV3kkY_&cTIb%k`_3|&?C^>! zdo4a|)}MZDiz5iw9W+e2g=spNDi#=pE< zpZd|;$67V6SYzdBt&KkVc+S1?umSa(yp1xdRC^vK6JAsJXsR_V_wUo;XcvWl5birQ z%i6104L5NvFZLb)?gLjk0Ie)hgDlS3i%{qD{W4UTi#9Ht{Y_0QVz-LKM6ULZgwEat zy^QA4RwX*pn|>YkT*-{= zd1Hi#z}B}nDe|Iq1Rdq^bH2s2XMmHd7w^ZVk&`5YgF)PXw@2VnE*}Vn4;$DEHrCYy zt8kNU!l}S-*r@b-?L@;j~Q_H$fboj}9krx*i$_yWCn1Tbq#b3nMqx(IV# zK6|HWOeoDzZpy15tW3zXUAPu69VVAv&{Q$kleApm*+l5+l&9zE5pLBnS%*a!rl$Q~ z3uVkI(xRtX-zaYRpx#76%nnB>bM{YeYW}{5`6Nhi(-gjzl2ZcchclYjlVJjH-#0O6 z)c0XF5-L^bcO?8LYi^EA^Pb{!RPfJQkvGgTtEv_ZJH!gRq{E1<|9Fcn8F z0T|l$-Zu(^j;SQdFK)y;7%Z+Gh=yD*1sNKTx=Z|rx*3;TqT6QYm6tu)aEx=f{UR-` zZQ2@yo!OB4!eq`g6xbdS<73hAzIftOTT4iFQqdWou}%IPnImnQ%Ej_LJIk?pdAx*z>#EMS`_7+I+OtaATT*^6EADjb`%5QzQXIU#_dxj@=$EGV->nK~-v3<% zL>la!Y*sXJJZJ)m>g*a#eaL@2Kat+G9l^l9er@_~sz6O(+BVd|^BHJBC@~~wZ|DI9 zEfjKcT9IG%L=^W~eg)|{Xqq@S($o!S*uV{c;wWeOI8$jNzBQdo!ltUYqG}=Nzwno9 zP%$`6yg}Wow{#~Q{IbX>aalatwIHuyoESA)rrRm{Y_m8n;&u4b|tZRH{fAQ7it_6TRf&#u+iqRpj`XzgN9g_yWc4 z0PP&F;Hqux#j2W1@X&$!hy!r?&T)Uk++jDsyeTRhR#KOtanKu0i?l``| zQ0U|1C!nsyaNP-kv<^P`9WC8~)D=4P!+{N0tmR|ezrHC$KCR!$YJYUL;MonOjO=9Q zTwqPsU#qvNU{8?9L-+iv3Q;qK_CLLg1cB^A*Bw^`8Ll=r-dX}~4F{N7WBc``t~Phg z`Mz&$`e&1CGmbT36vUaA!$468ul^9p|5Cigr=*JN>I-_DM|eWX$w)Mj9CJkybNdY& zgOJ8j)-cL$cIDwlp}C1gztX4Ao=di$g2r-E82TyO4`zxlJmcam0oX9wYCDF0zqJ-h zj!W(ZXQ;3=+|24{N~zunM?Uw_a|@tdp?l6?DZ9oqK*oo6b~aLsEbNd3qGoX{b%o5u z-6Vx;Q!1LS3zLQ- zasH30O^3J5154s`{7KbU9CtT^TD7efDt^Wl)bM0Za(>>CQ4-8%jX$f*=$8sUR)8ga zahb81yBlKmvFugGL}|$bbe-)dBjJNafSdP}n*eMZb6H9f!qxMMx|YH7-?Nfmc*cA& zwL0nYD3;$s*i7%IMQMaGit28%Vm%l{SZL@fKJ~yGJ?%26Gpp17z?2Kdva&Ql&;?{; zMH0i4=oZXt$zj)Z>3~l~;;vM;ER2zj0z8`Xw)LTq$ooms_4!7UF)9=T(4{vvZ#`3&EwfDY|qS|OfACDEUAU;iH3O)}b_x0SB zoi51{y`xjB4BzMLH{3PKIt0B(3?Br@-gB3R?w>IaDpY> z(mcEWK-{!7>0G|BI}{R(MU>HZIl<0k7Npf0o4uq>291-K4-oJTpsl*>CkVy+I`*zp z=|ubVk=>kITY?C#^`|u@z~P22Gl2+25)20EG7QI0>`p7;428`Fqe<*aYNhc)KTWsOU@1aP8uXPC{!y03KM&JFtNT1_8EqE zGSBDrS4`hYOw!Tad-k>-q5J4)$jIh%*mTV@Y_S&C!_a@65Sc4d{(U1ylKm2LJ>wzX zh1Or;z%?^?*GT5-2t3$W8qZ=N)2>rvZtzpXMapFtdJMmJU4hW-IhXZZAK)`A3K>~e zqdLP5!N;9PjNKT-WX=GL)UX|OO-5S%NaHUzheW?pOw=O?zxZ3d&;KKXPcOQ zyqc8OtJPh6z-O_A@8_p(Ds`F-DYH0GUxNviHF1+C_r|q**O0j!RPN4=cT25uGXcIo zjI$dV5lLSdtvSA`G^kjNp{uRG-c;Eb= z5I@X%*-g+q&?nW3bakx{bynhb&w2bv&j)#lk!m%3iWzS@h2-FTAN_z3xtt6$f%goi zKX%_#DA`f$If&!FwUM23ssb@lE`B^4-7fw^mo!b-{8}&BWvGJqNCus3q7zOJM29m7 zTC&WZ4E{X~{>5XRXLX0Sv)lHIMqLDvz1uboK5h)No(5+mo2_+AUwW8_=)$nYBxZ{J z;}^zd>v~k^joGsyEoata#lVW6&cf`tYH*>6GAA!#_*f0SZIO#JJ&3eqZ?pd zoT$Rcpl4uIZ}g0xCzYH)%c zQr4(s=-A6>A>)9d4{$8V7JIFfUfecoXL`Md1{)6|O; z{ZA0mgoSkAj@|>ijl`lq_Ei$RucRX?JONp92{P7p>as24FUEvy-cU{45+Lqb+7^cJ2vq$q!U-A}GBO>Pbcb|HnzBBY#jJWyUZ$|eK{rc6 zXX>|i&9^=*R3R+buc~fVXb=0H~I9W6%9Btx_oqQ(hQGKX8* zj%!QK*@}}KD*MwK7PBH7G6S$kg}K}L9^L4|hs?dfTsSyB@ebc=>D z_|nIM50SLy8CP??ElgrDNCn5p7^PDZs1fG2o+ryDucF2cU3`0jHdGXYFR-EA_t*T#e_iT@x}G9lS6P4ie5p|(dDT8(x#?{7P-3q zFn`~gjl2_T>Yt>D#@=&Ig6p&CCYF2641+8y)mf7hcO1g;*DYhSz*czX!`JRNMyg-Y9=C z0*9btL^M}x=WAt}R>#XyQ!%JsK}uQ2ZnTK-E!)rd-iR(trCdPT0_y;dgS7D0N$$Z_ z-3)Eq-i}jOV~&A-I{0B&x{6-$+iuAeo`o`*uS*M%!zR5hHiN>;KwA?ao{ zZjEoc2+2I$Hn8SMJFV2!)1YBJtkv4K0S>R%D&}5W@eshwC*33k2Htzzs3OWCHfE@6 zzidG33+oEgcbC^ff8Q_*AFa^#m!z3B0i9ue*Pz?YBeUF7(B9 z-F0VFx=kCoRlu@Qr0zmPoJ=f5Iiyy|SIsykU{_bK`&|aWtvylxrXHjOC`)*7Jd^n1Qn; zT!J*MW5nYkp^_8AD7yrUcYALobK;-}%33vxphpwqM{=^f9bw!GwA88|-3eTT4YuAQ z>AmX_8}dKV&N%O}8`cOp&-W5*;nN*XlsR>T8eCZN&=_uLy$v}d1a4!0WFKkdkmX;) zuf`t7HNv!Njh(HA()d57$oW~=eOQBnT>LthxZNl&2N`cH~neMv8s|M zd=jl(U?;&E;~bM^OwpN!4$MDH+M;9pkY|+&!VSG7dp9H@!>g-O}{=qS53h` zXf=3aQk%5H42FH&NvB)1zwsL}d#hEbA_4C^JDkVeYmOkqXlVvnO2^;T*AK~6QYoZ6 z5tOHplIpfvb#RtjAl z8+8Wg`1Oi(9WtJTEd_k2xYHwV9DQh}%Fsw`KC;0Fd8%D|i(|46!S+raI2R{7=`iWG z-M;EPsgzWGf|LL-P?gTqQLZAhDzriSPqcsSxK*4fy8b!n&49GZNxAdTy1GefAoyk< z?3#J2J9!+A;|F|&{?78H1rW;JEcW*B64lJsCcg=va-%;3-iF$jq(AGS!9pEkDo6bG zyomVzdd<^(N59zy5tNMzez8vK31Amfc%TVb$rX6+tb}NYEf1S^$;_H)75A%*Xo@?8 zih+U}-n@eMA1A|I(t==f{RPD29Pp~cMBPx}!avy3C55qocW5}gb=1gjE2TJrjau@( zSt*WX*VWQctVLGubsAUs9an)ufpd_xCzUj&ek?9Rkm%9{iT@IxmcIdt*{?Ndjip}} z2nqWuoo9zlpJ(FC7wf<0F)SF;wQ{x3VtZySrZ1$xEuwF;(?*k1j1K(=CAp`R43hVJ z@o(S`v`g+{0`JB)J-CIj)Unzk+tfSHN%57o<3D*lmRNqmK|?J$a{U;zk<4Y8H(%|) zr@ei4T9(05DoFGFe^k0QV*$^qszci`LCxUw6trEoziQ!hxh5{!;dI}mCn$oN)Pk4%&4_kD=PuVhN4Tv6dVHKA*UWWr5pQ)*fw7xuitu2Ydg zylxlF^h-X*g{<5V^E}W1`=XX;@-sIj6G2R=)h5zc)etl>;OM@M;a_u3&)1~GZYkhi z;sg^CCPDXol0+3tfp5>Oj@_(+O2j2enun3my5C@L+Vo50EIizt;Jt?SIma+2jFJr%Z4ngKXLPoH;Zcgk-kRR;5zkt5`6#htHQSmz59@T zldP;th~%3}y4`1j{=Urhj1yp?`{hH+?%Dnzj8OklE@J0Vr(UkL4#NIj#R+Extaulk zY;js}D)3l0q3Jqswn*6zvRlCP!c22hr)X#2bD8ge3=8q#Is5u4XSaW>A7#A}{hH_X z@Y#q(-mE5SVj+xsatu`0s0_uX&G1@6)0-S+e{cUH1LsNzOAA_r7>gu9RzAf=^^n-u?+!s$3DT+#Y5cZwpm{ z&hQ`GIrSJQB2UcT*?J~WS(cTqi!-iQ21#@tKOa{K=Z=`mQjBQ|2mv1ot&!zh;@Vdz zBM?+=s(MOAy*3rO0G+fJTkfMhMssq%L__M-&XjfGM9d;kOsdXLJD1|A2(v5{`EU2p zd$H;m3+->)me2LdnB@vHHvi7xnV0^%M1K2#8ip^WX1m~BCoSZGCNHPxnG8;+y%@F7#a#=uxKqm7FIp~aB_GfIQI`Y9TB0O46@{RxW=TL{*-lbsC;3& zw!L0R^Va+(|7$COg3G0qL-*juI$*(sqPKCtd z!EUwG=!<6;7lbQu4_yoCq%XG+;K5f6L$VDkzc&0D>vHW>E08!)pL%rW1)OM%{6 z_<{T@lwl=4G=Q{S_X!u?;{A2i`iyc;{Le5YH5GK=JP>ate|vITwxUeK?oI;Vr^%mk z=`GhEhvr#yOr4f_`aN1B$0rQkzrJ@^0Wb)<_Xxw55vNFlsRmvZw_YwDcu2hww>wU? zeivjsuhq!;E4%aNBi&tRf7@zN_=q2$aq5kkO5y3KR&2#Yz)Lhg484Po)2=iXusIv_ zQwXb9=&_9-GM1v>zz-&@B1_KolFFMZ>!TBisv#P+&!>-!mMa|gjq2$%dw+PN z{%Nd=lK%U4EkL0U4qIbSGvt6!tn*10ecBoU%xg$O6fgc2Eqku_!+kYZDcve*l;im$gNTZP zhFrZh`u;-YCI3oR6v1Sfomv5~7fPRHZ*rC^fYmNK2(Ud0P{4R(87D>~xRc);l@=$_ z+;=*(lqxbIeGDO396s{FAk8k$QG3ea)0EB8#6LyTL&*0J+*3mGAUgwKV8}R3GxsPt z6e~E~}l?@auu2x}i;6 zlbahYB5W#d@!}$mhek`&M~dT6G2GjUhDgX%ATmJ8J%$427+T4B`RL|n2lLu*#cLBC zF8sI9wkeuRChm>>bLel^mL`y#GtoMky}jLtP=@~kkBi8lmtcF|u{KoKDvigJP2|4I z=%oKO2<_O9!CQ))_mR=UrZrRS)0YuLBbP*BV*bzd-6}4`)RjsBiCeTqZKdVYX(=l; zt?$$zZl5L8%v{Gh*QFrX4L^Es7||Fts{Yx&ncV}-4LNds=l4o7A-eQnVZNi(kZcxzb?Fb0mVHB~5N^F*p~R4=V4QneDqUNtX{#Zl zN%ew-6`f7p+zj1pJF$88zcO+0@Xpgpkex-&a310y^Ir6IfvQPBI3t><6q1QMe9UYZ zdQo*;Q!5YDTo?J(2hgnSS48I9B*+TihkSS7pF+lc+qG!lL0m60sKbfV`_ch&ml7h? z#ntc@AfILxOJJB=kB=2#k8aWA2BGp<ZD$B?qX*T6hkohs1&Sbek7>0>&|jk3i1x6l>v z@<~_MiN#NK zNsC9B!-0ZHinZKA^*%7ccxB4r?4wWm)s7R8oA|(iS^uLTg=(*{mimpld~SzL5&bo* zq`5b5ksJAA%3n#$WN43|koe`CQ8A2+nc3n5%Q+j~T(~hSJNG!O0Z0|nyTjCGr>yQi zIkqt*d#Y%O=bbR8?*Dr&(qK7vYHVg!&4sEVSzaw6b%b@!3`%=aeIhFb2M)whrzgNR ze-}T+SXF;NdomdUnR#vbE>5lzK7iP0=F*hhovm`2l!`H1t;Y49r8n@}sPO;?-xD@Y zauTwpH3pfN2Dk&v(jYCr4>&>iaC-smUX$%9)F6 zuE(|Zs8lJ!#vMOFH%G){bC5av*CK8%C-SOX@2oOsWSr0Q4I#WS4Jm4ybC+6dtEitM ztVSvq{h1nRXIrsKLTm%SeAudx@IwPU#120HE)K6g$E*1+2R28amB~^`L)J)sxaPFB zZS@ZgfP8f6j0OCLnswqXg!Q#vU3bf{Jd2>HuUm2FA57b^uHCy`~B)Z|kCe1axmz1jOTH=us zQ2C-}9KS#{%Mg5)Hp1QMR%tsX{w7e4cZ#E%&Ero3nfAjwSS#XTY=K`+0YNy@{cG^8 z%z!)c#^6KH!&};*PTh9}e>VWtK5uS`so>EmE;N)$ytTIG9ET zL(hgJ>Vw>HiLt?L{B|hdLO2N>ZcvOOWJ3Dv%(^OA@Te5Vz#kWUR{3Jg{d0_34`>A0 z)xu@_)2)T$JoGMjFj^ST!(%v5-|{4`fd;EC*#2<5^%pdK?;IeHXO;)%Fi3tRhW2JT z-fe*I6yNG}!&zp9?n4f6gHHMn{Y7`wUK{y=J;mu`K~%&|ysWJ$6;xcknDY6b{HL&E z`|ZeRa!hy?v!#4&#EuN@8NnN%CRd)mI=P&9*%6@IA^qd(A5q55K$KQdN)m}l86^#+ ze7@aRtP>Sd5@y01N)||JU`~(mjV!&x>;p4aAi4J3+FuJO4-l)?Eqs#L@*gIC;Ax^i za~IXZwu#yHO5ptJ&$0jLzqEgPgVpvC2ul|^OuY))mYnJM8ld?)?Lyn0Pm%^idaRx~UeyO5R-99N z_N|eSq9P1PX5YxZ2s}DfD9ti4Q8hJ_o$)c&4A{tG?-fLDV5`(U`ey474>RlrVDhzn zf>%WEc!ixltKGT^^aol`AkOj^RMN(w`Sne#97}2UPNt9>w|YwT7UjV_2DB%T%6j;} zf!6+oXYQuLmfKKt8tO~P5@gWislqx8Fl_yf=_7)Fr}i!~AGC%;@Hx9F_NBXgWJEA- zY;yFl{w4_ZfMS(nl7PDY(7k@htLJ@R?l({7d71zjqNVL~nGJxoGeUOzjsq;(>?sOE z&b>3rkYaib(-b)#1$>#1dK|Nfh=s4A@)QdNsdD1I#5rSZXkxYJ>h&=4r9G`?3e9+& z!9AJP+mZ?ZtdWL`{6?MJd&5vHKcPP&Vdd<8>3o8%XjZR_yVpQ>ODTP?5YekO`Y0fD3};C{^1B_Pj5cl(rO zS)!??=+xFj{{YKOu4C=N$h7en(y_bk<)b>Nq^ZvzlM0&3HN+U97@1XNPnqK=wOy0h z&NkUwL_qz6xg_HHu$wI6+JGugn}_1z-h>ZpNoD?7B_wHLsPq1QE^x?cB6IZu;HO3w z_uu|U3he3%zD}6kZeMjU_H8KJxAS34EEG$+n(3EDM(!7%;s+2P)~U+onL=mY&x*hh zu)^Mv5U{>A_Y+Q<~e>32S!0uA_m z_HH_9m_sdC5O`^{BZ%>PG&`%XBVX?OEB1w6rc9qFR6*++OWnU~WHSLUMJ}FRQ5vl8 z6z1`=z4hi&juM<7sS_t${MYR5)1zP|~myka1F^uef1gs;Mzx`gx{1J?IcmoD|dbo@hk6;2l= zLRxz1C3T1=_T}ec1kk9(m0wblgXB1}(k6a}_V6?c$xVFww4-Uk^wqdslD0sjIrk-> z?ypQ+xEw-yB47o5pcWCqdWR460is|JjA}cg%_OR7>T&O%Ux4Dub}!`emregPx4#$h z%+_G<1D%<_)??SuE#6Fi#ksc6;`?72B16Z{Ej>hjwPf{`aj;>B?BdO_!Nik=m#WVH z(3`KA>IU=~4eJ-EM@}nES|-;fi%%3EZ2?Cs9smw7cBvLM)y#S#DF!;A3Tj&2GUn;G z+zv-LS5kf8Ltlj(*ImoM*lbk1HWtecC>8hQZ?GnOgOvd0zc^K2OD%dOdPXqqYA*8m z{z>O|7LhZ(#m&8_doF9dwg2)Q(KJ}YoodBCXwo2L@Yqv8#J6knEK_rkbCtrrEHi z@B6VPn7sl_ugL}T9~h4)=ZWN0g_ENdF=6me7S{huxUoiza-_NUTwg6*0#rtqZn=>* zIhE~IAsr*dyP%DT0)#lwQMlmc_#PI3wAFBs8nY)yL5 zw`+Efv)KiJp^$eQ!>1iH&Lcj6qGIah0)ALCxJ=(aeY*LxTxzGfHyC&G;9cHh2fP+- z(Q(Rt579!$Utz(#jpZq2_Mk}BM|u_Wto)Y2&cr*K1hRgzVtvf_3<`4bv&<U?RV%)XT=;9N?sq%dx>p`Ztj4+-zwI2gX+g*p|*C)W~fSfhcJrGfy ziflo*D~MJ#kA6T#5{i48zQMwB?)(d{Jqc0-;fXxqvx+85CBQ-U>pwYxc z^mG5@1wY6)ePQ8S?L4j0MNu--Cd5$JxX;tkBMRcuH5ROXWh#BrU#PR0_~?g%33pTl z?393#&#V6%68XyF4ID;u$PM~Guk&yie>^7c(Mgu8F#qj)6YRj7w$FL)k*iBhLB-c3 zcZPQ3yS&lYTfBiJtgipgR#*+u!tFs>hFyT@>`lR^PdGMG=6Z$zJu_a*wtg2GdE;#o zTED{6tC<>xa#gno>2sa4;@NXck#a%K98d8PnrwJi{FmeVx;{j#!)@)!wYF#HGlG@; z$ld*e8J~?vBwnn`=VzNrh2qZXliwOaVQvvc{!O(Na_RD$d^zSxmd@7m|Jm5Z<$N(h zn9ONSdft#1RnZ|amjOnHCQ^5Tm{pp#5R_Jv;kZQF-+Iia^Ai|Sq&rA!_%-Ms>hNnqXf=K6$Aji@RW+kSZ{-`yv^QG9s{IP=>MJe-8U zMwbJGdUork2y8nhHjLOWPD-WLH!_1n93GoI~>p`K|v-vCn_uuQf zTc+mG(24YA!$t1o7gmtY(zGS=h;bL$H%;^)>80ajN*ZrMW|7KHLXEBCc^Qo-Znw7D zjQmnC$YI!hGvMaSlslq0BQ}L@H};GyKwXPKqDGihc$tt(O=JD&o;-e(T9XQZ@|^kT zT<07SZxeuM;xI|ENINL%otvLpP<=Fc0Pi<(44*D?6PCp*BKy0_7EXBX%`GQ-ix$le zCLVW7g2%_Q4znR^#QG0TNeI-$yP(O1VUzDg^cN4shAb=rw=QIbBGJhTGu0Bs&gJfJ*|F}cfS*4g3@ex#2R>H^D1ZVa zR@8>T7&^#GQ&ZQ$TJ3J*r~f~{5VXpkP7@Ta=;6TMDCA#5Zl@}TPTfX6PneYA z6)}%Wf@k%mB0JHwN!j8D_je7T)P?;Nd`BA2KTK*qSb4fm{ZSvz)e!!5V_AOJY%+1s ztIQ3{{Rd(wlL~o|RaL$#!n57|@wX*RY_P`@A^su>zN&ggQsv_Cs!3rwZXbJNFTrcCl$>pA+I5Hj0v{F&;i<@K{)!av zMF=HgSrwPjto#4ZEjn{BFCQYausIWLwK2D0I1XElaeO`i1ZBPlSHN8|eoX;`$&aIL2(P4n_W( z8u3!wljr@TCh_fdyjQh5_pK3@|goNo@r#pvviaXyJL# z_x1M~O5%G|qIHby+E#Q3mEAs{2jz0{B!3O=D*NOX#=Z;<~F-ct%1HQyRrP?zj0 zGdGoIC)9RAB?Lphc4|swhw6kKRa2`$<~j)!DX3oV$sAbAe(W}E(#8N&6Q{E>rnV~1fHfkH;9aV+m=H{r^ z#n#Q-N3#u|l?3M&YnKuv08TR*8vrb9aL?)K25`Y8P%HFxhC@KvE0UcnHWx}|U;Mo0 z?*U@LpJw^TZCA;i6#jdRO`C_DC2Z)#noG$tiI5rI=z=XuInROhj(Q8~nTueGPahuE zYS(dO<5h5_Rz10pvh=~=wb4AxF{9c*nu9{}A7{l(@wvsK6(j;MnmfP0%x0Y$;6Aa_i95iM@$+!9Y<%>7W5a7-ZM1zCZC%f$Qpf zRl#SX!z&8HwV2CA>BLUqihohYEr$Ns4_z>7n8%?MF+o+F zx@!St%A*P(6lkUNw;=#SHXTBLSPI2#Rwl-%IQOl;+#Z^DC@cCC(YXEzmSer3@A)V5 zg0nXZ=JcD4_j#fEd9I1^dZ`T}aJu@Q*la7=OXylFStDD1AL;7tw?l&g?aJ`>n&DLqoRTjsyL*c}MuI?8*o zt6NJU2TosH|M-SJkdWME!`xIAKN!=x6+55$Mr)}_U8=co?5#SVKRjgjzddd(QGcQDU?T}qp`IWuf8ib-hGkQ=B>^>D)1j` zF&ZrmjYSQF^`q;93&6UnhMEK_NwWgkfC0|X=FY_?C%wECXJmumg)zA<^4VQppsH70 z#oiBdwVH~^0xM64)ePV^^LW`6iqQ9s^s&y}A{ec76knEekB z+J9!}K8P5t&{VE>N!283nCd5Wgb0%CtpucVL@nb`@OwEtA&5kUv5hHnPEo?e^yrP_Tf(;hNBa0P^`K(GHQU4+Jdn&XB zbabM^r`6JK?s^>j8#wJHYS9`-x8o&xs1EmhgOd&)fXdf^>G$79AJ19q$7&nTKwofZ-m`wJYCSx}T`W#gXaO?FxP90+JT&uN9l#&s#^_LhUkFN*x@+hOe6(A;(J z=j10KrsbFR=mVXXn>4#tNqJEJFq;osVuTmN)F;*t=K{s0#~bxH)Ez=fi97)wg%{=i z^EoK+&ZF*QSy1I2u_C8<7;4AnVN;|1-R5c8YTQVe+(QaX>28fL;(O=PBxKER*wgbb z1B(z@>?Cz4@E>1o%#%F@g79@CKWm2KQhs)2)2=d*D@vcFV(1tZylTMU@&j>X8Fdq| zar~>OhqpHw)VsK2x*)ruf=EfXS*%gqjPugwt-cqxnt5I}Ba6@xk_v?@wMx5tsK|pOw4l+;(BMyper{9x zkl?gGV1Xq$gSv%-AA#jLbPB7VkrQ`vfWi@Kh1YIPW0(ihL4B{PpFgX7b@TZ_Pkchp zH)PmGVCR%(CZoPlNaXGize9p^+fFco5_oiz_TW82!6XA7MW{gao{vc!a!NN^`G-u%Cl|a%S?xe?j%cw2|w-o4NX7N%7d*+K^{UrdLl3UR=}7 zf7Sz-{hMhlUr8f9!~=7x-d}H`fVOitLJ~YkKB@xa)4_2)?1Z83g(nct0`r3V6$AO! z9ag=kF8Vq$Bk5jy|AxFBK%b6W@S%M1bw~8Y#=proa15_ABD=zL;jX_1_2mo-H7&c< zD%ct%y!f3!A^6Txp!snZm>lk$o1hD~kZ!AMZkV(?Uhh6wsi|yLT{?X02vhQSTrCSG zJJ{h4jB5FYtI-N-ix0vy>XMxJ8zX!mX{Vh~;mYX*ChxBWP+*E+6`~<%Z$s|50%s#{}LMVuTG2f)qugS&ErDLBb!PgTP+bI6-6>zk~eo?MTR*>Y^v3ISbJ5}ym)v{ z{Z~x6!0iwt?ap7d$kR4COU$Lpfwz7zV|t_^V15>^?@A+~`?EFGNFA@2-CwCWq`SBUOlR?YQK4_K=kfW3i3b>} zqO#U4nv;#V<#>h%OzQHK`@}D8IOu!NO1uFEF3i z4N*bd7=^aZ)Kz;Zsd2pkgYRDlJw1<#SS2}OQ=Um}V(`8@H$=wk^9^$LS$$XFQ}F#P z7PzCtfO+k!fvB!Y+3oYpYi`p;O%uZZ?pk)F-9O@JF!4P4zJ749hVB(EeXFxVShUo+ zeYHwguIWAXJ-;~CQFgTDu4E)KBv(s`)~u!u(MQcFZSBZOe}|!`l<-nNm^5>sF4AP3 z$r;YbXwe*;b(^T6gK$mZDFwb((q6GauR=XN_x7;2!yi(%Dyo>5laK$#fP8}i&hph~ zg!Evtwtc=bCe`*3`YxD5X66a-p0pfv?`;C3h+hJY+K7ecK@T!z_Mxu10i6H)nu(I5 zpT5TYhaQtJ9ecC^oSHek=pF#NM7{Enn01|$fW&}RvU*e)nI%GalN4lI7T}Q5Qmq!}koruXg2y{GAb?-i z0`f}&&r4lD>)tTY*?lHtVyw|)*LA*YsAD00JP9^p0~JgOCpdtxF1TK9Ptd@`SUu6n z^yW>^M4k|Ap-Sk8$>Qf!OOe193J^VI_J@qwMm@|zl(?o`GqNC+t7@rz%9h=HN78CK z|3Cg}TqCjRS(kmLUxc5chn+QRm6%fYNmrSxgY=z08ZTQCbpS<`C-!wIJv5ku6zx^; z+-U#r9d)FZ!nP%iKI-4rRoRG#a`;^caYc?Vbouw2$ zMAQ)xDBlYxg91HKwZp7T_-)C0pO!)9XB_;}h z>vE7$3gBQrc^7w`x~{ens-FCQ1>Y_=5N!j|41F?&_Ohdq$3?Btb1pP_!!R40wl@JE zu}$s4_49f(J~l#2J;D>O)DS*5@w2Up|EL?pUIlcb53jRqNMiysB)SDeZ_xq!%AIdcXJ3d_;Vr4tkU`*oMnu2DZcp&N9;a zvthDR)YVHsecJ0;xl<*cJfpO%kPZMa^|RYr~p|h|nIp<%L*O`c;@7?oBpm zl1R$~&1TJMcBGza6*I@nX17#U>6yx_w#8>cB*k8iG1jR`Cpk5KA-yZI2*uof;Dk`_ z8-Z4%fV$?OmN6OWT<%KtFJv-1bY=wl*4!~e8sy@!W06U#N_&G*Q(elBbX%5Khe4XJ z=4aZP7d`4h85Nf`ihAx^kp=7|x8G6u)eCvv7V_J*UWl|!xKwxc>i+=0w;xgIT~sQm zFJ~er544LHI+R+JCdX6d$K02{(Z9y9^xKxx?v0)1L`-mfkEp2F?m0h=Uc0vYWw>GY z&~^16{c6%JNB48;OeEyBH}wrVdm^s?05ongj=ZZ6WBn_hoMp>bMd2NG7mVmSu-_B( z&tvUTc#}f8(*FR`ApPyT9vpV|Z%X8y2TFSET;Du2+^=gA+*_TTu&m;b9Gr?Y%da9( zAH8VmQJDaeF7?#a_B@Gb$!zw>-1MSL*H|xE!iECXZ5`Dt33&=JZ=3 z6vuy4#dY6jfxA}-mv3#THuJ+8>LR^YP(^g&Y0CV}oD|}t%WX`pcS(wP%f>k#mFC__ zSv;~ZYuQx!yc*?o9STWr6|EN~&N1&@IBNW=(jyfI@kI^MwC0I?))lWZ%Q5oTfnCL? zhUB)i0%yyC&!uNe1Tho4t$4D;w>Hh?g|uvE!eg_CCyWZ_ul4M|?vDbmYL}4^VpD@$ zj5gnEnUHoFuDm@yZCTAyPUJt{h!E zw2?5fY;E-ZblY>n)TwZxa64BwB;>I<>rNLZ6}Q#&NQlMXn9;tu`E#1)9gDV2Sh$?I z#Z|6~a8Xt|=|`&yD59*`D58o0D58o0D58o0D58o0mNy{cuPYOPD>AM_C20h6Re{mz z(D|$@qZWvI^H{oL#s^+&rCCsn))lI1WlAc-vPWgBWMpDm**1#>Xp2+lK7%dEqKr>$|$i*G|%ViQ`G?&ny+09G5_lkZ7+ zdR@y7D=5lw$9n6fg-H0CQZWZ$R z<@xzp@8uA*Zf(gXc@(KG2Nh2xmZM2_@N4De6W>zmU7AvQ)Nb$(6`PT)Mtet|l--1M6=|0TKD68s*18mtoyM%M85pfN z?*pjMTFvc3L|L|{dTyL%wFp$~Y>UiR<%XmV73+?U84Fr}1-TTVzEX00XAC!Y0Kh&3)`VF~HV%qbC(^HL0|QsMk%8z_SC}OY<#J!7P9V8LB%bc z%QH2cy${_!^-+=Rr`p{sx}<%qG~FH&m7g-$uc_L!5(~?7#(R3#qIhe>DSK#OxWgQ6 zbv+3BS0!y1_J!PbA(cd&62}7`=CZEgpTpXiFtA`dj)Yavm$Zi@#@@WqJ3UXrTW1$K zam~9PozvL+R>T@Pg4^cj1F5OBomnTh7dG6X7-8sr4Oj6Nt#M%r%@Xd3_y@2)hPWzI zsTo;pYT-&r$)gf$krQn^5OGzSb0Nt!fclWTa$BjVB)(r$n%=e@y-zz2HwS4Q3}hCo z5~r5Cg=0fA51n|cZFL)hz3T;qk=-0z5s`avUGh6rmb!}q75h`(-B^>mtyda;Ps(#$ z>Vj&_;`-!yu8!+Wn9c@I71G(l8vX@e?+%scHmP}PH$#(-*sU8M6whgY3Ar2x89nh_ zHE>eZ#h!%>#tm7c-E|10DsVCQ)(y9ZtnY&vw{Ab}SEJ1ht;MpmN0On3zH68BlFo9V z@H*GcE^U$SNk^&Wy7$9fNIALEWex`=9N_*2x&0SQxbqy&g;)#`^fmN+=<-?#m2j*w z2t93Z-*Ic?IEjAn_Hu`# zHfn_5FC)EQsuT1T^3QYK`ym+Kxus;n^ZtKYA^Wu>{o2B+HKxvf`Ei=ywWj%T>0SN* z0Ds23`&#I0)5*RxV~_qDIHUfs{&i)dR$LynSpNX5{HpbSjUA88F&`0&Divy|%yU<+ zI@JgJ)x1v14(KFIs8pX)AakSlNZuu=wjm(F(h& zD}VKCPrUyCR4XLC<7cs#=Q6M>T|Sw9%%NCk*10C?D|bu&wRKj6LF#o+r^7Ot7mU{{ zaT&Lty$b#JfqtNNEwSh%Gv4x8Q@oJI0(Y}H1$+M9)5yy_}9{{U58^&7H0 z)~|B3Y{^#=P2;CEPN#>hbJRsa=sRG1ky{!N&ErOWIs7XsKJ~4j{{YBAzLj`q?<2o1 zcC8y77+}|)Sr{ESte+F<+hSX!AQj-&qW=KL`2PTUj}(8%Jl9=kq4hbWQ>4>8mKR|# z`qx!?0K2pko*SY1*CiMF-^RO9{{SH4{`d5!N!m#K{vA=x+eRjTEx(4k+ua%)jWDS{ zGK_=$E0(bT0FQ>RLx1@4Z}$yhjgyUK%5Q{<2yz*0(V}dKwm14WM`z+&h zQ?EnY{{YoqL2v&6Ar=1sdcA(n?%V$WyI!4jbeRd-Z5$N3TG?K`s~yD-GwW8(oMV>e zt?Iw>8lU~|@THffDte@N*x9vG$PyTYTnes`L-&ZutBd}wpk9W#F*P4U(!kP>V>Oj&zYR&vu}RztMUE8S2t)Y8YnJi>~&{XNa7zRNgst`Ur!A2G|ZhTlKsW{ zRe8VT$^Mm;V2e|4MthHfd`)?)X^^}8rZ3%}e0Qy_W)T#nvyyqP1L2SSg3tYRHR!tk z0Q%3v`d7~4ou<<6dstm*rp}8-kL@}()7J;BdHvjYnUg&YdMAfJVo%C|JiAUu-yOv literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background_oval_checked.xml b/app/src/main/res/drawable/background_oval_checked.xml new file mode 100644 index 00000000..de8667d9 --- /dev/null +++ b/app/src/main/res/drawable/background_oval_checked.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_oval_unchecked.xml b/app/src/main/res/drawable/background_oval_unchecked.xml new file mode 100644 index 00000000..6bc2ac95 --- /dev/null +++ b/app/src/main/res/drawable/background_oval_unchecked.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/border_parental.xml b/app/src/main/res/drawable/border_parental.xml new file mode 100644 index 00000000..055fb3d9 --- /dev/null +++ b/app/src/main/res/drawable/border_parental.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_ios_like.xml b/app/src/main/res/drawable/btn_ios_like.xml new file mode 100644 index 00000000..82e322aa --- /dev/null +++ b/app/src/main/res/drawable/btn_ios_like.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_orange.xml b/app/src/main/res/drawable/btn_orange.xml new file mode 100644 index 00000000..015136be --- /dev/null +++ b/app/src/main/res/drawable/btn_orange.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/btn_white_transparent.xml b/app/src/main/res/drawable/btn_white_transparent.xml new file mode 100644 index 00000000..04580960 --- /dev/null +++ b/app/src/main/res/drawable/btn_white_transparent.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/component_progress.xml b/app/src/main/res/drawable/component_progress.xml new file mode 100644 index 00000000..4323faee --- /dev/null +++ b/app/src/main/res/drawable/component_progress.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_circle.xml b/app/src/main/res/drawable/drawable_white_circle.xml new file mode 100644 index 00000000..65768015 --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_circle.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml new file mode 100644 index 00000000..1d53945f --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_build_black_24dp.xml b/app/src/main/res/drawable/ic_build_black_24dp.xml new file mode 100644 index 00000000..1962aea6 --- /dev/null +++ b/app/src/main/res/drawable/ic_build_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_build_black_24dp_selected.xml b/app/src/main/res/drawable/ic_build_black_24dp_selected.xml new file mode 100644 index 00000000..a634102d --- /dev/null +++ b/app/src/main/res/drawable/ic_build_black_24dp_selected.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml new file mode 100644 index 00000000..6c1fb088 --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 00000000..4e11f689 --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_device_hub_black_24dp.xml b/app/src/main/res/drawable/ic_device_hub_black_24dp.xml new file mode 100644 index 00000000..0123debb --- /dev/null +++ b/app/src/main/res/drawable/ic_device_hub_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_device_hub_black_24dp_selected.xml b/app/src/main/res/drawable/ic_device_hub_black_24dp_selected.xml new file mode 100644 index 00000000..10d6fe4b --- /dev/null +++ b/app/src/main/res/drawable/ic_device_hub_black_24dp_selected.xml @@ -0,0 +1,5 @@ + + + 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 00000000..07d5da9c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_local_florist_black_24dp.xml b/app/src/main/res/drawable/ic_local_florist_black_24dp.xml new file mode 100644 index 00000000..c2854d8d --- /dev/null +++ b/app/src/main/res/drawable/ic_local_florist_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_local_florist_black_24dp_selected.xml b/app/src/main/res/drawable/ic_local_florist_black_24dp_selected.xml new file mode 100644 index 00000000..635695a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_local_florist_black_24dp_selected.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_loyalty_black_24dp.xml b/app/src/main/res/drawable/ic_loyalty_black_24dp.xml new file mode 100644 index 00000000..6e54d2d5 --- /dev/null +++ b/app/src/main/res/drawable/ic_loyalty_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_move_to_inbox_black_24dp.xml b/app/src/main/res/drawable/ic_move_to_inbox_black_24dp.xml new file mode 100644 index 00000000..84240c0f --- /dev/null +++ b/app/src/main/res/drawable/ic_move_to_inbox_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_spa_black_24dp.xml b/app/src/main/res/drawable/ic_spa_black_24dp.xml new file mode 100644 index 00000000..f1dcc9bf --- /dev/null +++ b/app/src/main/res/drawable/ic_spa_black_24dp.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_verified_user_black_24dp.xml b/app/src/main/res/drawable/ic_verified_user_black_24dp.xml new file mode 100644 index 00000000..36793b4e --- /dev/null +++ b/app/src/main/res/drawable/ic_verified_user_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_verified_user_black_24dp_selected.xml b/app/src/main/res/drawable/ic_verified_user_black_24dp_selected.xml new file mode 100644 index 00000000..ef5e9321 --- /dev/null +++ b/app/src/main/res/drawable/ic_verified_user_black_24dp_selected.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_black_24dp.xml b/app/src/main/res/drawable/ic_visibility_black_24dp.xml new file mode 100644 index 00000000..518f0381 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 00000000..7264870f --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..ccd5820f --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/component_custom_dialog.xml b/app/src/main/res/layout/component_custom_dialog.xml new file mode 100644 index 00000000..6e328c83 --- /dev/null +++ b/app/src/main/res/layout/component_custom_dialog.xml @@ -0,0 +1,61 @@ + + + + + + + + + +