From 3265579725d155e042d3c02e5fe5ba780b130cf2 Mon Sep 17 00:00:00 2001 From: Dustin Nguyen Date: Thu, 8 Oct 2026 17:12:28 -0400 Subject: [PATCH 1/2] Store Expo ticket IDs and check receipts; label monitoring by study ID, drop email JITAILog keeps the Expo ticket ID from send_jitai_prompt. check_expo_receipts polls Expo 15 min to 23 h after each send and records the receipt, moving delivery_status to handed_to_provider or failed. participant_label now returns the study ID first, and /dashboard/participants/ no longer returns email. --- CLAUDE.md | 19 +- backend/app/admin.py | 3 +- .../migrations/0053_jitailog_expo_receipt.py | 38 ++++ backend/app/models.py | 5 + backend/app/notification_service.py | 21 +- backend/app/serializers.py | 6 +- backend/app/tasks.py | 70 +++++++ backend/app/tests.py | 192 ++++++++++++++++++ backend/app/views.py | 21 +- backend/project/settings.py | 4 + dashboard/serializers.py | 12 +- 11 files changed, 361 insertions(+), 30 deletions(-) create mode 100644 backend/app/migrations/0053_jitailog_expo_receipt.py diff --git a/CLAUDE.md b/CLAUDE.md index 6d27f87..ec61074 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -140,9 +140,9 @@ Three cooperating processes (`Procfile`) plus the mobile client: - **web** — `gunicorn project.wsgi` — the DRF API and Django Admin (the primary researcher surface; see Researcher Dashboard below for the read-only monitoring API alongside it). - **worker** — `celery -A project.celery worker` — executes the JITAI / notification tasks. -- **beat** — `celery -A project.celery beat` — fires four periodic tasks (`CELERY_BEAT_SCHEDULE` - in `settings.py`). Three run every **180 s** and live in `app/tasks.py`: - `ingest_wearable_data`, `evaluate_jitai_triggers`, `send_checkin_reminders`. The fourth, +- **beat** — `celery -A project.celery beat` — fires five periodic tasks (`CELERY_BEAT_SCHEDULE` + in `settings.py`). Four run every **180 s** and live in `app/tasks.py`: + `ingest_wearable_data`, `evaluate_jitai_triggers`, `send_checkin_reminders`, `check_expo_receipts`. The fourth, `dashboard.tasks.recompute_monitoring_metrics`, runs every **600 s** — an aggregate refresh paced to the Labfront batch cadence, so a shorter interval would only reread the same rows. @@ -165,6 +165,13 @@ as one is just the slot length; it also sends the **outcome check-in reminder** **silent JITAI prompt** (`evaluate_jitai_triggers`, sent only after a newly completed EMA passes eligibility + randomization). +`send_jitai_prompt` stores Expo's ticket ID on `JITAILog.expo_ticket_id`. `check_expo_receipts` asks Expo for +the receipt 15 min to 23 h after the send (Expo keeps receipts about 24 h) and records `expo_receipt_status` / +`expo_receipt_error`. An `ok` receipt moves `delivery_status` from `accepted_by_expo` to `handed_to_provider` +(Apple/Google accepted it, not proof the participant saw it); an error receipt sets `failed` with +`delivery_error='expo receipt: '`, and `DeviceNotRegistered` clears `User.push_token`. A row already +`received_on_device` is never downgraded. Check-in reminders do not store a ticket. + **Every available decision point opens a time-locked outcome window, sent or not** (`_latest_outcome_window` in `app/views.py`, protocol §9.2). - For the first `OUTCOME_CHECK_IN_DELAY_MINUTES` (60, provisional) `/ema/next/` serves nothing but the C0 @@ -331,7 +338,7 @@ but that file doesn't exist in the repo — don't chase it.) | GET | `/telemetry/stress/{user_id}/` | Fetch recent stress samples (dashboard use) | | POST | `/telemetry/phone/` | Ingest compose surface event from mobile app | | POST | `/telemetry/engagement/` | Ingest EMA/notification engagement event from mobile app | -| GET | `/dashboard/participants/` | Per-participant sync/push/receipt status + staleness | +| GET | `/dashboard/participants/` | Per-participant sync/push/receipt status + staleness (labelled by study ID, no email) | | GET | `/dashboard/latency-events/` | Recent push→receipt latency events | | GET | `/api/monitor/cohort` | Latest cohort snapshot: benchmarks, Wilson bounds, 14-day series | | GET | `/api/monitor/grid` | `MetricsDaily` pivoted to participant × study_day for one metric | @@ -480,6 +487,10 @@ so a stray space or lowercase code in an export still resolves. It is deliberate from `user_id` rather than reused as a foreign key target, for the same reason `DistressFlag` stores only signal codes — it's a crosswalk, not a join key into anything sensitive. Set on `ParticipantEnrollmentForm` (optional, validated unique case-insensitively) or in Django Admin. +`dashboard/serializers.py`'s `participant_label` is the one place that names a participant in the monitoring +endpoints and `/dashboard/participants/`: study ID, else Labfront ID, else `user_id`. No monitoring payload +carries email. The admin "Enroll for notifications" shortcut writes a `TEST-` Labfront ID, so never use it on +a real participant (user 102 / RS02 was enrolled that way and needs the real ID set). A suppressed decision point is logged with `send_prompt=False`, `randomization_draw` and `randomization_probability` both null, `status` and `delivery_status` both `'suppressed'` (never diff --git a/backend/app/admin.py b/backend/app/admin.py index b7303ef..452b4dd 100644 --- a/backend/app/admin.py +++ b/backend/app/admin.py @@ -438,7 +438,7 @@ class JITAILogAdmin(ReadableAdminMixin, admin.ModelAdmin): date_hierarchy = "triggered_at" ordering = ("-triggered_at",) autocomplete_fields = ("user",) - readonly_fields = ("triggered_at", "decision_made_at", "push_sent_at", "device_received_at", "receipt_reported_at", "receipt_event_id", "suppression_reason") + readonly_fields = ("triggered_at", "decision_made_at", "push_sent_at", "device_received_at", "receipt_reported_at", "receipt_event_id", "suppression_reason", "expo_ticket_id", "expo_receipt_status", "expo_receipt_error", "expo_receipt_checked_at") fieldsets = ( ("Prompt", { "fields": ("user", "prompt_id", "triggered_at", "status"), @@ -451,6 +451,7 @@ class JITAILogAdmin(ReadableAdminMixin, admin.ModelAdmin): "delivery_status", "decision_made_at", "push_sent_at", "device_received_at", "receipt_reported_at", "receipt_event_id", "receipt_platform", "receipt_app_state", "delivery_error", + "expo_ticket_id", "expo_receipt_status", "expo_receipt_error", "expo_receipt_checked_at", ), }), ) diff --git a/backend/app/migrations/0053_jitailog_expo_receipt.py b/backend/app/migrations/0053_jitailog_expo_receipt.py new file mode 100644 index 0000000..198af15 --- /dev/null +++ b/backend/app/migrations/0053_jitailog_expo_receipt.py @@ -0,0 +1,38 @@ +# Generated by Django 6.0.6 on 2026-10-08 21:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0052_merge_20261005_0027'), + ] + + operations = [ + migrations.AddField( + model_name='jitailog', + name='expo_receipt_checked_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='jitailog', + name='expo_receipt_error', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AddField( + model_name='jitailog', + name='expo_receipt_status', + field=models.CharField(blank=True, default='', max_length=16), + ), + migrations.AddField( + model_name='jitailog', + name='expo_ticket_id', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AlterField( + model_name='jitailog', + name='delivery_status', + field=models.CharField(choices=[('pending', 'Pending'), ('not_sent', 'Not Sent'), ('suppressed', 'Suppressed'), ('accepted_by_expo', 'Accepted by Expo'), ('handed_to_provider', 'Handed to Apple/Google'), ('received_on_device', 'Received on Device'), ('failed', 'Failed')], db_index=True, default='pending', max_length=32), + ), + ] diff --git a/backend/app/models.py b/backend/app/models.py index 9bbf08a..9c4c39b 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -337,6 +337,7 @@ class JITAILog(models.Model): ('not_sent', 'Not Sent'), ('suppressed', 'Suppressed'), ('accepted_by_expo', 'Accepted by Expo'), + ('handed_to_provider', 'Handed to Apple/Google'), ('received_on_device', 'Received on Device'), ('failed', 'Failed'), ] @@ -394,6 +395,10 @@ class JITAILog(models.Model): db_index=True, ) delivery_error = models.TextField(blank=True, default='') + expo_ticket_id = models.CharField(max_length=64, blank=True, default='') + expo_receipt_status = models.CharField(max_length=16, blank=True, default='') + expo_receipt_error = models.CharField(max_length=64, blank=True, default='') + expo_receipt_checked_at = models.DateTimeField(null=True, blank=True) receipt_platform = models.CharField(max_length=16, blank=True, default='') receipt_app_state = models.CharField(max_length=32, blank=True, default='') trigger_signal = models.CharField(max_length=32, null=True, blank=True) diff --git a/backend/app/notification_service.py b/backend/app/notification_service.py index 2b8cdcf..0d29f51 100644 --- a/backend/app/notification_service.py +++ b/backend/app/notification_service.py @@ -2,6 +2,7 @@ import logging import random from pathlib import Path +from types import SimpleNamespace from django.utils import timezone @@ -202,16 +203,29 @@ def mark_delivery_failed(jitai_log, error: str) -> None: jitai_log.save(update_fields=['status', 'delivery_status', 'delivery_error']) -def mark_delivery_accepted(jitai_log) -> None: +def mark_delivery_accepted(jitai_log, ticket_id: str = '') -> None: jitai_log.status = 'delivered' jitai_log.delivery_status = 'accepted_by_expo' jitai_log.push_sent_at = timezone.now() jitai_log.delivery_error = '' + jitai_log.expo_ticket_id = ticket_id jitai_log.save( - update_fields=['status', 'delivery_status', 'push_sent_at', 'delivery_error'] + update_fields=[ + 'status', 'delivery_status', 'push_sent_at', 'delivery_error', 'expo_ticket_id', + ] ) +def fetch_expo_receipts(ticket_ids: list[str]) -> list: + tickets = [SimpleNamespace(id=ticket_id) for ticket_id in ticket_ids] + return PushClient().check_receipts_multiple(tickets) + + +def receipt_error_code(receipt) -> str: + details = receipt.details if isinstance(receipt.details, dict) else {} + return str(details.get('error') or 'unknown')[:64] + + def build_jitai_push_message(user, jitai_log) -> PushMessage: return PushMessage( to=user.push_token, @@ -247,7 +261,8 @@ def send_jitai_prompt(user, jitai_log) -> bool: try: response = PushClient().publish(message) response.validate_response() - mark_delivery_accepted(jitai_log) + ticket_id = response.id if isinstance(response.id, str) else '' + mark_delivery_accepted(jitai_log, ticket_id) logger.info( "Expo push sent: user_id=%s prompt_id=%s", user.user_id, jitai_log.prompt_id, diff --git a/backend/app/serializers.py b/backend/app/serializers.py index 20de145..58f4fd0 100644 --- a/backend/app/serializers.py +++ b/backend/app/serializers.py @@ -123,12 +123,16 @@ class Meta: 'send_prompt', 'status', 'decision_made_at', 'push_sent_at', 'device_received_at', 'receipt_reported_at', 'receipt_event_id', 'delivery_status', 'delivery_error', 'receipt_platform', 'receipt_app_state', + 'expo_ticket_id', 'expo_receipt_status', 'expo_receipt_error', 'expo_receipt_checked_at', 'send_prompt', 'status', 'trigger_signal', 'ema_mood', 'ema_stress', 'ema_energy', 'eligible_prompt_ids', 'evaluated_items', 'matched_categories', 'category_drawn', 'fallback_reason', 'suppression_reason', ] - read_only_fields = ('id', 'triggered_at', 'suppression_reason') + read_only_fields = ( + 'id', 'triggered_at', 'suppression_reason', + 'expo_ticket_id', 'expo_receipt_status', 'expo_receipt_error', 'expo_receipt_checked_at', + ) class JITAIReceiptSerializer(serializers.Serializer): diff --git a/backend/app/tasks.py b/backend/app/tasks.py index e14edc6..9a05c22 100644 --- a/backend/app/tasks.py +++ b/backend/app/tasks.py @@ -12,7 +12,9 @@ CheckinReminder, EMA, HeartRateSample, HRVSample, JITAILog, StressSample, User, ) from app.notification_service import ( + fetch_expo_receipts, mark_delivery_failed, + receipt_error_code, select_control_prompt, select_prompt, send_checkin_reminder, @@ -391,6 +393,74 @@ def _evaluate_user(user, p): mark_delivery_failed(jitai_log, 'missing push token') +EXPO_RECEIPT_MIN_AGE = timedelta(minutes=15) +EXPO_RECEIPT_MAX_AGE = timedelta(hours=23) + + +def _apply_expo_receipt(jitai_log, receipt, now): + jitai_log.expo_receipt_checked_at = now + fields = ['expo_receipt_checked_at', 'expo_receipt_status', 'expo_receipt_error'] + if receipt.status == 'ok': + jitai_log.expo_receipt_status = 'ok' + jitai_log.expo_receipt_error = '' + if jitai_log.delivery_status == 'accepted_by_expo': + jitai_log.delivery_status = 'handed_to_provider' + fields.append('delivery_status') + else: + code = receipt_error_code(receipt) + jitai_log.expo_receipt_status = 'error' + jitai_log.expo_receipt_error = code + if jitai_log.delivery_status != 'received_on_device': + jitai_log.status = 'failed' + jitai_log.delivery_status = 'failed' + jitai_log.delivery_error = f'expo receipt: {code}' + fields += ['status', 'delivery_status', 'delivery_error'] + if code == 'DeviceNotRegistered': + jitai_log.user.push_token = None + jitai_log.user.save(update_fields=['push_token']) + jitai_log.save(update_fields=fields) + + +@shared_task +def check_expo_receipts(): + now = django_timezone.now() + pending = list( + JITAILog.objects.filter( + expo_ticket_id__gt='', + expo_receipt_checked_at__isnull=True, + push_sent_at__gte=now - EXPO_RECEIPT_MAX_AGE, + push_sent_at__lte=now - EXPO_RECEIPT_MIN_AGE, + ).select_related('user') + ) + if not pending: + return 0 + + try: + receipts = fetch_expo_receipts([log.expo_ticket_id for log in pending]) + except Exception: + logger.exception("check_expo_receipts: receipt request failed") + return 0 + + by_ticket = {log.expo_ticket_id: log for log in pending} + checked = 0 + for receipt in receipts: + jitai_log = by_ticket.pop(receipt.id, None) + if jitai_log is None: + continue + try: + _apply_expo_receipt(jitai_log, receipt, now) + checked += 1 + except Exception: + logger.exception( + "check_expo_receipts failed for jitai_log_id=%s", jitai_log.pk + ) + if by_ticket: + logger.warning( + "check_expo_receipts: %s ticket(s) had no receipt yet", len(by_ticket) + ) + return checked + + @shared_task def send_checkin_reminders(): now = django_timezone.now() diff --git a/backend/app/tests.py b/backend/app/tests.py index 7406dd9..cebce7f 100644 --- a/backend/app/tests.py +++ b/backend/app/tests.py @@ -5754,3 +5754,195 @@ def test_problems_are_listed_on_the_page(self): self.assertContains(response, 'unknown_question') self.assertContains(response, '999999') self.assertContains(response, 'blank screening item') + + +class ExpoTicketAndReceiptTests(TestCase): + + def setUp(self): + self.user = make_user(email='receipt@ufl.edu', push_token='ExponentPushToken[abc]') + self.now = timezone.now() + + def _log(self, ticket_id='tkt-1', minutes_ago=30, delivery_status='accepted_by_expo'): + return JITAILog.objects.create( + user=self.user, + prompt_id='P001', + trigger_reason='prompt sent', + status='delivered', + delivery_status=delivery_status, + push_sent_at=self.now - timedelta(minutes=minutes_ago), + expo_ticket_id=ticket_id, + ) + + def _receipt(self, receipt_id, status='ok', error=None): + return MagicMock( + id=receipt_id, + status=status, + details={'error': error} if error else None, + ) + + @patch('app.notification_service.PushClient') + def test_send_stores_ticket_id(self, MockPushClient): + from app.notification_service import send_jitai_prompt + log = JITAILog.objects.create(user=self.user, prompt_id='P001', trigger_reason='prompt sent') + MockPushClient.return_value.publish.return_value = MagicMock(id='ticket-abc', status='ok') + + send_jitai_prompt(self.user, log) + + log.refresh_from_db() + self.assertEqual(log.expo_ticket_id, 'ticket-abc') + self.assertEqual(log.delivery_status, 'accepted_by_expo') + + @patch('app.notification_service.PushClient') + def test_send_without_string_ticket_id_stores_blank(self, MockPushClient): + from app.notification_service import send_jitai_prompt + log = JITAILog.objects.create(user=self.user, prompt_id='P001', trigger_reason='prompt sent') + MockPushClient.return_value.publish.return_value = MagicMock() + + send_jitai_prompt(self.user, log) + + log.refresh_from_db() + self.assertEqual(log.expo_ticket_id, '') + + @patch('app.tasks.fetch_expo_receipts') + def test_ok_receipt_marks_handed_to_provider(self, mock_fetch): + from app.tasks import check_expo_receipts + log = self._log() + mock_fetch.return_value = [self._receipt('tkt-1')] + + self.assertEqual(check_expo_receipts(), 1) + + log.refresh_from_db() + self.assertEqual(log.expo_receipt_status, 'ok') + self.assertEqual(log.delivery_status, 'handed_to_provider') + self.assertIsNotNone(log.expo_receipt_checked_at) + + @patch('app.tasks.fetch_expo_receipts') + def test_error_receipt_marks_failed_with_code(self, mock_fetch): + from app.tasks import check_expo_receipts + log = self._log() + mock_fetch.return_value = [self._receipt('tkt-1', 'error', 'MessageRateExceeded')] + + check_expo_receipts() + + log.refresh_from_db() + self.assertEqual(log.expo_receipt_status, 'error') + self.assertEqual(log.expo_receipt_error, 'MessageRateExceeded') + self.assertEqual(log.delivery_status, 'failed') + self.assertEqual(log.status, 'failed') + self.assertEqual(log.delivery_error, 'expo receipt: MessageRateExceeded') + self.user.refresh_from_db() + self.assertEqual(self.user.push_token, 'ExponentPushToken[abc]') + + @patch('app.tasks.fetch_expo_receipts') + def test_device_not_registered_receipt_clears_push_token(self, mock_fetch): + from app.tasks import check_expo_receipts + self._log() + mock_fetch.return_value = [self._receipt('tkt-1', 'error', 'DeviceNotRegistered')] + + check_expo_receipts() + + self.user.refresh_from_db() + self.assertIsNone(self.user.push_token) + + @patch('app.tasks.fetch_expo_receipts') + def test_error_receipt_does_not_downgrade_received_on_device(self, mock_fetch): + from app.tasks import check_expo_receipts + log = self._log(delivery_status='received_on_device') + mock_fetch.return_value = [self._receipt('tkt-1', 'error', 'DeviceNotRegistered')] + + check_expo_receipts() + + log.refresh_from_db() + self.assertEqual(log.delivery_status, 'received_on_device') + self.assertEqual(log.expo_receipt_status, 'error') + self.assertEqual(log.expo_receipt_error, 'DeviceNotRegistered') + + @patch('app.tasks.fetch_expo_receipts') + def test_ok_receipt_does_not_overwrite_received_on_device(self, mock_fetch): + from app.tasks import check_expo_receipts + log = self._log(delivery_status='received_on_device') + mock_fetch.return_value = [self._receipt('tkt-1')] + + check_expo_receipts() + + log.refresh_from_db() + self.assertEqual(log.delivery_status, 'received_on_device') + self.assertEqual(log.expo_receipt_status, 'ok') + + @patch('app.tasks.fetch_expo_receipts') + def test_window_edges_are_skipped(self, mock_fetch): + from app.tasks import check_expo_receipts + self._log(ticket_id='too-new', minutes_ago=5) + self._log(ticket_id='too-old', minutes_ago=24 * 60) + + self.assertEqual(check_expo_receipts(), 0) + mock_fetch.assert_not_called() + + @patch('app.tasks.fetch_expo_receipts') + def test_already_checked_and_untracked_logs_are_skipped(self, mock_fetch): + from app.tasks import check_expo_receipts + checked = self._log(ticket_id='done') + JITAILog.objects.filter(pk=checked.pk).update(expo_receipt_checked_at=self.now) + self._log(ticket_id='') + + check_expo_receipts() + + mock_fetch.assert_not_called() + + @patch('app.tasks.fetch_expo_receipts') + def test_missing_receipt_leaves_log_unchecked(self, mock_fetch): + from app.tasks import check_expo_receipts + log = self._log() + mock_fetch.return_value = [] + + self.assertEqual(check_expo_receipts(), 0) + + log.refresh_from_db() + self.assertIsNone(log.expo_receipt_checked_at) + self.assertEqual(log.delivery_status, 'accepted_by_expo') + + @patch('app.tasks.fetch_expo_receipts') + def test_fetch_failure_changes_nothing(self, mock_fetch): + from app.tasks import check_expo_receipts + log = self._log() + mock_fetch.side_effect = RuntimeError('expo down') + + self.assertEqual(check_expo_receipts(), 0) + + log.refresh_from_db() + self.assertIsNone(log.expo_receipt_checked_at) + + +@override_settings(PASSWORD_HASHERS=FAST_HASHERS, DASHBOARD_API_KEY='dashboard-test-key') +class DashboardStudyIdLabelTests(TestCase): + + def setUp(self): + self.with_study = make_user(email='real.person@ufl.edu', study_id='rs02') + WearableDevice.objects.create(user=self.with_study, labfront_participant_id='TEST-1') + self.without_study = make_user(email='other@ufl.edu') + WearableDevice.objects.create(user=self.without_study, labfront_participant_id='lf-77') + self.bare = make_user(email='bare@ufl.edu') + JITAILog.objects.create( + user=self.with_study, prompt_id='P1', trigger_reason='prompt sent', + push_sent_at=timezone.now(), + ) + + def _get(self, path): + return self.client.get(path, HTTP_X_DASHBOARD_API_KEY='dashboard-test-key') + + def test_participants_use_study_id_then_labfront_then_user_id(self): + rows = {row['user_id']: row for row in self._get('/dashboard/participants/').json()} + self.assertEqual(rows[self.with_study.user_id]['participant_id'], 'RS02') + self.assertEqual(rows[self.without_study.user_id]['participant_id'], 'lf-77') + self.assertEqual(rows[self.bare.user_id]['participant_id'], str(self.bare.user_id)) + + def test_participants_payload_has_no_email(self): + body = self._get('/dashboard/participants/') + for row in body.json(): + self.assertNotIn('email', row) + self.assertNotIn('ufl.edu', body.content.decode()) + + def test_latency_events_use_study_id(self): + data = self._get('/dashboard/latency-events/').json() + self.assertEqual(data[0]['participant_id'], 'RS02') + self.assertNotIn('ufl.edu', str(data)) diff --git a/backend/app/views.py b/backend/app/views.py index 7645bcf..59c05f8 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -3,6 +3,7 @@ from dashboard.data.config import OUTCOME_CHECK_IN_DELAY_MINUTES, OUTCOME_WINDOW_HOURS, PARTICIPANT_TZ from dashboard.data.windows import participant_day_bounds +from dashboard.serializers import participant_label from .distress import active_distress_flag, raise_momentary_flag, resource_card from django.contrib.auth.models import User as AuthUser from rest_framework_simplejwt.tokens import RefreshToken @@ -1097,12 +1098,6 @@ def get(self, request): stale_cutoff = django_timezone.now() - timedelta(hours=stale_after_hours) - latest_participant_id = ( - WearableDevice.objects - .filter(user=OuterRef('pk')) - .order_by('-last_synced_at', '-id') - .values('labfront_participant_id')[:1] - ) latest_device_sync = ( WearableDevice.objects .filter(user=OuterRef('pk')) @@ -1124,8 +1119,8 @@ def get(self, request): users = ( User.objects + .select_related('wearabledevice') .annotate( - labfront_participant_id=Subquery(latest_participant_id), last_sync_timestamp=Subquery(latest_device_sync), last_push_timestamp=Subquery(latest_push), last_receipt_timestamp=Subquery(latest_receipt), @@ -1138,9 +1133,8 @@ def get(self, request): last_sync = user.last_sync_timestamp is_stale = last_sync is None or last_sync < stale_cutoff data.append({ - 'participant_id': user.labfront_participant_id or str(user.user_id), + 'participant_id': participant_label(user), 'user_id': user.user_id, - 'email': user.email, 'last_sync_timestamp': last_sync, 'last_push_timestamp': user.last_push_timestamp, 'last_receipt_timestamp': user.last_receipt_timestamp, @@ -1201,17 +1195,10 @@ def get(self, request): for event in log.engagementlog_set.all().order_by('occurred_at') ] - device = getattr(log.user, 'wearabledevice', None) - participant_id = ( - device.labfront_participant_id - if device is not None - else str(log.user.user_id) - ) - data.append({ 'event_id': log.id, 'message_id': log.prompt_id, - 'participant_id': participant_id, + 'participant_id': participant_label(log.user), 'user_id': log.user.user_id, 'decision_point_id': log.decision_point_id, 'decision_made_at': log.decision_made_at, diff --git a/backend/project/settings.py b/backend/project/settings.py index ad73ac4..2ce92e4 100644 --- a/backend/project/settings.py +++ b/backend/project/settings.py @@ -277,6 +277,10 @@ 'task': 'app.tasks.send_checkin_reminders', 'schedule': schedule(180.0), }, + 'check-expo-receipts': { + 'task': 'app.tasks.check_expo_receipts', + 'schedule': schedule(180.0), + }, # Slower than the three above on purpose: the trailing recompute is an # aggregate refresh, and 10 minutes matches the Labfront batch cadence, so # a shorter interval would only reread the same rows. diff --git a/dashboard/serializers.py b/dashboard/serializers.py index bf6d68f..a2c0cfa 100644 --- a/dashboard/serializers.py +++ b/dashboard/serializers.py @@ -97,12 +97,16 @@ def get_link_date(self, obj): def participant_label(user): - """The Labfront id when there is one, else the user_id. + """The study id when there is one, else the Labfront id, else the user_id. - Matches what the existing /dashboard/participants/ endpoint reports, so both - surfaces name a participant the same way. + The monitoring endpoints and /dashboard/participants/ all name a participant + through this, so they cannot drift apart. """ if user is None: return None + if user.study_id: + return user.study_id device = getattr(user, 'wearabledevice', None) - return device.labfront_participant_id if device is not None else str(user.pk) + if device is not None and device.labfront_participant_id: + return device.labfront_participant_id + return str(user.pk) From 5faffba2ca1c3c71ef241ce5b8debb49d38be096 Mon Sep 17 00:00:00 2001 From: Dustin Nguyen Date: Thu, 8 Oct 2026 17:31:00 -0400 Subject: [PATCH 2/2] Update JITAI overview and architecture docs for Expo receipt tracking and study-ID labels --- Resources/JITAI_Task_Overview.docx | Bin 49137 -> 49756 bytes Resources/REACT_Architecture.docx | Bin 58151 -> 58835 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/JITAI_Task_Overview.docx b/Resources/JITAI_Task_Overview.docx index d62612855ed82e82deea5a90021d043229d56f5e..e2664ae13ebe39e7944bb4d15a91fbd11e9863ca 100644 GIT binary patch delta 14407 zcmZvDV{k4?*JW(mCqBtZPHfw@ZQIEc+qP}nwr$&X=DzoxnW}GU`p?>{H@a(AS9Nt) zt-BwP%|K9iIZ043G$0@#D4?kbu{!txV9as{WNC)x{C!XLi265115K`IAG$y;fJR zo^k(#b`2sP-02?-ELBWD1dqeAK5tQk1q=*xjpFwF>;V8@HqAG`b=cwe1?Euqy#UD` zA)E>MVlSRun;Bq=tT!@(w37EmN={uy>yjb`v#=fwqz|5+Ut2ss$tGc#hwNR~t5LR_ zUZT7<>0av##nq-hTNf`m3p@H&Id$#%r0@ps4v9vJExEi6^jmS-Ddr*BY3;&na0Rug z2kNp{h5#D`*Kz9Ym6_93=iO{?jo$AmCI-ykuG&LapdDovx0aUbII7U(?cVduw{X z$N~IFc0rFMOuO5m3Y~L9UuDpxdPgv$@xpBrz;BmM5F&0)W|TU*mVTe~EQPQcEy+zP zGbq&Llfrsq>S|?PRU}ka_{i+v866LwyX_AjJV~DYrKP|}d!V3;@IY;qW9hI=Y1&Z6 zG)^XWxBFmuDgx%Na*F7EBctA&rL4E(Dh4!F(5ViQ%B^}Hi;N?7BDF_1Zn8y!Uc%}! za){3*eRoz&!z3lyS8Kh?7V%@mb3DS)!0h@z5)ovAyGz`&lHMzl;-3aZG>Y&y6OjnqWVgaHK6r>|@K4O+_5}Q?&c}A7A{Q(rz zB$&Vc_E3uhx9JN{(ZP&1{9HfY;3sMjM|y}Zr>&dM;tCb---F=|^;LGaArNWZe>6-l zZJhl5rx+dSqRt@iq&28MmXs-{n_FQpXrWOqtkcBaav|{1l&_|h==y3qq9MiaB)QGc z2gPWewDim-J4UQ3FjxxVrVyvU5>~l8PjE?4x2IOILhWZzX z9n44|S(G8rCvs~t21>S<+b_Z;PT!U&^&mLc@ArZRQzl4HMKyV(Rk!YfB6bKk!7fTO zRFse@NDPoHh51mU9teWGtSWw)IfW5F6UwlO-*H&rAt9z3?Nw#u+Z~{v;2Pk2eDbiQ zqY5u}{ceo5J>1+>QDden_1rk6WkWIucM?pdgTl`M94)X9B?p1LOga`G?he+ zkh{84y7_UD^K&2Ci<%-F+miYu&>kO}6G{}mTrXE`qE8Pzu2n;bR)!7zSEOMUpEgMC z4~o%xG2jO$Gq*)$*H4X1lYH zd!xrEvFBAqNA2e>PCoW&$gu3yS&H}UuD*RF=J^q1#b;BqwINp2{l3PhR`qKA=k&UA zyN0$>>=gswli!GuOk{FduRyiSg^~6rZc#bc!y+~@twpBm4E>QBts9FVbk;5D+{6Xgj`5nG+r=M0Y}0_kNqC zd6Zy(szhkiC~N4DVYAJj7Rkz$CM0t+$|gmPi_{!EIa*HzbD95sEz1yCG(DWl&+=WY z)ATuISt7=^trp-~TPG?Gz4G+)&C8Gw!4RRGfPo6hc+?T3nS!~qtkY_0?uonoPQT|% zO^p8D$0Qw2_f&E^@d^30AYJq0XgWakpA%`B;p@}5ca{0O zdM5i2WGNy-wYRF~g4>_%vkf)BQ`HWhMds&xWj?BZ4uDr4m!f>v#}aqzCb{_SLdPaA zjiswe8?ut_IJcj1HSe=oR~bO*la?FS z0o<6Iw(OkUoJ0MBv|?Zga|9n~@UY)CC=!R`Of*bdRUWBEW0&E5gjpIqnLc}4yJ$!` zDVaVxo7?^B01mks&7SHw(;}{Hvp5wqmFcjF1(a-;VoV0}0FFEK2P=m2chy+UUiO>` zV~b{pJ7x%~VGQEAboBP?X}GgUV`1%pl&zVEZ=`FAf`Qj|w3#Uum;{y5Tv$!8SjNz9 z0zp{r`(V5(w03^a4ey@!oL*iLDAgR1x!m5b3&SlecY`M)!H>)~eh~Uit1Y9yT8G)q z14=GI8k0C(22v-(iZ|jZQYs~uWpk-eVyIU!w?si;v_L!!2mRPRcpx{>?Y=Wg+2m4w zZL^!+WF{2kK$gE%I?H`zZ@Wtjv&p0GZ*G&0AwkHZaWz)kPvWVH_8|vPBw>=VYokXi zU4c9cNhm<5$vIM7G!sgN3XQf_*Z3eo0s5}4RWeGcBEw?SqXn~1e|Lp%(j(VppvsN) zhlwX3`N@Ww@y{=Sjk-3l^CDA0G?U4wl_bMhNBVuq?&H7bN9G;ExtN)Uia2tdabdH@ zLD~h@uE|^XO;4Rp0VESa3p`DlJ_q0tN}ulGYAeM#qa;_C%ZdOdBNFvCR?eqOr1V1>{m4)y;y5K~(~Y>G$Rn`ZRaT{Uenf?%DVH+?n9j+;amVF}R>* z@MEtDQ&?bO>s^O#N)->N1iWXDCsorT>=NK6H|KKTQQM2+Ecy5rSyBeK0SC?L!3R== z+c&&E_PIFr3T(vvh8m(6gyK1{Q0&vP7DN!N%du)#=?xAQziRkt)z2Tvw~@u_zl%s( zbw49rxSg7khc$~E$z1W+Y*>sv(H+8b<@LApD){}Ep$+GFH1^pP0kzOF2GeYa=Ahm)bFyPv^f>z7r>#YPnE{?ws;-- z_J`?Sg`#kbaBAwVOZ23IzZan%A9eY7#Hpr@O~m%v3Xq}Q#%_^4qVzNc{+1vshYEli zuwtad`)UN>yU#O)4G{04SsqS@)v5n^m@k>M2KL*Skga{P5uTCh1Vran7%z!;`~pO9SazCJBJdl1IR-pq5M3+3 z+V}OY{-9BMW!x@-2o6M(G9$?x$53(w5QbZt$7jOh%4f7wFJ6FdrICqKMt%2M4(-eL$+D#5Hgd z7Bu`Nhks=V~7;KEvrLt0CklMzq2-KomBc7(35L2K+^UX|%zjcX6QT zV`d{v>@Q04F1^?&Z$LSR)q~h_&iPuNPDQ-mW=L}%N+}j&n||7S8P2*7N!Xu1aD zPsD`)^Lq>r5g=nSs}=SVRv;e(>;J@x&yw5JhP-*s&cNXwM=NCHY>@CxD%~xO$Gvmg zJtKl%Qm-KdpQuQ>GT09i;!R@_2STY$9b}21l=iNNZk-OI!P#tJ26@>=GJL-y*~!v1 z>hZ*v+)?KJx9ijxTZ9=`OVcyf;G@uGtcW0SO`7f|5-@ruA{?!iYm9@Ld?wqj*?rx612j0Aux~sW9Q2$>(Kjd<2`Np#i2gX77_OV zla8WK@_gsti%DWipKi7_m#n6nDT-00Nm(P|2<;PvQqH-WJ-6< zD~$znS0T)luc;zUVLE6Bh7`Iy-D1|~?LEbZFd@T(igRTugra|5g~lY?BB3Ux0BoTx_ZGDkQd1?0?OunWcr5xq+AJ)Y$@ITh+1Rvbh5 zH7^Rkficjo8?a_e|FkumJLgXOe1qs=TFiQ_S%uM;7tpLL8dK?Tx`3so;LkT34Gz9V zesSV|w|o8UonLNQo}AxbK3yzGp4<<-o%wcB3;d3^7_JvT5sJ`JCoPcIX&8dKFLgNH z2OL`j&5ZsQ7K{9(&uMzLb%nNGdJe-pZR=wj6Z_LAFMKNFvb$m1+MgI%gOyZB2V3B- zxnEUH|5|R#1R6)O0HG^fWJ}kCRVz5=@1Y>rL!{(PPDJf)=ndaD5~g_^WR={7;R7rc z&ob6sk5oLHOvc`9h+oc>y*NL-`@>WO0$}JtP~=bZCdHmIQW=4=8bh@pXDO3XBs0hk z^G6Zl?-vM(5_cj!a`R73flrMNVB<4pm3%rD2BdhIyuVQXe1QC1U)}e_q~V@lu2=h& zi}+esUk?i4Kqy5AC8TcK@2}Q8THsPVHjy_*`So^>-o1C^$a= zEOzq{e*}Hs7z=;A)IxH6d~D3))Tw556m786*-2`hKSoxEL?03JG(s^j;vi${gPiBT z9sY#^{X2xI4ZX(#9asL7alOkAyBdLQEn-t}F&&i#oTLvs3V=`Ss*7-j4G% zN7%U>NH_uaQaW=UM(d^t16UJ>k+Qw!Zf;z}2rr*{!yh+DKA*92xP9`cWsn{~DG4ti zQgM(IO!!Ux5Mm&C|3EX{Iacf5?VNuTMoc$5<2h3P=-&2X8Da1CpsH3`NdtXY+lL6|)>&6Xs?awu(UPLb9t zG~AsdgtgV>iXG9M0AP)DeNb3ipREE(+w8Wfk)311&~5o&Q(4$xK#9NisoDi>>|ufr z(MTKRuCP0aK?xvgEeKwCvut84kgWpi^fXQP!`MwzXg@j-LSAY>T+chv-G#MCdgP&jgyR|0=CQ_bD`qJTX|QIBLoXAXOqDqf)iPwvJ#@!ob5g&HG<3HW zZd4WuH#;iY_=3|(UsW!?pm?zj8-Nju<}5bInUTAaBDA0@Qx%CcbdYglcZotUlzLXu zklfV?&2g;aHJv`cugV@4);bbic-d{Y0j+qA<@+$}LE7Egdx?0OX!45@oX;8pAge3_ zrfLY<0L7vTOW(RADr+jrjpo?ADl6h!J|WWGg?SE^YhP7NqRa<^KDhd_Ylf4EF;GdV zjhPYeCQ?woH=w3NRBdDqD&mrgZP3~Vr11e-#sjZ0ZHUAXTbY=jUNY*E6H#7H+nH_e zR$|=;Iqs_(H0jzn$d-mE)y>=L-TqU;!J#w(z=KJMkt!@Ht^F#Vw6pOc=c6G+2t~?h zI0L(8l#%G}-f0Q5lH(bycC~_?N59tyc`oWOf+E6R?a-y{Zk5LOA4Yo2Hi;bQIsDN2 zr6tNnLxvoeu_NdR4iE(j%mvO2428W0tRLafvXE5)EoLz zlTTm716xA;5svn6-&aG*Q97YBKIFgm@{2ghq{u&kb~RBts}Gw8Ugxb)n=_WklEhak zO(Sw1(OXr|DtWmi`)dcFsc*4eWgRGy0aQ1_2e(VV5N<=c%TzNU*4RoF=BmoIIU*eo zZmS7NObzCpNd(|%H_cCkIhvG3E+uhZuXt{#0_9sdAflbYo#)ZjxpnmKqRb$~rNDH> zU3^G!=TMvv_yqLy^x+pFVhi90AnIL+0`zQzj7pDSE$JqJ-4oFyjltw%%F2ic0c^E= z0g3i>k-D#~kp1SARBh9N+)Uq)E&Z7j$y zTk1tY`Lv4jkR1Wk&0I$m)BQ~!07+)OwlnB&|MB9XeDeCr&RiAHc@162#^P7VyfWq` zUWNORKLS8oD%GRkP%C{??f!-Rk`H3ONc_s7 zPN)k%hG!yLAd1T3$2u6jM#!ge&j%V}IZUD)Z%;u1wE>L!3nD*J*bv}z0Ez3kKl4-H z(IbJP^H%4PTW53zxXy{B-JorINokZVICC3#fqI$LlQnxvuYS=}wP91pQkaM{t5*Y0 zFe@!!sg#H`bYtXU&PWWRV03CV@!5o}akv_=mT3Z`3A&*fsLqG7f<(-_4}Wd6y26ZB zh@&v}G4p+b&`vZXegQLa0^V()1}w?<4z=(C+rLG&&gVLE{B}}0rs2;y!}bvn(dn-z zxJ4tt-apiFF~zbH6HtX`O=W>%&J|g|vB-^ScI>=vNmzhn;O?8DQN)LT+wNd$?`$Ye zB{cLc9i8dz&Pw`laqxP(dYyN20DivjW0O_A+fGh*qGe~MXSTa|0A4CTE-UOFPv?nV zG7nd%H1X|22$pLGo5F+rP<1n2k|x_76$KMHSrG+@0g83$$_ZGBms=b|Admyv3fYXH zn)edVnb2=>(ez#+uzJRMjc^J|shf6IxI@;NAu@%37K!7XUC{mpx|-4F$2&2}nqjxJ zNQ+~sC*vcynKPYz00488L}8Y(Q1I-bN!adbnBpSQ_D9?5WX9~C-u*#XnVj0Qak&lD zS_iPV;heVqRz_^ad8**L9qmw9CSA^Ep3B58?DLb~4IwCP#{e{aKP!J9tqq@?pNpQa z-2oPx$*E(<@+04yL@-YfTvf~*FS}gbi>B}7JaeG z*%df0f8kLKs_A#Mok21YCi2C=3W73R!V3eiF$^egx8VW@n+`PBqSv>Az7ND`O|5Ui z@>Pjt_A?F&CQwH{ndK$}aXMIuMT~^eA)-2Ly6f}Bm}9mm)fvy({L%)vxkk7YN~?6Z z05UYXr@*OhfFF8sWsq}sHiNTm72E#)3^(XDtr|9uCtQz3KaZr?(GI%<5a0vXY6P2K z!tLR>hxUI6aMZ!HNU|ze`4h((Aw_L>;G)Yv%55)2G4tUTEvw)xR!;3j8W)miH9@p_ z@j`^R^^0SZ(*?;H)bHl9GP=DJnjNTKWVtD&j>0#->;_z?tRsEK|M`4Tr8(O8jV z+sm5+*BBgF=&&!!#}!X<+%cCYM-eBZGbI*I5uj5d_|J|O5^pSEnM@J_OUhH_xUFo3 z2#1NF&N#%ZZ#9>#nXpZZoYBiqy8_yaohtC_>YCKH+Hxr}w3uTg#^RzYh^0L4j$^Vg z^FP;z0n;KtzFT7g#|*+)9VkyA#YNe5a2|AUjXbV#p;;0%+PK~jO2wt!8 zE=fcn$+bG8t`VF@E6bL-7dRS>s*ss~(M)jc!C6Mh-TV6Lv-}NopZhnltnooGxt9FrD0|eMQpIqHznn7^r3?m-xQ$RS84)d_){8_RxeQEddqR%?iHO# z0Zbxe^yaKKTJtTxl*pTw$?b+U$tC+BDCl&cVco-+;9DsxQb2~xfBmJbH`A@nYqLRY^5L5v>#?IgI1MiwU zt-f(&#}!b*Gb=$)p~O6*=8z3WVWVbxm1oW=ZJ{L#T>rv4`X$W;T~EzFE93!z26%vg zOx7}aHK!Af0^$r)Xy4lg(+CRPR%^D=hfYrwg((O$A_Iz#05c-rOJrMdoUL%$h-tk- zF8L7-Ak2pbCVi^)(Zr!vfy(Wgb)%1r4M$IrpP%nT!#368jAqB9ZOpj14J)H4le}v{ z1^H6$mqdNR)3A*9rTClJ8e2LA48U@lXQ465flCgaWunpt2IrL^S+f+5{pt;?Rn~h|k?C|nFMxP(bH-)H8i&4J%&#j3D zVO^E!`4F^-UcRTmuH_}qZQa588)%J~N`o zN3lZWt^>2SHB|QVm{Uq3Gi%PlQ;deQrkqj`bk5Nx)(Ep*f0P+{xiN)?i@Oh>0HmL> zjMJ>)FIt{tDM)j7R3E>lg5TnfjhN^-nGp-b1<7o*u;i$vI9Pl;EP!%xgR{p1o4*Xh z?kE1BpP(Du>y?_jk^=YJbNSE(^M8?RDdn&SkCSw;M?d(sSegK;HO=41f*_gcgl|iYJg9z$hKCi!x`H>|4tRwEi#9{r-m7! zkuda}X#pENmXTpbnEf?IqG+kATUpvO+)I59`5LJTR z=%1X!FkV8#4RCI@TyQ^v+c#jA91rHqqQc-r61i`M$JGeO#dbm}p>F+Tqvd{N^;#(FjOpNF zUPZX=KwBv>7yiQckl@{S+VVB3qF>As8o=SwxVPN@t~7^~&Py8nb>3G0 zB2D!P$_h|42-yfMRZ+$R+qp%M#VBfkZ?=7H5+yz4sO8jq$|Kh1{N4z3U^uj(%Q5Y+ zcI)9K$0F$q#(7C8O?rFB)d6bZ_h5LJc}cVjNS5l@AYZj*)@OzDQ>yRGOoV>868J&6 zBZJ_;4V^xk`{zYwJM%p=x3u=*TH5F7{&;`+c?mc-t%tH*jFO~T;5-c0&s2?rap_OL zfOj*BP9D!DKq$NAV)@HAXsnHGShu&*-GKe!aqChn=nVT6@O+CZX|6@w#V}~1T{En5 zg0uKJ2QPSIF=b9)?(W>Wp}8@CXRWIZabCMTV{x&Rpa=kO!_ zu>o+|aas~LIJfrhg45VHKuril^nXW7<~#=W@>Ea{TeZfrG>t$FWBqI%nj40@WIzD? zeOtvi9fPa|ZVKJGotCv!)NuBQlEh;DT+ijaF3(ywTF7c%S5Kb^jwy7#N$!K^EDt-K zDgWM3<%A75aFOZ=#6M1}*qUwtZE{>;Y6IZ!A3I|zC82SO-4IeJ*>jtgTH&i&N`E>U zXW(USsAKcB6hMMU%lWH3rR@-u5}Sou9C~=vJB5SA%{uF^cQ(yhJ*hMPsTeaO?`Wb6 zv??CiPe*R$v;sJcHNXXKz6GweR8@^PiwDzyO}XHbf2Qa&9MyRm#V0gj+W3^tZvcea zuXCrjwTMsCL?U#cw0f%2@ln{nA^qMgF|)=bCLqfWeZ)>TY%bvkb_WA3#RI{y%VSur zPveGq^Ik0@3&2hz3Ne~%&=)s|br(;VXJ~Y7R?d$fr<-$YK89F6ITjc~Q`MJRRv8mK zJjWw@igYic<*r_i;tD>*Y~C}EQUKjDJie&U&w`$^l4GyT2}ms9S4s2=V9wb;}J3t)Wo| zs%jGzymTz|gaUswF=Ndv-~dGHBwknFPcs1b;^~14y)W?uP5xx4P)PoiY|+nNs1KQ2 z-#vkYsJ1)TeSV!US+3Py|JOH7|B$QzqkdTFeVFNPD_9b|wxs3Jbtnp*$iipiO;loT zE`)F{UAWMB5+rG3U=WNbaezyJ3rAx6t)bjaP7>veq2t3p-^AR#(rs81gVMk4Jbr;) zO(ZZj4?}HC(N=eMTf~JXs5dla+Hvjn_r^4NAX3)_xCqwE$cY4l(h`8^KOvKA1|+*+ zLP1>2>~9ZhLINX_9x(+bf~?7BWD4%tkDSVg!E(2O7I94-H9rY@O9OT}2iQ~8Z7F>k z`^~VLPkL_Px(6ERb%RDwaKXX@$iVofM>fi}Z5z6#gHg5z~llan6{OTu7!g zVv*J)^OKk6(TuD#BmmY84036;V`3Xm;|mWbuWwPrWUw)~KG{0e!|zDn`dzQqcvqZaZrDddit!64RCzF!j`HYPat! z2J=T1`7u(>&7wjOrFRt0y`dV5ze-Yp*&K{$onL4Sl`uIGGet3Ce6%6I}@} zIa#4~CLa4zn(257M1j6D<=11Ym0b}$Mn4$I05&U}uO8(ndkvDOkO6ZC>G~{VO?JnG`}<@F6{8t>YGO-kf1nssBH%DqcIa%gTYSe!~C(1`ZQDs^G2@bng& z9aWeFJe5W!$(E$2h)Xo^9*F?lNbeYe_`YB4`<3@B$pAW?Ya{ZJo#i3T;|&&!IYX9X zMLejqQMQR+0Lj-y&a$Nt8yJ^&Y1=1zFfRqGs?rs0oX+mE_w6QAc`7)M-65rgt9S9a14?cQKCEn;}u-CaG>`PL&Hj~%k- zs}L4_aRALq&5sz^N6PnZr%xl@3NHfAoNP_bvl9bRv&Ef#p-;LZ;9-B zpZ#h&cb#bW{6K%}?XE1>R6fhz-UlJXg8wxqm$vBwb)oF&z9MP)*uK&pGYBE!a7HPFgJR^~ZeJ^a8%CZ`hT+^lAhv*6%zHo3i58-&CU11p zc)X(|0ujTnpirpn`#vHstx$G?k^x*rX@V|&nF}fu0(OJ^&1W}(%=uyG0E&nW8u-Y0co3ll!P%Xw@q=9vovb2MU&?$p_)UrwC%on-gW_$wo zn@z_nQ(x(&}M=ms_>+Wkx}rYP9VphXL;eg@E^AXJ(%&FK?AOA=Tn@$|A98=4*DnlB?%h~qA``l6D6 z4KfXUL>Ff6hNH4iNcrlHK&V@xNT+oLSk~|XL|3HtVUkv}T?gNz)?*nMqCJHa0>Ey$ z-=@yebMY8FQ1pOXPv{WBZ#0gCOAfwSioQmhWqQ}&=rpE87VlXQYl^YPXk$c8UMvni zlpdxK0)eVGMuF9_ohd4=+~o%E6G-6Nd5*HldRmUL!&gI7hMh+C=O888&Pbk_mH=2u zN=9daEr!oRbXY<)_R9FH=fH~4cGInGN9V5xq zbU9VTDA;b{?z406Rk`fros5B@_NzE3VN1vq!~aB^?v98d`VXa#G!1UE*a%nbTqgV8~^0<_}m=zrD{1kwDQwlV34{~$wP zG2&|w=-?Rms~7XQ;IE0rU@Gfxa;Qo0&X)^<&)3R^&6OB|DG8oE z>x&Ufp0n%np_i?1CvVBFB|w_H&z2MjE2^Xi*6D0eUuZUimN2E7`R(UC`ntI?q~Kr^ z4^|_@#aWsUN~qxlq=Q2lPapjx6(>On|CV#V_tonAXx0H1Jxhw(s;WF;Q^gDgv5kYe zFWH~19#r(E(bjjisON`7>cW96CD9{SA32Gof^yQ(3}S|kqkd2M3P9fc$H)+Tt3^8t z&R+I|I?~{J%4yXT{UI7x^q)OB9HsBzh`Jpr9<%9Xvl@u;`Pq)-$kMx9w&p3KVS=xj zQB5U2mRG#!L+nmtArQrWRQK+t(8oGFERBKr`?q_q%uV0lsje_-36lhues`J6o0UCv zi1avG?X_F$z&a5niGcG2Uu8v^vqZRjo}|pl7A^dPQiJ!CI*eHo9yl~cNYLd?<&W1< zd=oC!Wg5kii**JAWD{@E4;RYdm$=I15z}))r6E~WT4S&;Ce|a9=gKV&B5c}{SVkA- z8NI=Ho()-1D1BjUTD1{`3go5dczwc#T61BAp&eych&|)XbHF+sEo}6uB1q1YVvP-A zm_W~jz=LOh){6tCAhR}GMq9VWe!K;oq4g&5ipGT^OjKWk5%$@3Xsj&i-hu|W09|UU zb&MpFZzFchzOideWL}YcE|r6H!o3HXwl|>&xFoouPhfULbQY#x-7Jql zVh){eZoR~%6F|MWmm_r+X^=}R30*|Zw7$7o7j3AU$*9E!sW(=gGnJotB~1d7>!ZlT zr3o`X-*uH%T)psU9qmxHbesFh+(LWDjzz#Q>QD;yIr^`Ek<1Y34h(S(-qX&bzr=S8tsdW>fSZN|NN4`67Z$9VUM-R`a_FNoItZUYEXKllxw{h1c( zaKr42- zKTr7m6M%0?3~3{RqDe)->nCz-IOAqO)NtMcpR?8QhU)kSCM+rwY@XGupywp2!qir_ zHRX1oqk-3lt*QzX=A3ve!X5+e+ihDp!tiN`D`2x7;TY2E5c2wIoH{@#i)@WKuu^1; zS`r3-5~M!-oDkQWD5p9vW_{Ke6|Zhi4YtH60}x_$c*|d8N=iDywtSx$fi(7OH^9@$ zzl3bW2`JZQCPCxNTTSO5;CzI?!2A$*};wQ4B0bPk+*ULR3 z(OJ(A{S1U8E1J6+9m7qwIiH_J;lbTMx9T>@zL9xHWl&AE?mxiL5-DH8N9 zB>-#GzL+R_zxrO?8b9A{`HXi+Zj6HebGHWYJz=BjE#}Ss1C}tidMMn=fj5$6#I$Y^ zeToWG^?h7NxtBaGy5j!;S5E?Q zk}ltik&m4*sN&~M3GkJI%oOk*hM8t|IAN2ve3L^!r7wRU9K-ybm0rQ14Rv-mN!xGo zq_T|*aw{)zD;I=KGW^%Iu(if<4G?srHIY9n& z%6|5x{q@-YarK0Rp)zl1`XLjZlKn?OmZmh*1h|3eW*>H|8ZvPx3;8MUE3yWtR>v9DCYh!#n@bieha0np?rhap7I)J&jn3qsdRxr?Nk{=qM@EIi&*s$*~Uo%VSRUAI5tL2 z8L2G1+M+?@_D zV%ZysGy?sWTQ5~j0YlML)iCCA( z;W6gSxNsfV-MIEaZ_k*IwD41~u3+fVtABAls0+&!a9NX3=4%H!eA-b}3EhV^zPKxY zw=?1GcjiD08-~#z!>Ra`WOZ)aF9FLPTdLLf%v4-(X|0eMY5+^CHQemwuYry4=yIOv zP}uI|gYLtw-!E`lA0Y1UWD~7PC_VT~@{9KN6~1n^N;rg8!us`tzcV2rhwT}%f`^LB^zBzHMzMAqc$fn1W?=}Q@#Ds* z>T_7&F`2~T#sCW)B=p0Zh89(Et;8R1EfGOG9&t@lB42GhTN@o*+#KEWdwbO>JGY9~ z0r@h9tKrvNl#KTnNMbYN2J`J7;EMOm1)J1QVc`L3SA%n+1v?Kw3+;(7?_Z*_WG((+ z*)nxwjFYf3Ix2rnU3pgySs&Lz-hq()39Qa7#Gd}TssgO_p0SJZ;W!sfy91hHXr>7= zHFk)o*ulpz#@0KpTSzzLU+YrxzbB|T*nqM7;ql;fmYrwfpY6YNTlvFh#FGnUl_@Ub zkyo^?CxI?%iceb$>9$)Ao_4gpUp2XddEvP*NL7ijgXi-#?NqDGNBdGzD}`jD*~NP4 z`c>5fdH`<2aQ&3p{LRYRpzqJtXZ%{4N!&Uh8B2M#itxwH_r zF%Y(k#5dAy(Z-PxZ2*(Z+N1f)ya}-_EJ8j^9Bxl>CsqpMd|N6VtZw#YJHN1_GLBcwpE4uRu(h zGmG|L?bwrr4fDT-N$v&czlKsF?SEr}i(*0koxv`BhWL+>fKs#cFP_&t|LZuYMf-2) zdtK^(lare6!2b;i>)`np$2(a5MbJ*Je^H>5^Zym5MRd~t>+0#m1rg;+*zElCFNN;H z#Zzf2#k3zQA^M2}CvM)c@~}c*c*Gy8a3H{Z9hH|40z4Pq^)- z{&$gIJ-8tJ4GCO5G|I@}fP{RK;_h2diYoZ}A!I1td=}vWv zjbN~XfCMij)j{C`c6*YkmtSw_p!)d~1^M%+i!$)$Zz3-U`|k)F0&cdu%gd)xR0FfcH-T_}Fn1lnt^fNm8CcOEmi8 zfJbsKG0nI@hWf$0z}kI0RYX+=XBIGR|}|^<|ruk54e8|QqxC;Rtj2P)!*rI*R=H$jB; z*4wyu0o?7aU8cv^Fj42~m#+8E-TUKbxV+@s-+U)yo6A0*f;qYbIpxL#XFfGG@4H$b zAGN?&fu4Ah;3mpz_y4-l;BXy%qHl zEkWgxW2Qtw9Mj~~Q;$=sqz4%sdM4@)`lI@mD6eu~>a30CvDJ&p zJKCvPk*!WS=kk(LRloAiyrS8-Ki}gh(X@b$NH|sb=Dtm5LA3%T(qo=krzGl`WvnhU zm&C%#K2QCe6x!NEk(c|tQ5V7l9t3(u>FvOK62j~=QnD93loy&rBo|SV`|>6Q#d)dR z!FnXs!y{94v5dUrY7t1)Tv2@Gmw zd`AD+(6r_w5re6dF_Zkcd8{=^#IBTQhhRb9=ofE@yky@_q~cId1z&5pk&ff5fQ+gd zhDypbT=;`V{j~GDGPfjZrh+~Z&2FEjTE$Pj#@b{U=yY5}UKq;`Y#Wus45QOI1DNyrH@0gNt*C$`q_*1Re$jQ${3_6<{X?KRcAidk5GxLB+b#Gr+ zDJRaV-DAcUTOHpYZ$=HJwwO+MBxY=_^f%EkiLeg%C=&kP!|O^c^%lp;dLT(<1oMua zw(^~>u7Hm$?3OIuxK}cvbMB7nQ&qpF+g!4X9?vL>jFi70Ir8Qn^hEwUx*it+H962^j3Q zgyRo&isek)zm^URbj10|YSR!jAdQ3>2h<#b(U{nO;i)_ODD~qJHgVExf#TXxPw~;I z+EJIVPtr5f<1W9HlBIi`f?w2eb8VRvVZ0r@k4aJYi|;sZ4^N_Rpa3udP@IgJH<>>z zA>U$cjl$yz@HN0S{Pv*7=$1dG;@4Aqy6(-@++K}?hIdcBEfe}=M@Bl;4ZHftS$LZW zVTau+FrJFAF&hYf!L>m+U9vko5R7l1waRClqeWgU=WGlN2r2+;A_x7c6No0|I#U6@$wVLYczQ26gTt z48Y7!$yF^G#XapdBxrlOKj9&G4u}&}XXm*3(ztMu;(Ay9e9e9$tpD-I zu<0WmEW4;F!r0$Q_l(f%cI7lYvT^Jd@s})7&EN#v%=HAnIDUg0)1kP07_F@&Zou0N zu&lm+&V=^{#{;~x)f{xcuD-}ve^=d#HCwVobg35Tzsh;uxL$-H)7#qjYYS51$NwlU zRGeyPnwMf$U-Ig@`hyn7FT@15P_R0~y7k8STAHW(^)?x*{`l1WIm7|_VbH(knes~F zoe2MviBS)>wX6IIX7~C?KKwSfpM9C@qf(z%Fm}+nOdQZtn}A*u>+5GwdOI5%Lt6+X z2|-M9L@8-?h$gx|i>&iSUiuh%6{i97i3{Vufr=nIfjzP9TWqQ&L=wrvJU7>6ulTkOVS0}E zMEK+u*11y?aqZYcNtM*5$joSrsJGb`Zn(PQ?vGlygPrL}L_VD{-0rfR0z>6H z$_NOlzn}?94`*Av5kxqRRG54~w0}n&4*aP35)ulKF|d#3W|o*bGUx!C1hCSePj@%) zuFhlJo$lv;SqYxtvvrla=O(hq&j)k4Gs`&#_o_f5SKAY?PH`$Z1n+704ZhMT`5PZiMklJQ9K^tM5 zmrw%Vls`w#LY@{_+`L0VIuK|PNDgEoxs-W!ZqrC@j_>;k?tEi&Lpd>0LJCh#vhRU$ zBcY6nCqbs5{7U?WeyD?)nK0~+Q6MSXc5iZx*;YYroRaM$@8Li=0is4oy%PYb5U2uO z%sc#RqA2lP_l7rf{yAH*wj=wc0uIG4F(AYHuu)06wFwR!CVcfVaoKxWwGpsLgdYg& z58EOrQ%g+E4ZjXvOt2eL9@h~O2 zCM2K+n8_wa+iPPc5@Jy`CPq=Z|wZuBRqjMX}|*c#SYo7ycc1g ztzyDR;*o|&A>M2Sy+54HfS%EHXYt6W1?4L3?<#1z9SZ*beu%o`-Q z@t1M&wQk=M3<5ZB;=B-7hG5GzLLjwedPr_^;=Q>^YGPrAV=NXul4!z`3Lwt*Q%o#>Ad^3BYoburLU(*Fls$4=D)ZZ2-Rq2aMq*PFWoaWs zTC^ZXgxF96s#Yad+Jp!ocHYeB_L{;!m!S`Z-(Y%zxJgsd_AZWex);M+*3|EaZ+iMf zE^LGf_h!R`TXNFys1`;YE{vh!y}S_;BHfTHU~`vdGhmj}1-zn2Wm&k^K=*0VzxI-VkYh>*6M8L{ zrkCjrnk~Db2ShwY6wO4#2R?8TaO5|?u&keQf9Lt3NiSw1XO#3wF4rZ8&%bfqH8sdy z+Mp$dn5Bm^*XQy zicL~F-Oh6N!P|7O^tLuF#0gXQ`6zFC*!ylSUsXDT9#EWhJaE@OoS7gVF^NxFTSy1T zEK^PMpp%)iWFD{2#A@hgOJG)O)75G@!}?XDTJbCgEUZ2)4YH^C+2kraEFj|iRE}Dq zkdOe&15jlQ(5f42=ZBFcF@wRs8&j;;%PLj)M#cx#=Dq|FCA~`Yf!?Gg{sH;9QWg&3 zsYjYUQ&ml##&*;WiY#`XvC(WO*mF!^*@21_Jj|=59Gnhu9vqcO_zg3@wQ*YtMb05G z+!c0Iv2B<|QZyLHw?P%<)O0CqlP%0qd3_d>8xV~XBYBnlu<+s-66; zLOH!pBXxgSUbbx3OIZdl=xZ(&Zg`hx6o4?jOfX?f(##>QqfoF&UoQS`n-cCz2`Bvx zGC~@SgK{Q8Es4fRkI{fy6-ZW9q5wEZB8kw}4(96Z@lPH4+=gY}Cu78q5N z=mVw*y-84>nuq*qMO4HLsq@@$PyeWYI}(X4<209$kdOwWc4Py0ZKHM$G)rj{Zx*Kb zeQY2jHTUg#N~u66{O29xKJFFRmKSHo2Y+p-bl&>q6M`^oStHsQzR&yV#leYGUS)s; zrI0YHK#aXh8}fKDPj^Y8?rje#qgQZ)O0|e#C$R5KaR8@;czg^h z*`U&)s^VhrQpRIcWFu8-!ttPa+$juBu*D9T*ssua%Aze6v7e|KgSro_R+j;=Z^U$s zHsdWaV@2w>#(H}1%+y8@(V$)dmn@_Y*`SRBz3i?^lS(;VR{CoBvILCB2!E8v+)yU% zbR!r+xPIA%t>4gf9H)NA?gNsh!umG|VS_tCH4^;1{kI5r8^hw}S743&h#^fjKvd|A z8g!m8kFTF^p(z3={p<+d4GUXrLBy*4#y{YZL-{@Y)aI(3^DdcvP%iWwH&nf27FHdx z(Ln8G%UU`L`#}{>IP=-7S)E91eo+GK7{gjMWA&fbH9M8cO%Z38HKwi;U&GW4NL7336g7y(8qSh>t z>7wJLKI!u}og_;)Q1`f1tAJ>BgGs&?J-S0!1k6pS-C-Q60FXQKHg2rMEG=5I;UGkg za0Bk)r5v;ag`^X!G=7Mf!CAV$Ng(;)UslIz51cH0Ks^3p)!GSh$+WbdE)tT5@qaHuDgT^Rvn3{~ zw#;*0%MnM81V}Q1-{8^exy0I`Y^CZfBrSucxlfjzLX@j(EbU2n<$ps_D@~RZNHx_f zjFHHI&^Xk0%MB&NIy!@e4PzFvEhWK#+J{Z%>YBz)lq6983XQedw5a~9awl>$42LGSZ{04#H(YWD?vP2SRQeLZD5wQaMU zu4)g#aI6xywX2`V-uI&?F!_?zO3yOq#qJjwofzs+6C=geEorkPM(Dg5&j6He;?y;BTb@`h-Dc`wm}%y+9SqGM_tw!TStuBg>BPF%oxq(!i!Y23pII}<@ue0t`Q4%; zx}*+s*cdlZF#IUuvOpgkV$_(3j5{2Cp6-lXgTk>TO+Q zJ>wn@0dgEtRYCFGl>WV5DfbY)G3(Rf8e^Cux$m;;*%d_&n6Txbd9{vvr*h;Sn3hfG z-QOPQin;Xv`!$`vGV?@+tp~KC$}x0A>FZueU1ZVk}AI)1rRx#hlS zjcb!UMdGd6i*&?7fhQZ_zhlqvw6BR}^t+vm+tkgCT&P+d$Tzv-puyzAzDT_N(_BYU zYciFUNOYpv@7@HWhABNp{3B!pai~RUebDpxXN3p>siyhRjfh7WCK>IB*j;d{qxVv3 zaDwT|o`0Hf((fcO1jwp~jeyuGh`>k^Y8@ykTzJ^hSAP6X$}^)CtyK+Bhl0l<7mR8&7`)zs9=z zH3Pnx3<_zDpYmyN&`-55!b%>p$6G^HEKirwbzOiXq1$gp3kCqS|9#OI>y(sXMr$0r zR2(eMl9C*1-)*Q<^_-N^j{RiTdey9z^-eb=Nd>!_5Rug3?Mk^Q+t580jJ( zOB}<31fkpnWR-yw|5sYvMwhFKG$kC_pk$qzBmB-+0{&AWeg&!hoHwZm{~Nq5h}JkG zmA{C$To}kP^k6j!jPo)C=C|WxMN3Rfai?#m_UjTyg$VQTMF_Y{>5k$}b16)`U>nSt zVx}|3zYO*pq_o&>oOjpP9>6YoyOa>fVQ(ACVXYaKDNzAoq`qi+k}qVT%iF0x@aAUd&~6fX)t0hh!Bc&d2f;fljLc3(E{+a+CTNxd6$dp(ion8e`hP@Jy1xeCupV^Ow^)nFWQl!+Id&KAyiV zH5gL5&Y?6AK^+&-c3m3Lsa(oivfc11gv)S}-x&ji@*v=bK`?l*UF2*Ad#T8anr`dz zONzy;+WeX@dh6HF>#a`guQK!9vn>Tc!^{ z|96eA1AWzwr6`fCKKO^_+TBENnoNHBgm@l(TH&X|lxvpb#2Qp@T~bsH)k+P&$cSJ{ zYHon?VlYPL@G)q$m}3=U(qqVsW*G!>(AtoMDWL>Z(D*^Qkn5t8><8urJO`UPVpL4f zX<~&ADg7G{cBoLJq#rop+Ow%lzG_xwp=HpI7)n@cZw)4mv36G%DBnxD?eRR`>| z_D|g-u!EhGOP_=SMKN$Fo%J>weW*<=aR}nDBhnzn-(ZJj`)C|%j`GzrT8JFijOD+g zpoGQHz$8x%`)k-Vs=f)i7u*=3lVQ*?78U<`K)^BA;g#aTXKK<;zmBM;wv@hUL<9R! z9hE_Q!q>9S45TJVZi_D)1I2ckZ2=}t^AJ)~r`hNXK_LaDiFs>ezewW5%GF0xaoI#F znIAo~*s(KMhwSqNuPTb%sm#?o_iA_mM^EukmA@+oM1_gpK$t|Ge!CUw=x$Fm2^p=8 z&&w!B_lP|O_bjaF{aeax90&?tR`O?f}kTgi{pY{YQM<1sG%pH&B+herLfe8 z-(Hi*8HiJ@x@6DHHxJ1fdTqj2`ocHWFE-?p)PKAt>`ybtREmkONS%dhszVe}IsK*E zzt%x=_r9MJbzp6+_?FcC!~@8M^<>O~xnyW?iSPxeGWr7o2X=yB&q}C=b@V(%m9GC1R%EveeB?iLbz2m*$mA#4!I3 z?#C9#!0bcgsL*5Dqr2K>AhL9JdQ`8%cS7YirnnflGEN>}xgsP{Dlbu=?x~R%VV7St z2EGtr%7%G@yj^hwRRG1jV&rrXBPd+IHk|J;%wd;>5-!!zh|PlMn|(KDadn66>#>}D;N|@E>4Q_Y`OkG! z3`6+?3_Zf$YC2mx7<;xl$^L8|UmT$OTVLwRgA-OwF8CYakWJCb&YLUqRU*I&Nt6geL)8L6(+^?X(x_c1VqsW~*H^aGkLsffQ?SsX&g z+ho*Q3Ft(zBz3CHq*feCohOW-`y@eI4Mk-f$%0^ae^R6oVX69mhSu_=JQ?PdLUn-p zVeP&)<&kl%2L-MAnJj$%wLpJ=&Jfq?0?bO1TTKCpJr?z|a zhqi@cFYTHRE@H7*SxWQ;79O29W3-lQdEpp02b2Ltz>Q_&yoj_<9o2QC8(1|(B%YuA2& zB#U?;BKswi65ZVc=N}NeAOw^9oD-TID25ETR=K(@%RW17unZGVZW=UN{y*inexk1=D*oI$Ovls{Xi1&@&g9g_zsX6Zz279Xr^Tx*2; zi8h$;YZkLHi&oXcI)a)R2=t#8Qq;m?{M6KIH*4q?Mn;UovKgCJz`BCrBU0b&+x1)D zN`P8)BOw(yptgLi$pZqKpjmr$^>jx=Q3ZquTsvHJ+^3CftObI;Jx=QlbU%STI z`BdEjh!$e+q3(XG>9ba|);fJ{J4>gZ#kFp@NpkM(R_2zBcmj!=oxD(-=Vcs)f|alK z`WN&Fv1|1gsCMb*1#aF7Nb{4vbNg=LS-_I6qPp@qac5Az;>1ICfs?CF4*Shiimj7_ zow+HjZ1<`pjmG*vQOvYqv-Klz^J| zGu6+QM^F{6s{Sj_3jiX&ytcLKttCBJn-N?`V^JHOKw5V9&Y3~cQawC7 z`~5Rwp3{@&_Y`Zzl(%x;K?w$N&Mw>uazDlPFR2LJ_csJ1Tk z2r#lS5(@s=!bm)`i2W(sB=NlZ@uvUvDApNS^YEHP*&0ZX@@)%3*NpInQ+&A=0vVf; zZ6zHKU?SXK_zHr?()cC_$Xq)($J=-m$m#U1q}dtKudA3Cv`VRkflEY8kR2 ztle!tNpRxH?QF$$+7lZ|O-;I5lGEhrg<&kH+Ff_rPl#zseP*fs3I%el=Ud2}mRYIF zSjijhi|8jh_%#>o;j+>^v^Oof@z;t=Y6H1Qd*>S!>!}0ZB%&CRxDs56Xne>fb>gwt z#EWxQ=5qJ_l>hp50SvOMb>q4>X}yvAKfw?7v2I`b!a3rDUiwV?OX{geH&}l1X!G9M zcrPz{=GxJ>`Cv83d6vVm(=^#?u1qHfeTS=ISCFSncCygyX6nGMOOafHcHG-^;2Ie3 z$<|O^U8)F%H&sum5PoSz?+QOE95uG)GO=p4-{{(pnFZsc0jkw?4~nbKMi9>Oc|?!Z zY3&(4C97HaZRy|ttYiH!3$AQvtgt-O5c~TYY%YTK9i=-}@H64s(rvbkV+H+uJWDTY zXVB+Tr$}sAA9t_)#Hyf~3NIt`kG6O5tOzo4b;2TkMs%yJKnoc@H=6y&)dgj zO=EhkS9V)sem}CkmObT(?Mlxl5LjW`RdBE{18Mfezw2fr}8oUl0YFNn~xUCX(Eb6}o{Ia$nlF9|lZX1Wr?Sy;yci#y{rg&5`@4C5J19Ldqnp4+lt9B0WY ze3(lb4Zz8)owq{Z7R;*O1_vtjcrokGyB_jmGStw|#&CmK)|LN?;rgPdu3ANuAutBU z93Ahhit%?VX&-tHc2f(Qb0js+UTpR{H_zJNQi@*}^N*ig)qlQc~rGfV56HrhHS{r1R{DV_J2gAR9;o&Z98$V%bVe#^pUa{&gzCvxyMZqWc1 zC~El<$m|^S%2^1fGGhrrj;V~@O_O`CT1}LOWF!&oU&{-*MTkjacmAH-w_Y#Ir_Fcy z-L$HkoNwDTJA;E_vg1#~^7o&w$WnD;xgY{xox3F|Fo1&+BN8$+9GV2&9xLQeMh zHxLkI>HR23LS>~> zqFn;OmL=ygb3A10?=Nz7_ev;JzL#vlmK_cC5y2t^o$!SvYbrO z2wA}ZyrQ7+G#7?8M>@kWUzQ9#%6P{jo^Y+*IKq(r7}TfnCYDYVBEdzd(&TnWX}}#c zfBXQVU*WW*?QGgp_J{>xyhHQ+L<3w0ev-!QBn4`D(ERc{^y4|Nrx+4=B+BTo)Phi^ z@t_9#g>)ACBPRH9$Uj7j{LeR1RQ)wXBDdjUn_yeR#hc>V%b6)Y18a-OXI}GLs!>-R zZzqSTW_##&@9jtuf><(M#d61eM!>*0eN_>96`Kd{D%^$3Da)KxQ3YmCXDnE`uJbOaW6~5Dz3R$mXPJfA;KG~c zAAJ)O5`s$;O4{zbPUQ+5)xS!Qq~G5b`n)G*9*G9VDV7Y_aTx@eF9?LIe1V8f9wO1n z`JFOU@%5ruYOUxGy_W(>RNlgBo}KujR%VRvBME%*v4MGwOGFt4CYVj=au&sWC{3!Iu78*NQ$q)yWw7`Z zZJ%a{{%yp{89R+TQSRO4K^AIt5-w}Tjp~WrY2i<{vivzKUr+$zVKFfpNic?KrvVyo z6|`QvjJOu1^=xD@WnJwhV&9lUOS7RKCjQM3gg}+*gWI3g<}{Y=X@ZzbF*f{DOPnt&d&&zMc>CN z+vI<6wAxsA;5a1n<2Ki7a6kXHen_jED?k)8=b91~FJDl1zYly?{?j@d$pOx>h^0 z^bZe*H&537%%@t9XZPqSFGw99ON$+6y?3oWjq0*Cs-aJufE;giWj_TZIfcpS&EwRu zE5oBgNRdBC&TZ^@v{q(!Yb0wbd8#h>6q4=q4*7G~`+@hEu|mvq?>P}wAKBzBN_>WJ zG2>xn*Y9Lz3$*~Az+2Cu!g;hSH{{wEoSY|-$KI(_uF9pX$J62Y)RjEm*|zi2Tw(V9 z>+MwStCgc@s%M57veWG7hKblXK)_`f2nI16G^}$pnL*ja==z#6tNvy0BJ>k zMBf)73cr*~mGXL4K+dj^4@2-8+9jvx%(3(7HY@(V`?DYcQw9%_Y3s&ruIAQOPZz>7 z+149o3;M9YmTOP}={a<(4!g_h)i)yn13zAf+~3lJ9-=<-Sn`7TG`thT&wo4wSrfIlOFuJzGxtkTEOnN{dH-a-3a#KOJ#)}C9j zDf-$By)=)`CG?$z=4r;?GuWELEkQv2#e2ua1pYW`XJyK^ey zO1%3 zp$6fNEt$CM63)wRu?oDZDLe^(F0sgR)z+xDD2RYOEMY~HsMK>AuCoP|NM3}cWss!} zSRQ5bdYwH3fBbYRSH(-fcZsHXGfR9(XMDVN#;)JQ{Ewd7Ev!w;p1F-A6mv~-L?#z( z@ae!W3>f|NLojTUANrkAD4{n;>tH6}--&7SujRD#j-`VAgOUCQ!y7e>T>^%=rw940Z< zx4iBF=k@v#{Eu$%Mb?)d55LHJ;XmZ)8;SsfwZUcXJS01>UShGH4?MMUM)u~NC$4}Q z_g{#-mm9nr>?z2+W4ewms*N;RrNNsmywFY}D;y}MTFGKQ;;@eVC)tm>M(%Sd-$_e3 z-%$mu;(D1n%v1~e!JCol8wwvZbU$L7Gp50VROjO%cP2SdyyMzGuKWjDt)t^wB2a*p zJ3f=~(g=JEr{l?43jBv1*{QCc!Tp>rLYBH5vjzY@CfR+3Z;d>WeL})Lj^eXNa<^j; zg{TUFaERM4Dh!1L5c}h_^{2VEL0{XXWoPM|(F!&DPdDPBz)Um?+eowhIv%$kqnrt5$Dc~pug6xy z*sn-bL-PSh{ZYrfyUiqImvJDJ?<3oET`EE!83e*u=3`(#Twg=M_vwan>#K2HA@C&h zDel&LA@>CT2U*!IU$^3y_ftJ=$o;NGa*@eP7Wf`l&P1Wp+sVA$7PfO%$j`x24topF|{P--8J5WeaOj*ixnvus1M4#jAdp_S%f@9BC zN$~kL^cdA3&)n7e`gBYa&O2U0n3(*YJ2RZqPy8WARK-FITo_W;EldFGLg-ihukzUN=2;*8oO~2IC40(+>=q$? zoi2fPpK?Z*f{*NheL7%X^(wcPoj_^dEq6}jmK2U@m=sSy(C>XC=!o~R=nkI)H*Q%iy`|Z9h;t}e9OpGt8Z$$s!R@0{Rf5Q!J zH<152?mGqkDSH>kKeg-P`=`}iy#IeZ=&_6CUx~IG4{V(~NuryU_e2C3%w)x(WWx)c-egY?Wkhi=TAbjqoq^(v1hFnGXWuZtrBm{$B>6 zENQ8S?B4+&|AmmXNw~cv|3ZOYJg|-0B<)`Me_`Z*;bL8qZX+(Tq6{b)I{5!bO(jkL jSGuTAy67eT*ZHjv4=lVn3Aqg?NxbhHlvl_9+|vI6U}=Im diff --git a/Resources/REACT_Architecture.docx b/Resources/REACT_Architecture.docx index 372008b0fbedc5a2718e6cc35413a94b41ea5652..43434f63a01883d2f7b2f284a8b2173c0ca0373c 100644 GIT binary patch delta 25333 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 delta 24602 zcmV)UK(N2l%LAvz0}W710|XQR000O8!(BzO4Z{Hg!(BzQ(*Yg<1H)ZKv-AR$0RzKb zMYD_q>H&YlT}55pU4l_PT>t>!uL1xO0001YZ*pWWWN%}2ZDnqBE_iKh?Y&!b<4Ce5 z_`bg)tR9ZYXW@gmM4X)~Act&6iusWL_M2Q4;G{TN7=z{`r^x<3Er0g2c~sYwdFChk zx?z8EySEKJ-+kQO-hN5n!?<|I{EU*3j_JoeWwq8t>V6G>duQnLV1o-qkR2HzzmUD-*SU+!N_-CMk~`Tafeg+Nq9c!bxlf z;i!b$x4w;j9JrUw~8!+lRAL*?l=Xm4nnDgqilU zJk{!-yy0kH9ebJA^^8{M4E8&mXE;C4r~KdSJa^{idH(L;{Ea%(Mtd}4_15dE|M=hP zQylWSlucC9Q?Kd0Vc_A1kEeU;IBluFByoQ*_F{E3@Z$dBrL<>%7c@H0CXse?d80j? zbUW8C>lzxUPJgGRrXc-Wl3wRJxV?~;RA`i^{+OGrc^Wq_!l70Nfj7zs zI_eZSxgyNaF`#OHJiRzLt*areD#`|GM8^Yomg?qVlqvdn4NOgz2NN~&(k%4Dkrxw> zQ>U4trAM?Rqeg>&35f?$(hq$vQUQ^W>ZQq0{pzK|Fjiwi8+M>kSD^>&(T{P~P(DqP z;9*o4H@(qFb@jlz3Td}S%7p#ci;TP`8)!nl=V$7@$EzA9bP8)l&oq=5&=8@aWg2zj z7n69G;N<^l0Xf73jRSy%~??ur>T_re`Y5F8JWx91& zL=bCQ2BBm)%wtTC<~$Aw$rcAem=da@NvnWA!I)6j)!A6nBJ6FJG7dhTGIaRW4Mp20 zh-e!qS^z79cf=FE)Du-RS%LvPz7M2N zz>lv&dYCET%1c9#Vx4E?0qe~w_98n_r*g3qV($EZT7nRW(GhgV!Xm?$mU^E!FbZ(8 z4){y|yX>yqpXCjp1;XVli^gJD-m+BvX|G$ehsu7`)0Nzl{J!myvlzSysr}je- z8j_KJiACcLX-%cz(>}~Rb4m0@qiTRM8_B|=Qillvokqo=MiT~U7ua>GU=k;Eb>PX{2x7(?Y8l;5 zs-*x(%UhTVEI_AtPwj+gx89(wAJRJK_ge*j#f$+^W&#R$b8+$UoIysb()21b&rpQV zU^uIf!R~Fo%+-!P@`}}Of=RGCLtCUMNLdPU`nu910|VqFDGD=4%hn(ncA+rdo&<_ zT~cNA*idJ9a?ucGP#I$GjKG2N@x%EA?>{=RXg4mz4ei#Hn4ZdTZhA(Bukv%i#ltCA zpck58LI|-eis^>F0$9Z3v^ONOr(^z7kMMX&ikTdO-3e_(9B{%F2T2|UmVI~e^0-F_ zgfN@f8-iTv1o7zbphMPNgKidMvTkI5|5(g+qbXtL0^|QmC;CtB_TT8IY%(I**vqrz zC;CRp&35tg+a$T9YrQZv*-;YZ!WuoNJ}lg{aL>8 zqarpvJ#a)>ojj(BkA3<}ub0_9dv0aysjIs$pFCS|`Pt9Uo|G?k@5^KWU;ed!!}%pF zg3q1>#gpBqKU?v15EO!LM3j#kSoAAF*9)Ur5zxJTZaXd#+WEg*2*a5kEg*t+xuS=; zt|RQKn6~O;T->oXej1Lzutw zfzZ>4ttl`&k&aa1PAvt036jkL@6OMURqdVjVs-x49J<(f?z3lr6vN{Xyi~`&t~*;? zm`z&hv?tH$&%V}{c|zq2@R^b9Gf{g8Fyl;%Pz zb3&R3+c25&%2m_y&6TR1vl+5U${t}NuuqtJL&1AR%cjkh45LYZLy@2XLBtQ?g2i?c z6w+m}z>qRVYi6T?p=lAU*sc)v>^s80iE)Nlwt7X{XdFPEk=GegVn-wFU|2mTR~8NqZ*KqG+})|~(_{WXh{5+#;##nz z=B8@TopkKAt#W-^s#d(^=|a27I&q@xmuKs^CmE9@%lelgP)6K7SbH`CJ7f}MzH@wV z`t~oKql1sC_PkE}`!hB`bCBe;C!z%2m)CGAc>Z7^Cv3=1xK;IaMjIm|Ma013Myt_z z2EWD@8@yZ>EQw)p zw*zb$hY>$wk+=rOAN%_nmS?;qp0P)~W*9P)D+UjL#Z7_5(ae&e2CMG_BJA=h280MZ9x$bgjfEAj{a5U1vKK~9RxSs`l>{TG}_^|SZa`LzV zis=@Q)aXta1R2l*cJ+K4?m9WKFrfxOp2uEn#%yc{7;}Ca_XJ)T!5V9_rah;8Z$!AH zlQv0z1Lr+Cl1+Z*#=X=NIU|bWht3yz9o|W20sVlLx71r4SM!gj*fo3@hzXa$6q24z zgY}ZMfi=l5#Zfm(i0IfYN$+<6ad4=M`Xah?;2 zmV_pt^eo=_xTd3NL^STj8tyDY*%Gyz?3d?%tJV*$@j!^*Vbzm6b}rkhv_spr!U4BR z%gqN+iI6!|+M1^_J%r~Qq*Mrk*mWc=nPHeY)-xob!6SMA2gL7ICYf>sIwzj0ot_xbn#;Sj_O>l_HyHS|bzI^MZo2*TQFh;@<`b2+6m%kS zF|!l`KV0PHF@1!I>XXrF3oq>OGfQQEt1nm0xm*Mj@sVTC47!Pz5=XKg$pZwktllzo z+CDoVX)z9o(HSOHdr;y;h8xqkNC2m5wVjK!at8#C(tS(XA(1}GW#@mkp&!b-A|Zs` z$Iwiph=@avO&Og+96TArwCTXaF(}&cb(vJ?K^ClaJ!0A^iK#HptG+ifx8T2j_#^(( zN(@*PO1BR2n{%imh;h%1JfAQF-4k;2Prv*I5ibc42zP&EutS9D7Z zy~V~Qlva!)7O7(WV11r&>Gg}~2p)p;>Egv@tPsvQ1YTfZHp@6RqiVw>fdt0p08&F@ zo%SI?i?FPb~}{DiLeNgYFQQ!EA`8oIXg{13a&{_x~^ zz5PVJQoGMu&tDJ=g`t71JC(^}zIgg+L(yyTuNt#Qe-i2_sJ?WkwcS#GZ^HgSu8_%M3PB~mtKT8DQmQm5EPC|NW&ol+9Wnk1*uG1HltNp3*nizl8j<_tK^VsW`muG z9?NJR34kCvAWc5>I3}wQ#C1$`L9lceI&z^kn$&G%mlKK#-Jq3pneKzm(3pV31!rX_ z7n0_5b2_mkM1sYy&<1;dk*Lo{4me5Zi?-$w$i{TVGkMDHwOa5}I5RaR1O>{5|+tSs4IbpNk%x<5)*XXF% zl)Vgm(PpkUiX}{g#XT}0rEo#`q&-fExQmz@fFsN>1jrWJJh6mk1+*Lo*!l*p`URT# zQs5of)eK$-lTku*hW^Q07yGOd09xKWZMHGQA_rlY2;YTVfuRvb0SLF!JwSsko^*%? zDXFev_arrh6o1}-NJHAF_@P4wH1ykgL!M#Uur^Yr^BrY)WRr^xb3M;UCXGygww6;8a1V zB~WZ*+xEVH!iegdMZIG;8R;GfgdTQ@dDB5w+-FLYQIPW~SOn)5tV^u>s>Uc3x@6)- z2x#IifQ(pw@g}@X(=JZkX}VPNWGFI#dq+l!lO@N>Av+t_hush~ENKS~>ssflj43wx z#u*$iMa-c$g~>Z06T~}CZ7v7$64>%{8zH(ZQr-mpso+Ebd`q3U9XB-)Y-l5r%3(mM zqSXFe)2)7M4rZlEREdVj+HgFtwXQqcu#MG!rnkl{m`t%qE5k7Nf!7EcK#Aci z#1himqiYOrUkl|Yb(U^AB)K^7I6xB>jd=Pj{a68anoOAket}NG!Gztv|8SwILFhim zMebX9#z`|c!<>!M30@Fg9TpQGfzKp8(T(_><}w@^XXG7uAq!Annr3@yjxG>(E(qF^ zN++a$Wt?Xs&W6BtkjDY<0V~oH-(S9LIFHir@$gMG3;VX7~#X!tA1yU+t0U zej-U2$vgnmVRd6#5Z7ULoIy{GO)AVz!Joo^m`<=V611k3sH@T7+y7^ z;Gq?AcogeRvq>4wsbkmAFNV?+33x0M;cZ%kDV490t)}B%LIlW83C{&~4-=YgGx8>X z^m?MQkRXs)tf%^SPFI2(r#Mze-Xu!AfJgMg7$_xJ;SW?Jnp!0Mi&@pPZ8`xw2&W{s zH|Tt41n|M<`yrUATR^0}OIVL@V;KI*O#;Ua4cY1DseymoiA`1?n3ksnnQ^yZAhX?6o{E&TU*6B#o@vjnd9Z&S|fD7Dp-6HHEoAK!NzQ=6>lV zqj#wj7n(rYNPK6MvD5`1*dOA5E(|J?;j2k0BZ23Szg>X7pl1ESxqxj}z?#$Bx{?!7 z3*A3xGZ5Prq-#hu@M#OWp)`CRv0b7<4m|(0r-5Hj)|do_dM)w(S|iV&_4W!|2>7tE z&ihfC(970LIQXblOgug2u)d<^&%?=*)%mi8ph-n8U%v(VJE8$@|3hcghS?n6tKU7-Tz$#ANT~4FRnyz~>!q_ix4~ z0<+f#ks`(;u4@p&Z9P$cwKC?mE!Fjwh{O9wk;MQ<*WdF%rHX{ns$u^ws()H_svfnq z>45+JO3lNiqT}AhBa4qRRpFjTJ7?!&HC2KGE;Bu>nYwtV*`Zv?!KhVW&t5@^YO~oC zX&Q1UjzmLre2(e=SI(YnxFn)R@w@qN|NYHg@=RZGu zsq5h?XOb}UAm`5cB~1>dsGS=AhGd*N!jzI;L10g|*|dw$hA_zu-TixRNc1;V>#xhQ zoY*XXiy zp~?HIt9uevi@1AaAxp@BWgrr^Ajye>iLLWcf@CVGR$Ho@XBlE9ZA|$&2R1cSr*nMr z=T3(MV(PHh1PIdt2h)Th2~?V{CMi*FoLU^=x3PM<{lrv%Qh{SV25UlSJx9K(Ls@|F zuDIqW?m=b_L_DbU#v!b|fN8Z0Y~kkuRe)lrNF88!b&S{3{hU}Ohg?Wb2vHMpSOi?+ zjTS@Gp`9QggdNY8lW5#f0^(J*1Vp0}rbH7&JPA*OONP!BqiCtul6#N6v9sOW-fu3_=DBeT8E{Tb$30Jn#mEk&20B7zlNuMJ!~&f_)^Ifj zfJD0Pr6|V1F(q`_3uMR&F&5TWw}YFNV9$p7baB)~HIKjMDEL#P6d(}L&f&UEgSC_? zgzHuBX&oecIULqawim{-Cer;f#L4NT)_We!CM3Im6gE+an?<5*5x^#845|sWHOHrl z^oUAA(<2b_9;|7t47DBHhnr@pixC!JOK8101DhWqi?(C~8w1Vt_!j|Z?Krwcrxm}J zh0=|N_?6Tnf%*?}6{lRhaxVW=qQW_TyEKWc75`WZZ(d0PI_`UYDFD3cSy`0A2-%)4 zX;w~ua)aQnMX*$PT?6DoK_tbo(ruxeN2qg!`OQ^vZA_JIZGbAoz*05U*tFZ%q0~5P zmo8!H2(nDQVF_M=;`nS=GeYiLf2h_7g43)G-M}d?&Z^PVNFXaFxR2|-9`dvPOS32> z(>(Zi+WeEAuv6i&xok@0SY@dxnRfS$p6N<|H-)D5hXqXY9&m&|b2V!2FZ1U~>#N(p zEu6*fcg+IA_VwddUnU*pDtz(h*>@c!>1+lwJk>3AWZgDpEKAjb$mQ=wMPaMO$yl2d zsB15`$3IvKl%Qh;qW*d;|AH3s!!G`P0zXAt9TiEwYb7vS+r`Qy)b}eF+drP2zB@R7 z`-}S1$zSdTL(8q_kGR?u?78os`JWHYj@}%c)pnmfUBjxKw~2jwfBG+{CXZ}K&KKwqb1d~JWiqC_#5XqLQ_u##wddc5&7eC6f#c;jb(SPoZS zkL7Rt4D0J>*ti%Tn~UL&Jx9w8V7xn8SZ=)bpSa^5*W#&(qhY-Qw6AFuzv_+WRMzKr z=TrLDsjQ)Uh_q43CSEmc?pUo{y@t4a$52sO<3aMbyH-cnz_2i2XzmcIdTRM*89TQQ}`JFSznzAL{2!L4lp^h8l+bRARwN z)O~?=$96Ku(&TZP@N8ob>GLworDd12x!|;LWY{KoCP}ICt0z;TtEh?ZdohZhchS2A zEz)q5NUU*R$2rQZ$4T4-Kw36nj|Z>SY3`#@n+v2HZa!v{ggsWg83^2eWnpH%!$evv zq+>4)8l1iAnr%rN%(-}ORg-EBueRjEmh?H}azJWPJ)ZIbo8wJDB!PV(J&L3sg$}t} zGN)o2WX6YFA~DFNb7GbtE0`PJy!UC>fs-A#+cayzAO5RpRu~P8*%Ni=JLS z0g7K}5_>Cmb;O*cKZ47DT4YRl$P1SgM1H!4M%8}8z0$o%rx~{apX(uqU$~0BN<(wm z;r4ypOd$=sdB$x8s%@fsk=N%YgPH?sr-}v;GP#Aoi(Q3Y=dPJ}8Kb!|kbLFk?=_Iz z#3{Q=wpM)KT<+3z@O?Ac=<#2e!4IIvuZc?jfH5?sD0443I_nXCG^M5lDYIVMbI}xa z;}|OVO&sXY8u>EP7>Zj2u|OgsBSTDtQ`>@^Ti&e|T1EC-H6#nS{qvREK%CgDYK41C zt`Hg<3*>EXF6%_+qTbr|;`Vy&>if~lANs~diMyhkvn>?LTe_@?;+dj&QDvX66>e>H zg$^{$Z1tfzYjE;^PT^I$g%T276$%R{>1gJdc-PDP0T=nYjFa(~5sW|9q{9Dvr7`99 zp#TGqD8Ih_@J7qM z_Hui?2?O{JM)2U4zX=1_m=D(ah}?t$tjXLTK^VYV?e0Q7_pnF~(WqYdcrNc1pxOk_p(OJJe4B+;fs}z5{ zW3Ba9UUN}cl3lsA?SK6J-;vB)YO$oZK55d8d8U;fCH}y))W5mD&9uF-RQR){dS|@ZuHxYe!J0c?}p->ybPK4 zL2j7`tLS37R)ewQGQ7>eqFF~ktK@@vt1 zu%#{rsn#meeb1k$9irM7>TP(b5uYCFC@_dkNzna&jM+&;=~$=zNnMSi-1akbZ5z>1 zP<6fd(zY5Ty%~+LaJf?qsA`6WqcwD_5mdiRC*o$dU8?ecev5dzw+`%KmV~*)Qx_= z(a$%3`uRpb-{|K{uaU+*Ki41wVvX|6NpKu-2ia8jNX(3HQez& z6a&%~V&$j$#u~IM*#Dv+1)Dhg$~;^=_9NK!+=1mm?wfnay;N;ZL!B7do@A1)y$W&&3 zEw$SRL>qpdraI1|i5iA!nxsa3&E{Ky>I%Q%s#V3ijv@Hgc~l*%YrbJ`9a^$}JLa(m zmE1cOee1*|C}7o_>_KjJ{JDc-igOVa3kEJ<-mW}Zt>SO;Zu76XR4pl^I8fe@wB(`! z;>o*%LX&B!6VD&0Ly7*V9b)Z=FY8i&F|nJ+0o{*c2`GN&MNaP^4(wuIFFU+15rSL@d+yGLKZT)@WjNu%hUq$r5^xLK#1q{M@1%{C>PPvlRkS zr~!5$0&%W8|H+nhL;*n?2Eze#C`IT^6ul;$NPS0A?;?+87w1ErhCWwYq*1+pXkutS zB=exo;3lx-D=)Xl-xpYNjUcszx_nD0xVPF+gnN%Pxc@+c6_vTO-1*@{&sxJ4M1P6WUvueR7EQjiZSNidP7JzJ=gt>UaNpJQ zvR@*Rq}o=1?D&HOwb9yYm`7PyekEC|OR#UNi8h^hsgy6`pB3gFJfog699ih2e6|I! z@R%DE`1^vdV0uY(eczEvvljj-+6J_RidPNoJG0YVGu9u^KfFI&CZMN(n1%(eszsrZ zvV0lJz2Bk=F8+K+$vqP4t`M^oc#G^Fi&gD|U>L?t9fY=n08XF4OEK+Fua$wyXbZ*1 znL;~kQiS^+UpsuFYQLh`FAB};&skmS4T>`EQZPsvAC9sK5*)0{ngK@7#?Ze}GGBWs zs@`W|WP1oeQRnsu&|leqg^7VTitATiZjU#L>qc>Xbc$8 zq#YfRE|}@y54Pfe*&yr>TIxI>jqp_m%7xFH*-pT_JM}%amF961jcIinCc#!iZ3UsN z2b>VcNm0VL*7b~z!dTa@`F-fBEY-IjK0hLudYRL?ALO2X&{4kkn%?}ald^m3?&)G( zP`sAdS}NV$ZIIeVA-TOmLXbyGSM>R`F4&Zg7IyEtvunM7`ac$3U5Cc3Txogz_QS!- z*}%K=^J8_Dkj4^5VK%X?1b|9s;YOw1htDL8jsu%0{~&kV;fD`zPY&Kc$hp7vBBSBv zAVnofq97TgbV1;S(M0*)NOhyczhrqg3gIJZz!k!`S2+nc6*i@G+?_}nPmzM@ee=>S zN_M&@=nYnX7g;Zsbho8czFR+9eMe$f-~JIJ)$H2U`rUZ zktCy2&qrmH+E#h*mU^WIItn;32jp`-=`_@g!u7PFhG9Pyzuors)1TLih}<6OaH93b zAXlA=1W~XljxakMC7F)>iMrI2eYjp)BhBIW&8L$y8Nepw!c>BO}#ishT-3s z{BVkOy)GZutA_1bh%h6`frEKmq5*x{1gaN>BgiqFpirD4yg&BU`%iD*$_Z0pCAImZ z0`|4_+Ue7z5TxD>brgOe8u%24*vqx;#!g)UDpedK^fXN(J{jmh>4yknt)3!lg<)qn zm3~}*s|M`y@?EB4r3o)m^Bnv6&Do#ZCenIjdz2YYk3Aw(dRrtCj?A9Q?>O{#HW>OxiLoz{{k1~i29&&eBNy-i^qo1slJF02B({96gS~ip!1+`YGsX15htY%TD_rv zY{NAs+IMFc%!ZmIwT48|sJ9Z{l)?B=sB)B>L1$CreZ?Mi$^(Z@bSE7Y_NniyN7E%R&{v_aJEX(u@M;r*wnpU1)v1zhh+L|bf_wP zkjf&_QEQS0I(S4hI&)e)NEEMi!TzuCbYAb!>6mAn(61R$9RfJAoU3hurOpeXLYfbsBHf{m)FC92S{BoBQ zJ7St@UYVwgej(T@Ga^7XRF7y$`ag9J&fay-4&EPscz60=4=zqWyzhKG`*3)0c>4DA z;x8~N3M1QYJ*!tq5-&rs5+=b1NLF_lIQ2u&(>aH~H0j9dYc&^b)j%D8oIddyqeos! zry6l5CbD^`qe49nIk2muK@gXnBrGwpLYULNp7t|C+C{9oTI$pPjYDe!4YiqLdLAx8 zx-vllS1n#c>&qQ`itln_Cn6dpIoFp&ePqCJ%h)JT=QVbX9!erfB{PW|K8!sRZ;{SW zG&iHi+!ORFSC~@OKvO?|@h?PupwcKA|1^KP{@mPtvG!EQJtNQqk|?jA-0Yy-5Z>Ix z-rBGQ8=$F5FcNhoB$b_g_;hjl{@2dM+3Bypo}6{gKD|9TuS5)T0t?ZV>4h-XX|8$7 z!4O03#fJEowDowH)Mddj>3o3&uWp9-kd$zzBAW$ZRR<&zaFs)UKs_Sy<7AyV`(8OI z&t*D*RZandP%u?GfU_akC)ChPRVY)jR=$WI0!H=8g;%7GX^gdmlD((%ZN8hAK9 z%TO;%)h%_VO%h#yRmtxq(?*LMm1`Bam2q>;6@ z$IYAD_PHiXha@-tIO9Iu)+}grDh>?RImsT>u;xkbX;r&n z=G;<;JSnN}Npznuji$*M0b_oYv%@cmwZucnh$NEI414N-_dMvcj^k#4YA_@Y(9_U_ zQhJ?rt9WrR=W3bCbgbQwxwy|=z6>`n^MWRul58?9+XU3X$5VLBLoW*drqg|rVDcCS zN@QIG-UJog-{}m^!;X=|+bRd{#4UAd$)QCB})OIZ>8W>xTMtanuBAX}awqN85zMJQ7fcF}=$R8jGOkz{4!QumI4lgxRKhF?XQb z7tEkLANDLX{088sdO+cqxi3a z7&XLyE+h>$?Ri8|T|Mv!cR1d-FtBNGo)E(Z+=u#NbtK?hJk%1QJ1zzSU*1!lS;C8~-dRZ~2BeBpld#TpKdoc{t z#p&505yM~eFxB9#d*vI4L;=iaAf}@GAdifHc8R&{Wh0d3R4Sr)QRmGyCG=YAf|dND z>M5!v>zFvR50cM#LC3#)ai4UmgqEu!Z{pe`d3bk76LXy-QvEwyo1_OvIc+-y{n^)= z8TYeo0-+@;;5h)RU6Q?tb_eP3}rZqXj|CxN50m1+5C8a z$$x`tap_u7ySk1=)5ggOI7K8AVK?!)#WKRo)T=6aG>X6_`AMRn_$L}Siion1XXmA~ ze^U-^4u~pzD7ifxm?~#@V}@oD`=A>|UT%-qpa^!AFLv8=T=$w9$8&sm4eMLq z(aP4YboCvrYg3i_3o}@Q{JKq5>NT1B11|!%c2%iM@nqFoY>lem{3?RlmxZ*4&kLl# zUACH|_3nb;*3wIHi}@dkCjvFOt`gtt=8>09_C$+>tqQSj4f|E}(BiAfyF;{p(xD4( z6Y~S*R~@fcv6hPNwdx&y*V#JXjQ@&#qEJ&GQEEa(r+$$8^Fe2Iol7E@OU|m$mzXY0 z)lz|)fQ2RF5tImk0Z_-C*t@A9>l)Ahp`UE;ZA#(3vc1_EAL7X2*0((_|Aeq1m)hko zIt<0$_wjVSs+FK=N$gKLcNdO-wgw8(_oF)1qiE80{q2>75^Ux}BCAl!f<1yt56>NU`|y-Oje`7xoQ? zh;kT01YBe)DBs<#JXm#pZE=mKERh&Z1rI-$67c*i_aa&&H_B8epF<;mHCh7p%=GgR zH*uI}=!YXOMva1m{rTc@wLzUh7$6)}cDeP(B(W}T7VwpiWbE;f!O=4Fffy1ZcV4o&zYZ~(!i2$!O2M2N#feoLI(MJmT zm^A5(V-RC6BN`xJYs!y1Q8ds8=^42G)jAz!xDk%3hu+g%pjEuF9Wd@2r4(1`2=7lw-{3gI44YIi#pS2tByJW;C}+zBzvo8coQi-w z&xdIeE}aPp!=7Zo+leWbT`Aox3IMs`#+#O|}O6+@h&~ ziX?h+TzSn#LAWR$mcHWTdb#cq^qAiS^Q>bq54u%|cF^F@g}x(ST_k_dm{OiP8EHy$ z7mH`tiYsk@0(&-rJr8WJKFYwJFOn7he21Ab`=!VT?nT}W*2fv|N1(_Uve+vEMet;-eeO zqUs`>5~Zb3P?<0Cqf@EgIP_xnFtfcb)xZ%+Tn5Dra$8*7)hN(mVdf-23^ASmLI0x4 z!N?7NSOB#%MRrCtn>|nhnvjmXY=9P|>c2IcK{{!sdHmo1hf3tlTc`Y<5~MQME!Zuy zgx$$g0N@uLI|`MtYVP}M`pUPpW@mR5>T$hcG7Xv?tkpUW+9VgWi(ln`Zi1Ouza1^(aFv&u(N;@MCHfqhXQl=w=M8OBI| zryOj6h_h$v-67Jq_f_k2WIl5-G;D9KEn07IuD=295V@p>sLA25XuKf-6P^S<0R*@2zEn~e8&X~ya+=g@7JcG+Uqt2SBf_XLy*z+ zut979_x9ru#oh!(!Y%UHl@zHmxYJ{QQ;nUe?5Wvg?X}vuvA5 z+O+79b+Z?UiNQi&^|4#MX)XYN2h9<#tburK5ZNLd4a>6Y1;x?iLNqY4ys!l%cI<|$ zfi+>X1D4GwyyW<}EKdnZz0@P-KZGgzflM8|AG*l!=26*3MLTGfAvZcw?Evq-4gNr zMFTf@TwbtaXoJzUXIN5s)r&u)go6B1)1Pqy*-Y>zJv*##d@Nsi zxjo+aSk`}K8z0NY$FlLUYB84rKU z+k#IIa_clGBHszBlB8Ne$J1OOl{N>ZbN{c?9Y}2kJm44b5dmpW0L1olcaDof_0o-QCV0 z><_FO)WGkh22}lORiBo6f35PdR(wtL#f^`qn8#e7;z#74foE|eຊ?$45X9!K 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