From d1de3a852b06d16763f2ac862862de2c74707967 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 09:27:06 -0500 Subject: [PATCH 01/16] Implement NumberPopup --- .../common/dialogs/CheckmarkPopup.kt | 2 + .../activities/common/dialogs/NumberPopup.kt | 112 ++++++++++++++++++ .../habits/list/ListHabitsScreen.kt | 32 ++++- .../habits/list/views/NumberButtonView.kt | 9 +- .../habits/list/views/NumberPanelView.kt | 3 +- .../habits/show/ShowHabitActivity.kt | 2 +- .../isoron/uhabits/utils/ViewExtensions.kt | 16 +++ .../src/main/res/layout/checkmark_popup.xml | 34 +++++- .../src/main/res/values/styles.xml | 15 +++ .../screens/habits/list/ListHabitsBehavior.kt | 16 +-- .../habits/list/ListHabitsBehaviorTest.kt | 7 +- 11 files changed, 222 insertions(+), 26 deletions(-) create mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index 85d7fdfc1..bf4033a73 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -25,6 +25,7 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.View.GONE +import android.view.View.VISIBLE import android.widget.PopupWindow import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.R @@ -59,6 +60,7 @@ class CheckmarkPopup( } init { + view.booleanButtons.visibility = VISIBLE initColors() initTypefaces() hideDisabledButtons() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt new file mode 100644 index 000000000..6a6a557fa --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2016-2021 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.activities.common.dialogs + +import android.content.Context +import android.view.Gravity +import android.view.KeyEvent.KEYCODE_ENTER +import android.view.LayoutInflater +import android.view.MotionEvent.ACTION_DOWN +import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.PopupWindow +import org.isoron.platform.gui.ScreenLocation +import org.isoron.uhabits.core.models.Entry +import org.isoron.uhabits.core.preferences.Preferences +import org.isoron.uhabits.databinding.CheckmarkPopupBinding +import org.isoron.uhabits.utils.dimBehind +import org.isoron.uhabits.utils.dp +import org.isoron.uhabits.utils.requestFocusWithKeyboard +import java.text.DecimalFormat + +class NumberPopup( + private val context: Context, + private var notes: String, + private var value: Double, + private val prefs: Preferences, + private val anchor: View, +) { + var onToggle: (Double, String) -> Unit = { _, _ -> } + private val originalValue = value + + private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { + // Required for round corners + container.clipToOutline = true + } + + init { + view.numberButtons.visibility = VISIBLE + hideDisabledButtons() + populate() + } + + private fun hideDisabledButtons() { + if (!prefs.isSkipEnabled) view.skipBtnNumber.visibility = GONE + } + + private fun populate() { + view.notes.setText(notes) + view.value.setText( + when { + value < 0.01 -> "0" + else -> DecimalFormat("#.##").format(value) + } + ) + } + + fun show(location: ScreenLocation) { + val popup = PopupWindow() + popup.contentView = view.root + popup.width = view.root.dp(POPUP_WIDTH).toInt() + popup.height = view.root.dp(POPUP_HEIGHT).toInt() + popup.isFocusable = true + popup.elevation = view.root.dp(24f) + popup.setOnDismissListener { + save() + } + view.value.setOnKeyListener { _, keyCode, event -> + if (event.action == ACTION_DOWN && keyCode == KEYCODE_ENTER) { + popup.dismiss() + return@setOnKeyListener true + } + return@setOnKeyListener false + } + view.saveBtn.setOnClickListener { popup.dismiss() } + view.skipBtnNumber.setOnClickListener { + view.value.setText((Entry.SKIP.toDouble() / 1000).toString()) + popup.dismiss() + } + popup.showAtLocation( + anchor, + Gravity.NO_GRAVITY, + view.root.dp(location.x.toFloat()).toInt(), + view.root.dp(location.y.toFloat()).toInt(), + ) + view.value.requestFocusWithKeyboard() + popup.dimBehind() + } + + fun save() { + val value = view.value.text.toString().toDoubleOrNull() ?: originalValue + val notes = view.notes.text.toString() + onToggle(value, notes) + } +} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index d5794a388..9fda6370b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -31,6 +31,7 @@ import org.isoron.uhabits.activities.common.dialogs.CheckmarkPopup import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialogFactory import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory +import org.isoron.uhabits.activities.common.dialogs.NumberPopup import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.activities.habits.edit.HabitTypeDialog import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter @@ -242,6 +243,25 @@ class ListHabitsScreen numberPickerFactory.create(value, unit, notes, dateString, frequency, callback).show() } + override fun showNumberPopup( + value: Double, + notes: String, + location: ScreenLocation, + callback: ListHabitsBehavior.NumberPickerCallback + ) { + val view = rootView.get() + NumberPopup( + context = context, + prefs = preferences, + anchor = view, + notes = notes, + value = value, + ).apply { + onToggle = { value, notes -> callback.onNumberPicked(value, notes) } + show(getPopupLocation(location)) + } + } + override fun showCheckmarkPopup( selectedValue: Int, notes: String, @@ -259,15 +279,15 @@ class ListHabitsScreen value = selectedValue, ).apply { onToggle = { value, notes -> callback.onNotesSaved(value, notes) } - show( - ScreenLocation( - x = location.x - POPUP_WIDTH / 2, - y = location.y - ) - ) + show(getPopupLocation(location)) } } + private fun getPopupLocation(clickLocation: ScreenLocation) = ScreenLocation( + x = clickLocation.x - POPUP_WIDTH / 2, + y = clickLocation.y + ) + private fun getExecuteString(command: Command): String? { when (command) { is ArchiveHabitsCommand -> { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 4d8bdda05..7f476015e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -28,6 +28,7 @@ import android.text.TextPaint import android.view.View import android.view.View.OnClickListener import android.view.View.OnLongClickListener +import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.NumericalHabitType.AT_LEAST @@ -37,6 +38,7 @@ import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.utils.InterfaceUtils.getDimension import org.isoron.uhabits.utils.dim import org.isoron.uhabits.utils.drawNotesIndicator +import org.isoron.uhabits.utils.getCenter import org.isoron.uhabits.utils.getFontAwesome import org.isoron.uhabits.utils.sres import java.text.DecimalFormat @@ -108,7 +110,8 @@ class NumberButtonView( invalidate() } - var onEdit: () -> Unit = {} + var onEdit: (ScreenLocation) -> Unit = { _ -> } + private var drawer: Drawer = Drawer(context) init { @@ -117,11 +120,11 @@ class NumberButtonView( } override fun onClick(v: View) { - onEdit() + onEdit(getCenter()) } override fun onLongClick(v: View): Boolean { - onEdit() + onEdit(getCenter()) return true } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt index dc49b557b..c6ce2089f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt @@ -26,7 +26,6 @@ import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.inject.ActivityContext -import org.isoron.uhabits.utils.getCenter import javax.inject.Inject class NumberPanelViewFactory @@ -106,7 +105,7 @@ class NumberPanelView( button.targetType = targetType button.threshold = threshold button.units = units - button.onEdit = { onEdit(getCenter(), timestamp) } + button.onEdit = { location -> onEdit(location, timestamp) } } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index 6eadb1b59..397c6f4ff 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -205,7 +205,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { prefs = preferences, notes = notes, color = view.currentTheme().color(color).toInt(), - anchor = view, + anchor = anchor, value = selectedValue, ).apply { onToggle = { v, n -> callback.onNotesSaved(v, n) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index df140aa79..0a6cbf16d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -28,12 +28,15 @@ import android.graphics.Color import android.graphics.Paint import android.graphics.drawable.ColorDrawable import android.os.Handler +import android.os.SystemClock import android.view.LayoutInflater +import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.WindowManager +import android.widget.EditText import android.widget.PopupWindow import android.widget.RelativeLayout import android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM @@ -256,3 +259,16 @@ fun View.getTopLeftCorner(): ScreenLocation { y = (loc[1] / density).toDouble(), ) } + +fun View.requestFocusWithKeyboard() { + // For some reason, Android does not open the soft keyboard by default when view.requestFocus + // is called. Several online solutions suggest using InputMethodManager, but these solutions + // are not reliable; sometimes the keyboard does not show, and sometimes it does not go away + // after focus is lost. Here, we simulate a click on the view, which triggers the keyboard. + // Based on: https://stackoverflow.com/a/7699556 + postDelayed({ + val time = SystemClock.uptimeMillis() + dispatchTouchEvent(MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, 0f, 0f, 0)) + dispatchTouchEvent(MotionEvent.obtain(time, time, MotionEvent.ACTION_UP, 0f, 0f, 0)) + }, 250) +} diff --git a/uhabits-android/src/main/res/layout/checkmark_popup.xml b/uhabits-android/src/main/res/layout/checkmark_popup.xml index f1aa569a6..72dc79786 100644 --- a/uhabits-android/src/main/res/layout/checkmark_popup.xml +++ b/uhabits-android/src/main/res/layout/checkmark_popup.xml @@ -42,6 +42,8 @@ android:text="" /> - + + + + + + + + + \ No newline at end of file diff --git a/uhabits-android/src/main/res/values/styles.xml b/uhabits-android/src/main/res/values/styles.xml index f25602748..8a016d96d 100644 --- a/uhabits-android/src/main/res/values/styles.xml +++ b/uhabits-android/src/main/res/values/styles.xml @@ -398,4 +398,19 @@ @dimen/smallerTextSize + + diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index b14ecc591..5a8fe1459 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -53,14 +53,8 @@ open class ListHabitsBehavior @Inject constructor( fun onEdit(location: ScreenLocation, habit: Habit, timestamp: Timestamp?) { val entry = habit.computedEntries.get(timestamp!!) if (habit.type == HabitType.NUMERICAL) { - val oldValue = entry.value.toDouble() - screen.showNumberPicker( - oldValue / 1000, - habit.unit, - entry.notes, - timestamp.toDialogDateString(), - habit.frequency - ) { newValue: Double, newNotes: String, -> + val oldValue = entry.value.toDouble() / 1000 + screen.showNumberPopup(oldValue, entry.notes, location) { newValue: Double, newNotes: String -> val value = (newValue * 1000).roundToInt() commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, value, newNotes)) } @@ -170,6 +164,12 @@ open class ListHabitsBehavior @Inject constructor( frequency: Frequency, callback: NumberPickerCallback ) + fun showNumberPopup( + value: Double, + notes: String, + location: ScreenLocation, + callback: NumberPickerCallback + ) fun showCheckmarkPopup( selectedValue: Int, notes: String, diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt index c147fa524..97778338a 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt @@ -34,7 +34,6 @@ import org.hamcrest.core.IsEqual.equalTo import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Entry -import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday @@ -81,12 +80,10 @@ class ListHabitsBehaviorTest : BaseUnitTest() { @Test fun testOnEdit() { behavior.onEdit(ScreenLocation(0.0, 0.0), habit2, getToday()) - verify(screen).showNumberPicker( + verify(screen).showNumberPopup( eq(0.1), - eq("miles"), eq(""), - eq("Jan 25, 2015"), - eq(Frequency.DAILY), + any(), picker.capture() ) picker.lastValue.onNumberPicked(100.0, "") From 2a012619a77c4dc88897dd123d10c3ab831afc0a Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 10:38:12 -0500 Subject: [PATCH 02/16] Use NumberPopup in widgets --- uhabits-android/src/main/AndroidManifest.xml | 2 +- .../isoron/uhabits/utils/ViewExtensions.kt | 1 - .../NumericalCheckmarkWidgetActivity.kt | 49 +++++++++++++------ .../src/main/res/values/styles.xml | 9 ++++ 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/uhabits-android/src/main/AndroidManifest.xml b/uhabits-android/src/main/AndroidManifest.xml index 3b0851207..721a10ae5 100644 --- a/uhabits-android/src/main/AndroidManifest.xml +++ b/uhabits-android/src/main/AndroidManifest.xml @@ -125,7 +125,7 @@ android:exported="true" android:label="NumericalCheckmarkWidget" android:noHistory="true" - android:theme="@style/Theme.AppCompat.Light.Dialog"> + android:theme="@style/Theme.Transparent"> diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index 0a6cbf16d..16d4e6369 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -36,7 +36,6 @@ import android.view.ViewGroup import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.WindowManager -import android.widget.EditText import android.widget.PopupWindow import android.widget.RelativeLayout import android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt index b7bc7f229..080e7916e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt @@ -22,16 +22,21 @@ package org.isoron.uhabits.widgets.activities import android.app.Activity import android.content.Context import android.os.Bundle -import android.view.Window +import android.view.View +import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.widget.FrameLayout +import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.activities.AndroidThemeSwitcher -import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory +import org.isoron.uhabits.activities.common.dialogs.NumberPopup +import org.isoron.uhabits.activities.common.dialogs.POPUP_HEIGHT +import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior import org.isoron.uhabits.core.ui.widgets.WidgetBehavior import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.intents.IntentParser import org.isoron.uhabits.utils.SystemUtils +import org.isoron.uhabits.utils.getCenter import org.isoron.uhabits.widgets.WidgetUpdater class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPickerCallback { @@ -39,11 +44,13 @@ class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPi private lateinit var behavior: WidgetBehavior private lateinit var data: IntentParser.CheckmarkIntentData private lateinit var widgetUpdater: WidgetUpdater + private lateinit var rootView: View override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - requestWindowFeature(Window.FEATURE_NO_TITLE) - setContentView(FrameLayout(this)) + rootView = FrameLayout(this) + rootView.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) + setContentView(rootView) val app = this.applicationContext as HabitsApplication val component = app.component val parser = app.component.intentParser @@ -55,8 +62,9 @@ class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPi component.preferences ) widgetUpdater = component.widgetUpdater - showNumberSelector(this) - + rootView.post { + showNumberSelector(this) + } SystemUtils.unlockScreen(this) } @@ -73,17 +81,28 @@ class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPi private fun showNumberSelector(context: Context) { val app = this.applicationContext as HabitsApplication AndroidThemeSwitcher(this, app.component.preferences).apply() - val numberPickerFactory = NumberPickerFactory(context) val today = DateUtils.getTodayWithOffset() val entry = data.habit.computedEntries.get(today) - numberPickerFactory.create( - entry.value / 1000.0, - data.habit.unit, - entry.notes, - today.toDialogDateString(), - data.habit.frequency, - this - ).show() + NumberPopup( + context = context, + prefs = app.component.preferences, + anchor = rootView, + notes = entry.notes, + value = entry.value / 1000.0, + ).apply { + onToggle = { value, notes -> + onNumberPicked(value, notes) + finish() + overridePendingTransition(0, 0) + } + val center = rootView.getCenter() + show( + ScreenLocation( + x = center.x - POPUP_WIDTH / 2, + y = center.y - POPUP_HEIGHT / 2 + ) + ) + } } companion object { diff --git a/uhabits-android/src/main/res/values/styles.xml b/uhabits-android/src/main/res/values/styles.xml index 8a016d96d..a3b2be8ba 100644 --- a/uhabits-android/src/main/res/values/styles.xml +++ b/uhabits-android/src/main/res/values/styles.xml @@ -413,4 +413,13 @@ + + From 555873354cb246afe9c817e76263ab279673f98d Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 11:25:27 -0500 Subject: [PATCH 03/16] Use NumberPopup in HistoryCard --- .../habits/show/ShowHabitActivity.kt | 48 ++++++++++++++----- .../screens/habits/show/views/HistoryCard.kt | 25 ++++++---- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index 397c6f4ff..6d8528b76 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -23,6 +23,7 @@ import android.os.Bundle import android.view.HapticFeedbackConstants import android.view.Menu import android.view.MenuItem +import android.view.View import androidx.appcompat.app.AppCompatActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -38,6 +39,7 @@ import org.isoron.uhabits.activities.common.dialogs.CheckmarkPopup import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.HistoryEditorDialog import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory +import org.isoron.uhabits.activities.common.dialogs.NumberPopup import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.CommandRunner @@ -187,6 +189,26 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { ).show() } + override fun showNumberPopup( + value: Double, + notes: String, + preferences: Preferences, + location: ScreenLocation, + callback: ListHabitsBehavior.NumberPickerCallback + ) { + val anchor = getPopupAnchor() ?: return + NumberPopup( + context = this@ShowHabitActivity, + prefs = preferences, + notes = notes, + anchor = anchor, + value = value, + ).apply { + onToggle = { v, n -> callback.onNumberPicked(v, n) } + show(computePopupLocation(anchor, location)) + } + } + override fun showCheckmarkPopup( selectedValue: Int, notes: String, @@ -195,11 +217,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { location: ScreenLocation, callback: ListHabitsBehavior.CheckMarkDialogCallback ) { - val dialog = - supportFragmentManager.findFragmentByTag("historyEditor") as HistoryEditorDialog? - ?: return - val view = dialog.dataView - val corner = view.getTopLeftCorner() + val anchor = getPopupAnchor() ?: return CheckmarkPopup( context = this@ShowHabitActivity, prefs = preferences, @@ -209,15 +227,23 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { value = selectedValue, ).apply { onToggle = { v, n -> callback.onNotesSaved(v, n) } - show( - ScreenLocation( - x = corner.x + location.x - POPUP_WIDTH / 2, - y = corner.y + location.y, - ) - ) + show(computePopupLocation(anchor, location)) } } + private fun getPopupAnchor(): View? { + val dialog = supportFragmentManager.findFragmentByTag("historyEditor") as HistoryEditorDialog? + return dialog?.dataView + } + + private fun computePopupLocation(anchor: View, clickLocation: ScreenLocation): ScreenLocation { + val corner = anchor.getTopLeftCorner() + return ScreenLocation( + x = corner.x + clickLocation.x - POPUP_WIDTH / 2, + y = corner.y + clickLocation.y, + ) + } + override fun showEditHabitScreen(habit: Habit) { startActivity(IntentFactory().startEditActivity(this@ShowHabitActivity, habit)) } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt index a6f9fd98b..b2ec71f99 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt @@ -70,7 +70,7 @@ class HistoryCardPresenter( val timestamp = Timestamp.fromLocalDate(date) screen.showFeedback() if (habit.isNumerical) { - showNumberPicker(timestamp) + showNumberPopup(location, timestamp) } else { if (preferences.isShortToggleEnabled) showCheckmarkPopup(location, timestamp) else toggle(timestamp) @@ -81,7 +81,7 @@ class HistoryCardPresenter( val timestamp = Timestamp.fromLocalDate(date) screen.showFeedback() if (habit.isNumerical) { - showNumberPicker(timestamp) + showNumberPopup(location, timestamp) } else { if (preferences.isShortToggleEnabled) toggle(timestamp) else showCheckmarkPopup(location, timestamp) @@ -127,15 +127,14 @@ class HistoryCardPresenter( ) } - private fun showNumberPicker(timestamp: Timestamp) { + private fun showNumberPopup(location: ScreenLocation, timestamp: Timestamp) { val entry = habit.computedEntries.get(timestamp) val oldValue = entry.value - screen.showNumberPicker( - oldValue / 1000.0, - habit.unit, - entry.notes, - timestamp.toDialogDateString(), - frequency = habit.frequency + screen.showNumberPopup( + value = oldValue / 1000.0, + notes = entry.notes, + preferences = preferences, + location = location, ) { newValue: Double, newNotes: String -> val thousands = (newValue * 1000).roundToInt() commandRunner.run( @@ -213,7 +212,13 @@ class HistoryCardPresenter( frequency: Frequency, callback: ListHabitsBehavior.NumberPickerCallback ) - + fun showNumberPopup( + value: Double, + notes: String, + preferences: Preferences, + location: ScreenLocation, + callback: ListHabitsBehavior.NumberPickerCallback, + ) fun showCheckmarkPopup( selectedValue: Int, notes: String, From 9045ae5c2412fbc029a0d21c5c20fce721100082 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 11:28:43 -0500 Subject: [PATCH 04/16] Remove previous NumberPicker --- .../common/dialogs/NumberPickerFactory.kt | 205 ------------------ .../habits/list/ListHabitsScreen.kt | 14 -- .../habits/show/ShowHabitActivity.kt | 20 -- .../screens/habits/list/ListHabitsBehavior.kt | 8 - .../screens/habits/show/views/HistoryCard.kt | 8 - 5 files changed, 255 deletions(-) delete mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt deleted file mode 100644 index 0ee4dad34..000000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (C) 2016-2021 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -package org.isoron.uhabits.activities.common.dialogs - -import android.annotation.SuppressLint -import android.content.Context -import android.content.DialogInterface -import android.content.DialogInterface.BUTTON_NEGATIVE -import android.text.InputFilter -import android.text.Spanned -import android.view.LayoutInflater -import android.view.View -import android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE -import android.view.inputmethod.EditorInfo -import android.view.inputmethod.InputMethodManager -import android.widget.EditText -import android.widget.NumberPicker -import android.widget.TextView -import androidx.appcompat.app.AlertDialog -import org.isoron.uhabits.HabitsApplication -import org.isoron.uhabits.R -import org.isoron.uhabits.core.models.Entry -import org.isoron.uhabits.core.models.Frequency -import org.isoron.uhabits.core.models.Frequency.Companion.DAILY -import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior -import org.isoron.uhabits.inject.ActivityContext -import org.isoron.uhabits.utils.InterfaceUtils -import java.text.DecimalFormatSymbols -import javax.inject.Inject -import kotlin.math.roundToLong - -class NumberPickerFactory -@Inject constructor( - @ActivityContext private val context: Context -) { - @SuppressLint("SetTextI18n") - fun create( - value: Double, - unit: String, - notes: String, - dateString: String, - frequency: Frequency, - callback: ListHabitsBehavior.NumberPickerCallback - ): AlertDialog { - clearCurrentDialog() - - val inflater = LayoutInflater.from(context) - val view = inflater.inflate(R.layout.number_picker_dialog, null) - - val picker = view.findViewById(R.id.picker) - val picker2 = view.findViewById(R.id.picker2) - val etNotes = view.findViewById(R.id.etNotes) - - // Install filter to intercept decimal separator before it is parsed - val watcherFilter: InputFilter = SeparatorWatcherInputFilter(picker2) - val pickerInputText = getNumberPickerInputText(picker) - pickerInputText.filters = arrayOf(watcherFilter).plus(pickerInputText.filters) - - // Install custom focus listener to replace "5" by "50" instead of "05" - val picker2InputText = getNumberPickerInputText(picker2) - val prevFocusChangeListener = picker2InputText.onFocusChangeListener - picker2InputText.onFocusChangeListener = View.OnFocusChangeListener { v, hasFocus -> - val str = picker2InputText.text.toString() - if (str.length == 1) picker2InputText.setText("${str}0") - prevFocusChangeListener.onFocusChange(v, hasFocus) - } - - view.findViewById(R.id.tvUnit).text = unit - view.findViewById(R.id.tvSeparator).text = - DecimalFormatSymbols.getInstance().decimalSeparator.toString() - - val intValue = (value * 100).roundToLong().toInt() - - picker.minValue = 0 - picker.maxValue = Integer.MAX_VALUE / 100 - picker.value = intValue / 100 - picker.wrapSelectorWheel = false - - picker2.minValue = 0 - picker2.maxValue = 99 - picker2.setFormatter { v -> String.format("%02d", v) } - picker2.value = intValue % 100 - - etNotes.setText(notes) - val dialogBuilder = AlertDialog.Builder(context) - .setView(view) - .setTitle(dateString) - .setPositiveButton(R.string.save) { _, _ -> - picker.clearFocus() - picker2.clearFocus() - val v = picker.value + 0.01 * picker2.value - val note = etNotes.text.toString().trim() - callback.onNumberPicked(v, note) - } - .setNegativeButton(android.R.string.cancel) { _, _ -> - callback.onNumberPickerDismissed() - } - .setOnDismissListener { - callback.onNumberPickerDismissed() - currentDialog = null - } - - if (frequency == DAILY) { - dialogBuilder.setNegativeButton(R.string.skip_day) { _, _ -> - picker.clearFocus() - val v = Entry.SKIP.toDouble() / 1000 - val note = etNotes.text.toString() - callback.onNumberPicked(v, note) - } - } - - val dialog = dialogBuilder.create() - - dialog.setOnShowListener { - val preferences = - (context.applicationContext as HabitsApplication).component.preferences - if (!preferences.isSkipEnabled) { - dialog.getButton(BUTTON_NEGATIVE).visibility = View.GONE - } - showSoftInput(dialog, pickerInputText) - } - - InterfaceUtils.setupEditorAction( - picker - ) { _, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_DONE) { - dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick() - } - false - } - - InterfaceUtils.setupEditorAction( - picker2 - ) { _, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_DONE) { - dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick() - } - false - } - - currentDialog = dialog - return dialog - } - - @SuppressLint("DiscouragedPrivateApi") - private fun getNumberPickerInputText(picker: NumberPicker): EditText { - val f = NumberPicker::class.java.getDeclaredField("mInputText") - f.isAccessible = true - return f.get(picker) as EditText - } - - private fun showSoftInput(dialog: AlertDialog, v: View) { - dialog.window?.setSoftInputMode(SOFT_INPUT_STATE_ALWAYS_VISIBLE) - v.requestFocus() - val inputMethodManager = context.getSystemService(InputMethodManager::class.java) - inputMethodManager?.showSoftInput(v, 0) - } - - companion object { - private var currentDialog: AlertDialog? = null - fun clearCurrentDialog() { - currentDialog?.dismiss() - currentDialog = null - } - } -} - -class SeparatorWatcherInputFilter(private val nextPicker: NumberPicker) : InputFilter { - override fun filter( - source: CharSequence?, - start: Int, - end: Int, - dest: Spanned?, - dstart: Int, - dend: Int - ): CharSequence { - if (source == null || source.isEmpty()) { - return "" - } - for (c in source) { - if (c == DecimalFormatSymbols.getInstance().decimalSeparator || c == '.' || c == ',') { - nextPicker.performLongClick() - break - } - } - return source - } -} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 9fda6370b..bba63e8a5 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -30,7 +30,6 @@ import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.dialogs.CheckmarkPopup import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialogFactory import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog -import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory import org.isoron.uhabits.activities.common.dialogs.NumberPopup import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.activities.habits.edit.HabitTypeDialog @@ -43,7 +42,6 @@ import org.isoron.uhabits.core.commands.CreateHabitCommand import org.isoron.uhabits.core.commands.DeleteHabitsCommand import org.isoron.uhabits.core.commands.EditHabitCommand import org.isoron.uhabits.core.commands.UnarchiveHabitsCommand -import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.PaletteColor import org.isoron.uhabits.core.preferences.Preferences @@ -96,7 +94,6 @@ class ListHabitsScreen private val exportDBFactory: ExportDBTaskFactory, private val importTaskFactory: ImportDataTaskFactory, private val colorPickerFactory: ColorPickerDialogFactory, - private val numberPickerFactory: NumberPickerFactory, private val behavior: Lazy, private val preferences: Preferences, private val rootView: Lazy, @@ -232,17 +229,6 @@ class ListHabitsScreen picker.show(activity.supportFragmentManager, "picker") } - override fun showNumberPicker( - value: Double, - unit: String, - notes: String, - dateString: String, - frequency: Frequency, - callback: ListHabitsBehavior.NumberPickerCallback - ) { - numberPickerFactory.create(value, unit, notes, dateString, frequency, callback).show() - } - override fun showNumberPopup( value: Double, notes: String, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index 6d8528b76..e643d30d4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -38,12 +38,10 @@ import org.isoron.uhabits.activities.HabitsDirFinder import org.isoron.uhabits.activities.common.dialogs.CheckmarkPopup import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.HistoryEditorDialog -import org.isoron.uhabits.activities.common.dialogs.NumberPickerFactory import org.isoron.uhabits.activities.common.dialogs.NumberPopup import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.CommandRunner -import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.PaletteColor import org.isoron.uhabits.core.preferences.Preferences @@ -171,24 +169,6 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { window.decorView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY) } - override fun showNumberPicker( - value: Double, - unit: String, - notes: String, - dateString: String, - frequency: Frequency, - callback: ListHabitsBehavior.NumberPickerCallback - ) { - NumberPickerFactory(this@ShowHabitActivity).create( - value, - unit, - notes, - dateString, - frequency, - callback - ).show() - } - override fun showNumberPopup( value: Double, notes: String, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index 5a8fe1459..28f1c9b8b 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -156,14 +156,6 @@ open class ListHabitsBehavior @Inject constructor( fun showHabitScreen(h: Habit) fun showIntroScreen() fun showMessage(m: Message) - fun showNumberPicker( - value: Double, - unit: String, - notes: String, - dateString: String, - frequency: Frequency, - callback: NumberPickerCallback - ) fun showNumberPopup( value: Double, notes: String, diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt index b2ec71f99..276253bc6 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt @@ -204,14 +204,6 @@ class HistoryCardPresenter( interface Screen { fun showHistoryEditorDialog(listener: OnDateClickedListener) fun showFeedback() - fun showNumberPicker( - value: Double, - unit: String, - notes: String, - dateString: String, - frequency: Frequency, - callback: ListHabitsBehavior.NumberPickerCallback - ) fun showNumberPopup( value: Double, notes: String, From 25aeafb75913c5b0608a71d2c43f690dc6fb4798 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 12:01:47 -0500 Subject: [PATCH 05/16] Remove unused imports --- .../uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt | 1 - .../uhabits/core/ui/screens/habits/show/views/HistoryCard.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index 28f1c9b8b..f1a88f411 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -21,7 +21,6 @@ package org.isoron.uhabits.core.ui.screens.habits.list import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateRepetitionCommand -import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.HabitType diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt index 276253bc6..18c044bc2 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt @@ -28,7 +28,6 @@ import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Entry.Companion.SKIP import org.isoron.uhabits.core.models.Entry.Companion.YES_AUTO import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL -import org.isoron.uhabits.core.models.Frequency import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.NumericalHabitType.AT_LEAST From d2d45991b044ab1b2f403764de2dc3c0a0d135cc Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 13 May 2022 06:37:41 -0500 Subject: [PATCH 06/16] Always show popups at the center of the screen; remove ScreenLocation --- .../habits/list/views/EntryButtonViewTest.kt | 2 +- .../habits/list/views/NumberPanelViewTest.kt | 4 +- .../common/dialogs/CheckmarkPopup.kt | 10 +---- .../activities/common/dialogs/NumberPopup.kt | 10 +---- .../habits/list/ListHabitsScreen.kt | 13 +----- .../habits/list/views/CheckmarkButtonView.kt | 8 ++-- .../habits/list/views/CheckmarkPanelView.kt | 5 +-- .../habits/list/views/HabitCardView.kt | 8 ++-- .../habits/list/views/NumberButtonView.kt | 8 ++-- .../habits/list/views/NumberPanelView.kt | 5 +-- .../habits/show/ShowHabitActivity.kt | 17 +------- .../isoron/uhabits/utils/ViewExtensions.kt | 29 ------------- .../NumericalCheckmarkWidgetActivity.kt | 12 +----- .../screens/habits/list/ListHabitsBehavior.kt | 8 +--- .../screens/habits/show/views/HistoryCard.kt | 21 ++++------ .../uhabits/core/ui/views/HistoryChart.kt | 10 ++--- .../habits/list/ListHabitsBehaviorTest.kt | 4 +- .../uhabits/core/ui/views/HistoryChartTest.kt | 41 ++++--------------- 18 files changed, 49 insertions(+), 166 deletions(-) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EntryButtonViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EntryButtonViewTest.kt index 9b807c764..f37cc1838 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EntryButtonViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EntryButtonViewTest.kt @@ -45,7 +45,7 @@ class EntryButtonViewTest : BaseViewTest() { value = Entry.NO color = PaletteUtils.getAndroidTestColor(5) onToggle = { _, _, _ -> toggled = true } - onEdit = { _ -> edited = true } + onEdit = { edited = true } } measureView(view, dpToPixels(48), dpToPixels(48)) } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt index fb816f4d4..6d9ce4e8e 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt @@ -76,7 +76,7 @@ class NumberPanelViewTest : BaseViewTest() { @Test fun testEdit() { val timestamps = mutableListOf() - view.onEdit = { _, t -> timestamps.plusAssign(t) } + view.onEdit = { t -> timestamps.plusAssign(t) } view.buttons[0].performLongClick() view.buttons[2].performLongClick() view.buttons[3].performLongClick() @@ -87,7 +87,7 @@ class NumberPanelViewTest : BaseViewTest() { fun testEdit_withOffset() { val timestamps = mutableListOf() view.dataOffset = 3 - view.onEdit = { _, t -> timestamps += t } + view.onEdit = { t -> timestamps += t } view.buttons[0].performLongClick() view.buttons[2].performLongClick() view.buttons[3].performLongClick() diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index bf4033a73..fd06005cc 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -27,7 +27,6 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.PopupWindow -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry.Companion.NO import org.isoron.uhabits.core.models.Entry.Companion.SKIP @@ -100,7 +99,7 @@ class CheckmarkPopup( view.notes.setText(notes) } - fun show(location: ScreenLocation) { + fun show() { val popup = PopupWindow() popup.contentView = view.root popup.width = view.root.dp(POPUP_WIDTH).toInt() @@ -118,12 +117,7 @@ class CheckmarkPopup( popup.setOnDismissListener { onToggle(value, view.notes.text.toString()) } - popup.showAtLocation( - anchor, - Gravity.NO_GRAVITY, - view.root.dp(location.x.toFloat()).toInt(), - view.root.dp(location.y.toFloat()).toInt(), - ) + popup.showAtLocation(anchor, Gravity.CENTER, 0, 0) popup.dimBehind() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt index 6a6a557fa..fe699175b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt @@ -28,7 +28,6 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.PopupWindow -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.databinding.CheckmarkPopupBinding @@ -72,7 +71,7 @@ class NumberPopup( ) } - fun show(location: ScreenLocation) { + fun show() { val popup = PopupWindow() popup.contentView = view.root popup.width = view.root.dp(POPUP_WIDTH).toInt() @@ -94,12 +93,7 @@ class NumberPopup( view.value.setText((Entry.SKIP.toDouble() / 1000).toString()) popup.dismiss() } - popup.showAtLocation( - anchor, - Gravity.NO_GRAVITY, - view.root.dp(location.x.toFloat()).toInt(), - view.root.dp(location.y.toFloat()).toInt(), - ) + popup.showAtLocation(anchor, Gravity.CENTER, 0, 0) view.value.requestFocusWithKeyboard() popup.dimBehind() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index bba63e8a5..343b50644 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -24,14 +24,12 @@ import android.content.Context import android.content.Intent import androidx.appcompat.app.AppCompatActivity import dagger.Lazy -import org.isoron.platform.gui.ScreenLocation import org.isoron.platform.gui.toInt import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.dialogs.CheckmarkPopup import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialogFactory import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.NumberPopup -import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.activities.habits.edit.HabitTypeDialog import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter import org.isoron.uhabits.core.commands.ArchiveHabitsCommand @@ -232,7 +230,6 @@ class ListHabitsScreen override fun showNumberPopup( value: Double, notes: String, - location: ScreenLocation, callback: ListHabitsBehavior.NumberPickerCallback ) { val view = rootView.get() @@ -244,7 +241,7 @@ class ListHabitsScreen value = value, ).apply { onToggle = { value, notes -> callback.onNumberPicked(value, notes) } - show(getPopupLocation(location)) + show() } } @@ -252,7 +249,6 @@ class ListHabitsScreen selectedValue: Int, notes: String, color: PaletteColor, - location: ScreenLocation, callback: ListHabitsBehavior.CheckMarkDialogCallback ) { val view = rootView.get() @@ -265,15 +261,10 @@ class ListHabitsScreen value = selectedValue, ).apply { onToggle = { value, notes -> callback.onNotesSaved(value, notes) } - show(getPopupLocation(location)) + show() } } - private fun getPopupLocation(clickLocation: ScreenLocation) = ScreenLocation( - x = clickLocation.x - POPUP_WIDTH / 2, - y = clickLocation.y - ) - private fun getExecuteString(command: Command): String? { when (command) { is ArchiveHabitsCommand -> { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt index a408f92ee..176cec62a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt @@ -28,7 +28,6 @@ import android.text.TextPaint import android.view.HapticFeedbackConstants import android.view.View import android.view.View.MeasureSpec.EXACTLY -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Entry.Companion.NO @@ -39,7 +38,6 @@ import org.isoron.uhabits.core.models.Entry.Companion.YES_MANUAL import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.utils.drawNotesIndicator -import org.isoron.uhabits.utils.getCenter import org.isoron.uhabits.utils.getFontAwesome import org.isoron.uhabits.utils.sp import org.isoron.uhabits.utils.sres @@ -83,7 +81,7 @@ class CheckmarkButtonView( var onToggle: (Int, String, Long) -> Unit = { _, _, _ -> } - var onEdit: (ScreenLocation) -> Unit = { _ -> } + var onEdit: () -> Unit = { } private var drawer = Drawer() @@ -105,11 +103,11 @@ class CheckmarkButtonView( override fun onClick(v: View) { if (preferences.isShortToggleEnabled) performToggle(TOGGLE_DELAY_MILLIS) - else onEdit(getCenter()) + else onEdit() } override fun onLongClick(v: View): Boolean { - if (preferences.isShortToggleEnabled) onEdit(getCenter()) + if (preferences.isShortToggleEnabled) onEdit() else performToggle(TOGGLE_DELAY_MILLIS) return true } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt index 62fb3e436..35f639691 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt @@ -20,7 +20,6 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.models.Entry.Companion.UNKNOWN import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences @@ -67,7 +66,7 @@ class CheckmarkPanelView( setupButtons() } - var onEdit: (ScreenLocation, Timestamp) -> Unit = { _, _ -> } + var onEdit: (Timestamp) -> Unit = { _ -> } set(value) { field = value setupButtons() @@ -91,7 +90,7 @@ class CheckmarkPanelView( } button.color = color button.onToggle = { value, notes, delay -> onToggle(timestamp, value, notes, delay) } - button.onEdit = { location -> onEdit(location, timestamp) } + button.onEdit = { onEdit(timestamp) } } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index 7296575e7..424aae50b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -167,17 +167,17 @@ class HabitCardView( { runPendingToggles(taskId) }.delay(delay) } } - onEdit = { location, timestamp -> + onEdit = { timestamp -> triggerRipple(timestamp) - habit?.let { behavior.onEdit(location, it, timestamp) } + habit?.let { behavior.onEdit(it, timestamp) } } } numberPanel = numberPanelFactory.create().apply { visibility = GONE - onEdit = { location, timestamp -> + onEdit = { timestamp -> triggerRipple(timestamp) - habit?.let { behavior.onEdit(location, it, timestamp) } + habit?.let { behavior.onEdit(it, timestamp) } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 7f476015e..03fe66e53 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -28,7 +28,6 @@ import android.text.TextPaint import android.view.View import android.view.View.OnClickListener import android.view.View.OnLongClickListener -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.NumericalHabitType.AT_LEAST @@ -38,7 +37,6 @@ import org.isoron.uhabits.inject.ActivityContext import org.isoron.uhabits.utils.InterfaceUtils.getDimension import org.isoron.uhabits.utils.dim import org.isoron.uhabits.utils.drawNotesIndicator -import org.isoron.uhabits.utils.getCenter import org.isoron.uhabits.utils.getFontAwesome import org.isoron.uhabits.utils.sres import java.text.DecimalFormat @@ -110,7 +108,7 @@ class NumberButtonView( invalidate() } - var onEdit: (ScreenLocation) -> Unit = { _ -> } + var onEdit: () -> Unit = { } private var drawer: Drawer = Drawer(context) @@ -120,11 +118,11 @@ class NumberButtonView( } override fun onClick(v: View) { - onEdit(getCenter()) + onEdit() } override fun onLongClick(v: View): Boolean { - onEdit(getCenter()) + onEdit() return true } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt index c6ce2089f..0c7d142bb 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt @@ -20,7 +20,6 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.models.NumericalHabitType import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences @@ -79,7 +78,7 @@ class NumberPanelView( setupButtons() } - var onEdit: (ScreenLocation, Timestamp) -> Unit = { _, _ -> } + var onEdit: (Timestamp) -> Unit = { _ -> } set(value) { field = value setupButtons() @@ -105,7 +104,7 @@ class NumberPanelView( button.targetType = targetType button.threshold = threshold button.units = units - button.onEdit = { location -> onEdit(location, timestamp) } + button.onEdit = { onEdit(timestamp) } } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index e643d30d4..1e90e1ae9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -28,7 +28,6 @@ import androidx.appcompat.app.AppCompatActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.isoron.platform.gui.ScreenLocation import org.isoron.platform.gui.toInt import org.isoron.uhabits.AndroidDirFinder import org.isoron.uhabits.HabitsApplication @@ -39,7 +38,6 @@ import org.isoron.uhabits.activities.common.dialogs.CheckmarkPopup import org.isoron.uhabits.activities.common.dialogs.ConfirmDeleteDialog import org.isoron.uhabits.activities.common.dialogs.HistoryEditorDialog import org.isoron.uhabits.activities.common.dialogs.NumberPopup -import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.models.Habit @@ -52,7 +50,6 @@ import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitPresenter import org.isoron.uhabits.core.ui.views.OnDateClickedListener import org.isoron.uhabits.intents.IntentFactory import org.isoron.uhabits.utils.currentTheme -import org.isoron.uhabits.utils.getTopLeftCorner import org.isoron.uhabits.utils.showMessage import org.isoron.uhabits.utils.showSendFileScreen import org.isoron.uhabits.widgets.WidgetUpdater @@ -173,7 +170,6 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { value: Double, notes: String, preferences: Preferences, - location: ScreenLocation, callback: ListHabitsBehavior.NumberPickerCallback ) { val anchor = getPopupAnchor() ?: return @@ -185,7 +181,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { value = value, ).apply { onToggle = { v, n -> callback.onNumberPicked(v, n) } - show(computePopupLocation(anchor, location)) + show() } } @@ -194,7 +190,6 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { notes: String, preferences: Preferences, color: PaletteColor, - location: ScreenLocation, callback: ListHabitsBehavior.CheckMarkDialogCallback ) { val anchor = getPopupAnchor() ?: return @@ -207,7 +202,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { value = selectedValue, ).apply { onToggle = { v, n -> callback.onNotesSaved(v, n) } - show(computePopupLocation(anchor, location)) + show() } } @@ -216,14 +211,6 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { return dialog?.dataView } - private fun computePopupLocation(anchor: View, clickLocation: ScreenLocation): ScreenLocation { - val corner = anchor.getTopLeftCorner() - return ScreenLocation( - x = corner.x + clickLocation.x - POPUP_WIDTH / 2, - y = corner.y + clickLocation.y, - ) - } - override fun showEditHabitScreen(habit: Habit) { startActivity(IntentFactory().startEditActivity(this@ShowHabitActivity, habit)) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index 16d4e6369..d0f1f3f92 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -47,7 +47,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.core.content.FileProvider import com.google.android.material.snackbar.Snackbar -import org.isoron.platform.gui.ScreenLocation import org.isoron.platform.gui.toInt import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.R @@ -231,34 +230,6 @@ fun PopupWindow.dimBehind() { wm.updateViewLayout(container, p) } -/** - * Returns the absolute screen coordinates for the center of this view (in density-independent - * pixels). - */ -fun View.getCenter(): ScreenLocation { - val density = resources.displayMetrics.density - val loc = IntArray(2) - this.getLocationInWindow(loc) - return ScreenLocation( - x = ((loc[0] + width / 2) / density).toDouble(), - y = ((loc[1] + height / 2) / density).toDouble(), - ) -} - -/** - * Returns the absolute screen coordinates for the top left corner of this view (in - * density-independent pixels). - */ -fun View.getTopLeftCorner(): ScreenLocation { - val density = resources.displayMetrics.density - val loc = IntArray(2) - this.getLocationInWindow(loc) - return ScreenLocation( - x = (loc[0] / density).toDouble(), - y = (loc[1] / density).toDouble(), - ) -} - fun View.requestFocusWithKeyboard() { // For some reason, Android does not open the soft keyboard by default when view.requestFocus // is called. Several online solutions suggest using InputMethodManager, but these solutions diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt index 080e7916e..a7305521e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt @@ -25,18 +25,14 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.widget.FrameLayout -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.activities.AndroidThemeSwitcher import org.isoron.uhabits.activities.common.dialogs.NumberPopup -import org.isoron.uhabits.activities.common.dialogs.POPUP_HEIGHT -import org.isoron.uhabits.activities.common.dialogs.POPUP_WIDTH import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior import org.isoron.uhabits.core.ui.widgets.WidgetBehavior import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.intents.IntentParser import org.isoron.uhabits.utils.SystemUtils -import org.isoron.uhabits.utils.getCenter import org.isoron.uhabits.widgets.WidgetUpdater class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPickerCallback { @@ -95,13 +91,7 @@ class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPi finish() overridePendingTransition(0, 0) } - val center = rootView.getCenter() - show( - ScreenLocation( - x = center.x - POPUP_WIDTH / 2, - y = center.y - POPUP_HEIGHT / 2 - ) - ) + show() } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index f1a88f411..5041ab066 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -18,7 +18,6 @@ */ package org.isoron.uhabits.core.ui.screens.habits.list -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateRepetitionCommand import org.isoron.uhabits.core.models.Habit @@ -49,11 +48,11 @@ open class ListHabitsBehavior @Inject constructor( screen.showHabitScreen(h) } - fun onEdit(location: ScreenLocation, habit: Habit, timestamp: Timestamp?) { + fun onEdit(habit: Habit, timestamp: Timestamp?) { val entry = habit.computedEntries.get(timestamp!!) if (habit.type == HabitType.NUMERICAL) { val oldValue = entry.value.toDouble() / 1000 - screen.showNumberPopup(oldValue, entry.notes, location) { newValue: Double, newNotes: String -> + screen.showNumberPopup(oldValue, entry.notes) { newValue: Double, newNotes: String -> val value = (newValue * 1000).roundToInt() commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, value, newNotes)) } @@ -62,7 +61,6 @@ open class ListHabitsBehavior @Inject constructor( entry.value, entry.notes, habit.color, - location, ) { newValue, newNotes -> commandRunner.run(CreateRepetitionCommand(habitList, habit, timestamp, newValue, newNotes)) } @@ -158,14 +156,12 @@ open class ListHabitsBehavior @Inject constructor( fun showNumberPopup( value: Double, notes: String, - location: ScreenLocation, callback: NumberPickerCallback ) fun showCheckmarkPopup( selectedValue: Int, notes: String, color: PaletteColor, - location: ScreenLocation, callback: CheckMarkDialogCallback ) fun showSendBugReportToDeveloperScreen(log: String) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt index 18c044bc2..7cde6f0d1 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/HistoryCard.kt @@ -19,7 +19,6 @@ package org.isoron.uhabits.core.ui.screens.habits.show.views -import org.isoron.platform.gui.ScreenLocation import org.isoron.platform.time.DayOfWeek import org.isoron.platform.time.LocalDate import org.isoron.uhabits.core.commands.CommandRunner @@ -65,36 +64,35 @@ class HistoryCardPresenter( val screen: Screen, ) : OnDateClickedListener { - override fun onDateLongPress(location: ScreenLocation, date: LocalDate) { + override fun onDateLongPress(date: LocalDate) { val timestamp = Timestamp.fromLocalDate(date) screen.showFeedback() if (habit.isNumerical) { - showNumberPopup(location, timestamp) + showNumberPopup(timestamp) } else { - if (preferences.isShortToggleEnabled) showCheckmarkPopup(location, timestamp) + if (preferences.isShortToggleEnabled) showCheckmarkPopup(timestamp) else toggle(timestamp) } } - override fun onDateShortPress(location: ScreenLocation, date: LocalDate) { + override fun onDateShortPress(date: LocalDate) { val timestamp = Timestamp.fromLocalDate(date) screen.showFeedback() if (habit.isNumerical) { - showNumberPopup(location, timestamp) + showNumberPopup(timestamp) } else { if (preferences.isShortToggleEnabled) toggle(timestamp) - else showCheckmarkPopup(location, timestamp) + else showCheckmarkPopup(timestamp) } } - private fun showCheckmarkPopup(location: ScreenLocation, timestamp: Timestamp) { + private fun showCheckmarkPopup(timestamp: Timestamp) { val entry = habit.computedEntries.get(timestamp) screen.showCheckmarkPopup( entry.value, entry.notes, preferences, habit.color, - location, ) { newValue, newNotes -> commandRunner.run( CreateRepetitionCommand( @@ -126,14 +124,13 @@ class HistoryCardPresenter( ) } - private fun showNumberPopup(location: ScreenLocation, timestamp: Timestamp) { + private fun showNumberPopup(timestamp: Timestamp) { val entry = habit.computedEntries.get(timestamp) val oldValue = entry.value screen.showNumberPopup( value = oldValue / 1000.0, notes = entry.notes, preferences = preferences, - location = location, ) { newValue: Double, newNotes: String -> val thousands = (newValue * 1000).roundToInt() commandRunner.run( @@ -207,7 +204,6 @@ class HistoryCardPresenter( value: Double, notes: String, preferences: Preferences, - location: ScreenLocation, callback: ListHabitsBehavior.NumberPickerCallback, ) fun showCheckmarkPopup( @@ -215,7 +211,6 @@ class HistoryCardPresenter( notes: String, preferences: Preferences, color: PaletteColor, - location: ScreenLocation, callback: ListHabitsBehavior.CheckMarkDialogCallback, ) } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt index 8d7435540..a752e271c 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/views/HistoryChart.kt @@ -22,7 +22,6 @@ package org.isoron.uhabits.core.ui.views import org.isoron.platform.gui.Canvas import org.isoron.platform.gui.Color import org.isoron.platform.gui.DataView -import org.isoron.platform.gui.ScreenLocation import org.isoron.platform.gui.TextAlign import org.isoron.platform.time.DayOfWeek import org.isoron.platform.time.LocalDate @@ -34,8 +33,8 @@ import kotlin.math.min import kotlin.math.round interface OnDateClickedListener { - fun onDateShortPress(location: ScreenLocation, date: LocalDate) {} - fun onDateLongPress(location: ScreenLocation, date: LocalDate) {} + fun onDateShortPress(date: LocalDate) {} + fun onDateLongPress(date: LocalDate) {} } class HistoryChart( @@ -91,11 +90,10 @@ class HistoryChart( if (x - padding < 0 || row == 0 || row > 7 || col == nColumns) return val clickedDate = topLeftDate.plus(offset) if (clickedDate.isNewerThan(today)) return - val location = ScreenLocation(x, y) if (isLongClick) { - onDateClickedListener.onDateLongPress(location, clickedDate) + onDateClickedListener.onDateLongPress(clickedDate) } else { - onDateClickedListener.onDateShortPress(location, clickedDate) + onDateClickedListener.onDateShortPress(clickedDate) } } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt index 97778338a..c5e5f7b44 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.kt @@ -31,7 +31,6 @@ import junit.framework.Assert.assertTrue import org.apache.commons.io.FileUtils import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual.equalTo -import org.isoron.platform.gui.ScreenLocation import org.isoron.uhabits.core.BaseUnitTest import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.Habit @@ -79,11 +78,10 @@ class ListHabitsBehaviorTest : BaseUnitTest() { @Test fun testOnEdit() { - behavior.onEdit(ScreenLocation(0.0, 0.0), habit2, getToday()) + behavior.onEdit(habit2, getToday()) verify(screen).showNumberPopup( eq(0.1), eq(""), - any(), picker.capture() ) picker.lastValue.onNumberPicked(100.0, "") diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt index 8373805b7..d25483fb1 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/ui/views/HistoryChartTest.kt @@ -24,7 +24,6 @@ import com.nhaarman.mockitokotlin2.reset import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions import kotlinx.coroutines.runBlocking -import org.isoron.platform.gui.ScreenLocation import org.isoron.platform.gui.assertRenders import org.isoron.platform.time.DayOfWeek import org.isoron.platform.time.DayOfWeek.SUNDAY @@ -90,32 +89,20 @@ class HistoryChartTest { // Click top left date view.onClick(20.0, 46.0) - verify(dateClickedListener).onDateShortPress( - ScreenLocation(20.0, 46.0), - LocalDate(2014, 10, 26) - ) + verify(dateClickedListener).onDateShortPress(LocalDate(2014, 10, 26)) reset(dateClickedListener) view.onClick(2.0, 28.0) - verify(dateClickedListener).onDateShortPress( - ScreenLocation(2.0, 28.0), - LocalDate(2014, 10, 26) - ) + verify(dateClickedListener).onDateShortPress(LocalDate(2014, 10, 26)) reset(dateClickedListener) // Click date in the middle view.onClick(163.0, 113.0) - verify(dateClickedListener).onDateShortPress( - ScreenLocation(163.0, 113.0), - LocalDate(2014, 12, 10) - ) + verify(dateClickedListener).onDateShortPress(LocalDate(2014, 12, 10)) reset(dateClickedListener) // Click today view.onClick(336.0, 37.0) - verify(dateClickedListener).onDateShortPress( - ScreenLocation(336.0, 37.0), - LocalDate(2015, 1, 25) - ) + verify(dateClickedListener).onDateShortPress(LocalDate(2015, 1, 25)) reset(dateClickedListener) // Click header @@ -133,32 +120,20 @@ class HistoryChartTest { // Click top left date view.onLongClick(20.0, 46.0) - verify(dateClickedListener).onDateLongPress( - ScreenLocation(20.0, 46.0), - LocalDate(2014, 10, 26) - ) + verify(dateClickedListener).onDateLongPress(LocalDate(2014, 10, 26)) reset(dateClickedListener) view.onLongClick(2.0, 28.0) - verify(dateClickedListener).onDateLongPress( - ScreenLocation(2.0, 28.0), - LocalDate(2014, 10, 26) - ) + verify(dateClickedListener).onDateLongPress(LocalDate(2014, 10, 26)) reset(dateClickedListener) // Click date in the middle view.onLongClick(163.0, 113.0) - verify(dateClickedListener).onDateLongPress( - ScreenLocation(163.0, 113.0), - LocalDate(2014, 12, 10) - ) + verify(dateClickedListener).onDateLongPress(LocalDate(2014, 12, 10)) reset(dateClickedListener) // Click today view.onLongClick(336.0, 37.0) - verify(dateClickedListener).onDateLongPress( - ScreenLocation(336.0, 37.0), - LocalDate(2015, 1, 25) - ) + verify(dateClickedListener).onDateLongPress(LocalDate(2015, 1, 25)) reset(dateClickedListener) // Click header From a6180a504943f1e19ac1545f16d8e77bec78a6cb Mon Sep 17 00:00:00 2001 From: eduebernal Date: Tue, 5 Jul 2022 21:41:27 -0700 Subject: [PATCH 07/16] fix marker scaling in freq display --- .../activities/common/views/FrequencyChart.kt | 9 +++++--- .../isoron/uhabits/core/utils/DateUtils.kt | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt index 93a97dc41..72e3c0479 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt @@ -29,6 +29,7 @@ import org.isoron.uhabits.core.utils.DateUtils.Companion.getShortWeekdayNames import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendar import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayCalendarWithOffset import org.isoron.uhabits.core.utils.DateUtils.Companion.getWeekdaySequence +import org.isoron.uhabits.core.utils.DateUtils.Companion.getWeekdaysInMonth import org.isoron.uhabits.utils.ColorUtils.mixColors import org.isoron.uhabits.utils.StyledResources import org.isoron.uhabits.utils.toSimpleDataFormat @@ -166,6 +167,7 @@ class FrequencyChart : ScrollableChart { private fun drawColumn(canvas: Canvas, rect: RectF?, date: GregorianCalendar) { val values = frequency[Timestamp(date)] + val weekDaysInMonth = getWeekdaysInMonth(Timestamp(date)) val rowHeight = rect!!.height() / 8.0f prevRect!!.set(rect) val localeWeekdayList: Array = getWeekdaySequence(firstWeekday) @@ -174,7 +176,7 @@ class FrequencyChart : ScrollableChart { rect.offset(prevRect!!.left, prevRect!!.top + baseSize * j) val i = localeWeekdayList[j] % 7 if (values != null) - drawMarker(canvas, rect, values[i]) + drawMarker(canvas, rect, values[i], weekDaysInMonth[i]) rect.offset(0f, rowHeight) } drawFooter(canvas, rect, date) @@ -222,7 +224,7 @@ class FrequencyChart : ScrollableChart { canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, pGrid!!) } - private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?) { + private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?, frequency: Int) { // value can be negative when the entry is skipped val valueCopy = value?.let { max(0, it) } @@ -230,7 +232,8 @@ class FrequencyChart : ScrollableChart { // maximal allowed mark radius val maxRadius = (rect.height() - 2 * padding) / 2.0f // the real mark radius is scaled down by a factor depending on the maximal frequency - val scale = 1.0f / maxFreq * valueCopy!! + + val scale = 1.0f / frequency * valueCopy!! val radius = maxRadius * scale val colorIndex = min((colors.size - 1), ((colors.size - 1) * scale).roundToInt()) pGraph!!.color = colors[colorIndex] diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt index 7c2c0a4fd..010b26e4a 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.core.utils import org.isoron.uhabits.core.models.Timestamp +import java.time.YearMonth import java.util.Calendar import java.util.Calendar.DAY_OF_MONTH import java.util.Calendar.DAY_OF_WEEK @@ -178,6 +179,26 @@ abstract class DateUtils { return getWeekdayNames(GregorianCalendar.SHORT, firstWeekday) } + /** + * Returns a vector of Int representing the frequency of each weekday in a given month. + * + * @param startOfMonth a Timestamp representing the beginning of the month. + */ + @JvmStatic + fun getWeekdaysInMonth(startOfMonth: Timestamp): Array { + val month = startOfMonth.toCalendar()[Calendar.MONTH] + 1 + val year = startOfMonth.toCalendar()[Calendar.YEAR] + val weekday = startOfMonth.weekday + val extraWeekdays = YearMonth.of(year, month).lengthOfMonth() - 28 + + val freq = Array(7) { 4 } + for (day in weekday until weekday + extraWeekdays) { + freq[day % 7] = 5 + } + + return freq + } + @JvmStatic fun getToday(): Timestamp = Timestamp(getStartOfToday()) From e15e06034c4b524dc131162697564f84b77e408e Mon Sep 17 00:00:00 2001 From: eduebernal Date: Tue, 5 Jul 2022 23:53:39 -0700 Subject: [PATCH 08/16] remove unused maxFreq var and get method --- .../activities/common/views/FrequencyChart.kt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt index 72e3c0479..417ab21f2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.kt @@ -63,7 +63,6 @@ class FrequencyChart : ScrollableChart { private var primaryColor = 0 private var isBackgroundTransparent = false private lateinit var frequency: HashMap> - private var maxFreq = 0 private var firstWeekday = Calendar.SUNDAY constructor(context: Context?) : super(context) { @@ -83,7 +82,6 @@ class FrequencyChart : ScrollableChart { fun setFrequency(frequency: java.util.HashMap>) { this.frequency = frequency - maxFreq = getMaxFreq(frequency) postInvalidate() } @@ -92,15 +90,6 @@ class FrequencyChart : ScrollableChart { postInvalidate() } - private fun getMaxFreq(frequency: HashMap>): Int { - var maxValue = 1 - for (values in frequency.values) for (value in values) maxValue = max( - value, - maxValue - ) - return maxValue - } - fun setIsBackgroundTransparent(isBackgroundTransparent: Boolean) { this.isBackgroundTransparent = isBackgroundTransparent initColors() @@ -296,6 +285,5 @@ class FrequencyChart : ScrollableChart { frequency[Timestamp(date)] = values date.add(Calendar.MONTH, -1) } - maxFreq = getMaxFreq(frequency) } } From 9bd1c6f685fa2bca38fdba5a3a6a0dd5b37f9776 Mon Sep 17 00:00:00 2001 From: eduebernal Date: Wed, 6 Jul 2022 10:48:19 -0700 Subject: [PATCH 09/16] change getWeekdaysInMonth method --- .../java/org/isoron/uhabits/core/utils/DateUtils.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt index 010b26e4a..b06513140 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt @@ -189,11 +189,11 @@ abstract class DateUtils { val month = startOfMonth.toCalendar()[Calendar.MONTH] + 1 val year = startOfMonth.toCalendar()[Calendar.YEAR] val weekday = startOfMonth.weekday - val extraWeekdays = YearMonth.of(year, month).lengthOfMonth() - 28 + val monthLength = YearMonth.of(year, month).lengthOfMonth() - val freq = Array(7) { 4 } - for (day in weekday until weekday + extraWeekdays) { - freq[day % 7] = 5 + val freq = Array(7) { 0 } + for (day in weekday until weekday + monthLength) { + freq[day % 7] += 1 } return freq From 8912a9d73c78285425e04bfd54c601d8016852ca Mon Sep 17 00:00:00 2001 From: eduebernal Date: Wed, 6 Jul 2022 10:48:58 -0700 Subject: [PATCH 10/16] add test for getWeekdaysInMonth --- .../uhabits/core/utils/DateUtilsTest.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt index 75280ab9b..7f505ee13 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt @@ -118,6 +118,31 @@ class DateUtilsTest : BaseUnitTest() { assertThat(arrayOf("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"), equalTo(longWeekdayNames)) } + @Test + fun getWeekdaysInMonth() { + val february = GregorianCalendar(2018, Calendar.FEBRUARY, 1) + val leapFebruary = GregorianCalendar(2020, Calendar.FEBRUARY, 1) + val month = GregorianCalendar(2020, Calendar.APRIL, 1) + val longMonth = GregorianCalendar(2020, Calendar.AUGUST, 1) + + assertThat( + DateUtils.getWeekdaysInMonth(Timestamp(february)), + equalTo(arrayOf(4, 4, 4, 4, 4, 4, 4)) + ) + assertThat( + DateUtils.getWeekdaysInMonth(Timestamp(leapFebruary)), + equalTo(arrayOf(4, 4, 4, 4, 4, 4, 5)) + ) + assertThat( + DateUtils.getWeekdaysInMonth(Timestamp(month)), + equalTo(arrayOf(4, 4, 4, 5, 5, 4, 4)) + ) + assertThat( + DateUtils.getWeekdaysInMonth(Timestamp(longMonth)), + equalTo(arrayOf(5, 5, 4, 4, 4, 4, 5)) + ) + } + @Test fun testGetToday() { setFixedLocalTime(FIXED_LOCAL_TIME) From dd47d4cf0840df6ab068e5eacf82ce7a6737fb5d Mon Sep 17 00:00:00 2001 From: eduebernal Date: Wed, 6 Jul 2022 15:09:10 -0700 Subject: [PATCH 11/16] fix getWeekdaysInMonth test --- .../isoron/uhabits/core/utils/DateUtilsTest.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt index 7f505ee13..22b6e0057 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt @@ -126,20 +126,20 @@ class DateUtilsTest : BaseUnitTest() { val longMonth = GregorianCalendar(2020, Calendar.AUGUST, 1) assertThat( - DateUtils.getWeekdaysInMonth(Timestamp(february)), - equalTo(arrayOf(4, 4, 4, 4, 4, 4, 4)) + arrayOf(4, 4, 4, 4, 4, 4, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(february))) ) assertThat( - DateUtils.getWeekdaysInMonth(Timestamp(leapFebruary)), - equalTo(arrayOf(4, 4, 4, 4, 4, 4, 5)) + arrayOf(5, 4, 4, 4, 4, 4, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(leapFebruary))) ) assertThat( - DateUtils.getWeekdaysInMonth(Timestamp(month)), - equalTo(arrayOf(4, 4, 4, 5, 5, 4, 4)) + arrayOf(4, 4, 4, 4, 5, 5, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(month))) ) assertThat( - DateUtils.getWeekdaysInMonth(Timestamp(longMonth)), - equalTo(arrayOf(5, 5, 4, 4, 4, 4, 5)) + arrayOf(5, 5, 5, 4, 4, 4, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(longMonth))) ) } From b0a4f26e7a3b121a1e7efee80cca781302c5c044 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 24 Jul 2022 05:31:15 -0500 Subject: [PATCH 12/16] Popup: Fix crash on suggestions --- .../uhabits/activities/common/dialogs/CheckmarkPopup.kt | 6 ++++++ .../isoron/uhabits/activities/common/dialogs/NumberPopup.kt | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index fd06005cc..ffb1aa905 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -21,12 +21,14 @@ package org.isoron.uhabits.activities.common.dialogs import android.content.Context import android.graphics.drawable.ColorDrawable +import android.text.InputType import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.PopupWindow +import kotlinx.android.synthetic.main.checkmark_popup.view.* import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry.Companion.NO import org.isoron.uhabits.core.models.Entry.Companion.SKIP @@ -56,6 +58,10 @@ class CheckmarkPopup( private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { // Required for round corners container.clipToOutline = true + + // Android bugfix: Allowing suggestions in a popup causes a crash. + // stackoverflow.com/questions/4829718 + container.notes.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS } init { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt index fe699175b..a7183323f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt @@ -20,6 +20,7 @@ package org.isoron.uhabits.activities.common.dialogs import android.content.Context +import android.text.InputType import android.view.Gravity import android.view.KeyEvent.KEYCODE_ENTER import android.view.LayoutInflater @@ -28,6 +29,7 @@ import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.PopupWindow +import kotlinx.android.synthetic.main.checkmark_popup.view.* import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.databinding.CheckmarkPopupBinding @@ -49,6 +51,10 @@ class NumberPopup( private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { // Required for round corners container.clipToOutline = true + + // Android bugfix: Allowing suggestions in a popup causes a crash. + // stackoverflow.com/questions/4829718 + container.notes.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS } init { From 7649119db78e151b41df7c00ff48851d7e749072 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 24 Jul 2022 05:41:52 -0500 Subject: [PATCH 13/16] Popup: Do not save on dismiss --- .../activities/common/dialogs/CheckmarkPopup.kt | 14 ++++++++------ .../activities/common/dialogs/NumberPopup.kt | 15 ++++++++------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index ffb1aa905..0b7129387 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -54,6 +54,7 @@ class CheckmarkPopup( private val anchor: View, ) { var onToggle: (Int, String) -> Unit = { _, _ -> } + private lateinit var popup: PopupWindow private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { // Required for round corners @@ -101,12 +102,11 @@ class CheckmarkPopup( SKIP -> if (prefs.isSkipEnabled) view.skipBtn else view.noBtn else -> null } - selectedBtn?.background = ColorDrawable(view.root.sres.getColor(R.attr.contrast40)) view.notes.setText(notes) } fun show() { - val popup = PopupWindow() + popup = PopupWindow() popup.contentView = view.root popup.width = view.root.dp(POPUP_WIDTH).toInt() popup.height = view.root.dp(POPUP_HEIGHT).toInt() @@ -114,16 +114,18 @@ class CheckmarkPopup( popup.elevation = view.root.dp(24f) fun onClick(v: Int) { this.value = v - popup.dismiss() + save() } view.yesBtn.setOnClickListener { onClick(YES_MANUAL) } view.noBtn.setOnClickListener { onClick(NO) } view.skipBtn.setOnClickListener { onClick(SKIP) } view.unknownBtn.setOnClickListener { onClick(UNKNOWN) } - popup.setOnDismissListener { - onToggle(value, view.notes.text.toString()) - } popup.showAtLocation(anchor, Gravity.CENTER, 0, 0) popup.dimBehind() } + + fun save() { + onToggle(value, view.notes.text.toString().trim()) + popup.dismiss() + } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt index a7183323f..d0ed17a9b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt @@ -47,6 +47,7 @@ class NumberPopup( ) { var onToggle: (Double, String) -> Unit = { _, _ -> } private val originalValue = value + private lateinit var popup: PopupWindow private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { // Required for round corners @@ -78,26 +79,25 @@ class NumberPopup( } fun show() { - val popup = PopupWindow() + popup = PopupWindow() popup.contentView = view.root popup.width = view.root.dp(POPUP_WIDTH).toInt() popup.height = view.root.dp(POPUP_HEIGHT).toInt() popup.isFocusable = true popup.elevation = view.root.dp(24f) - popup.setOnDismissListener { - save() - } view.value.setOnKeyListener { _, keyCode, event -> if (event.action == ACTION_DOWN && keyCode == KEYCODE_ENTER) { - popup.dismiss() + save() return@setOnKeyListener true } return@setOnKeyListener false } - view.saveBtn.setOnClickListener { popup.dismiss() } + view.saveBtn.setOnClickListener { + save() + } view.skipBtnNumber.setOnClickListener { view.value.setText((Entry.SKIP.toDouble() / 1000).toString()) - popup.dismiss() + save() } popup.showAtLocation(anchor, Gravity.CENTER, 0, 0) view.value.requestFocusWithKeyboard() @@ -108,5 +108,6 @@ class NumberPopup( val value = view.value.text.toString().toDoubleOrNull() ?: originalValue val notes = view.notes.text.toString() onToggle(value, notes) + popup.dismiss() } } From 3021e408a7ff0a1ccdc54742aaf8835a81937938 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 24 Jul 2022 06:01:40 -0500 Subject: [PATCH 14/16] Remove unused imports --- .../isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index 0b7129387..85d4d3d7d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -20,7 +20,6 @@ package org.isoron.uhabits.activities.common.dialogs import android.content.Context -import android.graphics.drawable.ColorDrawable import android.text.InputType import android.view.Gravity import android.view.LayoutInflater From e4b16f6d5936c3647f7e851c172d9ac0544ae70b Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 30 Jul 2022 16:33:16 -0500 Subject: [PATCH 15/16] Replace PopupWindow by Dialog Fixes issues with copy & paste, text selection and spell checking. --- .../common/dialogs/CheckmarkPopup.kt | 33 ++++++++---------- .../activities/common/dialogs/NumberPopup.kt | 34 +++++++++---------- .../isoron/uhabits/utils/ViewExtensions.kt | 15 +++----- 3 files changed, 35 insertions(+), 47 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index 85d4d3d7d..9a862076f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -19,15 +19,12 @@ package org.isoron.uhabits.activities.common.dialogs +import android.app.Dialog import android.content.Context -import android.text.InputType -import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.widget.PopupWindow -import kotlinx.android.synthetic.main.checkmark_popup.view.* import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry.Companion.NO import org.isoron.uhabits.core.models.Entry.Companion.SKIP @@ -53,15 +50,11 @@ class CheckmarkPopup( private val anchor: View, ) { var onToggle: (Int, String) -> Unit = { _, _ -> } - private lateinit var popup: PopupWindow + private lateinit var dialog: Dialog private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { // Required for round corners container.clipToOutline = true - - // Android bugfix: Allowing suggestions in a popup causes a crash. - // stackoverflow.com/questions/4829718 - container.notes.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS } init { @@ -105,12 +98,15 @@ class CheckmarkPopup( } fun show() { - popup = PopupWindow() - popup.contentView = view.root - popup.width = view.root.dp(POPUP_WIDTH).toInt() - popup.height = view.root.dp(POPUP_HEIGHT).toInt() - popup.isFocusable = true - popup.elevation = view.root.dp(24f) + dialog = Dialog(context, android.R.style.Theme_NoTitleBar) + dialog.setContentView(view.root) + dialog.window?.apply { + setLayout( + view.root.dp(POPUP_WIDTH).toInt(), + view.root.dp(POPUP_HEIGHT).toInt() + ) + setBackgroundDrawableResource(android.R.color.transparent) + } fun onClick(v: Int) { this.value = v save() @@ -119,12 +115,13 @@ class CheckmarkPopup( view.noBtn.setOnClickListener { onClick(NO) } view.skipBtn.setOnClickListener { onClick(SKIP) } view.unknownBtn.setOnClickListener { onClick(UNKNOWN) } - popup.showAtLocation(anchor, Gravity.CENTER, 0, 0) - popup.dimBehind() + dialog.setCanceledOnTouchOutside(true) + dialog.dimBehind() + dialog.show() } fun save() { onToggle(value, view.notes.text.toString().trim()) - popup.dismiss() + dialog.dismiss() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt index d0ed17a9b..11f63215f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt @@ -19,17 +19,14 @@ package org.isoron.uhabits.activities.common.dialogs +import android.app.Dialog import android.content.Context -import android.text.InputType -import android.view.Gravity import android.view.KeyEvent.KEYCODE_ENTER import android.view.LayoutInflater import android.view.MotionEvent.ACTION_DOWN import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.widget.PopupWindow -import kotlinx.android.synthetic.main.checkmark_popup.view.* import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.databinding.CheckmarkPopupBinding @@ -47,15 +44,11 @@ class NumberPopup( ) { var onToggle: (Double, String) -> Unit = { _, _ -> } private val originalValue = value - private lateinit var popup: PopupWindow + private lateinit var dialog: Dialog private val view = CheckmarkPopupBinding.inflate(LayoutInflater.from(context)).apply { // Required for round corners container.clipToOutline = true - - // Android bugfix: Allowing suggestions in a popup causes a crash. - // stackoverflow.com/questions/4829718 - container.notes.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS } init { @@ -79,12 +72,16 @@ class NumberPopup( } fun show() { - popup = PopupWindow() - popup.contentView = view.root - popup.width = view.root.dp(POPUP_WIDTH).toInt() - popup.height = view.root.dp(POPUP_HEIGHT).toInt() - popup.isFocusable = true - popup.elevation = view.root.dp(24f) + dialog = Dialog(context, android.R.style.Theme_NoTitleBar) + dialog.setContentView(view.root) + dialog.window?.apply { + setLayout( + view.root.dp(POPUP_WIDTH).toInt(), + view.root.dp(POPUP_HEIGHT).toInt() + ) + setBackgroundDrawableResource(android.R.color.transparent) + } + view.value.setOnKeyListener { _, keyCode, event -> if (event.action == ACTION_DOWN && keyCode == KEYCODE_ENTER) { save() @@ -99,15 +96,16 @@ class NumberPopup( view.value.setText((Entry.SKIP.toDouble() / 1000).toString()) save() } - popup.showAtLocation(anchor, Gravity.CENTER, 0, 0) view.value.requestFocusWithKeyboard() - popup.dimBehind() + dialog.setCanceledOnTouchOutside(true) + dialog.dimBehind() + dialog.show() } fun save() { val value = view.value.text.toString().toDoubleOrNull() ?: originalValue val notes = view.notes.text.toString() onToggle(value, notes) - popup.dismiss() + dialog.dismiss() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index d0f1f3f92..35a8cecbd 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -20,8 +20,8 @@ package org.isoron.uhabits.utils import android.app.Activity +import android.app.Dialog import android.content.ActivityNotFoundException -import android.content.Context import android.content.Intent import android.graphics.Canvas import android.graphics.Color @@ -36,7 +36,6 @@ import android.view.ViewGroup import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.WindowManager -import android.widget.PopupWindow import android.widget.RelativeLayout import android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM import android.widget.RelativeLayout.ALIGN_PARENT_TOP @@ -219,15 +218,9 @@ fun View.drawNotesIndicator(canvas: Canvas, color: Int, size: Float, notes: Stri val View.sres: StyledResources get() = StyledResources(context) -fun PopupWindow.dimBehind() { - // https://stackoverflow.com/questions/35874001/dim-the-background-using-popupwindow-in-android - val container = contentView.rootView - val context = contentView.context - val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager - val p = container.layoutParams as WindowManager.LayoutParams - p.flags = p.flags or WindowManager.LayoutParams.FLAG_DIM_BEHIND - p.dimAmount = 0.5f - wm.updateViewLayout(container, p) +fun Dialog.dimBehind() { + window?.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + window?.setDimAmount(0.5f) } fun View.requestFocusWithKeyboard() { From 44cb64601fcfc0a4aec9cee98361dadefe6ae45d Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 30 Jul 2022 17:28:46 -0500 Subject: [PATCH 16/16] Update test screenshots --- .../views/common/FrequencyChart/render.png | Bin 9182 -> 8847 bytes .../FrequencyChart/renderDifferentSize.png | Bin 16536 -> 15586 bytes .../FrequencyChart/renderTransparent.png | Bin 9182 -> 8847 bytes .../habits/show/FrequencyCard/render.png | Bin 24958 -> 24300 bytes .../views/widgets/FrequencyWidget/render.png | Bin 20839 -> 23011 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/render.png b/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/render.png index 3d7861df0b2b7d9302ea7460ed6252d93571692c..5bdcbc1e17f2fe809a3b1ff90500aab3094778bb 100644 GIT binary patch literal 8847 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 OKv%R4kOf*c_x~SDG=&}j literal 9182 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 W-TT|?=^SrM2`?Z}SZ|Z5DIL>|?f}j)H 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 I)%x-O0RpW)ivR!s diff --git a/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png index 3d7861df0b2b7d9302ea7460ed6252d93571692c..5bdcbc1e17f2fe809a3b1ff90500aab3094778bb 100644 GIT binary patch literal 8847 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 OKv%R4kOf*c_x~SDG=&}j literal 9182 zcmbVycUTkK`t?wxDi9PwKuQ!uEEtt0O)&@}O=Rdr0Yxd&dp#f!kRk$7qzEEqXo}LS zM`_YTOpqFoCJ7K)s0O|Xo^$X0UC;B}=lS*@OcG}H?AiN$*Spr*6QQG}dVqzO1pt5p z*VWLv06=R9e{N%9fd5|1%&dS9^sdU+^_bx1$7GEG03qNy`ih=c+WbhMUmBP$vDmZT zx&PL4fadG+Ra>aapvrb;VU#cG#o>Ahn&u%r9FuP9q<8QVH;>`hk$$^@YyB2giEiUH z=W}~javapF#*wpSK}yVLUS!vv!|q#0-guq>n(7N*4Ar_f?MD(!amy2l@6@<=K7Ms2 zpx$pFO?JkwC&k8PW7@m>LhRf~Z6zc6pPS@mNC7}1k=d3P9c&+>EOC&K=#ymSgV}0^ z<#K@@6z#A=1;rrd!w3Z84Ck9s!>eC$jL7@#2C7^iu3zYltCCv!Q#oe-zQ$_|1`{JZ z5;794Z!L+o)Y0U@Dm<6K*Od-Vq~0i!#&KY`>S-@_f(CzZKRy4(w&ZxnIz^htDyO)3 z{sE$QIrrJs}d}NY}Cb8`ev*vwmJt0AuRv^ zzpi9iY(_VBFitJ!3h21cDF!v|hnU^>8f#p8o-@Lfwkbu@<0PFZyj;t-;<^TM=mFj= zDX|-^qKD*`%f>Wv?m(kI6MY3Bu?MCsMHvOd&S@v~$mfAfmf*4ej2VA@aHaw4xwecq0>#o}L~EEV|mwt0QEC=FB2-gIup-xW@#jgGjw|XkPr={@dlss=`@o zWp4Htn0YR+jeRt-js9@&)6?7VVR!&V`h)25de&;Y^WbQc5Ixoy{;;4|IO)KrQhw_V~;ii?$Yf&yA@ih zo$x-+rmUqnJ5N8p@PSGo`(d}4WBm%IUq-^Gn&=;6Fh6*{D0~}XIv8nmzwy(e# zo1&g3joQ|@jx+!OqfT_8tt17LK2Xoa91bmLo%%}d@esX{B^U4VI=u&Z91arkKfh+2 z?#qr$#uVve6_9F%cHuTdt}4GL<>Qd3n3#t}YeH~em}gI4mp}95Df3=$>adB~r z6%IrC5CLHUa>ceL`DS?f$XX`5xGBT8d1n|E9i1Mpm8a^DZxpMP=ZqK@L&hc^yH>@Y z&H;CRMikmILCn%R2?F$2UTc67`q-pA;{N^n)0}>M&RWN`RS|2B0iXN(D`}hBTap>9 zIv>Qx$9sCZyT6KA$fRcP&1fD!C#PtxSuP=l+nJF@p3UCH%q{t9Q5Ljbl(qRG?b_u} zrveKhK^mu6j42DSTw?_tu7g29*c#;6rWt| z`|n^caNP^kax3=*c3Eb6s|49F%%c-0PHcnZvSO3Uh67ELk0ly55-@6O zvy6)ebfPG2?SooMYT)mqikciiC86b7xTbFO`Cwz zN|&@MP1?Z-w1C9BzpndJY%osq(4k9^<=~N*Whgze37}tOTu$g7c4>89pyq#|j)B4Y z6V!B}gM&k3CO$s`4g#ht9H;qsd09YT{@=spAASja(%ah`jTNAWSG8A{vjX>N7)uSN ze`w;de8cc9?%#Yc_;uLwV-a{oLkJZrijI42>$x+xmAT)**AJlP3DWquW&NA5{9<oM4c`fiS$My2?Nk{r5|u9+Mabw%avU|7cjhYOT)~iA zc(aWg4T8d|3F3>&x}y41H_G5hT{8wcTspqYu6D#s$V+FUrq53isDo7ZB+vJ|7sj=s ztqp?&5J&Wn#hSTpmuD8NeT%$V;EgUXX?!xt0?^;b3~mYGiEteB&AM&z!N&|ead*#4 z={sQk&e4%*L1+kpkp zgMRl$2H*-unm97=U1g<`Ky2%=ES>!7w{Kmg0j~_tI@C1MZvH|EamTvkn|uhI!g?xH ztiR@lYsDSuji!E{!boq7jinxCAKCflz&=t^so=IfdX$~L`BSf>$jqIn_SzXJZC;N& zlAfnh3gsN9R9hU3GxAZXv4scwAp%+`6z~dwI!abpJ~GRT$Wv z&|l)>?YnM>%m^bzMAT_d_WOF&U_R=R8SEUApiw1*5T_K{gK)Mn??0aPIhc@mEJIm! z-||*kw!+kp%BL`%E4(^x1Q~xFMo$JoQb16-M<_-kX;&Gvn5cQk2m{CBboJKvBUC)M zElZ&fT9UPmwjp*szxnRibG?&pdd=^WUgFieuhNTj)qnGFcXzL)Nt^c`J!{pe**9fn zWmOrW_H~_tz^@B3IE|;hc`SGqj;zFkBxIV|s|94I4Hde{#QsJvH*a|Xiwq6X3;m|9 znl2@Zzd|s`-sKD3*vGW*&V@gW_P1l-sdr5bKkw!{+%~98JoR6wo`21a-9!4%N0x_q zFFc{Q7ky*c*j_)p(xxbCli7xd7>d$EWn4TMjrB8S`;`HQas`rZ^(zgfoDN;k`1IaG z@$nNlSo4`~`Ic!s7Pmx}`4G-tJziA);niFWxktDlF&v*AoCKHY z&ukL%EoB~vUQ+iDT7v(7EX9^R2(Da)T*PQeba?>DK7t*5&-36 z(YQfYn&Gp^-TH=x(GhB1wOcQT;|7Ol{JyT#nIX&QnnEC6LpvogWR@R|7sK9&^$@2D zj=rvWX4(18+}c&Dnl|WKesMuZ42({UOB(#L@KD@YAgPd$4%11jbD9*8;)mLcOz;m(Lc&L;oUxn-!j_ZH=;1W$!h89I z4?qdcVm?MJ$RboZEB0~QhXL`t$7&j&<7=Ep0f7S5D5F~dp&?O;Un}tf@)aL>C=3rz z;F6DCZ{1cQJz}63GKgqX0A4_N5UXXqZV}NYp+~;n?=ENBKYy-en0AaAn4!JAHfJze zT5B0hMXP;Cu?O0^sQJUl7LBOvqXRkWSue$N{S_&ovS_^bWwaJlSh%eSJo+$BqLmTh zjb2~~dh_PZ5c)V_dj~_>W~Zw)!|@J1b#=VtSe0CQQ|Cvw zYKd=Ez8oDllA)ec0zvKZx-MHqp=I5Z8i+^x)B82!s4Jx(_rgn^vtQI)Ej8j==t5d? zhO(z9%)w6fFq>j{R@Lj!YSiq>UAvKT82pH~E{7HnSN=4XGcBR$up&aJ`S*X@{RV3{ zH#e(t#w%2!l<=syye^)a+yBsPX{D=RgzU|RW4gK-V^kQNeA$vk6N9{iT_{Ra-8n~n zsB9JC-x3p|e74nVnb677RbHr&wgaP2}$yP6KY7YG1aiW%9zAKIm z{l(u0P0rRnSW%8C(9wLJY7)gf0@};jT_D~Yil5rvv4Cs`VX{RNv?ric09u5syNk>6 zLP<%99tVA1WZTL4`T1B_MX8A$vR#;)8&)uxb9xgZ0?*E;-+5xh=GqXp}rLolZ7W5c@N zY4;G-wjIHIMeFH#iNnS^N};$@myO_3sd7U7mh-EGs*?cb+RFz(+`mo^Q&x=?AG{S4 za3JSJhifSA`HkwCEJ&nWqI{$mJqeWY%@voQVtKG94Dzq>sK}MIW0X}v4PT>675}b| zCe<^-!B1O2+uD~{EOws3sba>vHVP%pb*PsA4;cIME0)gwxyi@FBXftcMV2_MoAgU7 zBcEH70U1=D*RZ&ctz>no$Aad}0aj~=EHYQkN*qz(?Cin^m)q2ociTTJF!%5gbMxto z_k@_gX;}99#n%?&Pq?66WRCrR>z9t|naJNW1iE@nRaIKwmxIboZ(RRo+#$zIWwF1v zd{L(mIjZQ-esIh6G2*TMKGYu{52bRb{0WV;t9B-E?+G-Kv;UAvPbOal?@a>d;a~Nw z6gc3D1;;{jG>VJ~*KuuaYF@iLl)RZ|XG|*Q24K8tpUn&p3sVkfJ9_Evhp+>?=IT+4 zevH@QF_xc#+$o{Q4FI9bRC5EsfnJ87q?DA0mS}vnU{jmhz{bXg1o?@!DH5| z{Z*@c%$-%FYz_(n_a6=3h5=lx#YDbm`^}8E(whG+$>kHt-E939kdfZAu~*{mM{veH zOU1?H&t}aPZ>8QoEWoQ6KG-A4 z@6Z&gpg84bgK{|ZsdYMm=GXF`KFK%)qRiFI;5eMR?Hd~Irm+{Z?;eSiXx2S}8JKH& zyY7$foRs^fgxGc?v0*CZc8f|LjK6EFhd3CAg=$pkneFD!NwEH|lW!LPw;1|gtPA~E zow}mO?iI6G(ng%TC>;3+tbMC5u=%&VH*_o#wk6Ub-c1(1j2zEN`H{bNwJ?P$fo^s^ z{!Qt0C0cJb>@rwIy(=$QID<59=%vj~ONUQJfXaHrE!OKLz~vySu3D~#g+|hL!|pMV zQd7Rx(Lf>zz$q_m;g4T$)SdJCbq7s5Sg0YNlsCUaT)6>{^N55<*oX1QG(WrDN0i+8 zXUxtM*gc?Rx>egjrR_G9$wCCL0bwH9X7HHzin31GO*1Z~oFUn}e+*b3m6~H5H@@GEEe>!>< zykVPJYIdA+(@%zf2MM@&cay51hy`R-`=3vOV}MmWh8{ma|wJY+9RJgyKb01 z_Y!^}%F9*bTH(Vok^(1{-(l)CHxapO*8i6z$q!|m`b&rW$HAEYe=wvU$xD$PAp?wp z839v?1`FJX^s{jB@Axq86hf?NJUIhgyLRnQZN*LNs|E)BfeCMWLes8RklG5($xytM z{kKKZ)Ix27;T4XHknP(EnUK&`qlk%f2l4Cp+fi{96%~1|v6|KUuDsrVd17*MvJsY! zuRdW(FwAch&RVZjX1=e5LEDpH0%WEFciU^77A$r=0m+nkSZ~ z8c4fpVB^DLN*QUpmXU!$D<6HjXQf038>oxTaFVHOU8k_x6q2@g3|QuU?d|9ItvYvv zm@ND5B9}G6bjfR|vP`_{)hr#-XuYrJW&_EFdn_{ltBt3R0M-5I+vO7!44lw#2g&w8 zQUXs15sa%c?}{OUaKn-=_M^cE5UqVe{IBKIi0O z(j3Ys2_tV??4Ld%Q+to7#Ls52f6TLl7;tfDy#=-nJpgIg-~6{3a~!`Uu}XQ3TjTc} zb`C6~?gLah3{{*@R9E1je=mFV=+W@9!1`jEMboup3#PGy4J15CrkkDBuT)eI3)^e9 zwhj(mlMPbm&N=;=bv1nS7;>V77z4ocb|$ZHRuy*q%|CU|m&5%urkx3c6lZG|!r#vO z>X9D=H4SP?fK42SIW<}?eBwKZpBZ*j3f7kl& zK9ZR{uRbMFb~&4fm5%rTULc>K3Jf1Z-Wgkb&_^mHJb<>0dRBHid0Yeb6xnEIyETE8 zxxt-?Q=)xBvnUC4k6$_B+5qivG|2&`4W6XY;=U=Bk77P-&|rr8tFv7#Tc_;ihgect zd;hP=gqvLoSI#0uv~3rc+Z~Hjt4r8njR2$kT7@m}4WvfVLo5pUkj>rmDbdhY;7p|O zzqTmA#F&^E37Htzm6)S)TAXo=Mdi_e;*7VsXTyXAlihqRFlXEtKzR(jzVjgr1!&WG z5pl&P+Nc)!CltHQg9DB9e4r%#Sf{d8KA{ota&Z42&L$ZPh+~{#vgqN8CJM41z$NTzvaaf8iCeFO-;x zVIgEcolGSyh1;QG;z{cibV0kG3$1A;IE{hA9Y zamC3+qonWcMrO`$^xWMSq{I)d`GRI~?bcHHgx3=?^<*;H03xjXT@iz6w;6#P-2x(w z+bWryu3&cf9}Mq&$OLrXI^DgU-TUKc^G5>gO>@V^1GjV6?Q*@j`T|Rg0xEA%h8vn! z>IC79CoBB=?pZuPa2X^y^UpA}I`e}HrI=rlYF}mUTn|MaId~eutgWTBR!F#OQu)xI zFQ}c{!f)v$0s(lm%LG|iY)1hb5(D)dN<;#|r{MGEWQ;f4-}1_GOF|fzHhqcByG|e7 z5_v?GYW1~S3%Htj7ME9CM~@ES@pzgsH$+4M;Q(&%ELg8piGLZpYZ`^x4J%L~ow4j;SX9NE`7UkQl)?Mq6!=hHZ?P&&IVhbKv??+)+0CDxFf%+`;>){e_F*~@4)3w=bK4XeVm zX(F+b(`*#Z?0u}~y~ z*Z@8kD2+)Yy+sdufj}f?p3L3VofblhBk_nh6SQ@At&w~W-=e&unbfEe5D-5<0|YSu zuW==9_^adMTy}8al{zB4X$Klv$^sR_rX%5Phu`( z>S6K7O^v9G41t3zp$+u6g@$@gjh5<8Cz4k5V(|0Toi3f)jJa!}fR|ZTYZ`Tu2DYYs zBtwbVKc73tZ(jr{&oDnJ5Lmb{3`5~~4Q|j^Wm3=&@2HEtid?qEe&4x#6U&BJ8XO$V z=sc`2yS?MZLBIRKm=!?b*GUYE42VrzJ3C^|jJJwbX_c(C#UM+QgS~xSY0!c+9TO~u zWP)xLmm2_=&CEs?=os1j;LtZiK0UowZ`5Y^_Gq}DKOEen2)6JcKRmt|Vq}ea%iL5c z-!l|iKsk5~ttc-gwYHsj%Af%c`_e!w4G-<&{(CYzp&w`G=6+t~pwEOowi)lyD(I{M z_7rtn7$$R9VP3Er?uTz=H10o<1ORjq)OP`zP9m45?BC}3;df&uWCX=m{hvQme^mk} z1!*4uZ~rX%@6y2(;WEe_?@FngjT)KHVH)nYWtc?VfSu&7syALk6%Ovzm7eRXt2{j` zF%pv9y}?3;&*~FyqN+*#?_SP;m=s0r#GfPGl70MekIIP~=`%j$Oe)rVY9>Q2w#%}Q zGG@%gk=(K|uGr!74qjNlmN18Z5bWG!jfkPLw)kk2XFlP0P+v4E5Z>r=cC6ki#Vwr> z-`8I_*g}pJQ`OdvJ#yqo3VHdi2>q4MI)y1tXP~c1?I3aEU}7*4`@M<$w{5Z0_xZDq z7*nvc<50zXdG%DE@12T=BbO%5%x$hs&3$__k>j_03xlx*H5c9^vzt!}#5P`n_e~2S zW`y^tAmLVLAL>g2a2B&ST|h32f+K{Qg<^QO?kz6B6g>#YPs(&-t10`ge7;@muZ(W^ zF4MhR@+k-2;L?d>yvy19<|Jo?46xv0wr+(RWCyB5O#+02W=#7>gpk~H8?L~)mNZ(S zS5UwjUwiEB;*sOXeg1uy5I4_^x5y*K`C6SD6e)1hhd?`aYj{WcMG4?@Z|_ntX?uG5 zxnoR4c{znI$k8Xmv$@wFmY@Ql0$WoX?SV{8zCBgse|mWTe!e++N9quZKLemA89X;} zs!SzwF7`E3@a+^R;AFa%MJ4b-1Su{Dn;m-kOJ4FWV@-d^>5+5cHzZ~y+~t9> zMTcdi%kWB%Qf6m=I21tBzqN{EVhCzsJkyA&It4tjbE$#h@9&u zK?AH34bZcq#kiE_)d zp={1}Hfe&@QOz; z?E}JN?`|972{)QKe}%9%r@dVFNKH*?pYw!I2X_TlPy2?)M5GV(#+ro*v#)uk-LAV) zSJ8vX3sJZqbl&$)q;W?@V0iCkXpz2@sJ=xjNH8Vj8{%;uKM*xmO`@t`y#LMxya%&qfXD! zo}T5t(fDot{mOa4?c+5~E8SIGJE>WnxPsG!vunb8q#GA6W^|W}darJIQ#&8p9Iiz= zRyMxvjWv*sTK5d7OGM$PQ`V=MIXZMmIjHj)S5q4^cDdHeZY5!3t_0IN)OTlT=tL_9XOB(5q%+Z6 zb>3qjI}{bp*bYJALP{>;oV}Nv)1DqCu-aYTrBfXOkA9&(>@$2Jn5@gI6az3$Ljojdx2wu;wto^7zy#GdW zv~zf@Khk?gb%St2_8z9!^`ZA>1CQgmYHD1$U#zW&B$>V z#{~;j>Fu3v9ovub-n?+~<%=^I-Mef!=YwtLo&H1{3-y%_NlOT-ZuNr=d|$7tVfPva zJHHW#IZ%OL>Y}CIiq47XB5mJ{Sm<|_+Y?5oVDf4cM|Zy4$X#t2$@1n`TF&bW#lXgW z{=H!Kc++shx5k~Ri)M@B*%qWGd2eG6Tk(hb`>mk5rY+S_8FL!$Blb*EPXfBk0XX(xHtB02Aa6)2BBd$m*0lQMw&)aW-B2gKRt`h$CtN7 zGtewKnedeFXNguRV_N6?M-%oBiVp)XR7bT$((Wxv*7>45mwWZa^$u5F2$SPQJ=-7z zW@lQ2Z%J14c}kPn==;Z>^LfRm<}R?hwk*8YC&}PqI#9HpK(jr!PkT>ldRGR&Gxt!R zhD@lzXn@o4_lw|}uFrhY4RIHlbCSspHM?i4LWPBX`%Zjo{E(D$eZSM)TNX`n)^|N` zzPhR07b8T1Q{^2Ky5;>tc2w{?)RhlY%*{QlWV7zHtnY_ zGO@GTw5+*HImx?Km1m3Q5tgCMmB++#?PaQ?#$GrE&*@^$NOo^y$zZwqyD0drGYmgI zL>J%8H|l1eGwgn9ukC8VowOo@k7lZpL~~{{uI`MuvMvSP9G>gd~Dy%^-?XvHg_%(2f zN;iIKd^izd$~QgKalo}37J*KCaQIQ~Zd~v0x59VA<~{MdA@el1Ot(m(+>3;~x4&;- zo~&Iu6{TEmX?p0klu9{q1qVZ=GOIR+YiwxaGflhehCU)i!Fz> z*}v8c_msk?^P|K|V3ZunBAd^@YZY!xG zSepq73!c3y6q>tz&v|~YIOZ?6(|k8`)>Y#5uV^0sywt%}zC3Vl!n*G3Zf8-GSr0!{uoSw2|DuZMf@ z@7wOGXoTkQ72`6SI!C>h`6;4O@CIf^5{GzqZ`V<`e%3=6PKl+BjGJtGuKiAPy?0b$ zpqYSju?DN!zQI&FeV`oqVF11+S>fK@v5LeHI-~?%7Zz4I_?5C4J{2h%K}e&0@bh|W z7zTFoHCvdB>yin>2Ui7ucaa@V=b7v`1n76KWFMyWkElTf%*(v0}1PPR%<;}O`|(o_K0$XAA+>yk+U@ttxpT@n2NtA;QjE2Nmrdv8^6=l$eZa?z5CuG#KQ0Bo_Ndf}8u zMYmdZe)XO&@shr_f{^vZH+L(I0zKi{sjK_ztJ3I{3H3wS#{2{9>-p0Bp|rI!_V4Ra zN%Zy6Nrw}-!?e+Doca_FKl^PlK)EB_HDm9=e!95Va?PS=*0}OccIc?G#uLfzWYU!w zql*v;<=TaU*U(`x5!tnSZ*1nBY4)sm83ts2n3Uj}FUZf@2(2BO+cYmpVqG3@^X)IL zjUsi@IK+6UJhqq0)BKQZW8>AK>!4Q6>W|2cT8~v>CTzUm*btxin}g1Whm~Gq$xmbp zywc2UP53wP3H#cDl^bL?b(hNSIhP#FcID&b6ShXf3}nk~w1eIqx6&_>?VkNzcDhyQ zYG^d=fHIIo6hy>QYeEFnIf z%hfW>NK#1}BfGzPvG$teV1Y$t%|5Q#oj#?Dml*0m#i>f8vVo~KCV!dPphie{93(3C z>H!rVy6BXowr`Rrx>dfNosZPpspMB29S9r5ijBCC2KXd*9sZ16FQJ&38wuC zUcO$xXnLqf7AS2oSCxo>OC>M2nt1F^fNdU<s!{Im{B z9n#r-xtsG6#{B=qj;?uy?PFOP&j>vXpWuU-nwpx*V8Pb@!7~*tq(^;j&hZ!Wg#YKe zQWyv_1df2#33MwKRfb_rZhVh`WF}@tW!DFpE!0!DJrAGVV+n3d9vRVlQ}@K!$jEGa zb*fM+_qONgBZHOQ{V^9Zq-Xw)X8+X_FyocPEVk&Gk6jo_>0EG8%Pj59!2Ia%PwPpS zw|xBg@sMrhaGq|ZQ)WtvQHK?NbCc=TEy=4_udcCjP9L@48olpm9*zpHz2rMxY2x6i zr(l@Lq%AX%u@L8_oIVi*h7%!tI*sy=VUwphfNI=y>+jtE{Z7 z?ljq$u!MyCsw#n8?J~Jwfz`L)#y)i<2-B9}rH$H-!4rN-a!i??%>nq=@s*9b(m|(F zU63rCufa!`l!Qd)USwos`pcKcw>^YTzWQpr_8>Ys+KAl8LnuK>S-He*!-ABIOuR$? z^RowDwfbYvG=vi5O*`XN-P|g;tp-WLD-2%%J@Mr_$=|0O>Uvmg64VbK-|vXMo@*P{ zWKvRJd6(t!xy9v{Dcj7_jk(z6eCy1vj&W+ms1NZ`QJMVCOHEUD<})2}#2vy1TN4vr zG*_>7Y1>rO!?NY%u%xD@W|oww%F4>ZYLNfvLlc2I`RYMQSs61wzx&8W z0}*f`&qZ%uIzJnJE}!Yr`A0#nZh{qVm2&dd?gCG0S=dZoJibpB&E7nF2ga$Qq>yAq zAAWAGNaL-ydR|akM)Bo9f+1Q1eZP? zNP-!bqPRexUwcpy9TQXHweQADMMy2+qR>4{_5R(v^Md>9J!^Sf{YXHt+__*CI8lQN zy1I**_y1O6n_*$T`$P9ea_if@p#`f5lK#9xzeA$+cER0xM@I4{CyjD-%9Sn({C*z6t}nE-L&~hi$jPakt)3r5B`qh{AI)XiJ1~%$ zm&e9S737K`y@(J+SFXzEo6gyLj=bJW`uua4T1ZH!pTbva+M4b__p0F9A$6HpV&Ltl zs3^CsG2g!7Vb(HiZbZZtE*_rj@^a1k`ud&k3__Q2mv6DKgrT(3!P36$T~dy(?;@(val`Z_KAOe`(sj^lThV`XJ69C$idW|M%rMRGPX zEln&iFc3nv5W6TPC#QCeqkzmJ@yS&^WTfK#y>)l&x{2KF<_xCV;y#zX;w)n%3~w72 z*{ifO={$6%3gi|^e801^a~J-N={$LoNaMM#NYB8Kotb&7yU6xn&sDe9OLuB&%5AB9 zW__WkbFL@hz`;nUNkj~IvBx2qj5_?d*Nrbn8+I>mX^)46-CHG)+cA{}nN=T(c!OidMSZf+i|b}x%y)#hHN zAUgB#6YNl6P zWvjQ2J!9nM)f5yIw5uFG`$lB2)GCJMN&qVJ^Jk5ck`lLxKpx0BX^%NFrl(Cd*4HJv zUzcBl#5RY+b-g)978Vzm+ugl=I$ZSn-eR!}-arLSqk_c&qs7fl50}%rBxoG?BZ79`xA8h|_mTm3J zU)ZmT9UvyV_|~UD5|^kTk(rqpLZ=oALs#_nu7w3k>+Rk3O)RkN>FF^pqM!bB&+q6u z^j~1`675~)zJ{u#%Re~7eUk>)Uab5{;&*gtB6X-`?Ob(20?)<`h%z~cWee2awXhfB z;Q9x(`sw0-55@tqPckkY16cghKh|azl*F}mgL8!)_m-oF9QRHh4 ziVr7{H~)<+v8>%69=ffc_eUn1ei`Z(wBfEeSKB-@+_mR$ug8)Z)|rY{^Qz?nY}>~l zPILex2=isB+$FZilIO4dM*3C#GTwJW7a^)IF^dH!8b$`SPC0hY?ySDNL!IZL)$!Ey z9kX`ypQ$g-(zb9|=x!x;6G#iSD4KsZm6(C|d0qF!Re)v#>Ma!^^Nkx1TO-*c`z!+I zc2ReZ*5gX*Tm%JmCNEz;cYMAZn+07;Zmw*)d_w=1FJC@Sz;3E^T2zAQQyF3Cx_ufM zNkGT!r|ig?;f?}n_SPufyUSx5y1Ke5n-Wv-_ALTT_FA2vyb8TCB^&^ES3U5Qwq5wx+75$0liEVS#R(=qk0sLVefL z(jxi$udwj&RM{BrTdb^B9gdC15lI1+106PHyou{>)#~XJcGD#0fyqW+J)Q`wdTYfC zEr-nrR@1;>lYRSz%?woS%M^rynZ>Mnu{qY6QR)QEZEd}f{wM9qi|uDR&dkty@2%Jh zQ~D%Aa>>=N_0l1@N<*XO=~*o$C3XGScaHO1TwIy?`SMm)R*(_o zCQC$+Ulb~Ri=Px|vb#zlk0wo^VXk+)5EF^iSUde?&5jxXw$J!{xw59>56vRCds(KMY@ zzI^PuDf2MR@hRBPH|h?0>}p{%F4-K zzdnFv1PGg*dCQHGrQsa1_pXTnlAsyb4fFXbc32YsTX6i zlS?VxG#}uqxaq>gobP*&`!W2p-~#3fv4?^?SY#S3B_(v={_GwV@^wcXe|i8JyA;JD z=>TAtj(9=-e68{Jar|!G3L8>2-rh`Z{NXIWw^4=vs{p&OlY6?B(R6d@=0|yxr%Ga`7qIJLp*n=x@Y2T~Qa!ye@J6 zD_r@@b*?K^dKK%dIqo8`>hYNZkG9?(Lqd+=Q^r+6ALOHVGq1x)!{(w|9x75hy$Qa2 z^dU;;wuS1j(v3)rV50bU>!R$ck23rL+0%k!RCw{Dq=}w5w`Jr&i57FdmoR_x)d#_U zlxI|ZC0w0=K>GB*O&|@WT0XwByE}1IcAuLY85uoFjr)B1y#gc2G7)mG58wYamtVTS zP$9GOe_p6XH6A_b;{r+w3S@JlZV3zPOG@IGPtW3TA*0KY?Iy}{azR(=qyH$#-!&{P zv*qFiZb>4ryrs1@y^5QPaK4>qG^}$*+1ffU-fiwyQOn(v$d)4@Am+MzcL?txEgb;8 zpk&{NU<5r8d_V!1)XP^N9v)WK>-qVUQ4%_8lW=1upT`I?ys263RstQQioSmSaHX^S zy;0a_{rzgZadNKJBa&D%OUqE~A{6K6Pq|~xo;#Q_IpUdx$3;PdvoM8_hc>$a% zQO*C4#p$;9NHZd|-xoRi*9o_&Z`tq?VhGhcZzQiL6icJep+7>_YA=!8X_vT-e#iC@ zx={L)^n+?j<-g+TV6+_Mz0httE)DTQJ`aw0M?>g4B=c7@%P zKNX=bjqBv))RYtnG|&)fb8{APLY`XC?l*mQKXvMq!`AO7#wI2JlIEdJRxmV7)?tfe zVrDkn$x(hn2!K^W;y<;cZwv|qKz5qVQ!FauT@`2_G0`=vA)m=IVHinh)ByP;m-uFK zu&fX}JG=TlDz$r5G|mTeec9*~D5Ii4ML;Fj+uq);@Z2qh4A(GRWQk#eyGx;=v0!3i zLg8xc6%3A0I}th^!?{sj)7;p=kW{})g*I}y8cJmu_>kV7Y`OCW$yuc5fo>Dn5J-&v zv6fGtzI*)|D%w&FkT?05Y$$!u*2$WcLA%mDyZ645RlD@*P^aP7sgV&<&ZA^O5c=+9 zfa83>BzkUsp59Yn+hb#{PfAuc?$Ui9UtdVRX|ZJ?At7|;4s~^pj*`cj=8&lmt2&Td z{leQi4O|H&p&ex4RU?50nN3mXqHkSdY%JCAXWNHJ57RtjiOGvw-zjLG^Q!gkUNdY= z$379fjPiPeVBoBOww7uB-YlIpKcXy?(ST7?%Wyk5Eu7F-C|&1NaGSekqvw5`D>%1!S%_~#=al@ z8B1SjPKxcpV9AD7O9G~NQ@TtC^b2@KjN7EId(s#i8}oS|R3Yg;B;>NyXw7~NCNeB+ z7M3n6JG%#3qU(*PPo09@fvOx9GJYy z{>(^8NwJk)l`~nJZm)1%OJmcmKmptY4x(vh4LAq6ua6aW@yq&`D$|K!D-b-tr&(ql z2T)2?M~7&jd3D^%!^IDmnR&U%!66%afItSJ%=StQzGExs7nV zsJoGk^vUU}=*c$Qtg4SJ9i&eZp&jfBiB1M!M@H^H#6Nlos#5;o;NVr=N)Qr&`ZU&C zj-34i=c~OIWvdnO(+9-giXHbv3ZtaCKv zx`Ip$g5s8ErGWOMnrXSYv*fqjylCYwr46&N)BQ^Sos_nr*WLtet4R@Vz%(JyqVn7^ z!D}#OiF?W$iY1#P!X6UnuAZzLT;dyj^80ybR9USck*8C1H1*71bsp-O4@t))Q;wJb z)59FocP0I7W43jspVroU)PJ;VqPgw6H3|Q@ISbnL5Ynyj(1bL~#LiCZ9Naje2w59o zhH)9T#G;Q0o;+G<`DwvrI@lTH`TFkmVq=EyU>ulySs@wbkiT9Y<0|HwbEvyo?Y{UL zs3+3DPmSyLzl+Nf7NqkSYVVov%Jkv9spjCV{w}J$>_gyOM07?OFKHbI)MobDQQ@U6 z=(ZqZ8k0ACo>0%z>9WkPPJ?obFsmgcxXI>FKF7H*bFR))N3-!nhHJ*K!ktDt;q%&q z<6ocamH(dm{ACQcF*~=&Cs@9?@*2nWp#`R0z;nbrpAzZC6bwXE@jOSJ81*aeHQ@g8g-qez>-Wiez=#l zOEl6>-0e(i7|@|)jyn-Y5j};j(D}oYTfA@;-;4UTHkmfnkYi;kXTZAsv_JzDxI}HY>~-BRM=d*w zzWwhbg!9@?e0!a&{?~{`Hd0muE&UN|v>fI~*pTiz(_z%s9_-GYu zIni2JiQ$f~5B1reAo$8#-N-G^Gmn_LuPsW;r@Wxz{N={6I(gNKj z1r=4;u(i6odu4R=P3yeRkVmfiBmxO!31qZfx-wKB>oRR%4*-Q~)p}K%mvp|~nAbnt z;TcD0r!ODSdj?$2#TnjP2ZwgrVX7&eOCEAjn=+wH+7&sHYM@duT4_cfzi|xc1W0235-9T%+t9Nk2}^m#D?C)_En&V`r5?W@g4d<(P!GkS_9c%CBelWd%|)Z04k- zr!#YLspjV90(LF48AUh@ga^l#*)TIOh||+2SIYuv%*4i~2DBv5F19KcFJ4PjVEm(6a`^p=lzg80;z(orciLzFbY;&|KmN~U`|>4PWICUdXa28Q z)92fW7no}KI!w$JVpx3O5~o%xOdULd*C13EVl^%0YzRNL@((0CW!pSug~rZDbQwyZ zV+Z8INy9R$KB`Owt=?0=SB|WA<@)MtnqXYY-~ykH>)Vm{qGo1h5}ux(Qqs~OZtT2X z1Nsx4GBh-FX6BE?lCrSy6grJZxoNcfv*Pe$J?X;xxQr5B<)b8crXC3NdVAq6(qyM^ zypb4ID04h0D<|u2QzwCJ7458TQMts5R55Xjpbng#{$oZvb~+3s77 zExy8_cMfag&CtzHWb-eq5X;f|dKS12$N|tt5O+YYCk_{f|D2bGt~#?(5w^~6Fu^9( z)YLQyr?fvpy_YY&l+-oZh>B^_tyGDwD#&+fIc@Jy2<;y%$gfFwm{ zX$?UQ22$HrP=7<`d{%T6tVemZtfFP-l;ga=Vs?86d`-Mk;<0UqP(jtzy7ct)Arp{H zU{j;}EW)3VgRUk%spIbMJ~`qJOgI-ecUEn!J`mg4YPq1F;9k#z-g{KWeO`Y3xVpMp z{G`r@TwtuN3lRjyJN}dM8Uiw-foKtDD4k&ukSoL++?Rz7=?qv@B$A2S;0{v`e5x86 z89+_i3ZiI&#nCEYsmRM^R?nL)!RRRi699JrJm;`FDH+G-XffmnIcT|REl6nZ_d{gT z0l%|FN(=7}bdnG@+E6ncaf?IceAA=uzvj&Ru`L>$y4KFzL$}TBYoM&N-PK2T88cow zpONzM5mt%`__lFft#8^j9_1`oq){-ex_p%RR7*G{xeB+9tn+mWuG_Pt1)!TrN%`B^ z*7GwCv}@m^bJF!lRz+Y9&r_issQRSG+byD@EA=T=W{g*L@o;NeFEMA zX54Kr-z$)JjG!^|qYV86?|e6PqF!Eh=*Wn{%$6 zY(l5++xytq98larg$Fk15twS2W7^Z8CpvN%3_QK_uIuFAz?wk3Fr2UbCpKXyWKvU7 zLYLZ%vPs%i3KQmmB8pA{w!FopNHlM_+8zJ8ue9wEA}_t=PfmB-2}tXrc*8xNWJ$QD zX3{dtO=M9^oNPHhrz58B;kA6O3*?Eut}Z&z%Hh@-xw)*}yL5qsB^26cET3ldR}=qO z9xA^9wgspQ7tWu5$8TDoaoyb?6crdZP_3Td4z3$6ld&V);S=MhqB}&x{-n$*>go(| z#b@_&KoSJ5M6829PHwo$RhgQaI)vU`JxAj*udskX&XGV#SH01%9aV~Sl}uPz*v>0w<~l#WHUR&)b-^69`Ok;JC((~YkPgUJ zeTgx_nZOUDkXp4aFkrQr(Rl*s%QGddm8eCg>~3G{=AQX&Ga@$-d7lP4Yo2TP`Fa&d z9{_I%RpwMFXeR`WGccw=*sI&v+=Rd#=W z9~!~(WtRLn_6$=d3y++bwzy{Hxv4=HAB-@1Gk~ zEe$38WMU5P69ihSt7ATo1m6bm0=fWr8R8vId>bD(0D&)~)M>oC6B6Lu@^bKA6*K{W z#rrUr;L1D@wV;BXmFMK~BL>>x3;G|Op8d$Vlq?r<9R^DqC+ld8(9O_N&F?o~2XrAT z3EdYgBjRGXx9q@ogIRZ2@X)Xg7$swJA2$7(9N?gVmxFth4_m`sn=MK#_IEbWDL}Ez zHUv^4Tmmu);17XG1A$$z^dj$tqdhI+QZrZ1+n(M8LM#ZV1`1tmAo(e2K3I2q+;UcG z;G|~=#W_+?WPxRjS@!@Y98m7rvuAI{mSGp&777|cgkgfaBI-!GT$~cj{pQjzrXzKmwiKtzC;C}wmS1CSUU8X6uFVmmtJ2-yyZA&|dF zF@pDx5Re2%&2xDuS#ta-nOQErKvjn+5SL_wCJE-5szG>QUPRSY61_iu6x^>TS3ghA znV})4K2@1*V^b|D6 zYCR%pAq-0W6BY<>iG+j zF>x{LQPiDGh`j-ym!Ge0wfG$$hisz~kgPJQov$AmVZQ&E$Bgt+I@-v&E&bX#;r6ud zSSYiW+rLaz$+5Aq zwvAw_poazp0E%l_?GKJK)PSQ-9c1nt{Gkwl%8<=4GelLl~VfvAVdj%HZ32z$08x z%Kj@ExU6FO)e#%_23XI0(s>C< zW!WieJ6*hQBCZ1ylQdMbK|w}Rk_ftYc$m7gaQY3h(TO6uxNK+Nc5$sG%C0ZM^7{lbbRbAwp+n|hLZf5I zPr8TCK44s-xh=OX-re(`{6ptd3jOp5X$Rw;P;%F)h8xcj8l>b8F>UnH{>b|DG|(Ox znuIg0E3pd#alkZ$%H1u~v;t0>($_zYEO6BHy7x^(fVwGfI9UP^BKH0_kYWe*3!Hb( z5x0H4aN4ArsQ>Fo4H70Oo}VwPvA^U zO2utw&43k~e}2~vDu&EdBDo5QC!y~{_ss>xdsO}P0c0CrPtyX9lC5-J4stdRE!^7o zx`_w({P!l<+p%`{`r(1EJnC!|F52xhM7s5no~#i^nzc&HB=##T!>~M zj-ZOwSH|8tqE}^pt$x0~>ygvOrgiC|`xRpSFX^xe)2V}0RjVF$s?aE9vG%33M9>`d z;t}V8TU8ei1rE$8S!721#V3K!I?KA zD{Qc61kWY^)uaUQk|3R%MVcJd#``2ycYU9zhpwFT zLE1}C+*fw7L?%=;=<=>_e4#a2#Fnx9lST!5-iP5$XF@w}ZKK>fXzw}MewRHpv=(Qr#&a9#$&JNWMYJ~bFSR)DeglG*&w`$`o^oNk0 zT3lL|ioWd1EG>~)7{*FV^&LOrElUABnH##8;yEWyj|>u7TAJrqd%NeCl!CsEnFps(7<6+e+|L3-bjrYh=7m3%f{W|T zHp^9HS-;RNI#&$KxY+%U@-3jz#t75y3+FcWE4RK3cpwGh{k@jG#=HCU@TK>1_<16o^Gkb!-S1w| z^H#NwO{5!#`s`VO2cxjCkoE8>H#WjCARyqvtnP_~qSs`fsYmO8SUv8gC_64v#Ck;c zbqZh{xU&P}44@Vyg6Q_LFN;=#>I8?Hq>bm-z(1_UiKKw-C$MQnWTF>30hu$4FqX+MP zzfh+zJo;eLf2|OOTi#DF^OA~l zE9b;8W(USmzV-rh3JHg6;-~grx&7LGuynOEg8w>wKT%wkC5Cjy_*Cpf$x)liao!gAx2GF)>ggWKL#!H6ebH%`Fy&S`oXb&1`2CnCSsz(!pmBMX;6 zsp#qD88!wrKjogOG&>z3fx0Uwm|I^jN=izKfCRt_+id-L=-Om7nh0E&Pb=k6M2d_g zgN|_?6MJX3l`b7Kva?eHvT&eq2ml-GAD~1}x?USt*j}5da9)ldahqoa?TQY@)+6Uw zs0jx;z`bds;CH9Yl@jq|fIPYQ+4_3O5ATCDS~zW@s;)kdsXZuBtQYunaNvccCBPMc zto2}yvem2E&}XfLM}tMMX(EH{dRPAb%K^Wno12r9!peT@mLl+pV1ry!DSQ?4;e&#W z&2ofQR&H)zi6w^6@de#gv%-zZ>2|c08i+7Ly9=D*VPQ`-P2JqIMm^R7udRhCds z6BiS662yUV^sH~)sfgKU<13%V#Kq|)CnhHRA6*AWzbjkcL6wE$i{#|@_<-$gSI_+o z45Y3Kmz5+C{f+NL-R0y=W{{7c1yf&WpM|Quy?sqUg-vIIFs5wO3$cy?Uzd@X_@F>T z1}+M8N*9^FM`Ezh&g>WGi$aHc_Hd-ab92B{lWkjGugWD6u+;v7sc`GSD97;`bq=iu zColQdg*d&Lf$X^o23MeBYqqB;J;57!(vz~{Qne1lnv#CP~&C1Wm0EO3!#b$%3GhLA4zP9ZF_p;-Q z+h%KdVe54=nN)>fAgBkYVrrTW4hV36lu^k*=z>8fA~I4{NvUw2bhn`3c3^NYGZkSr z_*}pN1&B7X+31deveV=dF$T<O%BGoqyU{bf4wzmDH=Il`Sii(Qdb{ETfDr|v* z6m(sE1e{YQzlgY}uzZVA%sV!W-mYkxu{??hMi?==tj=;pSync1#A8j?Re+}6;CA)? zCRX#7dtrc*uI_LI22FZU8eTb7h?#qrvkU{`1$2xX{GizNPt zVE$c6olh(1mLh>ldUQSU4?qX^C9E6UJhltWV)w6oT&_LT144GUCK-0)I>u(&L+8wlx^S-Y-;36Xx3=JrE%Z0g zEO)QXboMyC2Qos?ZCyewTQxj99DHrCNqQgv0S3lzUTr@11H4am_o&XEdId3qe0G}F z<9%ctiXw2XmAzJlgFFn3q>x;1GB6+p*1^Fn{HV8ZN!}my)7_0e{^B`o;SE@n-ksWm zjr=w4Ev8Vn_bJfASh%`sLI%{**N0FJgOK0I*57AhxL~cT8)sr_3fFVQb<=CI;3`E| z{oTQLl$Ms(t;a7x4Pg!GSrQ#Y%^$I`2%`AlR;u z?@k_n(d!()AZ+z$+g_KfIaIW0AO}?1^pV~1`g4L_dm3Qk!k$XdS>4@7o-&Hlv|G+a zAGSBh>2S0tP0l5F)vHGHCe|oye~BzAOfW=Zc0Rur!XUEVAf#^WJ$4Z}E^|HPeZ4`m z7C~l4#t(R=A?q@bVhg7>Abps%7Vei;M-`tKAo}|+l$DOdPe~9gOiWC`To|qgz{HD0Gtk^#;-L@g16EN#LRb1Zf6R@ervcF`5>mJLa~ww@ca}yLKgu zTbP;s==46YA9%`LKVgfcN;tm8=en8#4oQ?%iZ=M$CK`k1tMMbD^#+OpG#Icejc`#l+yJ>@)7tpK~4=ioeS-^C!89CY9NIo z+Bw)=Mo5&Jni^Km7<)}f1)|#8F*E`$*AhA-uiU?R^JbU?s<*#CqHnP|Jh?Q1?B%Nk zGI!f@Bo>ef3Z&#QD$ybhZru3w^#shY=|;*vkW8>2+%^}Yrl+UZ8z^mNVTk-r0lX5} z7)kzT8h~-o#g-hP`I*m4?ego5f{hcsJ|ldn330Zw-XmY6wHb++O`z^Xg0n_j8=E)$ zD_+Oh#pl7YcT^=YhMc>KxZO4AvjyMD?0w+7t{QUfSRdb(8#ji)Vn}BMNQXN6{+heZx7Cn(4 zE5p#~++^@$NVYVGCrpN?L3pLNXaGFw>gu9CQ3o7{@`mA^C9j%<-uevE;p0$YwBMgYz9=L9=0Q{*%B@KeTM~??WN%-NRfsxLC8AD zgO0nKR{Ic+# z+W|*w>8%#(Vk#{mWs5;Ii2m^5$M|>>q?(9`h`T&Iky?#2Ym#WX9#w|_ScRqM5|rxV zJo=YEL`TEH9zQsPTq?6{dM8RrI1lO`h&fgXnoo)b)_sNd=xjVmC@CrFt=i~?czHAX z`cy@eyHsA01k{&S%}mwIH#dw;W!DcF6ljz#9)8%X+|BiEN1u*spGPFa`3(y%FQJWU zBWVE|uu_Ni;AHj#jS`F^Tf;5PN_T6D6vYR?%?W5YrK6*xcytkf>c(Uo$XXg25|u<@t*exZWZ+eypryq?0YOd%1=K?gSA~BZoMl(56UZuFEs?oL zB_u=+TaVuH`D%1$YVtGqq7o^2tj(T0c|a4)&=+V7l?c?M<(ggVxuB*8gCjD7FX{$6 z;jl4>KuhC1kfzlu4d4k!OyQ%Yy1c}GuOSVpC@K~#7UjX*LhdI8zzGopyA8@3OUcsK zmdji@yV&@i#fe30r)r{OD5$Ha{*t8hbevfE448j?DpKEiH-3^deDZ!t+|Kfpy?+DD zHqf^ZK=B1E2f8(=w3@X~J(~WJORsGpHYfQ7)SWR8qXi7h}5nQ`#<}sj)Yp zJSQM2={m@AS!`G32fUCO6?L_}y?yasfWoSjn_X;^qL7|6rSm&*Ya=T;H&X2m(KonSQEa~* z+8T--fRi!MrnGlH(t54^w=SP5E2>u}O;?uxWurKvP%>gOfdC}0KXg~$P z=+u-kl5)yUG&VF8ZazzgW8paHG(a}oi@*`6tEaEj5pH9+| z=l|K&m5AUi@EE{BmomLGIDqgyNP zLFok8+|bZ)_x5d22X=BUkasu;%a`(sZ*zOm*(j&&)_b*D--$vRLKq(G_MG7DpDf^t zU-mw%gy=vZkVWe}pe~?|p}s?Cfc3Cl3mcQ|^bvqCz*L%GQ>>dLpio*`fZ$S&k+)Y} zJQWbO4D67AI6$1})+^FrfeUEq=nQT0aPspr{rZ)4nUac1CPsAvkU79Kc|kg!Tjb~GHW#s2 z!hZg@lf{M2%vWQ|3}M5gyLWzGfkI>LXsw5z!qXZo`PWyg~u`Zme z1|VPwW(L@qn$#ZgIIsAsxp;wX2`M>cHxiOnZsQ7lBc)C7hXN9ZyphhD5FOnz7k9aG zIKIO0lP)jNaFDd&WQCHm1Y!3k#Q@>GI634b;>?hVhBpi**U@{ zKz^|HN*BohMk&Gh1b{PxvF+Ur#V%k#k&hSXnw!gl^ZBHZTvuEmMH_L)C@a?@Rt3n# zNIQS!$`ut|U4$VJbl;Q#uxC@f0V5p+XI^wPMSEM@?C9YE(t;~12l$B4!QqVb3vBj$ zao|SmMY`3^O(&QI$nB}|UlsoLB<0NXO@Zh)2fz(+;AzZrD=digw-#(X&WvD=9xaTUlOS zzCW)bM&>4x5dqBq`1$h#^vEfJ2WY4~+NbQ1KVUIGKacPYAotN*4UGsoFU210jviW< zYdMlYsggu|OG>YpQUkGRk?i{13v=?&u|v9vm79q;=x66=atzzk!(y?{y7^$#0u~qA zVDrEgI3)i++Bx@_rtTQfl5%&fDaS~s2~Vpms-YS0s{)+T?c|F&kCKo zWno4Tm`+zkmoWttDo~0%Y_l;zh61(-lp;z{X+fT)#e%@Tzv=#6mMqy{Cj7zc-rU}M z?m6fCIS-7xdP>avEeryy;x~>+#IMS>lA6BGFzFv0*Dkqeh>g!K>wjUn*Ek#7ny!GY(0yCKVX z5O=mv?a?LA!g9x4fygL-$hz9F0Lwt!jMMUkLWe_idj5^D3itxK{2X_i-g1tF)0A@byOyuWa3LxghJ;r&P;W8L25f{-(Q_;~z~=Xm9RL}$uDc0$WfTz{ z9vm`uiS&opUx;qZH!@|hShP~#=$4UwbMrR)PaS?zzr%#*!1SO7mLLUaOdm8^rXzQp z(_{g%T`a#DA6a(IOn;H()~$Fceu=nZ_Z{mhwz;W_X%^7c$8#IQ-cTfGl2=u-c293+TNp@?@g~f^)$r5I?7s8|V`Ths z7#Z>7$sbuVZdT%RYK%NRv%{?_rkT&oG->9=ea0j8QC8oPtKcEjW#_S+0@8W$?0kx5 zh0c6pNN_@m355g~3ZV!`gKt>wehVmXzouwEuPCjqE<&Ej5Fg+?!vyH7Di`xGJd`O- z3x~Xydy_}06}5nInC462I_Xj}t2;uL>U=fi`m+ZFt6y>ZZQV*aS-fSDYG0-E}2sw|W-_wZU@Ck&#}!Oy2}( z!@!+m4KC2uB0Yz_akdo?qiqHeOpu3lk4v);y1dIPpyH;6VmURue$IqS#X@?9Je!C^ zz0w3+=yq(4sev9(osee(LZ8r#heOp^T38fRR{CHJ30Q`xUQ;-)G+-+TWYU8O-HgT| z@~Qw#f+ZIe7ShD^Ud_f1Ckvp=_`&7IaOWUc%~JwYMW~Z&=A8~i_Z$EmDVgU{)9SSyLh2$m%^-B>=QV)FN2Bpp4!AJ;h7=ir6<0CzL0eKL>BAHP*X#M7;&JDub#l_?( z&s}Suz()$MF6cm;99$QCjjO9dYGbGFd)ZpH8YoAhV8Oo)a$|+k@hPA=&^S(GZ=4)n z_mR9Dw>5YV%z5Rx11dyflIW171IUOf19`wWuvX-w2zv}mAW&qMn0t7pPgjRnU2f~{ zt{o&f>&FY%;ksU6vblzk7qu+b+R>3W*~8wZGF1*iFcU~wS69bsQH(-$1_k-RCD(IA zC_NwzkqOo4bB&@iP2var^;BqK#i^%mjJUyA7&QvOuvJxe_hYCweJtE5eK8fvV z!`ZP{0Ws2)h8GY`o!<4jM%B;RL4n3NKT1A zc_>dpa)^P1bqY_LuE_amAzX$L*-TF9`_)iTJ~Nicat6FwSn8z40@I z{Pk2tW;J;=dFQ%FbA4*Y;h%3G&JQ6FH~Ipvbf>%7YvYu&BnRQ` z^R2(mApe_o*$a8QdFlZ2EiaR!49NdVJs?58`;6-UhhJq9tMWSF(@xtb;<++gj#d#^ zRVQ?|d7gRs4w;!t?1l%QXgF4pB?@vcEHX2*Jo-R|d>(p+=fISWbL3t2R!++93V%b6 zfET>T4+74G9nf#c;U+}k_Z^E{kdL0-Bu_d7?>D8T+PyC2iVWnl$cF76K>uow&Yr3d z^_j=wn=#YM61wkJ*qxiD+GtdC_Pli3w99r6BpT}fGJX8GUB4x<_S~iBUs5 z>5hI!VN0wbts^yU4Q=H>FN=6{M|0d$YPd^u$buyS>(o-8TNQ!;@P*G zboRqMrbn_9Y7>@bR&Db;%d9pd`*f;g(1cmfr|J2U{eqEL&P780>)QQ+I1Rhnx{G;& zyw~jqJocvR1-Hlc_dJ=z(N(`he!ooJ2vqHU*mP^jDmoOEmq=Kb?ftP{u{YkopF+Ts z_R!CrPE`3-uI=fxx`?a%nwq>fytz%t%5YH-G;_e3Yt((v>u=XgvC7@_UQl z9SIR+@3%@4v^P>v=QwJ5&F8Coht#(|GMV%nEzXLJuJ|x|7jDSZ(C0b!z8}ZIT8o*)@cnKkOOGB=l)bI5(k6Ld`@?V7TuC5=0c$ZO7jn+_s|MtMS;@$bVB;=OudW z!(z=U;l*aOpk7dI$wXXiqGKTHeArqhu6%DREHNuLU8_pORb?yE4R#!wQ#>}FM?>;B zId1B$DGbs6_i9}wHn!x!Y}J6fTvMFPlghRAVjOJ?3t^EI7WSJTjzm|y$D&5 zP;S>ws-hT89dn+S)0(TzSf%BNHx*88IP6dAzM&I@PLBQ6!6e@DF0b2jXL~=pc#6}A zi+qp*8@a`gb@bdLon3Ln&WLIE6C}}TYJ+6rT`Cg&$n%PKk(QvT_`GOtui}N85H3<~usyUv$cQC<)} zGSHPj>T9-sD_aXrWI z5xNAW%$#9P&(9)LJ3F)MKAyGNQ$c5&pp1A8oC)J$z*BT&?EQ?%PH@z)uCU>;6}ww& zI68YaINri6q^Lv&Rb2eSk9<&U^v4U#$0~eMkvz(7YFCauQOO~*y^qIq-ZX+qD@@R8 z03Iyn`gzyY9;ZuOX{>?dKWR!oE_JBnnPr;g_E)UiqEeJ>txk5Bo-~@T=G~rYmGu7x znQOemNPo(Bo;SM$y~k+3Rkikg#>Z}zm;Y_>#v1ws*Wk+)C}uMe zWhR`bnW9Z-NLE1QZAa$7f)Z97eK?|{QtFbud*@FiIvOq0o?k$U%rC$1ybOj*_#GBP z%|gri&J)@8XgldJgZk)zuHpS@)>l_ot->PTrwP8Ziej?gslvm|Flo8;E{Pd&vWx13 z@awFu=EXP_z@>=wD*EyrY)g_Sp>jv**Cj$|>VYWESs7WG)BATv4w@8EawH(uMLWdr<+}K!NLtlZ8th36^f}$#ot?zr^*9XIGmsi4LB(61*uTqTme$8! zX*OaprLXVfX}Q8jDc`Su2`)CJ|LcvXWli&NbDrT=4)Qr`#m!5R}#8!KrPmxBAt~GUe8(djA1~ez~$tnFuA-E&g1)T zD}{%#b=VVYSVA|tYbV|F;;7=1jo&f9akU`H;OFiin>n@7u3F>r7q!;;IN-tSOHHUn zBQJ17&ihlouA2$cv=93nnb&vO%H>A8#u<-OFYs@vdbJ8D8mHY}cJ`}H>AT(0dy!P+ zT)#RJzi>7fnH09zil^&2lKvec0JRGShTY?Xq$t0IJ* z7Spv`5|wKL&*9EewB3AODJ-e8qe&=ZJaqm|T+Hv!Xz5BP9CYKh=D56dekG`rtJg!1|x_a;SyYoEJkv#7apH&Xzw{0Mel4zi9>R>%7N(!x+Fu9E%1l}6ucQgNgNkGl5}%{vogbTGXNb;Vk5IJ9E9 zoc3ys@IC0giY(5a->=HlI?(%$bqQurP0$|Gr0VjYoPNy2WX8Cxn|UUS>@}R9UBGoN zr=53MnNRn2Lo=bBel)&SQP+H$MH=O8);Qn!O)PnYHZw0SLcqCvmcH?_|0vfH73e@I+tq&tRFgpvz+$|FC-WS zn{&G!p4WyR)t^)Gk!*{%1TY#A6_b8n<0ZFzV{NFmhHMp5fUI=#SJ)~lSvIJcS(vht z=4}am*}+dxNc}|b2aX#tr%0Nyyw9~a#aSx2NK_(O{ndgoq`Q~TM2&{2diuIq#BUUm zlTn8}J}3WVY;R_)Z;LF-QtO3(!q%+Lqbx<3r-$E)J^nJg9c12AZuu_%79*n=4~J`V z??c!fCZX=*DMRHW`c3-bDfLY3-{Lq;_TJQbw%TjX2x_8I?EhpWX6YTVPdDwWJ?!FA zBypCO37!h!*^r|@KfHP9RW!xXBWsPF$Cdi#!?mX`g%Q&75FJz~suF zA@Be9aW`q3;uA|wcRM+d;eS>dFz0(PB)+smxcopJ;ig{MKhLtk`@cs{<;ITD!gp`h zX&a>i%+4xpxSrpUJw%?)l*xov?YosNvEpCirX15uF+w#hF-a|ma4`l;XLoHSMT`E@ zEdE|Bj;7nOu&c1RV(zlVjp1u%vAka|%7_pNbA2jpuOR+wZB!%8-MsLK$kgM9Rvy8n_)~J*3{GPOr-LcG$cePtm#1USSqAtE_0TWxuKeFv`!Sy4 zHtaj%GBQ}2=el(+EnOBDG<7gBoA&oE6Qo@xN9LjaE!^{z>zwIr$lWC)a(tP*my@18 zu`JV|3l@XFsHv&N-my(Xp-?AtZj~+{B}b<2EYr{o@GxuJi`4>2WqQ24 zyx8PmVR;pm{tq49-Q6Xoy*Jw8_^rO$JKv>aW?{L(%4+u2BKj>QA`eJ8!yOsvgqbqC z`!nBV&AZs)87H^3H8kRcH-8>tW@0jKcz5vz8=K<&`>)j1)$Qg6xaNn;WUpVpZgZRF zd=_rLY%H?Pu$!7kfbop3FUOg+O_Q zoz{{m)3)kfJ>ju=2i!!1zl4MY)jC%;3U!WMyIR%HFN*Hz?BZg7)naXSY%JB`*Y{FW zQZiCgAIYRE(9+V5{Yy; z%_D0v_RBUxy6!XpPNNrXzoVE>aSom+AM-(Jq#$*hWwnzIs zmq#5n=ft#2{q}9BxoI1BMh`FY#Yt21ng2+7;A6Kia)+0npY_fiwIai|u9AN3>=+&+ zG6D3552DK1O18gRk9kJEf1hKPSMivFQ(F;2YHodCZ>;SJvQ_Fs*B8hhw7=x~`})-s zQj4}%ia6k#jw9ASL&L*LDk|yT-bdnvT$PPF5_(4}Z0%dv%ib70JbvN?v$zLZConK@ zc40x;(-RF3eog%NUk4jcHR==h@aKnj?%YwYut`kjXBVm#m2GSaA=2u2s3DL$jS}6{CMI+(Myu80_$<1tb{nnU^uLxe zKt?t34W;IP>JDk6ZxrqZ(;-??R@T|V?4x966Ni*G?pLX2z? zJjCT6Ja~-?3oCKKo2I6wQp(%rFn9q)6r1DQ$>4t_X~-V5#m~_Y=2SsfARL6+orqrO z)-AXuD5$~C&TeW-Rr#zoIr)KhzDj0hri83)6x2zU8<$R!#qu6I@_KuBwZms#@8@o& zmpiiVJPvVM4raBL?wHvVYuB%Hi94%RsF(aaqNNv%sW~vARIM4TO6LQD)P|X-fobBH z_Lg*83++z%>dH#bj~^d~hSW>S%Cf7fH0I~$v-0!%uO_;E+}rcOyr?@h9(df<#ieIt zBxiM|BO8s@k(QR;-kc2X?drNBUN}5|Yv=l*M2|)SLC}tFWR+5P_32Z@>-~9>i7qIU3GRzq$2g_RQqRT1>&>cc1C{ohiU5xnqwZZ5##7+irQ?+PnxONhfqI?-2O zo)t?XA3a0;g&w1ShoojGeWZO}$os#Ai~P1_e#3XYD4~2PO>Zlfu*(24=qm-mnxG-7RB^E zbpFSy-NQEe6j*_#u4^inbV`+Ljh!|_QfPUr^u>#eCATKM%Y-mD55eM`IRIbL7Acm_ z3u=_>u!ZkX^P5L94nLPSST+;G%Lwg^uAZHr%;(>2Na=g?=Kkdhj3t1DxA!j_7#NuR zYK?(<#{H>z;4w1Hn*$56LM~-49p$yQvRHv!oobHz7aK(WduXI1gIkX(7(us}jIWG8 zK#k@OCa;CtVU)kpT{tf%S0Xe49}2j~XJriKiK&Qi=Pj0$lwe<<7JdpqL^($_>Fd|~ zfKHGa3Z)a-#o;K_6(7buqp!pT`^=C>*8k>flUG@A&3Wysua=!Bjo+HMTV%V~j*MmI z`n8F zY&6a89igjg?&zSmVdLjl+1lEg#bV_c&ODWuN4=LxSJ%+6C*b>8g@lCMEM;YbgJ=cQ zs;lo_q@a*QAqd8ys>E%}rb3g0_tve9{Crs`z>-lMN`{8Nn8eK4h$EB|aIRIS?^A4^ zx6bDLkzOmBI6_w@oRit}eYLlf!^#%|$8;^A_NN=0CT*a=g1~dpM~&~Man?Ob7gycY zbEEnKZpXJj4<2(}tZ`ZTLR#nFsl^c`6EDDw9uxU}H?bpKAzkMC^tMf!`OlH&W{LSR zv<|>hNb=irMICGHf{Q2BY|mLB!F|Sdgl;2)zXY&T%e-}*YG-f7$)oh4#w|w+JcLX& zywRD#slrigY9D)g6nlGmj5iiA0N$!FLvtyX+_ z_7tjIO-;>%pnruNr*tUJ`6FqZ;TKy>$v}v0tD-q)(D%}SGr0cbAIioqiG6DYi*H5& z0GExrNYZ<3j(=+E?&{JnP`z;SNS#%U#FHl>7hHp7DPJN9TsH_~NRRh+_@2`sH|9Da zK^FIthvCSdX=dK~MOwPNW>TOU9v`0@8A;B|drIr(SZC+u{Qm5oo}Q%ydP+)4R7zi8 z-@O^K4ML_jLIfCC*kejm0a3^#oB!|8RZQo^4pQTzuS9UR~ z1!c-*!EYy-WuRI0K{CogbnMgf*I8LvL|A+4)|+4hBO|l6Sl(EEEA365Doh@)S>Nxa z@w%+6%3|#E$B(_0^R;tdlb)vH3Au(a+iGLTWuFm$~;NKb^C5UvUBF{ibKc!fcY!igL?i*omg2i=@fV9ByDyT~4+q6k|_x#Dl$c1kl@&z@jL6@{% z2uE1tx^d~A=;DvC=!sluV(ePCyHA1?CCz^prA2nF{Kb6N<{y0NtVEPF5fsXEIZVqg z=x;b731Goxy=LZW^-T=Qw6oh$0b#tqT0kw@`~vg%4J3}m|< zOhUX|+S{6T30ixlOkng@`6}&w0^;)4qX*Txb8md-?6VQ0UPlnmzt_JG zqnSS_ASjrug}@fC>~GD@+$r%Hq#=MA=g+}MB+*Prll`L>Oc;q5_9c=dxaN_6iCj16~01@!Hj^O#$bm|Mc;% zMN_IO(1g3nIfnwGL@!1qxM)s_W!XI z3I{NjKD4C)&L`*YUIV2gwKrSk^qmE~OYgwIHJ`eq$jHd&!^Wnj@>*K)m6erHt3N^k zXV)x$@$^|{ets12)RpNLgsww=tgRIuH0J|St{4*&bC!Ct7h$EM#3~1c<@9#zyfyAY zum+HyK44VIii4Xsg9gscTTji*WS5jE0g*$fA1aJ=Ea-Hr2b*U3Qwk2vODlwAvEbRw z-Sq#>?@-x#K5m|p@qx*eo=x@do6>9>))|>Th~XbUJ`@KE-vo3y}fM*#pqrW z2n~?5Am`q4T{l1c`pdnhj(EZJ$)?~I%QD;-Qu>~4JPwb~_tfGabxIZx5LoLJqd$es z&(4-SeRs(V2&S;bNVyy{GxN$0!A2ndEbWZ(pPV1y5OzDk_G2LNu1%uQ%#xrgyyX6D z+1c8<0PcD}>Br9@nS^krT=fzOpnu~Xl9G}UQBmm#14~ZU`{AgZtInL=djq;)PkwxT zdxF`dhxb}2aer~8*HqPo{Nv(cH!mrgnr8iKkI#nG4>;^?aBp9q_k;TkXD+SPK$yX& zYPrhOzkZRKI4+D-pg3|*S7@rM4}BOTebo|C#Aji9o1t4V4 zze7?&!duAmSwZF4BK`X2=NXmZ=R)N59&ce|4pFwm`KEo#B&9Gd(+M-(kj57m`_WZWo*QYElFC!!K(2VaO@$NKLZNjsGKOx4_>qpN+ zh}RF@CTCOq0Ac|mC;(z(Z1*@B&2N*ewCG7GOmRVsb#<)88ye(h*?=wb4ad6 zfpgB)r1i@r;+$}q&0Cx;ov?Y$8aIk;ViI3L4OSgRxYUE8A3u zHDRW>$gnKQ!txs79auz!9t^+FQ+-2*gp_svu?hhyrGELV(2_w-eRD9rw|DSPp+CSW zlW^Ae+G)-B0nh@*fkZj<%%PauK7xaQdUV~c?j!u{^H)FNAL$2f1(X9Eqc*%QnU!p*B9BAMU$tBrP+YHBf&>>7NXD`|hxeSv+#_52Ed z6>810jV?7k1y_1*-STFaVin#0EKlq0weN1NM#RMl{w_L1N_Gu4j#+;m?V7WLL+NGv zMs6bX6HxInyU$;BXjFJTNMi1U6HN<)!m>-Xb@A8YTHx?^@<<@oli$C8e=m{t_6t#Q zad7~837yjo)%C^{urf=lvZd0Mf&HhYYXhHHyN+ysN|U#ub_^qJxfs^J5fao9x=Lb>^ z2yruz5HZAKZ7S?$d#-O0_UQ!mhc%LD|R!?Yyu&7{>{aR*Wirq z>X_CwI5GvL38YITJylj7$$u^WhNQRdtFdJA(eRedb`Fm zQ_niMe2AUNVhHQTdCCv~KZfFZe~6+|!}>%t&_jS7d{Z<$(hWE{W7b=#i7jf~OKb?F4LYG={#P3}op>T5jyG(4AlB!Iby zyv4EzA#v2ng!w73@wEx#PoL z`=Hbtg%_n=7X1MG1GnPMxG@QQ@IQFh?GE5w-)sLCx&vvWkF-d zftHWR=q@gmv2k%e7|l;PIZ_-^lAx+6I69Wmkof>R2LuBwFC`^~DIzlRaZaBfgBKv< zjGbSBarop7z=VOS24#cxt|z?%L#0Y^)}VK>Ws-M0JOIJbjwoN24bQ7X6p+yi=VWC` zQqvjg>l@=|dj*`9etxh;np7SH7x&%eCMeM-7EuW?F_|T1{h$Fb>DtREz8YJcISh6Z zhS|T<4a*v4Ckm53EMdu8{t;`Dr4{@?skKZK1kkaNju#WtH^U+=yc>EfAHt6L>Qz?w zQyt0FM}(EF(ch#w#~E$Xy6{We)h?S6R$^}C^*~;zgR5E0)ThXkngod%1<9End*4g5 z^X^?MyoinCxBMfZ{U;go%Jycj9Z}Nb!j|LSXeK|+j)3q**r@# z7=*yb=J&RtY=DmI^l&Ia=1)~%{bv^ulwLf+UY2s`m)#>|>xzzW*|5~-Jeuh~O!V_w zn?OsfqjqEW4MiHr;x5|@SJhUZ|E>J~U8icSi*;M?Aiu6ghs7v3CrJY85k;7R#p%Cj5C=(D2ORRfK#YdUe>92R>OB5c<_(lZ z{uLAPUuFF#Qg0)xcH@DERLJT*Y~yiF=x&e2c$Zcrt+BeeU^Y%#teQ?3(0EZgoq#5< z?>o2vl}9(n|Ijipg7hAzV&?>dqnfu5Zrhs5S_=AgG;k ztUv8loUiSX`Q8#2qsMxl38lPrQD5PT}G2Yk5nqg(mp$Zz;JzZVgQv+{LP+U0r7yM^8{`D=996?h#JT&xj zT$`bC#aS^V#M3|^_#@Tw=vp+j+&<$BWdrFO8yTfT&-MtdpyyuoxpU{jqoXq#8yoL6 z0bA{b7ETq$(y-!e6S9_{Z-EdoyK;J;#*N92SeH#UYpIsGgO>j@F?ZSiHO(>TJt^AS z7C{aKd|bUW1Kq{KL37Z(Q7zM5%@M41P4J_-u^QCyyt0KwF6ak<^796ZjLi0Sw;r^g zcza*Kel}c_BMQ#8IK(O1HFJtB9RRW!o-fih6l!{xPdu|smUKB^k zBnq=fwWPj!br56SL<_uI4!Uwp^qx7;m5aN*{pHW(n5^8288u=ee+O&bXv)Sz)A}la z1G>tf$wPxy0s6aON76wW=FnM2mI+7`%rjFau%h_*_y=_8ti0N_#cIPgs#H*6D~lWT z!Lxu$0i9u~0@x}lh1#lG4jc>Pwkn|6)z|-SATbn0(hJDEc^;@QSGa7?a86#zCU&G_ z77W|pX95?59fVM?%*^X|cP?wW^qBsXRy`DKs#QTk_zy(VAL9N9BJt~vAJiJS)py+j zHxhQ8}6d%buvudM6>P9 z%9l-4f*gN+=N(d>!}HRu62 zRJs3{l>ZmRlQcCIYBe1e78U_DyuDopkV~*j-XM{;NGYInXeiu~n}Dq&nCfO^t9mQ- zr$%GwFhShNYiJCA7z{oD)6>@026(Q{QuOwJfS>aZg5qym-;a;ism*x?(h9I)*l|4{ zR%2shK@&c8sja?V<^m82YpaT6DWDC~i#+En8tZO1>cIm+jN7lc**kr4mNDcT*Lx4h z7QxQY>}g97a{XrQQ+L**yLTEVawI$=;`_7>cA!8HU{NIOK@fC6G=RH+7M23u3Gptl zRM`D$rGz%oLoF?>=C(E^kfw!q=8C?Nt=#ytQ2$VvDXb;4n6Fg%Ah8Wd59jc;G3Df& zci>1tZ}t&h=R!*%^F&vI z>jjbCAR^$8oK8M&*$L*&plI-8C8=*c(hPZ42(4cO@sfwt^w0|a(}0F*la>eVnzm@J z2g=#_ELT@Bb4^c8Jrr_#LJS{nvsfkQN&7pAAXdU0lTcS%MW}!`sfm@vvTnkaQCRSK zW2_%iw}{)q_Z^T?9CWX}%UrFnE}&A6EIEjsgG$``73qtgQ36(cYc8U+Q!|GaKD|P; zU469t2h!0oLu{Mas>FcpNr`1{G6ob8TmPeeQ;V@Sx*f8De*%`;;!JbBR<@p?C~J~X zqMprV1eX!hQUa3SJdBG#jOmK+%S0ji5!cv=9Qi8GVYudJ;=@7e9%l!&4`haa=e*Sa zanwW7`U&XhjsA4x>7Zc^I=VPW=aIZ^S*TrIu-d1s94>oY(Y4t~?1B6K-Tp7hos|aq z+O!rAOdV-T!_qg$8V0_2+kF~YMG|WhXcE_aT1@344Q4e+HNa+8)n*UBYdMu??m|?K z85Y3XCI_4Dl!=+`;Dc?MEj{nz!^9jo(fXf&9NS7=L|YR53y5z>cCws3ySZ9A)Sy{UwH?XLW zh7-~M%^yx*o2LKYt!?+OR#jBN;9rAo7t#+3*b)RumY&<+`se2Z;LkAyQ1x24qrIIk zrCs$;$K5x(jyGwE>*u`QVn%(fS5pDY&%or1X?R$;HtWM7@88qFjy$!gS2rvMiq1~VOUQ^I@=%s^-nbspf{)aC-Bl_s-VkH3Q;16&2Q2Y)9Lz@q81oW&0hNe$hkJ#T2 zOz5O|AN&@=ph-(lgY#LMYAqe?Q0w6t1S=4BHd;WUt*OyUbYG7db)KQMw|A#32L$ks z7Il?yqHMZMJODNB)V=~lYxatsTrU@^$rSpBIG@*UAiC-MP~)*L9w#?E5il(5E}Tf` z^z#6SG44a<*2yq!QyV+ecCjLc$$xkuWs6QvGC^g76;U|OP=UgsOCU-ci`@Z-7g5FF zs#MF38Z8IR^Z{V41PXwfG*;vsF&F(Rc67XC6BLtII@a_@+8}#jfcU+#N@Sy zth96l6S%w-wuArCF^)2>=Rx+2@0~j_Dq|;}v&}?*57oL5Wex*{3 zu-4sjVRH=61bYkCz42Xz?Mzl>rMeFptvqN6UESTi-~fZxh;bAj8}UK^w>q>9#acg_ zzFL+c?N|Y~%}-fb92Ozbp`l68WWs^ECYNWK0b+KCKVpkLS@`$g+(LQQOcc37ajjkaf?BoZ$QYxW zR68Q-rl?;T4Tgp#lt;$Vj)zQ4OklASOsn&Gh!B>WBmWy6*uu1icIr=QSBP5YA2W|L z)wG>pT~(@Jp+9u)BN-o4yq7hA(ibrBY7OpGlDfO>TPzfhgd@orm4w07_YQq?e8p{W z)&U0xwYU*yF|x8=<$6<6PjWZ}60?xtBk}!@Htep8HWYHG%lc9^HvDvdu2fbnoR6d) z$RK)TS0WYt>9lLbA>$YRynB%N{b+J9vDo)0rGllpx<>ns298M_&P3@;ml5S~T7y=n zhnI+T!OLWT6sZsYmw3LG!H*-alqah+JP{5OK3LjNiYOg605IVEQWwsanm%C}Xp`#Y z{KrBh`o|pizpjp=c0|A4$--opbU1<875%y?0x@FuXpOE6X9;5c_r-{pERbWoRgBKsNYp9^~`Rj0EXS8HS(C(8Ddh&#eQ{j>h1B3i&G#~BNv z&+geP2gSu(a|PMsiePGo-niNQ2~jJn{A%sRj2Tq`>4t{dCGpVUG#RaS2I|FC`0!63 zhvoCXkp0}v{o$&z^wPY)#wJBxhI~3aVVQR%;FPu7u}z7&dOsn$^hrBzp5BN%y;fQT zx3q2RtY4hBm1dTEoD*ZS7P2z2!a}_mB_7_e+kV5==I2RYpDI0|CF*s?H?I8H39a@+ z%)Hzx&kNpu+fZomFHWr~C3l@C47=u*;D(}USzCZ*WA_L<8XVnyeQCh$%qv>Kz1-8^ zpZ@G-2K+6p$k+R_7ev_H*TqUtG;T0YzF^7p9vTN{PMx`=e;0VJd*>>i z!gi@6Av4LGYi?_gy3F?OpcmS=?6cM_;O)u8mqkE^i%9D5_BY=Z??VyF&^HLX(S=}vq4F2p8Qi1o)edz zqZ zIUdfefE!O?dlYy8s57`QSz$R76KvcCYYnrqq?{b{;r&!-o`L@I$BemXGT3#w*8T9| z!*FomX_|jg>T7KZ>%r2*#rinQZX{=6Fu5C}uCmZK8Ge0^r6rA^%UGZ)1?LoOZEfE* z=-#+??MEo1Sa@7q9QNb9IvaU+ef^tXzkY>78xm3xFns+=RgHK1^wZ#C`Sj^UodI|_ z4!-;x*`iN1qw+00=O}}oo?a!8|H}S0!y?#NJ$-$V5u~V+$B!ScEsZ}w4oc+a=EiWe zm-1zYl?)9HAsWSNiSWvj;TO}*7imR2+`0|)3ZiRwS0n*b$vEA`#y=SLgtMqLtCAeKJw1_J-K|95F%yfg>t+>2Addf``Xmr2z{I%UT=%*zbD3 z^DY}0$8K$JyPvzqV^9|lFy-at$sjE!n3t86LO0<=u*Ozv=kIOj@2fw0^eBd7B3Pzc zh7TpJl16&uNa_%R%_VwL_@sAZ}T;mczwpA!JO~k#oOB3 zEvaIm$;M>RwjTvp^x6e^d;1cQwQt?NodK>XDGD8fmkzBI`(pE{S#r6iDO5g!q=eMJ^nogY1VyD)~%2j>{3 z+L`AyGbRDVWw;lJjA{ObW`7TvPhLkSADld3pZboq%M*;=BzWARA!BD_yCx#y*}}U1 z;K2hbIy&W>m%@8Zl|TXqMGWRLU?5x?af{bzLrl>M*gX*orqk;G0Uv=)4Ut4~c$foY z1A|9k-+?%jab|1Oev-=Zu@h`n+qd}m(jp=*BC!Z8+O?1tz70i>c&JCGwt9iEwdD*^ z31@g7gQQ69A$G$ak?rop%fQva+q)?4Wh)R53S2L60eq9lo^_qOo<$7wD6RrQEhyl6 zbS1QYv1Yxm>g+WCM~)*$j@;tmNrri~zYKDl7&xL#Ei58>O{Iq&EE=HxnVL#0f(Kll zKM3##gh*yi4x6>uHR^TS>m?T4m70Qsobv3RY~+Y44dHnu)E9ca`1N5c@UC4y=l46_ zanyOTu&L@A7_IVMIqB}d`tspQ=#wtL37H{`;?PSw(9PAgwfjI-=cie;o*O8r=VCZ> zG^gqyx_7w}Toxb(Le>B+9gc-T{{d`zc0*;!z@dQSj(P6aKma?qiM7qFf<|d#Z7t{Q z>Qluy7ujea$eXr^(1nb#?Dsp$Y2=LG0tZvz#sZ531rU3WdF%z&|fS zCZC%dRs4EwZ7lUg_;|2=0IUpy9KRf8orY!oN_9#`)1^+EHj#ixRLe}X5Z#H*f z*qgfNmS z|IAjLy^o^1>-6F6+rwaKHig)joSdYhq3MzJSP3iUF9)+D1Q&E#`rycp0pHa{@@3Wq zKqXZ4^s+8i{PxIGiZU>WLtpBNdf6j&AvsEFY6Vbp$Y=#pz^r#CzWvnciDhnSDJf$Q z4{aDBOsH@o=dx?ljx4pD2jlD&kHYAiDpG-Eg^9FV znfjg*hCy~WBt|$p<`;$`)Fw8i7D_)Bw?_|{Y$2I+Z`%w4Kc>wP&eK6mLeMwpa>ca$ zD*h`3?2UoJ!7W(3SvU@e8{G$0x4)*e+krpAfk6xMTS~7#SzKmrZtv7oN@G(~*sO8Y zWXafKKTH&pc<7Ud=g*&a?R%R6E_gWig}55PGRS{7p(YR33Y=$1KMZV!fD9r1-@1A8 zgGQOghJ#P!YVVhoqN-|!Dq9+C?eF6+zG3as zrWwkqGkYGr|E}LPM!<|Q=T$ctHE)gk(A$CjT^z{?8wpAToUH;2%a2OdIIttYu?HCH zyT{4mi5O{Gm}N|@y9OLify!!vAveL#=BCs~WPsNNmf_UNljbg;3)OSCeBN zH8`M(96N)45pJ7r(O@eu!@sfdv5?2EDqZl^>s|ptK{v?#k%W;uTuiY(=}|j2Z-^d% zbc#6Kp%!SNJ+xqpzyMr!Hw(b;*X=Oj0htI41~qP5^59@_!R3}Is;HEiltp8Tt1^oZ zS(!e6eh*c8@`yu~kcpa!Q4Es2ctG~L}Fu=n5`B^-BkbH1C9Lc%R1lnZ+ZIpe@Bd2vR? z^Ilb)HmPn9Z`gMPw!FQcRBr|)BZLXgrwY@(Z~aHR^xbN!Vkz zT(@AL^85m(PYz)h^WP&9HzU%ZH}R12#PQ=$_{vS5A$^~ZmN2IFL=jFnRyRKWJU1uj zk}~Ywuet>pU`_V-_ZP>MPwY7J1(us6CrqCj!}M+^6Ar zgasjeNiMD=*Np{i8Jdv0fT>D{wz7T8Vj4y|mDWjN{Dms2bT@DUJu_s#*fePmMo`_z zY=~LrQVYh8M3JcC%G3GtdG;$);xIoZc6N%;ePsy~hjJO4nApFzW~X~6xQS8RTS|@H z+M|Sg-qMBESCFA=wzsoH#McSp`ARkrON*f#-q zIq=4yiUp!JA(=vrxcAnLOg`d>6b)PzxNMzS5GVi>9l6uqwf`2xMB zwYfna0612+pRV9pO$>|F;3y>|`Ple)>B@7(QPccc98}cQym#;BeED(@3L5Jj|o4Xt=wL^>R*Fq{s$hK7&f&;sW6k+ARK>w03)vd+^%=M4_3RcPit5} zkE_`jl^i)cC|wmNA-I(0urgdtcXDHOx$@)3`&KphNGL}=gM$^%`P(5=05F2OV7d7| z8or>0aynZyTzO@ogmQ@XKZZz1F8(ayGTUkfK2s) zVShme#H@h2M1mO|O}Ml~v&d5mE!2ggo!p=a6+MJU1XOj_7{$XY9#va>Pz zPR`zX?RRH=1je6&)70EtYW&4*)=Hhr_Sg~5zT-Z1?;c+97P*>KUamURk=PG+M7-sL zgV%$bl3}YNN<{Abf_BNFWq&Ei+1*tP%iN8@bvs*5?75@&kew88-bJfgn~&AAx=Op+ z9V|>?7)x2ZI#?|whBG(Uw$$J2JkO``B{@eQK!rYdQMLzQbDZ$*RgZ{k3A6p9+9R9^ zcbz|ix4xvf7=9H}_t+R9!l08;mPYcK{`2+J-ZinuKf!81j3T8NB<*vD5@g@sF2EYC zE6~E`W3udUw70h?Zyg#GE9~(7nfGK_L5z=c+teh21%iD?N=_K zQFQcI3loF;yJl&V*Vi2olmT-NX>Yi4BekuC-qU>^ zt@lZjmcy)EuMo)rXbguB>>elBNv3j?o)@_^KVAG9u*de^&LS8groaoKs#xWutJUih;8cNpbY0g zU=6#W+#)AA5P>vx7k=Nz4R&?}NABU!dy)uN&3ts|r5BJH)R9P7J6Jdsgux<43BQN8 zZruuZI`W`&O-U-1V?w*uEfXLFVgv;S1shq?tzR1fmwI~1Kudv0mbxo{@yJYu*n_kT zgEn_b<@R_+O-tKbU;nUce+W+1oO>-rK|yhzr$pbz^d95vM>vZFrZAw~CW4<94MjYc zC*C5t7akCSsDNz2iDq(LRzM%eH}8OclDZ4LFcQ!{@MRDfGC&T2-{4{Ya!MM~;v*e* zd<5k4WVjFPp!-m!pzy*Bbs8&zvCS|0|7q_^o0>eMXe_O0Tj~OeQmiN-AVjE^MYcG& z1_d1zQiupsKqU~Yt!dO)VWc><4v4aeBDTmDAOs1CvPA8O3lPMBY$~Ke3nU?;h>DPe zo~QZ)I*uRup)-6UlQ(ak=Y8%y=iGB|WHnLTq!>d$1=ykr9IuY~D2_}BrWzV@{=72_ za1|$yJa9!t8z5);j_+7{TMbjrM;}Zf(6^}QPI=kJxhK}*wHA>74k;I+36i239TU(O zic3qkJI&kVsno05O4QXgWVVX@;(B~Fp2R3SG;-i|fJHehmxUD=fTw_s(Dx<5Cr6OZ9)a_KS!(&c%^32T45~@LTognmbsLED<&c)f8U9|&EO%QAT+V7rf)(6pqJ z@f@96-+fTLeeJ%`Wgtf0|I&s?jHml0D##HMIR!3YpV)_e^ZEHEHSX&6VvE z!T%%iv~X~Aw4e8B14|t1?zC(H*nI!MfVH5<{ShlZ)Xlsd5gB>pu}F}|T*_HQ2b)C} zf2d!Vl_B7m#QA8*fC)UT$PRX9NlzveJbV8AL@?;g&?9_%M%hq(YSp%`W)MZNEl4G^ zSKJ+1Z@BNAODgMi-^9u8Sb_ns;m{UWR&K|XPI_?ToTPQmG@5YFSH+0(?9X#9M{{4T z_L!;Ii$?@vCU-PNdfr^vr-&AHwfha{L`AEuw}oqZOpyKrrPT%%%(*8bZ?{Sji3&Bo zgMlz2a<#QnL|xf)nwNAQ2k&lpL>b(^AkDquR%%^G{#H|9DyS!ZDn+(Ge`sJyYW=<6 z^J_RWFGsELu#2;rEr&CK19w)Q&c^$DCSdi0#&ifVEyHJ7HRq215a!Ar^iS@XsABtz zcfPc|D=cTyNJ(-ZWDF<(2x2gaL79?`r&1!4n+J%aoRI6@y6G5k0tp9jEXW}v&xUG1 z2}F59TjW5c5?L<2^1;9>^!LtRHmf2CT9dc->1vYjPcEeS*X|4o;-d#XGG^{dN@w#C z6NvCJ4(6ZPneRLw zi%In|CFJctZdmLex&!zKv@Wi#btq{owp^ba<9?Ehg?IzWBXGonf~qd^Ux9hU4k7E; zOj2(=E(bvxyp7p;DUs7GIs?(h4^vse2CLHtnn1JAVF)AR#^83K1QfdvR*rXIXE?|t zz+$BnPqx@vWj0#FDXCOO=`;$xCOJnZ@9N@XcnanKs9QJFeoPRM$+o9(b=Vv*+9?yo zE^+|~56}>cp+LSlCM4(+S3$Rw$3TR{Sf4T+W*BZsyCaSZa5bsOx2TNoUH}}F%jJ1t zB1B|ks0N!SBv9bPhEYgi5()~^1`7I{O2q;qLSvZ5>AKv$*$P-BoAWo(#w8z)bo|(0(od2y`X@0&n z`Ux6#iL9ku1Z#Rp`08FX(dzXqI3OV1ds6#-i1bhZkby@IPmlPF zOt_85n<$e^$0la2HFbz-h;dO5&?a9W8*XZD-gp`+Y_AyE4d$2_H@EIxq9`b0AbJRS zfhEp=jljq<2qccSasLl3aE%DlC-Gs799rBmI^Cer^3>1RCD$F^-l70olLu|%-&{IF zR4bfJB^r=w#?gsIi9q?p?)d>vOv3`_BEx8UUwrK#(d_0{$kqWXIfJ5u5a7Yw%TT~8 z5HGWgx3C7*9Y<>?5k`<1I#M`yo0^pH5|c{+fGkquvAo`65g&FN0qI2>Bh(I)BRYhk znK!?oAEMdV>~8fif7aou&K0Kv7{I^8Ah}I?4>#1wnD`J#aai<^+Nv9f(-*?Bjg}v2+Ep@M`j%yU z7!#{T5-~6}r|*^#7%=`SSL|4i zFisZ@C+?t7uM%$6?<9*pb;^g#L!*PIpi|h5Sf_2t#Elcsa|z%##!2`Rrcd%&SqtGeVYX|g*W>Gc2ysIUhsw2AuFgq_@kqp zI*`ZXwXFUG8~C&@;^Rc08lICuc_P$7)OG2A4=(4ZtvB)Nb?>*`5%Y2k-qgz8p+@$0 ze*3$W*ZzO&zp6sM?`3NAnnY*nlv(6A0{&ec^nKsKfAUkcakHPx_`kZXD8zxI(AWB} JDf0@ZV`|YQ5um(P!K5z1?dLqlvE_8OGH4VK~fr|Q>3L^x*Ptv zUiaB&?{oG(=exfDdoN#gE%kZUx}W==bIdWuoI%PDrLnJ&UqK)c*s?N`j}ZuzFy#N3 z=P+VowD^mWB>bF-c~%lC(g!zMFYkpd=m%a$(jkrw^068iat6@Mu9jEukPFCP1( zcwjziIW)p=k!Uq*u#ytFpq6Q48rj_3%s7mrcS)QSmzL39+%a{MMx7@%fsec^c*;2` z?FDI<+rrkhAG|3YZc@HSL3vd#Pn>_(`r=CPsMtq)8l5=%SKxaYN5>q-d){!ym1v#8 zl_w+^I(1z$BVT5}tf)vjQ(`u>ju#}E(DZx@9Z^Cb-ugcI5R1;&`Ud$s97P2MH_CTX zqE`YMIo8(JtWX2>c)Xj=-&K2=MYNWb1UhYh&dFg{VT-DTD`@>V(WUjprAO;C{yJh= z=9!zHpHCrn*nZO|yUjpTQIf}SOno~n=h?S?x(e;{H!_TxZO@kAlO8hS2SsP8ez`?{ z&7V7=>lF&`O|pJd+Cnt^eCMA(f4V(ki#m^yVT`cDy+!AXivoAz$x?NBtCQ~-5)x86 zZHgb)cO74z_Bmqa&6_v2aA_W<>k^n6qn{ox6Nk&}mbT2==xEqmpawmpdc^c7OZDO= zeo#?4&U;*mz=A+YdIuey30{OMVh&*tn`7U!<1bKZ>EN*U@;4WYFD^bqxC}ob3CSIV zGJJCxo7>*nU5q?&=Db#q@Fg(u7)vytg=XIl%fgc6+glKmgRd`<5iXa$!W}2{9E))x z*x`0$;CJj(KN(Cq$v{SYS!`y4malW(S?;um&Qo7$c=vPDa~l+90_oM;Y1bu%76;)9 z(Us~mvB&t2X5ex~VHzwy(&HT9iLe`#l8t7eOJLF&h^r7tQ!?SgZ-bRlVNr^3`^-gE zQ0e3+XwEk=5`|rf1Fq8~ZzZc`KX~?xYR)!Z_kEaI*S@5LM8tN=#ZiiSnI#pX&a!NF z{o96=0Odoc6Dzk_it>~7Z?m~rep^-r(I!-7z)pF{xR5CZC^4{!~lr?e?~Zy~Dx!c!#)T z=h^X4ZF9conORLEtz_6|f~10s%uI}FYtqMAgpT75Lq01cBqV96`nEVd>+9>E_R|MU z>7tlD&lqAlQioO|Cqfh}Dk_xOqD*e4EEm!-YV1ChQlH&(+3J&~Nv)}&zB6u5;ISQ< z(m59AaWL+9pE*+h`E%5b+6xi2Jng$yN4Ia^KKxdDB53}r9B*V~BsMm-ZgZ1Mkr^-G2&xsbCSd-By4r)p4(2ii(H)UaFM?ga9pQ6Urss4 zLTn~Xo}$Br!rBbB_SP#FlbtMnyH1`^-@A8jWAI7amuES_Smt(QJ2yXH|FT$7D>^cg*P{B@FYUR71yls#l?QGW z^?G$Z9{a_IthW(?QfatBl3T+R6ck&n453Yt5> zDKHbjCJ{D5tyn7^Q&v~UL>%^~oby=~KYsCof!cMITPFRnIy*6?fHlJNWNcE8kG#KO=7(`3*#5TQu=k`xslU4)j0cR4YO1QLekd-sYpy)m zU%P||4hflQ4QFtI2e!z5@NM#p^V8!SlsFjF9*6qZu3bYQq@<*J`}$ByG~b<_9K7g= z<`^!wVR)D#f~{9{Ybx1wJ!r$|cPXOx*RSBxQvTDG+Vh)DGfm$vjg5{X^fX2N$1SDh zyxUIg!TzU1Y%{Dp~dg6)rY4Sg}^@+xeempgOC-8j@j z0vsq!r~75K@9x|mx9#BAn*a7{%||K?1yKbDyx8)jnZk;ZPct}3nbp@Q*%|#}i{`?6 zF~!qk(BZkPI9t^7?{A1?qf**ozhXmhFnf;msjTddN4jgj;+-y1JbUDkV~e7v#F_0) zy^r8BLNzfrN8=i?+Kj0^H5_y}K0cn&O`e~h-dF9OK1zhg|jJ*6#e77{JsU=@dcP>86o8NZ09gb%}0D-yRMFvUB5W+ydd$sHR$ZI zzdCX_aPiY3^Nj682|_dT}3l}h;Sqhp1(?77mg3WPhFvnA=RZ)*(Un6OLSL}(CV zxoSP6Hc_8dL$K-0KR{5lTO-;N+^Bke%Y9j1z1BmR?dHwCzCOH^u{P6^nY|%h-GWXT zMpT5g0OcVv6I>oj8D%8IL_;u6@--3Xs=dujcDZu-@@4C9<4)&Ci#Btu;U)(LZp-qz z4Gf_|4WCc{<3>Lg;1QG`Ot_{hvle(>cvKzEyxr>F5xqF-!HUAm7XCb7N-5$-s*`_b z`mCkq^KEiPH(!F7jKNYk{wa!P%`fh=wfN)mE3@2_P4M5AR zdtq*_DPTAGp2HP)cXup{i{q92#*KqZi1YJ}3u^S&`h$C~)_($#{cp+)oL*|YV5JcvuESM2QM5~TC@`sh}lH{_5j1ax@=S*^p1^P zo%*djZs7lOe{b)5f(IP0tzULM-xKN)V);X}E4ml=&gXT{FT-w7I<>S!kWy2_#;-y_ zs8`rBc^vnrGzS#Pr9b`!G2syQnPamO#aGSTt&}^KzerP>xYTrV_Ae_;;9ZRLco4&; za;c_<5XFK+DZrH*&9fKB8ub3p5&4NB@ne0hY%)Z2=wp8Vt?Bd7*p&0#OjdUGrv0_C zM^B#k>0TTUk&=;#3sCy^83%`Q-gDk&^ngI4IJR#jdP1g_uk-H97dCCrv%T{5%9W{C z-%?fC=wdqXuK4MdXwJG5wH2tdFRiaPLri?6t4ot&I;S;xOdKB{zd2NUPSg@Y)%fnt z1ZHHLFU`ea%N7Oui;{OrqGxj902 z$QWUi;?D1(qOGGtedX#^*hXADJU*8&aHg_#&rID!xh=~mE)GL40^z%3)a&8WhhyGL z!m+KOOz}9rQFC#&(UOUyKhq+5&dpAI)vN6#bDRRdh30!?ObfuFdgEvFS)^lV$LismzIA^a@^_Dzw1s-R|PTP7b6)SLS2M34Nj*iy@rr!a@7&WE!87u4RUa!^(4G+iTyK{%- z^w*(ed#FBSu{b3&vz0xB&{LgRL>0mZf*GA}r&%7FgrYhiJknG&z;3>He*wmS`C@Qg z(&!!)8lXOhdcCj>TvB}wZ-d_`fCw9|-PXsGz|{A}hb!PpK~(uSFP4IQeQ|XZWCk!} zf8#!ySJdL%dMC#H3)N=0L&bpc5%MD?ZYTWauGxO&>%g>=$KtR@pMAphzR^hFO)%qI z9ncx%JTyKl$V2NMm7Xf`M73xUZ~awm5)uY~OD00{@n!o3a@O6WurGVc ziw|`kI9pU>x+Y-?1WXlur6b4Lq%>IwUr`8KQABusup<>8;_AV}D@DT|Ak98w{#car zsSKMedwTegv`EVnr(!mePf|MeBU%KSVF=lg!#6q=qaLSQ(J~0yZ#gLUIXrzle>NC8 zk;&%q)~gR-D(cVYY`CHe>RE}3w=urHj6Gn@CzSk{?2!gBC3a|I?FRvPX*>T>TE7^l>+5+%_$U#LJ?mN?0%-kTd*iyO?jqOjkOT~ZYi*z;YM(nCd9qM2>51Nk)W46q2@Tj>_uXo}|0 zLc$A`%!hQO*FJvyh(!wy%i zmynE8%HyTWG`%^yX7{C3B9FI_v~T7kN1nIy$!p#S46YF+qlt6cuitMcHu31Zl0I(N zadvH3$$R#VSS_3AR`o7^Wo2dW&`^Nmq&o=`U~lj26xz&6NpVABh14ldAI>%E!HsK< zE$KG@NkQ^(MYK20?ByDlQnW%6c2Wg;_j*6Okxw*kruc5(&!T45R)prGhiKW|(mH2REu*S_<@q=iId#cndEiC*b>AlA- zF%U@PR4`(G`2Cg#p03eYsl{-a6^+ME!sOJi3OlEnAQru{vFV+of>&#rGK~06)jCy2 z3kk-irq4G-W9iUh#NL~7$UU|4lE^|wpq=XMY71Pg9qMvsSBTdrXT3=#aW5J1;YJRw zB-z_X;^Py(7|!sJ>c#r&zkbK(8pzCD%{o!Wrqs2r-rs-qb7*KbHGsOIFHO3yzyA_~ zl$^W)G7O%s5#canPH^UILZ!|a{o6qMa*p9dL?#yks_$O^erZ+#=~I%A9>lbmsj9rw>AUsKz! zPmaslBvX|!A(}VzD~Y~)(Go&O{%*#f!m_Tc_RPX;PiJp0ZV2UF9|q}=4@E`z$P#9v+Eu?$y>}?)m}}82p*9*-d_atu z9uMuThOFbY2hFXdS`iA@`&J|DHy=p|CZn*p&aO31%vmvNb;e#J(7kfMqocij^Qgy@ zI$JF_zO*VW?b1fo4$hqI-7jB;X-unBG1aHFGD#KMJph%lL9=mFo3pDDqCIuw`Bsz(jwooIS9U zcRzzbn;?2}rP;54mNpc)X>i1$gi(DtG_J$ z{DFjrx|WW-8T*@QUIg`w9?i}-`(^y@B*B2n%6qUY69pY{bn;0$Vs5pRT8vHY9QBTl zUO|wOlGar^tXPj(l%;DAc zCjDLd=UBXkEi{Dd$<}*%QtCzU9x3@p^8AG^{ zR!P+E8y$5KM)X7t2_SBHeb6(bm6)a}(aXt>+j3KX@vQ5;P~P;C0E(jigCF;8E_Kt% zQDX%jYA;#2;MEPJR=S;Hvjz0jnOPaRi?GL4CvB-*!9YhR);2OQVAQ!uw?m-KQi=Pn zl%_@fsojsUcMiAv6{_r(1owrcB8}gWTZlg7-Qt;|DcN*ENn3NmqbE+W;Jo6Ry59H^@(MhPttq3e1g|3x_;RQ?9wPNnJ+$Hh8-dEp1if>ZgJi$ z*{bi}u72?K-uu2h;fzbZ<~di-4Oi`@D7sJ4Y!{i-+UbK5R-9>nVnlq(3jG?DRXn@a zDUxs*Wf50mg4^X2$9>zR8xuK1);N92;|~~(KQ|BiOXEg;A<=Or{#ZaVVw94eiMQ>0 zET)c+jp3B^#F6`I<XyX9x}u8xUo-^nLqHE) z$>(b^JwHZ$6-4P13?&H$=I}O%=`461fe|cfn=rnJ8SL*?uL~8{8HS{AKZ@e#m zpi>FCOvX!PxJaimHefSMhQGiXmjvAAU%#OLyy&eUqL+b#_hjPhJpLpmVI#+`7a8z@ zxZ;eswOQ1&H?5@ApYm+DJbrqssPcM011A=pB*ICN_J4s>z|U$s$W!v5&zY}l>6(4jM#m6BCQV0t$WM}vEIAEAIxGG17EVt2|V~`2sZe;x>U!v z`XO54eQS+TTzEDi@7d9-7{flKl85-WsIW1xb@-%B+mObmd}NHMpSwp8{N!CPp<4HG zjZwj+{e6NePgx_0#CA&F?Uh&eGrE(vblAfYVgM@qHP6v5KKpfSw$d{ORbRPsC3)(3 z0DP}I}uH}AujPVHS}sZNqexqjb}fs*Q% zHoL)Ji&@k`PHL6%Y!K0-$8xJg5F*rRrEq`zkXPGzd}{O%p8nmq_wV0-C@&|4>Xmn5 z45*%67vby^tt$f6;nr2FA-hr4+xuUmlG^O02-*kvKa_5%{p6o`Q&fW8`h(2rt@MAx zTdO>D55rZxPbK z_WJST@z<|kKcworSga3fSv>$+@Tci*gr1WVX@2!SIWS$<5&r`^le=q~I-7$I80*#> z_a@c>O;xL3{tiQHO_eLJKDx~E!#mykwYW)rd<@PCPxLq!)0sd11=F-w8OCjROmt>H z=J*l*TvIGB7Ol0se)HtL45NUxdH+JHhC!O?vN~%Si@u^`ukzGbpTqg;4jA55_T;!=othrsTdab0H*-be)xtZHY z0J*g10@uCIS?gjZZenr+7H@QHEHkQqaxxU?A=rdMHJ$Ue^@}^-Jwuu3{d~qem_(FO zH5w${Fv5IfT6-KZvD)4XkbF}|H8C}n5TFck%orLNsGqj}P*LHmxmboIAjC7+>a*vK@)zPDu^VT zC(8|pDK2jrx6%iNp|R^%Ir<}HdN=L^M075l8f>j=AW*awzVf!qMC8X^Lz#>wvh9#U zHR1$WJGwT;Y^DH&|K49zDY2)UD}s z(T)o&M*BE5#VpFXk2iZzX*0cha(HOv+1%oJ!poWHLF2K}`I}Q$dw<%Qz<0nFYnBru z08erI+N&!cuW{~&uM3Qv{xISt<7gV))|60m4G*Ikj2=>-^wiR#03I5c_rSL#w;En1 zI8T!WN%sEy={qy?94SD62H50}O##2Vu7^}Zst>4FYz*nU*Dv7(REJe^n0zCV{9U@a zU3VjuPot|DV!^>M>y^%VW!+`20~hTort64;G8!dkr|jx80r|ep+Uuz;%Rn7`Gbb?k z{d4^Tj&l;EG4(g5`gkc zgO$8*I4eW>7zm($s&;?KFD)<2%4^3-p^4#$>1b&s>~|PJo(4MO$K%qPJ&pKwMr7P3 zo17OO^+@c`Qt+kDe|M0n+B{EiYnwkx7D_TQhB`O?4g(G*#Wn_wD}JcJ$KU57 z)h<$enwy(DbZJxD`Q4>WR7~4@B+<5q*Q)kk4K6lDjEvoIHo%o`!7{#bGlF`C+#1Iw zTF9$2uwT@)Ui~TW>`_5;WxR93yugfIYVGm^#M6M^S8U!KiP3tkTb{Ed64G}Y%|=yn zY?4@_H1Vjl6Zlp4dY)1$E+*@1rzAfh44P!+AN8QTZ**R}i+=m9LSVnqMu0lK-;Z+k ztTni@zMvzY;v*)ORXh6Cw4MTGte5v3WqYwk)JaY|9;cXLBCZ*EpjJel+)a}CeVRt> zgf2+;$dq=d+haD(sDNOwKY&}LZt{L38qK04+QhV_lLhf-TY2I{X2v;(=bLlc)_b;s zw?*2t?U-;Mo`_{!A^*Z%I*lip-nsA=&#$^wM+5$<+KAA^PLkA>ftra8P3kxDG~PbX6BQvy3Da4cHhhEM_;`>AX;r-kZsgUSXwZ>+L7FJZdao zJ=C9~LVdG2D(YQ2OKY$`!6yxx^RG0Ku*<--S)04DPtS2bX%(oj=nXq9l@Hf8^2u=G z;QMYyHxze>6M$QU_~PBkVEoxXZF=i{dtiIfl(7?~|3W6Mqg%scgSP?j_Y1$^#W%ET zOdec&RX5>*3Ors*IGzMCeK{I^1lxz+gb(dWt45n6E_l{B4CFZ0y$2TaC1SWpT-N{S4k>i_DfSJ z`Sz_IexS@3FSxINk>XGl@6qMirF)lMPq4c2gT8HhNE&M7M3F=pLYYAmoSE`Gw^KpQ zZ8io8zN$PP4yeI->vdc`;*)wnoZx=4uMbt^P98F!WTtq;rv(y|09dc+_HF1oL2`^0 zA*tpBe11fvLPw^f3B0EnF22D}a$+cW)Ece6=x(PKUyFJt%M?oLCqm=jF7+iS%$G{= z)ipTxTa#85^Td$8DDT;`)^u(h?BI=ltaC-hlO?*!97-B@kHRnEpmBR*$0Ro>IA%P& zrs(NJw+U(=nPTfrHgA4G48#;Qh2NiWY{ad=G!#c{UK+0iUm*DUtH&v=sJ^czj(&`d zy`7lI?rOgC%lZ;9;UdRN49$jejQF4%)vfF`Osi|Q>}Xc8gu&us!KZ|~0ods?NOJN_4=>7h&n(w1@NXZA2|royL)@nQ}wS&sdeH>_^Oz3 z0f(*@`F|?w;54fL;SD>y_ASDI5aykFNo67{l=*8HPq-ur9jhGepIifDlG9fSL zTH_zyU9N(Ml}ZNlzbg-8s1U60P2cBD)XB3K5F zia>QqXlRgiF6@?QVv^}HwEmZ^zeAZ$=}-rps#XL8i#GHS*&z=gY@j|A%NT?Z+PczY?0W29_oh)tW<2`q z_*HrbEdkf5_i#30OA^L*q}Kef`Mp=}bcSCDc;&A5aKFY&WCyA`w%@?YV?i>96m+fdDM9sBM&!O%{EC zWBp@4mr~>s&{KQ1hWqw#blX4 z1Qw?^X3!rZN#DGYA=r%m@03$F-4c0-QZVaK+>B#3M&kYVe3*Cwa^gpM4s_UTn0TAEdudB00)hqtlo^`ciqr|cZv=Bg2y$`6Z_=pOtCn( zn}6|%5F~OXs1tAls!cqTG3b0TlW5m3f%+EV{O{$rzx_#xewA%SV(v$9ZOLN&E74(cXBx5S!Y0V?pqmL@PTvIr-*NS}3xl>5tCWsU}ByS}d#g22DCjG&!isd7^nVhC!fJ_FzUknbNe2>2#FE^gpA)yOLZXY z6xhzoeJw3*j(Pgz2}*1Zx55(*4J@EmCMI+q&UUH-*7?MdCvMq=BV*7`wvlBguLtsw zxrOxfy4ftmU_Bc<=x|vUUYNbtnd?eSjvc z1(-wSW!vT+=u1mWyFG(j`S_qZRZkqcsF;*!8WoOcR`?!6dQx&?ig(c<};|! zm%YTOD%BAmkc3c;(4)tnz8mpfytSpcPCEqE?&z!G=qjagv7KItw$FfVP-g2wboZ?D z(YE3H=x7Q0a5(36#(YROP)jHcl3*`**+rfxV1tS%FdyL&pv1X`gM*5AwL0u=F;*&` z)<;YJ4wU=r;7n-(pBRXH;PIl)(JI3MyP8KW&0x;O|@s>)#H zx*j{p$Sc41yAy<-13$98vak1HnHJ+wmr~Z?NBcc=*7uP~e*c**DMu6_TdH84IsFdK zAZvT^1=a5EuNP@PSwYq|LL9_bzhq|@!o$(7a>4`u8t&Wg$o%=_2~m4T$1D~je3$X@ zafBCmy+8L(iPxGyg^C4-8DFg^EbX%U`v>M`c-a^m1^f z8_j1$GUmp6^?vIYr);K*jqk#45TE~8@L?ND+^ihh58X6GCfoo51fkq*(8i{?KaOA> zRVgv;&c;3cx;Z)ShUIUjP1z$K!)&H)XlRJ=0>fW$a4?d%2k~?3Wj4J2top_20=d{o zxp4C0{9tKmNlZnB0Bj1%YHI#OH`P9*rlLS*JzTT$e2XM7Zr`2;D~!?YSE)#SS`)T;5VP<1v`G$g|$piPw!pX10&6FrGwciQ>t;V#dX!y>o{IF}3AXein)uJcZx7)H_f1WVJ7~L+F8B z6sYBG{O0k02oCM}%V#3>4(C_)s+6LzTKa|gEA=>Aa7{s;1jlZd3!N#v7ME=@}A=lX5E_}kI^lco3UYyZpKh19j zT>hr@J=y>)ZbO3v5Wwo}ktt)z$<&8u=Z9zXDnukCFCf`dhZ;$(8DudL%C0_9R^CLL ztZ!0~Y}gc7gCDVhzDGDL-DWF(AnQMGJ0&WUX$?KEJrf1A5kjA!B|zBJDt62N#Ffjw zf}-(E7&E}fE#UUe)Z~LKUk{;6HEsM(?1pG0|ubJp*Q}q-Ua+{BpVw;wb z(}1<|E5+q%om-aW)99e4Rqb>Of~ymJCavx54WOVEfd3KgwKy`mY)n)Smza@=oFBdb zIBY&#fC4ls(h&+2A5v%&&r+TFkq)Gh_FL}(Q(*+H(>zh-_8ZJREcsT5oe=sKt4RP4 zG!DK}RX*@SG*s!*MPeN}X>!Cs#qa=t^6#5e3p%0ly?5|4PMoCZ@xU_p;nOEH8qd?M zuLn75H_iDez$pIp;T9;MVvP9uI}2Uv#V@fDb<6fMo70U*TN3akeu;^cIl8sfU~T~% zfn+YpDJc4nJ@N4I5PzYQTrTt?qyG@p{P&Lk64VH^w`qO3GQs=>fepSf1h$7}=ctIZ zKFrtkUiJ0ju!)jCD&!9i4z8d$n901^zA#@>7tzbeRQgTU97P&r7 zBYMKa)7$@DT^x67JjL;KJt9i(_QpLB!$Bf-T1pLoJGslD~b1U`xBMm zp~1IE8Dp!$>5X}%LXgVme=3M^33IYcX)jdMpg@Y5a znA)FP$*@GIQB19|N98A@PJ!!R z6oPoAjQHsCKchivMtHfJ6T;~Y{zh5V#PCnGw5>-W!|qP^-ePrG8A)|@H5Be}h$ZRq z+;;nmT|_rYGz)lIcokBx*~i z&vF%+J#P&YcmYhNdPOB?G8jPei9ITq3S(Gs(}Z&g^KlB3T;{mVNP z1F})LYPf&k!c*lk$BFAk!IBx00Jw1IEy&|vUa&P-zD6m7*cNEVU?D?hxh3-__Q#9_sk=plx)Si3t0a5ebyAw_= zew?HYr`y9Xtgw4bQVvGI&JRfS1Hja2>(~wJA9*DudoGCNoB1{f9fUZLXnNbsX}~+# zO&IeH4g~k@&-!GwH#hl9Y>(h21wtG!j!06#i#5+D88mp)Ah;2C?5z6*Ek*1(bEac= zsID*=G(cwA4Ulw-R8aKIuv5ZupWtoO#_~OABg`kl#sD`2=K7l;_Gcj>1f(>pzFY08 zYsIkO4HF*PVO<;&QYiiUA!4Y#P^?}sVTVQqm z1`p)GA$&>Ht$*js{L3Qn|H4SnrO5b1%qY(rRO&3v>kjJ%xou`E4~ADH>+Yh(q+|D4 zd-a!NRzyQ4)3!oIpd~e8R{A@K1hVu0OB=xqdk{DeTfzDlch9xi70Dbz*djGOA^=U{ z;S4>a)W7g+`W8t1O^;bw_{&8=NkQ{Mbtm>6D<4kdGEHX5UHQK!woj#Y_DMd~XJ`Xb zm@JT2TC+yudn^CY$KeZszV&)sV(E{&j&&IE>w9~9b2f+w3E_>@%uJS~X+z(CLLqna zy~}TI7;!iwB5wm>fOJ;ADdEYF`d2qoBHgO~-KB!=#qHCKNZhd2LH_Wd}+Cx(EVY+34^S0pNK$6ct-`~ET)aP6E5g&?I1OoUh z2!dSewwshAj21T7AhC|=nocEwSbBGabLA;UKz_hlq3&Ft$W`HxC- zP~piLSAYCSUp{UL<$T87kDVp#L;>)#gLf+|Dd`<_z6H1iu&5_08iJH>^h+d`@2d49H6Acsez{}W z2x9*8aR zWgz15Y>=$PzZZzj-zz>=N+dDG(H9hAB0C8)};7YeCE#4E$=C#-FMy2ny z%Qd$TIE3BI4-tFxpRUSVTiQ4Cjn79gyxJIlION5>Hh!52()@y(#f8khHV0<4j+rzv z`3&XfP$q9pUhSM0m~^|A>XowR?!K3;n^d^^okZ7nO!zKh;AQc2?fFVAZpCBy$-);H zE8Oh-d~q{E5l1sqMLCi|Oc5q+3{roDc;c0v*igB&S=xvZ#gJ0D3w{N5e{$Q0=i9!~ zHubYxO_3O~!L$nv^adh71H(MRaZjF}O6)*4TEqq}F%@V+jeirpnM~>N#d|jr3Wb&q zurheZp>~|Qr*mDj@dXMOxkuMP*qWE!KE+flIKP2l4u%btX+vs#3MYQ`4&D+pY`KK2c zve&!g3kVyH5JFA$BEyXfF(L_VtYm+f;9JA`Rh%bWInnZVAx-!V)wCd4193Fv!%#?1 zCknPm8^Qs`9zCP>w9jCOW`EGAz&f>fM(@qlsDUj>xi9hi;p9NvPYeAsZxv2?3JG@A zwfj0O+QgPtT;B#I8R^UC@LrT?H+&COY7pjsBO~A|BY+gIIX&DSkTE&^sWvhpLxgGT-QQEl7JCn{{S+d(8IY>^MdKK@AkV7U>D z=Kw4!d}ODjcHiakC3%y_4;m6_nN?Il!W^3DK6X>*adjO{e!TS021MeZz#hNz3=$M= zsxLQv?NyQA7~1gTRTU=QTSY}6O-DmWG;Uh)L$Kr?j5>X14jx86f(`n4$gA|u zO}kXC)M>JO55SYCi_g0iu^aKnE^l4b_<^9Pkn=DmT_oT-f)r^PG>RW;V^q z*k=1p`+1`2Q}4&zNTVCSkk4n;E@Rh6!*5rMd$x~dwBqgwPEfBGYv5Yr(9Kb$Nsr=- zhk<_lGS|z_ShllV{>Ob>cUqM;s+2mg_d|CA%Qy>taoPQ`t>>C45&|*C0(C1nmA;H@ z$ebU!JLAAc@L!1E@ozsZ#MOpq`UjDcF{6!7>{a=HP5tiuMg4NI1ftY$(Tbq9O~SIR#zNrQ<1j3dFWjY*%^4H7U6+rxcE$3MIB2~pGj&gv=KCcv{s&! zupYs<6uESy8kMS+4J8s<_CUL%44F~^)<2Y(8K8K=EgO_em*X9oYYV8JWkOp<{TPYd zzbQMHst8KKVCJ@NmvaC9{l>2?50Osw`54{i-d^Pf!{t2}q`GNZ(y(lw!SE~iKd~%T z@ZZ?xeC_e?P8QXqe==oeD>Fn3_ATq)V__dt1q z6h*sqKu5S)TpD`IZTc#3PRI`5%K?ojF&%zDk%3JM$>Bg*2Hm+K`M1JlkbWH*MjvHX zzT6zB0Fly@g@pwez4bVxQj0ZnF%W3^RT58i@WlD_WuYMiIw2%85?%kEc(-jI#H*Ct zPQ4ZW4{GweN6!om)OX5D|7gU_-1ZawO5hDeFw-~48$pwFGsWXa)(@Yn65VZ>nzM-^T_OVvle9wQ+8o-M|!Obq?| zj*GYXi}v@n_Q$Md#~mjxbB(m==;(wz$yP%_AiF55bs&V3k<~+Eze)&4KkzKf(&LP^ z*fBKS1~p4B$N0w!GqxYx(bCXn#J#t%3`i{lX?A#wT_{N(xWI0)-*8(Ar0n(@iBw!5 zY%&7Ly#UC*2QHzkIm@bvv@92ZnBJ z!h^2gNT~{|+^9K$mU5Ml7lrsu25;Kjh7S+*GPW;wEySE?51ZT0*p{;=9qcaG^!j|5 zB)Je?I!HZ{xEhM5c!#I=+tfYt;0AE54i_0-<+rHZM^{!bi~q4~-)qbVUdvFH>jiss&HGs57ac3TY)`lS${1WMSr7Cx4w@j2)uCZ~4Q_%hQ2011(Ey_-N6PZZa;zb6e*iRJF0+y zKyH@l7sHNd6a*~HB72KDf8)yDLkje&*sj}AK_Bp2RSWf#-9pk+-a+@2h?{$HLqw5`h#f9Q@7NUwCuJWo;a zBw1XT-}qnJ4An$)OuvTs?|esMyjBF`+|EPHAy#kp$KpfQZqFqvx(TfYuLuONn&3*P zi(?sJVIq4ld~x@&W~3yLlzPDb4W(Wp*!TaVU4lLqLk`lnfuW&3G=+uBFs53pS0CsA z3wes{ch-FVn3WKUWADakXb+R`5E=gPI18zq04WI>px(4(o9aguQeuR#>MKEK@8}3^ z+&fgzw{ZzF13EhTOLtMwC1JDzIB_VY`Bm7}kn<#<{}SXjA?YYm<`g@6Z68_MZ;l(y z5T3WvXwF!tubY5*V%Noe^m!$+_Z!(=4JIC^y@99wr8F7;*jec=@DH7pFYI~AuAw89 z&d;Aedr8uxAP&zw+<>qZu$_}>mTG|^>13_UsOn-b-;;_z z0UOyFuQ8&__Pp@nytRP!{;CEtf52!3p$Da0|M7VxzFLmo1GNaUwNx0^+&?y8UU<45 zkoW(jIzTxcOO7VioMV1(=4YLGO|C)-jYTJ@2z%GBvx#XeqWV`h2RE;CMD=jCuzab( zI{qSG0%LjM8yv#L3`;g25@l6MOVlWN@5h$W6Wu$gE`!n8%A6uc?hyo=iJl#y7paQ} zwMj25IKap9{Q2{+l$20p2d1vu*7wQ^aD&lTU7Vk69vrlYUYx#$EGN#0Pshs({H7(+ zuN22?M7*big@q+xJ%xZd74OE%tiJJe!;}Oer%k=?l_w3uNF4k|o6}oRLOIx_E`MiETJw45BbyrDA z2@M0oPFTIDbkO4Z+)`f}5-b$HXeoDx88b+J7+U3hA=eO{9g&fdA^nfp1A)Q8lBT9? z>l4){kGHVUP?2*hWMyUbNYT+>qriNCy1`s6o8=$r8Ub=T=)jt%h!$fbd(i#$xu6Mn zZLG#!5Y7!^40l!5&KUSjby}89hWn{mJU=QZOwiA~KQ= z7qhO29XbPS7COl+G56u_$ktczrH94FV!|SDb9*BP8q|8Ye}BPfr&T753n`8|^v;V( z^OI+atc3J*bSU5u1YFlR+Y*XLL^RJeSrmH+Lq1-=e^1EA&p*=?L?GaKF7%_n|JlAE zI0fivX%V3NqR`XRm!Cmn4!GSV!2p5yivkiCM?p^S0mPLGD|3E+4ntBzy|N?;VP8y7 z>r;w)P{KHp0?k|}7!m`3rrEFs3*q76Vb|S;gp0;}wj4*}-yB~6d@6T6-~Txk!@%&QU{tUu7hpp5HK@U2=BGmF!}|otKio08JmQTRFLT~ zVLFb0%?uhk1_mAtP0wEWdpRZ;fb;wJZ*B7YVi@{>P`Qc?f4C@o0B3$@&_P?9l3K{A z;N#ZsJ!ouj!h>QAovQ@F$i{XB)(>YMj4>fJqTOfM7BC=6@YSlAlhffFWhRM{Lz_fe;Q%ttdvVi|QO*2C1cu(-IO@^S%? zXOICHG=Gdd-P(}A|F4y6|A#u?!(&90>!@K@iPN}LZmUgOG}UA!CbEQa9h0n+d#%zS ztjlO^h$W(&vgx8m$heFqm!X`&9yF0#iE>((ww=`O68n5R|HApri`R_L_x*j}KhN`I zD8-&Wjh!$X?1Yg}z(Nu3jD7p$y5b91_-=qsroz%5s1zJ+sh+vY^=oNq$#J~4)%+fM zDc}_e7!pNG>%#i}cmh7->B$3JWpZ-z`Lo33mswxi+3ne!{{lHkt+F@d%h;vG9iFAx z8+O}!cu<>~nvg{_b#*hdvebBi?fLA0hpR6w;Ij(T+-q=AH8k=BCFbqhWXz@6+3I3W z)xHK8k*D}*a8QR-AMby@X`Q3K^Ww*knwpx)p#2d1`H?etTMfQhH*T1K1O@+PvDu5}oRBo>SHt*rXSWAgIyWNLCuCbK>$qnT6H zwNRszKF&1}aBFIR4u`fBvSh(}3Fol8dz4n+do$l*nk-B;8JLd<9X|NU#oHs(9j`F} zCnC$sUl`5vQHhLtb9cAus-}Fhl;T?}2Jt~auqGtj71OO18y4ysXO6^E^(-h`; zL-gmb+?yN8nSYk(swf5p1?iiZC?SE; z>2v~_b?U-L=sppZsJJ*21&w$5Iz$Hz=ybggZ=RiE-Op{9fB#-@CA(yd*BJrpuR9O zc3&5E1dMTY$Emk3z9vKh(c2M5fZ4!Wb>E!t#Z=uu)DKOzov=;R3b}#-WPt36Hn;S0o zBefDsn%8}X{4ku-cGs@+xGlqOCg~{4HtxL&0tl^V?C+Dx5EaB6mh;n3soA@i1`WUH z35M&T>OO>?Slg^HYMhK&th%PALADDh8G?0NS9gLaX+uLp8f(^w{cihp3LZm1Jk?!Kp&nW_F=HTM8pQwG6I3eovzUlr$ zQWELE-|dWu5MRd9K`c&f%Y7*g3Mj3J?jJqg6*Cu3y*2&Pt82;@;nnO;HkfuvNccES z>L{;^CTWp=3~gK$8Wk1QLgjl@#B^%3I~G}pFz-P7ZEPw=+OlMC2HDNK;cxyCYRn2pwoJg9D^)9s8ZbN2yBRpBo?46{77 z%qINyLKS1vrcDk^W~zTB4|-pC8-VT(jOHCzHkdr>N@nfd9yun)y83)>E;%3|z?SD;+<72MrzoDpD9{T55trRI1_F7^<@2dw2+7v))X>TWdXhl*T3$%xWEVI54BKglRK zeF8%~%Ke|h=>P9ejKQZTzajqJ?^g9et%e!}M;8W+sMu6Y=Sz=C4<<@lZyLAO&9Yg7 z==_O);BY-G(*o+^1>2cCrO@f*yAS|q@m>M#)S!=6#oaD)USBv-s^<52Www7ha7GG@ z>qD*z_a%ON+xw2--^Xg{{$)BK`Q6@1&Ae776fSHgWsU|r(U#};V42WizkmPkAl8%m z;9iKjvb4PlwjuDBvY&<__%DxzDW@tlTajW59cfMI=`WR*KBKi+`V5#J!GpfHtv?1$lEd8Ytn+}&r*`Ed#OS;4>iV3c15S5ipl%cJ#iDK#rRdSb@wN_|f`oAl`7nLIDZw(?7~(xv>8lr&0`j3zvh ookHxlnuZ2hqUxHN((z?d@5mkQ+?V#afFY3%eC=$CNn5tJ_Jm>?k1NOz}zsDOxc2}nyfNT+m52%^#`s5B@IB1(wTDGf?U zoiTB(y}o_z@7w46=la*R*0o>)bH4FBW8CA8H$qE83GV{c1q1?tr=l#cjX#2X1bg9sm@cv^x3J+KA8hk*1cCvfA}@2xBWv}$uOrD`w$x^AjaSWOsm{33l;BD` zyNXI)K??NH5Gz?_jA?vguP&NY+fNHcBZAql?+>LPzRGr6&!}6y zsW>F`+C!eS78Z0<=?^Whqb;b%^s4AMSN6gZDvsF7b-pGad-hoed|7vwS`C&w^c}rN z#KQV^hjL?s>6AHykT|=3_DE!6vLlTRE&RhlxYDsoS1_ThC6-Y>1=X*`B~3(^@VOXu zikbZU{8D6sb%`E_A?}k~%*0PaS^Z?O858Dyd0m&2lQZ&Yn79}m9K4vBkr9i&X)GML zfAZ5e;D(C1D`#u2_`*PL?h7rp3DOApLRoAg^zxCr4uY9YW5dI4w9Ql5ap&C= zRiv+nP*%R=_T*7eP|)l)uX0yF4%T-*(!gd6(L^S&-7LAauA;8Ky0X0dCb}{?I)Eyi zJ8<8Y?*04snkvkXPst+WtFYVEuo>m0<&g=ukO_9-adAz)E5n=;>nsVp#|({_NGyi_ zfq{`O^Qzz^aco9&w?t*;WMslp-4~k%U#m|`m@~8@`H?r+lO4k4^GB7>tHPV<$s=#5 ztEzTKA(9a0h(d}o*ZrN)Q6UEtlWD#mJggyvGi^M*rlmS}(WGOiF_A6bF`b1Hm7jjH zs8>*dKaV#xHBFha$1^uaCyJ>Ti6@4$iANAe6k@h@wWUfQ_363uN9Y-}7=?!r%7%oS zq?zKf#s3;WAuu#+yVjd+w?X=EH|WxhEl^p;$DM zJ|4a9Hm|5GEG*)?mJaemq6H_Yad6U8CXd(M^=hn%5Y2XiW{dsV6f`urUI$h=o>*e; z>pxEqGbfK&xbD4e_sp_e9j_&DS?qs5R&BKv;A@URhZg9uU zG|xLfx*Ql%?ISCzfD__aR#QVNnvIVYY|`yX@3Yy0E#E#tf3kW0Xqv!(N(@&PGeUF_ z$4XycpGR02J3>B4iO$o!`{0#6Cp&v+?zHFe?_c*z)k<~bkm)DC;?!B>e0+{-QfIZD zo%u*FD2#Sny?cP2&L!H7ZDl7&&1Fy*a9J&7>f~^vqul>^MMZ4Lef=9w$*st|JVu}2 z%f)Fz4ikm*mo8nJT`@Wp?e6JGh>s6|pSeDKIK49<)zQPHr5Z)h9G5FDr{)s9oaUc<-It zf$dGH{T2ep`EIgPcj5@lIH?n1LA%j_H!h2^EQu{Ezw)cANpk&9L=3&x1YF(S4;ORo z5Ay7(Wk>TdWrdlNRkzmPZJ2gFzO1aG(h^J{8NN5^@85bbQhN71Vt*!z`{Vey*!?jv zx7Fso#yttPWYyDap(Z?5{WNeNFw|1H-U~GyT(7CEjk~k^{*qC<@80)IJe*uy__iZu z3U}^|6{>Juy?XJ=l`Bij%Q$H%NlBzUMsPJBCnlmHoZoztlHlbfYC2wXI4<~%XkPgx z%S?P=X7tASawEKUnAqytP4IA>kobZsLkPci2`RnbK4XsG@B4*CMKgit>C$)t?I!9e zT^4%L5J&Ue{^>P$?$388@59YT-Q3|}om;xPvp<)IK3ZS%fHhU&y=QL?D`&q$>cfzx z6m7+7ZR0Oa|846B58l(C?kg?*@`9y1jk=+`YvaYfaUJfBJG9DAwR zdm9~HiL7W0Pc{~drH)IaJbm`3!}d|z>xFJPlAD{rdv~>^=z3;+N=m3zt}nT!QGwsUR*N*6YE+L7msHA8DSo55}<&bq`m_ZES2R+&3n0dX7)_ znh4-bCMFEUkADs=EiEAsa1Up@ldpzHM6|@xifP@s6S2MRoF(Rt-|T4ATz2o>(F)}o z4#ek?5xMe_Su3eS%J!M5cNo9CBoLTC&C>cTv!whbjU`KUqHe#?K|`GU9%-66Sj^q? zcVGT=`DjT=N>*Q=ik#ap`qL-v!otEQ@7{?mZOe@bhByYIwvNw(-SY%=?Nd_>6rrfk z|InM7ogD*5fM|xxGVT0^<>k4TcWd#-#@aSS$D929rO`J%S4wM-`n0G8?KU+ht1K?w zVkbjPjaHh?a(T~nCOlD$s+@Lvw*_l$rs-s*Y4i6=d7M}r_Z4Mk;@)gAcm4UWst4H9 z=$8pwDUHzIIL(Hhs_wxpqUT3iL!F9OW`ju?b~Nh9E-o$Y zJDn{VT0R=O#AUE_>V5q>UgoK`vZ$C?rT?kl>SU9DtJq4Z&WqCxrbC_}qVCs>As0V~ zC}q^=Hr^|JypmfN64+`+HbeeCpY(({ z1`)5HY&o6_l;-Bw;sc_5aTml5c;=SUT30+fs z3sY59mB;_Y$KZ|g`%}B({(cSA(!H6oyybyFz~ApTogOw_S)?Cho^usNQ*XK-eia%; z6Kt%6oE-e9_dz2@{3K4!M1SsfX!$N72}y8U7(tt5^|=PWNrG3ZPq*V7BMTE=l}?`Q)}r-! z7+}K|X+8Htp4DV%a4?YHsvkkIu729#f20Hpq0WHIfAQcJmr*0GaovGMPYUOd{%PmC zSH1$d%H3UETc^jXW7V_$B&t%%Y~!JXTw3UiCiC9x4%*s}{gpSMQ4J0clYibu)ejo{ z^N6Y3ljYp_v^3#$pOumF4g$Z;;DGx|u{2xU?;frUJ1Kc3r>1Ip@4p=A6dUcJ#^l*P ztg5QwojhD0-lNP`FJhNUdLV~=i7ha`;`dylrsM1fJcN7L4-G5j2Y2sgHZ3c?_%bt} zYP2g9j3({lBi{I{)M5Jcxal+uRj)S|umZ};xM)P2F%dit6XHh;LQPu)7Rk!Yqi9<)Z{d)$VPghy`#hIaChxlSsDJbr_nyF zsyu(~kY8{-Vtz+;rw!x}9z2lQ^WR6kcT1Lti{qs4Ufz=@2><;y`j6kg$F#J_SYM+$ zUCM{cJQe4EWY%1TD#DeOJ+U%p*>3FijrxyKCLO8-@CN;fFs+hhN?a{`~pY(GT6G?MdV17Y}@(kDX9y z+1UK3`BTiO`X2PV780!tW1Ev|9hB#4o zRQZ`apgr@aPoI)E1~W2KTqNgcme~7-Q9g39U@)A!>4@){dqr_kQGQ`zd#-q$*T!2w z2zTyKYHMqM92<)W4GrbpdUlJQ<4zUk*4Eb2`nsa8ukXi=7=j`n`q$&3@m<#h1bYm4A?~oys?X+8TezT7sNY+oRTw{-b zw^`L9A%{QHVG9J*XYvSzH~;-N6Uv>fgasiIc@%VSSd2wyugQ%ShmD#oUg49?KcB5M z7)RWBZImR^r0W}|yZS=N&QG-XuhCl6aWZ2aC)eFWdT+VX_0c3r2TjFx$>;8x)Xlic z3^??UU%bH=uD>8X?6-8$)UB0|5~t};2!1CRIJNbNei<@y6MX#q zab7oD2zvpc_HDk&X+r!#&ujcQ@XU!dUg1le8wj}-s+%vb*}|`E?}g(W6ClH$Ckh@)W5LfY57r_a%|ouj(HKN;BqM~JbINE~RQnOAXeNZp9sR$xzs<1c&J>_OiG(dva%2SD?;|N6O4W zUu@=?i^iT*S65R7tn_#IF3#prbz=UmqKAW;dnsNnA0fHcru=4`*vdk&x_3TKhAx%( z=MmL+=k}t7Ru3MJ(unj;bjR%^pGS^#D$K;mhs?JqA9d<)ji$|^Ayi|??_8w|W-s7D zR$|YKv$M0yT3NB;(+CGFELhgOdNn=QmAL2 zhHtDUF~+gxuh5z%CB|wJB*VRsi{_gVQrUVXp)|CV;-Vc|vW0=4pMHnp5tYih7cI(U zBm+#h8A^-=Ru^_FhUG(C=_2Hj;qT4Llc}kxTX=ALE%^~s08NxMH3 z`uYL&gwM`(gL)650f{{t_@z}hvB=2CW*%I?+ub%|pkafh7Cn}KDXff?1 zYg;SQ2&3h^j^{Xv9GbS!en@sd0xcgVWtxzD40PCH6y z%JMk3jXWy8zo4jy1+}FC$T3Tv?3>lp)F2S*EF`fsA~U&~9OQD$#OFA!l1E__MZGtj zo1f2n`t%%>=U~~qW`Kbe4_9=qUAxw7S?#nhMJm~HIo|VJ6ywcrYp#h`lRB^HMRO1M zlPCQ0HYbV0jx2h(zu6$6G*h*#@?5njuc3fV;LcE*yB*1;RJb~{;vR%h_Q=S{*f=;s zy3A#7-XyWHwH+MdKQ?<-TYCu#WyN@ytyEW6mtK>f#6o{|R8K0m=DT`pmS>WLylt3A zqX(U2s{SOnI5{6*vu4KbC?^S!un`we8nj!cThF<@b6WbySijkN5mm>bGU}8Y#%%cQ zy{p@s@Gib*=m*}5n;Boa*3Fy285vZ)xl;6~ zaRD_;00M`_^T^<2X`y^fT1z0FG44E9$EXHxYFoeeqQf=fue+|h?k+kh;}ZjS?(m~! zW^!1y#iYM^^JYKHfB!sO&2#Ea&hr;EvV_sn)kA}V&~x&m{DM>&5RMHcj8jSj^A)pR zH|5%g2kLtHO=%^490n5VR;!nXkCxbZ}%kA!lOH{Q&OW;42Gt%NAu1|b zVLgaMjVUALMoMmOf;y%8WD}?INhAj7Thl9H8mpD4viSh_-Dk_Wc?A(4R($&EY1dAi zc01v|8`t=wI!t6VhpsSRdYR4>f%_(V>Aoo0?z_Q9u5@cKhTnZ{*YfzXnwGx)1;nOT zgZ2IUEtO^+AHPd{tMU4|bOW0FOQR+_gmLwl}vUl%NOU%s0e)#Z#4Dr%k5(8m}Fo3GCsRHe#*L3PgM3OJc zWSErzv1D5&XJ@ls6E-7y`0k1)X3J~^?6h}?b^I^$1#Jf5i#L>%I+Au!gR1RibLXHH z`Ad-@!+VS~6(uTjl}vfReEYkj+&&C#G}~cIQl{ZOcq5_Gp4@X~sl8Ic5p_*yPLk)s3ROxBS@986V_J5~?!DIChxlb01FMubuDa zz+$dx)YMfE3Ft4dR>TRx*bOn&;}g0ra_xoCAoqM;U}v@&}utS zy|>b%cSxEtm9pDVf_u-CkeCw=T7)gIf?;=*X;+d!){>3B%6c zc*@q^^xB!cy+p)FA6Gh}MxI7ZFR$M&2?munOXW0AZf>#-6*at6Dhs@R6Kkv)PuXCB zM_y^4;r3-FmIJ!Z&sR3R0vS_dHsU{AE)-rCMqkx?0hxB@a;LiWXo1hb9TI$>PsybxoH}X zuD!zM)ewyfN=-|{j#0#@)WayNFDK@3O3;JXfc8|o_!en;|@2P=mF&FmKjWo$6B+5vv7FJ@*4b@68&8SmpoV^ zFHJEyy7hm61BWhV##-X-x}^KutpAE5^kidPin5dvBqcZAEYblF0;M_Tpsc>02GD9& znS)^XQcTESC_&qT6lwe3%uGYWc%NMazS6QFRTSqkGD5!#NUZR=IX)9rZv1Q(&f<;2 zIL&w8@#8vz=X+A)4v(Q48Nbr+IMzTWFq|ka zTbatoEkk`e5q(E-$E=L4?NxvPo4^XRt+^dGscC8|X=vd0=Ss!F%K`I(559&ZU)4pj zuwWrRe);l0L}8WODgQfssc82Uh1JCgkcJA{t1(&Nn0qMwY|OK!-oR985e(!}38|^)U+KsA9_~&z2VyviW{n%H za=9|C->00qYza3jgyEQ?wG#zmJUaw|%1FH~I&JrX*g1=TT6|`9-<$#q4-XH{mkn-A znxTO~bV^D}01HQ`iPr7g=U~JUn()AY>(UC`VTHq_B+T6}@4XwAa&U0qe*WS`-pI-g zBcnKAer32)&DOuY$!g~^|H-33-j0hg77n0Qm+knvzRwM2jV90FK0dpO<@i|nJJTFu zSx$;fjj@_WP4Z@DOzW`r{P93sK!;Taz%@*rWoIBaF%ctK^-)n#QGj!_A`>*t_~eH| zIJK?@sV@IgUtw(h1TvVxP7a2MrR(|k+6YKo>wFG!yV^TN?lJz*OB ze$z-xxFPD8Ij=|}9_|}B*kCIoxx#2iGO3WSPr63?)=bicZW%}}FlEKz68*Uqhx_8* zyBwxwW|crldNdgNoE$8gE!>CZ-Q0{=7$B&RxF#V%OG!y-?GX3PlL>XhyC*g$vq<3s zgza<;Bu^WZLGOIK?ggFv(%IOSdAyY%H`OTXJBaq zYQa%67*xcR#*)?n_HoyU7z$mlr+1t7>jixQiEi_xX(a_a8h*P^_V!AtC&J}%d?wzh zwPRYB29?sWdHd6y>2QAS(_H6DW#Z>2;Yzg~7Q83$ud{aKQgua=uU97rR)6j+Q#A#f zXLQ?t0gp#>D-o}mehG{)3JSP?l{3gb{!XMu7vMOXb!9O@D{f#gOM|t{sHxwbB8YUW zc&pn^arAMwus80jPBSI#okq$73L7pwQ4R{yPBL1A-q&B7$oloTt?6_II&9ET*PbKM1YbZp+jT8EC%f+ zzxt)vX3Mu!(@X2brdh6Z3CbC4f$}v3=FG+VVRt>fr!9&a8Lh;TakMG`+c<6b!*3<8 zI&eAfy6>Ejw?<%Jfwra0tp53Y>s@rT(A=Z3)Z@*Xac2v13}XFBf)#60+5B_R)xTk; zOZ%+iyst2~&)DYuqMb=(Gs_DCmpKi5q$5!~+sg>H!=GBa%e?JuCYl^{JJ+;6ScF#T z4)plag~(ro&nUz}2JVMTxV7(oeAkDAgL+f#C6h=%8hUvsf+K_sNbmpfO@HWCtPi6E zXk$}v47eKQj31q;SbEbhv4~44lK`xU-NN`!Y{-A(Nw9zTG7OrA-)POz!j1F!e9=40 zlI?Kmkwi%RSRgPOm^J>`PH5eDC8<=FYC{u!FSh_#qG- zCb98^vPjK%9C-i};#}ttQ>z=H<6qnEasW3`>*_t7%vRj+@~TGI`oRE0mloce_k^KK zmgJ0U?y{YqF%zYsFIu}MhhL{YW%qA34?wL?dNR0SIYCyk>}^+X$G<&hT<|JwZ&zpTwi)WAs;W(Oug(Wo2G67=iQRAU5< z-+uoV%5{w6L6Z{R&YPjNcc{+z`M5vqX0b+IW#!=M1|GE_gQO%~7(VT`ri(C*PlzDX zW{R}WgGsyluE{{{w0;t_@A}s6naxtQxuCm|u>F`uk^H1z!W^NI)Kg7pUrnROmpNQCkCw-28^e;%azG-zZ+ z0mdTe>v3fnZ6*VMdjZP03}+Uo9dMWhIduswqAfK!7V3MqhKa^q1nuUFfr9v{)E<_= z9uJpPXyugVwVoo}CxR5D;-jpf_wiRl4?D8(#q=|%rYi1uMs+E{K_O+wa!e~JK&
5o1SoBl7Cq$R+nr1v2lJ^+ROMQm+Z-Gv?04cV&;pc-(!E#$ z%jHVCGCtIQEwP#jkKgmIScuuL#6Y}}jet+AZ|6hZNb`_-38fd$pQ9$d3BSV!AR?T5 z_3G8L(ozL`d#I3|^OZA_nM_r$2=#ak(n|!LA<+qcGHxulHPZhSi%F zBKfp+^9CCy!^G+8Xm)vZ`?$ig_g+~1{jm$K_(m03q7N?s?LRF-H9hr|Af%`0d|4(h zMQZxc_P$;i0M8Upxyy6MbT3zcITBfqec~drS~u~zS&gFr=V6nkBHQ@TymL&60voCO zd1l~+nx`F~Jb7Z=Tcuyh^E+|B`7X(DK#9oQ;5CdQ%h>!kYGW^yjPMuV$KFvAe)t!o zpnXudg9lSRG;iCpcRk-@Qa!VMFyKM&CQ5g9uom8KuCB&|`3j@;p8U{=VpmsJ0~+y* zha%p-6@7W98q0fcUE$t6S_7_2fGz`DTV?A(xUF_(<90xi2(;S-5o3-S1=j1t-m9o0 z_wJHB5Dv$WZqkLFgT@_iP+{3hpZIqd=MI3o?TT~7X&>9ON%PUhn&juk$_&Qyo z@Z$yjhavP9RZhK|8t>lF-updUFWD_0e&}07_`@#_3xr~=l3Uicwrx{WQ*}F?^Umg$ zmaX&7(+ho>o7kJCLAEh5F;@|K8$MWwQAC{w?V~R++K+zzcAsDan53{@O7ed(4xV~^ zQH=QxSAGg})ZIDd3V7Ehey}clF67;$)rGwEJ!_CbB<2%6v(I`vU0!%d%$6@y41fm+ zwRd!enEoV5V_ISB+_9lTYzV$gqSu9d(j4=J;t3tGg$usM-;NB9&zk_m*=eQMmZj&m<) z6(c=-{3}x$J;9sz0ZB!vA5mTYP~QBk%NN%YVyP$}W)t!W$gmLRC47xmzVC(eH%HN~ zd&W_a58}JXVntwEz^1S^N&pkby$6%gp{pcb4l z4gXnn5T^ccHL7G{8+D)o0awaeZrr*>%H!J-bPn}R<^7?efMt+E2P6+UUfX}~w(;dl$4yU9 zhn4!$ES4opBF0_Ngw&>x+#x`_058p6s5Vc{ADu4jQE?}B-mFXERoyaUP%Oa?LPteS zeLQsW!UY8G2!&z>DDl7>#!w3(sjO=9sXDKf@LfoFHB-sU%8FnU&^Isjzy#WV`+AqF*w0RZZ zGjFm_kDY03%U~LchQRd{7gut=^lt`iu4h*z80`nPw6azQw?rCuciraZ=78Jx5T^qM zvGD2B>FNPVx!bqN$hi!{n@*265COft>OXgPXJA_*0$`BMd;a_ad-4Ut@=KsRjyCyA zy?y(ZAwjvqc7%&VzXlt8DfnTi(Q-!Ij}eH^8|}~HZ&pw^KO#mvl1R zA^M+j8tdE3Qy0wqjI8+DMP*W}rKNouBbf6qT)fB&s;R*{H#{(b5k|d-8B$3`2F+D8 zTPhHBsK0-$AOa58-<@%zFm0e_*10)zR7;E#-^ModJFq}~4dY^+<1{*oBdDtrhB-H- zx~?E_Dg&CIa2i6oObc0T%o|7a{pn}(>t+*`*Rg#Fw|8kGW^id~b7%P}a1jCDz8N3_ zG>YZi-G%HY>LXH8$o;F6HHw3^OMdS8-@1J}ue21;q3Kw#%-~HBXcC`?hmk@;mtcGb ztJ^u4awoi2IKgoOug|m*NX=by%OkmkPQ;IE&VWI%WZ0Toeko`Al6%`x=gOt>yk;|5oXtuJ31{OlE^hoI5wu%;xdFO0kj|siY z?HSZq{nGU(6;l;%Dhf5^3(F~WEY89DMX6Jd9}|z-2^uu|P$H(bJU)V+jB+ZK>aSb`hy<>!-CnCLOY^hh5kB4G9wXuh$^u9n9$xp7d(0v9%B}I{cGPE;E_w;x>PJLiAuh?oZ6F+o{j^m zNv4nk)-`{$0L20sQ&S`?dYsI@4>yyhzl@I7p$Gixw?YKq1w;`mhx^De9<0YRn~S^p z5Ob*~Nn?(OkZ~@xGs`N%6wKOk#%&YR{^!2&fA*8=uq)l>d}WcykoY_A=bg7`(XakB zH(CkATlYPIhBNvXDgJ-<#(&zI@H>)hHPEW(oUR}cR{lcYhUs#ckaJvcX%xo!y>M6p zm2Y=_Tw*86ETY~!L`y`ol%u6J2)X3y;~e#Rv6mqn6I5NCm@?;2o-p8rUmt3*6OL(I z;3tZVCWQAO?^;U-e)*}k$g;S7E%o>B-#xawSWRB(J54pC4XWO3XuD>OH*IP_U8b-X@V#K$kxCR}do7ax z8tR&quX%!D=3AXp+v&!a7rJe;TT`u%E+%pn>%7R*d11nr4s}8Ay*TwINE-!rxx)F1 zf^R%y6&E?)Q6_8KVf#!JZFdWo)T$G8!Zmi9m3q-A@=EG>S#xW(dSFKCWLC;?qharN zlRwaETOeAW=eT+M_9LUy-y^{CUhwvjZM%yealMC3o^l8VSEo;jLx1KiMsVxKofY_R zktu5>Uu@uTDuD;35q3mCWx88yub{4u8!(N@L>z&hLKO9WRwEbBLxn;6b`?WUM&udq z`s(HYDGRBUHR|B5Js1Gv9#{~;iC56rNC$4UU<0m>Z*N@M-cDG*S3@@$N+6G@VkuDW zjqc>jJFAndwfXnG&v?(;!_x<^^utE3riMLi7-auJZ^1X`woQx9NRmIBc-QB_z}Tob z8LlC5cy&`|b=9|Bzy9uw=-~IlUV=R#k$;`Vhc%U;HZ}BVXKOR&FcsL>Ch4iRe;r*7 zG<=k;D(r2XEbp)8N9mEZEHBY+Rx@;`#c~~QJ$e2Sq}{haJD3Ou_u2YC4sLaoT7S!# zU54@lj-m?B9ZQtbi?UBWzx`q#KT4?nGGX;}4g5KNTw731(apr1LU;$S42>({w zvj;bbs5@{oYcj_NpGt96D1~Tc*_|EB_ng^(#7Cfj5Aa!60bc1MDkcta5fx~TTN%;; z%Tfk-6zfU+AQGw*U5|5MW2UDa9FlRWLM`rmU+;dMpz93HKg-lZ+%C&nO8(i>zoBAz z_-BbBehQ43G@DcSx$a=bU8Ud=Xah<1kPVmb@Z(k&=hqzmFa{fjg2Ag?5%F+D@Iou= z5>=O8|bW7Ya?7zQ(Bz!hF0CxCK#|1Z9wKTKKV6T|yrC>D<`RH+OntskZCEi>+pdPZ_+ z)wF|aeVREO(-eMs*@fgAZ#qf;(0Nc%LB_KV-pr7Op8}nPtDD8O zbkOJN&A1}OkhkWm{NMwRl81Z4AR#Mbh&-`_F9UF9-*<9xek*x0>wep;()jf=HM`6@ zA~Ajtc(P}F7f>#sTgkod!sb{rPqAjeD|B;HUD?9pvg%J#@!+|lREAm#;Xg+g9(OAl zH>QlZ^8Tz*4Q?7P5A~0!*Sqqu6weBGp{I9-~0krPTV3ezr;S5s3HZi})Z(q!-*BWSxy>2Fm9lpl&KyrOG3 z^HQC`YbNXdAA8U41+l>koc;gS0z@2I?z?8o#>GXqC-&k?WbVn&;#t31fWpj|FHeJ^ zg}}<=24_A_JCK#S6u&Y45NRURzeqWq`bnc@V?NK|Y1!1E4XrH*x-M%r&sJ=b-eJi5 zkp4ftLCKr-zlQIc72)CIYY3l~+$?^gUD8Ua{W;1Sz0%zNg6){WF^`g37JuM>tjpr^ z?x|X{KmVA5popiD`69t9i*3^w9gVBUK@KK{P?7wlOO=>>?QEWRPqJn-G?=TaU zB3!K2%Yz8`FXc{izhLzr2Ce?y^hFVk7<&;`i!>^!DF&+DeM!k&?{yKte*i~8fP^}N zn)sEKm753rPh1R5Be966KiF#0G~sDmuY{)v2R{wJkyl|yM$UOR3dFa3_>z>j^;yav znr!T!vaQ+a^r2|}LO$;65NDsr_on7nR;a$xnZWdMbh#D6WAt1uJ%0GSbX`?80TQ0xg|mm-NazwnVwQj zJ0*&!LSrpC!^olGrT%u;;eKg3j=)-5v}k^X-*#Q6Ss9~}%L?^P3D{3Nih%uPgEN4UHN zskqTU^1z?oS!{5~HF5+DD>TJt@=%Cscn52G26g~$z{{GNYpY6)U`9l7Ls}?q zNT4{5FCtXfDsoyW1Oy+0;WNRfu9?mPSuY&y89pQ58~XOn4jW0Up_$q21;nseE*e4* zQ5GKCstx6=nnKvWKM4#cKb1uEXR@w{<6pENZn`+NPN*j-+FJ~_^DtwDFf&7JEw8Ts z#9oz-nVE?GQS!&%lJYcy)8XQ7;OH2*<0&~vyr@3AByeFy$&+0+YRKa^Z5mz+D@Ju5 zJ~&T8c#(Y6^5TKY4-}d2y;yizUugTqWVsraE6&z3*jw(djVHQA5~O7e>KqDw5yxgl zem&3k_#YnU4da>1M0C~R0JabgB{&y$g=|F*-&wsUaaZy9FVRMQ{EW__`a|c$jgtBP zsnZOdm@{T)g?cC{?ndgFKNI+4T2z6?PQ~QCV2kXQlmNL4msfR^B&tKaG{q@BZ}rQL z^J%;CATg>u2Qd(b$BmjP*$v!jY)jMr^S<%~Hz6PPS90io=_ii=7cD3M#*Bh|ru$V9 zkR;`H9VsH9x``V4=>Sm-xBg5td5r`Pr6P`b#@|BAP|V?RKo_DqFLsYU**bz>|Kl#R zIR}tg@&5sFqk0`Br?q!KuIf|bJ9q8?c^n8%I`BG9GAc;4un;PkveYB88WbDl&=BTa z{=JiSM7U7GOmDiFh&M<@--sdObkYdfJzOR2KjunM-ux&>ke8p2oO(sV$;m0~vB{v$ za`U6b`;HDKP;j%evr%){Vx=Or%wCL~k<`~|CKPJ3~#UnK0*B(Nj&4)EaqVb$8Y zep~U$e3t%qX3lWK1RK{Lkt=PV_tDM|syE_ubz{3{F%9|=Nd2RxT={f(kC|A8gU-A3 z+vq5Es0rAz(GZZC0Pi4*XkaGB0Sh7|wH(2en5NEhbhIc1JsK0S3U-Z%>^TlwYX1PC4;o&dPu(-2le z1b~A-udomkeCy39qa7p_zzz!>bw1#GxZO(|8z|=q$|rhsyy36p?(VK!sSwrQ-*1B` z6QkeDj#DBOAbiSVOSKbQx*ZA*4RAp_kA`|Es$~_x14Akf1Z=559px7dpAD=u4h0p~mLI5J$hboJn&D5qNlmLVXK$&Uawt)>D+siUKuf2BrXy&6e}1RKe@lg0RBOK#7EQ zz4YTp(9m*W?9VHkIntvBcjRZ-Nh$o)&*`3xIaHkbGc*yq-uu94I*P2C*)XD{o&KN7 z8+*XXp}e|abE$J%%kcjVG>79%JC6A8r2;lKHfbfL^DrNWHa1GuA8q$I3ezA0l<0j) zsro)23sfgFgl?UUNMP3xlnAM&WP*>0fsX-CM?jCs-s$+6+Z2PlGMc>Wn2R_9mA!hZ zmKu9tZ$5O(z<>sFP0@-4;E|QKv$JdFGb|S>^suCwuw_7ed@6;%7AZlfHlNrpH0PGD z<}WUL1CN?VfJu;3XpXP-?-TlC?nq|{+fsCHqQ=ESxtxKhG^W4;n`ua&rJRlqIVg_C zwc~@Mqv0@IqSh#Q%VE|hk2-hx@?|y-n#M~Cz^0j2K56o=Q@o?4g?RT}az*UZIo{|I zv8C20E-0@z(())v5RRjG`Bpo<({xn^QEmfUAs?6yj5{r6+48plKcDT_@{y}`FBX(H z+#3uDz<>+VD$2Q|mckJTMCYJ&`@4@L_+j&B-0JCT<=o_vDZ&Nk9%#ybU>#+7X-&vkE*SIY6~1wGh?fb(6V{bV+}N5W z;&f8H_%$a4m!v%=1X!wkg0s}_|I&N^o9p4PZ>-$&d;b5^UkW_jNs)1JN_KV}us6l& zG_`tA6&98J0;0c-I1zTVwl=Ysx3@{{cv}@d7eqkKEi4$pOUIIk10~NV>{nNQL zss*s`u&sQ;LfYHq;Wu4fU84_uL4Sb(-3cPW*h+#a+&U<$GUyi-dik@D^6mOvkOo02 z374n5ZEWrt-q*WPwL- z_7(oGzDp7}7?Yfq77m$SOwfm6(;%iCg|&2b!!j~5p7cb(NqTvSqWat6?gI_e!>=Qa zp))h4G*W&v9dY#ZJIAOnD3GaB{wIt6!gq|=d@5r*8V$(pOLZ1~^5EKwx6d~ej zVJ2kMhp;qsC}3OJIx(w!58ZC*=%BiQ)j-apo_Se6Kgr>;dr_=89_T>B1sVIPLon`S z-smJ%*YPU?L4<{RF2FgMe)fU1ay;0!fHlo=_cgBV@XJ6Ti6GAy#BK`;6e<*k@(_S- z;6%0f;|t1$$NDk?yX&q)!#PBFOpJn|AssmN@xa72d3v(v`cM-Y^jn%GJ~J~4LR3%k z^3ZT_aKQ0rb}vQ0G!$Yk23(6gvQMCDz|9kOoI+$|WlTb<=r(4gVtZyEW58Z^IAS0w_sfFxm z_&07H=EOaaAa3L7?Cg|QSMM#{0X7cuCi}J(Ax7XU7e77Pfk1J~)$;n8Tpb|yP!UZC zMz@0pzwPY_6y?@w$EnTfHb|Pk2S=*o$9*ck%0sLzfW zzr{xjW?R#(QQH7u=Xr23s>fDyLGBX;DM#k1HY!OCfCvDVlCJJ0zwN}_DF6hp$V5a$ zV7i3mEbKgo4g9}smwBKgXnJ}@1!q8!6C7MN(t!Sg}gfo;COn9z;b}Z7)k(v zcm;u`#IK~LWBo5g*j4 z9YjY8wXcwK=plkz5WsjqRE}6Qo9ju_<+Oc4hlyyoE3;rM^q7qi+MEufhZYi4eJTg> z744fhw;(`?WM%D;`fkoQ4f8rgq1h2rjfd-PDV%pvp@sV0ueKh*=f*=S5Vf_N9g%Q0 zaz;k<;7Q$@@ZK;1uc8s`=J>2E8s{uTd{WXiliXflmLU&yq`M7I5om?(`jCgxwud+mRSaw$d8nKLC40x_ zL^#|Jorsb5~lr?r1!&B9Sdmv`U662h~){yhq!DziXt z;O*y_P{4L-vA#AFBQ&w8+2pyyasmtrEoz{lcBl^ojyEnrcv2FaIO6OF#qP`}So`M3m#!87oCF|GVhBI?A9 zO+E>biq&nT?%ft-Yc7A|2q-#=-}ag`H}-+mTTb# zHUbrlt{Zn1w!qyGxSTt389!LE!FB}9t4Kz7Z8_5nCr51xN; z0s(--rXC0;sy=N^=eI&n;iZZJ>2K3v0JXc|x8Ol19dKQF!Ap*c*rN4CPV+cZYrfi0 zQ&lbcHaxxCa-Lo~PwPol6){Ml-~~XzbJ;xXwDP7VsVVe!n^)+F#p6hGFSsD!jtGL? zgKB=zShqFZ-+hNF9ts$*#W<~s2C@%R>w$C{(C|TKd{$D@a&)i*;}5?0{!}oCs|o;q zQNl1i1h>$7M6&x;G7%8QW4(?^7iab9AusN1dEWl(%njAA9bj54E#;ik3%Y&t=Ilm1 zo#&&K6?3``*=CzpzcZ&%%B1&3!zIAH);2b>US3|E0&k3&nVI3y5c##WBS!DCtS1jm z=Uwim{_Cuev7JW4`K@ov+!?4_Floy}57Wq%q;*u7Ucp`P9$ns^?}0!eB$=UGQ*35~ zNf1UDh>-zlEy2izO%E#n5+uA6<7@~8hg~>Wik*dQ4F;sAcj77v|M*HlvrZkyhW z(|3AfU{)rtsB7ESB6MvR9s@C!HULHwEtm&NZi!m>fXrB-$6;1>RHw=Y55qaFb?274 zUgJ&E+*Ct)fs?c(Q1;d1CrBN&yM%L?bM5ud2%Q3*3Qn8fiC=YRUgQ?OsLRT0H5(d2 z!SMlmMwR>mF%r4uF-!hHl}(HN()hAPe^CEu%H2tAYmo!L$E=)dACJ;37sLj{2XO0r z4)|bK*VbRU*U{UH>my0upDk8v@dn^W_rPrNT1KCx^{cN*_oDZw+s>mN*0I$=e|N(6 z{(Tu9iuTb_3Mh)hBO~)SWgf#LQSx8BxM*2Tna@^KSR`-bx3^B)YgsM6V{2)NwX(7T zKFr8F!^S*M>g&ZV7e39+F~jtXN`J$)!Dz~qfji+UN(=Sl>d4!1_uS668al{vPZJYH zxEEO(R=wY`@qavt($>5p5Zn^~_D%ddLQFImd3n;+v9W?bF1x~rNd?o`=E6YY((yqID11jtOKa`m(9zzG39tkrf|20w*!PhHoH_&0MTimx1Or?-Z2J$OBcO;4s8FWRTFuPN2o;DR^8}|3&ryME0L2GYFKJ2YUw5^*PxnL$9U~#=WcUm?#d7NEbV2Ci` zp_tk^Fy>2l1RM@mMcnU5k4|jULmZMYP;$We2Smq6<4Sbd!v_!WpyoiZ6&!(b@IVe0 z7M8P3R^3rQ?#>;vwf4F!QGzMH(`|j{KnoZ$7(d}aP-q>(mZ{}c{>Q%sFlCy71(@19 zH2aVZ&HmAkA2#ah>V_-4?dAx*GDuCfQrV*47p%rw+*Z&RZNF z9^TN>LV;Hx@8n1odi(nFpb1Lm668wxe^_1RfS@$2we`uS+{aY4)o>* zToJt!VZR8^4uJzo;+_Bx76mQsdw}0sH*PphRX1DvS0UyQoe;ta^Ai$mFywYOaTooR zV9D=$dLpql%QUW1C<&<)z?Yyz!-Hw);HftXfb0w#yppTVo|u%Gc`>!;)of@kd{Hon zEkg*vcCIoU02<_G#630<5W$572I;8H!{aM2xb+PUb9_F(88?Qfx+nmRC{7nAE=b&G z&SwJIBg^h>lSsqdFsH%qeycyftL^HK942(S*x~Llnv%Ce#zc!}+K&Lc+rzw<6%>LLTYxaJDPBgh-_7h5rjLe~qg9 z9))_h-&f~&5-{XR-#_~KSyo;?ot*~X8>y+#{!5 z71gk~xHzd$D4yr#)wG+(=U!42CMLR(m-oC#NnuJKL^MC=7@DClL|RK?sM#3xPo3y&wqhy(pX3~HbW#Q(sHAI&c+yjS--w9l=!(C`ReWHCqn3-YR{+Ehvd8y07$8JM iN1M3KqqxoMTl^0buafKN#dNL!0000