From e0f42820759ef127d5e653db1f27e40b0597d979 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Nov 2026 04:18:53 +0000 Subject: [PATCH 01/17] chore(deps): bump pyasn1 in /tools in the pip group across 1 directory Bumps the pip group with 1 update in the /tools directory: [pyasn1](https://github.com/pyasn1/pyasn1). Updates `pyasn1` from 0.6.4 to 0.6.5 - [Release notes](https://github.com/pyasn1/pyasn1/releases) - [Changelog](https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst) - [Commits](https://github.com/pyasn1/pyasn1/compare/v0.6.4...v0.6.5) --- updated-dependencies: - dependency-name: pyasn1 dependency-version: 0.6.5 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] --- tools/play-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/play-requirements.txt b/tools/play-requirements.txt index e898f44c..c4cedff0 100644 --- a/tools/play-requirements.txt +++ b/tools/play-requirements.txt @@ -4,7 +4,7 @@ charset-normalizer==3.5.2 cryptography==50.0.2 google-auth==2.61.0 idna==3.20 -pyasn1==0.6.4 +pyasn1==0.6.5 pyasn1_modules==0.4.2 pycparser==3.11 requests==2.34.2 From 9ca434d1d9bf3a840af52f88b390e461c8c82df9 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Mon, 2 Nov 2026 00:55:16 +0200 Subject: [PATCH 02/17] Polish folder layouts and align library page titles Refs #117 --- app/lib/pages/catalogs_page.dart | 31 ++-- app/lib/pages/watched_folders_page.dart | 22 +-- .../add_book/connect_folder_sheet.dart | 73 ++++++---- .../widgets/folders/folder_details_sheet.dart | 133 ++++++++++++------ app/lib/widgets/folders/folder_status.dart | 47 ++++--- .../folders/folder_subfolders_switch.dart | 18 ++- app/lib/widgets/folders/folder_table.dart | 52 +++---- .../widgets/library/library_page_header.dart | 36 +++++ .../folders/connect_folder_flow_test.dart | 35 ++++- .../folders/watched_folders_page_test.dart | 91 ++++++++++-- app/test/opds/catalogs_page_test.dart | 12 +- app/test/opds/layout_test.dart | 2 +- .../folders-catalogs/catalogs-desktop.png | Bin 0 -> 55343 bytes .../folders-catalogs/catalogs-mobile.png | Bin 0 -> 27174 bytes .../folders-catalogs/details-mobile.png | Bin 0 -> 58620 bytes docs/images/folders-catalogs/edit-desktop.png | Bin 0 -> 45452 bytes .../folders-catalogs/folders-desktop.png | Bin 0 -> 39450 bytes .../folders-catalogs/folders-mobile.png | Bin 0 -> 38910 bytes .../folders-catalogs/reconnect-desktop.png | Bin 0 -> 67804 bytes 19 files changed, 381 insertions(+), 171 deletions(-) create mode 100644 docs/images/folders-catalogs/catalogs-desktop.png create mode 100644 docs/images/folders-catalogs/catalogs-mobile.png create mode 100644 docs/images/folders-catalogs/details-mobile.png create mode 100644 docs/images/folders-catalogs/edit-desktop.png create mode 100644 docs/images/folders-catalogs/folders-desktop.png create mode 100644 docs/images/folders-catalogs/folders-mobile.png create mode 100644 docs/images/folders-catalogs/reconnect-desktop.png diff --git a/app/lib/pages/catalogs_page.dart b/app/lib/pages/catalogs_page.dart index d200026c..46494c74 100644 --- a/app/lib/pages/catalogs_page.dart +++ b/app/lib/pages/catalogs_page.dart @@ -296,14 +296,19 @@ class _CatalogsPageState extends State { onRetry: (job) => unawaited(retryOpdsDownload(context, job)), ); - if (mobile) { - if (widget.catalogId == null) { - return LibraryMobileToolbar( - onMenuPressed: () => openAppDrawer(context, Scaffold.maybeOf(context)), - actions: [downloadsButton], - ); - } + if (widget.catalogId == null) { + return LibraryCollectionHeader( + title: 'Catalogs', + onMenuPressed: () => openAppDrawer(context, Scaffold.maybeOf(context)), + actions: [ + downloadsButton, + if (!mobile) + LibraryAddButton(label: 'Add catalog', onPressed: catalogs.scope == null ? null : () => _edit(catalogs)), + ], + ); + } + if (mobile) { return LibraryPageHeader( compact: true, key: const Key('catalog-mobile-header'), @@ -321,18 +326,6 @@ class _CatalogsPageState extends State { ); } - if (widget.catalogId == null) { - return Padding( - padding: const EdgeInsets.only(top: Spacing.lg, left: Spacing.lg, right: Spacing.lg), - child: LibraryToolbar( - actions: [ - downloadsButton, - LibraryAddButton(label: 'Add catalog', onPressed: catalogs.scope == null ? null : () => _edit(catalogs)), - ], - ), - ); - } - return LibraryPageHeader( title: catalog?.name ?? 'Catalogs', dividerKey: const Key('catalog-header-divider'), diff --git a/app/lib/pages/watched_folders_page.dart b/app/lib/pages/watched_folders_page.dart index 14ff4416..8fc78f6d 100644 --- a/app/lib/pages/watched_folders_page.dart +++ b/app/lib/pages/watched_folders_page.dart @@ -103,22 +103,12 @@ class _WatchedFoldersPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - if (desktop) - Padding( - padding: EdgeInsets.fromLTRB(padding, Spacing.lg, padding, Spacing.md), - child: ConstrainedBox( - constraints: const BoxConstraints(minHeight: TouchTargets.desktopRecommended), - child: LibraryToolbar( - search: Text('Folders', style: Theme.of(context).textTheme.headlineSmall), - actions: [if (!empty) LibraryAddButton(label: label, onPressed: onConnect)], - ), - ), - ) - else - LibraryMobileToolbar( - search: Text('Folders', style: Theme.of(context).textTheme.titleLarge), - onMenuPressed: () => openAppDrawer(context, Scaffold.maybeOf(context)), - ), + LibraryCollectionHeader( + title: 'Folders', + onMenuPressed: () => openAppDrawer(context, Scaffold.maybeOf(context)), + actions: [if (desktop && !empty) LibraryAddButton(label: label, onPressed: onConnect)], + ), + if (desktop) const SizedBox(height: Spacing.md), if (error != null) Padding( padding: EdgeInsets.symmetric(horizontal: padding, vertical: Spacing.sm), diff --git a/app/lib/widgets/add_book/connect_folder_sheet.dart b/app/lib/widgets/add_book/connect_folder_sheet.dart index 166f4cf5..04bc3229 100644 --- a/app/lib/widgets/add_book/connect_folder_sheet.dart +++ b/app/lib/widgets/add_book/connect_folder_sheet.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/folders/directory_access.dart'; @@ -46,7 +48,7 @@ Future connectBookFolder(BuildContext context, {Future? afterDism context, builder: (context) => FolderSheet( title: 'Could not connect folder', - body: Text('$error'), + body: Text(_folderErrorMessage(error)), footer: BottomSheetActions( primary: OutlinedButton(onPressed: () => Navigator.pop(context), child: const Text('Close')), ), @@ -77,26 +79,36 @@ class _ConnectFolderSheetState extends State { FolderPreview? _preview; String? _error; bool _saving = false; - bool _scanning = false; + bool _showScanProgress = false; + Timer? _scanProgressTimer; + late Future _pendingScan; int _revision = 0; @override void initState() { super.initState(); - _scan(); + _startScan(); } @override void dispose() { + _scanProgressTimer?.cancel(); _name.dispose(); super.dispose(); } + void _startScan() { + _pendingScan = _scan(); + } + Future _scan() async { final revision = ++_revision; - setState(() { - _scanning = true; - _error = null; + _scanProgressTimer?.cancel(); + setState(() => _error = null); + _scanProgressTimer = Timer(AnimationDurations.standard, () { + if (mounted && revision == _revision) { + setState(() => _showScanProgress = true); + } }); try { @@ -107,16 +119,18 @@ class _ConnectFolderSheetState extends State { ); if (mounted && revision == _revision) { + _scanProgressTimer?.cancel(); setState(() { _preview = preview; - _scanning = false; + _showScanProgress = false; }); } } catch (error) { if (mounted && revision == _revision) { + _scanProgressTimer?.cancel(); setState(() { - _error = '$error'; - _scanning = false; + _error = _folderErrorMessage(error); + _showScanProgress = false; }); } } @@ -126,6 +140,18 @@ class _ConnectFolderSheetState extends State { setState(() => _saving = true); try { + // A quick recheck keeps the action available, but must finish before importing. + await _pendingScan; + + if (!mounted) { + return; + } + + if (_error != null || _preview == null) { + setState(() => _saving = false); + return; + } + if (widget.scope != widget.folders.scope) { throw StateError('The selected library changed. Choose this folder again.'); } @@ -139,7 +165,7 @@ class _ConnectFolderSheetState extends State { if (mounted) { setState(() { _saving = false; - _error = '$error'; + _error = _folderErrorMessage(error); }); } } @@ -153,7 +179,8 @@ class _ConnectFolderSheetState extends State { final textTheme = Theme.of(context).textTheme; final secondaryStyle = textTheme.bodyMedium?.copyWith(color: colors.onSurfaceVariant); final problemCount = (preview?.unsupported ?? 0) + (preview?.inaccessible ?? 0); - final canImport = !_saving && !_scanning && preview != null && _error == null && _name.text.trim().isNotEmpty; + final canImport = + !_saving && !_showScanProgress && preview != null && _error == null && _name.text.trim().isNotEmpty; return FolderSheet( title: widget.grant.persistent ? 'Connect folder' : 'Import folder', @@ -162,6 +189,13 @@ class _ConnectFolderSheetState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + if (_error != null) ...[ + Semantics( + liveRegion: true, + child: Text(_error!, style: TextStyle(color: colors.error)), + ), + const SizedBox(height: Spacing.md), + ], FolderLocationField(grant: widget.grant), const SizedBox(height: Spacing.md), TextField( @@ -182,13 +216,13 @@ class _ConnectFolderSheetState extends State { ? null : (value) { setState(() => _recursive = value); - _scan(); + _startScan(); }, ), const Divider(height: Spacing.lg), SizedBox( height: Spacing.xs, - child: _scanning + child: _showScanProgress ? const AppLinearProgressIndicator(semanticsLabel: 'Checking folder', minHeight: Spacing.xs) : null, ), @@ -216,17 +250,6 @@ class _ConnectFolderSheetState extends State { Text('Select this folder again to import new books.', style: secondaryStyle), ], ], - if (_error != null) ...[ - const SizedBox(height: Spacing.md), - Semantics( - liveRegion: true, - child: Text(_error!, style: TextStyle(color: colors.error)), - ), - Align( - alignment: Alignment.centerLeft, - child: TextButton(onPressed: _saving ? null : _scan, child: const Text('Check folder again')), - ), - ], ], ), footer: BottomSheetFormActions( @@ -238,6 +261,8 @@ class _ConnectFolderSheetState extends State { } } +String _folderErrorMessage(Object error) => error is StateError ? error.message : '$error'; + String _previewSize(FolderPreview? preview) { if (preview == null) { return '—'; diff --git a/app/lib/widgets/folders/folder_details_sheet.dart b/app/lib/widgets/folders/folder_details_sheet.dart index 56871212..3b7bcf4d 100644 --- a/app/lib/widgets/folders/folder_details_sheet.dart +++ b/app/lib/widgets/folders/folder_details_sheet.dart @@ -173,28 +173,60 @@ class _FolderDetailsSheetState extends State { color: theme.colorScheme.surfaceContainerHighest.withValues(alpha: 0.3), shape: theme.cardTheme.shape ?? const RoundedRectangleBorder(), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Wrap( - spacing: Spacing.md, - runSpacing: Spacing.xs, - crossAxisAlignment: WrapCrossAlignment.center, + child: LayoutBuilder( + builder: (context, constraints) { + final status = Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - FolderStatusLabel(folder: folder, shelfMissing: shelfMissing), - if (recovery != null) - TextButton( - onPressed: enabled ? () => _action(recovery.$2) : null, - child: Text(recovery.$1), + FolderStatusLabel( + folder: folder, + shelfMissing: shelfMissing, + reserveHeight: recovery == null, + ), + if (folder.error != null) + Padding( + padding: const EdgeInsets.only(top: Spacing.sm), + child: Text(folder.error!, style: secondary), ), ], - ), - if (folder.error != null) - Padding( - padding: const EdgeInsets.only(bottom: Spacing.sm), - child: Text(folder.error!, style: secondary), + ); + + if (recovery == null) { + return status; + } + + final action = FilledButton( + style: FilledButton.styleFrom( + minimumSize: const Size(0, TouchTargets.mobileRecommended), + padding: const EdgeInsets.symmetric( + horizontal: Spacing.buttonPaddingHorizontal, + vertical: Spacing.sm, + ), ), - ], + onPressed: enabled ? () => _action(recovery.$2) : null, + child: Text(recovery.$1, textAlign: TextAlign.center), + ); + + if (constraints.maxWidth < MediaQuery.textScalerOf(context).scale(280)) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + status, + const SizedBox(height: Spacing.sm), + Align(alignment: Alignment.centerRight, child: action), + ], + ); + } + + return Row( + children: [ + Expanded(child: status), + const SizedBox(width: Spacing.md), + action, + ], + ); + }, ), ), FolderProgressBar(folder: folder), @@ -221,20 +253,36 @@ class _FolderDetailsSheetState extends State { const SizedBox(height: Spacing.md), const Divider(height: 1), const SizedBox(height: Spacing.md), - Wrap( - spacing: Spacing.xl, - runSpacing: Spacing.sm, - children: [ - _FolderProperty( - label: 'Destination shelf', - value: shelfMissing ? 'Unavailable' : shelf?.name ?? 'No shelf', - ), - _FolderProperty(label: 'Subfolders', value: folder.recursive ? 'Included' : 'Excluded'), - _FolderProperty( - label: 'Last successful check', - value: folderLastChecked(folder, includeLabel: false), - ), - ], + LayoutBuilder( + builder: (context, constraints) { + final singleRow = constraints.maxWidth >= MediaQuery.textScalerOf(context).scale(280); + final width = singleRow ? (constraints.maxWidth - Spacing.sm * 2) / 3 : constraints.maxWidth; + + return Wrap( + spacing: Spacing.sm, + runSpacing: Spacing.sm, + children: [ + SizedBox( + width: width, + child: _FolderProperty( + label: 'Shelf', + value: shelfMissing ? 'Unavailable' : shelf?.name ?? 'No shelf', + ), + ), + SizedBox( + width: width, + child: _FolderProperty(label: 'Subfolders', value: folder.recursive ? 'Included' : 'Excluded'), + ), + SizedBox( + width: width, + child: _FolderProperty( + label: 'Last checked', + value: folderLastChecked(folder, includeLabel: false), + ), + ), + ], + ); + }, ), if (!guest && pending > 0) ...[ const SizedBox(height: Spacing.sm), @@ -267,19 +315,14 @@ class _FolderProperty extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); - return IntrinsicWidth( - child: Padding( - padding: const EdgeInsets.only(bottom: Spacing.sm), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(label, style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurfaceVariant)), - const SizedBox(height: Spacing.xs), - SelectableText(value, style: theme.textTheme.bodyMedium), - ], - ), - ), + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurfaceVariant)), + const SizedBox(height: Spacing.xs), + SelectableText(value, style: theme.textTheme.bodyMedium), + ], ); } } diff --git a/app/lib/widgets/folders/folder_status.dart b/app/lib/widgets/folders/folder_status.dart index a45a1eb1..fd9f9116 100644 --- a/app/lib/widgets/folders/folder_status.dart +++ b/app/lib/widgets/folders/folder_status.dart @@ -8,10 +8,18 @@ String folderLastChecked(WatchedFolder folder, {bool includeLabel = true}) => fo : '${includeLabel ? 'Checked ' : ''}${DateFormat.yMMMd().add_Hm().format(folder.lastScan!.toLocal())}'; class FolderStatusLabel extends StatelessWidget { - const FolderStatusLabel({super.key, required this.folder, this.shelfMissing = false}); + const FolderStatusLabel({ + super.key, + required this.folder, + this.shelfMissing = false, + this.alignment = Alignment.centerLeft, + this.reserveHeight = true, + }); final WatchedFolder folder; final bool shelfMissing; + final AlignmentGeometry alignment; + final bool reserveHeight; @override Widget build(BuildContext context) { @@ -43,24 +51,27 @@ class FolderStatusLabel extends StatelessWidget { }; return SizedBox( - height: lineHeight * 2, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: IconSizes.small, color: color), - const SizedBox(width: Spacing.xs), - Flexible( - child: Text( - label, - style: style.copyWith(color: color), - maxLines: 2, - overflow: TextOverflow.ellipsis, - semanticsLabel: folder.status == FolderStatus.importing && progress != null - ? 'Importing books: ${progress.label}' - : null, + height: reserveHeight ? lineHeight * 2 : null, + child: Align( + alignment: alignment, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: IconSizes.small, color: color), + const SizedBox(width: Spacing.xs), + Flexible( + child: Text( + label, + style: style.copyWith(color: color), + maxLines: 2, + overflow: TextOverflow.ellipsis, + semanticsLabel: folder.status == FolderStatus.importing && progress != null + ? 'Importing books: ${progress.label}' + : null, + ), ), - ), - ], + ], + ), ), ); } diff --git a/app/lib/widgets/folders/folder_subfolders_switch.dart b/app/lib/widgets/folders/folder_subfolders_switch.dart index d9958187..e53e6171 100644 --- a/app/lib/widgets/folders/folder_subfolders_switch.dart +++ b/app/lib/widgets/folders/folder_subfolders_switch.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:papyrus/themes/design_tokens.dart'; class FolderSubfoldersSwitch extends StatelessWidget { const FolderSubfoldersSwitch({super.key, required this.value, required this.onChanged}); @@ -13,13 +14,16 @@ class FolderSubfoldersSwitch extends StatelessWidget { highlightColor: Colors.transparent, hoverColor: Colors.transparent, ), - child: SwitchListTile( - contentPadding: EdgeInsets.zero, - title: const Text('Include subfolders'), - value: value, - onChanged: onChanged, - overlayColor: WidgetStateProperty.resolveWith( - (states) => states.contains(WidgetState.focused) ? null : Colors.transparent, + child: Padding( + padding: const EdgeInsets.only(top: Spacing.sm), + child: SwitchListTile( + contentPadding: EdgeInsets.zero, + title: const Text('Include subfolders'), + value: value, + onChanged: onChanged, + overlayColor: WidgetStateProperty.resolveWith( + (states) => states.contains(WidgetState.focused) ? null : Colors.transparent, + ), ), ), ); diff --git a/app/lib/widgets/folders/folder_table.dart b/app/lib/widgets/folders/folder_table.dart index a6a88e98..e7f45c4f 100644 --- a/app/lib/widgets/folders/folder_table.dart +++ b/app/lib/widgets/folders/folder_table.dart @@ -106,7 +106,7 @@ class _FolderColumns extends StatelessWidget { Expanded(flex: 2, child: shelf), const SizedBox(width: Spacing.md), SizedBox(width: 136, child: checked), - SizedBox(width: 128, child: action), + SizedBox(width: MediaQuery.textScalerOf(context).scale(160), child: action), ], ); } @@ -145,7 +145,12 @@ class _FolderRow extends StatelessWidget { _ => null, }; final identity = FolderIdentity(folder: folder, titleStyle: theme.textTheme.titleMedium); - final status = FolderStatusLabel(folder: folder, shelfMissing: shelfMissing); + final status = FolderStatusLabel( + folder: folder, + shelfMissing: shelfMissing, + alignment: wide ? Alignment.centerLeft : Alignment.topLeft, + reserveHeight: wide, + ); final books = Text( '$count', style: theme.textTheme.bodyMedium, @@ -160,20 +165,13 @@ class _FolderRow extends StatelessWidget { height: actionHeight, child: action == null ? null - : TextButton( + : FilledButton( onPressed: busy ? null : () => onAction(action.$2), - style: TextButton.styleFrom( + style: FilledButton.styleFrom( minimumSize: const Size(0, TouchTargets.mobileRecommended), - padding: const EdgeInsets.symmetric(horizontal: Spacing.sm), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Flexible(child: Text(action.$1, maxLines: 2, overflow: TextOverflow.ellipsis)), - const SizedBox(width: Spacing.xs), - const Icon(Icons.chevron_right, size: IconSizes.small), - ], + padding: EdgeInsets.symmetric(horizontal: wide ? Spacing.buttonPaddingHorizontal : Spacing.sm), ), + child: Text(action.$1, maxLines: 2, overflow: TextOverflow.ellipsis, textAlign: TextAlign.center), ), ); @@ -206,7 +204,13 @@ class _FolderRow extends StatelessWidget { : Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - identity, + Row( + children: [ + Expanded(child: identity), + const SizedBox(width: Spacing.sm), + SizedBox(width: 128, child: actionButton), + ], + ), const SizedBox(height: Spacing.md), _FolderSummary( status: status, @@ -214,7 +218,6 @@ class _FolderRow extends StatelessWidget { shelf: Text(shelfName), checked: Text(folderLastChecked(folder, includeLabel: false)), ), - Align(alignment: Alignment.centerRight, child: actionButton), ], ), ), @@ -245,8 +248,6 @@ class _FolderSummary extends StatelessWidget { _ => 1, }; final fields = [('Status', status), ('Books', books), ('Destination shelf', shelf), ('Last checked', checked)]; - final valueHeight = - textScale.scale(theme.textTheme.bodyMedium!.fontSize!) * (theme.textTheme.bodyMedium!.height ?? 1.4) * 2; return Column( crossAxisAlignment: CrossAxisAlignment.stretch, @@ -268,18 +269,11 @@ class _FolderSummary extends StatelessWidget { style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurfaceVariant), ), const SizedBox(height: Spacing.xs), - SizedBox( - height: valueHeight, - child: Align( - alignment: Alignment.centerLeft, - heightFactor: 1, - child: DefaultTextStyle( - style: theme.textTheme.bodyMedium!, - maxLines: 2, - overflow: TextOverflow.ellipsis, - child: fields[index].$2, - ), - ), + DefaultTextStyle( + style: theme.textTheme.bodyMedium!, + maxLines: 2, + overflow: TextOverflow.ellipsis, + child: fields[index].$2, ), ], ), diff --git a/app/lib/widgets/library/library_page_header.dart b/app/lib/widgets/library/library_page_header.dart index 688f2f2d..dd13337e 100644 --- a/app/lib/widgets/library/library_page_header.dart +++ b/app/lib/widgets/library/library_page_header.dart @@ -6,6 +6,42 @@ import 'package:papyrus/widgets/shared/app_page_bar.dart'; double libraryPageHorizontalPadding(BuildContext context) => MediaQuery.sizeOf(context).width >= Breakpoints.desktopSmall ? Spacing.lg : AppPageToolbar.padding.left; +/// Shared title placement for top-level Library collection pages. +class LibraryCollectionHeader extends StatelessWidget { + const LibraryCollectionHeader({super.key, required this.title, required this.onMenuPressed, this.actions = const []}); + + final String title; + final VoidCallback onMenuPressed; + final List actions; + + @override + Widget build(BuildContext context) { + final mobile = MediaQuery.sizeOf(context).width < Breakpoints.desktopSmall; + final textTheme = Theme.of(context).textTheme; + final heading = Text( + title, + style: mobile ? textTheme.titleLarge : textTheme.headlineSmall, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + + if (mobile) { + return LibraryMobileToolbar(search: heading, onMenuPressed: onMenuPressed, actions: actions); + } + + return Padding( + padding: const EdgeInsets.only(top: Spacing.lg, left: Spacing.lg, right: Spacing.lg), + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: LibraryToolbar( + search: Align(alignment: Alignment.centerLeft, heightFactor: 1, child: heading), + actions: actions, + ), + ), + ); + } +} + /// Page identity and contextual actions for nested Library routes. class LibraryPageHeader extends StatelessWidget { const LibraryPageHeader({ diff --git a/app/test/folders/connect_folder_flow_test.dart b/app/test/folders/connect_folder_flow_test.dart index ecb07c48..0b6453f6 100644 --- a/app/test/folders/connect_folder_flow_test.dart +++ b/app/test/folders/connect_folder_flow_test.dart @@ -185,9 +185,13 @@ void main() { expect(tester.getRect(toggle), toggleBounds); expect(find.text('16 files cannot be imported'), findsOneWidget); expect(find.text('—'), findsNothing); - expect(tester.widget(import).onPressed, isNull); + expect(tester.widget(import).onPressed, isNotNull); + expect(find.byType(LinearProgressIndicator), findsNothing); } + await tester.pump(const Duration(milliseconds: 200)); + expect(tester.widget(import).onPressed, isNull); + expect(find.byType(LinearProgressIndicator), findsOneWidget); scans.first.complete(FolderPreview()..supported = 999); await tester.pump(); expect(find.text('999'), findsNothing); @@ -204,6 +208,35 @@ void main() { expect(tester.getRect(name), nameBounds); expect(tester.getRect(toggle), toggleBounds); expect(tester.takeException(), isNull); + + await tester.tap(toggle); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 50)); + scans.last.complete(FolderPreview()..supported = 2); + await tester.pump(); + expect(find.byType(LinearProgressIndicator), findsNothing); + expect(tester.widget(import).onPressed, isNotNull); + + await tester.tap(toggle); + await tester.pump(); + await tester.tap(import); + await tester.pump(); + expect(folders.connections, 0, reason: 'Import waits for the latest preview.'); + scans.last.completeError(const FolderAccessException('access', 'Folder access denied')); + await tester.pumpAndSettle(); + expect(folders.connections, 0); + expect(find.text('Folder access denied'), findsOneWidget); + expect(tester.widget(import).onPressed, isNull); + + await tester.tap(toggle); + await tester.pump(); + await tester.tap(import); + await tester.pump(); + expect(folders.connections, 0); + scans.last.complete(FolderPreview()..supported = 3); + await tester.pumpAndSettle(); + expect(folders.connections, 1); + expect(find.byType(ConnectFolderSheet), findsNothing); }); } diff --git a/app/test/folders/watched_folders_page_test.dart b/app/test/folders/watched_folders_page_test.dart index 91d3ebbe..d94c4a22 100644 --- a/app/test/folders/watched_folders_page_test.dart +++ b/app/test/folders/watched_folders_page_test.dart @@ -226,6 +226,9 @@ void main() { expect(find.byType(FloatingActionButton), findsNothing); final toolbar = find.byType(size.width < 840 ? LibraryMobileToolbar : LibraryToolbar); final toolbarPosition = tester.getTopLeft(toolbar); + final titleBounds = tester.getRect(find.text('Folders')); + expect(titleBounds.left, size.width < 840 ? 72 : 24); + expect(titleBounds.center.dy, size.width < 840 ? 32 : 48); folders.items.add(WatchedFolder(id: 'folder', grant: grant)); folders.notifyListeners(); await tester.pumpAndSettle(); @@ -234,7 +237,12 @@ void main() { expect(find.byType(Card), findsNothing); expect(find.text('Account upload'), findsNothing); expect(tester.getTopLeft(toolbar), toolbarPosition); + expect(tester.getRect(find.text('Folders')), titleBounds); expect(find.byType(FloatingActionButton), size.width < 840 ? findsOneWidget : findsNothing); + folders.items.clear(); + folders.notifyListeners(); + await tester.pumpAndSettle(); + expect(tester.getRect(find.text('Folders')), titleBounds); expect(tester.takeException(), isNull); }); } @@ -257,6 +265,7 @@ void main() { id: 'archive', grant: const FolderGrant(key: 'archive', identity: 'archive', name: 'Archive', location: '/Archive'), status: FolderStatus.accessNeeded, + error: 'Reconnect this folder to allow access.', ), ]); await mount(tester, size: size, theme: AppTheme.dark); @@ -292,16 +301,56 @@ void main() { } } + if (size.width < 840) { + final row = find.byKey(const ValueKey('folder')); + + for (final (label, value) in [ + ('Status', 'Up to date'), + ('Books', '1'), + ('Destination shelf', 'No shelf'), + ('Last checked', 'Oct 31, 2026 09:30'), + ]) { + final labelFinder = find.descendant(of: row, matching: find.text(label)); + final valueFinder = find.descendant(of: row, matching: find.text(value)); + final gap = tester.getTopLeft(valueFinder).dy - tester.getBottomLeft(labelFinder).dy; + expect(gap, closeTo(4, 1), reason: '$label should use the same label-to-value spacing'); + } + } + await _captureReview(tester, 'folders-${size.width.toInt()}'); await tester.tap(find.text('Reading inbox')); await tester.pumpAndSettle(); await _captureReview(tester, 'details-${size.width.toInt()}'); + await tester.tap(find.text('Close')); + await tester.pumpAndSettle(); + await tester.tap(find.descendant(of: find.byType(FolderIdentity), matching: find.text('Archive'))); + await tester.pumpAndSettle(); + final recoverySheet = find.byType(FolderDetailsSheet); + final reconnect = find.descendant(of: recoverySheet, matching: find.widgetWithText(FilledButton, 'Reconnect')); + final accessStatus = find.descendant(of: recoverySheet, matching: find.text('Access needed')); + final explanation = find.text('Reconnect this folder to allow access.'); + final messageTop = tester.getTopLeft(accessStatus).dy; + final messageBottom = tester.getBottomRight(explanation).dy; + expect(tester.getCenter(reconnect).dy, closeTo((messageTop + messageBottom) / 2, 1)); + expect(tester.getTopLeft(reconnect).dx, greaterThan(tester.getBottomRight(accessStatus).dx)); + expect(tester.getTopLeft(reconnect).dx, greaterThan(tester.getBottomRight(explanation).dx)); + await _captureReview(tester, 'reconnect-details-${size.width.toInt()}'); + await tester.tap(find.text('Close')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Reading inbox')); + await tester.pumpAndSettle(); expect(find.text('Stop watching'), findsNothing); expect(find.text('Connection'), findsNothing); expect( - find.descendant(of: find.byType(FolderDetailsSheet), matching: find.text('Destination shelf')), + find.descendant(of: find.byType(FolderDetailsSheet), matching: find.text('Shelf')), findsOneWidget, ); + final details = find.byType(FolderDetailsSheet); + final shelfLabel = find.descendant(of: details, matching: find.text('Shelf')); + final subfoldersLabel = find.descendant(of: details, matching: find.text('Subfolders')); + final checkedLabel = find.descendant(of: details, matching: find.text('Last checked')); + expect(tester.getTopLeft(shelfLabel).dy, tester.getTopLeft(subfoldersLabel).dy); + expect(tester.getTopLeft(shelfLabel).dy, tester.getTopLeft(checkedLabel).dy); expect(find.text('Close').hitTestable(), findsOneWidget); expect(tester.getSize(find.byType(FolderDetailsSheet)).height, lessThan(size.height * .85)); final viewBooks = find.descendant(of: find.byType(FolderDetailsSheet), matching: find.text('View 1 book')); @@ -383,7 +432,7 @@ void main() { }); for (final size in [const Size(390, 844), const Size(1024, 800)]) { - testWidgets('progress reserves row and sheet space and displays remaining books at $size', (tester) async { + testWidgets('progress uses content height and keeps detail actions stable at $size', (tester) async { final folder = WatchedFolder(id: 'folder', grant: grant); folders.items.addAll([ folder, @@ -395,6 +444,7 @@ void main() { await mount(tester, size: size, theme: AppTheme.dark); final nextRow = find.byKey(const ValueKey('second')); final position = tester.getTopLeft(nextRow); + final statusHeight = tester.getSize(find.text('Up to date').first).height; folder.status = FolderStatus.scanning; folders.notifyListeners(); await tester.pump(); @@ -404,8 +454,10 @@ void main() { folder.progress = FolderImportProgress(total: 10000)..processed = 2500; folders.notifyListeners(); await tester.pump(); - expect(tester.getTopLeft(nextRow), position); - expect(find.text('2500/10000\n7500 left'), findsOneWidget); + final progressLabel = find.text('2500/10000\n7500 left'); + expect(progressLabel, findsOneWidget); + final addedHeight = size.width < 840 ? tester.getSize(progressLabel).height - statusHeight : 0.0; + expect(tester.getTopLeft(nextRow).dy, closeTo(position.dy + addedHeight, 1)); expect(tester.widget(find.byType(LinearProgressIndicator)).value, .25); await _captureReview(tester, 'import-progress-${size.width.toInt()}'); folder.status = FolderStatus.upToDate; @@ -444,12 +496,21 @@ void main() { (const Size(820, 900), 1.0), (const Size(1200, 900), 1.3), ]) { - testWidgets('folder row height stays stable across all statuses at $size and scale $scale', (tester) async { - final folder = WatchedFolder(id: 'folder', grant: grant, status: FolderStatus.paused); + testWidgets('folder actions stay in the header without shifting content at $size and scale $scale', (tester) async { + final folder = WatchedFolder( + id: 'folder', + grant: grant, + status: FolderStatus.paused, + lastScan: DateTime(2026, 11, 1, 23, 59), + ); folders.items.add(folder); await mount(tester, size: size, textScale: scale, theme: AppTheme.dark); final row = find.byKey(const ValueKey('folder')); final bounds = tester.getRect(row); + final identity = find.descendant(of: row, matching: find.byType(FolderIdentity)); + final identityBounds = tester.getRect(identity); + final statusTitle = find.descendant(of: row, matching: find.text('Status')); + final statusTitlePosition = size.width < 1200 ? tester.getTopLeft(statusTitle) : null; for (final status in FolderStatus.values) { for (final shelfMissing in [false, true]) { @@ -461,14 +522,28 @@ void main() { : null; folders.notifyListeners(); await tester.pump(); - expect(tester.getRect(row), bounds, reason: '$status, missing shelf: $shelfMissing'); + expect(tester.getRect(identity), identityBounds); + + if (size.width >= 1200) { + expect(tester.getRect(row), bounds, reason: '$status, missing shelf: $shelfMissing'); + } else { + expect(tester.getTopLeft(statusTitle), statusTitlePosition); + } + + final action = find.descendant(of: row, matching: find.byType(FilledButton)); + + if (action.evaluate().isNotEmpty && size.width < 1200) { + final actionBounds = tester.getRect(action); + expect(actionBounds.left, greaterThanOrEqualTo(identityBounds.right)); + expect(actionBounds.center.dy, closeTo(identityBounds.center.dy, 1)); + } + expect(tester.takeException(), isNull); } } folder.status = FolderStatus.paused; folder.shelfId = null; - folder.lastScan = null; folder.progress = null; folders.notifyListeners(); await tester.pumpAndSettle(); diff --git a/app/test/opds/catalogs_page_test.dart b/app/test/opds/catalogs_page_test.dart index 9939188d..37aae2e9 100644 --- a/app/test/opds/catalogs_page_test.dart +++ b/app/test/opds/catalogs_page_test.dart @@ -658,13 +658,16 @@ void main() { }); } - testWidgets('mobile catalog home keeps menu, Downloads and FAB without a title header', (tester) async { + testWidgets('mobile catalog home shows its title alongside menu, Downloads and FAB', (tester) async { await _CatalogPageHarness.mount(tester, (_) => _feedResponse('Books'), initialLocation: '/library/catalogs'); tester.view.physicalSize = const Size(424, 951); await _settleNetwork(tester); expect(find.byType(FloatingActionButton), findsOneWidget); expect(find.widgetWithText(FilledButton, 'Add catalog'), findsNothing); - expect(find.text('Catalogs'), findsNothing); + expect(find.text('Catalogs'), findsOneWidget); + final titleBounds = tester.getRect(find.text('Catalogs')); + expect(titleBounds.left, 72); + expect(titleBounds.center.dy, 32); expect(find.byType(LibraryPageHeader), findsNothing); expect(tester.getTopLeft(find.byTooltip('Library sections')).dy, 8); expect(tester.getCenter(find.byTooltip('Downloads')).dy, tester.getCenter(find.byTooltip('Library sections')).dy); @@ -1354,7 +1357,10 @@ void main() { expect(find.text('No catalogs yet'), findsOneWidget); if (width >= 840) { - expect(find.text('Catalogs'), findsNothing); + expect(find.text('Catalogs'), findsOneWidget); + final titleBounds = tester.getRect(find.text('Catalogs')); + expect(titleBounds.left, 24); + expect(titleBounds.center.dy, 48); expect(find.byKey(const Key('catalog-header-divider')), findsNothing); expect(find.byType(LibraryToolbar), findsOneWidget); } diff --git a/app/test/opds/layout_test.dart b/app/test/opds/layout_test.dart index 84c22165..6e366f8d 100644 --- a/app/test/opds/layout_test.dart +++ b/app/test/opds/layout_test.dart @@ -386,7 +386,7 @@ void main() { } await tester.tap( - width < 840 ? find.byTooltip('Add catalog') : find.widgetWithText(FilledButton, 'Add catalog'), + width < 840 ? find.byTooltip('Add catalog') : find.byType(LibraryAddButton), ); await _settle(tester); diff --git a/docs/images/folders-catalogs/catalogs-desktop.png b/docs/images/folders-catalogs/catalogs-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..f26a37b2a9dfc8b9451e204fcbaee5529b23c7e3 GIT binary patch literal 55343 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

4MT%;iIg-r(k0C>^w4=X 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 H(6m1R(=9LM literal 0 HcmV?d00001 diff --git a/docs/images/folders-catalogs/edit-desktop.png b/docs/images/folders-catalogs/edit-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..e08cc6c974f1ec92d23baf4469eba0fcf52a68d9 GIT binary patch literal 45452 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 literal 0 HcmV?d00001 diff --git a/docs/images/folders-catalogs/folders-desktop.png b/docs/images/folders-catalogs/folders-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..72b4fca3ad13891ff6adcf320181bd2690d611e7 GIT binary patch literal 39450 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 literal 0 HcmV?d00001 diff --git a/docs/images/folders-catalogs/folders-mobile.png b/docs/images/folders-catalogs/folders-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e79935e28469b6d1b4ca800a448d54e261250f GIT binary patch literal 38910 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 Date: Mon, 2 Nov 2026 21:58:21 +0200 Subject: [PATCH 03/17] feat: redesign reading statistics around habits and recorded pages --- .impeccable/config.json | 3 + .impeccable/design.json | 120 +++ .../review/calendar-axis/pages-1200.png | Bin 0 -> 71851 bytes .../review/calendar-axis/pages-390.png | Bin 0 -> 57163 bytes .impeccable/review/calendar-axis/review.md | 18 + .../review/calendar-axis/time-1200.png | Bin 0 -> 72614 bytes .impeccable/review/calendar-axis/time-390.png | Bin 0 -> 57799 bytes .impeccable/review/genre/details-1200.png | Bin 0 -> 41593 bytes .impeccable/review/genre/details-390.png | Bin 0 -> 30916 bytes .impeccable/review/genre/edit-1200.png | Bin 0 -> 49925 bytes .impeccable/review/genre/edit-390.png | Bin 0 -> 36721 bytes .impeccable/review/genre/review.md | 27 + .impeccable/surfaces/statistics.md | 87 ++ DESIGN.md | 192 ++++ PRODUCT.md | 28 + app/lib/models/book.dart | 5 + app/lib/models/reading_activity.dart | 2 +- app/lib/pages/book_edit_page.dart | 6 + app/lib/pages/statistics_page.dart | 836 ++++++++---------- app/lib/providers/book_edit_provider.dart | 20 + app/lib/providers/preferences_provider.dart | 15 + app/lib/providers/statistics_provider.dart | 289 ++++-- app/lib/reader/reading_activity_tracker.dart | 60 +- .../widgets/book_details/book_info_grid.dart | 5 + app/lib/widgets/goals/log_reading_sheet.dart | 4 +- .../profile/appearance_settings_section.dart | 19 + .../widgets/statistics/reading_charts.dart | 656 ++++---------- app/lib/widgets/statistics/stat_card.dart | 43 +- .../widgets/statistics/statistics_row.dart | 72 ++ .../pages/book_edit_page_layout_test.dart | 26 + app/test/pages/statistics_page_test.dart | 288 ++++++ .../powersync/tracking_persistence_test.dart | 5 + .../appearance_preferences_test.dart | 36 + .../providers/book_edit_persistence_test.dart | 23 + .../providers/statistics_provider_test.dart | 216 ++++- .../reader/reading_activity_tracker_test.dart | 66 +- .../appearance_settings_section_test.dart | 21 + .../shared/page_empty_states_test.dart | 2 +- .../statistics/reading_charts_test.dart | 175 ++++ 39 files changed, 2273 insertions(+), 1092 deletions(-) create mode 100644 .impeccable/config.json create mode 100644 .impeccable/design.json create mode 100644 .impeccable/review/calendar-axis/pages-1200.png create mode 100644 .impeccable/review/calendar-axis/pages-390.png create mode 100644 .impeccable/review/calendar-axis/review.md create mode 100644 .impeccable/review/calendar-axis/time-1200.png create mode 100644 .impeccable/review/calendar-axis/time-390.png create mode 100644 .impeccable/review/genre/details-1200.png create mode 100644 .impeccable/review/genre/details-390.png create mode 100644 .impeccable/review/genre/edit-1200.png create mode 100644 .impeccable/review/genre/edit-390.png create mode 100644 .impeccable/review/genre/review.md create mode 100644 .impeccable/surfaces/statistics.md create mode 100644 DESIGN.md create mode 100644 PRODUCT.md create mode 100644 app/lib/widgets/statistics/statistics_row.dart create mode 100644 app/test/pages/statistics_page_test.dart create mode 100644 app/test/providers/appearance_preferences_test.dart create mode 100644 app/test/widgets/statistics/reading_charts_test.dart diff --git a/.impeccable/config.json b/.impeccable/config.json new file mode 100644 index 00000000..747d7b34 --- /dev/null +++ b/.impeccable/config.json @@ -0,0 +1,3 @@ +{ + "buildPath": "code" +} diff --git a/.impeccable/design.json b/.impeccable/design.json new file mode 100644 index 00000000..21fdc58f --- /dev/null +++ b/.impeccable/design.json @@ -0,0 +1,120 @@ +{ + "schemaVersion": 2, + "generatedAt": "2026-11-02T16:45:57.133728+00:00", + "title": "Design System: Papyrus", + "extensions": { + "motion": [ + { + "name": "quick", + "value": "100ms", + "purpose": "Quick transitions." + }, + { + "name": "standard", + "value": "200ms", + "purpose": "Standard transitions." + }, + { + "name": "emphasis", + "value": "300ms", + "purpose": "Emphasis transitions." + }, + { + "name": "complex", + "value": "500ms", + "purpose": "Complex transitions." + }, + { + "name": "eink", + "value": "0ms", + "purpose": "E-ink and reduced-motion behavior via AppMotion." + } + ], + "breakpoints": [ + { + "name": "mobile", + "value": "0px" + }, + { + "name": "tablet", + "value": "600px" + }, + { + "name": "desktopSmall", + "value": "840px" + }, + { + "name": "desktopLarge", + "value": "1200px" + } + ], + "shadows": [] + }, + "components": [ + { + "name": "E-ink elevated button", + "kind": "button", + "refersTo": "button-eink", + "description": "Explicit e-ink elevated-button appearance. Browser focus remains available.", + "html": "", + "css": ".ds-eink-button { background: #000; color: #fff; border: 0; border-radius: 0; padding: 12px 24px; min-height: 50px; font-size: 16px; font-weight: 600; }" + }, + { + "name": "E-ink outlined button", + "kind": "button", + "refersTo": "button-outlined-eink", + "description": "Explicit e-ink outlined-button appearance. Flutter owns actual interactive states.", + "html": "", + "css": ".ds-eink-outlined { background: #fff; color: #000; border: 2px solid #000; border-radius: 0; padding: 12px 24px; min-height: 50px; font-size: 16px; font-weight: 600; }" + }, + { + "name": "E-ink field", + "kind": "input", + "refersTo": "input-eink", + "description": "E-ink fill, label, border and focus thickness from InputDecorationTheme.", + "html": "", + "css": ".ds-eink-field-label { color: #000; font-size: 16px; font-weight: 700; } .ds-eink-field { display: block; background: #f5f5f5; color: #000; border: 2px solid #000; border-radius: 0; padding: 16px; } .ds-eink-field::placeholder { color: #404040; } .ds-eink-field:focus { border-width: 4px; outline: none; }" + }, + { + "name": "E-ink selected chip", + "kind": "chip", + "refersTo": "chip-eink-selected", + "description": "Color and border swatch only. Shape and padding are inherited from Flutter.", + "html": "Time", + "css": ".ds-eink-chip { display: inline-block; background: #c0c0c0; color: #000; border: 2px solid #000; }" + }, + { + "name": "E-ink card", + "kind": "card", + "refersTo": "card", + "description": "E-ink shared card shape and margin. Content padding belongs to callers.", + "html": "

", + "css": ".ds-eink-card { background: #fff; color: #000; border: 2px solid #000; border-radius: 0; margin: 8px; }" + }, + { + "name": "E-ink navigation", + "kind": "nav", + "description": "Bottom-navigation label color and weight swatch. Layout remains platform-owned.", + "html": "", + "css": ".ds-eink-nav { background: #fff; color: #404040; font-size: 14px; font-weight: 500; } .ds-eink-nav-selected { color: #000; font-weight: 700; }" + } + ], + "narrative": { + "overview": "Papyrus uses its existing Material 3 theme for a readable, adaptive library and reader. Muted violet accents sit on neutral surfaces, with separate light, dark, high-contrast and e-ink themes. This record describes the implemented system, without introducing a new visual identity.", + "keyCharacteristics": [ + "Semantic theme colors and text roles.", + "Shared spacing and shape tokens.", + "Dedicated e-ink and reduced-motion behavior." + ], + "rules": [], + "dos": [ + "Do resolve colors and typography through the active Flutter theme.", + "Do preserve text scaling, accessibility typography and reduced-motion settings.", + "Do use existing spacing and radius tokens for shared components." + ], + "donts": [ + "Don't hard-code the light palette into adaptive widgets.", + "Don't carry standard-theme elevation and animation into e-ink components." + ] + } +} diff --git a/.impeccable/review/calendar-axis/pages-1200.png b/.impeccable/review/calendar-axis/pages-1200.png new file mode 100644 index 0000000000000000000000000000000000000000..719cd6a7947cf89c51388a7851fbdfb98a916114 GIT binary patch literal 71851 zcmeFZXHZj78!n0kQ53OI1O=ojUFkh43WU&m??pnBE?q@LK|n&24pKu2J@jJ1(2-t4 zR63zZ4Fm#rq2G7zIdlHpUw7`@IhkSHDSPd;*LutIKF_;-r=g}uMaf7>Mn*;jReG#N zMs~K0jO@(f`E%ftUSo<$@XuL~M^K&f;1zJ*<}G-C%0o->5gDrY))E=nZ8GTNhdR$w zSFk>wI>Xc7H|&-DI9V@T_@E)b-sGc`?0J?Psi~2CKK$*N<~P69SIX6FV#)FPnwn?1 z!?og=2hK0CCUtioC?aB%UT7c~ejXTh&2>v2tdOMTXQzED2y$OgR6pkRn${m)BNKcuAO%*I0Q^5S1q!cLuxZPHfn zy@Y}f!{I#>>Yj(siz~ZM-2%7bN%Cr%n_J4Y<(=kH6ZD#VDTx$?v0)RC$nzM^%& zeOad%q3$w()IQ|=Yb&*lY`ls{^^7B1Bw zACHS#ZEt_^(2p&LpD*R;7!-bV^_M)Y4yxq8^La9bl^x1g4-P!q$Gp~m=HNIQm}jSI zd{=~{cnIU}_hN3278!n3yrYM|eLUABuC+CR^5W{ukZk?mmC}!1Os0jubFaW(r+7ww z@$zLozEgClD~i!fx_^clEqwhH?n=~F3cnH1b#a-aVf6c|d%g4TqIag}hb0aS4yKu& z(_mX#a@gG6<=%1YlxYQKM?*KEe=cOO2FF7?ZKg|eYpNg2*altJ;tUn8 z(u!N?Zt^|x7;r=OiGPPBd!~DLkc{_sCUOcZ-|4QDf8p}l-B{#y{*QlOo2+*7wF)H# z(EP;Z6uGbE+R4bOtbZ62PCy}L`dFeEtYiXg-4Hf#p zz-MI{GBQ&%H&a$5=4WQIe%^*K$suMX=I7>6KYoz4F~br#`~3Q6BAF&tX}_G_**nyw z$6|uP{ph=I=E2r5qcy3oLcV%!+N2H)Ao?WMmzJ{2%I@0Q<=kC*yuul+pZf8FI**8m zR17Hj<6(p>h}uwx$gsiz`H_c#?w=3(uNn5D(?zU zS`v(g-e>a@CIZEf_2J4ftZ=_&YO1s2>Gp>nZ--;csK&V#8E~lK5Y7t@>d|W9n?GtndT4-2_1Pfr2&@5OJ!_K0yWhYzpbR&>R zOo@-0VSj@wnr`A++!8HyZ0p4Ijbq}SetjvOTboCg&*1Sx$lzedYjljrA3v1H&%Rj% z3s$I^T`nZ79kH6NS3(CLsEwEobbZOufrBU!ddyJf!K6p(kek|egcB>x-1fqYJwjCZ ztn1m@+o#q9u1@gNT+uKCyA}W8dCs>P&voz0?~#Ejh`2x=?R4hpLX$f5L=C>QLwk}} zmehTLkshCJ=*lZm@X8MBPqM{dM`aD2;fw7!K%j8tTbZA-*@wz3X`OLF4-h)p3PMHcjnqZ|Z#1w@~Eu-Llo$q3OdbZcHPM%)#*6T_bpD4fa^lfS%L8w+s z^Yxu0ii?7U83JixNNvn#zjab*#iX+`3^oF`-(eD6D&Wy};&Z7zPrJ?ece)aG!qp`_ zr+4Fdo^*ZvYP`0V&dHpumZrxjJ+C=8Yv(u}65_e|!^PKke;Kt@iVSMI%)?T8wr8k=9om1Q;r)$o(5{fova$!he)SzLHAQaO zJVt1~7E>jq7g1^G?lQy5<$9F8HTgN>A^}J3=pYJbW-O!O6R!`N%K7nY2r= z!mtEsQ#?^reA@q8kg2js;LZ3ff5hBoZs%9mdVO_>@aK(Y`{)>o)g2RbHl~s zI>PH_#rbqmyaVARI)e^h^;hyF&PX+!hqB#gy#``7$@R=G8^uBWFkCnwY38^HvL zFDWT+dbFNt)E0{sffS2UWM)Fm+Ki4(79U6Yv|DxP+S!HId)F;}I$iv(22#Qmxn;j5 zE3z(MVtkw@cHF4vY(&shunWI-EqXD}l5qF-Z36}dZumq_N=3y$HGF4F877@|as`b# zO5!h!dX@Jo8`w!0A|T+jh|M2U_*iB(2wqhIbJhYITPOZ-8^d9%$}QMN#rMK+%$_)v#uPhjJZe9;cR^yYSN zgSs*~?CQaGa%R2PU3G7CKKhkNg&2 zc)DFcFebeT-uRgdQ*6tHmD)ooas^+>#Ep@kzuqxurG3~eqAKRyTF6`0! zFJC^zB`4>o%LN*e4sgiz=7R?r0mN{Qj;=0!_BVZcvENN?MHs6O`g;84h8Zf1wv<=< zYK!AOU*gMv)yv)IR;7cb!-qS~(IX{}N7RJ*3__t-k&zH16(zOco!E{7oX^~y?@ZD| zx+*H_bF&6<@$p6JvNw5ocpgW~5MOdQbk0u0$1C!*w1nnBYI3t~=o-anX9ONO#*`~Y zt`vjcIszL_q%ngc_OFFB4l+sBE2=X3#PmN!^dz+4^h?cV;$u_zVJ`iKX2SM-T7!Am z__Q?Ekk6S9&*URr(!~7s`YkEX-z`lRO)0eN$x~MC!Kphfeqf-aDk)xXHs{PnTC59& zJhZE9$W~WZXQ5({k-u<3aVYblzv$B+X5!Jszs|o+by(U|9IETON5w3nigO9jPm`w7 zRaSo0O!N!Y`QsTm>1te%n#yP8_3haq7Vox-6lWwo_has z4sLe#C*BRF@?qT?ZQ-KZzhT<8LP^y>JE$mm^dGuyQ0QhWT$erk3Gb=T&yQlB)aS`K zNw_aAR@(O^RJsVe*8}@*AKd!VJfoKo|3FUWfP z2OeH*q6p!Ev~K?Sqxbl^=r9ti%yYiZ4p*rIu73v+UF5f;5FX`{=k4q|G_ez5D@MBM z_EFU?iE>&!?eLRP&02Qqlv8dV2k^Z&$>M~-rtM7;(w~_-S`Q^?u4y1bT_r)iv1GCN(Zv{l&TM7H!R#>Ybs%nTRIbmmm(1_~RSG64z3iOn^h`tGS>D z1`)%b+IHamzx`AjvqQDCV|7@I!`Z$Raoc@~MXYqTD{1yHs*2#(#6@k5{5iRpbuBCk z=w!+ta>W`hEp<>*ULMVP*QZ2oOe(NYz{YNk@^a)L)Y3ZR##d0_j&ye5RHA|3=f>^Y zliugbw&n`3#^qRJ5VY425b`pILAWxsV`!p!(&nBLfAXkCQNq6Z<2{EhX6V4ja%^0B zdWqYN`M@l<>(jn;>q6b4Pltz%I^|X$jL^kMT#$68^qrQhlV2dU>y{^Lp2XazpoV9k zcm?ig#%OQ*PGSJHT}>CgMc`ov3>Zm0YM}&?^XE??B>;>WK|~d<%9LzV9UW6q=Lyq> zguW(Cuzv@; zF2jd+6r?65SG}>)2j{R}KJ-odBPI-&6sjEt7b>v0+_LdvzxAg4S%4Ak>4JD;JBszq z8YbO>rp7Sw>FLG&)_C|pTFLfky17n+9&CS~ocrEA9mDY@BlO`_tnh(f+tf6$6xFY9 zdOb~CYbHhU>FM>(R>EK_yar6^hL68X+uXac-M@UiG}vd>OC56#=k=M?xHq8V%>U6@ z%ziC03g>s2IGmg>onO@tAXvZjx*UiA1!H5uG#>uiSh4aXEv;)z!gX&hHNzgx@hlFH zu8nLrNI7;^T^71=seWgKB4YI>F#ZSQ{*E0o0B99JV_l3kdIR=}3EHt-*eaXxubTwH zQZCi{r8J)mo!{gu{T@^TTBcU4r;37g7r6S`mS2KdXNdHt(<*hh}6MR05{E zJnUG+Bz>f=o$sULM}!)d_$Es=Wy>ASa*6^#TVhPmR961H3IVcUEmJb29Dq?wf z$VM{etE;zmcRaD#`Chyr6jVv0DX!Sk3pJws{Mm4+@6z-Q*u1(eqT|rwQ|IYMg=)uY z9XK4J5RJ?R_|0LdBFy&Q4bQE&2jM1(NlAtGt?}IRyLm=Cnn#_;FYBZkj4T(}s*GU6 zqK}g)@D*SboA@_uqtOhcvPX}29J)$xirAURMlzbh+}tR1vL5M*!iSLGGAfIBcF6GV zV|DlsDqPv0K0TtLqbo?0re1D+`P^``7(R-MVib9c7={nNJad7Pax*?fGT5#=_28Ui zZ(s;5%`8B~W+ktZ#Yhf7{w=eKRR`4&TF>aJc`ut>eZLI`2|!J27ae)^#n0s!afe!>!AjYrCdvGDzS8q!vu+DXV?EN_C3 zmBm_%4bLSwcDTuqdvqlnw%iNG5_4w`%g0EYo15{JLGtWSCh5x~QwO+Vrr7j&tc!MN z8Bea(iP^n~i2d;FF^DytJso-hUsyps#M_4`s@)6O$9P0gXZ2#9igemF$P{@+u^cP% zj1g+&4_o+WQz!uhUEamrPNG9~JPS&V8INX{2^~-d&0Sbo0Ea#98 zYPta4GE0AAP8X1m9xo1$kiJVz?TTUk*7h!vgei9p@39*$=QeCAN%6{8YEAx2r{ADb&+4D}uSs9IGj{hhvW_o@hKXIum}~h@9Mg2=9(S8leuWHNs3`RN;G>Al zOiDyf%klIt2|D`3maEMf=5<|q(Y(apUAc@hPwTB)1fhi{lEHcDAhvJL@k&MA;b4y8 zB*Xzkx!nnCX@4rR)E*-{Q4^d3JVY}02vKNM{qm3$Vp}s=y}jCm;HZ=g=C(-e{kq*# zvmUp+hyI-qnU1D5ws`P%#oIroPx}7S$0%m3aiP}q1I3|PBK20 z#fDZ*Yh!ym2J6DRNjhqI6|!~b=@eb%&-WgvBP^Pu^LA@zT*_o_C?_V0lUJ~>aB(rb z!eG<$=YvKLhpqW0Mqk*GNG(e+5r)|AgSa7b_FmIqgO8OJS-4^~^@>zAV^|S6>&=rT z)N+TK2oTo74^@mx#8i{&mHOm_^?at>Lh{s%O*nqm-_XP7njV|4H??S(He4D7E)p}o zk_So}e}$BUM0o0^raG4(F*ovzU8GkNm7BEDJCy~|s=rif z7R+n2+kGsdQq2CAGj*S|%pZO9NqUvCx2MB!Y2c`3<`$;;U=7F8%o5yCUYa-t7pa(KHb3HTgpazPN@?tDLL5U&M0k;JO&3*k$h;lBup8;F&khH6;B=c#M z9$WMzV%_6#Yc!od{B41m&Av612Ia8s^;H71*$La|xFZN9hlw=+Mo5i`!g1rK^hL2d zXTfGZt3JrGaK!?;fL7A1#7G|OfPq~qvk!w(`e!h z{Rtklwae?oK@416j!}nFfsScS2WVx)L=DSN3A=kYbh94Ct$0t8Lk^c8JyBesa11_f zl0PZO0iGR3r5%$dGCgvi5rv{jp!65 zh}u?9RQc`L+1kxRveuXE<%Wm2n}%y#FYc`Jf?BKUndOnf>h53yWOX|5vEzt~?z&lz zh@Fal)6R%^y+NY&IXz3~(Bq)vulb??{Z=m>M2Dlbk9;FI6{GuFo>ba3BTtd;z{o$3 zevQ5q+lKHrYO&8~2J_1(ge_PCpe`F(n>)d<;2f2ldVKcFAc;`Pv)yjZEJ7lZd-brZrPCih#y(?EgJ(Z(=NS;83~} zH5sGD(A`3Lerv9_Ax^M zK%oQaO)Z^P9hz9F5)p^r!WEON@X_7xY=MBq(ABYFl9dc@YR2xRv#}L+VeUKtMHXMe z;rhV|&RAzD1}rFiYrd~~IeTHaX!QAT(WHWQe&b2L#e;~@WpQsAZ`BMlbqTw8x&l<7 zPnT!uZG{?;4zVr>&uLP=dX3fGOnq>#G^1~qNoeSk4sZn~wTp8c4jU;1{AXVl_}C9a z_*88~&@qX^YemA~gt;TAxWqI?ls-NYs(J}M+lW2lkk->hs$9u$h9?A6Umxtv&a{)cayvs~M**X}Bj2AC9JG(057W)g1=kUgAc9kgr?NDm2^0kPE^;f&C=`uYdBXTJ2n{Zym37c{kzE>6lh?jNG zz4k0ErUkIHG_;0_UHUS4d#|^mMg4~4DKB3h?KYGZSp20YCwI#4=Mh1t&Yhoua^(E{ ztQ|hhC;i6>Pc*T!Ci*bsoSK&m4bSc#1SlhUP5w21!LUfOCvIh~&^W*P(zy^&EML1G z{d6P6;}-QD$LYrWJhdPwm_48m&7vXqwXR+r7WL_sro411o?~v#a2s%bL|nxFb=gbj zvh@Ux6&0h_`iuRKunP05;y$o*Apj}QNQfPmixz6-rhk85q`#7Gwq7hzV2#95#&lIJYxC+qQDtv#Wq{dCH-{CBiUs=jQYPARM9OxUab9tKuY5 z-(@UB9MXPMsnd^qyG^qo{`@zB6B<(!wi>9 zzP(ug9VCzvYq_Q!6{=9Q-s zdJ>9Ov`5#pL{2>Zg(J_@^&2Qxe5v{J&(Dy*kyl|2)UqrnKh%);Cm&kd>lU`8lFel! zI{CWP?qX8KWXXSZAd@V2_exQJHCJ--(4r?>=^zDXrYGcQLRH_$658O95*lyy?Vef54HQ>vx6-JevaEZhZ$>`PO2K$rg zk-g|D=|0Vu!mr59Z4AE4uQaNRORn$vA41m#(5VnPRohHbUdslCmzPA|y)$pOliqSm z|9d*Xjkb&y58_#QL1?%eVKKx&lFc>)u|9b`!3-BF2tLriNn)A-_ z&lRD6gP<5~nJu7NYA&zTQpXnGXTjpz+_f%Tz;leJnVyLAWIrk6W0F{1Sy;fJac`re zONE4ml>=|(pEW?lB{XY8p}2OJ8mXe!T|DCAn&lWsTu;Kx3Xt=`OTX;(Yl+Y|uO%BU zWj_7_)LA(>)DXta=tb_UEBNPAVHFc0=FLq%H`|dBw?Z`G`EM`4hcZ2H|MdR~sN|QK+-U|QHt^Zh-E%%s7@HJ1C|@lTPn2LFzpIsBiaXAXAu^v?w5 zLb{5KYg`aHJ2yvoMMa0lIZfSOy?Qm2?N1FIcq1rwmy@$?obx{-_6IHMvI(?9(Hkm8 zlOLiCNeo8KR-qGU=j?_&)mV1_QI!LB zVuOK;lXDsG+U({H{kIeJIYVcP-K;SMK}|$@&&VFT!A)9T0l)4#k9mN}ka{H(%hQ#Z zCxm}GIoSd)pnux?vkUdAjbf~UjACYHhRA7blmT52bdnkIXFB_AmHyu;w(H^k zlv({xfwUN@1H`UMH1N#@s#2cUp-8VHJ-{CEhw=!jwY?38kADia_MX_k5veeYGBu85 z6pQPB-bT{=C)LNjg+W69c%C|S%5Oc*hnALsJLL0i+OxVW#YBxhnFFU7w7K)%qoAOm zi3ZmUg=wiyHy~ld=ifIBm%5rKfnuP37(P7Vg|GUFB=4*?=rzP7;>Fv+{e@ApjC@FW zLn|q6zZYH? zEhhPR_WH!1HhTLZ3lYYhq1cN)F?B$S7g)f`eN? zKu!GeEsan3e~Z&OKr8HQzbi{9RMydnY5fjnJoX`rQRw-z7I$5Kd;VR zzM;X`QCOS>{193L4Y02G@Owv+XGiZeriS{c+!5$6nK>yI0f4wuwV z-xBt#`W}6A;e088T_RJR+AXvHbXHu_S9x(FB6*AosHRIj5y#4WYVXb|&&H$@h|9x;NW(!p zknXBPR5R|&uS$9Uh*js;@b*S?0Qp7=K8nUl9*mb+hUk=C4Yah#ef6inq|QBx5OVG^ zpSx-7_ef4?M@NUUs%kvP&f>Ib4Q7f9s;sO$pei1%f%kS6T}3TLC0W!&-O{yz{+f~` z6j_FxL*$sFoiuCGWry+trJIOEM*#YT7$cLV7mhrpzm~8oE{(+O3lF;U(?#C!jX=c4 z_8l<%GbM?ywAU?G$14@DyF~O08lx9mU!L*%`PsL#voqMp^1*{v-%{6s9OTRnaG~uP zbqMI0QU}{#a@@52X~tv{?c6)wH?f1iRhfgr`=-t8smezP+;JKziV=j)sHmJE>!J8Q!*1Q645JGArfva`#J zrKq|#k2!uN%dZd zc%KB?dO;0&dsZ?d@L*TUjG95lfR&Xsiclm+RFZYAH5=Wjf7l1~0Lg=no*rEjlT;3* zTXwK~AJGsWM90 zynPiCGPkq@+&uHopJ&j4uF~d040E7PP;)c*wqRa%JJZi|T>x5Pz&BBD9mavw^Q^L_ zE(xdQT}}~fk-|T>%(5JC@OJ`z26BPJ`TFZ@t7^FGMMlGL`)%RO;9v~iwky%`AZnGf z`5&Sqv#+zVvoO6(qM#azhLAXlhIybsjn`T?Yua85k2fOhGwK2w2<@DaDpUOkxP z%*VvUQHIr~rY5F^kXNsIeW|~OQ497D!2ZPq`-V^U7N!Lt7OQ5sCB9e4uJ^&`-8|UQ zCi(4v^+0B3-Yzjgn|xKcH2UjnSl@WxXZf(Wv^0J}K|!ze5!JcQxv(b8se&V@%gWk%s8t(_l1DG z*hPFktVl^stsh@-x94M!{=2n*DW}yCmBjfvT4wJ>UxtmmwO zc~Dvlv>uS<$LYZjON`J6jwcEV%NvR;9#xZdj{5J22g~?UP>cTZznmM>{-+nOjJ!*KXPp$}h{m$}QgPjujsUgtc0CX5? z>d^{L7?Z!LZlMlTy*K!gk4kdRLb|VBiE*`*<0|wHLd0kKOcX&KQe8GiM)h}&t+Xb> zu=D!GCdla~zoJJ5AKBR1cfNS^fd&|QUw3moy@UilQ=?BuPGTuh%(8{;?Ml!A5cV2)`eRYTQW-GkAfMo0IcN1kPmT zc`!k?a=V{`r4uBgeo;p_cEQo6+6XAxx17=IW2hd;aX>Gz1zW3`QMzvu=tqcYXlO9= zpVN)3otwXgmHs>92ZrvQm-rmhhc_l%YBH*^OTx)&!K)H>kS&9&`8#PzNyt+n=ir0X zkh?V&`%_E5hS!4+QCHbrH5C*T-mP2D_#7`hZz9e__er#P*dKjg$yZAoI3gWHtXhBL z7kBKa$c^F*4E+_~X4St2Io3ITc*aYJv#noFQqpjgu$Bu_j#~g%=r3K6+D3{^izd0$ zJgaI9`;HjoHpi^PBO~L1tfHrCtq?7+(ey8K#?i{>hHKiZe?VD1eE1MPQiZg#wyt)? z$tf1htt2lGp|a0VP)oeZ-9lcY%>~iRVF8t<3|Zw4{bxk_5sqT5|MFIA{IBHkZ%qIB zoa?{PyjJA@<408h?LLzKN<*tV*Zne50rarwf(F%G(?>~3Zlkivq8@0D4uDY&2j_v1 z+bd9{(p~48o~M$&_MbAhRkr}Z&ige{gM;d_rOen;UiZU<6xZP|_2!d-kh(?a zPmUu94vsbJrgOwyus_eJN=|M`f1mB364!`S1UE&NIm* znE#97Vm{|Rt296C4@DAjcQijEu(;g%dzX_KzNcpT1J)&x13+GdQ9|Rx&vWwIgrh*e zot?zE*jRQbqo{ioh|D`J^ck@n`}_NjyRsft%h}XbUX!Ja_XBb|69ol}h6|;t@qk0~ z@cjMl9h=vbe;-LIVDH1HY{!nTSoz9@?l_K}7Pk)*HS4zlNl0a0Jg9FT{HvCWO$PKx zG8Vmk8xGKLv>a*0nn}vDtbPCEM<@@AiJAZI5$B9U7dbn7QGr*{2+_97?xf~;`-`3S z#*Km*jP)?mnw~RFX~2KIbf`JdpJ}wpVNmT1ks8s^5Y~L)k_{gzKr%_!IFjB}w*{dA ziqpjFIRpJ{XZ3sOPFo`WBbBRxH)_h(%7L8=8fArpk>#nBRD4k(CXx;Q!U5Es2B4z0nMl0owK`yWM?HOr-W-+4v9sdV zWW}WtHw@Q>8x?}K^_)D_6vvgl7+^P`WibAbbmkUmf1e0CdC>5Y_ah_DErqrbdVs>K zIOz%+7_bpa?k&iI&g6lLJG5A@D5{M)o^rPsK3HF(mM+8X>MDp0nq=DC*%`!S6l;Z2 z{_;DjOSG*v0@}7^wd3T&)k&`*{_Hm$R^{z|ed>L3Tc1?8Vi9T_pmsuoRviuHPAF7M z$0iP#1aD5j+uy&Vq~TRYCE@CC^|RkZ4i{KjQ#Cof0CQO$bqke9D<3Z` zd&#pHmgt=@1=3uqF&w%m8bhZSJIh@Wv+L`n0LUN}BA;UY)vtr*DU(%VVE*zD5>SV5 z{Ivg?zLnK0VDh3~otJX+^56?7CZMX1RH`4V%gMRi?#&qDS_W@B2(@uUwC(+4c)eM=V~uJoocOfl?$_^3cv!4KY~ASAiYbZ!1@fXND7N?r7wZHFIy-{1yqYI z91cVL);2;(+uuLwdmVgpV`LFFqJypZI;P(DD9lqyD-fq^;sF@e+j)!7UVlV117%A6 zOz#b>}pf`AFl`}%rdR`}z38Dpv(yw7StsJbe ztKdM6w6*6!4p4XTC_E<=#5>K+jg9`wKG|HT&-bTOuMg+)XTE<|LgcBZaA)@yY~0WG zT8Nvh_8gxC8#J&(KKeIkz9@nvbps|()Dbe+dP<(=#+3rF-+-9H<-AIIU{`5q9E4pu z|3c1u3#o941zGR49AA5!ntF>#)^9e|IqH_|?~kTKg|?1REdv8`&?0(Y@usV*D|F!d z@qt3iaXBna+Do&0?;Y@ko>Fl>6NFBQk=OXDHwN)_WrZ)--iAhc5?RYwLqh8!0FfXH z9>|a$E*;fCIv}IU9B|D|3#qCi_G?Wb!`6WtK^E#3^4z|y0q8$YVzIJ&aQ@cD2IvZt zBvsf}&h#yowj61-RIaoHZ_YxovX048RqHu*1W3+@4;oM{iw71l-YG$QW(d&Sg#!1W zd%oy46eJL1u&$89S}4zX=KQ{oD|<3*Y-|9+co9qqN{H_HLzWpvQFy}M(O;gYH9i|q z#89Ia%g8rWOj!iE=NPx*dsPzdvt=_M+pJ=S;qhVl_Q>ID%*?E`XZ1oqtNZySYiVn9 zKqGI8_NN}qbBl{B0yWY+_^5i)Es_Hep?5(ks#mmAF*E}hJ$6Ov#7x^}`wU;rcpg11 zrVsweqlcZ~$gB4^cuK0nx# z*oE+V`bjLUt+9f11FAAi`RmtvZ2mU?=>H7;?KIAI~9r4|p-~paY z?m@1lZ||-HyV4sKz%q^A;o>ZO6#7iJ;0mg?b_U_uJFdUrv8;pUQP6R3gft}_p9Hzw z@c1f!!aAtYB@sCk3$lf+t*us*^a}w5pZYJ)$~C`o0saih(b2QI0+Di_tcp!ZX-E+8 zhh+rqmU~XTuR$m&t7tq`Dgb<3d}?Y7LvZ)&cgkvVS=9PXrP}#w9Zq7718Mi8996gm zZ7*K`cjJ!Sv9e{ooV>g+KoDtx&;WF9zMaLOwE13NC13^kkVw) zohR`}l3N14Q>88Y%D%q7pt+k2D`ORxEas56kl}AAC_|{=aB%%RcuEm?hl{DdMAX6l z0SqCxKg$js$foYo2Mgl0z@$xk!(i~#3p>>m`U}S=5nC-WHa2^2PvQh|4d(ag zU@oW83R?~s;(0G|O8cx8US0(SV%S0#c>Ic)nKMO`(7#O035}N9d_7U^T>7pChfJ46 z>DRsL^BK%rKVg^1)n&2)Nwkz_$zJ8YPXQRaSyqO>!MN5v&f$e_ZSG(&!P{>yhQd>3 zt#+cyA%D_}s{@NQEp0lgIGWhX=WzH+k3V@t%cZut#`?@Uj3?8guW(;ojwhn+(!s*|h5tpnnKPbXb3xSt=8_Bb->3#KUsSeFVSi-Jn-&!UaMc$X%KQ z7uoo@xVyC7X4;?AtrfC0PjKTzH9ox`v%j|9!W{hjs;#YUq3PsqvXF1R6Z#ABxTN&Y zPL@2y&Y(J^z&%$>1^RmJ0ekF|HvM!iNj-;5MKBXw5pI{Q>%#w{kpb+Xb47*xy9(t}>VqOuQc_-pbV(;%H3JWJA9sph%8k&IKrmS9{;Lu0%kK$8O zcq>ytU%rs2!*3fP{OeV&HNlQ)_;wBj!IEvx$;W-T65QL|#|hx&#)XYG0csJ(NJ{Ex z4X2fI50~fvIAWBO0Ih{-mjX^ot;v69xUc0fXKKo%+5xKvL|!iSwC5ea#^(NX4+`FG zd{irTgsY*vSd@8g=O&M^uy!_P8t8L>SE5xnimWSCrP(7nS=^CTU0o0$2GH_pHh{*V zr5gB<7Q2%x{_}Tv3d7$k#6~em7m{CGFdtX}dJ=fOK-~UM$@Bu|LDW9~k9B|H!TLWw zW&b}%u>YrPAS~TL1`2x6_Xk+eBP9TdfS%SW`t7Mm;gc;o_>auyPmT(_va+WB1WCTF6`C0l{&CJ%_CKph#L&k)DkD2G?V&OD3!wa!k4YS%zo#bFuF zfKy@O)GS%RIXW!vJzd#zBU%$&?Bh=VWE{%%u$O&yY~t(hPw#&;TG9gVovKs*bzE@j zu5EL3v(e_fF~Hke>Ez0Bb=g-Mr1eH6wls}E`?e|JEnbSForKI~29Y_#=0uz&N|97{;hLrRVs*hf1 zXfF1x~M^QS-ErBv1ozkTh2!-cGziWH}5 z2%`8K4V>{%ZsFP3l(f%$-NmG)gYK!i9wU)_j~bNIRAYx8>e2q@*%8X_Hl-)CLHS2Y zk2mXY!7ONbjfQrm?%$6wC#E7M?=w@wr-0x>)WhLRi%NLuk@+-x8(&<1k z@>UWoCcK@bMv8emOCg!iTJIv}LELt*Yue|cN)fT!i&dX;KixGr7)v?VrJWVvo0^t( z>d&7)x2tp=6(Vmz2Y*`J68<@v5M*UIab44f=P@M?$o=|hrpseOy6 z^j9I*Zok3ZiLNeQ#oyOrDAd8P(S}Q!nwp2T{yz0W9t(ZoQ7nD5Q`Gl6Y}A)`6xk3g zvt!!lQ)-;tFqmc;Um*}EPg#ttjC-yQkVDLI!56ockMQ{!!B#_q>N9go9RohoS&uia zEiDsg#_p#x3n#a?w@XJUKHe1c@$s3&H?B$K zc5RYO0kVp1{hmeW=A5B~tDLMqp%eZ53CB8oLS{D4)~E*V>>s$ZJnR&u^q5(vErPbD zsrlK)qr5pQt>$~DxCltkV$w4v`7mnx-xvEl_S&x+GXw_*^UK_2OIjXlZd%<*C^2>y zrMp@eyuU|N-X!O^YqL+m2{&d)9OavX-O^P*7Zj_X$kRIB7nfY%ofS=d+LD%%HC^KND z0%_9Pc`6KK*REZA?%#o!x(t21roBdf)RZeJARsX4E{POOPNZi#$0cV(D<02&)~S7F zIc-*UCHsDzv5e>5J;xDL&uZD@zb_65SD8?3oK4T4oyg*M46gJs6d+08WGOayS6L}c z2ISLA3}PZRU$4a+m}((bZQ+}TcGs?7ue^Wzs;>p|WCA~%p%(AnPF=|EZ>QkZvl2?W zZHo;Hik4Fb!o5ov7aO7OW`_H+=@02acNY{2J-X1B(YIR*rj>nSRcAQM9?!l+J1sTP z@Eg%+xo9%~*|UCZ65b9bID6_(-*_c@H1r~UZ&hkoe%Pwl7*czjIq|K`^C6aZN{*{Nkb45g$cD>EvZLeZ_S3V{-PE-Zg#N0Z)?;$>r&Aq=P|GHKdt@UmtY%m zKyd9Zu#_i5AP_f%UHHN-v-JMG=;q{l%cPmU-(uFK(KMuPC0$fh)Q8O>TkJF++xWx3 zAwt>WUHh5*U|f(VeqeZaD=yJ|9)oT05aqh+`{$OF=i9DC!7~>2_L#l$nSm8?#z-0A zpvKjOG!XWlzh~RD&^R%^mw_%6x7iS}fHLTfRhO|m*w3gu*2sm^7V4BBmhOX<=L;lY zZ-r|-X6E44E3q1SdzH*{X^O!dr{y%!$PnA`4rSV)@#*;mtaPMli-sOiuxb#o$u}zh0@Ks?uPd4$6e#MXS+E5NuWS*GO|+lEJ?o z2|T{bMooEQoTGEg{IB(jhIc2d%597USnv1mN^QIu6<1cNvNJeRNI2U?H76{<&PJ$_ zHY{c3HfFne71~Va7x3q{oJot^SI4ZeF$1&bOHb(dj6U*ifFL7(vT9y$5S)kGSQTJ* z9MquwFUPMMZoqe8g=8yeS1DN|4+3Hwk^O3iV_fUCtN&gxGOFsVH2?RT3w-}MzS=SP zzx?X|?Jw3+&L-5)vI~2jT{N z^Zp~>x2~J9WqLB4qY8>cJ5OA{Ht_1cwIa5Xcxq*3MM*{FY->#%i(r#P=mJ;N9X7VZ zbTm8L_(D9gRQpHKZ8E#cB$lA5w(qLuS7>SDC$nrLKG^Z!kaIeV_4Djr)p$G$aaoB* znbdVtL)NUiMtV$If=H<4K-VQoprCxIVmNM?kzyQjZ68#R{0grYvYvN5OCioKCYAsY ztex*vi5Uy_Io4Zz+PEG83jF(l-yMB)quWCSsv$rT|2?#H&wFL8x6j{u!P~&+2`QwV zbVt$7B3{6hv1qunnbcxcZNwn*>~5@ia7|x-WLcTNQGP}S#8E%^y(>3_%*rZT za*M$5`}glP2Wd7$Q)irjH9orcFz`(jlT_vN{)Rdx;QcSO4zfuUyOwB!=T*luml$MZ zYQCP%vL>m^H1`1)VJQc&;)q~JzxuYN6CMC%) zt6Z>jmE+y?=0Tk?>|xFauU;+xK&$#+W;tTYPBTs31pTHHo)u^h zrx>1JsjK7*^w}_tMu)eTG?YVlw7!LrZ_y1_JaKHEu6XymEqt)jo<)W0y0o{G^@5MI zlCpAofzhYOP$GfpMRqp3bjv|PYwJY!$NlvJGrN{iVC9*mWbXBP6a@tH&rtB%zDAwDWo;#*kS__N~YrH zzyn~6wLs;mXFlTn)i9sV1b$3LFth!BI03|Pw6%2Ax{5`~gA;$Kn1cQwI1k7nVPqx!IU))I-M z1(tyA4Zq*Nt?u7=?|_P)!m3s|PQIk1<=Om7joa!$^P|UCkj}b(1wy#MV}4__3wp;o zDCo#@X^1K|j3PxWxJ?~GdMcd}u&3>=0teV>-b#M)z| z(Gnzo;%$lMfoeKK)t;+z!a=7MqnWe3HJIoG4Zkf3=U1$p5ejFICsM>57^8|`&Mhxf zKF~tYQczG#r;0|;v+}!nKAVk64_w3vN*WH;YTmn^?thg!mV#3`&Sp7o^sZ6WjU0~n zbS6lQP;Qrobb-Kd(Qw(Y`PMI^vlL-tK`17j#B%HO&sgl^)yxSM|5d8V=25dWwZS}A z32Di}d>;s-I3-tWi)Zq4s&i+&cRMZ!N&8E`KX>Ly_}OSU)A@k{5ws;zyu17U`Q{0Jw&IocAUeT^3IGtfc(Tr*&&2sa=%C5l+j~Be!Bw+P zS(lP-dw&02?0L$=>rL3~`gfBfk{9RJ6bPG3y7c{aJRKw|cAC@YL`0*eT z!PRDd|5mmrx!sw_tNtzbJXvaL>PKOJxvY}O-?NL40c$;I($cv1h35Za@2#V%?7R2D zgN2HMh=L%YNJvXJDAL^_sYrKsC;}=1(j7`SNH>afNpm=aba(gc7 zw?jM4#{%?*>+$c$*Y-rOFti zSI-CYw*GHCIppZp?q(_!Vk#=Cp1s|)hG6+JP5EP4FAsb`@_wSK@65Ca7-@DCI2CyA zt`9~D`QGfWztBhi5QzHNa2z~@AzuKzr{*uDa`knW3#ll3lRckIxa(shd~2|J)9g5j ziHR{5`>O@hF1I6|*|*}|a(BOufKtud=3P!!^BhNc?c+TXZ+M%1?0t=WjF_f(aLzD= zg1Q<2y1T|CAQ9bPmN1T)WGa+|(J_{k#)Y4QNo*ef4n?sT2AQ!Y)QlWd38wC|r z;d&!`?uj)!B1g?b93aA&dOd7dQ`<9FzBAIbt28U-NB0w7UFPh85u`_Iye5 z1}6$etGTBqiQP=C=sd;2*~O)3cFkZZ2wEOz=v|C(tva0pC^zV*2eO_)0vnn?cG599 zmlLS_2Z~0CMC_4i8;piC=}b!lMRZV$Z!~5Dk0A-xnO=8`6q@@#Sp-688f~boBK$+n zcl$me&*2SeQc^Hi2_HUOL0d9KN)Ke22i*p}_LrtNhQ}ouCC0t6x0Bp|H?o^f|NX1C zk^`qva#G+7!`hDS>(Yk9T5{D05?Q48lh{*m_aW?Miue?HO!NN0A~mEw{s5;6;YxI1T-|I@%eB`WafE#K2!zyxj;QfU8L^<} z7l251TFAs)&YO(F^tJ2u885C1Q#>JH()oM5=M17N*PpAaKLC8?HMkSB>Dig5|1P@c zuW_-(1I4wM#w#4F6K9v9*5ST2X!MmO>+i27ENKseyJ)jLo{Apb(3cUvh#4%t58+@U9`XhnFsV7`5PJ26q`@Z_rAvj-!U ztVeH{QnC)pXO;))5b-<_#KXOUK?v*hQ{=3MmgD|FHsN)e6uc~5S|uavaV~aM;UB>n z8PtHPHkxzn3^p^3lpIMxBEjV`e{V>bE`Wd`?Ky@Me7jmc#Q_#@lctXMR?19vv+6fe z$Cjn3>W2l_&)->&yRx|S(Fu!*?aTyMADYe(#56~as*UFsw9DM?dvZ3TTfa!#~r*}wKywzMj&Nxe6m*51y3%rHTc4>)3V z4_TEV?vRo7%+W=eKpB|fol2QBHv+(A!)k^N$CH#eiNH13f)NyNDk>>Dx;0;WviG|S z-TOGUxj$1cJL5P}WrB;?{4Z(uzm-N=E25%8@g|m~n3#*SvOt^WOq~mPyIIZWdIT(68SG9qN+2t7=0MH`P zjbS~ILEXxv3XI!c>t2iQGK7VXW}EZ1XZ;FB`}xuKee?n4wwacTtgUV@V`5>s8&?ovN+Unv@oe;n63+S|Wv?_koi+ISB3&Sav7a-GV_u#TCb z<3VvYYYx}N(Za1grSy{k@rfwmyQ(=6g@s|}qq~&Bf*cRR+I(ibNK*{Ep2HcDkdU}X zGwt(J?-3PMEU2lyXy221`_}fyXzgN%6xa#qIVt6D*1t|KY$2n0RAX9>O2{!V-0k+Q4+# zEt(j}Q%XwYcV#x{quV9>6IW3&LXYZ(3rdTy z|546WUnjS^SOCviffqs756l@a2- z#KdWtm{?D5`7FMlEnjyDvA`6c;(l~fIbWHOw|bWE0uC}G&jTsQ)9GS8&#=0rFAhJXvLLN%9MYdNW|?2w%v20I1cQ&-Q4nhKWx&VU^xYJ zIN{@yVzGa}p*KY=`tVn=_dB(WI&ABfv)%-7Z1>Q%(xV#Nz2-GPwcNRZCN(u3CiZGe zN6w?P%aV4>0}?`-rA3tU!51!HfRC?K^oA1h4f#g~Ly;fH_#xPEcmI5Mw2C2kceQcy z;WFdC5DN8QoDek4XfzA13FtFP$+0A3P7Qqr&BYNsND zm0{R0Ep2T}A~Dtfb?GWE=F~6IIUMse#Jd#R*w~~&7szSV1_6gxZHV9PhsD!pgM1u% zci>4c|E)cUx>Tq)@utdg?H$scBq>~EtlV>leF}H#7RmONVxz9oF4c-}O&29eHhh3V zeFvbDKDsUkKe}IK9f&+KdWhJrX`j z;R=h0jMtFkR+_1rDf-pVAd3aPFNSrgM@m8Zx{KFg{58Dw|g?U!bo zMj7x~U%#fV^gQFi^y1ayoli)!QYtg&R?Slv>mjWjsXKd!x{G{+DB9s zV`bd=qAVQVoA~t6O9aE6T-@AK)2pFV4v9cw)-KSdB`;?xHVaOZinQAeegd2Es>%Z} z!|oEC4oUP;AAXL0PhA(PcM+QS-Ma7FW?u*kb2SA-{XI--i9S4KMS~5q%+P*9|Ee%N zGt-QMf~LdhYFo z(5yR(ZRDf}RM+;2mDNW0-r>!{sj%P*=PkfVDS)97YL=~H5m9%Oob z{asiX-u^!JgTVGI^u~x!0LWFOP9NPh{ONPmufZHOKsPE$RQ>D&8OX^Ggmg|;J0h+` z*4AG3#X6Bs_U7&F9j>sQyE|N<+wz8a0f~iy20LA>p#=kOlnq>kuC4?jU-yqeLF9a= zd^c{~s3aj>B+?WXUN5TIM;blV_{Bs+{m|ZtQz2KKhMb)74k2Mkm`nirSd6hwO!#i? zGyXyr8+{C_i_9td_YZA_EIs$}4N6&ZdqXuXYs0P4V+%DOOnH0zWVxM-~03l}x`|TDFFDTWGXKFmZ4S zh^=&oN8niZ+pZKdiQQF~mF*6HI@OV-L|vrb$=#cZelYQ%LiNsgZoAM>$}?+Q+x8+y z2lVPxQgRBM*iyVxNfl@Q)!2haKoEx4_3yOLg4EIjcscnB>mp(^rGH-#XM0@Cgu+wD z#>TFws=~#!VXlt*2O+nyPfZa(*5+O7u`jr&`R|7bW@n9b%cu*bspJ4a|1Nd_JuDwv zJ-VQJc;DfESQ{$})%Wi`uW}zDqn_Nz&CDG0$SwT$u(GXfS0eL^M1(1rDy;6RcXuYO@3XzUYhSlTV*+AjiM_`-prgY3T;z&hrI|CG^&9 zeteGIxn_#Tc(zroLl6-FAu@|v#MeBV|J|x4u2|YxK@*MLZjvb zwCc=Cnsb}{ow*#tZb!AZJaknLdd1ue-%ti&V^`koiDRAA>t013rR(5^#DBjs#9-^_ znEvAITKH2P^75DHWAx9rlMiOA&iQ`A>o<3@x1Y@lNy&Vbb`ukuw6pZkRtoB^?cp>& zZQ%k%QMxrp&GZ85MJ(lwcW^5+R_%DbHQA5SqMmB}2wz*MsNj-K;Av`Cp+i?V%F1=q zZ0{R(#kcK~pj<4cg=_fuUEF$6?ln{TK$DMKTQl-U@%x`l#fu0F+e-C*rv!xZwbh1q zZ?seMov_eQK;3_v*L4eC#Q!qqm>k;D(Gjt+W1X6v{Tvo%R@UUgL`g+uedbCJm&j(W zU1WOtyDe|37PG;!GKa^}eP|W@{?+L*Iim>TnPsOsTOPeu?IdoQZ$zZ2lq~%pliSM8#a&UI5e-B~%WsMhfB*h{zLxx`%3-a2H-`1lxzUd} zuw{6dKu}jV_9|x=L0fz*j$mhM6jjliImscf64Ld*#4NNI^AC$RX%s(9oE;mUaKllY z6@zH@@Fc2nVj^*I(M+rA9=P);332h(wLgewF?=>~ZK|t3+0N10Y)!ksC7j&l5)&hk z41XFB5a1T{+l2{@r7fHO8XWu(rG`sR-hG$UGZv2V7&e2LcCBlKoWNN))J1ndn(*23 zQU*MIiZ-fDJx^69mak2<%pCdSmg}hv^kD=c&F7(pJ-@fq4;B&uAb#}x<1Ux!HfoDc zh3P+k-Xi0OciCAe-lp-uuk~VN~!cBB&x6pEwq1t%4j+6!40N0!JSL<2ci@ z1XDFw{ce#8yt3QtgaF>i!Tv5s^cX(-h}<>Q>&}L&M%*s z45u^X=jRjidd4qM$tH`4+d*SlP*fCw;QB;Yb;rcaM*T%y;Drqs2pTL!BdB8l&al={lVXV!MNI~y(QzRh===Ar793BSxbB=I>%o1 z1gti@A1J8Q$H8{4uG3 zDNPEq5Y7VtJGbH7`{9s?g09GxjSXS5a*C@1tYoG_?KNg9Pf5 zrpg6BTgdV=98es9y8yyXCK~wQ-Jt2**pVHe*S^bxIWx1XozzL5muMu?)pQai;e){_ zg)`}r`d{Qa>{$mA9iAMe1yC>d9&Y~+7vSl$uV%yfQ_IVeJ?s3LyYiHfhTnRg6UpG> zvV9NWi3&(&=Q^S?Z0Fh$_n1`q8n39TZur;M^7jOJQ8n%Z2K`j6jJWHi(4lJwKH_+9 zEdbu}A%}SbWVL>-tA*v|^=YnQJ*C&E!agN8Jcsrt<{0S#?3>d8a)OP6gAriopeSgJ zO1}+lYbo$<{hFPBqFbeN* zoM9Z*d`Ty4@FKZqdhB7;GLlNro#dfjZpbj0qavkLC%eW2cLyJ^L0Ag(AA6kazJ}|T zt5wI>m4^#vLj(RWfyc3Zn;7i-I_LSh!NxtJ#Aqv%rSh{PCd@v?RwAt z&Z+DQNa&n(Ad$Djvg9rOLuP>7puW=lZjmVve-d;jht3}S?*VTT!7Wi;$n@%a~XtNQ0GReu` z|232`naHLDDlj2LF<(5FO%Tv|@6+_=+sPCDrM|p}Bs`S5ZUXy@DP=q@eEdY-M$~*_ z)j=fJu}vI1e4u^4D@9~QmCbnUBLG{ps+oGID5A!IFrDuf{`*(_+2BG?=T8K8j%wB# zvLnW;9sI*nmA&f)i;9YJb*lXs$E$1r;R9j^`l~u7ye=Ypo(zs`&6xDpk=!QYB!B!E z1MHqBxT^OrV|$-g+{lnkYVPO=m~IM~?Bo9YaSZF|yuA^SS#P>1rkCxR?YqMn3bn2d zuw+k_(r=+@LVz6$Nq%3*>8Vc!K3)YE?+o~{az<^9^9dHsgsWKiZ(-xJv?^JE-g9qz zKV5D^z+`l9bF-mmI0`Q1OUYjy@VfpbPQTbe8<15zHCbck&_ zfwwZfvEc9HQ_Jw}EgO-IIH7Ol7I7y&R$^jei6!zTpevfS9&QIe%av))xg6@4PuAe+M@NQ|;4TPtXPU^-Ffv@o70F2ZtY>8aa(hI~lO8EWM_F z)xl#fNSY(_q%xx` zKoF9RmYM}1-+Yt*Hv2oZ*Em)0=X-T}{JQbV{-JJgI+JYkPyY{!gKh*>D2S>-~=$LAe8|;4T>q^E2??ms8&zctE&Zq2Uw~-N3PO1 zHN+pTFaZ*uWJFhdk}-RbtKj2TZXblsbn2w^kSLVCm6aUCE%=>r{y^fwjUumbpSy`r zqLOJgE$z$K#}q=9&b5U+!Fa&ydJ9qN^WNIQ0S(CXvXrprjehuX5LFAM=jGuXoQ4lZ zNlg&7Fld(lsj_$&TWZ`5@thS+U1sLfSPqY}b5nA=MbKdw(@xUQ(L7sbl3_puV#+ ze(xFr?j$gOfY0sijey(%Zknu;XUEX2=CESeOJts8+AM{Nan4X@EO(d&tI_ta-wTiD zoNgzZM$oPv8a}jQ(rT?>)+gj~z8=ImMyj4_{Tgx3?Y5skQ$#^g&|${*fMzz~lr$cQ z_4zBc5&H`VE z(*w;bKfy!{AJ&wR&-`hsyD@};Hp{yv=z8jr?HmTM+3v|6HH@D1%MDl!d=;ATHSVq9 zZu*ShXfC^60TjM29KrMFbKy9xb9AaBqd>@PVY_YV+W!C$SM!xWf)~?vfOv@qF0&(y z$DX=;cykg&Ql=0Iuw^J*{>~DCoI%MHsz4ii`&5NSzr)CF&?|8nD1PJn8BvBbNb=a? zR#0e@>jk|v5BD>7ZqL&pBmUZh3Af$V2_NjW(PG23SFQ)^w;M(s%In0>;9SRmUbPb& zIUq2$f-Qq2M-k$soa<;z1S(ej2$!EywucDW7v!Le9(BE69&%ciSQNj?lTKur zD;uqZ>*;lI#tGER=H8$041damWdvA_+GB}b0MIYkpX}*VO^OS#QCopx6xYYVu6nHZ zEiEl+)he5waylW~_991W($cpKiwQyO9Dq4v&5_!d)s6__Q-&jsy23)GfozQc9_Svt zO9RMgjgbv8x9f*kcC+n2FC(Ja-O4Q7Kyl+}CRh-%5$WGeO-RG9&|36&dV8Zj18LrD zUi5cr>K(LRTl_t!H=CNs2UFH*$VwH4t`4H`&OQ@#)a`xqJUMgv{yim2wG>^cvOx7u zGKBUrG?0@YX@FHqV|=PH(BdyAFwu~5cCvH+c@C;cDE~j-8vXmFJ?8y{RWgDS&>jY? zmGikT0rw&51$1Dc4Nz%BU~q8DTb8NmX(25tIk8H-;e1N3=mqMJ#AntT=(w{W@H&BOz$TJRQB!OEI72S!n~V6zwHrR7DY(GfiqiFzSddLPwC;K( zaI~w0h6Uu?k4v3qK=k4}=qTiB*7`x=TxhO6B8%jnJx({D9je?aV*7eQ$mFVE~FWBs6 z#~W{=L_XhZv$aos1ubKt;ix)&Oo#;r#5K4C_9{}uf-l_}t=hZ2b!~Gz$g00fSSq0@ zA_iyJ>my_XMHrV6ef*^qPc8y4nsFavV*1|_`|uB)*=RLQE2ET}e7#mxdhe;cH+7Qp zdtjsi*w*&<^-GKL2Z;h6vEZ5@Abj3K%5NfHk71-V6f60IYB(`GJbs|`Rk02MV+t`2FaH8;^S&Z| zF=7%DBy27Mcq%uaTZd6;RXD#ph-By}0y1-!t4{Xp8KGlOq-Pa{V%xXEt(A1YL zW9)|tCJ~fH?XRI>jm+TSwI$~)DEj%sA}AE!)-O*D%!oof*Q#%R2+TAAUCb z>v8)_GlWg7r)|`IgSQ{d&-7-=j+{J7!zU@KQ5_j@5bbt33(`wyp0)uvow73R6_i#u2Jtklc7Y_sI)* zFWg}6q7uC@ydO9Eqqha}#oe`j|35?DAn#|j{__X{T;N8Cn~KWIGn86nK}|SN*Goor z9X#q)y$vQe4e(l!NG&2$s3CRYJ~!IN?C}zNWG+aZMt1+mY842kz4|SB9C6TF@dfI_ zcOMeO&Gmok)~#rG?+YCLz%&=}>p(}bhR#*!D2L1)hzNhE{h(yZPOF^x9C9~n8%M(_ zRKVeB0F(J1v4HIru$g|hh`#h1OFLm_DUt=8PWleB(kAsTVsjFrJx$14Am<&PV7@)f z5dIWe#)7Pjly!vUxTQS2U`_7RT}mq+EUj(-Flsr&=o(4rPY3_!Ts9%}5Dzbm(ZwMJ zx*_6pyqa5DCi}T`U0i6B+;^Gzs}CBG$e1Wm?V+GXY% z=f^7r(t;ImfacmG=iaJEuWc1M2Nz@*hM*%J(Txni2+eW0)Z{DeonI9^~C*>Ze* zY`fH#M$be95C&u`dg*4e_xHBmg?|{TeZxj%k;0p`;Sez2V^Qruxo=+>2V^z(OU#?!cQuwwP zRZ(4yDuZUyX8xT{eqArq?No^mWs-?B>_!uOsvd>Qi9<}}w$!%Mb~L(^LeUWey-B&J zM@G&4E>^iS!TK#f=t1bmBTITOmUTmB zdSmLPfoio){)UZ>BNbN#VX5i0?bX9ieC)2m(2-y(m%!%|I-mDS5juG;UH0L! zo4-}%^oWx;1(omYC27INK^4+uN!n2+>lT?M<-vMV7I61Wgs_XBu^7)aniyEWg zwaDsI%jpj{Ohi8@Cf$O13;EL7-tZ07%5P!18~9RHd$vHreN08=H|Z%TUh8@rz!`qc zGV^q86gC$Z*Cwzd%+Fn)plgQpUM4}r0>Ayq@&E}q_2XIYOPArT;j87cwieu|E2j|a zW&(tuuy9sm3gjWCjy^Fd@+9BVNz~D*vyJg5%a;h4X8`14qJ)tbL9a-tmV0Jp^BjPj{#yGgN ziY)doRLZdB&2bP@wq1ki^336sK)w=}Xz z0!;&I8G5C!T+ADu6LA;|PyOON$9u3ZUAiJ(H#toQ7h(}X6N)sKIvWR`|XG2tt@U08OS>H+IjGq!1A85ezK_ zC!TFXTyfVpQ%tN`#Wljup-!$*ynh+UW$t9ah;ZFol{vb3-$G7}5oqVp(dvABp;mMy zskx8sPk-CI3W;yn-lqLn>#=RH3JlrH$;nX!=wOe_c@qK8J_YGH`iSaUA%A~VXe{2- zLO-$_4fO3mmPRHad3=D;Uzc`@0NbBoJ@u<>4LFDuMsn)i?L$^|^QZ(~fabu@Wgw$m z1O7tgmCIrI-tf!}b0sx(k-NE^j6l@uT6jA|LwEN?Rg@J_;qR~ewtYaN zY%ObHkS~=ITAd8%ANC^_Q5k|zrRXhutzTw=inUmvgBM4N{VTnNoG2?R-vgMuX;RR; z2xx#S3~|?QTS#^JUnb-_RCx2|yB!16X{{yG_-Oug8>i~~cO#%i2Wi0#9JvWW`&Mgg zQoiRKIvy4+qGDopQ`1)^Beo3=|4<{h);NS>OOs6pO}~(y+ylkcfgDXTU{QkTbt3TQ zFsxTc$SNJ{(0kzYrIN%OUC^Yc-rBF%L?-s0UqmKA$PO&TMAto{XG>{WK$`pwEM-Hh zZCaWxT|y8y;a2EX*j*fgAq!P_q@K9m2thBzL@a9n(D=bvzW&qjSUs;z?wPct!f%adE}Pdl+VEkqscmGtEw*N!}qK=z!o>F~{%`Q$0(JQpPXy zIRNi%oSdKohfjMP@+6>k*soZPcTP15jx`a^b?z1XS1@k-)I&Kg^b{6v8vzo>XsD>X zQG8)LqJz+qjD6b#NN!X9WKIgutVf!y{wX>-nyrn_du4d0(vyE?2ZVge6KX=ept~6O z>#68(=p5tpt2M9AKZIJ7$is=I0&N4>Kjz) zITZd`3;1y0;GG{F(^Zl*d#wG|rM9-Qxti=EF2yLK^JcP67g6E5XByd}^It;`eFq#6 z$Rw!V?X?dKgArTEd(pHSCJr8T(*!keeVGk^KjnK!Bn&QhuQZL8-{w*);lK zs3rNYkGpOI*X~2YP5rauQsT3j>j*Sg+QX2X@^jSea%m2|I#-l_OOR0et9yX!qxFl> zTw35}70;k7OqSRG)Zx7=ea{75J*xSyJck#ClRaM^@2>Yidy^FFRj=j}PGrTBRGCFR zXK*A3QQ+?4L;zKw&!?cE`Tiab2p|$T`SU^V3uL9R)dU)I}Inpp(SK4>>K zzF}saZp$zacA=uo8mOPtzqdsrIl@mgMXT`r9z+bAr@tjk%1(}t!9QlX^<8@&_s0<$ zpc5dlYIWFgNc1$Nhju$77wP`Lcc2^Sg|jo4*QpKEo~xmXNPx&z&Tsb?!@PU{e$&=W zi*a8C&1EvOOXZsz`08{Y%MF>5Eys_wK3}J1W}Zq+$biER-IA==d@#hsTE?*Fg1EW4 zfqoJPTd+w;L`G(Zl}1XONSat;-g}ckjR5M!vLGsk$UL%Uc<=M_k%9dF|Ft(IKmX<& z-L`no1fs;0P*Pr=9{$FRyk71x%%RFX&OWeN{WK?7+_Nk4hwOYg4RaUFrlpS#mkWm0?H2znw(1cTE6r%G)n38aHG=ecw*p` z%>2$!kW5}Bm=!y~{hx=cKE}bfptF<@#3O2l@4^B=npP9}Yr%Ss=L^8a3**+cJ z6O`0?fvnzGe3~urWu|96J>(M22Z}r5i?s(jB1WT<{MZ98)Z;>2{o^;&UzVK*c0ny~=erXoJ8e0NdnPKCQpJ-?$19le zRA6!^J*wPvuMkrDWZ!^^fiE%rEF`Ekd*ew7aG--&Ox^t;PyHQ>fGJaCXBR64n}mlB zWFVE&W&fc6uF}p(MR101V$IuzLJFs%+>;ly1Y$R^q3_S3ns>M8&hj*JwSmh*UK2RiJ6MICAwlu2k4mUzg0P`T%_1J z(%}b)K<|hu$p3)WSdxLq)->hruN|fw$GocT?fs!YUvZbu)CGZJlPMWtx;&AW5pILh znQ4}B*fX_{6o9r$I?&>eVA6eIL23f?KvSQHVNVw2qZe&@_95OoR~Ogi)k;>yW+iLJ z@m=RtKnYsA24$)`R^~Uzl0olau@lMax)yPji2Y42q~GU1H7+Cmo&!Q8QCFvN(LH~y zuI~JYdLPR;x#M^Q9f5^nzt7jmNSIY+t(oO`x$b|s08y{i?uLct>Yf7$M#XY{U1QXI zaw~`N+(E(4P%vk1!;?PcXXeImep}!A!fip25y^xXq*bi=C~)HL`x&1heRlsSU+*3O)g;+ya3 z(y{4kx+h6xXI1R|Wg?%iET<9Zb}33JhHCg+JE*k)eO@-*j>$8$lt!L{zMsJ>PU8kW z?P^DvvunGd6fz0hsjo_m)8tg$Gx^;-%M(vPMDr;JhiZnLzv0qF*VO`(qiQm<_5L2I zP@$J{Fu_ZAV~RfgA+Onqiusw3TkR2%HNX}AA>#zweMP>9K5{7B_p5GNYLu$ zzxSLxiz8w)PK7A=>D!Stu_O${R}#P_(IY35lkf7_&4=f8R2m&^S7ysU_VV>3t)DxF zm!|bPe-BIP_P2DdR#!Z3J$1cJA)#4z3Nsz!mbYF!c0H)2#90K@ZPE`~?3biMRo#z67{zpke&3L5 z{b~QiD@Ucc3`X}Qd4)qm2qg_Ik0eg1t2(rw@ObbjGidUq`fHXeym~cCLQTh{l3hX- zl=K}Y{4GUwJ>1C3cR$kFYnQTGH0@NWJ#7!@lL_;#sv56oU?mEKv7>yup53`d{R>#p z+=Dzc=>Y-7Xjv-|CRl7ERJwovewrAmWt2fZgyF7Ba|Az55888>CWb!zGLl%NZ@fn^f=$6y`XuUcH(lIcIw8a5AL1%h=^kd!|}D zJn5_fSZCH}0;X?p3MS5kC6~vt;$qn>(?zV9uqwNae>{jTq_ui`s7m1xfJ9c{yq+R@}$5 z2_ghciC^DVb{&t=(9r0p<$pj{ebHL#UFYB1|7Acc-=NenshbW}s1@;}dQ`Pjc}=Z{ z{jM==6NIR=kCF@bSC7U==ljyo(*iZRWo18K$LUYT@KNDP{)kO{`Z6mk%XCMa7lv|6 zg!=h@`Re1-R<(xqPN19o0=l2oBHC5#PDd~hII{UzAl{C2v7238%>{e#DvCtFR=mB! zV3h~Q$qBYrG8AIf($Dv?6rlsxes*z+eyYU*pi|fVm?IvW=?a}Xsq6L$prT2~RLcmH zlO@7hUY*ogPr<|>SYpLyifF1Zi6|B!LW9o7FnCOapWi8xoZRx3hM?2BdHUD60Bbmp`X%UR<2PJ55);&c<1>pGHP_viL~kTx3xe!zq+fncs~ z+}4EyjMNZ3e~d`r^0W&^`hL@V*8FbkuV_Mj+hY2&%~)Or0Lty*g+-Kpzh6>d14p z_|45{BD#S?gYy9FZ*px>wjprzco4W^DC>QB~EKc zhpwgN(cJ7TEdjwWaRDc9YPwDsGX7C9pc}oo7a@<p5Xd270DSb?!&NZxry@ z{VBP!ZKdYL(DohdbsS{_tty*1<>!o^;@#sM&iO$exBV|vvZOh%`}q=hNq-&|Fol8y zdF)1=in8+Y*9EA9!W=qd5a12%W4aCu*mQKf+|TrIU_Qi=h@Hhl7(EQ2WZi#bZ^J+! z7=0gV-iC+<)<8HKnOC1_5w}mo!sTI^3p>WoZWrrthW3h%7QBlKNyC$lOj41xd2M(Z zrc;_yFwNke>v4G9(Z1A*&BH)HdW@k43?Fm=ooj-{ZZ`U>%6%JeX76m2-E=gy5+;+F z=b21>=S-`vu_SXpOpIi7)6{Q~9?-O^OM!+01~;cIK>;@e;#A4&%wb}Pa`t0p<}(oy zn-!A2di$DlUn9o~r8|yC>Ha4O#P+q9dLhZgBy`$EZ`etAN|>mfLPUPPuLHy3jzV3z z_~eU)PsdFuGDH34SPVr#JDUOVfkr)Ll^WF5!EPui_W2~q55OUS27=F(9bpePem6G4 zDEJ%yMvH(9v^Hx}Y|4_HOfMv?>(zn;1O$~_)lZM{X}}9zUKUeKq%G^$?$dgJb9GX~}@H z#mHg5;LUc%xCY*<1sLDD|dG#QxK3sgbjCoO!abx~JRl@v^2)W1T z*_H^z^NAPU{|#3_REz$<{=3MPOY~@dUev#5LwIAh{v5hGmNOB&rvxC)?Cfl6VPQR+ z-H<(4%rXa!|9-0Vb>*8Yks!ZXWxt+&5Xm&y&~nlacc0&F|9}4(XM}Cjb)Y+C4(oVH zpghNEC8~(*RDQl_ve3r=?^8&D||P3Kp@Tezn}lwGMkOS`tR*sa4^v8@U?}Tmp4ae{2FNGy6TMi1S(k!T1pV)x@588)q1jJLFwhcob{|Q64hrhS1F_xqh*sk9 zgW{gfC~jo#^)vG8C zdJcxAI$S;U`F2qTs(O_@jnJg~Nd(1Ge*{^Md*w~wx6}}mB!q{C(sOb`2Ru>}t)kjF zXk2?S<;LTA8cop#rI$Q1SK+SMGI=fc_@RpmSs=U=?~@U0X(jO3D?mlM)M=8`qx#rv zr8OT!@@Zjk2PXFUYl}&c=RhY_*i@KnBbC}o9(BK}EJp_jLH9Tr9k<1>%-PSjKF&Ke z_bsij9=wEbi3v*y1KLLp^ag0Ln+^Q&K0k|K-sBj5HrKPkO-=12pZT?(QTt{`n>KoX z9A{o=T^J4vm=0&BG&Fn(J`T9!)3 z&}f~09JHFV8SY*|>)C#i__R$on_(!U`IL%ElvZ;i0n+u1Xq|DH%Pc*rHh4_bpWyRR~Iv`;0Irnnhq(#WP%dcE+Sts;kQy3IMY^S zVHIedZA0&?Bt+*xcn=qBW%3F zLOeQ{!54zZd=z~1Hh47;cNFzCnvkbuW=)%f_FFM6d-G>L63iQeEjO78tw>i zV?!wTnJvD9@1=_&CPpI$C8y)TyRD5DloDb=#6z7L{rx`aw1aGJLs|^3W}h5>4|G8? zL?O{4H&!veQBW8VN`ZqD?8cMG3n#nv475%`4VN!d=;*Vn71Ezb(DH|a1|)AJf;Q3s zB|xR5>K-l{`&gLo8Eox+$!@zVA4te4)KkBi3%xyTh6B!P^YTGw@)=1nSrCUT`R|#{t!RqF1gLh!4$vf^lmHG=8DsT?CCIWn@kgSsS?gJa z?;UuWRv&c!3Z4AynUnHaS;HkBEd|-?-$H>}p9)DUdN@u;fm+s^CP`PcUJsmTzEwaI!lI)O8Beo_zVCw{?^6xvnyzJYAnb4W2=*Y={=TnC(G zVmCifEJ+UBXK-F|km&nfKB))~Gw`G7r73dyaawAs@l1MBUP@j#b5bM)I=+tq<^DDk z*1=j$90^5p^DlN+I{G8lK$Sak_CAJ!RN1EdyPBRf?hPF3NSgSICp1zTM+;thzK=?pyBoC7+=x( zu$EtEyx2QKF<<+n1+Q>23m@T)9^dd@;Oc!>9%Z2NA^R454pIM|VuaJJ0*Y~F@6Vq< zSFKf*l$5w(7f{d~o9^CK-WpZZyc7ay8KRxc1r0kRVCb%RGc z3+CF2`Suf7U5&hWh%madvq=AMhUJXu3j5^N&=G-Nxh6m`dtPz$-^h$g8T*kXs}KO#UG7?|*I z+g)2OZ~&~r!6RXGZvcqOP$@RKAUoMzcazFp0oV#Om%Fn8Y?DpG9xOMjD;s(w0V%ag zoY*LOAWpscL?)Tn@e7zm0oDy?~XX+4}&|-Ju-RbCOY~ zK2V6uhiYj1tX|*ppspF{H6nMHFC8+$bdOhu`{WiQ6$&}3o>b6gVsaKP5e8Ug+8VE8 zrp`FeXF2gd0I zV5Uw-6(c3321KC><5hd5b_Pf_en|9 zAwSG?DaI#y_SB<9W5wxrb`0eTpr}yRQM`B72Bwk209MVEQ{~f<;v*NcT8v7Df~UWqbf*AHWtoP7v97kw zN;v0;bBy_aV({CA-3isp(AR^G3-WY!0s&e^r@RvX8+&gVR%P3Ei%zgn;89Ro1VKeg zx5fTvcX#ab=6T=uTkBi<-N(1q-apo{k2QZh zhx)*TdEfVSUFSK*ILBx&qQ-;)Y5@D?7?X}f{IzYu&xoUc3V4=%^6^m^ zJ}TvegBOa~G$}V}Qjy0%PdxlU&ibk0PkLVCQ>ul~GatwQth(z5R1{ zAYc{D$M(#z1aQ(0H(PJa$k{EtiqEQie-To7m4a_S3!$6$%AEh+*<`=Gs|DhQF33mN zta*K?o;O7S^Ip(Q4yeOoQ@-%d%U(`qSB$hXM1P#;-)6 zo)8b(I?ho6^=IpvgGhICbpPgT67~F;4vD3c|0zgbyn5B3G;)<@=Rg?E=q3!yw zA;)}rqha2`alv)el8U-|M01P~qd332;Ni6y^Zo(`Ha58++oQ@eARm>uzO?k|lYha> zjO{miL4t32Jr=71!+8LY$vHaqm~U^xCQ-U_&;X&muUWJ(KUP-C(&wSKq!UL}UyEA+ zr3Jkhj0GegHc`vM7U2C%!TE}RZ~C%QhP*Tw4|T<%Lu;Yrf@>m9hSReN5rwq0nn;$b zq+|yal$-Ne8dv|4RlWJdw+)7a6`^mV7pHbRczuni3UmACKNw|4SdWj@~LPfp>5*2lMkortn0KTF^VXI0Iw^-#sML&VA1(YnM?lP z*Wt($4=S)Y==)6D-`$3W$_}=|Xc!t#04je%mp#R5Jn=4&R71xjS|N;K?iVLxYy2gG zOuExEx-8UIQ5vYCT}7!KjRO$w8(^ukoN_yT3O9C?6|fEaQ(%y!R! zlZ6W!LA&|Bhe<8(OeT#O>BMcOo8+XVd;ykC50_~Q1eP?ktc+Y5BIe>WzjezdhT@+h`$~qFH-t)Gv}yjS_ldBT{f zniD}l)wi9s2g9RX`^#=|2Fonn1v==NE|qI{I5)mb32oaJbRie^h1bHbqkJ#70m2sC z7>PVpVj`Q(m_8Sm{W}1LfFF6snkeS|m#8SFb5EYYr81rHW<&O$n6KP&kj4440BBFV z^LNt0%5Y%w)YmrSFIkq~`4o zLFR*lkRcq4qVErguWezq`f zW7H_}^~jxsk{JF@NOicL3>f=X)|}&C9%0si_Pxj3MQ9*|Et3CpxP^_qf<$tb7sM^w z2q(cPvSp!b-%m2U6~b1)f$CdYbdc%}WYCE#5@a&nMXyE=gccc@nHT+u8g2tY%)l^P zFuzR93z7?9$3_e0kG0Q@UiDlE4Gm3v>qTIw<_>v}Qe`#O)dnve_8P+}vseWtKcVI~ zW@Qmpm*Hk3viZZEZR|EsgQT86-Sh)NVJdoj0>#5vZlGa`oVlc6Y;Iar3uT?O^Ukrb zu&5Wdj#{gE4|UV|D{JY!HipJ~ok^WPtQ5%nZbkFisIy`=N-`R7Q9Z8#eANP{$vBc2 z54GDe(XD-U!@Wh6X^R4AfUl+a?MM^s7e5@P3B#E!pN4T%tE)pFbK~6~dY+?dJs59~ zgDRASQY0pdt*hGrT0z;&3)v83tbH^*56h{0flsElC`t-Z-D$m1>bNy{YzHf$DPl`e zs_|;Z&c=JQl)r({k=S}J8JZ}b?K2?AF+KR*2H%}y$7i4RGWbbeM%LL)0YeQPxC`() zR?H-Qt%Pws13u_tK^sRdJlA;yOd7NMg_-HH);94Q3os?6has%7#aD>Nb2DU4zR7bx zgb_C#&a^a_fM*3PH&tF))nP7#`iTWgC2Fq9{Ef*UcuhuV{3Afnnn}g})n7J*fWkrUV&4@{BYb(0Fx!sq5f`3RxrU zEUNYv^r%=K9d~-LLYQawsZOLH6_TT%2Ph*nB7G>5t% z)e`G!o-u6*NLU2t=!HYfz5{|w)dWy?2uNO&2!b;u5$1jyf(+XT=dp81u~-dsnnH05 zR16?&65Q<1j8-q5qNx6@nV*>jyBIh$vVaEWaIN8khZ8qWIphZOzib&Q-CJ01QOXm; z$DbM2Ir}yvtw`iFQp=&}#3$>OWIa7RGqp=EuSiAmKLlh}8S*YKosD-E?2`oQwLP6r z2Ko+>4R55z2Q(`4kERlcvy|e+n1zIY#6n;o$L8@r+CAi)S)YbLu&EXgHQ^y)gja+F z&ZM*WD?a)9HvTjRNdB%uViY(%-3GB3$n`?#q$7BhHs`ryL0F`zwT{ru057*< zhh4uT%9YyBqtK@yOgD%?(vT$4HhnKiveE7daRm^kA*U43LJg}nmrw<-fOx+p9nK^U zny4bWy3Y+)m~L4iw8z>#=vXr}R}&D)6$F`v{bsMC31ASOwVadw;jfN-NIhELH*1`9A&I&P_b%-*;;-M?7ob z!*V`X^cD-C$^;UzE@%A`YR7@}H3Gs-=t29kH`Sj7t&$?L6EQ11laY>1xEwF4m}TK6 z-o8hTRqxM&z7kydlOniG7;a6aLW}uxep>_~Ld4bA2hoTOPw9?MTajOIa318or~H$y z-QB%74PTW$)uf&Z4IR=~0@9uYU|fH9vE{J#e2d+D=Shz6{A}-fdP7#rYOZ4)Z3vT^ z1d`4Ribch5o=J3dfDn$3>H&-|XKVWtWS4Z}pjvU{j*>&&f2Mo-gm&_RGIJ*QD)rpB zjBqQ+Isu^NMo>c#4NfdB-h?hiA$wh==dpN@mzUQ8hZwt7S@g2A2Yh;Kd#fB44$@1& zi6g0v(Y~$XK@fq9^tOk4^U9!K?5@46zp?7Ys1*08&Lvd{q&r_Os{;OwG$!Dt3lZkQ z>|$R3sU=}Iw`30|rlQ&mXr@4oRM4Ju>$)L9LA2s`Ra;dMIV7Yk_x2TG9o|bLZo?4oaDtPU7uQLJuh{idgQ5yX{|+h2b?Y zVS!{}8hlFLM`CXu#Mcn0JbLsC;bI`zgFW1Lt~VY{SJ%)X8T4}c^TDvWXx&WsJwD8a%SelG7H>)_Y95jxMI7 z{TJ!PeZpAep%MleZZZg-7@5YqD}(4I#e+hb+%!PZm})!A9&yk8lWWPv`sXMxdWU#tgT6Y)de|hL5w9w|K3G1WogiL_I6W472q-W7E0Y} zt^$C86EuqxcXobhWI9+`1%lESoTQHBjnO1ozq8|SAiGY*{`C&Jo{>$-)PmA0;5pcC&sSU%vkkZy}M2#3sfi_B2>OO#(K}T$Du(@Zw-5 z1l4K{+drU?m>3Qj4CZ}$S!9zq67CxlDY6}785}FPdO;~!Ry<&9f$43<4QP{KKWV8* z#X$uT1KrSvw#;IQ=AUmJts>{qE6I?omn&o`pW9Vc`CIUDU<8I8FiP|T9@owvatg?D zZ4ug!OBCUnj49A5*)WF#jzy;F;ssOzxADk*d}{v2Jr`|9!e+Y@+}m?O|3tNZ0Y-vF zi|rRXPd5;AnYBJel8r%imEh}j?LTn{-AP=^Y3f>Csa>rt6z+|kSpfk7x1=3Kfz4|T z5J_ku(urngME#y#yVu;IPfewtM5hNtT+^8iY z4fx|(PzvhQxqS`ldLT4}hr3tT4JRga;6?1)ZdQG7P5y9FV|m*=t*)AM`_8 z$R*9a^n-+yR3}pVeOJ!l=+Z*C5A%L)m=W$fu7Q1JD2US04mHvZ037&_J*D8b=u8cX zHE_Du`oF>!pwfWNNCxl#PNvKPv%&O#Uws9os$`{r#K3U&HURCwpU8g~b?-*a0}BB{ zOf?|+g(dfA6^xP%oBEJ*6*Q?MHC}gllYd<+&4Z9=ZIjOI9O0c;g|JGLitV*PI{O&O zbNZhlAi|2TcYvz86KXJk#qP4N8-s*=*3I&#uxOa$2pan)m&DaCC$NQu{Jf9k5Xk10^Ozz|)C?EVldo#c9a? z{gRLYH4Ji{k;DCW@?Vc1y-NcUEa*oT=13G^evqK31|bqVwAMX-VD$ME_Z!c-# zk#Wnq?QJT;R48bjLQ{?rwUg%qHw4*o5K2T6Z2^l0T|+wpg95L`zR3kA8nnHgNjft4 zRNPO2&{u{?g^AI?W9nE3RP6v+6KqrlB%inA+SPLk-4jNIzT7^1QUQBcqiL~Q}$4+N1aURD9M&Kke_*jHFr z$P|Ql5bzc;F+weUv1w_hiAPz(1Wssu=naD5;=1?eKLlU{-9-s0sG$6`oCok66l5SA zR^N6I`o@UB=nI2x9=9n_)=&Ri(0gn8{{i$qkwtliaQb|f0PpiHTI^<6_dB_KlCA$}xta3wm)VUnHax{35xHtCOh3$*Aj>HYygL)z~g+?is%a z_G~^rK;$!&XG1$Zwqp}k;s`?zQ&GBF7VO~`PG%_2g};S{6MCRVMQ87?@K=FpuW$i;>6BxI41AMD7^7eH|XjvqeAzl#&av_d15A{}WD{blG`uS>G7 zt^-1`E~xTS{VNWzEN%qkJ_XTU=ZxHVXWkRbLKnvwc#h{`FeJM`t;9AEG*~bRd4F?u zP)Cn!T^l;2xn?ROZxAyx%Bg&TUm7@t!J@+IxB!t|SvY-qi@{= zJ&bM4_Gj&_am?rbdz84hru2G;&HD6R8X9dNqT74eh`s>2mlD9&(kScb_;n6znT$vb z4gLDmH>)Ko8ByFe9U24D4NPj}s_jf@?bwT?|E>&Ozpg$M`B|@vn8fHfxDcw89-nho zho(NJW|o%J)ipJM-4A2!;nq^St)v_YZY50#3XNwj9v&QkrT$TXuquLqL{!H?k+a=- zWM88Q3`&T+Sbco2|-;BI@+n$^dac>)ErT&#?$C4h@^wO&Qm zRkTF(;lqpuz$ob9>4oWpr$G}-OPM3zbhV0H#YabHm(?mBJV0=SHjw~?SUpblKey`e z@ozY7pbOxH?NVttB)U@cNnpd9eM>l8oMgVV^`c7PBc|&2BHFrGKZ4u*1GpXioDK7X zom>U71tAeKjG-h5{E(4Zo5OKuoRMLKZK`;9E{{pXYV1+sFbs0%{uFSVlJdufMgJ{3 zy6-;&y)}%(n0ArG8eH&L=w0CBAO>C*BtA;J)>mz(8ebyPD?mU!1^rHlHk9@6&7^}# zZrBolDpo|0u3r~!B8n<_>0(c`RsZKt|DRqBYc0=7V8iCGoV+V)1;y7>D?wATZ6|uqU3U9s&*x@emh`%nNIrL z;Fr)r`MclDUgtK5ZC&|X`hu0@4(;9kkKfqOTqeGJ`po+*2=9AEQ!gv`nfd5j!u{_q z^t*=-C>VYw+%cEmDamZ`nev@3Y!PoPw27ULx_RcC?7*o8V|D{4^SoZlYm)XcUwNzB zXnLsla*sj_cnmvxH2Pu?SBN~9m(6BRyl#No0rn2@ne>?%8}QeJVX6m;ige#6>w`l> zr)IJj@HB!Hij{ef+>gxm=Po|+vesavCKp>&A5A}gl@b52Fk^S0B;m>S5R;2dApCVv zh|Nmk`#y%z7skA+&QWL5-{kKzCXcaL3e7k+i%TJqtm4>lvIel zKe6@uu`87wNynAXb6V$L3p={FC=}aM0i8WQ^N%3pM~{A>h(F=N$m-~!ovF9+z?Z8H z!_^%fK941*1o;1zJIjEAcM|o)r@*cQQ#>|54|e{(@l`O_cJd0ueSSxQpH64lTRTBQ zn&A3CY^)Y?J-m7S-qd=8=!1(02ZQ&x{P$n)WDz$xD=Gp{ z6)xb(Yphf8U#Ym4lM-?NmG;5Qbrq75{YS>f8%7>Hq@oi0-udmpO%S(C%-maYycJy6 zMnkM_nAh7zGqCkD0I^XiE9B)z71|j#?R?G7CinG7rh&Ai9GT@-cizK&X}#5;3kw6A z-yiCiXu)M#?~Y8%jo#k*@r2K5?a}KR+v0G6X*-rbnlHK+UZNU3%-JBmZ*11+cE8TC z-5#rU%(`n#AEQz(F?1`2ll=|rTuYTRVzJZDsQ6E<9BvO^d-Vd1E?&-TY@BT|2nSVT z?Kc{?EDigycjE6t8C!Z*Z(h7tS(#;*#tngoggQDpV4a|W+3`gyGd0*ndwQZkDqG=2 z(M_Tn^}ZL@j`095E>NP-9fX&SaJly!M#n>#>*c`y&v>e6aIVS3#gqkZCW^!(J;%5<(8Er{^xg(zQ{Por@G&B>zGCW3Vx04Q20~rg8!&~y&jDMTt z^V2o=`@x@d@3ng9vhH*G(9dI<4y0JM3Qn`i$eeqm<_IdH>y+$K5PkK*z>)>>dAq^* z-Zysp==bYW5DB5RUn-X~HV9Wi=1jWa`HRIqq0AZ_%Uxl;Xb)CG5zf~a0)!r932#sD zx`+-V?o&Z3cXbD!T~awJ%-Xymyytis0IpOea(Sk2ilNnlLT+RN&eykx`f)v(HI&!3 zQfGV2xQEo7zBc5L+_@%;7uocuIL&Bv)`&bOD7uk)>zX7#1VA70-?``g{$eQmt5-Tu z#D??gU8(+bW^H2PBe)!EJL|E~&`g5m(u=`8F6>pkiBHRz{SQ!e>2Vjg)5S5&&c6Kh z>nnqf@TK6ocNMxL{mb?^tv|(Wp!pOKyO?%AZzoa!pU)^i!TA|! zYZE@V7>*ETipqUcZe33D-t`U(ZRg!xO_BK^hu*8DDwzBTFt~s$g1R4dM2L-qK|`p) z*mwXh-Ji5KvI1(z%L0JSYL|$ zdtj8ejWzqG61z`TaBBWc7A=DZK2{agno6TPP*C7^@M{836;I! zcXgp>_3CnlT6L$9k$i#Ky&>%(HH-qXY^~#6;69jTAD0sx9N>b95F3hFePa|mjH%02 z-QK58d{HNROK>O%I~@=&9a+(tg{=@i-dWZ8${l~(W!wB_Tu#t-q(LpIl3wkdJ4Jt|lNLxM<)qwS3byrtY z+xKgCt*mlfw-3>Ryf1itt}!LR@+~=R);QSfX9WZPHo7>ntWx2yb6)u0jN9TiW{yxg z%LB~=Dms4*^HLl`&gr=4hs>xQK(+pNz9SL_#doV7v?$hj6Oo3$vw z+l_SictwQZ=tzjmgtOtR>BzQ-`^d_u&_VXTLVZZuo8I&vYsx9|g?QkqAzqS2qnjzORL)?A3f~He96t4n*oLtLyJu0n1os!!?e39YQv8)h z8z2+qTcP_+yYwt94v_UXeZZf`Y!yvFv5yje^gs~|I7S0@h*=+e9HVEDE1|o7{qaIa8T>e~HS%jRv@v#l-&>-hGnI3J(28w} z7DU}s89c)ka6EnaLY&y*`eCli6w?1LlKS1MfB(hC_SgINuQ^o^l=#@y?eHtN-L;Oy z=K2ojy=QPr1x6-Fp10&+VKFRlD~xz@UA=ZvvhDXD?UC}=S$RzQIX@ui#MmP`A_xq$ zNKhXdzZ0X#L?V38cJUqKKP1>^rlE-e?^M*QiJ92nf98bs`4FcrE|USDv@{9dE4kU31|q* z!7#mR%N#OAg+SQ!ym4mr^qH$=vjv$)$mhIV=kIPe@QmF=#%0^$Ce0|jdEX_&`2rvhqtRKK0^fI@=)$gP90+5pKgRz6N`qphl?<(0Lyv4O%nz#w`13Q9^y;8|EKE$kWIMh&}f z5jtbF_aBQddW z+U=Jf6;Kb)k4$}Vz+lNZCPv*cX%9q&IlX2JyR%RBe~JW9CdyY!fWuaW@M5$Qc0F%NPpB@Dhb0;Jsc8{ay7fMj9GUNl~W5UUN{C30 z(=F2`_aGzT3yac+@Q&D1H@LXoZ&H`Y$jj3L$Tki)Y)G{v3fzw7F)Cl4!*){J#QueW zDkzKLQOI2`KF3!c?)Eff^`WJaKRaL0#y=aIot4zpB?FbXcbhS7x~pAW^WkH&g%IjP z45s=#9+OYC$!KTFaE@v_&iRXJ71ch0zkfd(9as1=_JD>`;Hbea{@27GxGUn)(oI{d zBjG%0(&FM)_g|n{p&5pd!#pWqBq0Sa07aH^81*{>ORPJ9;z6 zmzQOvq@-{jsqCEO@VVud(hYTV%=;f4F?%1V@PX+YZ}1ylmY1hNU$8OzaI1{y3QO?k zSM-5D)tM>zieT0|j5T(8ZE_u(58jSA`@=aoBp>}szh<$41eHQ9p;GDSSApZ>KgMwa zt2GJ_+V6;3+4E_oMk}o1$*#`b>M<*zT%Jx|)`7KEsAT*09J0uemzBx?>k9Voiucj) zloU_Ih6F4Bh)b@+3;+L#m~J!zRP+aPBPVuZr9}}Cl|!$4gc2Uz8tHN z5PonSeOd9}zc4Qe2?vxXyF&ri5V2)-?Tp<*!#1w6garH2()HazKjeV%u7Zj1&rwld zmJjdLT)TYPNKUo}r3mSlIomRN}#s1oGj2 z>w)Jn2ICHaVUsR8^^hU4G2S5;$A-Z&6%55D?L zdS|C%bIf7n$cXjVrl~hG^2qP;<34O_ko|5ANJ4x2+A)Jv_!p!tiRT?dzK6+EGK|F< z1Sp~p8ONrkv}Fg8{>giS0`zAP@O2K`9VLv@y+!Z!AwDzp=n-B#4Aq0&5E-?ik}s+MK?!+hc%No_s<*#3((} z95A?YWel81XqcI=rgf>ej-FiHiF&BMxg)_Sv#O&5CZBbJf{7r@U>Ud6>>dyD8%!u$ z7wE@6#8V9y6e?ZW*r=?EKMz*8PU7W4R}ARKKbFufBx6nG33+3>wn>4{x5fYfB%I4U;c=u>cD6U zzgtkatZZ#nH#OnIS`~{oF+tYGm?kWBP$Iw)^cRW4N0_VE%U7qOQZ7KA;o6K5vl?M9 z;%rUL#?xo7)ig9j?(C?tXcgUuQ~Bk~lxLCWk$YMj-C)f5oVyqv?+-~yJk_7Bf)}Iz z%*@mFjt(lS>&RLU)M$jK;_t___d6O*2xQFU!R{RvZ9$#STCiHc){q?s=k@8+r>$Te zjg9M5k^3M!3B!4R!L6&tIE*)Lc*D~V-VS0C64npw5c^KrAl89Fq4O6QWNbJ1ShRiZ zpI$myL^og&spyha?eAWt2e(V2+x|1y$A-1)zcg-(=0@h`#uVDTN z>kI^l$LHJ_PxeIF&nJ80?#>SMapD0>NE&Kje?*rFJxa-o&|Am+9nSksGQ5EJ2&1(sKz`xNUSOL^dg%l1tmMgA@D|R3 zt55#}V3`<}|Bt`?*U^^$%G#R@EG`y60{?7N+WiSm_QQ#Sky^@Py|*90_3wN6{?*HY z9yQf%I1^nzjbam|!gIHVEz+kJ9SDU*DmsEFCt$(K-?Y7R$S+MU)?l2*3Y$NlIn zv-QT$c4Lm+G26>bkT4-0?0x>M2=BYjpPWy;Am@pe_P8QCO25Tr@+wp-;#nBCwR~zg zu(|M>&ZpnHES(Hd7!E3_zXwC^%JB#S>+ihM_Q7vpI78!g4G|@!)YDh@m?OAYS1?p5 zz~zBZV|08xa@vmDeTAkY=~)Bz7xM8ZrcO4`%D7hFa@=h73{H!_(D!)In@a2K&{dmGDMv9Z)Jx6!!H4<5U;LPA11S>n`3p>wv^?8x)oG*O&_wV1Mc&%_fLDJNkC8Gm)K4Q_id1ifAZ`)$O2wXJ; z_cuDg!JaC(trlBszqT~j1!hj&7%9;Ge`T`+`^ixHsdjqIuAxfk5lH{*OxLw1!R>fD zBZM*8Zn;#DZ&qBnwD{A$dVV4t#0Q5S9_!toLR|L;(Q13{7E??x=njK6c!;ll2;=ZW z$VUoJlB%mDSLf;Gs%$bIPKsHEtoa@T)fyV$$yY=RNzWl9O zbo%r34(_Q_WUX1$AVj^%z!%P}QINg#b`z?CQ!6{~K6a)m`M{_W1jphS52junEV8Fh zcO@-@Fb8Nn3?SR-5;ebXcZSA8vCF1|ecR!DrnkzDw)*jhlW5+a>&P@0m}-t}_}Zp_ zN3Mi-e{0#OuAOIL*~YLW{)vCwv&B9TOSm5{@+7uIJ%EqkL&5@WjStv+_v@Qu3#h=d zda9JmbZ2Hfz+z1SX&J0tiaV^$Ao6D+Jnt9UP#QMheussT5GNa)BPEt_Ebo!&^{B$e zq*ylzbmkx=8Ph)eApA9HTl~?F?7N&{e@*>{?b}n5jqS6Xl+)~c5+rpAS|WI;R{Kg+ zJ{k{@vJ=S1S{zX$e$`cjRIud)>=&;$e+t>+_PNGfzrURE9Xe_7tod~2bZeGn8Pg#+ zArvU!)@u|b4`}kalultg;o#LE7_wMw$^|=8j06o2W%@Wl*64M=R z3QL6`0bxjElZC1eT{ApP4S$Q^ep&g4Q24hoC!AMe?~CuYrW#1@^Pk$=zD>vb6`aMU zR*7yQw`#hO$l8pZMa`@??hJP%zK4g$^_kw_Fdf%6450;gSfeB*nwGFx({Q6!j+hWH z&fDurOy9N342^hNI1Sa+X8sFC2l|3Hd2s4PGtGoQwiL&KX63d z65Jz2*;Q3BKu;pFFx2F>*w>!uCg8redmBUx#y#I?P>{@5SzY}e)KtVP_}dJ;mw0ZYdya|qBiDwgCWdiwm-e#=L(*n-DUJ&P)p1O4n;Y(p}0m#5F3#a*dd8szjfZfsP`LpG69 z`-C^RHtRb!AUo~ieK3(jIU04{br}X+g+_+W9b<42fNqr8(Xb)Pq&xY-{a|lKBjJMO z9zE(02W2wCImgk_{C1UWq?ag<*0bGeS72aLwctP+z5?fdhPq1g43kbyB?J%np4x{q zWs(nb^U2ZaZ_fE9fM=5emhQaa?0GFiV^Vdcu7sp}K`k#Cb^(ABsNm*&8!pG;vry0; zN|L%r!kl}2*n}R|>tBhR8Xg*d9 zY$@+bn@quf8+M1C_1eH=VoUiy54yit?P}?cgf#484(8GX(Q>8gTqw-`(LPfLM~k3A zL1au!^Y@2dN3#M9VChYIaCo>*Ib1R9F+JFoHrr9m1KE}@CRQ#V05u{N%XhN|w>zHb zcJ_-=TEN1Z+N<-$B_zfmUFih`)bVXaVz+12>*^Rj2fo08(i3{qsL9JMkld$R&mjW@ z%&+Mu@FYBf*wNX66b=;Qu#-TG8`8fGEG_+}6u2#Nct8ZRnzX#Uq!#S|xFDDib02Tw zYwt5XH^&-Sab)8ht%Uos10S3^2PA>RQ)y{>78U|_Jhp~m=lLQ#9Dt{wojnbVkx_j| z%SuC5S!75xnt;n9GM!-WnvSJ$VKlEo>cNG?icwU2Sfp0M-w++!#YRJZ=f_t_a+Qj5Ch zgDYHXp@s?^2i1_UWef}1cA@pM4zxlNDzM0Yc%pqZsy= zHZ%L(PtnEp(0n?Xti3=X$(N{luMcaB4#R!mg0g!BCXP)VGtc}9frL{BwE z>Yz)YwCKn5)N3>hO*Dpcl&rM-*e<$@cpmOzE>>#5s)sr)?YDf+?7j@9LI_&LGMB@=96fE*I2Z_==Wm*Bg6p_TqC?;&dc>%>BjR4{@>pp=|}Ba z3ps}0pb-0VNA68+@*V%{htmvioto&^uheAJzs(Ddg~iDGR+Iy`A)+Z83;YeY`4Er_ zBfShNOD>$xH}1F#>`=e~w6Tm0fV1;56;)HKUKL6;&z`y8!3+lR-b1v4JOr<9Ee&40 z|EiY}TXej!F2m$zLk7vg+JqZ%TK)Evb-dmN1ZDXK159m4{OdZI0UR7#fE8VjULggg z9ypu7fv==xV_5z0(D{ikd0mcv%^l@*QW(*ogPLR6W9RklTOt?89%n+~_W?|Upz5z# z`CbL5n$c2;(-uYPG(AQJ(!bHlndJ~pjQm)cc9vR(fdwI+IjK@oZ=zuUC zr!(M6)^SUErsw-jxJSNZJlqYF{+1af);9YyGsex)0%7wQ0PWyR7^vgpz7L5RaM~ha zd0_1H7v#qzv&H8z1!FbYv#bU_3G((EthE++Kh-llq3>C}GvyO*og+L#o3!fQ z(~E-8piauAQ+8M_2djgfRmxadNMuTRh1H7Uh5yspsc}W+<5)G&YH^xR&jTx-2yVZP zPO}Ecx){bew9&$Lncd>#`~uYC6se7DYe?jiBdnkp7V~?Aeh8z_%G-}Pt zT1`l{?t=&L&g_y4PEN6FKbn6O8VzDkICPz=HWfPBEl683$n`cnjEQYuQn4)jlM>Kb<(B*D*LU&FW7&{$&*4W}G{~FC!fzRm^RU>BzsNX1o$r@Keg~7k_!~~_!K48 zAILNRB>P>oS_6|Fe>G9{@uQ;*QHAmduJto8_-8-3F_KGDQfNyL)I9FU>}+*J7xlf_ zj|{fPSOzRN{@GJv<08e7BKWM)ZF1AqTi8Y>GLOL|}2>v=sM6%U7NCb9CQo=xr|ELO-x*(B7x`-A3MN z`Bgt1&?+DJo$wf`#f%GE=M!(!{ju3w?f~uE1F_36@cbSu&{qHCJ}xZa`*wU|$i<=b zaIM)_VcA*XyB64Q1^m@|_z%dfMBn z5?C!-z8%oqr+^!_7V8s#YA5T`*_(CZ;;KxuoEDw$_SMl9Ci!c%4~bL{{)j%;XC=BK z@4sKXRbGP)YeBo#FAWZN#5pm-bf9)&1&0C-ZnmwIL{HBl$8xv@YUus9v49YQ-X&2!p?G(x z*m7qrE#nI#NqzazLlo)W$a%;#sRq}$v5z&kZDv}jK|@m0ZXmfczrj#hHQxrRbO8F* zfDMBp5F|B*DrX5PMV~(9g9fC*DAofo>oL1S2jk(75+O@d`PgZgUxr?sxvyZc9NgA> ze(v6MaY2q5Ya=*?^+H)RE|nvq1Q5zjt>1kykvX`$T&LxrG&0k6vn0>t49Ge#7GSQF ztWZn<-T>*YMukE=81=5ZT|l-HnPN+8QWS0@!4O*fc2$swhg>umYs}KP&G}Oh7U?vo zEfuqrgHt+^diK*mdca}Sk_}87C>>FVK{F)vcm)Iy3fQ|=H){!G_nK`vy*(@Z)Kye4 zNyaF4erls1btBG-NIl=I3d|~YUsauhhs1CfUzC6k0~0RoPtroSFO!n~1|k^up7n21 zd$+vcVUJ@!c*r-F2E+KWN+6%JiEX;YoLbWyY*`>1GkdSp!P;#Znx(t1N+ zXqN3&`De3nx7A%fDEcnPSCp^l#gp<(>0LT|>Q)$I7-58_6e-78stKWT$3L|I6xy*k zhv&v2PQ|D9J!H17|NdRKv%jmb8&eNQhLTJ1MUs*Sd4|m5(vst^V@jR&z=Cdb5PWqY zZ{!bhH6R$?(9b1&ty8h2v;-ap^QlsHYQg|o^bXYtR%>L)UN|x;_l`fmDn<1>E!6Ah z%A1<}usT{#!4%|`ja@u!2qilQj9Z&APR{(`d6ej#bbE7-OSkP!!qx%5!h5`{PE)h9 zJ1{#4=0?C=LgXMeSw5c}j3Vz%rlh>{!WOe6u6@^o(6q1ToVP%WK;&5`BV6Tq^!8r3 zrty`wM)$g?fB@F4(jxErZN-X(vC3aLgdO<}hg${O;p_ZdrrmLhb?qCogREX|uMREW zN`WzS4U`Kk(aX~xKgv{cl|87XsVM{d0FiBnc|DynL=?8zLG4LE#V;4{3}BRLCZET% z{Sk2JXpV#b*?a9QJOX*5BDnJ=ATW96=%|&doYK57ZG>8xxk&`ns{srbqnKRu=@coY@2KU{f!;lrH8L7K?Bs(G{FnVAS5{#2IO>*%$Uh?Jcb=7DPC?xHPm8XzB03_F zkkkwtmz1N~6%b610k56=69PHT8qUYG-x1+&9OKnNA(S0{WmsjV?3;`LGLc*{2UL2SiH6~+ZsEW$nNRQ zVcMC^2JrLQa%gW~wV8enWOR1f2MFhBTpaDoD{a23yp!L7CX*t{GpVn%p<5Peme zadTL2yoJoL*A`mE9a+oe^LxET=92zp_}87x1m)xc1@~4S0mD&dF&JfiFu&JR^d73o z1TjAsFeTezo1Y-W*jX*ZoBn*asfwB{uQx>_521*xp6Irqxb7c6x-6mntJ+B{@H^)(XBEh36fX$@s@(i(a@m??k1~?mTyYg4 ziYEy2OtIKTot?WC6*PidGenJFxg&)So#o-9fXeaXr%$IxA}t-*-3M+CV2h}r`#_oP zTQeeJMUcFHhh?yZt88e6C`J~;*4>V)95!a!d|oOTU55D8?O~6Gq}W5&njW~RxU$8{ zR49-m8?)Xw&}PeV+1^%VRt{xR^9M#7K7(Xfre=Llx|$^X*uqz%xJWQPPpJnxT4YX> zn1y9(erlSlrVLtP_#HSu8bf2=g`9k_PCme`r3ET0f4MBow0U`UHe_7578x&Zjtu~0 zPGn%i{*yOvaX-e>AYaw{V_|JnA!~1vmRoF^1`QY2RnQ`K&dL}S-Y(CF)3CdwEP`H= z1fra77ugra^0AiHXJ3A6+2hq^Qf-*G3Rk%&d-c@*#zm4iw#cSS6#PLTsSK@&b^P)H zpPbG5_gAKQYEY8s>0SNGH-6^2lPwbpL^9AYM1hym+WmkbjB^sD*iW+i1-e&pCQ*g?BAK-TjI%d$>z!3w87#-d3^?mAdICtdY=z!B;AaHVV zvbwt)8yNwuSkULsk6X z2_Saw;k2c;?5iCNSsJaNslwUWD%L8TI?$VBocKiu)!BKn>RONoBHBF54As!AerDhh z@w$Yv2L=XLwztv8VPQ`WuJdL?Y-8LPLgp4Y{*AGTrH3~{KY#YDd$HHD?Y8GUZ4alJ zxjK4sW47!U;{uDbQ0sIN<9pR|E9&dUvc^2p>IuY(2Y1FGfHu4WmD#yt?-c^U~Zlu9km)=&{n-5sW&OXM{mP zPXv(-Z*yor){1hiK zdH1W7N^^$?W|9N0kNy*pcW~mtNMA!vfX9CS4K(Gkx(3>!0*eiUToBlLdsjDAAg29O zUZBw;k6Q}^QpLP*Hb2rVuox7D@B-it{z#icN0-OQd4?&iOKfmu56-KE!?GvWV~k^C z+3xlpSti1Au!e!D5BOAdb4v5c8tCi$gbU|%_x-crsZDow!LMd#DSc~7Ui-Rfuf^Jh zV@agzmlct6Y3T==w_a8w<(T6-HUyI{zJCGcOO3FtSwHWkewK``chH%KEnUe zLTjP&Vq+fwtfmkfT^HFf^atA#Fn-(LW=WG+WNG(xb97Pet0M~7*l}b>Ge4>A9Xl<{ zxaMryfMfS>p>0LOqcq9RZtKJ$n%ij8>&Oa-8bIorpe?lT@Lp>GH)^-D8t zzFnSoZ2nmwl6f2MYWU;i#$h~AreA{HDn_Vyv0>uN`g8%InaZKDqkbZS- zI4C63PeUtDN?QMgpiZNDN+h=NcO@8p)0j>&n zVyM&kq#G!OfrE?eH5fU6jdax;BrH)aTppz$8lV7u%$Cc`LEq=qxP^|Zm3HVQ&{@>w z2toDOW2U^H;LW$oT83}kuzKtlW$kX=dk#8vd1#6IkFKkR!(4wZ^8zTrG(gc~HZNA4 z);MX+pFK$*8b#2^qw%Yrn8IaOCj%i5Y0+gAlfRtmJhDO*U;>eEGfabxshC#Q{-^;u zIO_wCo9M+|o_$T=3K@YbJkc4!V^JF|{$G)O{g*myWH#a-um2;)0rkv(H$q9-kdYI^BQ#u9_12n(1}!-BW@>B(Wg!M>aI?df zf3dI}zbhS|&r;1^;qv-pmjP0M@u{glBpMRiiXZNR0Sw!+B{eodc4#tAT6Be7atJ%cGde*B$p59vigaQjFs#$d?Q=FXVhJJ`V6!0naW ze9yb=SuB{_+m||TCU`#y^w9F$%bG{_RogJ-&dA0Q;bzx0(OlXtF z%IF__Checz85-zS;F9p%9welWQH(i0L{KKuw1xw7f1Y%mYBJ)jj1=tJuiW(zA_43()})qDrW z?a9I60mx0b3uGVp8HlFQL=lemCqx%h^+p87lmh)_| z1R#W(8BAjZ;k)F*q-05{$(bkq2R2)|P~D}#p~fBQwu-=Yr2^I2+lpW7ZHtWCztnoW2(UoN-af$;tEG3|guGS9@O` z)%3Zo9qMVVRiLd$5kaXHL1mIb5Ftd1+6K^65doQ0Mi~`^0D%PcR9X?xAR=R&0Fg-< zWk}-0JOn`qVQz}LDrgMco zoUCdQdX8S^q0od?IK$BCXE#+Ebz2_4x(+02!&k^t2bMUd2owqh#c;Mz2X09ix8|1P zjO-bi9--Mp;sshRRT8Mtm0kOeMo(qR5429~TL0W*S+6uGW5Fy`^J-V1w}O^(I*jJ| zH#aLkaHiReMqqqZ-PcF0Ks6AXA zMuVIKoJ<0BXNqf2enHpDVvANpF5%-VCHF4B6Vk|=t*yTiiD`?1MF8Dn>-4mm`>aTp zKlsTZ^&nx>mMurXlA0X-_4iPM#L6RGZS(o+r^XXxefk^@7o(`YIt?)kDzc7@eU1e+ zb~BU(1PANuJl->Mu`9dUXa0WTZ)mj64&yt}d+x`xW!5x@+*{@4TATD3$D3|qM`&|U zy_Ndl!GwN{_YNJkG&13F+rJivF%?x8Ur!@w~N@n?#RHN}{vV%Gd#aiop?olCxbx*rF}9S3eQ zj*>q)`Su3T;t{&=^XGGIkD4G)?W%2}%70{u?TcJBi;CwfgIRV#T)@;1owVn2Dpt0k6Thq@a_?-0?yln!`C4p=)zS_+MAzDy=q+akK`sjI<}nk;i+fZ z+F0yczsl+RBi;8!!S_Z*0KQ=JUVPuU2{ddI@0m)(7kve)m~?b*{Cw1U%l>eEPftc1 zm~ur&|MNUUkH5IIGzCfgKX0|jckSDJYpbc*<;7aSz_0{DalNPJ}b{Tt* zg7sMZK0BYO^sn%jE)8jPW6hkAlZbwD3X{Sg5BIDNz)%iU$u zoCxXL7;uwKhU_Y^arOTA@$k|DJ>$a%!a%7<@n&$jJ~#g8=!V!!-)=jIedAa8zBI@g zHtXQxvI?A-C*W59^XJbG@Z?oZi4+T0fQoD3g@pxc-r(a6+iY^wEB&BkamzBhU+;GO z$w8=6)UlTBQ$<>5fr$1R$|;|Yr;nNxjtT-5^)=qjDuv91wSV5cIhEI-XWNV{2EyA) zLvhc8(zm41lLY1WKoV6BK_gpOGCquABU8W8Z*TaGvI9R|hljpA#IsNcK0xU)C-Pbg zy0koM9YQUuppYx3@}6Rn2AO$=%qU?>kQOxLM(z?IoILh-yi-6 zhaI@QfYLW?-C_h0ffweEJ7bv?6t=1)XENejT%ESBXvs}%Gao+g{p*L5&x4NqQ~%`r zH%DK*+d>bxV3Ac4;$dNYVZI^z{=AOg#xyC%=zTy|mLL7)izAO+e!l0j`O$%Ie>=IQ zeM6^Is?=%syXM`@m{zV-_G=?650{6FCm%>9;kqMC<5oUvw;9wLrhW@)I*@V|k)?K- z@cCh)Nfa}_LQWA++pEbOA%0}r<@Z`&q)Jn)Dw!0qFAZsv2e-bv`uqFqyqijs$|?16 z3)mrNqb>t#`QgKnyo(|AWo*z#vtqGa;6hC?PY_E`k6&|!4 zXx4I-^%21+(tVnx2abU++AZ)}&C3>&eUXuo>cYQlD})TOA1PkYu`|^shaes9H^3(| z$l@obib_nHT`T?Ie#rAU(Vf2>=G*#lM^P~j=_ohZRbB1jyxv7&eUX2vt!5-R!zO;! zXJNFCJtb8_G-jteyMb?BzUakpS#{gZ{fA^{Lqb9THQl|@+>DJUCz}uNM!j4RtM^a| zb8~aNxu9Y^S~TcQaEOnOSJ`f1h_MzOAx=TZ(G2an$!@FOBF7fZD<2PAir%G#^ZwHH z1%D1p&aFOEETb`UrL2SgBDP(hseO*t?AxDybUwqcI&stMz-f1o zb88_1*C@Fmie1y5{x$lH*d#Wj_{Ns}X#zW^=CmUcHPK~3it0a~<9cqJ|G8)~ttd}?PP;~Q}g}(ubANu_DjZ9PjDB{%J zG{xSpE2R6T9ltR%S}ET#5?bjY8<(t)c$bxCOs(0*d9qjYLNx}z;)Uv-EzHfl zapQ)Wxw+4$p7ZJrbQ{a%yQURg10w~1zPi>kbla|d%{LVd`SYM37ZERAW!>tdon_P3 zBOc`EWm;P^Ffwqi0OQ3G>4gc!6R!TgVoohBhLw}8 zwB{Q#rp>@<*X`~%LQTv@g2~4zmu50&hoLzg>QMxJOfC+J!ZMbrgzcuW4&9dGdCjO# z=hdyFe}fj$O#k;2M@v`M-DTbRRqF)AB-yeTT=e zqtU?Ibj%=9;XQDM%VO1Vs;-3B{7yblxFIzQAw zO|IjYja0H)T4o-sX_O+ta=c}Rdt6NOtsw*N=J|V2bujIZqV8E6{Et8)L8B=%XhN$lhtAA+XBWa@m6z z69HXZzSNDAlJKi-itQwtI@vO{)Yt8B#$6UCRYo~LL{~=1PNs-HFsJ$caXa7y3!_-- zX@q>R$PPWIZ$w_Yus7X~?=+5*yeIf3a-FKHbmys? z9fmY4m7lBKHqn#>mHp0S_OPR>d|Xu|>Y}#ZNz}S?y=7bDumHzxFd|vcJ=L^1|BDJ~ z-$T*j>+5R^3kr0=gRI*$O_!By!DvlTTEly_M%4_(nj=sSYJ|Q#Z`k-i%W!goh z8~`+i+N}n|O)6iFEu)SniZ~(E?i(7R_bnJM(!d7o*|B15*533+slbhENl`cT zH1Bvuz#E*;ZYJ`Vc;a0sf*4lzJL#xAw~Y9R~o>&&?WNT;--w5G=Van#mynN;jM zTy;@2>7822!;XtXheA1zY9>VZ@SdYWEqp z(9AWe2Yw=<*d^9Bvy0}I3#(h7pM7h!W}uWRIf_$Vn{cLgGb?|2M$yU9MWZk`+%7OE zi2s;f9#$FM^z2@F*YN$X*V~Nd{($)DoDwv5ogJiUW*l9w<_B4j2GQoF=ZCB4;hisj ztr6}+tZ4lEHAR5P$%zO=$xbH@@{2Q+%SI(dCxL`V>%Mrc|MNI}MFiqOz*h>NYsArw zU#z@#XMM4#KlJ_|ijIwln*%S%3b*nqvPRhbVTLW@!S^ki4QQO|czoR#!`1)q-3Am7 zE>|s8W#=MZ*_HiIK0^l{3W50D>_5INJ%i?X7mJ)kZ_$xuqWF1GN|&WQlp? z+#Y|Qk1*}gZ5boD-3Wx13$)2F@oBwnrhl<@$)cbTGE1Ap_~{O{{AcxhHyYJFaccP% zao3l;&LzX4(K=o%aGQPs#XXV^s%K^!7_UF{A|x5qw5MokWNI;29!CvPcOAPm__I{J z99B(ViwFq8%~NoOb_SeG(W>2M zL-+fCWw;Z|J^0Izdt?P6NR@*$Lp->|?x#CLq%Cjcg%hVlEK)~`RZ9Eq*S2S3y3Z$W zzcYqq?o2PRTWDkpMkBZ$T_fg0J^?C7pI^+!uDImI&HW{rqu0Vt9kK)j)Y-ZXYexj2 z=k#TB*s7vl4lmOEZIXQKx3V#oy8$rQ^X>!jUQ zL~Y2YYkfW0oKKL;GL5~P1H~ZyA4tU9zkPMh+L^y}Ne)g<{d;RQqu2umif|un9$eX( zYh?jcB@7;+D3~f0h~^h{r-Z5!8w+N*J<*4jO0eFjl6~82G(2K^^vA0kwwmppR9QU& zPaU9x!JAX-IJGhCQY;Cpgx~~`zjNVMHEnkD{g`mI*ukV5$+~t+og6gNots_e5fm|8 zM8XIckbv+AcNDYbRYuWKR#wh5o=m0=K8G6WV8NI^K6A^I;}w2O&JcIYgBFS=N?Px1VCrLw#2q2m3IIA zq4NeOQ+3dWFF%i3uk>)8tpsbw2)s(#)Zk=Fw}o8F=2|tU z;;*DRWb#m=QFP0+;yuJ%s?nNnHaN&-YtE>56sE|o*j(;;9kbY^7C!BiQ8S^df_T1g zh08#qD}2zleD9>qhIYiIPeb0-EG+0jbk8w>7(rkq8jQhqr#S4{~ zz`#JBkd>3W5o2TNMV{{st{Ok4i2Wfv==B}sPp}3tecwX$QA+&4kCUbe?5zdtT%+l-3lxynSt$fxkamQ!kf?| zCB@FQ&7i2vEmZ6n)+Bh)Pc*+y*Oy&dgNAjNrVZoM34sw>7GM{MJ5vuFghm&%48yY) zY=RP^>W}?po6Z)M2zow`zfIGw9j%vq_iVPW5V*c&SJF$=N{_921J`DVz?8yQl<$GC zcs&0Un!73D=?M3wshHE?B^aHYgvH`~%EKeq>da{U%3N_rxukx+IAi9X7X$o!V$8gw zm?5S3AAUdtSh1a61qKJZPdm#1%1h=C`Uy8|tG@_-rguyJJe+HVJwfaw$)gytL7o*C zx=NBL;pbCqR{MtV4ckn@TXIbxD_A16^!J172QF@2wShnsZkuc$`3kymWXm&ocAJen z?|PDBOL<%WtuCNbw<9a~-H-X79uoq_3)dogC}%uF`t$8GW?BLp26WJjJQSgtMIRXO zd;jR@#em>AI(;PIaWd~Z>;WaIxUj6uu$)peSMgmcQqTglo%QkZB=21sMjO4*z{R48 zRtt?g0S0~Hu4x!()k2CsRd6CVtFQY264XeyMDA9Ei`qbO!ZLlUvxA@c@Y68(GjTps zvLF+OPadc1>Rq6AThF7v>4-;>2#ujv+5=qrzPLg&DFh@oU80u;$L` zAa~{M)=xz*9%gSiPVB_xh#>D5Ib;(muYe+J@&CvG7ZP+Hu)_fFH;3}e^&D;H%;g@vb_oN}pFf)&k! z_+Q}9JPDsR^RJC3?3@x+6rm6zQkQ~I*+IP&uR+Z1cyRc7nl=q74<`D|++5ecW35(J z;&%K`l>kbo2ZI{q4Rt~aZs0&O5PKh>%6^g^8)0dtKSqgWwb3L-e3qB@Y;SWXF37X2 zajy4^rg2$>V%;*uT>Jy0fjBo73(!$9(@%G%bWXL=3WDgv^T?=R#jMuP_BrEZ+pvr~ zQo)#omo>XYGG{?;!;9y?@K~b>#%Wi41G5J{HoLU84VaA`+;urFr?_q6){Dy&0|-lo zyUO&!E7&YhZs&VuW>eD{UMCWtO^fxg7{Z08S6+N*xJ>Fs_nGO;bgi#4HX=(-K|InK32pEIdO*9fFuKP} z-c0oyD9MbOXw$8DtD@C$V&|{E+!tcM>oyv2RF0AwxOJvz@S>{HjDDr7*krwAH{s0D zA?LFrQZM{;{(LQ0DP|Re0X+)8!}SN!fLU`9A(MF0ibM2>+Mdg)8MBG(WB0=NcjlQ| zLDbu`cAoHiJ(ioN;5>faS($KF%)gvGF+0|P(LpY*B+70nAU@n#Od4DRl5h=LejNeUtT(okLyd$6s)p` zBI(9M@wH>&pH>!!LPt2nO-W76OOvUUS7v)VbN1`4P1VR)7;9kN)GKcV3Yn&zrgOX< zI2CE9D#|)BMT=x`Ecgx@X&TEw8;JP5Uw}kkbQMiOwrrhueChln>r%{ z03@_l(ro&(5?zjSJ;{Bii>5fW%(EeGaPEOPOmE!1>ZM_J>30Pg0Gdr^3m`VxH@|%S zjYa`Tw@GwpmF+^>pkb~*5=uV4b*lz%sgKakjw~-<6e&a%m60$K%PV?^vi;WHI(t^* z=Qli~Z=tn)CI9J3^?m0KDFBYy{{8v>sd;d^p$Z?qF!pGO>dLJh%R|`+T)L6+Mkmi& z5FOoaZMkDmJ8A+v`;hGs`~57`)RTE8RiN|7o_zK0x|3X zn6Bc=MeqOnC2IzVyOQAFMuroW5D8Jvj*i)oN?5&mx$}k6?xSwG;5x13a+1>$=n}w z49@Y;Y%L~yPR)QPi!zso#9@MquN$1Lf^Vy=ZsL1A1;lBjYp?pJ^8_y#_#9J2_eTBH%6dI4qK_PR`DS zU}FeC*dBDwJ0NuXE>8TRc&KcK`AZ!bmlFH@T=DR(bEO|j-Grd2AmJXOuP!13wAMXN zP9agwJK^j922%-&VBg?NZE$?(1f{d`()oCtD%%4d{kh@YsD&W<7wU`Pwm2Ir*606> zApdXH<$vMUfB)7{!T0wt{XIWoNrOXocXxMp4>_Ed-`@Mg zhjX3%KWAUZFLSw=wbr}d_2hlu&jf#zm&8OPL4!abm{K3!D?uPg0T2lC)>9O4WM)}& z1AIKT6O~eV3jVo2H3|a%N3v6r6onKGkZnUCFCkLz->En!@69{eKUbyfI6ka+&Qnhp zi}NxaKIC>-|LmzWE1HsJkRj_7I_oP9dd8O;QM5mPKS$c8mwU>c;ukCTZ+adc@fsQV zOQf9WmB+v_pMc%wf{ zyw(+zln1Bkzk#n%#%i#cm7~nfx7s*;{mn0^qCGOgg6p-84L)ADeR{YZLzF%nQQgy{ z!{Fv6)j7HO*Hp`_E5&>C$BzCuE%Wm!jB%|;$H(onv#1%vPcnv|zLl0nV_@iRYj4NH zCvDADrmJ%0E-kCYpuxo$7!5L-0pMl$1wcC1L1 z(6`w~IY$8p*CwE>j7v!=T1rX^smYAXkgH~CYwP`ocAPwwXVgN}DXoFn|C|=}vS#iL zF;RFY`7bZakh$8&-=}BgNaDXZM^21i8#(xavqJG=p@iLX)_!Snk;m@9{c&k2dnH$6 zaRlXhFY0KKC29qt!QaE{kfEYsBWLP671Q$>Ldo&Uev5{db{W0T<=F|2>V7zI96dde z8i)OEfAr1i>l=aswXab-qucgnmZLsRO)n>`E`zJ8G-}Vw*?!Ovfj9aTgD6PCZgXBF z!JJ>lXbt{0S38Tzuc~vbKry5v?AP&m-ix2IxsHXkvWXlRw^thV^u?TM5W zYs_{VOvCP zre<3fnwJh1AgHK%Zfcqqb@iVzMv4F1jXw61lt0{PbmN?6VxvP&M7c=&NuGMX;-2L+ zGm$+%^})CEeN~;(QL{5=XTJnTUOyZsVz5Ufyyj}J+|YQhk8`ZPEEK$00C$}Upa0(6 zN=;TcF|0ct_mp>X=HKK?zbcyfnzOZCRVK7In_F8S5(ehCMyg2%28>VMZ0>1GFl=sV z99eBm=Bo|We;xdE052@*9aVMUr~Xz{zOSen+%x?(5`S1UsO72E)K7H6LBgG#jHM-< zjQ%(4ee7E* zyZ%auyqv4LW-Jo;`g7@79&+cK`APIQgam3~JcYB2X`jk1i%&%NwhkK(VMncC&IUK4=_F!Ad%KSfjeE7Hm@M zc#&$t>E_`2r;gE4SXVmaW4$Zp+}zwLv)%G7)O`F+YVSda`)y9B-G_!l)uRi?_Tk~C zEScjTzKmg9D^~S^lt#y-N*D~;)AK;PhA09$YCC&JEL4MxgrKN9+4&_p`1y@;;^n0X zcnd2l!Ie%g)r;QSo}1swjiw}rUf!U_L?^$s&^{JCaJ#LVJU-2Dl3~SWj=x5_b?;qW zvsjyho*xvb?@irq>hHi(K*v6y9qs)24ZQMl5m^bvTwLd4enVQHy>4ee5m@o zK65^MHZ1F!S!%8o*K_{&V>$_hBrE`O|Kl<0W<%U$p0O7hdCHZs%!Dfad`-B?Wl7G} zQAX#bon*IO5xulzT#rFAzsE}a#+R8);`QFR#w?ef`1hq>O;9#g40_}hom+R;(*`|{*s!=t5QA=166Pc}KH z$H%qn`dbTy&a4bi_(*L6BA28ciz~aD^@lba9U4{#y@A&iguX^K+<4(^VHdh=1lSp_9WD^F?kB-=E*SetbCa536b%k2LOcXGxC5176!aAO{ zsy_UO>GAu8fx){sy8kq%1-ip@)lp#3!)@Nlo7YzLLh@I0)uT_(t_#*{6w?-B%tkU% zT~ksUFD#alxDOvKt-t6h%cU&!Y|SbAD)89q@Fn8%RKQcKGDtdZhs}LU*^G-sRE(6( zZ31tj5h|f-+8cit98uf1!);}^Gv*@-uYZ}FD|LI)Yg=RQ@{?k|v-Dt7!P#uhZtEPS zL4#ib>W4?MkXWQ6vAn(9x!gK?<-RSL72ec@LqUeXc;^$x=VC4*Qury8?3b&4*Q&GI z6T?!izgpbMgnA^>?sXmt2wsb+V01zSC7!=%Vkm~XJRi^F$(Gp+giKX! zqgULQs^!j_*_#eE5s&50|H@bYtch6fb-aV)Uu^F0_YY@$$(j#K%1o4XzL~l=;T70p zU-R*v26PWPC&!>V;m`~4**&#au}5wg(mb{QFz4C(Ez8aI(h1LyX( ziIOts)?773b8|!8<%l^XTYmf9YDfC(*O^Oudrd!w$!*yAk5?6TV5iiQWm$Hcu4H`H zw2L1hLxecilLB7LeCNC6V)^3+1R z$dEWUsXH3MnVa``ifQ@Q%nW&*?{euK=kY1iV8#B|p`Cw&^JZLI=aahjYimYELrsbA zCDU>o_v6Qk=A)OX^QO*!!bjFwM=IuVP_TY>Sbb{DwoGb%{rWxArvXbXY@-!FUMU3y z8gA}j799%ODnravF9S9t#0!_N2!b~R=!7iEzcoj7xvVCV6hE8m^Oz2m7|;P1X*YpI z#XgUaH(hk{;4w&gzS#{K7#IE*DTb8eJS8b;=SQM$hVCjNoo~5%{)%h)(P;d!kFAdl1sfVPO{Yk? z{=OF#MH9KdHD`p5p#u^#+O-20VIL8mCZ2T~uXKdr(kZqyK zO2Ug}e2?H1rJ#TlB1qnA-(#Y=ncHmWH+3gsx_zs(oQOM{mQH>z!}XljFM#J`54li{ zZ*WX&A|Et)ZSC>SxMiov{oY1mwMWUcMY3RNgt{JSdTiyih2WJ6uSuVIXHHtbc*gKZ zL86D#r$RM!CiQ{N?(VKxD@1^N&ZZaTpi*`O@g16!)Ulvo4N459WlLk{{U5FIj;b10 zT!M+nzgu>F9!0DQ{oBpAypkEC+uPHtGitT{CacGE{G0|#Vupq+Q{{*CZgQ_UNBb^B zCjK34wu7*sRY_vq+k4+PC#+qK=ieRM$7y%7Ha%EX)f<}hF-ME|hmTwG8}j#f2g(}v@7N43(2&78N=U8*OT4=^M$6kSed3cIRZ zEa#?zAEO3-Y;bp3x4Sx7k4sttHPeR=U4@i*(o*srTZZ@g^ij1VSmfcq4aG&i`+6M1 z;rcfhpOc~Z{?Jj;5Q1^=);bJJZ8v1Obah#X&iF^Xp$gcKn|ga+c=yCTdRp|;;ot1w zpiUyz(w_Uink_0Svd0Y%6%-mqsHSCb5`CcP*ev2<|IdUblwxCyPRd&Eve_CdzCdeFTv6#1`qHOp*8@$yt@ zN|`ygH+zO|M?1~ejHbcEnR=E&omrvoA6U_85_fZ1%sC)TPZ^5L%QD@rXaQYovPeQ(Qz3YAu9~?V4xYVrJ4H}i8 z4uRw-P^xr@OPHj1J2{-cv3JY*GP;q4LB^&7WqkxJWP&19_s}~+LDSgXzR#tP_{&)C z=r20T`|qI``1f~CKfNLjsb0R!e1AP#e3$`pq4|Wxz{ns>o?yq`72NShemDzB@$b#-hlLWmd6)~ z&w1;>8ADP+V&Yll8Ac4p!P$0!e#DO-OSw>?*kk?_iV&I@s6z4EjA6FVYN#u#tgCx_ zf8IFRd>wUt3DOkea`lsOG7QGlpLA~c_P+D-He^#elhP$PxZbjP3aqnV1Qc*T;-Mc*AB(W7}VOB`jwhRfrc#sdsNh zZEZ=SqMkigKlg;nMM0Crz;965 zVo-3!pauxO%L%6jnP`2fxv+Y|Ed#@jRPV6=Kde{d!2&OdIu?jH)}!D=XatDI))zyGMJxDBby< z#4serGhZ**rU3Kh6R7>z=;=mA{sZwS@38UyX&3+F$)bInnKFv5Xay{GPwnQxMcgbp z7M6;S3c}1^yT?2cH{-n<1{$n0QrT(XUftuA0ODn#m(P-LC;SBlO;OkNzyTkg9yvof@Yk~0 zuTv9eQDM;48rRc?UuGbN9UUF5R#!9GrF>JpRuObsUa0DW>bkoSDGuXuS&sOcrXr%R z&u3v5vv2^481>IMRoh>QXqE2`f=KnbR0CwPc2B-9Z|}cA3hplMlCt+_>ajA0bsR?Y zXcENULUwsQf2ifJA8V#5m76>JtlMdvUc&k8odxpM8iR+o2EbJ~ZCa9E)95Vc7t;_O z7_pbK`>B-O-#rpnW#{wz`O~a+^3z)2Ry9%n%I0Lhr%+9JObn8`x~ZX|tq9`qKo=!x zykq>ea?vPyub~vx${d||UdGFV17RbRUs6)tHw5sysw(F{lcXO$l-#3zRFRjLnA5Hg z3Ws`)mT?$s5AR}D3k$D(Gi2ji+9rN$Z;u%4u2%K*eDOgxNRd1n--(u&*C{}V?Yn=7 za9^dih6cB;3j@5t z!R;q0yz~XJ03B0O@cibkJ6QNZz5y2gRhN~S*}tr84o;%1ykGk-o&W}IJxGTgR2C8gRo~?+X6AE8Nw4OGc$Wi=y{1Gn?~VwW|mG>K4opnFWVZNEPxWh04Sx{ z;O;MqDrO_XlRjjTM=ANbA>XT{YGzHhQ|MhA5^ zYuxel+ZBJG+-w2^dHcs%!Rw@ciT7=Zf;prZC|czfy#j~zHnWy%oh*m$@>2C~l~u}0 z3I?!w#ODTo9C$=wqgA?P5|)d+f`WqS_)f73VZt0E4C}p?8Hd)<0d*J}SJkX;Kh%oH0WRj9&PFcjv81`@QKq*=2 z{k}+PTf6tK6B7Be>b~g4N3QM~t}|&$^?v)>r8NQ|SbuP6LOO>~B}zQ+BHCvH0N`UT zM@MB4QJ=@;NFc))9PIVqFrq{NlR56q$rq>IN!RTQ*WbWAZq!zapC8gJIijO@=S!hV z$<%5DMQ5?nn&7ML?o*;Z7oBTFT)~Mz6`dioc|bE^GRY#u=XQb7sc@?tG$Q_aQom%n z;JtV;HRtI-gQpOc4Qp;TENdQUA6la9xC=e>qSM06I-N5 z5G~_Qr@)2yHu!p5=e_2CARFWh%Bjv=;DF? z=JM(a_OLge^2-wZyu1;HE)FWL63@Zj0916yY_H+7Z7&ChVHH_5LB49L47FbgYYao2 zSRnS&@^W`%b89!7seY-(x2r-cV1p{fYQFD~18n!ws4ZsdD3rCj?@eCJQix&E<-EPU zyZJrJ|H72>N?IQJPPUKMg2!c}9_P=cKd+f=p_T(^$2Z2dW0Hm30?N4XK`q}C;tiv0z2d@fa&)q+tu2SmacNuId%KgdU_+Oe3;Xm@`j8N{k*3k?bpW;X5s4?4Q$LfgJLPB{{vv{IGZc@Qd#IOn{a1|nG!Pl7MB^>}>jZ1hh zKpP`CqVbgKn`AJm7*_qliwyQyj)7)?m5FCm-=Wt3>JR=Yi<|jtAX@9up&Aajl4kA` z-#mO0A$fUY8(TEdVkfa;yLZLBe@3hSjFZIL63Cz>CNdalMVA=S#u$Xtai3!(CRR5t z%RQxPE3Bn{fce`}GR~~n9w-3G|0zWOzf1xAuRfuHixhr*kuDa91+kc_@@Z>p8`&Gs z>F(_fktY{GDzO=rz{A6nu9bN}k)wRmU0@qyxjHxT8&dL8CRaaRa9J&c5|3shfn1%q zSZT>Lb~|6=m|+@m@a9uPvQDkjqFUqOi~e6cstv7EQ$!WF*I&OlNjj)MyfQUe3x(i(N)lLGf8rW&43-E zyyWDJ2@S;SOG4BB3`3aXfGH`u6N@e9xRGb z&olRL|6lv8xU~~Z;M-Vrj8ggIN|oPqL`6kU-h3|CLdWojczONe`SLw2 zO^^NT8=GtRF6vt&qt_nSaHcVLz@*HQ!-%iP@D-HU`83YO{*IdybC|LDqF|}S z^vZ!Z?7F+PXb^OFM_VQtl)l5i>l5HHA}?!QW^7y+2~Gj9;OEIX`Lzkx=55eK{Z-p@yyxS~%FGWEgpkny|!WQdSk_gQXL`81M2Nuj!Q8^@&j z$G|rLqFwJAx6Nrf^2dQmH|-vUHs+Z($$0+gAD0mK-RUYDYNNEbgU=rQ^NJM`5{er{ zzJ{y!t2gQjK~`2*<8Ijb9rn7~j`1NuVPOwfH=Fqb9W{|vztE;2VOMf6`*M(M8r$o2 zKLZQIN)Z??Fh(a}xh6{L4^YcD27fxy2?&%3T}#K+bWS-xGuuR`e(m5ucj@+gm-k~pLa|13c#1$5VDI)T7f+fc zDH%t9@mj@O35i%~6kCitZO@4l-#6)>8)Vfu>@c>v)>BwnSwS2RuVjct)}tijmf2T3 z7z4c>4`$lc^}L=;yK&-o81Hifb9J>p#CmIP&Ztb0Bn_e~aJ50<`{bA$c_f_Y&)=V$ zkK66vdn4`=1;5}K>EZI2>=Ci()WjZgpi{M-ANZ~c^5R5+W(LM& z;it{)?XVWoW1({SkFT-ycdMrhGA~ls@1!L z&^hPBr*9h@JmQv(dlT%ImV886VK|~|Ri7`2_RSfCk8`mTxs5kVo*>4Srl7Gh+4I-T%cEhM-1mO|5 z0>I$5r_zx%z zCpen_RsI+S1q8ND`vblIp#}JvIBNRb+{GW~Ri}_0{WiGn>A)we(zTfO$Co$x+4VPw za{K`(ohy2@-N~dG*Pn6oQmw**#gcc44Tpz~R05HZKY#wj_8N9K5cem0NSP-LqyUJk zJ~xauEQvlLF5079DV)wkB=u{fgfO2d)XyO!8GrS2XN39;g`gQu7%4a781S;ka3wa2 zg=hy`^^D=8X1Bx9OdI?z&u^nltn~%40``~I={q;Zy?{B+Ke_5ld+b*{}VO04GnTGRfTLByHW=o0__|;f_ z;O7udljbQMctQSGI~T90sOXLE*)z3#RR>82QPD>-!a9H4Q_tI03v})<2L=ZG`~&_W zavU_?5RB8*qGD0d9|=8gw4Coz*!BEl8j;G!$9HsmPr$L)yzH;#NY!>%sBuB`CXv9H zZ_}i7PP_4m=UoZMfa57&-0qINlvMhnH{$kqGp$FbeKN2mDnpWpXXRaVObmKG*{908 zA`Cq*FVS$Zz<=`eIaygYj5ixFQcO2%KD{@e^2lbopFM$1_mz4f9$Z+v`k?UZ@$s?! z{%}g;#hzkAO!7zIGzB+TrnE+jO(^>1Yj@-gmnXeF{gxmX8IHAL6S_`==89FW`d_ol zz3pOqU0t2o)NiB&7M+!~?wBXSg2kEFD)m|pfMHhNs*PeoK~=7>fMSsgzaMc>XMRTY z-lp2r_o0^DuQrtzMyK*C!T$fG8u>4ji~#Bo5%K!&%e0_fss=DqDrXlL!t!8&jy__A zqszS<$k4VumjzC^LQ`16$TAL5%Nj`lO!;uN@+96@);C)&pbshL?>r50C&;+8AnXT9-ZZ*(r8wT_33aTkFY#2qE+ z)Y4g&RBiQgdShrx%F5GKUxems&oiBh8*YzQokA(N3F>tRbJ9G%_nRR9mWna4-=D*@ zqSTX5%=u#qw;WyB0Dq^qm<;fC1Q z*erSt?~^9>gTg|L*YjARE+>8*3NRDqtw|>c7FM{$Y(?A+3jy*DPQ*T8u#`H&Zm zToPBO3G8@wf*CYRQGiig>?CRTDQ=|dc*O^B# z-ECmC+he7iGQu~0qd5xmDiiwF`nOZTDur5M0K%ED(&$|9aD$l5WI{pVXRu$HPt2$P zl)pZl((5*S-^)UI1AcO1()BxCrC8S&Jkoj+cYe^1A1c|XsOm=g_sxEODl51Cr*AG7 zZ(h^TtWP^p`Q1H-5KI98|}0ZKIXOCL`_u$Ye*^!IH?e1=VftuWd`ZXGt`GAoo!#U$M)}m?v9jlks}_qq&cmB;WNqWejI@4A*~B08eaVQ!2>e!U$RKRqf&? zB4E)7O-dr&91#DQB~7FtteCc`_p^7II`FSH45N|}B$7ZLgB|YfeT*+ry3(6P6eb}N zPNcfUW5Gi@YASEgR~7ZX^Zlk4ZGIS4-%n^9NI#ya8b{C&RDFhw?pBhTX&g=2GxH6;_;ZF^Y>4Xer$v8nM$b|7ShPwm~2TV^gR*5-T zcG=c`4zD8p6t?8iDvU2(rQ8_K#n-Iavja8U_AjAEoIlRf#t}&R^MfKIjf*b@=Y;s2 zSiU2p!o@D)^L2|&2N%S8uy;WY)Snu{9s8>b8#>R)$+25*xpMDKZnV~&Ciyl}#Q;Gd zkOc4NdZiONjC&v@=Wso!?HL;=g+AX-Ndbh$=zLNH$6Gp%5g1~um;$Xbqf~cy^|zGG ziOxp&A@a-DnRs5e)nQuPyOGY^idVQIE+_9BJ~i5H2uro1EX$_xBt`z9s;YHcT3Y(} z_b`vG*GUM7_OP)PK&+Cv;=P71dTpn4Iv}eTX&X$ej+%}C!?a6tp#Zur2zVlub;PBe z00dyqnK?Q5OO%ke<0a<6IS_Nls79#QXNk(Oht%}+Pl59l5Gz1_Pns5HtLFI;xL*0= zR1SV?hLjkr@&{m0bo7ktF|68pVhp5-rF)9Tw7bDTtg5hInsKbLd&472M|`CxeCQlk{9;@W_picL^SC3#ZAg!Zf7B#P_r zVkCS)r|IU91+w)1VqCN}ApE!3jeL)@IxjDz;og%O!didC_>dWfB`I24TTd%)U|-?# z7%0fa^(VC8vVe&?T+`&CrbY(Xb!22u+1FX0XRCC|`6iZN|M+z#f;Zdz9s`&AGWAmX zMIIDQt6?__*y4*9Qee>!_B~NJ15(YJ;7tPlh2?BTj%x2j-C0XMu!iR0QfoKwuZ?#o z-U+(yVFdl3IKHf8*dL6&7~DIAM~GAyun{@0mRElH*hqy9%8-O!_0cNDU;^8R~$1tcuBcdjqKDTDOS3c~R9;IHkLXzB#BRSN03lbut^SJ3x z`~By|MYmj)T#kolL%zn|=o)UlEzhw(AjVzsd{9zXwH4jl+1j?4aV^+mi(;v(^ER2l zcgKb1gi2;WV*lm*K>PIko+PzRK>-@$ql*hgEV_A?6nRO1wC1*s4q(t9L3Iu8++UOC zwFVm`+=QkzdO<+ouSN-K)(46MfyK{BI5>t#F+fAZ<}&gefPMq33Ij`x zdt#ovBj)7*o5mw2kF%P;dWMGaijkjjvh_WP<3PF#!UcUoE}G(ZX)dAzQ*05g0E&6H z(wpKGBOn9<`3=Zw0OF#uHdGo|x#*hK@hCPV&43Ay0r8Is2^E$>zYWd8niO&k*M0{rT&|oye{H@ zm8$%|&>#H2)UE&D-a&5;6Vz8Dwdz(Ap0xxq-70ha&lC-T2?EeZvDT5fMYQ#UwDd|_ zF#g_LeTd!WK%67ougbEW07Iz8$@Fr_Kn2LUfegY2`3CB`r(wfQ_deKsvVwU~m@@$w z$zQs&EuNp3Blzvzamm6yN4lRdkz9A^{VO)sE2q zN?GSt>jxw<)x#Bl!7>F_qEo)}1MCIYt~9+38q)b{g|DBt3FT{7+lCTzYhAg6_P0af z*9TZU^VS3mwbAlUE^z}$-Bw{H2}%n7RUVG$0ZrZz<0-?^BRJv?v@p~8u2ct4VWtD3 z`Tf_h;Lsn2O-t{{1f6m6$EDrf1r>zvxV#Q7l^GWQiH9id72;HOehZ8q;p7Mk4P8s( z{;E;GL0X{3MCzp*5fh{AbL#5symYvU`nIjw4qSZs;6VN~yZ+RKMn$gex zyeqN?HqcyrU#lESirf6KTco%K#o~A?v{Wyc7+Vh;;NOaj7hG@1wYUb+9xEse;_W8k zTo_jBZ%tK?S`OZ{)VXkdnS1OFnui3WyBmD%^p^5RVlYJIP4T>J3J<0NHg^0QUD@g1 z|9Hn8Zrh$^_y3f4cfYlSO9s_}7tGiSD9he*SzGCU90kK>(wTaqQ_7`!MOs88MR&)t zUVEj2_dkDeeQR+$tOGK&2eN6PTz0&K4FO-4#31G=o4RH?(A(#Cq%V=3WYLLR1~i4? zK@`q~ljP&pa}eV}3VHzf3mfml8yhL{I~AH{XGy)Y<^El~0k!jDflh02BO;)(k`Noq zD-z(s$RA4$#al=NU`~q*N;(8KUOS`t2^@7-3H@0!gjC-;$q6w`V2RCQl%O7#Ag(lM zMX9hrJV8Z8HJ&3q-8`MgUSvwEyuD_ctwa>X0>OIjV_$lkyPNY2P~Jj}OiWIW>C$2y z6a1=-o#v?7)rz#T(4Kf>z!F;}v6#|gqGMFkBUgu(#d@sc7*&5%=ZO9VHG9}Jrzu04 z$mN!pl9G~ixq|3ixBv@LAFsAcEHwv*H1R^cn^TeT#a?|y;L=*`4fHA158vWqR!Y{( zG+Tz<;m@6yuIoJ`2k|(S>*44DbyF4-+JVKUY64q7|NXHS8{0@SGlP zDYkXA$AgpU@c<<8Z8XWMFUNd5528`1Ml1V^-f1Dk?K?QB(%_;%6Eqlj5KtZx1J>Njir75RzW&yp00f|^(E$0OqA z<3-|yGvz1AbYRHUxdabBcVgi(dX^^+5zTF@u^Q0-MQ9#PWwlgo9_`cB80qN-fLm5<**p1@nxN-S4hVNh zk#==U#r~(O^GasW&|Lhb@D5(3q{>t>?g)1a0_kKpU5w78FWJ2E8p)nN<%A*-ZQa+! z@!(YO>deCM^XI*p@G7_Zvz4#TF0M$CQBi(-QLqk_ zXLN9Bx>(#WfVH)lm;bwOS_ChwBRsLG&Qz~Va=iLScrfkCo@VU?F`0H$oL*s;=#@T1 zNht>EwG7&$?xOvm+E44!ad8fJpoKr%o{tbmU*ES_Sum_rcS{A3h5`ZWV<4u&9<5c^ zOHS$4=g3+CO;;0=7|_n4-M|k&_s@*?xMPy~jh27K1{wGA%RKxRj58Q(Wk|?v4c8NP zhLgVoUGI#HoSb3+W!l~I*@`=PfE)sr(E#8c50$QW^HS4gDgHAIG{eqtk-thbv4>ul z@j*dfo0Y0|4M_7kVJrE@ZJnJ_CL9K(M)jq;!P5$`n_`_Z^Kq2?_Lc-aRyumN zpm6e9>*W>~kaB)8sTa{ZTpWx?bcB)EZJ*G@yVnGro!Ps2jQ@$%X)L+{^!rk)I4Jkx z|;6WMJHIte!A$cn#)`4 zkgZ*Pa<)B=&CAQnV{w~!hl*&(RiL7Zdw_31{gkU*OED-ULbu3&x@-DT9|t>(OwLxC zV{)^84LgK-stPc!hX(jJK;2 za$lY=JfJ;_;5CqpS#^nJ1Rx#l^jd-F_|$YT)!?!O7oZ(BTSM^b{<>gkc-z5@ zo8 zsPmO`@4M2Iwg zSpZvc(!JsjG}uB9$Ob?Jf#z;E+g9(*U2NLq{d>TcxmfJTJ{aUV>BMm5AS3{r)JHA< zA({YBg8lcNt;}p8`b$K=X#RNKf)De7u4-!@yTP2%+}u2{E*22UEv7Cx0cZqN*`5Z+ z(c&P|)E!^X+V70TSv7tVyK}{4Bf{uee77i!>}-Ac0TL>aAUK%_hRp!rrBSlv5l$x5 zS5=CCe0tssvx<=O@&l%IHL<;Xpr|iGCrcuytxX2d8-38n(OmBT5b&A*{w`;HWos)4 zFyc~D>MmE~gpj{F`B)Ijy0r4$!f{=J!sE%*#-Fp*r1frvZNtO3fc*lbFvP)pl4eEQ zPwC=XOtQKgYHxo$@&qC%D40t`_FW>wV78(#(!;Qh9uEfBc=hVv_4(nk7o>{Jh2d+l zSWb?Cul2+BavsmCHTtY(Brty6BkadCQPCT_wS`o-zrwG(T`cHe7T9vDC%f_gv zC?9}JRd1$Me+h9}3krOOp5KvNtzdn9#vpue@6W+3EKI=*235|tE!v17pt+9|=~{`8 zk4I_R)O!PlhH~PLp|$Xp15j}3)ZI4=@P-wu6{4i@J1hen4rY0ymg;KD^1_$tk@dkG z6bQd!zIt30a$;d&3EsDG0y!$m8Rh%Va6nMmt@l^z4pv57jVJ1fu<8mbfHd)K*9{kr zRlC@EG?}XNUP9Mo@8>b(wqc(aR8~6t4(qp9b}G5r{#3p&ENp)jjAjd-nAq6&l|@2q zBw>8~e2+@*A{LL~*uRxKS-|MmM}QcAI*Roe8)U9@ENx%s>R)h92(pq7DwYOZDmEoj~=03ynp0aWQm zCn^9=+L|Z~l5P$Y~c7myd+nv7RG*X_T!JW;_0y|ut z8hfSyE9trIy^79AJ8|Tu8%jVQv(^thoDMt{^xq1b@;VRjGEY*NaW5?V)a#-hZ$sz? z4_#RMy{O?MV&d&f)W?sGdgJBJwuX}cu<)73G!jf}O5|5Jw3E&Z){E#BYd3Exu4)`D zzXE{0y|SJim}AAo$L}vlR4B0>PaqR=L})^3kfo;wV59A7Xjm21ayrw6zl)@{(bjvG#sOytabeY&Kg+y{L`p zbiHz*K>Pf~Ly(P2&{f~jtTKD&bJtfqaC_}?ZvF~zBfoWOvC1rGQ$rG1X10^?o$wz> zDgVoDn3xy|CK$4;UU;*yu`w{7A6z}KxqOhW9cC}k0wgF~r5QvRC}0lJWW`UCNXYSh zs>qmU15h(|tX*|_F#&Z$a0F;S2H?b?J&%t5Cd{+=$3+IQaL>z=6qh(knIj$dQ6h{u zoiS#Te-#7+U*FF~=LD~d`A>J~rkw<5E!5T{W2+jUgCWRjfE2kbyh~Q6hlry+`FAK| zZD&Wv!xQkpmIyk$S}b&OOAUz>$Uao4zMFD&b>(pA0eeye2xqVaRsf24C|B1_B%Ym} z%{CCyf;*rCAmY4Y1`i&9H~X2M8Gy*3mcmzJ_v`<}W3x9EHF6MLrQqV`W|}5rw>*0| zfkRHNI-`U4N*(V0Fo|8o?bJW23JStljQ_t_xBul`HCde6-;X{fa!HDn^5hR(Sfv#u zu!a?BQBfN%y7#$J4mxuo4+Ze-o@!!92)ds8HSu~+T(86RHRf(2yaoNjTs}yNdbg%3 z0gUZ}nXyZgaYlfjoiaOt=1xNRHd5%<^FJzGH7o}Xjsl%*>%)?9BF_P&ep|Wl$0H~F zjFiv&oRpV-Juko?cY$qAw;xS$#Yl$`&R@F+##OZ{?kZmRHba`qh)1WZzb54M0f&?g zyx4zNk=dprJKQqoHy1`foD#Aaq@CLumTgh5|q%vUD;!i|gReQ*qT0PH*BJTO;^<{(pIZ=;YySN!v^cw{j4n;(+T zVZo7j@+KiZJ{zO9ifDhh42MSgKT955&m#%b$-`XjQ3B`5m`)r^B*!t zSI=rUES3513-bUAi~RZXFNT|&%ckalMs_F%88Pvfh-`m)#eYR1H$FPwfkITKr=+;p zDs_EMXfAFUhKu{K?*DzQ0}{!q0mY3-TN2-jzV#dd=IZ~n7#TJYVc!!MDb~9db?TDx zm;oO|h5&UEC<*>AR|%&O0)(6T1GC$g3YD1;QtMrXnS%D#a@Him#Gl^gKdTw&@Bf@C z#P|OKXh^A$@0EPdaFS%4xD) zDjoghzl6`F&Hyh&2L-jZ(&YAcUtb2jhL$I?F5ik~)S^PNz_eyR%_`9D-9GZTIm`H( zZ~z1w7_6*ThS+V92?ib*~(H#+Sz$8a{720$Esp zTOh@H1;Y17?Hk+#Tc`2wj*^Flh@`7lBH_C+Ba->CpVM_{-f3wf9_|b?-|R4{Gq}-DdUa9D9YFmDsS-0=;`|pVw1vJlT%iS0 zd;J6q{*SYRal(6Vh?>{=6Op?!U%S+W$~o!!n)6H7e)S?((lxXx^7;^{o#`X%#jcy} z*&ND6kIH~cKj#O5gt#v$sqN9wI|O{Y6ST87GR49gg}QINtcW4|GmbAg{=Gt9NR0pt zFd+GIfRKo<^5H$42iHr zUQ=NJ2bAmq4eaq6ehj@TVNiM@({6Xjs2+p84lj3IA~;boPvzwS0o?9D&om!--^~_D+p%q^ zOo|f_1}INHuMDIl+=u0T4jcf@BUrx`d&~Ax?9x zivc`P)r-kmgr1V>8gwWSiD}QVg9*&Hz9^W3&I>^QJT$~M;ePtUsxM74@FE2`=#SH@ zy}dUQa}EN)Q?H5}jBCh^ewc_3i^{=r~>)%IN>KwmjkEZuOc)IJ{dqm6kCN4;dAs+3?t!VmkHPI_lvu*o5CpUAGoDlhZqw zpmiua>~^VsL&RfonL2H!NAv1c^zka~$sVUNG250J2od6rjs!L~onXTJix51*(;I7F zKma?T@yZbsqN%C*nwDmyK}XV*4YVjPyt8@2lmo}UpHy4|UIXRK>@g3MA7AqmF zBDHHX3gZNXl!3Li>!F*cCnr;7UyuQJ~i=@WK%vjx$RZwVb>Z5!^e4PRASC0A#83OQNC@w~i;+b^> z{A{a_2g@!ccDS@`%WiCJZZ_7{Mf<%o`GPz-3Rk+@#JO0_71yyZnFEjYz5Dmc>F6Xu z#B<>ayS$AJJM!qq#W&a2IOecqyX&JBbmSC;ss5pq*C5+SGLqK*dz3+Js+fVS-tC~>qrt+q{ zo7>eJHx!_TmgSz_0l`f@HhG8uf7c}>&KGOnHd>`4ebci@SYw)+f94J+=lj#+wYzhh zCe@G7OmwOBq(~dX4qiQY!hq5gu%($B#9&_q?g;bKq0jk_td7IQa>Ip-3+>Fm1iF%M zXp5Vh8w{YYARypF-&~b=Lx@s)!to=ZLJ*bvy-WCO;JS0$X{|RDfF7vGOPAXerKM*Z zZg#$`_9Da!DnfSAj?>KsDT$B58AD@@O6E2Wj@@r|V_7H+L5|MhLnehJW~bwn4iwQGuG>D82!6u^RRc$n)c0Xu$q(YSa_qr zBkE(4Q==n1Xa2e=tZKYSW-*IfuOCB`fDo-ip|X z5JKPPq8#0kgJI83=6Albj-Ab9SVs#6#;7(0kG5-Dna*2E$MKSINlE z{%`!%aovw3yonLK6?mR4wix>uZmfwIn~1jIy80`5b6#q{*OWf#w=+D)s zjt=Mj1G$+taRKeJr+^lVagbzSm3rJm*wacy0v|RAt z`Xzyqk$5Rg!k_`0cO)F)`r!Ul?A#qhM@3~$d1^l5b=4t#EQ$eA|D$%Tc5 z560#9s6?N)y?<{P*52-<#-<=9#x5!$A zRqmSbfncj>di_Xe$Kl`SqU)45nhAZ8uL(XI3p~&TyOB=G~j0igdGW2w~7eDV6qH z?{QcaUSk)kq=o=7c!IS5wj^ZpQD52I+=S<6c6~zK!GYbzY`mt%4k+V|tu2VGs%Tzx z%BZZ=E-2(~#$xZWu%xuN|C?lAxWss$3WO+cBO^(95-$@=1XO%8cz&?6P`7oHW3#J? zPOr;@fq@|?Ea;PbcCT7P;PmC~CEV6aML^3RiR`VPE%mczwmJYAZ2XTuFV0`NsXaY( zCl7zDYzTP;eg`J7^inWIM1S}oWnRuLET%MeYjCyakT#181uau{K zy|VHsPbxWYdUiIVqy#xSdUEc3fWy%q89Ditk6*D;vT~d+{&4GqFaQCOg!+GK-VTer zW+siejcV|nh(w-#fwR)Rd-t@vwspV%_+j_E?l&}TA8{pwwx~En zc(Er3|IKKdSkel)E4lMNCPsId@R>A8KsO^36ZcwC-~2!oQHD$m!-EGQ$A>uASg>Jn zg82e04N_84`n^d5M|<6hSa)F|A-Ba~rmuh_+L&;U*{XLIxQPv00o!PnmjUtlm95~)arf*JwfU--DoN|(m(dpcH%-SAjtz}zb%Ac46AV1o zqp#I>9iy`#XX_!p){@7lp#E~KD37Uc~rH#H`R$u z?o8}3kr?&lc$n~niJ3Xbmx%Pye%ZI>F-$62H|bgUVh_PQm|mQhdX2}&p9NT}?_eLr zvg`hi&=GVu`Fn59fr#{$Smdg3+`+KQBn5d=x9w1MGEq|`)15mA5d9yn<&Jm1O2w~% zqa&}I0#r=1&y8{C$eIZzoQpUhD<-Ec#+l3*;1+7*Be(x3>La0gab9sYPd!7%s8_uV`7ja3JW-W)iG z(q{Pj-h6EL-k^$rfB-hn7vNuHzVM+r=mITji|f{7GelN0n)zjBm}51mYNaA>wgZ~f z-*t7q6LkSy^O+KW-kjzP@p;a&tx|KnTmQjXP*4D}&Fi+6I|9$1J;R#MViP+4)INs| zsm7+{Wub}us7`rUNK}+M+bY%tDt}mpKIeLO34N2vXYl$sE&c)Z87cniQj3ZC6E6=| z4RKZtSV7QZ2Y+%!#qHJARW}b04Ui(|0e2)IOE&>BXp>*UDIWIqQmm`Eu+z)j0z`w4xZex zn#}FnabQa29ksg)Dyd=j-4O)n)JTA~zCtS?R`k6GPR%T^|4;W@`T6-FfT2KkeR1c$ zuNW_S=(0j3;C6wZf1l}>t&I}};)&(IbNVfRGqBF6^$AHzm8r%2Y6qX7yaTK2i0#GR zv!BFqN1tPhmU{UUHAD`N9Oq6+j7o;gM+*prJ;y|GCLL6d_3u>sR3o%eBijh<=QKs6 z7T_8u*DnFaGuxK0itFywV&B`=DYc_V2$wq(>BAWbk>hsyTQM(xfA%)$&fz1}Sn+g& zngs6360cS1o3a@huK4zQOiVXiZ=%_Fc_}$KrurdB>$XYZkjC6T$NE;~(MEz!npm=t z9UryVk+jck=g$(nN+1jd2qp{bcow{9=kGjXc!xG^=UZ|xkxNv7MU~uk1l=MMcCvmN z8gGqllN;y!w4QM*NJ%jxz~?w3{t%MTo`v1wC+96WNDLZH6QZZte zH!cdtSK!y_AAsUHut79YHMgasW2UVqo5O-1X}cevDWC8+&sqy0Ap*i@jEr^PX8Xdz zK6L4Nvp^fuY4+$KKky8pnpVs?Ms}*qDn1(G1b&hIc_SM-fsYNc==aglQ%A*>)`u=P zDvx(=;?8U>4usBjBsw0|+tZ>ZrB9BQ6ydFFKa(PtlXzHJNl+*hxRn6$a?&`4lNLhd z`?ZEO)RE6K+_`h-IN?!-uj)4aQ*s|p`zCTDdC zahXKn66W+o#^-d(b=gI*Cm+L(N+V<{jG%49D3r_2VX@od;;$-~6I@pZ37;nRS|>&N z2Lz-z+N}x{Sw4T(pQ}>>dn?=G^`v!?Cu49}B$yxm)@{Bm@zY>r*OZz+SzwVbF@`Ru z-lhb<4Ipkj6glNRM)jTcjiI6wVkMFXi+-xJd6n$^#&!lZ_oRu@a2*Xze|u@xyCo~& zJl{O*j)SM81LRxZw96h@f{HgQTa}EOTCC{`O|YWWr@4n!d!9pMfH=lNbyh02x|#k! zfLLXC9rHQy?Vtdj*0j}ps#-?5_v#1=5_cG zd7OmOSRX91T<8)$)o%FR;GZummZ!it8&s>?T=oX)rie}vG1!V;Mj{DnM((c7tXZR` z*48@5pZUV&g(S<1VWl_)L@Z{P*0L|R0TO|Ag*}zB6li>opPWADP8U6g&_WI138i`f zw@!`^y31agrtePcS-5|fZdI~lUOhVghe^_y`!)z-VXED6HwOm?U`8*43Xkb7_f(Qv z0Ci}n(Wqs9R7%vdiehVX_=X@wYO*O2^rdHI4fR~TEe)B&eLAi*zC@RQw^_^-@#>oP zn5Och3%#4JK=~{^#8yDdZE97=B0J_zG#*CL=r501PBsSf0<0SB_`B#Hge^xaGAbE% z1L$2fN)%=C0QptP0RxO8IFXXOKR$d}Tq;||4EI7zCCKgsL}4eDl79_fKhR^}EXXs> z)+nSMD%Mf=EN6}HF!`>MCnqO&iJx%9>_`j1?*0%CqZt(sd=h35Ai1(U-26rY{w0B8;H=iDNBq!8OB;&;Da zK{W&euF=?N6}GS3yTV1z-Q^K5!v=7X%B*x8_A9HrgTiv!BWO@5j^(7Ir(+taZBUJh z-+HT;?+F(;7L?)ghC)C6Eo9XyhR_Dy!<`iuk=Y3Y=p%1q1#NRRi*EAn)N<2;f8<<# zyI1gC$%xWQUA4h#Z=7+*T1e+K`N&5nc9)9dO10}N1CFb=^I*LKFDWwjm=YWyL6IVR z?}a^gADOOFLkrWab5{bf-cd4^;(BtH=t`1n0;DX0hqLp*OUa4P31$O@x{0%LZ)RPCD-bT`+mW|KCTabGesxU3IU5LSd}x6T9{u?BnP(cx_K^< z!UxRBg0rdTQlFSc;AFVU4wi>@J9WC;-CZ24i@8^IG2aaC0v@-&w1zYvE@jcFa5C*k z$OnNx5tOmDzWkZ&e9SbU;7UIY8C|T#8e2)#;LP~jysb1IROMvq58eZcm|Q|x?Ji!t zwzn}=Uq4N!vDRPa+eGL2K}IR&BHMK-LuH2TrLm`=tY6t>lYBfWj6leV8rA0wPB|2Vr$RE-t5k* zyST`YS|t{3Uk@AKCnt-0NZ=v=yWb5NQ@jqkSgRlIR368o0%!zqd?SFQ_XGtK+uP-!>jFyv znOx!twXUwN(Dw8_=nXb5Zh(yj&yCxk_A9A*C33{POS=HD0d7W((zUz4XA+KPkDXST z`cf9SQy`i(^}>}avtW&DeEo>qObWl($E}ao4G(|42x|T>U+y{X>fDu_ylknV0oF+Q<-=*9&9r3R6X0@yv}ELC${A!({=4?;dk&!D9Fhn zeB{jK+rwgT{vj3FLVy&-$NRAR=M)lMLQ3-}?AI@q#)!7H4|5a2kxIbXczGYs|NBV+ z*0ljglLGH19v}zg$3%{ULcZ4na2ev1s3Q)*5~cARb_J2dXMZN~VIYJ|MWfL~H4!vJ zWo1efK>7wYOhz;qLNSb%R-8+%fG>LflSRz;qk|z1aZOXW17;%+PE*q1gp$51h8qoW zB~UN7;=0Z%!S(6%>35x7#lB5|pTA_8UcLH$tkTKCD{j83%jq7H>daYRJC6CU4j>*u zfV0r=ooCL;5snn%6@K?~P4!oM-`305=$Pla8|tK`BM%>x-SHp;3;bl-_-5Bj?|1^> zyvmjz)Hv?X4(0Fr91B?S4Ba&PkYw>dMnQprhbMM9hwbQivyQ&q-FU1^6s?t~eX@?R zv024_I?D&_BXE)i@TDAJY6$S zb>F!-IT_If%vp+$#UtL)KkrFJw3U9PjdLEo{0fKp_X)8wnCjz&?n6~_^3Ao;$dL9m zZtK|`H1NA{(h4titRKN9zNU#dLg^)Og##LgujhV5beT3IUB9GWybX#fjL);ZsQCHn2J|prEIxSHV=DhoTek0s+7igJ8w_ zO2NmABZ+1oS>M?-scYP>#5k1U{x;a? zc>c+?BprTu!{_u^ZMHpmA!*HPO>5wh@xqwxov7=d-OMKWtctUzJT}rH9}&xczPYEy zaN`bdU%%yMkH~`&|GixvN;G-*N0l;VyiWI7_x+BfNO1|(FNUu_w)IW`g9ybK94(!* zbUa<4jJO|`>NdKcDU9?z&&vap=~{5u*XC%&BS$HI=hny2F|~GT`P{2PzG;b0aojl; zu~|OnvAtXe0gnM4v32uGM#<gr)E3Ry5GUU!7NTAlwjW>h7D?C&q(n$ZDdf; z7s%XW*C2X|hH(P$P@fzeDnh&CuD|RH9aO4g3f>>MIobtq-4Dw?1&^`6=oDd(voFA4 z7%(CNqcc>}Kf87ph+9ew+w*GI9QKYk2DE!Q)AEiD`%yGeG`F=m54h-tTNP7-*%=tP z2Ax($+}1DXt_|FlHQn?I3uGGkMgZGXxG8Lr++Ffqm08!=r~x4Z2DAFMR@ z6zSVM{BIqPf0;l7=P|cCxA~_I622!AbM|LhzpGZQCT+t`LkJl9eMRp8&`E6m-ePg{ z(EO(K`3BT9=tg5ty$`tZt3(1#Q@qc>0Uum9#7{?n$(?NLbermM7uu<>o1U5B&qv#U zjTbgBw-f)CVL^v_Lhqq!s%LMXUAif>oYSe6L)8#>*u({>my=oQnAUgji;^O@;vC=K zc=K~NG7DmOP20!vbR;9F`P(b|OmOwlkyOPiR(NK;)|V)b$NK@dDW)A9>)>a!K5-oJ zG$oeEup^o2HRQLx|5U;s!v@qT00vfQ=+so|VS1#OaJD}qeQ&ad* zzaQ$GYYNl?uc=-=P!l#f5f7!b8>$h(j zYIvqxZL=!o`qn=A?c2U}6Q8{HkD?}RZubW=%Hk@9t`HM9!dYcy==A(2S+vb-Q`4^R zue5Z1%x{F>dQ$zRFNYI|$}yiqf6yb6-MHb?h=a=;w{s->*y>ME&8Iu7)t2{wDyQe> z_7!km>?%=2F`HGJk5)3av`Cw>P5ntb3!L6d7~~+}x)=i54?!0zq^ZsnQ<%Y#9~XA) ztZd9=P3=*NsjsiEG~dbxOqJ&@aGPi6+{b>`wOze>_383kbzN`wE1xAIYCAjE$aRZO zW22cUE?nftRbg%curp=X-_p#7d%ii{@?DhbiE=CBhByu|MBLaX{ z=K>CRZ>8XHxGbAw4=4=$6to_13|ub(+y?;8Lyc{X6DbuS*6S^b$Zy=hLiCyo*7=Fe z@JHB=3Y-@FBh>(hYX31Lx!&E0gf1{V-}Z#)&w}+xSy>qbj@+E(j+c{5J~{)7)oS=7 zGRZ{$+a0LoZl3N@G4U^HtG_H6b zfX~sw?|clc<0&7Y>Ng&0BHjcBGTqDy*G9*E3>xs7UEN>X&2`9VMc_9I&mD>GFVft) zDO`u|miF>PB9Q^W>pUt@wnsZC0g!U>@?|ET;&olANIImlVfCvDO|K&Y2M3u(#wy0y zX&g)2n3hCaZ0=2@4MQT&G539YkmQ_!Bah{$@$&ilFJglwOU1#e4eYScrv;}8J#tonvZ9cofiA??v`7#;gON9J7o^#IOj&=!Wm9a zY_^=+y1~I#bgH(f5?VXI=B2d|YfO+|TN%MnnMA)+BSj@$MA2BB-x;EK!h#L~dPrkk!^H+HHC z&z~n)uh~-qu|xsL#_-+HvuCw)RbR(3t2J+{RPwxpV_5Z|#UCXflb|CfmynX;gH_>A z`*7OPZn~Kk;Ip&ZBTW5@=$II6OLS96#icBA=XyI}5gxNd6b)_Pqv36LV0`OZ27wSgA}&7>PKF(b z17jmRHJ6X+M5!%BBCSn^iZOV3KwZh2QB%ak+Nt89qnMZvM;yo*srjg6!Dp~L{Dd5| zw1ITFY)%6p&78`BhWZlWh)9Wvi3MyQo;rh8MoiMSsiPx#DKA^vpIGS}p+8?m82iPe zqccDi2!REW>G7{i7cbg_YHyWswOp+t zMi!PR5c0UW?kl4)u^e)#twXjC?Nd+$cs0~8@_+!&C8Ap?BY2nBmoH+#MiJnpMsRRv z5}`lI87nt3GWzy1i#Clu?cgcv>~I&EfvUF1IeW5!|C)5D%{1J0 zCl+f02gk3k3VBA#cl5_jykS$0p&>jzNnP>|RSW{=H>P5(9Btm6I+aqfdKb_rVNa|u z?OqWBT!@j15~WNzcR1ofp513yNew!&(RCAdI5;AclEC=4t7}*Ck4KB=aQ9SPU!PAz zPckX#5gof(+5l0xI;S3^>UbsayULS}4e{PZqc~yH`=k-6%{lS;6Y$2%I7Ml>c1%Y#G^0Ri zG!7%LG_Sev!HvZ4<|Dgfko%-2F@i>&D*#LaWRm_Qy3$iiaq;mm`#{g=pZ96f*2s?y z&vK{L#^k%JZ{O*1!sR8K!_oQt`jDqnjsx5>)%l?gC9Rrc;sQ z=CTo!!i6w>Dwo3x&~oK!7N@;xo?*hNw8Vu=@HB-RE$6_OD#h)&85f1ZkTe zNoh2iv=7{f5a;UOM&rwuFT=D2ztC!xzhFYH7|~@rZU*vea>1N&Mo7&hIW#qu4i-B$ z@!w)^ZYP+*>HsqrbJ|+PVNY#Uv#)1o#e5OX^An&;R=ZjjAlSv4!&KLH{r2rTL3Gzg z$FwSm6DRZ%pit;}o}pPb8bO-y_0yAYg6qJEc6 za+ite#@u6IXpsDWPi*2#PI)OSQl5>0K}|RKX07%38+xaezcj!CM$iaCw2rWcbe$jw zDP~y6BrgGnKKwVEl!UUX;fLV)sih^!)04BIp!kilR1W4d1dz2-!0~({kL|fT{EYD- zQA+U02Q@$WCI-R?3u5^HulIfkmI1B?z=GTC02914OQd9rb(LIf`qsuo(;B7gMaH{S z3XqR=E?7Dkwz`)9lDMo6>kczMyXgKIBsU+)?IUVIJO_()9ixbx{n^B{IhTs*&b5r3 zWS142PEcWZSKHSVn3b9!x1#9`T8@t_FJq6nK!o|?z6hz#fCFk52*KA3XBCN-6?^%Y|KBt}|6|b+uuE(=fR(w!;2`hFv3f?~rrnS}EX;r&im)rEv$B?kT1g^mCzO&#z$G_Zf1c@r0R ze2$2S@;|TrLQZyxi|a66cKg>4XO|rMOj3Gaj%3h7K6qAv0ut&dm^lk!g zH~BTEXSh}^>{WJvn`CeL)+Ha#VP3u1qeXU$+`mNePNt(A8VaI}#hJq$YkGE@PR2eK z1~tr+u^jeQav23Y`>E?;f1gL|iXsx{W{)&7;S9 z-c@_)eM}6K4;Uw>xoiHlbi?SvnYSCC!MfC-gEcnqbNM6g|9in^2}zdS(=_uWI7s^| zTm}5lHAuZXUo+{yCO}8$d@2mM)^#Iebf!hmZFYCv?4H0MKcozeN-BQcCyOF^#qiFc zDPm=7rLVBG%`W~u%nq_WdA|wTFcu!hOqK=AJwYa1!E9&IOlc0NqCzwNck9Fc$Ir_D zla}pcoc;w;j=Fv>(oO8&T?kJQw@2S)aOiNrKUePCGyL^T^`H<36^r4f3@pr-hVKme zX?&YoTMZjFBSR{#!E(|Jz8H{`lQYRakt6VH$xEpledS77&i2R)3_%*bF1qLvS($+M zaR<6VN3`W)z=!3)R34pwTbFNNN%z{9)fI zQd@g->AZ7DP-zHuGvvSIcrw~Al}`z(LMzU}-%g15|GRGQ|9W3O)f0lm&Gi4Yd>4R? zC?Tyn8{L9OoFkF@oPk$p*j5XmQ1UZQ27$wq`}H~}$fzlH!^=su^1{1z@%TUdSelW6 z3P8phIOswwDMjklP7bY-7kS$I|FyW^r8(J|gD@F@cEs`!hBCB4dDs{hM6^sj|M|ki z#0l5HIwh;3Yv3$w;;`@t6iyiP39X*qb~YRPcx5F~ck_tBVLL&@$l^cC91uBL_>k)A ze4qdi`mTO4u|sv(n7?c@{K3mi>Xkt!{RKf1onkq)rQRY+;G+xrBi>b9>!F1ou(P)Ms=STJ19v?qCS6lL5=N6 z^5$lkMv|OR3!I)1oSw6mAe`6$CRYH3v|C4TVBJpM#i|v{Y2c4{=?x^>nseQXBC;?f z0P7|MQuWTNbv7V%rlu4{?r?E6Wh_;x^Z_>nhiq=4SjeeZsUu3^T3N!~__2*nbvHVx zWL4HuQDLN|=8Xa!90H)Ujp^>lC~!An_YXz{-avHAhcDA#7;Y9Q+RNL!Q)?*3geQ?JUhWd@;Ml&pZpsK}$2UzT zd7sUY9U)Hevh>qj!K3;!ZEE8SOsO-Y6_Q-LMH;66T*`e)MjL^Y33*HfLNL*x;uZIq z9?JcdUA>!vv(NC-eK1pjM5a>^Gho#?VfV3gG@ZlmU9C7YwxG6oeE;#6GaDC)K;4uj zjuQ!(1MS&aA|aVM1y_j3#A0=jxW8?#(Xp}hd-k?q!nsmgYmDeG-?r5Cn6W|kE`X4~ zwbkJS$=f#z8oP%jf2*`e10t!;)Ex2ND6koEg)78jU@%d+J{$^QIt3kF({fpUfl-qS zy0_RJCjlri&`8fhXCJn76iuw!q$y{#g8tv&QGEX|_p=Cmj^?Q6Y8@a$PFw7{aVKC3 zZ^6s?Nfo`Q;Q$RW(2IW$6o9bydU* zEw~pH6oPW^9zr#5&+j4y-5nmDOsU1A5>%i1gHP9Nv3m93F=N)sq%OIm;rM0K7M>%Y^ylC;%{rnGgo5AYyCG25;iASZRmkL0lLpJdjvVuD5K$EbkKz(>TF-rN3;ro; z(}5v|7ic|7&q7K=1_~3XpcRp9dVhN+`m`hCneUaogY&vSt=HFojIW+3YJG1Qc^4?@ zqqRRR-Dy8LeG%?ddrN(E7}e@v%^46#j=>)Ui1 zBH=GvUMd*)Q|?4t>pE5yT4&=*%LRB<6pbJXnBD5RKWQUg8#8BsO{PUq+}~+B>c|_> z(x|W@M37z2W9_w0AAcdj%uHp=VN2^hEqz9oP&rN1udNUKE|5Hb4sQqh{_6WCfM8Yw z2i(p}Jz1)`0-!!6eRJE^>`lw-bc+}Zp~n+Sur>koZM5RSM>~rgm@xvD>2)}A3*G0I zHmX;aw6*mZ#JtbT3K)&z2G{ZG-`1YGWq6QEi zSL2PUs<5T}e1e*Pb4*c5AL>auJMP@O=l3^5R&V2A^|mu5AdwPJpR%O5dk}XD3D3Nn z)x!AD0FQ|0w!pqGuA7zpjitqZ_#ti1*gDzqq5SLhPfZs|vztrCs@k^uMy8YQ!$y~r z<21L%&#$q!cW(OB@KNozo#uC_j@ijFnQ14G%mH5dxhcY7Z=Ig`x6+Qw%AhpR2OI0_ zcstuUB6KDMHA8?p-s*O#dv&NJP^cnV*fTviRB+ZysPNonA>5kUxADVgKlz-=Pe0bw zu)03hq=IP%V8UzlWF0l0T}HsY0yr`oMZ!XmnNWXW5!OBo9GOgkZ+&t${*}w2MfO!}o zOn_(Tdh-r%WM>sgS?q0Ob?hA+fUzqOVmx44bn(KWq1yE%4{f>|?jk0i{2jw*AX>R~^|8jWdS_NLQP_$CBXHN>*H{qC6 zBrWZYxjQn-}O#fNZ$J`((MkPmhCtY9E59!>+6ZZnnx=5;QkU8DNKhX5Bw9J>agk zyzy$}^yoAa>2p^^B!X90>#2l9fI;FcW?x`8@>bgi@wGF2LvMAgmwHp7zQB`Ti2Dfy zduiUFbHHo_&`c0sivU(a1_~etW|QIC<4`%OQ&45(a8iq3V+=fQ-(CD?l!Xa6)!OF5 zlVYyu-0Aw@DYY-fBpYi7`Tt6^1M6x-L2og9mO{PUjUS$|(o&PLB{NWtpMB66m2u<$CqjYWrOcZ=3eGmxzA-(^Yahn9O)Cr$KRYg(n=fGrdQh_ z^KCS;i^2=x=O{rLfimE!P%2ZVF*GcJ!uBHV_jbQS0pATYYCAYEFs3ZX)7-FWe>a<%^gKx7hxBq0yXJR%_??%88R{!8P#k`4R)&9^#Whm7q25R z=`_;PVq)0NzP?Vzspr}*oWRgduIUl;mQ2zms*6o)&dko@>kgQ6I6O7bG?xYj2B1j4 zDBtoYegBYwA@4dlxdLdD;r`&=F4_uC;N*GtP6kZKQy~q(LCxZzlA-71jDz7(rLW!D zF9tvl0Ky0{F|mesT$#r^=DrRTj zU}a!1H7L@AXi+c~*+a`(ZdJx!MKDnxd=4;Vys#~pVk3z!YP_`}G)U?#Onran`<&lv z?~b`S3%gG7H?K0OKv}f9of(vDcc7cTWZnm3qJ)bJ506%a>}o3oSy?Q;v-znG1NYz{ zPm07K;Ii>~Y`t$wh*VI!S8Epnb{{wZ0EYz!*x-r^@e$LYAnkhfgCo#wWwSw zXken8f&vdrq=rjsP%?!7=;WZkzac968vyFNV43;yg#zlIQQ^$Bg+_RADM85y)=Rv% zZe!!K(*h?v7t&IE5;it@ZGEO7eEd7nN_YUCnoK#u2)ann%unTM{{puW2$1Oc_&(k} zHC?N&`^?-Y5`ijAl+X8je1YZMLh@tsGjIQh=BNLALH?cj4)NDF=}n_b*RH*IDi)Qe zLZI}8mvF)F$~V7ziLVP=Ru72`jOE_w-zYp7Oqor{l8&PIdn=#k}+ ziLepeNH9f2lTc#QyJr#$&FTHFy23@Y+~NcRtt!_ti_`9=H{+gu zy+BW^ZDH{!B0@o33w`?6zRVW_>%(($0zDOT@$<^KsV==X9fPc)++pi@Myi6s4$th5 z@B<=K!2L~46@7ek%Sd2+l9C8isQ!TgbVafQk*`cf`q$R0J(ZPOV(Lsb0td1Z*=&ZmX>Ux$6aSp7IjLoWpEj=H1WQ?U&_Jw^4E z)!ql|1Hc|^nJ!(ptP4!o)sl!5LTWXF<+;&%7 z_bj?5L)f2R*g&u`Q0XQ;A@Qw!>J)1Bz*B`s9_2B450b79ch=@$!pe0`BXKvcal~Y~ z)BT6Sx#_a|LyQ0Ngyl0-^?_&{P(ps$e_;b-w!fELc-;N3UuG7+sIb>CrF|mY%Dfz@Bf*3)?z7+N+R-B z$8w~IVN<6d)h#+j?Iu1S_0zM$o?G|s-t`5yRLs|<@IKw9o*w@~)6T9;XGL+t`b;auOb&_zKy#KH{r?srv^y|LQx;`9A`B5iAtZKQ2$Bmamc8rF8 z(R0y9$*itwmpcU~YP9ZZf?V-2=)q<-2#&d^F2R9ziI0!(hx3ps?bWhUzgTFn1e}wr;3P`iC!w^1k<&zbluUl5l%W^S<6~$8*^>n+ZrqXpl{6K% z#Wjnf1m`i7B5X1chJV6#RZkBy{FcDUC*Jk7b$>j{mHLboo5X>j`27|=1V>9(Z znaBW>Z5Dfc`!{e`Zt<8&!B0L*MnLlPhg7wL!+Y?{e%aZqFsdi>$B(OUgApbQsS0q1 zLPA2ow3=c6xiM$Yg&(>`Ja0#EOvLFk%m=aLeR+DHeU1+vTl~AAB`Bzxt4r8Gw1(D8 z@b5Ca2M0}{E7SMeiu~?}-=?6t`XW8$&-<(3zp}Hl`=mD}`AsW}{Vq8LV*XFHFh_?M z+2<}PfasoB_I}Z=@<6C;joxQ!Wk`_XuL;dPts=HJJ)449L z@0vn%jk;F$nwey-+st^?U{z6WIOHPHKfdP&lk>E-wc&~wk1Rfciw>M&pk{6+%%T$G zu~lfoCetp{C0(7&V>4vF`02-w_lmRFhSt`QzLVVtKdlYBmbNQTW^ZR2kD}&uVAXKz zc}3Ayd3I&$Xu(9UPza=be*Uu0xCkj7zuapll7ns3QA%6K{uV{LrUU>Hh2R3YXiqaG zB`bS3Q{HmW#jJDji6zX;lXKf-!MBipy7^gaM#u9#S)?N#TL}I6_w<=OOd?MR-k4@7 zq{;5u)Yli&KY3Cl=Zxa?Eu#&owm%0@7ED zk*mF9fAi62{*)-{F^lvQ5uS(cyzQ^CUU#-4oy};aw2~58)xnm*1f||bcR`!P$L^1k z%U$T573x2bPD9Y|s*eQa zp_sVD#$neO!B@Sbj>^*-f?sAmA6jW+AQFZY((5vx=4Uy~X!R+oJh%>jSTw&6*BwEV z=>rSPdn|#3ghXSrC$)|X;yPjQ{P@xm$s0&sgimfYTF~(8h(i#yKXf>ydu$B`t14Z^ zs&Z#ohfd3X2x4R!B2rQ8yDr1JCUg0MX?w1-ohgDuHGy;;JP!*!J9E8n(DbCs4Ke$b zB13P=l&|Evj?T`YO`_o9&Ee(}Gl>WZ)0DqS37~X;9?d>XjOX_*U-)$RqbJ{UX`HSv z?XEqIz=PS5>XG7S#|K_}Cq(^2V;&7Dwfavpl$F%omgHS^Q&JGxWgbPt+w&ybh_5*+ znIyY?c{;4F6~+ss`fJryaACSY>}#V_LGWX}jbn8{LSyh@#|p>A0e=2WbGYdxC;9>C zXqfQ%vsAwygF?QU6kSb5?S55}<~rWlb2l-WMJnro4hYd!tqOR*cG^JWhaJ6AloDj#2EyQk z_wn)4%F2I{y_l=NkJv1j7jz-29LhVig-Qz%cJsX%BnZs0k0syS(LM>nFVH_eb_0jw z)}m=rq$c{LkX*ieg}}vt>?uzkh}&Wb}tc>i1~s!#AGL6X_-%EwLbMhPZ3gB zSZIEbT*r)(G%%pY|Bcd8=HF={Yjw9_sNTF%fujR{s1#JWTo?kR-bkH)>ze41Bim}& zgl;u-Q)G34h0EC)Y?_r+;825wCHL$Z0ge(zEG*f^c2%fxNH9ix3CZX1@$rGn9G@Ei z%RIw2wHm*x&a_oe1a2=~yl5^_nAxF@u|JDno^Dg8>1jyn0Z5Izi;IGhfRqi!qt`{_0=0S|r%6xvlm`V8%i? z+}1Nc#zXx>+|e+m4GchYnF>a2k;nqmwUj{3(5vZ3@MUVPV0zu_JA zi1t3*#XCb`Clh@xT57kEp3YIHcfgUGGBl*mHtJ|wxqTm|l>r^n@o#ly$a}3iIb$ud zV2dbDlpm^8{nc@pz5q27|JHAh57A{Ke`CvpJKW|79X^}S3YREdP;ycAd3CmRTTcZX zbo?&MKlUFy`26Y99XK1p$jc0@+BcPd7p}~<4;1cJ;pW$1zDIr2(2!F}yWT6vzPGeo zA}4ASgag-vUT%WM($?lCWCw)808@oj{<`mLs=&l{e4_W|cRu)~aZuX5V*03BeT$K< zGybJvH8g^d%a$bQ8GEK`borQs{^WIp(Iy6-YlYp48gou6+SX_53Yxh)d1;8@-9&)~ z*PggSENo=rFfe1^X%(Le)-KC!ItgsAu5QY}ZeVygh}?OM2S0whcK!NKGy4Th@M}&g zKKn^Ojl&zFLPDp5`d2d!y=uJ}e%HZFkYDDSaA!Idk}YM%i8GnivT;-JZ z_aX({7q2lXCVPDKrruvEIYlD_+3Qis4I?r4{H~@OO5+nA|L6MIlk2rGL-}p0UQr19 zXSwAS8n@}FgzGv1S4EGkZ){BCY6yITt#l6rJ;%IHAJVSisGjxs-i+e>Qhx-BDDvAw z5iqOh^lZ$i9xh0#G0f+kNTf^tyfRFjwfz~S&*!p8$vEWB`Y0Tfq=H;KHq zqmCmV|6OB0ni2j3&HsrA^ve+ARsfn~gr-E3-OlpOS??X`;2Bz!)g9-he^YaMK8Cp1 z@Jz~*>DiNgh4V;^h11#~1tldVmG`CB^mH~<6oI(O-Nire8h$A5<$94^~HM_z)mZf`q zUgi6Atz);z)myi8({lk7#;IepY$=xhh(thufxxfGv!BL3N4~7+%`M4sUj7qonvxPy zkthh?aVD2{l)H$_xs~M7ExvO_g9))+T$Kl{iHryF{8Pq&n7y#zgF{NjLEkxF1$5`S zAH9(9J`0?&&B=NS>K_@Tk-;cik(0f%_mP5c!xMX_W)@xu z$)1gr*`8ZXI@(fM?8)s+w5@8SLs5HwJ(RdW-`>Iy@S&A~139*}*akOta(-IHFkYtu zm7$pG1JTltAc1Rnuqc|YH=p(AaHLkrRpe{FH2MjZT;-U2^uvjtK4;DFlby6mte<5l zPt4CtL1MLfu@fNz|B$2d6Ui~p@A*a3Z4B}K^&VrAWrx+X@BT(|3 zAN^rLa#U{#_4eNK*jTkmkV*F;AHtjLzVE5d?0&{5si=r)H(_6!j3V@3|2E6X?a6c=J6)&Yu^pAl zDrJZ5YCg@j;;Lv|sPXyd8zU0CNtt_xxk!#f6Bf06-3b&228$*^8**OTXc>-_T``=> z+-^9<5WE49_RJ51I?_yIUH5H9&`8E{dEZFwI6R}q%Zp`91~v*kKv#tygGASv(#Be- zd-tJmIE2}BCo3aTv4?TleR+^Xi-SXTj8Pz*aUFMD_s01PA4n~wxuhknWAz8;%q%|bU!#58*h#V;yO z)w;QB_J=v{JTM~W7D!NuuIhLyS9yT4g6?(4;HymTs2_jqpkKt$9e4clg8W1CQ6XZ> zq9+x*%Rot^6K3ThGV5e-iWxs8C`Ti4swwj4a$-j2&Z=7I)yY$i+u@gqNNMowb%sWF zCJ<_Ilh4RQ(_HNB6E#xKS5|sS$ye#Fii$q}y^hO1UjswwxNe18otm?@VYC8jU-)U} z&erYD{rU0i?yo`W@2^NcSzCF+Awn9QZHi%uPj_vETiQD7hT0PGU!}EmvVEW%PCx4# z%kD4+=|gg|Jmfn4v>q(5*d|6ahTn`dHCFUd$6N^^J;G~!vDhmxz6h*#au6xs52Fzf ziea815Uw$~q($icjNtMj?>!;5cWZEP6*^rlg3S%p*3o9%J^O$3_SRulukV`pLL`)y zmJ$(B3F#D25D<}8x{)pc=~TJ}q#Fc8x}~L+l7Hlp>&&@k=6mMM{I2UaXaBYL z78h%M*84tjKlgLr(%_`y^U08w({eHvR3Tulr5AnJZT+euHmKKDC@BPDdWIX#N^a{6 zNCNi8eY^&V;v(nuFE7xE@w8r$U^CRX28RZlCLZw=ViLgU03-~}O4 zm3xI$R8@CRDGFJ4*LJ(kHVL7X;xc`rkRA$7P9pI>Hk+gJ=r~S^AH2@2fs+ihOj%gf zlkQwvT*MbPN9ecFgY*=nmAazx@;WPK5lr1RCc_60AFfe)Eu0aK6mx7%v_r)!Zv28w zn?>zMe0lCy?FJMCTmCryz&9L(cm@FtjWz;l<*B2CPvds{PL2pi!*KWNf|FS>>nn2NA zav5-KfbA@h3C23g6T_rsN)k(C`}!J$nl%9*%R6(&SxBMmjxD|c=85Py!5C1aQf2h{ zgMr|h2ZURVT1RNAvtGSDh>!Z3pYK$*v%r+t5F1LxkMi#Pn5LH1Z9N~=vAL})Rw#&% zrklg9xj`}WB{d>ZXm6#cw|qkx1#Eg)1`a24Ngz#@3leym?1mb5WuNfHgV8iOpjXLcXGB0h(ivQx3#Jqd{`m14 zvb;ecbt&0P&>($X3p?2927gk}hDw*-sGv8kdN=n3VWB^fkTs>X{bx?}Xe#<_=&m<@ zbPr_RQ0lWJ5bwF0AOX4KXTem1LZPJ_B}GiT_-mv1m}m=AI{#Gb;TG>r0{ zu&;mdmF`WWuU?^zGl%l_!MXkwWd74Od{UvU6CaLO$xU z1yw9zZ3!(c%K#_n_GD!rM?`koGsYz3Qk*t5HMq?kYr%_pgCJLw;G@X*LO1f2%%Zvf zxxXB~0#l4co-Wj*R+HbYN1V{T(z?KyE=u8;Tl=P7`;II@s+L4vLOK}(u79^ z_dkM^|LYT3<6W=D-oo2Z*b-~Dd5AQlhX6YFb(P)w*yGth?(r&p2A>mJ(L{-79@QT8 zm`}Sd)CICEY4?Jk?AqhnmhZ)~O79R)(phIQWafTAdlkh-v=95m9&FcFZgv3 zVPYO@r<=YJJ{1=F#53(m>QnW{+MB3)JL`fiB1?DJ!I0Z52g~fVqoI@2qMqm*3$+qX(~0AT&k)((p$oi=DO+9 zp-Iq(dI^+Cl6y(J7BnTmzgR0*4{(NCLku4mXW~)#!wbN;0U7c4s;?EBUFq2a3~&&drKfG5lVUI z(L!}+X%$MP_FIqKFAe_xg**5 zqz1S7sHaReU4cF&tYlL1I(kC-k(ZN`)19zpC=Uvn==#eE(;88j)|3(r-2Fx`AKr(g zj(|!A*mdD{Hk_e*&d%O`Z%oq;@~z)(me>J|F}g2HC%}-fC2V2P-(s`|yDH*z;87Rg z|L4WcoBK%nXZtPw-%suaisMjZD5zRPpdI|Wi@A^z>seQaT2-ai)O^<;)2at=V+4g2 z%4$drP2iE@mF7RpR_y5bdU^2|VPeCl=g4z+v3v#tCke}fXy~T~(%dM)3_)411_{zQ z9zH>ioO^oi-@6wK=%Z@6Ga4daUoY;@-~a$kdQ9~!zf;}mDlD!DJddW&{2@=86XE*`0^r$Naif|=>%hikp~ zlK}pRjNOq{xj;+z!WSp&B;%IEEt1XQYbpU${D~|oNJ4pP z2UPCvL&nquzrg{@qe9~dNfa*9wQpRMmO8yid(+U|rJyheeRmtdCWXZQ>*YSF^V7C5MfT246^U1aA2xMRIO zC}}$K4fSaPw?*IDUq07G{5qEdH1OT?BQ>hkGuF+fFR=w>ulsJrkE+C+!NbNI*AuPwx_S_uG4>~UDxj*5ekO0d<16mu@5U?|%v-;;5 zn3y0!&+YwFQ`e!k@fLKk-#r+S`tH1CnsYWfG7>|rxxJVZn562nl6`mFy^F|}owz9LY(rs?e4J8&p0MSQ!3vE}|LnrB(BMeCcYFw$Uz2jYB zN8QucGKo)QGJHegpnbI!iucRUXTBV|mddMQS&8;3A_9r}qI-Q{Tex*{FrxkEAipWL zPqyf7ANx0DJamxieSG5B;|Fw(zAR~VAx95fSy|_b!T9`qF3?wan6>oQ2!d3XFe>e3 z#sKv5Dqhw_(%LMlj_qmwZp7BikvFoJ<5COfkw10eU zQ5U__88cIT`R>y7R@q03iOQ1wjaIqZjGgjQbx0d|?QWCBfl0xu@29hOHi=1W=9u00&Vo0Dc6Jn7M%}8pdTVi}B#-zI^28 zM1U&R3rCgf(BNy-zDMz-skGEZE<)`L6T*09ccI-sjOGK(&Y(?+8aD!?bimsH2_`I8 z6Kjw-L!I4T4uu57cft?<|COUDI|lA1I3ho9J#9EI@q$G0r_F5V&p`=2w1Yv(f~S8D z1+0o3W-MDv8XLKc$*H{H%buvP0{NwHh;!?6GC+YfYV4yR7emSD3kU~3=?EyuiI63; zUNUzOI_3iU{XY?YN_0KWmq%BO{tj2fHQf+8)9I{Zi)K=GaaO8 z5lBMfnhh6#F@hEVX%&_e3I)Bgn7cE21p1g^hfdfqEdZs9qm6U#69(iBt zTm(B#uq2rPD?*fN#UVT4T~Xh?CR>i;;$oNwrZDbgvRp0z#U1=cc%D5Qa$5f-iF|~R z1a}Wg3b(6MzAp?aV_JJ;3bv)5@9YkzgrMuM?J;{sX%BhYym?)yr4I~T^ZLM!U)@7E zUVUF3spqsFz4`kzxBFT4z{4yTCub-)Jj=yJA&IkPq};jtBmz3J#mTDDtR-kt>+9cq zcRuKF6V`}&>64v3qFLw$fD_ELO{;m&m4Rt=k3su!IgN`81|U;a)(dTJm8yUiE-iH* zY>aHzd4BCYF#3Td==4>%>EDLq3Owmkp7an23pu$y8sVdhRO!6d@zi1Leub zrluyFAzc^)c!2llQc|VxkCFBmC})}>u%jPPqz{<}&~T@wOA(6r*RZ#9cWVU2%!cAq`<%kY8*46tA07<>8t*uQ-Ma5W+ zjkXcUGFw4vRR1wMJ4P>FDHmy`wzOJ2)7>ut>Sw!$f4Qa9udX+IbH9!;f@~M?4Gs16 zMPKDAK@k%LvoG;`_y3&rWe{sd2ee*Ch3ZrPw9904bQB-ZgAo?N*zLz+d-_Nm9BLuJeIbJ+BPHW+}6umekJra)ku&J5-&R8qY49lA?JUkfXA6h%U zK3v?48*pVmqI=J;nR9`2n@kqA8)Ns@%mI$@{?}Su(Bbc&KRW&1Mx!1&!r|Q+yl$sN z0C$r8(`KZLaf*9|1BPC@)GnQM&?G_!k(;rgz;bh{(yx3&DKg4#fKwRGF!a|t`ud%+ z!WPUc(?lXFcmD;uB4f-AEO_}V{o|ZWx!Fi7oUsI+t0(Vd00IL*CL$&V%9lWiGa>N{ z=Yu$*Jw60TA-vFQGKTWtdz@V)gfdQx+f7iUK`X6LCJdEw(tPzhNUZR&uKzGAtP7E# z$AdZLQx%o#;o;0=T!y@$>Jw<^+yU-efpEzX!R6PWSB- zWT^=pZ=`$;NP@gj=;!kdA!}*LZZCB^Q-YoW)<{t9xc_8@>N%tRKC9*VgDfGQle8@( zKy68b_>s_s9sowrQGr;ars+^#x2<9}hqL)Lg1K%KSox?kIf0X)2(o(dTsXAQ(hd&~ zZ%$lM0Dg+tsMi*~YR3RmGQk0UZte=ClPm--kP8SjIbC9m`MrTf@ODk zb|#wnD<>EqJ!(1(RoBkX%R^cn3J4G?xw2xwy9y?c`3Y-D9}BIBk+VH;PXM2-cX6gi z2l>}ppMl~;0EpZ}RRHnXZ@x6{f2!%SRJ8MzBIBGEthRV)y;&K8Zu&O#ZyX?A7i|9W z!CFBvrkI%KYyg}~?!5bAa4izy?du)43^cl6s8%Fbdg8N)iHXBMk%d9@Xo{3wP&)6f zlh3%1P0jncciE%kQ`&{oNmQIMCpY$O)-SKhlZ8{R{{Wj|at@YoCM=duCl7{W^92H>@#uaW5eq5$L9-9G>GhWc`mkPNGURs;Z5U_#hB z#hFPseZVvr>BJGKtew!>MgDlNL3vsSio3iaQy3%3=f?|cyYi)gN(|!N-@yR(q05C~ zW~61r_LMWUpb+!Oc6aIIR8`sFSV9qe0~)2naxMZUm_fyP3kqp`j4KZv6vHkgl^pA$S6I>q-G?Q&Wt6 z1r`{{_9T+Q3Qa;cEqTC5hLB)75gq6DEvl)T6cji+wMQfX)gn87;}^Vhx&%n6AQ(N( z1Fg+joF7orS!jFUozMeD35bncZa$PQa~(sB=cgNwm!=y;FgpqR^T@%q&9Hl%3%vAV zGo@`QBlFL{p?}`!3v@oXZM!)-XG6T3I;k=Bo0KGdX!$e$41oDCow-#R7d^Cv)zsE- zG8h1<0zE^1H@L|n>XB3G(DLNL*i9oNqrCk5Dr?aK9?V_s6;M_(2 zI$sJbR+#_)Z&{}Q?`ng89fs+!0c&>+v^MaeOb6BRt9))C(B-IC3L${;HAdqq0s~6J zg4dX|FSGlMp{mGRW$)-l&b77x@`Yeva9RUX444fsKz$4B!swh3n0AT6+RWNSAqF&! zFkpdofPMU25)n+yKS$Y8F)aI=(_Z=>=Z%qs$=_BZI$HHUqCCwWU~^mMgm9H=5TwLu zMcsO(e?O5vRPn5czu-l*4UL;Rk|D)1y$rWVBABbogl*R$v7_(183^P4FXT8BoR9jDZUrFs3ABL;B5aVhUI>>kwO;C2y45M` zcIXt(g+&jo9UPIl=36(gG4*<~OJNk6E%urdrbPZQjW9Omg|XP%tIN9oeH8+DkV2`U z1?WnIC?$9$B~7_invDLw&fjX6_Vp`lM{>4>lH)z)67~T0rRYYi3jAl7OiUPjS{Z9i z%$s>VSR7eGgT3OI)}5flgzK4+L5J}8g$8clPoZKp9xI{GmPz^|v&H{DbmO|GQZBMn zsF0?J=dx%kTS+-v;YlTeLZ*t7L53O``e)Z0kr;3URQtMg=xi`gGoPs^hRh47==Q|$ zP6G`@J){Z<;-eSM99W7juB^nU41*vI5Gxvy=oFL+(20~86X1Zuffyi;2>*>y za>xjBL7` zkaUrMrzKpJ4@%_q!JMGd($1Ob9TChu3RdGg&4jm(bq@W2WiOK?Bpo(gha{RB^(3a* zy}||}?XKn&`?v2H8GTQI6pFB2>86FaD!L#c2O}g6%_#)vKEQW+DmVewe^$tI0Ql_u zpE)n+jG<(aTQBLYWA%YxANyzU?Z<0gfLS)TwV`{$*-sl-A_OFI=Bg+f#IoLxdHMp(4eNFH8m5Ge{2?8EqfK*bzZYEftZMlpg>9;y)ogXLR8CF6V*XI3Pf z+c%1Q1K;&kmfAun5~cX1+})`Q3JMHNHwJSEf#4G_@qBJ;%d5}P?7V?!YAPyuGTa#c14z-oZv zL+>bA8?1Hlh&%{!|CdsvvP2NS5+WI_M+bp>`Nipulx9|HDx$95Gc{EQ))U}TGp~=B z>3l1MYs{$30tF!|Oeb(DM~&2u+VjTUDc=44gD}%eQi`U$=y&RL0bQ@B0~1NCMpNXs&Hx8JuN30sQRcxG z&zN`ecBz`+cKXkt7br^JSzALTc=ExFSmbjGRKJ!<)yB5vU|bNF1#)kwz-$3z2i+5D zz7HrLKxG`7!HtHIAD&29g%37`VJ5Nkt(mg@E!5DDa)X2SF|@MnUNIrR(v0G{PBE;G zvYw0W_ti07E*kGxx~D2kIzF%L9_$*N$xgsFT-vh>U&uTUL{RPs3pWg^TlwH$VZ#;g z)0dEXC2T8xg0PU0kqKDp(fEC%sIF?cnT$OiS)1B(BjXRmVGI?yV8eI4-_ zeo^1+M^S4B4NIokwKy<7NLRXI)V|IDXwXC8rrpFkShCEXZ2Xjx;+K@<_HR2&_V$O6 zJ))31OQNuW*3-kX!~)E==O?^;d>K%u{W-yeL4ebL1e!xY$dGq~}WhYZ5p=OV(Vv5eE{TtnQYO*$E=--POyV^6`+)P!NFNB0i`|mql|CQDD|K*z5fBKd-{Kme&%xnWt zz{p71+`^)`VmMVnlH>+$3ldUTJ#dEaA2t?k_6+Z%d(EXC9Larb99IL493DVH;p~LR z#Q`u6kJ|Ao1s$AGF4=?kemm=#POD!$Ms;?h{ z#TGDz>Q0o#f*Z9ATcCb^q(DT3X<=ucMZ!UFV{LkI+6wktBQLmrZwTQfG!C56o8^5x%z zNm=ftjgZD>NW!TzNF5=4x2AB*-5mw~6xy)T>s~Q2k8^THesvDSXYj#~;N1a;T}_QW zIl11@q;RqkCTYNKfX$>%zb+f)h(6h_b=B4Fx%Ik4?sg) ztuGTIgb({hu3)GB^8OltUmO>LP)T5svOtR0D_~#{-oM-!$?X-es%x#-nuuk$xV>#@ z>3aGrJ5QzRBXDnBRxi{8cvb-J7aB%VS0F8uT7>rZo|naTe+ zdVKu&5mY~xVAfmW(n~#1&CSjI%Hz@r2qm_=u=8h9qdIS; zT!Vk#X`J{~{sn=c&X;`t?6sp}J}j}pzGknoR17d8zhRs!GkE`q@Qv7BKJ3iru$uIo z_Zp-qtOJf-$O9&(d%V1{M>B3=t0c^+$3{OqRBA%)EhcoWjQn78MYeF-wMr)~ryCMc zG3@Lh_hf*P{>a6VHT4Q1)&P|`@>G45r+a`K0h=Ak3H%|SKH+~~sP-=0N!d}=tly+a z&&VjQtZZ*<^G(~`g~g+RFV>MYmJ2^nP#xXJZINddxX0Jd0UFFy1=tk>VP>v7)Id+d2vq2;+(aa!ZF<>oDy$Hj|}lm=DwIQxv# zM@FSuZZnGG6j#dS-?fn35x z`MR(z6Mk2W*Z!QB*;Rdhpd$u6;q**QBw=`gf=R)44HXp?CNt7f4N8vOM}}7)E}UB- z^}gb;dhDupQey6;#4uc7p@gwL(NF5)0!tKxCZJJN*gzAR^~zn>P2AUae`g{Ll#s?9 zHbD)GW=p^xSgm2yh+s;gYw#Cv#i?6HX7H|tKjd9FGyD4bzKZ*zeibyo_jkYP=kHG` zvWcm0JcXs}o&*b4_R< z$%kn=6>qmOVqm2$@bhxQ`jK)dj5dr5)x7Zw3*_k0GZlW#d4*F7k^MTq>S@l8rT|@> z_d8>Rp75UFOShb<5*3RHL~a6r=BavFvSLW(fiWLuWYTXs^6~%t0mbv zNNa}iBVOl%_xq69u<^w7@znh~y~$!*2H6xLG@XsBifdrcA&t1r)4@+M?J?_VZ@l0! zQBn8DZM591CPVJQ@m9apIPGV^BMFOL$Nk*S67!Y#W_K8cirCB3)|(}S+9~`0UewdghAoyu8n5e)=zxtweBd^nG@OS z1>$$dcvwj3GDrsH-+X%f@!ghCBB$L=m&0v(78Ynq4?iU*%anh6BmXF>Y=8Gz&TAW1 z1qT&5%w5x)LzG_7Htrp%E;Lb7+r4|R^aD@5!gvK8j5RSl^~XxO;% zml%~6A7SAS^83Tg+WKf(Q#^#axk|f-fDHe|s6WBDU5b!fAe_LgtgJ6tB$H>~A|t3# zKvg5_!1WsZIzm%cj{Wp({@G9Rn{AJ;0 z!Sz(CuOB~5OzgPWip}si!$I^KCXXA~+uJ{O9h#2gFuHSAkWR@*xH?f`h=bO8ekt&F zrs{KZMkof`r3`?nnxRq9@`17m$0h}cFfQZv9`pgN3kdW|jbG$py z-=L+Xh1G2t`=ih~;;F#HE7vZ*eLk5}|DYhzG`ZQOllIHa(KNbnVX7}~?^qEHiNdmf z7uu1>3gXS?MB$7^IR0G^pY_1G-uu#VubR;(Oval0(6C5t*8Un4Xw|_!D@TpP=36iX z933ZV&Gx~&5fD&jN!W6NwE}Zx&O3>k?jgdi=m5Y_^JFvECbIrtFM1n263dKiidv z=QQ~U44LpT{UyaLX@i4~H`trPh?@CUr-=BMFIHF(Oe$rpGu2m2>l#G)sHk!LPVDLx zmb4s-&1Yjb9vbx@J3%B_QU#0`Ow)87d0||eZ4!C^lN)_F@&ZKAOZ8VefChhwSmDB# zFjZT_QsYLEwlFF`7$$)@{c**xUV zWZ-8uR$|9^)8}JxMoC+g%i&r#JdonDvM-A5q3{ayY;57bx2I54D%}Oo@HX3j{P0X2 zeg;YyE{Q^Jw>?V?If={FAB64P*{58q}V9wqK9hH^02 z13(UYpukCUbaK80KPan^Qv3e+i_wl2AaqfBt$_snnOLC)oi_WUY`%UW-kXbT&YNT) zU<`YKbb=x^doV!&zn9#k)M18t3*pP3fl=CeZ{I%uBhlzOSuY3<2ZnR$Vj6Y!%)JZ0 zGu4&n=NGJVm&6;yudmOQ-|>@u67$tWphC_)xb5r12fsIXO*mE0csTZ|4$IDj zHqO>KjE-Fo&7shR?Kied_e&V#_EmZaC+QXvGnU?8g3~Jb;)UZ}J&8zdVtScZ#-&%i z(^sYZ`=l(ZJjq(0KEI?VPE3MXzIgprwk$Xkf4ARKt9L+q81+))(d*gM5Q?uu>(>Hu zz3T+6cXvPAzF+LikN`p~yV>#z@-g5h3Dgzkg{RR1xB|5;{Yue58B*k=8YF&zvW<#rdsko=deqO2%CadO^M(P_-*mDWW(VYbHTkwK6(MV$g zV`F3CU%l~n{6!+k?#sr@=sZo(=;pkD}Jg2L&uTRtBvL&(zjQM9$BM;#+1lrpY0CR7Gb$aq8L< zs4Op>-8Uol{O|!Ksrq{9z4_M1Ict*-y$c)0Q!fN***+xj?0a~rJhOSv)XuZPEngA5 zKw+YdNxT1M^{VimkI1iqK@e(6?kjqxuf}-IfLo{oE>H)=$AbwY;R8RMYyDje|;%ZbPY zd~dENX#%!;K7h6?LPuBk*#w@KwSB>lIF9UN%K_gf3*|*cEi;clK}TS__>=ZF$g{q-eyOe}k{d9M=Pqf1PLQ6db zUt}@+w+7o{druFwg99F_AxLVx&_U&6%gYoD61AFeG6W@jy zfoXIdi?mxJQ=!;q$fijgNB;uM46L-TWhzL*N6*X8Bj@}s49S0abT?zLaO94%CV)!< z0xm$E_zC~ZU!{T!zCS<$1K{60{SATwF1M5|;&3QN20V1EpjGc^-xAo}C?q9&^8SvX ziw982oAQ+`h;E|67)!6~JL`R!+nq<^NoQUBaESHxUIx-!?Qa`!e#B z)u+4MjYMR!sVGPz?Xn8lQ>!;z5M3#iDih*b5UzP$c_Wsmg*ZV`6+}|-sV~KnHQ`GM z->d7}V>%n|!YyT1=O(0blizWp^FDTP-XIh;6i3ISo-`Uxj2k!T?WH5S4trWqDNlO$ zozw@#Z8~|{&Ey&E_WK;4q2Ujnq8hqgqD{HjyO{v00Gt@))bAGzsLMNdrleYa|NgX{ zRtMEPYqKw2x_ccuxCJU_yT0ESgB7}1PHX-Y+;xnn;K%|Z5UKCi*j)!J1gAt@!Xy61 z{uITy8otCAshzkvBo|Q}zy`p|_+x$jg_!7oK>nZ*Y55L;sFmgJjpNg@e%w7EUZg7I zTpoTumBl!M-s6wSbi_oZm3(8>wMH7ZM6)_}gARNlD>jtN4-gf?p(oKbHopF2p^S1%>zoos8`QB#*da9!0hk-9M=Pxf@z%&Eu;_DvO7j`4tNnP=R zN&UE)Ao4AM$dCx3bDh=$sY2CDgX@UpWfBiF2y@eJKKI$)8k&Ax(2DV=XDruFxitEE zXd5DaAQbcgSkkqUqPKxTxG{)OS16g3#WQ@xQ&k zHIBYA&f@uS;C?#nlknKz>b$F@Yhck`zA^IRh5yP5VLPx>^%~FVft`*ztB{s1a|TD} z?Z`IOarw z>Zx#IsyRE_r%xtqIcXM@U&QJ-fbygl(whvGC@bqRT^_3N7M*LO$BeOt$M6?xj^L1x zv2vGoiid?^f0vT_jM=r-FGOk~hnoNNwq9W4;6Mf8=V$_5x|6Mb`nrx0d)tAvl<7A< z%YltkQ(o`}pey+4Uqt&Vme*Ik(z3rSfWe@Xw|?!<`|B7Esm<+4Gb&EBEx8=*?0S>2 z#ZR36dhZh6XLZ@8ger`j&HOk4H~;rT&YVKqc6=&70A8z8bm8o#h|W{9&?{H$$Au*3lgBt1ba*<3 zhB9ZfxUgU*BpF6sV%i;}QGebZ*X>7BmI2iYQu7XP(*SN1B(cRnu}lSU%X<+V930DT zcP%c?hMxA)&2;$d2Y?o&V#JEvjE0AtGXtak9PKp&QU{zR4Fk%Te1D!LaDQe}jTkWM zNqzmu?(za+(XM=r{p)uHKfuUuw8rW&Ow==>iGPo^*3tOW3j!RuCupAy-2aL*V=?{w z?b~~>!O+xONxal4V10Rxc6qeGO)coWkGCCuP8{DNSNoj`jIPJOAU=KG_s@ZNp^$@k zSGe^dGc)SY7CQS!N_n94Cx(3bR1SDAV^{z>p?&!9MwCL-N{OL#-Rg(~Xne{_!uPCH zf5{ug*c)rD3j|ihVm$-+yIsu^cqqm+lLU~2Ngk_uc0A3r(9Tgvd;P%1LJGb!Y#Nd_ zFgJn0PKMcw2cREh`1kWJJaL80Zx!92Ket0k3$Yzy5Vcs)_$^Y>pdcywEScnAskEry zZCAK;>BJY7mt|aCDPLwrK=G!~(-$Bn)nun9|A5F<$d(08W{GR7g5=G4?M~p`dA76& z%Pay8hV%5-EqYsebUy{$ysJ|)_*ww4qQ5;@7zU78MJ=!bgGgD@(}S>}wHmZ`$kv>w z2u@&4{weDBb!%DNiGjgF&zOqr1qgn{3F-6q^z`KUtDygg%2g)&-9S#o@A_)x6aMy0 z!&TT;PXBe4ky zsGp*w{LQVhWtSe=5P`1 zj7rya08%tM2af1ugNL@jiRP6pTK;-Co^AT__5}k1<0LVBM2`2*uJP^nKQB`YO&>PQnAOgUL z!_4+I6Go%E6M$LFw+5NTFx+d|NW?j(($3eE2A6y2=wL0htuvPo^tg40H_4qxbS*64 z?)C*h1^NNXBNSE#8Qx5)mxP3S0z8&l?So}63R+U-9>ACM+QAJEgg^khl)E#*&@%C0 zW&OwKs7g&&ng2tCWG{}cnJ@mCAiz_WRl0PN$?s7bQ z_z-YCYgoZRz{VQhkI*CmR!&YR?jHl*F+f)azjQLyVMgeQ<8cw9^0e?FQ2@&9bX^VX z;OOh>O4``mLI6i$e?#DtVzw-NUP~wr-s67z@L`Uz(spUx00A^zGH$(3_Ej%4??Qq5 z*Xdri@(^7aY30tO;m@Kg9dq-pV3X3E4S5>S@k`?SOe*>6#gBsTRPb{BT3d@P#^&a) zO#J#msUf*|K>`KjCEr4dvRn5LI7!MR2!eddu6VyY)#@tQ!)3zTQN5MnEil%2KliiP zK3ci{qprrmHs51!S^81+cO4ihP_G6l@#2FB9C6JpY`nWV1N#| zFO+K}Gtu>lPwXOUj!MRXwfLiD)LZD{R8QYR8jOaG35lMA)x)u2b7i3k-fE#-7aM{} zs|4X$Rl3rb>MnYIaV_qN^=(*$&LqG>fq@7nIy$0^wMEu1&KgO0+rff`|u0o{Mk1w(vJvvsk;WH;-4B`P10w4|>X zj_15_d!+8Vox|Pm^$k?^dMZzAi_|i@^LZqH{!BFPHX0odKH&{of=?2-7JwE9*Kb)( z*l2V`7!_SELmbB!ms%v?7JZrMOx#%S4ZbMbrt)}3)U%`P7vXpLdA@9p*GZl2^=NvW zYZO`vqT}6uF1K-qlJaGSoMDutTm0$mBhSm5(t5l{QbcoDmqBrHd|pCS;v=8rU}mCv z)vX2v0>+OX%?TLMG(vX?e|Q+Pa<5I6QW`P`s1)iuqoHAw#`g+y0aG!!Sz0jyCC;Iq+}p7Yi~OsmSkH z0Zpofzfqm8zq4>U>F%xqoQS~1#f7x_)Sf*sC)AQ@k zKIDUB9T7CyPTelggai9=L#vE5wVsuma)J0q9<|weFAys;6>_98J)-T7K8f$>#+}1U z!Z8;U5!pVA(Qbq8E?vwbAS|rYfl6`UEW33%y(W4qHRRJ2wUf2B>`+3;X)M4h)i!QxH&5;fyuc*iB9$KQ~k~^c)<7 zQdm+fnx{AbHi!ih>8^xLoSd}W@WrP1rdX(u^Tj6fC5VOibjCd1>pa;*`@8e~&gr5^ z9KdAr7Nmf{!l)oEGYszn9eZ{$C-Uk=4O$-qY5XtPv~i5t-yS1WR8$;xJs1*>hHeFk zr#a&A+poP^k7V$fKO9h|M>YgnUa_$;!h>om#PKx|fV&al{*NeJ`xVM{b>JL1mf9iU OA4xHp=LI4&-ln@An%tqh$H}kFUpZROntXXr`LJuTopMCbe%XMGZeco%RDO{nVr=p;sxB^vt zszpI@wv>Y6%<_eE;4l5g=cmAbXFZ-kbuNG-@PhR_@cStbErll(#r=0yC@AhyK%YL= z@l9UC_;~7!&U9?qDfzSAyLj=VhTLY8k4}>3SxS_qM$(0_cRw`0`LDlHs$vmMiqqHB zJj)fP70WbqVdY+8Z||W3B3kjK27+$((6DErSK@GuBqcXL<5y0QeWOH^xpo@d6&xn9 zgAufAm=xB*>FeDx-418b_~+pquk(R^=Elr+zSjMjWil6hrWKzEuPnSL?We_UN3$; zF)<3|o8{b(|2VP6!JL+~y%&bawR=W)xxZ(UH(tla zj#)=<@1BhfX|7W8&*0yEP-i~w6rPdx%?7=xb7vmkX6z1Riv}0$C&0THz&(y zgpsf-3R~?uOb#NbCPr+!pNj9A&u(qi+a|#7hJ2Y{bMOC%L}ty$Ksb4DFDsN!os4bL zUhln9>^SP^*f*)}dE{GI(R1n!coa{PSJT46O12Hp40p^!Q}$Ltdd$s#zMGsnRu#aN zw+^|l>J%c>U4~HFM{Iv=rM8iUM**dtc5GC+ue-3gDBf@<-5}&VCabpAz?t~7L5sPE zP1McD&KUTvol(2RU3q85^Q;tTbxahz0c{Yua8Oc?L2OS@vU+cecfQ<*` z*s2IHt$>jU8wxh}wIA0gDJc_(;%b*lk4W_Sfd|Ei%l+Ix%eQ}D(DmKFOBcb^&;Q3M zUQk}TdR342)UD!w6rvb)e~;2z`1#9oiq}>Mz2Vn&aap)Y@870-qx;XIccb1`lMH@Mlta9unLoqNhUwd$(zCGGfo)t2Iu5?_DfF+mzj)uxdUDnL z=6E{q8+WeWuYY4ht*6a(ivwT%gfABS;Ta~8X|ASr34dq$;u#N;q9@ni@bVnugFLmL z?`x@s%YQx!8%51oH0}Pf^;#Ef{IR1h-K@96Y^=TLbt;z!@1QB4*&r>$6Swz(zYm>T z@9rM?Ki6Hjf+`#aY~iu>uLP{ zkuEI;4F}Jo@4lU*yn!CCNq!a5=Cy5|JT!zD5Z_!`$t*49w6V?NTzR_27Nwv3>7qKf zu&`E?tX`ntrb@=WxP_I4%(k~=Zue<>VU+uVk&?Qy-gcLG?x_A`_j!d*CvSa|qc1FI z2GO-VH!G%5?MvvD<+7l9pRw!Nxg5A`{hWk6>^b}tZWHd!$-~nW%Y7a!+3aOZedPCj zw(Hz zZe=4;`6jK;_Gff>F7i7lOUk9wWmH#|A%<{rg`AX6Fb6c>umS}Zz$Cs|peFi0v&N3COr`x+ z5Rr(Ci=4av23s)G#J;>EQUYu5Mh{G&;1Crt1(qODYssW2l>#s;)HDS z@D;ki1n+g?%r%R;a(%NV<&qX6QvPzwIQYHJZ@E4-(`!{HN3VJ3b%ipo2%quHU1}cz zs8&n!4gB%>O9J_6{3&ly+UPI-o21b4DQ6{RuGB<-q=WGW6D%Z(W94I)LfXih0TP7crJf;@$)-aEnX=>1vhyo`4KE- z9=Nu$VbCl2y3Ti*(_Z$BF`Fo$&KtNaDkJ-L=cwThowL=BgN<*hT_NeErH}ml>$_ZP z3fwZejjDNDOcfPhMy6EvmKs*9))(7ZQJy0%6R^}UhsWP_^IX#w9fxz`oxB^GkNtC- zNqYoKG;^@_`DY3W_Jh9!7%Q6i-%QN&g)eMpcelCL>#IYAzHBwyMMVoDcOVJm`ZDa( zD#uY{+Ze+ZC&LnIeHjiY6&2NZC6|B$hA1|gz4L(byn_8OH8T#_R)JB~n|i-}C%Vh$ zMhho&gf`6zb8kiR4A~v-orw$lRV!%B+}lJw1ik*cgZ3 z2*itjMIztyX}!>>Efg&PDYjUFiLrRzdi=*!AvwaQ)3Qs~);6r(yKd$4>B9FlkRtYo z9lH$~;Z3j+0r)^75f7NBoYGvQ);& z9W?5wh(FQlmEP+tU?-Ikfq|!mt$&+3{z%UR!K*TG!HR!t=fofGV)?`dxT=~D_nKAD zg*;Y{m(G)W>#d9^uMpa8q2<7hCe-8`jh@r`vfXa1Ad{!dER)L&Khoje=imA*SAfTr zFzog>s4Gz_Upw4QO0V~t;^f~*Z$7roZpKy`U0JOeE~=4bg|xT}-u~e4|5I$Tc1tE` z?*N9#Iz`&lDbQ=8xuf%V>*Cugr-RJN3cGNf2luRhz7nXiS|X!NEb<)3UD%MAeCMg= zv0q|K_PcrKM=KqCphG##vSW5>E&gM4Fm(vNYHw}g^Y>EDXV1n4VI>12CB`iyvyX>I za=gqB4&sK>;KzkkxLdG+8T0H{A6<`X4~T0O`lHpV=DH{?b+@gzmBcwR&4dRp%jbG_ z%<+e>Uq8ntC1t701{snLv8c`F!$)a>#4y&bo*w=CZwB;YI!tYZ>8lP0`urD0>B^0E zl-37o3uC`r=1o(smwm{kdP_OgakSgKdaMX`Oifr!BjkG(7zxr}p`sSxi0R71`YdpC zFiMT+s;H$pnJwM|(QJ$lvCAa`mlbcmT&p28;E$A2) zU8WGRRtUZe12&p)(+r9@xE|6t%qUT>pi1u(J!p^Ui*Lc|mzd4P#US~VT?P%!gzR{= zhI24+DJl0tzN9}slZ$dm5%u36d`@+Nvm{9bnQz;dqomr0Rd-tcNJn+0sBp8{oGlY& zu_+kx*tVh}Q(ax1`3jx1+{KFuBk7L=MC`wtiA5FuyznmBVP#ukq^{?|6((U-tV^JN ziqsWdC8bx*ME_8o-<}auuEu%E$-F0?1H6VOU&&Nv_qPUgC|ux(6Vh^*QKDQyBwtLc zjV^q5dG7u$ni&F;0#m+DSGRLu%bZ1G!tukqCsPZj=B0 zzWRVNR<8T^pLsW!%DwH?Xb%(F{iUpJBbZn<+jWJCTmP}!)_L7b`5Q7vvyOfBxw(-{ zQ~KO#CkglEr3$-&_zD*x_j+L8ox?j{o97gCQ9KQpVpp+d{dr#_qw>^%=ZIG!+xiB& zAM!HZ{dNp1G*N(XLt3|g|JHlzD>910C~;q?v&B~EfctYGq6+-+@?nuKIo{5$Ba`@W z8&ML2+b31qM5-C}l%vl^H5-}9(@xnrtibo)B#9A%ns&E^Nx$bfv>uD!yryZY2TL6q zR_6xL#|xyZ$?6pzS68@=b#iQ!`pa{>E!vvVRrrzNx$q|J*I-tV_~RPhCTt*^On^h` ztGQGU4I@TBx8ofLfBCC6W`=5M$LQQE3}g9Pz-9Y22C>%Nsi@gUuPTh&5EHR63SeVr z(zUS2yCq%rm_5dDWu=RX>gssb`vFBtV^W@lJSJvmoQE|Fp_bAeJF!*_o=6Apcts?r zV`0L!Gx0;VOlvm(z1S=(G=kSl!@~Zlge=JMzGjWOWAPM+h`zjh7`@o)X9)SokTB4s z3HI-B&t>$8Ltb)nYTX+nb$AZrD5Yq3Jk?yMK~MSMfRgLM10BPO6{G5-YZ#$J|Muw_ zU@59?Z~8q=Tx+I8aH*;F&Xz)8E4+qGZ;g^Wq^uv@-W^;euM7{E^;1Wm!+L!oHSQ1T zIP-mS7PZ@mh{XCIC5$HJO667#0thxJwJ8fCK;DlZ@S7e1+8EKYL@llBj6!v9E;lPb zUf^CH9p4z+ZIFa@S6&soeYqY#c0PQa0T}nv&?A7WbRi+xHVOz=4l)L(louVgW2@Gjbu| zQH7r$9kGy%dF$$}++im+yV#EtfPyM%9O;TFxmY7I$d~CT*&#*SfXS)bA;LzM?VV>D z<*Q&-I*yJA`6yH-z;6yK? zR;9rW3qDOD9oK+SY~$Xrj7QOtN}oL8cIYW#5VkduiJ&)Cc5^$glkr4X#Bl`mEv=$} z8&83A|51ngsKTE4`SX*Tw{GR7NKvo0{_AVFUFbMo97!+y4l(LD{O_5IR8-q>NC~)Y zZ}Q(=C(M zF(>&3;cQy)I&T2h=SVvkOQO^ zP?L0`IpD99M_(<(ga+^bv_k9gGKekOT?1AY%c@%v5045}X3_nPA$W#jTdJK8jZ~97 zb>})#7`=pDMh=qG*5lGg68F=xVyaf&MvWHXF6b8PC`T~(3}&>!xkW^v z9m7w;)6=OCSuNz5pW?S@6I!k{r`WqHeACPB6_@ zI<^i6AVzn7znL^OQs_XfTQH*m5N3GOm~BrF^#wHmDR`iQx0Pj|r>k$?#t1vbTS2X$ z)mVwR7-nl4HLb1P-Dr#p&o=3}`*pzBpZ*w zK>qS_Sh>Nr=j@|KR)?L%CVD^RW8qq6I8hm~I{JZMe#>s9wO?#WUbQnZWs79}WJn|WAb(X@mUMOZrm1ML<)>a{I%;#1 zW|4+_jg?s?$Ua{%2@L94S-eK*a_k$f7{C;tWQe->J4GhP1C)5HviZ*8VTGBQ;O=fE zfoj#CDm6>ywV9nh&!Lh`0ng{^K5Lmj`Q(%M3c0_pLw9-TxMl7Ry7_Pe%iPQi@5Pe2 z@6W~l`lWS~hAzJ=CZNCt)14$+RB}t8UQSk)X>uRlamDg-33ii5mNc8) z3un`B3Q+z2{hpBLaB09u=Aq)kytM;5GNOI&(7Y~QJM2SYkx`XVYM33VO5HVbiNk9KGGGyw$}a0HstGZ2*jr8smA` z7K79!QI4}~ml09`;MVOC@$2X=C5t7jd4+?Do1qlwt^T<<4$(i8Pw^W1Us zKJrX8agO!`58Bw~bYmd~E-vKaBgr6GO4DJr5@NE3c~;!^!EN1)C$VeZQ#2em$sj#KmnqS}ZaHiJ4&vwK)oLN_Ma(e+ zI-|XvxsjJJr(z>`2Isy%7uA+;@K6!rL>zYGm6Fou;!32t@Ovy(27L$3oJP)AoE9@E zG8)q|{qrxSB?5Trc6*c|fgI`QrJp{QBN-JY;<)=qYT> zMR(JzPuNyPzX?AkR&S7Cbx!ZOb0|5O+?Fc>&~MesVN_VP_OV|$n?lq;%d-mGX4EMX zhce}t@wTYTG3|%|qZYfgW-!0BeC4I*0I17E)Mii8EjdRfC6mv79VQVfxOY3P?h6x+ zeMahaU8`J1jR64C3)*c2gjF1XAbpS$&4PHb<$kHu6J!p`?)kYJvsn$|HT@}XI;{n9 zNLRg7Hy1pbtld=aENtJZ!zhu&yph^mS@I(rj%Yq|OeF3#nbu58D*ze?Hu!78&cs;y z(4k~4avr`^ym>+iiP+ByE7-@ydiHKzF!|%fHG~jtVGBvXeeq*< z{PEq;ak@4s?vBf}shIHW$)jJLcF1!HH%!Mf%nSj-5lV?|!}_j^ zkw^nqF%U6GCxh^dq;pr2SNAW+AR&kqA{;yb3R&O8ELpI#dAA}1;)YD4* zFl9v=4vAibJA4NF2B=8Q)l>0<%Nco{x9KkD4BhF-&d%P{(i$57k5KV~lCyvUcJu>1 zS~T_UQhf(VAVpS=<|6_PSI%YT>!5PKear0b6!#nRj^iHF8G8T2!-dF1XK0L$B5PZF z4Z_h9{+{a5J7#9hR9C5dCSw-b!1l7SX--Vg(Ru|P%w9-QjMUcAVPur5Hh*{{Rp-!~ zRAsx)VATBC-uI?X@hcVE3a|-gIjaLjyr&C6BC@YoSRO%TZf}QiuVu?*ydm5Un}?=*KTUC{>&+fD>XxvYA2KUA30}b>(sXFWI1piE#6Z zQ}KQA1#8;l8(P9A9{&=?J$>VLu`8~`e0BB<X{tKbe5c=*PpU~&d{B;$uG2?bVq->=R{nco?d#XRp`q6; zes=$JiynlL0%@=k+PRUqA7ydfU8*m9uX-OtxIKbRyxS>_RdidxvEP)2NT58Y%qOjTor!`pek^z_RXT9s`sTXzrq zSIDF(n{YC!c^+|YTHIh`W22w{ym&!y5D|usJP{Z8@MS8;$Ny5t6FJ!|_0{^_fO8_g zSRmdiAj(NSpb%*&!(=ajm~ z(fTCf)sMNk31iOtjVc|&I{CL35K+BCNYebAw)Tvf=JswOXULbeN~6D`xE9#J|4kGR zs7WP~qD&^M`H{p86Lz-5~qA0PMgUmQuCcu$<=oa}k9}gNbVl*WdG5;j;#R&t5qE|7R~8Z0%@Y z@Gpe)6d2dIAhPfbV>}`vqZ4eVZm(Xw8p#Zxh7P?E5ancJYoB2IkBI$Ii@J2O+M(dh z6?&8JB6Nv#M$ML?lhw|d4LPbYtnKZLor9VAdR0czRzOBEGc!YEH8x6vu7_I^X>loDP%B$o+ion@9Qyu! z!U*->yCj!@yPRkCU;bbP9D+EDA+SPmVou-hN6Gjbq8p3HujK336nm474{g?I|6XFV z85Tg5F=!8@#RwfBc2!gZ-(0#iFF7kac7PfG_?SU2==&nNI`n63LqkCHoIvyM zSLd$Y)?jT!u*P&{H3t!wtMtvKTp16^$HoW%#TJBYWxVXMW(ZI#gL*0aoPkU|xgqgr zMg8<0A^*ybD2AmAB>;Av$U(}~ko}J?;qN6f-;A62>8?*z@oXC^YAGtd)8jWT&QVQD zCdjg@CNEzoDX*vyu|2BYG5b$v#bte!mnR~U$2h-gs^l{c-$*)+S7Rg&CrY1(=#*XydTx>Z>UW+=oqHr9 z-}y z91#;Ua7g#pl*HR;Zdj~OR4CkV2_F7kyAf{z^Y3Fj@ zzb_|>RCR44Rqw511)yQ?-f5&vdW99izqkIIB<%KC=l9u8w>dPIsOVlY;cp|#tP0qZ zs{JCd0r6_9B{kIDd5N^3!#zneYC36yd-v`|5(;FAiZZUXX5;w!#{)nQkT~q>>(ezc zNoGa4Wy0n1i%shl5ywP8Oe1o0b5}=;c%ZA_n?tPXu&YrJZxd~Uwl5*)X=s_vt&?eZ z^d-#{6vks&MI5HT4G!4BWFeW=x&?X?W@3&bzd!8oCDnW{Y_LL z_@DNhY98AggkM?N*>Sb&kttGfpFZV%{P+)OGh5zKm(_K5FAttuT5=1xBNecDq99a5x%g(~|%@ zj9h1H{)^}+?CLCSEljVH&R-dcf{<7XM!BItjn~>VYueoii!&k|(CY#k`~5ZKOQA0kV%$XGeI@6BX|Pt;s}jw;!7XnApwotZgJ=$K1q zzaC6-?o&d-INf?vQxoG-$g5ZVe$;JmsRagyl>f#AyN1tp7N&V17OSSYC47+2toOm? zFdX8wN&a}S9;o#6yG16|CT;SU$A7lH9heySBKI~nC52BwK)`ErOm(4q;q9{qpUrsI zrkxF`)xoBQ)2C10q@zR4rXP_?#%P@=1fU#h$uAm@z2|C(&WDi|k+ifvCIAkmZiw%F z4Hp2`zF9cF#%o}9V17v0)Cciyeq%9b+&l<~J6O;DfdB3(jJ*|f4phJDrsNV4c?Msb zDH3Qt(lQS`$Yx#XI#AE^$W;UWNH1t#ni{;9xU*LS8|SZbn$W`IMt!8&e#Z>R#<7yh z0&4Eh`pIbiz@;Z|7N4ran+K5*Tx9+gr9`ta$hByu~m5< z2m*Prhv+-1Kt)ZhAD743_bFKa{l?#v(`s0p$o4u)djDf;5Yd4z*eV+28X5`0^d+*( zv{~(Q;=xUq&l_`d_cI4Mk$pK{xN)g|S4_1k_l15|E?HSK5Z5DjKmZ4Zg~-DB@5QF2 zVd<c`&)Q{c-}rHvKk*9nH^5nt^IPe|LHdRhuquCnmxDplspIi?qvUq zzOx4A!6_}!dO((wQ{j(`jH(f=&*bG-w-lH?DyQmT`tON{tGE(SkKWm&z9X(NPda1{ z)W{+M`}34%cIERkMp%m?tB7s7jv6h^tXy~RKAP)@9Nig^Er8zOSlwu_Rir#M0{R<( z4ns{nUe2b>7+|WKuLD)@hd=RANy=JE_0uadu9AeULpcz_J~L+`3F?rl(jOF8{>-tJ z#zaW@f_|Y1YNpA*;EBN}mizbdUp)pu0}QR7ySbiTd_1qI(dT0)QDh{OOnzslB6J9Z zzOZESK|)#_tgI8$r;6D9>A=uJYjm`TTpg=I=Ia-*Lm&`7f6|o+CsFk9MK&%rwrAm3 zlQmyBL8fAN@H}%jNJN7oFh|T1%(}`5DB5?Nt2ciX_d&>k{lpebt!7%ufk}`*A-bWV z!7N}wH==f7@j6E8&x{`#x_4jZg{6*eO}f;iRbf_ylGNbq;lXRTFv>8mwcOub5R50Egp8q9c#I2DMQDk!|-*h zZ+v2~uJY_iwxH0TaqX6a8xXP%`SBSqLALfmSqTZlal%G6NI7nS?4dt(L24T-G%c87 zSM#i_F&sFilimJd6&4W@2V@mJRV(=@{;j6JnKPC~E;~%qPW@xC<>SYX9mgtBmR43( zu2@-xyoI%-)sf=NGv}$rUuEy0uG3_L=;g3foT3C-=L-F6MEc<{(bm6tt2ORt(!@8$ z|NNc(ztFr^`2Xc+l>qHNk!!n2qr1@iZ-hMPVbKK*s@bMb5)<9VWs*cZs#&`LMl~E> z1VU~a+MrWEY0ONwX5t1&j@*+t=coEn#t2J>l58+tqbZpwHhnA0&~$fMk- zsD5G5m=QfaJw1whBMYka*myp3tw}cVc71c#??X1Ou$=*9ir{hS^ZUY<`--_A{(8;} ziA3dqmxYDA&ij@r{+RCyB;ww9Zdy=bnN>%RlPIpQX67TtC4m({UiooCy%I!bd<$(_4C}$c0c=mkqjEKqy3%W^g#KY*R(FDcK*4CfWEBo@ zXda%wzP)GhnhqEsNe1qJ{G18vYQxA?EcM2+;#=H4PS$MR1tj4W^TJ_$bNJ6%b{1*S zBS~NI?p+u_!%?!NH7iC*&(h9=PoJRN%qC_5d&g{Z4n36j?-%5G6^s#WdTdW>j(0!r z)7-wDH;1+wMOo3Zr6>*sY?h2P2L&*WS2_%q8XDdeuiJ~D8aWU;7(3E<#uRv_!U8I5d|S;rTV#KfR68h+T%b1!CdSLLxyP4 z6ql5gF+;OKE)yoeam(0sd9#I(HaOPTXZmo?RUf2UfD_U|cwQbaGG>K>D5i^*6N*hb!N*9c$cn=Z?;&Vd2-0ok3;D(o=`HC9kNRfAR?4W(`< zR7=M?7MKK2R^Yo|zapg^D~*c6)Zgi6zKIykdv0~5$>AlK%j!5Roo?6;1a=--SvAm% zXb5)ZTxQu13SfDJ0>g@1VNp>rgZ3k}We@YO>*|&?ZI!Dm!Z)$@f;1P$s8TkMk6~+{ zF0OjXF&h@?oiGJb?5feMy2UpQonGQsd&1{8H%kDJLCHthV*=D~faWQabz)HN>Ie!@ zhmN?JfDL_1%U8hUMZCH%XXoTNE)_EZReh{Novbb^E32gVPXFy*%1E8IK1S9dSuI%{ zbR}Kj^Zi8!)dJU@ycdvQ9w?V7PwjK|^PlaTUDae)zgG#Eo`ZftKY#z#&?WQeF6$v> z0m!B}#Jl&bjjio+yrvk}V)a9#GIvy9V4$$${HN7RRltha7XR^1|Ixt#z(+VUkb*Sb+XJ{39#MyGRnO&+wXrkjPHz3aI-s1rt?3 zwb;VyFv4eLEtt65@mb&N@S7Vwvyjm($jv0F{t0Kli#e#CB*s(e9eN;4_JZU^}XaG$D?65`iFsJBT>3S}~?qY$5@AgICts!bPkWbs`ucT7W2RdyCb| z!Wg>>3}s1Kc^+l~br)BRV}pWtr@6hgHCQnqlMVIhu%CW?w2(X3(V>XQQAcuR4(4q= z%=B7{ovQMjm;xI#gr^+;6Et5IC@1y;CQk$g8E!o#ck}i?d0@W*F@?=~mH5cE!q7Mv zvvT33toaT~{xUPF-fK0kmYke?hf&6VKG`|)j?Ax5rX%?_FsPP+0VQY=eW<|T>goy| z>L4G=w~)(}Q>45!d-vZ1U+60l<26C(6d8F=`9rKV7|^fjbvT?8N! zM8FFfQlll~8Yl-;WT^wTxoIg`RoHH$31rwh@F1vs-F)u5cQpY0$3`qva);;cY;A$A zFbPt*O~u^6a!JdvR!hZN3w(PXijjdONmg!V)e#_BA3th9wJaW4M0+EH_stNXxvLmF zgYJcbyHJoojKR7>j%uOY7npJfKCSIbv#_uL2;)UCB`6|#7mt|d=tUgk_mBVZJgsq= zfFgz(wLFh_bA>U3AnS{ED|}EX?mk~S_o>}7dekxQZLS?^^g0vMJ({z6p0EoO}Ry|0wR=hJf8mID;pd4K)L}{8M^HC>wT60>%a7WfkNUrgSxtd3Lkg%OB|r6yAK6%FMCGd zLN#b~qv|0MK{7-`d)0IYqk^Nbsru`l3v;jUDi3DAumN^)-m3^HgOF64?;X zAE2BTyjSKq`Jo1(sHCD{ub2n;xVYrx7CLzE>-S1(vKiF+O(oj7YF$pEu%VQPkuVkZ zVVg@g{ysR2D@LZYpN)q{84yHTAT$7-n-{+voU+*OrwFV7H&znO>U?~lkl1G%!N8E| z?L37$me}FBi$PmYKnN7-PBme3;C=lN+^?=u}n3&j*nuNhsYBp$;?Dp%)D(8~-HCR-t zOtF65s{xIxat++{tBiXrslQyrSh&+gxLHW>c9v-C`jBKwXwQy#4bj z()pF<32IJpPDOzh;%C+s67`HGuxhW>AJ1;MwrJ}ib-}{_q}fgwcE)ZYn~&T>PM_&< z82Z))NQ)RiScTJ-?*|pGc^gN=1&ogBuQExd19x;JRwi;Y-*F$qt$R1<6`HVv5C?LX zCc#A}E;g2vrq@jSORAN8rsfH5oUFp74x$e>Hd~nBzpmNX*yNi|?Ij8N)jL&xC6bFu ze&aLb&f|yGA$jiEimEAsa)1HR_x6srN-L@e67`;7Oj}ndfaoY5{G*yCs%_ff33R8a zs^z|MHfV`}|1;wnQoiG8J`Oyl{rA?46WSl3uSHAPN!u>aTtxrW3Rtej4Y0=U|LPyJgyu?|!WnYrYenwnnQ8p{DF0*OSv3h9xGzh(wr?8xfu z1Z*=~Hvm#zj^l&74njcuv-8KTKeKD%=Pi77{ra!)EA;^I-n@A;u)isz-v=K0MD9r( z63J761bz8}A`ZW-f$*$~;_r|8m5|PW&_$rakglNwuZ`{OCZ-QP%XdNtFXe4~V?%>M6cmKYuLz?j083 zYS&U4$r_XB&3~*o&oyYpOt9Ujil%aRcZD}N)m(JQ&$%Nhyk>GnhjNB zt0fzFQ5JhsYXOU#-1%W23&_8@9s_{+M#^tksw zf4%?zpDF*}T>~Mh1`1HngT6n&f*vaZNCfn>R*`S^!uij3ZaIEWZ~hFE=aG>y4IqHx z3*tHkXsHxark5}kYwN7ZN|#LeD-7HqjskULbTLf~XRQ=gp?u~=#Lvz96vdqyD9cz3 z-5GGHvKTdU25^opiwE{=`)))lf{R`3=~?=bY!5q`7i1H^fB@QnMqYFL&o zlv2dTZOwH!e68JDa`yT4?IOOeEX_&OIB|q>c2Zlmwox{a90US*N(CmhDL}+=x5!41 z_9cuO&V1^HmreEgvBS;gTpQ*1e7Uz*?Oy9sXy|e4=4ZKCbx6)I%lPX&yy2>k+*|jQ zOPe7AiY?OP%a<=nUIY~mU8-552M7I9jOMqTMUkogL>5hc^+3@x!*4C^8 zDv4ibHVH;OVvau^P-oIaA0`gkv(`Slgd3RSP@8Rwl4WIQe{+eJ|A8~nvw5a&*gtUX z(?h?TsCUzwBh2p=AAf{hEIb?Y-eal%;U<3EVWjfneP(8_sf)bS)YROu0_tFrZl0cJ zTQQiF?_)n##oVdf|yyF zI^J=#d^)i7$-y?SY2_!gCg#2}-)F33N2cq6J%Y|gHDy4?CHY@fU}d4s|JB@HRMN)( z*2a*Z9ZxO)QqZRR1#38j|Jl=H9ZP@n)bE1jsN zui0BR7DB_kHLj;}{-B7Jjcvi=5zBU~7MzuZvNb5C_4>5~fe-TcH%rVykVuBCjl=J* ztrXX9+}M#6zE(GYIf~VG71-qMsS}qnHaD;LAPrKh9OV5Hun- zJ@cEj3VBz1J$n54`_417a9Vx?b6PGf)*kl_rj4<2yZ+R^t=gyaUowvspHiJ>D}6fu zuZYjy9d4aGikIz{&-Xj8(SLZaSS;bO_W@tk(gKfPm^Q%_mJFmp(&pUWcZMjCqTk&- zt7HKN2Y~E7Xdl1ua(>>rLp`|_5U_vmIzNsLu4pda{VtcdA*Eel%eS_^eh-i8sc$lT z>i+8goV6OcnY27pg~Ttd2-%jpl8>b$pih~kTgb;!;8iio){c%h&>QSIQZB;uevU(| zxPgGZwJ!YaXY*gu|IB`>@#>?etYTG{FaF%p%q)bEH@}kew5q6d^Yyy6lL3dV*G%%} zf5yo|jTnWE3wrO`QvgGIm1fRW?K1TSS-^m)_sV{{b$zV-5-neEo8q(i;9M~9w$z_x z8OjJc^n@gEnz3LU3wuBH*@C~aDij*GM9wbup-k!oDXL(jIo?H+blpvdGXW-4mwG}j zJez-a*- z|4)BFP(9r!%1>~uQVsw9hs{9q??CPq& z`mg$lCi)so0SqLiDB^kW4_FTJe6q`Yc47tShCDmFI$E%H;4LQQ6BIGwRBz`jEp&vP^hrqz-~_U#21pzsQen&YE+WFFYbbOg)u&-D z6Nz^AnM;X-iTkhl*bewD6t7~Z5&TyY-!pE~k>}cM z^ewH>7e+?`+NH9r-u8=2NZg>M4KFC*!8G7Mt0a~m9qmK~?rxnQ+i@H%R7HxeKS)#w z+*-)JBSUfOW8>}iJu!D5Ov#IgIp{HS#hXk^Df0Xi0FqZoZbyOztH_!allHS z^7S9O87y9!))9fUgev_a;bEK`#>pQ)jvbK*ezG&Wr$F4P8k;DSqg_2a`txi1rNY2~ z1Ji-(u+H^{ItaJX$XmAX_~CpThUUrUIFO82MhmE2TwK;>nqp+I8|)GiHW`lZud}US zeeQxBxOT9|0N$`_ORgjLuG-)OOv|mgB)yhjfe>$8bBUps1~{ zA1s1VcgORgyJ9$eUGY-DE^u{>Ql1$gGMO~_$LVessfhI}YG=Fao-8dfV$)-9Epci! ziYX{dAUOE=TYI~p`#1Y|e&g3&*5$>?)R%cx(N|6PS8_vMpRHN^)&)6Oo}+#r9^P*8 zAcuju4&1QWQ~~6RP68H=9+#>y*00E|(p|~u4m`w&IbqBCCZi4x&wsD-@R^>*Ow>CI zL5@lX{ME+!W%4we&Y3%7y{XB{?>bK&#(s-|;sd?Jn+=SAxyO<>|6B8O>A+}4ifO(b zv<&R5*dc2JB|ZQK@Q;M}-+|}pQ>!sC-QBqe=dXhL~lXpWWYIW4n z09SJGf-gzrQuVP3M;_CS4oGN00fX18)d#q^@j|qjpMz*0^8DQLtYX>>$$qGo?%z|{ z!|kvKw@b@Zp&uuHOj-!v<^_LxwwSI`5$(CEECFy_j@`z&WVZn%zSEjtwgQc z(LWYH7zKH}q-I)Vv(%re4upMxxGhII9|HV4;Llrtg#l<{hTJ(9SD@40(}T3jRbk`I zb9p1KbUr@gF-d-RZHtqipMPS^uRz=!+3*r@D_YYvXQO04PiRLU^>%dJ;^44z9H;sm zShxMuFAd}xaY{|9?- z6;;*R#*Z#QMU)Ux5D*YhkWL9Hx6-Mg0@4jq(j7{vl!SDMlt_1Xw{$PMyBp54+~4<& zGsd|+b&z+$dB-}i}MJa1BZxoYVS|K+$fKR-XO(?N&np%@pJQT+=Ht~3Hq zrYOw5BnuAl^=uOE_jRAA6LX7;Qy~!XKiMW0kG&&KN`cnlsK;#jVoZng-o2-~R}#ep zv`m}pCp_LVsm#u;HRL2v8}*ejB_X|eP6r%b|9*Yde6vnEYRk`tr5YJ{ka(ErLZ@1C z{rnWKE$F;d_=@0}AvI!umHUb&AiaC5e7B@5*>OlY7xsq;5if_!Spn67{6p?8Sb3`O zGzS||@8hq%rBjbs`cp+YIwQqs`{`BP*V%wn!0 zl!^~9%52taXCB?WZrT?BD%%qr`#bW7BRh0&8QTxIU2_8P1jnDn{&3`fV#JO_B4MB3 z1<~rDxl+3ig=s@yU&vkathNsu5E7KO2iZ}NngRK)X(Zp^*XuM%Z_CZ9L$2sz=YM8J zW$d-ruDq?PjA2r#PO?fh+gqN%OYHd!xw!EC;6mlV=GMq!ywYI=D~bQI{u_~pi?1JR z1WmsXn_k$EE&M$oAuX-DTGSazzuerV#%FIlZ`q+wkZ;hLsMpSAaxzCvp7n}=kB`q- zW1v)l`{ZC5&)rulfzd5{^~yj!RCkZ02)D*ItJ$qvu74$@i_$ZZ^K*)U;I6Nd>Qmm# zG<#oghb>FB^m%yK#8O|m8?$Q}l_f0+m!WX|HGhP-tgQZaaOePDri$0h%1YC$jyD0J z?H3yVXg2-55T2(`wG9lQxq32uRQr_6HHRG5{M+jCxF-Loyv4BzguSD~_Kcrmsr53I zLY&hL`AhMN*bBqX(L=+*f~!y_=Vmpv0862Rb+f#ogqB9W-1epSEEgBo9j2A~1F|uD ztK-}63Qb->Ovr2|xIIJ6Z;c@I^_p)-rT|QBGIH|B;~Gw_E<2m`(KE!`iqfxtxYl_r zW_SScpY9e4++N$2OKmtodY7NEJfMm!g)j$?8K$mWuZiR^;IUqM;8ZmsldE0D_%6qf zWPoC!K9IY&%tqz;Sb^T<#ioUg&Ae}C{68x{KjpM*bvRqlfBcxdd~PVTwzkGGfqCqK zHmHpDKYn|x`-PeU3v_p8n)`zoDSQe<3$mX-_;*2mi6U37_6-f7sRS5c+&L_fJn zLrEFOpqPdDFe}=Wd_ooM=6t#iloLM%XwI7goxT$Hsn7HX3j9({yMcwZ?dhe4K2=`n zbdTdi;$0zjA@WoH?CLtAp}E;=fAq~e?}8$loVGAJ%$k)a=^4fI6Gm><3`V(LYPj`- zgUt2YfUyAK5*9|8X*5{C3ymV5FJWgfd7y7#u`E)p+LbK)xfkN`n>IXHiCh_{_vD+s z-_R>UT76ma0pHg7{Cgp8{>WMUEKyJfFE6i-`Q|hGm6F947NOmvmRx?p_Zj<}PoTAg z8A@&Q?OFwfo+v~AZ4|QLoNqux6Y>Q*xD;78=K32+7w6aHtDHsRTrP}c zW1qJEE*^Rp2tuZrg%w*xwpd;#5_j!J=S;WIg@U6ad&Jwy@?ZtG*t{yYi?dQyBMspx zAB{q6T3J+FY;fYYm{VAo z2)w+fXF=US=l9a=&Ni;5wUrL$uFLaHejNGmQ(y6maA|hfT^t6o`8KQJ{9J~Q&CE7p zcpPG)o*3(}-h)t(0x=erDjQo502+4UWYxl=DG$@tZr+_SITIpH6%(0w0Js&_Y`k_$ z&OZ$e!k3E|OVvOn7)*EXy=>q!3HhoL1m45mM(Z17?_7v z%e^Ar*s`S*C(#1stoN`B%tpMS2z*r}t?aljUCPAD`ruani1h2%cM?oTr)Oq9d4K|G z()AEWP_WUExR-1(sFF>VIB zbjUhiATVVx(0JpKeaX!1Wa_>f6!Rv*`6`0hOD)Oy_{Qt3*TkgJq5PLn>A{`0ckWl> z9~ZceV`?D4Qa-r~ijG{9R!NwHr?kHz34$jJ3)@mX#*u+YwHT;zCB9hADFFdtH1U)Z zQ;-h7R1u&6urbd~lRR1OE#(`^Qk!q`Uv)0!)zj;b=#i6$oe+1ABM#Oh?)`B&rQt_e zYSm3!3Dn!$bfTB87`gfR#aUJ8Jhp3(A!w7ZZuNF3qFq?I?P&mU_f_O(SWkkB7}W8U zsdATk6STB^VgdJ?`uco(KPE%D!I_Xb_KskeR+c;!Vl>>NFHnEokyI;uL}k~FM3Tde z^DHuIrmj5MI=sAqHZBy?(7}m_hKq~P>SrYAeK4k$A}kF$h%{Vr-BVL(VPr>cVHLN! zMh6TRFqpikG@0DKd(8vQz#vtnDM*dto7(*q3gHd6(y$syl`7mE%^v5Nn3(0BN+O~2 zGwQLbQSjHxD4lOSy@qqYE{IwPW2>v20Zl2-kawbNzd={BhSrAQkW9l(#9o*OReM}i zcnuER;4VDMKHvy608LKlWA#takPy5sm-SZa1Esas)>gZ8%oe9W*eZ{_EOFtDsK(%!em!1& zLHqNk*;f6>b53)@j<56STOST{;=(63_r3jBOFm4yRh-Q*B2@};eII=RaqT#J*Wdk0 z%AJ*e>9c8sxk(9()5@N4fbXR4Lwpa%_Yw&LO~A?(TQ3LsJoFy+2uE5zA|(k)Ycu4|UpBz)509 zS*xy@&L6A3W4Cjgua!>K$zq3M!#Nu|z!c`t+n9tKQKt#9s8mJt8C+rW-xD;sL!+=zO#P)LR$?^}^=qL{oIMnB)v0U99h@ZUbdt0in#XdCKJ@CNmw8eGeZ#+-lDj%UG-^+>t>wV50-1%LBWwz~DGq)>vCTF;1pC zgsDs9gMupJQBcJgh5sCI_*tq@Xnb}1l%iV4 zz(DNf`cuDq7d(MD%i(&@(+q=tLU=Ja#@vd13^i;}kYa&Dxwzo$%1YR>P8=zhVS}8| zrLbk57uIatPm>W#Y?5&nwa5(DY_j|JbBgU+3Xm$Tzq>MK9@=bvozs<~X?4M;6VD^1 z2pSbqExm0aHXB^N9C&dPt}Z-WG0d$*zp=I!jaDpGy4fKvF3zsf4gmhr4A2-TRy0Fi zXE)ejAP%_8topEBkdbd>A8o|{BgC-r>Kz$$hHOT)3Up{l;6u`>S6qSpX3&-|H*cdv z72ItP-gF2Uu)MxSM2JtD5C-tZgj6`}73tHybXb9p5#cb8k=9rk6 z7!DOt10ia1dBSi}Vl?{?eo!>9M5!Ciil1fTof{w>I*F}JwQe^Kv6=C5G zud{=Ra9S)z6&1d(ceWE=QY!vTH2<(ZdKaKLm`rkP```f}rBry#(9y)k3ZSaqk`non z9K4>MSDro^RFE69>oNRuMTF>`Dak1wjLD{RKagnARp zZhI%9+OhJ-M9eX?PftYSntrksef~V>U2(S2K5!+h*zQ$DrSFG>H9BD3t<97oG$=m&3BN|#-AYPqg&kB7$s)I!^GAMIWvJ?fVndVz=oY#LWY zz8+0&Y(%cE8~^E{W-r`3oS=MQ&}es;b`5GLGKGI~hdX^&O9K_{7^+!lI)wxy@Aj z5}icgLCsa^=PG^vS{4u;Ef!Fm{P)&imLC7TgkQfZTrzS{n@-%UrSnQy(=c2G#W*(> zqnH>i^u(5B#DDJ=KM@5*U}B;|Kyl*VpC>Ba|9e%5J>v56+Opi#e=mO#a6C2=s|#KU z5*^>q;;uo)lP^VAEG_{&7--|e#2=Rl?9u)t*dyh~*j(Y8A(0%;h zUyh@0EB*V=a8cR+?|fmWhJIo8Mg27#U;$sM`=CDqTs!Se{@agfioy?zAOHKycMwrR zn>NrH-nX+m#BK(QOP5N!;-5_8A^tB++&Hc#th)^ik2e!d&{&CjhTS$4R-zV4vi zq4fK0T3wKaYis_|j^wU>=VOHwY%?=r0;j8utJ$5i=L5z&PqFcXoZ7guF-p|>)a^e4 zGOz3w;Oh&}WPXNnxwn*-7BABEd)u1`Zae03+s&CsI)$yht*K5u^PTOKK;>$!7Xiib z1RHxK8$QN_s3n+{rCw6zI6XDx=ixyhnkb|0bH%;&j@FBltx>(-O zBWP)fOiWE#@7?Gc|J4}mIbuRXHN!rXC9+_{SO91Nhl7A0 z`$cd^_|R-3Lck7}!hAF|ef#M6czSbD%vZnjrZ9WzLOmYGzE@g?dcHTF(8;Zf`X{W&;6k zF$BgY8HY1hY@J#8x$H=&s;U}JW|2YjLzE&@7{;Vh#Q1{T$q$@(I_!~0(=}-7u>v=J z8_{cW5?~Y}u2%nSpbCK&Q0h8!pMx0RRYU+Ttp(OH&mt_n-LOvU<#8_{#;)PGGQLpF z*NF8hFDFfvJs0s^=p3oi!OX4{#B)bGKLIEY2hx5Fuaoy;s_gvEeEXnPG`DeA&Bgil z{{DPNBnO~71VtueQCSzjirnL}zNZe~F60)s%59d!CumeB{C+T_HPOWp*ouhr6~>s@ z*pX6W+Q0+HE6~E)uAN1FH?Qv8UmeO^1o}>^Wr}jpvDjt*E--Sl$%^U=EkV@8S-WrJ z#fF&G*iFrsXC9T55&pca`8e1uR3P&hl<2yX7w7%iigL;6M{z_0b>z9_dT9GrzXC+U;pEYbEf}W-eUAa59a0dV0Eabi-|aR>4nOP%xBE zZS({gtNucN{z*B+r{E{t+~$xwbaXUUr86LeWKvoq}eX`=fp@PQQ)9dQ6ou&}T| zliz5$Zb~2t6j^R=ZvQWJk3g`Ka;=ZvCL@!HN4nhObL4~-=^M^0pDcOzw_XVR_U1?!bZ4oE?>%P_T6wzF!b%TQoDUK#kMO0=wDr6O21AgYpK$Z+>Ti{Rq zST|;T<%H@-Mj}f}c>b*{nLw71DpOu$cOVq=xkc?U&uYcx{K@_*qjFiO@lckQv9Xk< z=8t`)J{lRNDr@4gVlz~@{H0iIR%V3?t`<$$f)jgK8qO!gAvCfLLqptZkq|s#QhxDp zl?^E@%^&}qJ1z&Do}A>_Pg9YT@?4i!pR2SKRN%@W1Duz zK8eoMFk9#gx=X0;a;yjTtFVod9>Y1HzK6Fi zo)(!;G>tJJ^IU1NJ0shNdlD)4+xO3(7;~t4RK}8#A~l)|(iHjz#){=AxUwdnf$F69 zd$vj{Gh7~MamYwX0YRF4HYw<$RA!H5jC8^SEby}M`Iu*(#rd_Tb}KRKPoUlyH|OVf zz9GG{qQ9{r0)0itUPP_t5BqI-VNq|QmbroI#^z>=wPEvzv?|xJ8KZ}$=gI(V0i#Vo zt>)A~xCUj32&;a6q_UO1N_z#{rVWJS2rieWvE??&BJH;Taq`N}X2Cewub$X#%}5|X(CQ0{ z6lmg?Ml1Qq_)`4@Fmdi_W?G$v%mU`S!%?u=AEaN)Wah+fSNl_>z@#tATZV*yfY5V~kZ-8}%frci2L~x~n}W-uHgHgUjrX0^BmVGbge3l=%;cDhu#_=b_vTV`fgcdJJxluj?+ z0rxHnYBDww|BBrWda%pv+vjRGf`mxgjsdySuhRQTrJ!W?fRItuuyUV?0i2%8w^?e_ zblN?H$f+Lx!Ud`arBu24Lvlqj73p&N=a&(|4JV=$vBQl5^GV#05$WkVFG`#HYxDD7 zBPI*c0!|t0Yh%@yVQjQCGLJ5-w2MHnKK~&Gx?V*AS7lb{vAZ0;B2-=W906vI)dV92rEHIE5qXyCx8dNr( zknB#~jy}FkFg2Xu3Vk6&Uf0>_54u|f>+y1GZegJwh`S1mhQbJ$UJMsH4Vg9)-MuTa z`%Uv*G0uGEcLvIRwuYoEVepMm^7F?mP}X`DnKyTYt9KL$LLClN;%7gy=Tj zp~Y?>^^_FfTrD>Ir!(qF>4)i0`%y^Ms{4sOEk_o!_fF?RIy7<+?o2Ahy|Y2;kwt~3 zr-}gSg9-=z85;!!zkmR*>&%ty?d|2Zjj?K>zLD59eNWf(_2RJ;Y-lSsFyrC`9mwj` zfWK_Dz8jX9NT8)fwEHk61{BJ2&d&EmdqPTbOGsH#M zY|CxtlR=iN@7`HHPJNRW8k}^)bi&)gYLVT1Lp3gXhcQXE4gGbdyw`-r=3Hm8R3wip zdc6;B{YAg1JCYu8B>qgy+*H2gYI)eoL=~)Xqn}(!G%={sskfWa)5nLyy5WQP zd2b%1a=6A&7R9)o`8Etq_Gr4`6R*Nc9}2@iCHP*IH~ZKhUYXRcijbxwv#Tt#IdYvm zd@Xza$=Q7Wy)hq!>mD0adDVJ;0JG-XF2%cT^S-!-mm<1Pg5WfYVSkZpd}y}H*bZ1_ zYko+ou5vt7HWqy}!((H8C9kN@B#)<;LfIoSloF`iZEQviG@NAtP)>6Fczk?nG1IV~ z?dZ4|YqvCzNJ}W)Kd?iO;g&S%TIe@t}I=lAXN=N2%~t8Cr44W-WQ z+ZQ9@%{^@MQCS+*`!t(ZUzwP2ZfvL*zuLL5TKYrjZcX}g@+`kt@ud5asavXXT1X2o z6M(Do&B;Rdc_KE33s>pbI-*ZWfN)}TGrkJ=Dlxty6)K5#b#)w+Tz5zwmKQQEWWGsAHf3Bks>G0rJ12pj0>{PslIN( z{4U%6Yz+zo)I$rMvC(=0RtB9Z7PC!*PcJ(M2EIcq4~XZnP~2`xrpYsrH=ksXPkM~d z*c^8d+XrgYr&%nZp^0WbtkR8zjah|Dui6_5a;3?9B}VCJ!SjI8Qpa@?lvpNND!d8V z6+qY-mC8soS+>vBb^^P zJl$3&!sZ?wu{7m;8mJ$?fXG#4(tI=t3x>(iBB1aAnTN9Cx6<-*2>QBA#_W+0rlIBo z{P2D3(fOfzi5)!~8-7TuCx}zPN;OD(a`&*a^gIDJBPc%;)7}=+U-S4FTh5MT3Lasq zp`yB~{836X+4Qk;N3)NdAhN;z;@rV*-w8;P)$l(kDWKUh2lu1jP&r7?Hu-;nzy&_E zZkFnc=gqiek!O2-gL$y;p>CZ9NvbNLoY*mo*|_*IJA>NOZ*U;an!Hs}n@%v{+oTEdYkl~I%)nEBJ^HmF7q%C+7sQ$CP0U zydsi0mM`C8!ja2m2kSe7Vv6j`KLRB?8SA5kz5!%U5x@zg_mc5l9!^5(u(LKtw{~=5 z44UN^0Zq_vklq+4S2AMu^2%KtGlyP4r){nkaRy@_5uv!)x|@einU|{NuKpYb-3X=X zA6#Z}URkdU2SG>b9dOUA zvT+OOLCB#P07N9?|>*LjbU59a1VC0_YHDj#I8eo+U!I`sYk1-$(In$8=K zRJ7B_cn2o9ut4&W`#5p@30Zl~KtI+qcoba2S_$a)07*kDNSida(P6 z@sK80G{k%i7lq=hrLm423?T>VJDnk;t%DvT>WQCQDqsJ2t9d>KNi*qHJyU_vKvbht z*oU(QEGTb9K;?{zXK-i&FA}LP;f(8=f}_@!~?*0yfQX;`hE!+k6#-Nw(@DLwv=lApEVFoNB#~AonsXXTM~kgLlu&@7>Oa78u1zh*yP^M3 z?o07h!<~(Nlg@71t;=P#xAcl$F-uxi^}dfQf9U!Xy(i@%6R4mMz$XiYsYEl66J_#v zZZ|;~t4Yhs`mH^jg@Aw{B%#BKg+H*zFv%p6J%-~7}@lCg9`Y+UY7=72JDcyv@>eC1nNXVX%y4m89K*{{>2XV)gU&-g%4i)7BW~*N;%KOC}rFC^IRx;KKkk;2W67r_9kEmP||GG<#(g8 zn#^5yJw4}!8@@D_ikD#e919Q6VCx$t0yMyJYUOsQ#&A(K7G`dd2%U!pk8d-~W7Z^4 z;N_lW-W?tu{*!LN0_~IKjBXoIceTNT3?W*Bn7hYzYrwa|tRM(x*Ufr9sS7yalM+QQ zON&JTz=mo$BZifrr~nB8s^o0~4KaZd1WIg*C&8rLW-k+-Uj-eFM@S;I)TC+?Pki-=f($LVoF#W60bmf2w7k6B+#5q!+Jba}dsSnVd1m^YB$@eqM)5Z7-)^BW3OmK>=HTS0Sb*s`XWPH~!dN_paI{_1iFU-28|5JQRpVst%mXB6WzbfW%;pqjx z>seeQSUww@DO?+1h?G)+J&bn8WV7DVM1XK)pQ&5uF#B|u!|MFRW;H~P-HL@k(WqD7 zPCOR>_nZ6$CIe4^=&$Hk@N|}aui=oBp#&*}m+vH^Cgv&K-eB8&L-S<0PupCI=@?hO z)!`5iA8+69H;?yM1`R*}d5@FlRDv())56|zpJ#!Y$X}Nc-)B%HiY}pc5jusajsuaQt)98WmfZ!$GdERPZ_+yf!~VdMlR$kM_a>T z1!y79PCExy2j5$g-*!n~ePv2&AZ}vr!5cm=962luM1UH~I5& z)Vqil6d(+WRQArV+n7R=B~L6?`X!>cZ!T=V(vcAVOiRNRR+O-gh5fj5SAlkRZLK3l zIU5zZZk7v|7m*nvGp=G>+i&F(gb34G9a_@{0vtAzk)kKr^)2{O_#mopb?^;moCB%z z^zw4!_{c8kS^P)@VxXuK^}jCz6)Z^E9?{c(1>F&Vi;V=cO^B^M1%<~NS^Qo%N^g_J z<})Pw67DAerCm~T=cjVW0!o1h*d36|+lP2ld&|{;>RbVZePG~ysojOzqoX_2jBB@X zR=6KNeHxWekEz8Ky)?E`aiE@A4L=AW^kv<=e8_)$f^awXscn-cE35H= z)Y;A|K1$YCU4`*jrRYAb9C8e&5VcC}{-tf?YhrjJEq!}I8U$>hzr5iCdzl`;4x#pSc@e>2u*muP@l5Nsoicj>xfYe05EL0GT z8o8l>^ROFE-J)0g{i(bh6Vdqf7;c2Wj}I*-?nbkTti!jiT%G2nVajB6n4$o98Nf0+ zC;j0Wn`og7DghL3PlZzh)FRJ1c2U<}bu^;@Vo^@9Y!s<(8TK!^b@<(loK@|oFctz3 z&rB?G`S@!Q1kqBLV<4M0fPtg%QR?cLllj7IeWw6@I$qtQ177ZfogHS)&=8UPO`?l% zqe|FrXn?9Fiw98+9@897U)Je5?ytyz((>1ve6H!~a0kmXLttPnx4xoo zTjj0_DW2?i}_ z?@x#8Dn+i5IztRlbMlH|F~Z^uI(=ZNO$$N6^sJ zG^cD5&fy|jE-*a-=deaTe5&Q!D65`?yU_GIsee`p(ye)KL|E)F_Y|H^i1)}0?MH)C=XfE+}n*HjvB`%4jqqpyCX@&pNsHRlV zh>*yP`p5aG=NeE@%4H^Ov~sZzN<^g8W43SHW#Dhfn$SQw0`8aVqc*WJiUiLmem7p( z_T6~vbkoNw4-0kwoEr@b60{r39LPkU;^GE??*KNp>)4`dh5grb#rg~(Fzwd1r(dU) zJ+tVZfw2!XG&E1^k*`I3?=|p@lJtiPRwE1HdRO z!3^M~ASw}#wd(J&PHeWF{@dAqiQ@RVro&(}$~$lo4v2>j8$!O_iXYO_y+!QssP8b| zVSyJmUEXQ58mxlE_utw z@FQM}8L;J{R*3N56@uStmm=#F&?+Y+71AWbMq9mKfA!e z38~fc$T|LhTt&nI#sBjaaS>5f7Q)%LtncUUl^w2y4uQ@@9QW0~LXsVjRgp?NY%Evc z&Q{s3WGlecVBESr{*@s}@#uJw0<8o*o<)o5xYZpa9HR=-uy^G?N@!N{?7jhF$U&#p zc<>MvmwX8+`8gbB1dLPVlj*HjM={)l+*}3E2w+M@r=^io6wv)kpfAH4`qdhlZ*a6# zk8}TY_c0}-4N;m-1qhEj&+H=W1n$9l)0SoP&@%g9GvCAtP z!wDRqL$UxX&tS9oB+N7+=}EP7)9-ZPoe)j2(y#0SPgI`OP(ZmEyalb}fqf{r9O|odNxp109utONZU5Et%0|7Il%W?R~gpU&3lFfz7v< z6JJjWQx&_BN0?XGm(wgFU>uHREIgM;i81TSA5y2dvN~MRxw)lo@n~~POA$kqbH81{ zab-TKj)>wkYf4j~Ro))V!=6X^S-zA1?kJvgK?$@oNS7zi9=Jni-;?%&2#WY&lof^I zg6@R?1}65xTq}Wdu^nDkR+b+LoA*`U1+Xc>gYSe5JqNOP#H~B8!(nojHhUyM%}&c^ zI%~rTH$m?IVS45&=;itAFN_fN-T^2xbm8XY`H?axBYe;~(CHM)uz{&g(DHB#<2^ma zyfsB(-#z-l#zya?pUA?>X7<#@$*4aEi=bJ^rhQkxl0AI1@YC?_I``4(RiJ$Pz&zq; zL8#XrI$KkFUQ%8P=8tx0CJ?L}U%psx^!wNQxHXw@v7Kzwf-z;taRc%(*eo7=J-IX6 zArLi9|LW%*5#N(7s7jZShr7F}pqM*M!f}TrzC2inS$%PE6D#FPoU=AMjE@#I;^ zr55v}0jO8#l3x@ClPve=G9W;ftT*LeD=Z=cP@n}2HZgOFImo;y9{^(x>2CPTY;}w* zVb74zQ2XvI1&Hw+AdPznPNk=Q<@#Kya@Y+`qB=SXnhQdk5$WleU%rsgj(7Y&Y#N9s z6j^X?MeVn!BPY`?($`t?cUf4><6_yr|M=mD$M)-G6%|xuIH(Hd%GCi>=0rH|JBNO~ zOOO61#YQDAiicPZPmUhIuG0KPmDLEyfS?ToOjZT8ETG_P{nJ$dLRovhX2n?oFq&4ow{O<| zH1;ll68@I+^tz;S(7;2f38}IkVZtd*-)R_FJ zOpXV6Wi7%&I{xG~%#!@r-^msq$LV$Zk>tB}0XBX9fpnpm>9cR&F7xdsdtSZ1B!vP# zE$N%6_;abpFw9LY>5xX`+4V|sf|pTLUtQN9JpQpma5qiz)h##|>zVMg-+QvR#VK6~ zg3r%`a&EuCiui`(puT9|0rM7iBb8;@PuF7kxAOEx3AUb(ka%GT zL;kVm2Kaa!y;5Z4nf+jpinz8m6#=dPd}pyfO1r$06xWPdX%4$%2GosvYXe@&`3CRE z>p}Vy{C#Fthy71m**RZL8I0f3&nFgZ<{x>h@D^-YG?cX`G-chgGz$C}7^iGnGdDfG zyyUCZ>#a>;4xK+3zIGSgS{fvDjxBaYcbpdGhBk&KZJ|){1qu=d$3wH(lk*R?cx9s2 zVpiztgn`q+^wD;rUo>k}?Th$k@S6Z~2Q}<-Fs>+{%->F_;14R@MJ9fjrn={U>6{eF zqjh7xEo{-vynA{$ms;7;40KJ~ZLiQ!gD#-*nQg>U*eG)y?N_wVGIxuKiG^W=xVwu? z;C`4|TayNp3IK2zQ>9hsbg$0RtjAc6tL2tQ(tYP`rk{J25<6U;UUtXu$_#CgG0HX2 z9lxgQ(C0AdimB_)M!4%Sf4oW51%VDEL)Q@kPByvNAqRVVbxlo8J3d7=t3?sg+ni?O zes+_`-`*9j@b~hTlje_fe8f0KMO2vjv^+?}^v;ia(%y$;z<7Fkxpk^WYtONW#lj*N zgwBy!YL3rVOr3B@IA<0*KU=$~RypHSP-wJ;(n+ONlPE!Q z{x`y8;sC@&_#i5PPt&}kXMCjH$_`cl98#`?cLOVky^a0*?ctePd%rB`&L`ML)8BTE zdU_+L4qcq`wlW|`+qS&YsR8kZ((XEane~P!*kO7ztZX`^U>p_d7csnb^?*V}>T;75 z%vud6IL6D!b>%p-3v8J3;~5ypLgBX4<8t^WRaO9Ok-$Z5P8LtZ@(Wa=+72hTN&i;e zy2eM39+z4%r@(BKAX>Rmb0(Z?7~qpaacpYU8&_)TCkQYx#bS2mCgL(!JLQgV$KJdI+q1em?U_r^L zZ%%=N1W+?#zj~!5EaEl2vJyFw%wI4!_b^Lcz-7n=K$B$Y$glQJr;6LMQnRx-opH?DTRqi2Hr4nj#@C$;~-p59Bv{2+wuep zhxM)j^jM2$$5x!iC!E~{h9Z`hJ1(>gEU#whnkrd?Cd%FB!^y_jUn|D(%T}Bo_>B8i zwDN6MUDb>{t!o__>FqM)433DfmGz74(~yc}(Hwo)o)i%ffP0_UF#i(13kA zkzC6Mq_=O^jcry$ZdBV%I;~diL)pv<&*u-aiH{!Juc*%s^wnc2h7; ztY!Ze0>-0*tFpKN^`DsZv5kW&2m2&vLwl|9>kC~@@eaE}HTCtgA9pQaJL`HI4|OfH zloGvo&WzlB`xNf`Kzevf{3MavrFLLtQOCkkgimjBJJ>=>?YB*A!$YWTR!2Po7u~)_ zNApQtY$`xk!bClPxnA?}9LNic8R52;vk+RjsYOM1q06)S-i4F>TlAsX?jDr_l(qk0 zFL8fEcfHE%JjW6o9Bep{hXbB`1UA-v@61epy)nFns`fA@q297LD)euEh0ZrKQ&9!V z1>DR*s7DLH?!hGCGSOAGT|0UuUa7anrAR~ssR40x;j@2-ZblA@T%ekj%C=^?AnvI< z+28`YIuncO`K%Z~MqvLjOicV>I>2b}A&@W#)SXR|{bZ!0Q@`K;(z~BG38nC7$WI}- zecMFYb-A~Zld`=t8oy+rGumwO%NMM*%iTchOESToA&gaI{vkI^Q3j=1WuKouj25Rd zSLbeDr4l(q1ONa0O!Cd~3WpHNk0`;H?tavFyY+JW?b~bTF2(Z_pR}|RK+bve@yU~4 zli!e)CwcGpcR1yA{XSoBJ`E^EmGB>1_qx6IE0M*MZj&Kpg7cG&$x=jUTYDW2lir|+ z?Xp^Zi=HY+@qm5jLXNYDu-NR;hwT}Qy1ETFQZ-@Wdy8GMb*-&X#?Z^>{1DpM;9WFN zhn-(h>4J6r@ju%$$>QRmuRQX|j*YXoD;K;t%;U^fa8<9;CI)l-^!^ZX&i7F}IId=9 zy>>Utd?~oirOz*E5M1WR`0g^%t~mvf=S}H=NU_2kJwlcfAS@<$oi-RD5p|p{x$G<+ zYJrcXBkqY0X#)4>uU{ptOfOr19;;T`ey0mbT_~fK`udr_)v}+-vskUl`HPIu#WToI zjB;PGaB-<-^sl@?_t`#)QReUa`N-DxU~RaR%w5CQL}&O<&>cpl&)wmSRmRm&)kDZU zh4NviEyF0Rbq1c=W7xeb1Ew{>m#3T)wpK`cQad|5nu;TIEG#UL;CxseWCB+TfPcwv z+6T|Jo7LNsmLYiKJj*sXm9KVvf!ZG6KLa)EGt0clhK4Jy$P`(`?}|2iuHF#W>^?^J8k-n{QRRs#|rn zVF)G)BZRLWT5IN zphU7f-kF^1T=nwx#l*#x<>8sDH7sbY8B}JWq$Cfa3phG5tgFk?vu{v>ejS>`ln>Jg z(1d>gIqfSeokz5^K@kxx-x-L$e7@ekVVO6vo<_aFdFrp&R}sf!lrg_3N7%I((*KQ~ znK_J2M{H_p%Du7@mUwR10%6CcMW&aLrekhJ1*8J{!!P0>e&^cq($q-G%AT%wr^YiS$;LXC@LX~P z&HZeo;D9l(f>Ebfpe>6pHp}JjY%t-nf@5P*2rb;maT^LK_bKJ#_~%+fd|0ZL%#^Fl z&h6YI!@3J(i8Sxht;yy7q}ye5*+L5KzE`WT|7bxV%3+7Z^rJYWqHxVYKR7hmUAAS36tZ!@#_^tt$`m6g>_rw7Jk6r)YzE!p$AhoqmO*0o4X0q0bIo-<7G->PrIfx|>R0Y82BKB`)inSaXV zRC{@m@nR2#lan-ySqV|n(+A55sT{Q!$U#B-N<`FqAtFc#Z?-picSP-z5>`m7?r|Ll z$2iONa*O7A7ZljZdWU|=?a*nNU82sF8tItMvPY=ErrWn=6&RjhvxC6@;KeM4Qr;Z(-EVukw5^x>NsgpNP zCg0~kU)9oWH&>v$Lw2?$^GrfEL`gPP$tAqp;g?-dsib=9v zm%p^)>KNedQ12MC`~^EFuP*x1NuXTHo(lZsirzF4ME`yjzm!Q#(Ca1Orhi|Scvt`D z4A369^S_BYpWi6B|Ia?~RtD{V19g<1{Gagyom}NNTOMm@2!W?Sq?4rZ=qSWtZM<+c zYdvm##HTB^?45dZb8}DeWPV_-{C_?=eycR>Eyv3V2TxVJTJS=8Od~OxZyeoy@OX*D z{9@Av0f=sIA*g}DGKz%&o7jj+S6v$bynkPF)h%pjZ!Z^}KuFmQCHTfzS9`nfDtA^$ zHv@%OAQ>fSOWeU?+mq-d2hh&e_BPx>aQd^ns#3iQHHmVi{v!q;Nu1p9Y2JG3Uu}YIxA}q#rdg#9AHco zyfrJmX{XetfBi0l2K&VfdF5B&gC2+9hoj{B$2P0JfSwQPJL#yS+hn75x}C)gXfTH+ zhTj3*9hef^&13(TmS~g7s_%e(3GE2l1pW82f^FhTQg4-&m!c-BA-LeQJ_7?H0OdD& zdrcxwC9VFqN|dtiQ)q(r;Z>Ua-S$;{>Lym_C2{CVGF6JSCUF%m5bx0B^o^HR|qBT^_*Rp=cI_$HTs2ai-R`O`YRjj->jvCHdcH*19Ep<$o)D zXHNd#RUO=pl2(_$RRe23`IzAOImY8D#i`tNh#eQxi;Ezpx3Uf2erb|lj`;V2$S*F? zr0;QK!GeR&2md%-!Q;RWFq(HY-HAu=jq9p?(RRW z4TrvHH-5F6nu^a*xs27*RfLTN%=q+HP&MN^pUv9y*r)qBg}Hj&$cYT4(vCc{oust; ze72rY^wBBjaY825gS8uWLH-&_G&6m3gYI}t+#KzB$=`1>C94av!Ww*hJD zIM+nG%kY|th9;`c>)Z&Kx$?s^Nl?85=$`!IRJNh9c{*g$2gYCA23~fVBlUx&B{+&j zj!sUXI~0KhhniY2nW=_R(=wg7-L=?>N6P)|{j-6c$U)%vft-;{mi$hqk%c~1WPVk% zzlG?Rd?~%F>s4`S@gGp6^#4|l-gHxnFS|e%f;_}F*CH1bQjsuy0U9hD=odRqa7eG? zVzq`|P&7{p%FICd4uFsp(~&MYAU+f20_{T@S-QQxEGpNZk2`+sz=jl?=6~S0h71 z6G>Cgye1Y%o?u>Wu)M2^2bPa3FfR(A(cUmy7}B`sR>cjfsD(cX81_z!&9$}DAK?>- zccrRa{~O;d)1Xh@QN2`0C3r%ncc{kzI7BOvl#s#1$tKtw&=COnCPP|A0F&nIa*il* zJ_g1}rp_baZuR7u zpj_SbZ=wLHvf7#Z5_+yyDh%jaQoy}*$eM!3E~WO%buPxJR3=CLuV2-Y66}rX#_AA8 zN4CzNiUtxlZQ*|e9p2x0D?lj%$Og<|yW3E<4>ST-5$ZAg0fnnojZK4L8xwJQtp*ys z@Qe}ngiX=%w0ID`IBHlK2dAsP$=N_s!A;#{#sZDNY@kbrZq z9dU<6{SzdD*{P|TqIDIzmp>jLngb|g6k*>m zhKC}H|6bgGiibIQYB8MY?~(aNFRSrEeGY=pFE@$0^X<235%-^3qksvCL$hvnAgK{q z8hF!i64nFwmO~-?=pbr!&9h-5wCgwVbdX{ch@7d}z{hYQol$}^`6+S`(prkvg;YdU zf}X|`KGW7l&#vN%4X2SyG!EZD0FKXY+9Vamn=Q{RUTm7jdyHD(Ekb6O7o3yZd{1am zl|7*Nv_7k_5$5yUJDVpa0ekx_lGQk34}&T6M$CM#Q<6vBZK% z)b&5f9p=GaRg#Mk#VOZ=aX705-33+u{R;Va^bA_RV!H(C)%L!=aDE3>_Dmtvt%6sO zSOQ`dYj$ZV#>j=(pKEy7FbbHHzpqyH|J->`5N^(HEW}Od@#6y!;~5g7U>idxzaJHkZ+Kzx!-7j)*97F29>-yZORpL=A9) z+G~58-G6FdFlKk^TNMrN@;v@eM4Cqh==t{W$4WW3D&yAcRW6+{+yltUUZ%@HA|cYurN(n(psF9((>2J+!#^3yH{WKy>w@9#Y08OQ zaOOZg)D@G5>v|BVg+-ACdz1NMERdAMKqM(-hHUBURM}cy^yRTy;6y-SWW7Ef`%}c% zVtMD$0?X02U%!5plPf-Z_UdWDsxX*Uct32(4Q5^jWuhn(aKRqwz6<~gHigBzHUPuUdJi0FXpqi4 zJ+G*&ECG$z=zEuz=V1guB1N8_Fsn2fv=XS|S*?7prfJZ7f3;c%j%JC3Gw)hLT7Vrn zreM)rEi%n`SB36T`%VA6VS5%;i5>oVd9Mex0fJxX!MDN8(csWfVK`SEP9(v3HvL=#^#HD(-Pjt8u>)>hz!O*zb~hwd z-0G!CSq~-{49+$?55+;-!Nc?U|6=bwgQ{A$ZPBTyEKy{+6c7Y4ASzKnK#`!LB1w=a zStUsjkSJM2L`6li1PPKeO3o$(L~;@kP{~=sB!}CEuD#FRug0l?yI`|*qbGD zjyXs8`qz7Ft+x)Iw?5`3bTbziZnQwRfnz*DpR%kOCuR}FUO&YfSN(kbo3IlT(DM+Y zj|BBhLEDiQqrsnd?%ltyn0fw&PS|me2M;WvA1A~a*g=YfO@-0&f%Zu2g--|VM!#Of zQ|vJP#2!X!$n4I5T5y@P>2m?^B;}n6iMgr$ne~>N>>OeQbjFF&IKI z)kHuiWO1rT{I+D|iN6ztSCC*@1LtyWd-Vj)QPp~Yw%$PXtre%p~!xyIHn^laCTF)|#>6URuCKCf7r3co`%ToJ}E z#`7RVfNk|RP>B5I@2=Bvt?q&zy93`+y(q-X1v4wt;8nF<#}GvJYL9m9_^ex z6rmndE7~P#NvT?W2p>PUhAqkhMFMuJF%Vl+G$jQEoDi=5r+I-*MUUfgLmLp=GC@(rg zCLa(MW&~2{+MVn9;e&sN`o*y0rg|itpl3!{HXa~xBDbo#}tMy{^#i>35)eA z{A8S+!(#0)Jdza7KDm>UhIub9?;U6fFU4ethvu4Hd-J9Q?rRh{1&W|=cGsJZ0Cs)etv+MC-8sHxFDvVF#8ITwu%bCyx{|X+ymb9m7Qsj9f!y(zU;Q9C zFErDC);$_jSGSuW+i1iuzqvQ*H?EPHn#vq?Rj7f}>*=F+*PA4Hw^wS|*LWGQ^$D7~ z*ITxdPuw~G8zbmdgpDUObg%RV?5geP_Y7Q)dDoWfS-FsqS{Boz+Q zako{bV|Q9Pmrs;noS zEX-n2LoQ5o{moar4K%=|1p*w~p%&UQrg+{n_Tnj)WB;HnQobgbZX|Y!?|r z)6!u>T9*6IqB zf7fN*TmAa(#w|CeQ>$Y}!7xkv9n9()5zy5+@{UvPC_ntiQ zL8-Xz+xPK1mHPV;%TcR8cDcGA15Ne5O}jUmm72D03r8PWSI9JXH|N@;UwR-tHH_%x z!jd{9*YTrF294KxgjO%dg<~Vt&JEwbOhyyZm$7!0_3Iz;xsH0FG<%52+6vjywwpH1 zzHj+>e-kz1B_RH*6JE84wT1iWK9$OclOi>;8PPREg-4cKy9Aw>TOjox92~Sckesue z6%71q3fqx-?&?WlyTQlMGvG?hM0AO7_xZ|J{#cVtChL73oOI5%*$DOO=W(mwc~I84 zw$u6yljbR#5!a3t4uCy@^_Mu*TqxE;Y6+NKsLS~YdaQ+QN8iaP#r5mj-4N(r!5`51^kSO6=9P09AIY#fTneBBwn=>;J)j|tD%V^> zW~Ck^igT}6Z7!YYkf>jsi@*r`-@X7Z%Whr$e2ZW~c~0g`R!^l*IE3f**s*N)d3?0H zPwjkrx6~2wP`_$>-3W?ZRJ1d-4Uehq7!|jd)`wr&R@6`k#!4RO{TH03Z?fHGY|KjU5S^eJXt=V%k zGr(0C;jwP$0GbBm)|KCaM!2%QM9cx;#bi_){wj-~@yYxGEqus1Xo~uU7@q)7C>{8! z1&bC?E{4JSE8W;0|Jb&zV8nH*_vX9$dN@D)q}-E<5gTrbR2xZhZYRh2j8~0 z&G*Pyn=VGTmeIm%0pq}2i`Iu&A}G}FK&k+APOHHA;Zz?x40ApY3vfW-pq|r=QVq>= zF}zA;(Of zR_^pmba`~4X6KIG?wNjoBKPh0?Gs$f;w_Y^$Ts{O_Q_w0rx7Zk$LDu*YaOrEv?%rI zGys`R3xK+11*piyxQhw9pjCwCWIKa{-&jX(L&oVI&hEAG;!?u}F}@_HInCq8^>y5q zW+x7^vFS;?J=a@lC>Uz}HQMgnSyrQmj~?~LCi=ZD+=^=SjQrW#0fB8+Zi_u36ddgA zQ?Eu39pGDf9vvP1;Au{H57ZIFkI&abE7+BwYxa& z2tF7ci49YZ*pLGwXjm4!(C#48viOhkjn%que*1sGw)+2vlM(+b{D`ki-&~D6B0IwF zj|rCB(b0Nw6NIbj=dekQxVcaj42nL0L@}__06EtYadC0j%48Nk_PiF_x$##bc479G zLBCm1@pQa8-Hsja*ScKYk!c!z5<{~5MBX(*c4*}0VdacJ%e;ar#`yq^zkn_Y*xgI* z4!fq5OYW!LDIh<%U>6i{^&h(yFM4)nf_Vt!`Ux;n7}4!GBpcU#yQ@t*1mD89$YJ`m zU3D(>yy}6$)omIL691@vy)ZEjZMxKNCVR>gG_p5&P|-;@#wnF^Hzg|3XztdW9qp`s z6j0TWk`5gimuA*GjtC*6ixJ?}SupinSsuk&l`<(L_jLEV-t_}{{ah)mew>CH0Tsw!!qP4HCypEQabxVxUHjYdf*NPkZfNdkqs01 z14nngE==-_{u^W=9o8=3bS-iHTC^blhTow<8Ezz}wX`@lx%(i6Q7qANh^uvGxJ@UY zt8e-3DALqCEHz@!%r>zlYK54Xm}4vAzYDk5YqjD8UP`j=FLDoxr-x^4q+xY?Q>tbJ zx;Oq}WDGIXL`8%yT)9f$Sl-|tgk>|Sr(Evk#jyhDXnK16J)0%_PAFU?WLl zn@q;BhlRwWbb-5naIgYY*5wj2YGU6*HOG)1b5H4iiYGr~lrH;l_E*ufhwpZJ$?AFt zb;3tZ?yYupoEr{0f&Ts<+HJe99o+>NFwR)%!2Z4?jSPbOpS5QXlQJBt&dV&JJXB0lHU>Fy zQNLFXU8HSu<+>0%lQO<9*%G=!D3mkJ2#;d;`lAB)(P!+(RmG!Apw;V<*hXKt>LzH> z_Tly&7kK%U7!?Do%~;k#f=5E9po76jv#O~M>mp9AtlP*)jz+HS1xo7;*$@fSj*!y> z{0H{F0S0rFXz@`Bwmgs6%kdv)0KBucDsZZ~RrjcEyFLgzT8oKg)Gb>vL5_5>bNi^) zmIA8VNH$9n4+NWc*Vq@9q7Y+ZV&E)7InO-;=t?*2s*l*>eY+U?rm5uv*dt;A(& zGC>%nGr6^Sd_aw)NWlT@yr{SsVW0IljC&+Kix)ng1RxRwc5?@lGgtL2vT6uG#2XxT zZ1*Xb`I`^EjEl9N5Ho)%6=7f+Wq`aZmoN3 zOF#IfgSaW)bRUw}PneC!T|J8d351_MmKU0+8cNspKHfxun0*ix7;^b6i`LD%cOQVC z?Rsb=DQ*{+PQ<~sx`=nl&1~M4>xHmwwJ+B3{btwvM8yF7TaxrMh&*dojf-|fZ72;Z^ zpE5>D8+I;QR7P}rzP1|RV~_DJL8)QtXW`7}J%Z>{t3@eygw6)$!Yl~fo`^}t3%x>Enc`veL+c~KSL zS3I&Gs`yz9GZ*$a(QS9&`?@L`)acsH@Nb!IrWL)F=eY7em{kk;l+^^5gs%YV1w$V`E($h(5g$(v z-|XkIafRk1!^4m8NPhnwLL+lF-1$F&?+O;KYXX3?z+sZm{G zTef6kX5Q@mhtY6WC7=$YkypPmDEv>w`^xR>AWve&fxO_VaVhgW7udSsh2di)7=1r@ zTx4v#o9VB|p6FIY9rpv%z@ML-5bbguadEV93xuS;c4l#^-?nN-j3od*oK34*+SAvL zh45$BKK}Iez;+VfLbqoxw_)aqMz`_@`kSq1mpdJO`*Qdl2eJt~?XoA+_A8xqbac}2 zy$1W}@0`SX=pxg5%%52~Wm|r31TBgQ$byiEU7d`Nu>4tfhchwR@JYLR!$fpOcJ`YlaLIgb() z0r=qF$iq+rdpAjT6`A{UY3@-RNP98&y&Nnxn;!=)?8UHO9N4>eZ(&u1)ro5xTAEGO z+VZFA<4Qz!09(C&`LHhM3KRT5R)75bE>U#+CKYKP^b*B}v=Gs;2%1M)M7Yk3HPRse zHBB$|t(N?CD%V7Hf=}$mW*gWFqO<%db07IcCZBWY^1YipiaBNu1>`|c^=KRQM)X#{ z44#oRPk-c0N6w9*rlPz|z#NUxv#R)zT#@BptnveD-49NeH@bWW+MR)XWo5nKb)oaz#@t(&oxE-kU1lJm z--Ma<13y_98mJ}_xdyi4jJY|{W2P;4RgwcU^#*2__Ut$XeKE+BJwRBA{YYNO!Y6M0 z-$Y;mqF7GF-CIddk5x%_>_rN5IJ{nRJBg$URPt*K?WI=AA^ajd7LK8QwZFjxS! zWM8z~GMsQcOj1cwj=tt0J+z2TC-(BIzwlt|ZO$Nu+9=5f`~ZS5)Gi-8^Y~KxWt_QqNx-`itO=E=AMPep2i87I&p2#`H8LY6t!NX&Dwabre%$ z;EuXr4(~j)v7j~}gf`g7pjHw4`JCt%K)#J0uKmYmHXXR{y(!W%YCmzKi3u^+=C1>Z zzjjT}xHF0C9K|DK2>zTd7H7|zYc3DPla8M}N%3=nQd8})?j3MA^%++s2oRqywu(}Lq;S*9FJ8>h@-(PC4xZ%;CaCEf}7*q80s)4BpyE#}P(_ov8N^ z1J+><4hc~PB8TcZ@sxPkA-*tS7hfdum>oxb8*o<9F+P=IDgosX66`@$=JfRy|L);WSzQg|ir|{jWKT zzY&2C@8FD&kbUum*k=2$7wPxxscEw&I!3?@b4j?o5OKH*^9oSHp7?@>)}NM@?Wem6 zrwQ1B5YR7sSoc=;=x@#-xprep?}$JonwUU|W}0`}ldvn?ZhA9px0H}@!Mv+z&hyn0 zvmb~T65g3Vl5>t~iQsTZ0z3>+?8uzVUUdH$@G=gEOGK0m(7!nfD+Mi#?P{i6bb z#p@;_VO|%BX&1;9w;zuYCn1;-!Y77ti;0OssBgpmK57JZeEIT~`~?zY>whryWrPXq*MuVr zQ+<#@6%dt0ZC5v;{fl|ZN%hBJ=_R`tL_2=86Aua0IA7CRl1dfv#j%N+eVt#??f@K% zn|-SOWtlN1tsRsJ#9T6}z(oReuk0(3n*@|1(m-t`xo&vM4>b|Eb`QG+ZAg z_f}`u41*2~#DLYLG;pbp-Y!1Xnu7I7D!Wlx)BviSb2ce>@L*Xe1y zH{2%_Y(IuS;kg|cv+v5v!gS()PyUP4ko@Pll_x?k^(Wn)^Dx^zX=h&QWStqDUZV2| zG4aFC`ePO?cQICjLV?qk&jF1NF=nME)l^llG1P+)Q6WI0VRs9UT=3JN_(Rj;;X&ps z45D$Z1E2Q;PsO}ne#fTEV6hr!c&D2aadJd~1H$WEc9Ov5Y{z_Tft7;x%a026f=_5u zSifEvAF(D$MBQCg*SPsl<@cHKe?aAt1|K(UOO&c7Jv@7^dhzGZUm;%NJNu{-fxKnw=AlTkcwbyTY56nx}w1 zPUd4KsGjk_;NS%$Hb_myZBo$<{`UGYMNGg!$UbgA9%kTxF^iU#mfr^J zqe(#V(PsSyo$Z^qU0irU`=7w#e>(`k>xXK~7MH;rh+aet0N~NN*<<3 z{kAqXHU)MAJX#e~i+p~+4GXsWaMq(B0D_J#o<}y{y#+#ft=WO;$6_!jyrTor^Ev&a z_hy@R;DZZkaeu?Qz6Z_4`*`C26==?P|GT^;a-jbW`tzx^(N25k9b}gBNqgTocXR0~ z^CK0{xD@Q#Dsba+2|$HU{#@1j5cSmMXQ{9@wwRL+>iCKJ55$s&ow6->2kR`l|;)NnF(hSPkd9{O?wti`1PJ6 zEr*2{eev&2j&q~Qy0fFi*JaX{j%tZ(?tE0jl!||{vN=K`Mc(H4Gw9E7v6UcBI}`WrmuFVno2e|?wPb=){Nv+;`gy{7{^cbf4&L+4 za(z#^IM`!5MJB7**x(+l`+X0@c>Rws`^MX!O;=6Lfp9e_NP_so#RKAtx{hX~+x(T@ zJ&Jeo?)~}u19N%SbN>GAxWNCyZ@C-Mph(Tk_qE<&Ctd zWzs)8?o%7#Pn?cIvEaN3owvBl1aWgt?K^v0Ht=TCv4dk z;+$0rj~0WT$q6Fq)0xBU;EW$V>4(KurNdh_|1A6X(WLHKiEoV2A-RC~`1o)~$0E#| zI5Kp!~#=E&$%pZ-TUT~2NmtO!br;va{Ea7bpZR0z29## z&dvJ`H%^3WmCFAN$I7?zA|)T?)mmxoyx}<*?LAOsn3?35{gItcfxXczJiLT)>5XZ@ zNSdl|j9h4-@xr6T*KKBw_HFyLALb`qTNkUJ*_LJ1ywzoOqfv_f!5;VGGGDgjW|Os( zhmT&E?&og!7PS)a{CVVL4_m_JSEob;ZWcX0AFbnhGv~~iPe=CcJ8dd{*+u&g_v8{x zWY0EfJ8zho9O5CQrlFCfrS+Lzx8yENx3TQ)TuUWj9y<1fNiz0Y)<7aYny zXw_?Hk6eG}=cmsXY{UH{ELx~C(O}N8Mj^-SL6>f^&iUv|g?4K(LAnn6%3Fo4c#`X! z+D<0#+`T&*av_sOT!_OGE><0vppO-fXFD+?l=?0?+ z3*{?Uo}~<3ZT`7*J`qiNzA@7S2gn#+oOm;u&Czo70PdWl8`+UOWbf^s`z}9V%jSS; z!$zNIN&jchB83Ku;Yb9+u1{Gvs^pku z6crco7sq31_ug~5Ldzy-+`W2ZYI=+E6Gpj%QmGo`MvGFnAmg0yIgyvX2PFi?AGSDJ z*SMRsnkO&{4(hut&rj+K7-(3GwH2QGE@#|j5x8$9g-XIPaOFA!vPv^CFD2c zZ|~s_V2GryfI>D(vV>!m6K`L6Umtz$DPZ^cJry+nL8&S19H+%DHwet)jV^lRl_)!pp#px1*cotCn`(_wk#Z zPE-g47yrnh3WgzBe7Eb`MJ~-5pHjD*%`_vCH@efRkIDOe?96g0cYGo0BrCo=pSW## z(j5?k&uYSHx8;TCZOrYlEN+WheV#WiB3BU_XR~Bh@GBc;9m$r=(R~ob|x)ZG1r^sq}3r3CF+DLhvfB55|^2=LN0f%)I z_v|@0+F06IA_qT^Ky19%T{gA>bbDD|E}9}!A9T#5m%%Gw`d`jYtO+)X(8+}O`t2BXi)TIb>HT{dU;T>X0cU(0#E&sh_lB+A-xs<< z$HEdHE$My17ix}_=ex%F17ApZZUdlQ*gHHNH+C}T$ll23fVtRoSy)n6uE@nXc(aJJ zdo?HFO^5mT-ie9w9;sg!K<_Hp(LI+^IiCIWYvuga^FgXhyu%gqWN>g)l ztuH-fniKVmT=L9QVbCY#w(M|fx1e(ZVCWMCU)Lu>55mXzWYKVhZe^yC#-#c6laC@l zpWVItsC%Yhb%6+(&uGPLcd`w&HHM37?qqR0H`Y$w+|R|KpKVx@NKP*uQ^+(d?(H9r z`cWpKTauK1Y+`Un$phzbU- zH1=@>F>9prFHOcz^!4?{BEAHKge2kCqAM9WU7?+GuC{O1^wNZXU?3YVKx|c4%TS|R z<+WE8CfUPUA5M_R+a%$}ZSplQF&mrGj>%5B;W#&{twoGUVaFZL z^i`=nYcp$sLcnJ5=V=Egr>e5PVS7iZhYx4_d@>07 ztWxNOscufE>q@hmSXCDcl|w`~i?Exo*r$@FtRBRzoh9#NU#3XT&y5hynqc)Rd)by= zykAO#+*Qc9Hoqa&d2U74$Y7t5`bud;bI0k6>9))EVLnscOd|81g3ehNR~EO`K@y7? zl)cvK(w;psOfOh2&(z4lQyk~-uOAx|!+vxnC2FN~TuEB`5wWYRP zqLN$1H7P$`NtC7nAgEUYLdc1}g)@Y(XGYmS}jT6w&kYFEJ~{qfTiF#qC{0e@+?Jf2QAIo+6yn_}wRT*JF%M8hzt;NL-K`58Z$Ux( ztuVG9^Bj-7OWQAKq|z~; zC=hBa0?t^67XCEN@>hCGV{6PitfhE)gQl|j-*LwCC;yQ)^)dTvNa_x#Rqzcu}l@xTAKDUmnG!}u60EAd$h z^GLVUQ(Ht>JooG-edC-O`4TiBS)7%n94yQ2Ad2*u^v#l++b}jZwtwOHuj}HYTV5hU zlL0`acYNHZ^*!;8w+)PsN5#Z^__xEXQ`OQ+!P=j4+=Z9C`3_8+mW3r~pr=lcf)sYn zm3awY<&n2{fVX#qESr)J%|^WJ_~S}_-}Lkd*how}bN(s_Dr)s~#k9^mPl<`yK+B;j zlI}^Ab4+YUGw$JL`uqBZ4d~Sqhdk}NXKAW0UIx%dD*8n#-@oS+5(OF$f?Tj+^*t3gD<;5EH|D z_LiO){$hkVAfdjx?hwKqK6vn)!6*OBHEO(N=UMn+va7#N!S@||_LH6XkiDhHr@j~+ zRucXYn0_EG!bCMmnE}}Xhv4iZ6tw9x zOZ4KTJ)17i?$4WXxNoXfIeHNi>r=Mk;l|qY^_1M6Urm34+nr{z0SB=vGs$Kb z5Ku`>tdy3ORlq&N@I_{A)xg15>qxnGGnto|7_a;;-bh04)F3J)ek@Hk5U2frfBS!R z4Y;2&eZ79Hvb7a8b%~X=wV#)l`uPLFjCgaHSF?$ViAj>8qA%@kCv}9Cz-AL$8+G-U z<(o)fscP&-tuNf}`*BV6%9WcA4i1>Ta6X7fR~gOPib_ghIoolFH)B=Tk9{(;3jiR3 z=RgJWW5`I^+1bw+8yi36mj896Yd8`=O7Ck`wd;zDU6fzzt83@|nTP<}J5Wa)glos2 zelnyFJIP- zG{heEY&zvlO{$Q8Dm>fQQTEf-^&IW4T`@ZjJ+-`om3=DenZJJmM@JMH3( z)qTp?5l6+RD{&4YI`(=lZ_OZ9N=;a%K|gYXW`w1Ip;LT7p~CLp%)rs%aXD4=O4|SV|qUheJe713`}_#fQ6Uth%~7nts>R zD7{+TQncn8?mfXd&LW^u{qDWMOvzPgDLGr46Zo8Y8uNiYOWA6=&6R$Kn&aI{MVKi` zmZm$O^Jkz)R(dkrtP*QwppvMiPJaKcsZfo_CCk-)e5n3F_XwW8sVr`M##a&IK|6ivO3fQz*5u}-xav?TUuPE=fk-zu zYKCK%d-gbKjR=`lv}(+*EhY=wk0hbP(3!clevz7KFZ8k61vW=otI$v`jpgK^L61YO zGXFZHLge}sw*sraNBumPBh9r7KGoLBM@2=Uw7JKc=#Xj1SeIUUMnZy?mNr&spr+ni zd_`ZkrMX$9R&@HYNmIfRzxo6Vd$ZP0D#%29I9y=my4UwbJj}m2jG3Q^L7vI%!$yhB&#R^AEdRnOR9v%T4=in29M8 z_Hr-8rJ1B_-)k2 z+L7?I7u*Qdak-Jhx{|EJmutJ+Dt25iytZ^+3$nO6j2b#-Ht&+}i2jpE_M<_68kSdA z%lX=z5Y~{UQPOdpJlLG1B7@rxgz#?Htub2_h#*D)^nG~K$%pynNJ-9iDc^8Wrd757DIoI>I2&X0E}HVp>HA0j4AO3TP7;o&!w z4TVdflawzw{F$yt0mJphg;>h~XqzHkDQ+y!@7TC;V_$(7;ymM;M6N@8FL`<|UK z_0i{zS14INT`yWx%ulwv0UYO5tKjP7%@E!j1rX9CqD1x(qHewGFb!y#Cs>v(KkxbI zbV1&8{bRvaWDy9Vm2fJKF0-aoTxu5)VYxztS{rhMzOkk9eP$`Oj344MYx`r63N`;H?N>9>yfeMLQ-pbc)qB#vb>Smou0cL`s z%PT9k786~LeX&8KOWzEgD!(?}(8aGz8|UiqFN)@GV5N-)cw>5&&7 z8s9e7oTf)PwrY?IX>C&;jQbltY~Dc}5L{)lOZ-!l=A0)8ZXwBws4<#f%b8}6d^v5w zlkfO!sB^@mt|`iel9oqD3vFH|ZE@McHsdiExY3&@rk1Hr^OPYOP(GQtPM2BOUa@=K z%0a1U$*2CTqU7EU#G5+o&D7v2)ReEOmg;B`fT!K?Vr|iC*sy75QnpsL;YyKdkg(lQ z3SFw^5Qh5@kUAn`W=eWzr@f4Cfz3!#nrOkuV8kie{A(NKy-`)NjCLQ%<~gP{8=>Srqx$DNry*vJRC;xGMJij0+LdyN?wY{g#6A z$icqh^dSK=1zlfdbm~eq6mqD3DPOhhT-0iw?~9YePVCEiW7#H}HPH^O%`t}G)k+s& zU>&-0tXE!q>GNv0dZHSS>?Zfqp4(VnNANlS_^_EvXDSDGnN2E5X<%4LSSFA=n3pfpb+#v6@lfnAxC$gQH`TT7*+`(v46viipQfSF6K#CD5JSFemPujyq-i z=G*Bub0zce_^lZ1le;!&f3mc&fF)GBSW+T834nw3Ky~)S`=Q#}roi-4)w5?~pfP!g z=R_r0Lj{;FX4d*4g3U4q%M&3j??vZRQM>zSo$YWM9jpqn9sR<~uyvD1bFzJ7vA+3m zo{Ed*eW8KRuhQ2Hi6wFAP5~uQu*Un|X*#A|k*8g-xof~=_2Ejv;`t|xQofjvBjD7M zV%Ew(5*tLjXOFq=KsKT(Vu#Iqh0mI@#kIxLE&i?x+L$?7wNSF!AF7oeZTN)IH)g_Z zeqZCvV~cRUme9b!IE>*~6}7vD0cX)z?-3)5Kny*R7{t1|EDf(-iWYF}J^bQ?^?9Xu z`6|ITj%Lfpxx$3tr_j{=a-%Jv^Mv%$1&v0dn$LD$zlzDX;Wu^;{>;rs#U&2%Ei0A_V9Vc74 zIHWoYZPjkw%0u5@q*Sd)vaZ{biguw*Gs3~>G~2<0mF4ARqW8#F2fgYCGAeK}~+_*0;Ucg-hnP<4x)%VkL~?-zz!GE2^jc zccW-!2b6(`_j)DZeQZ@=qErtX0zyzymqR?N)3717pID~3g&nWTYo3M{7P1amId(ho z|KmAvP2Y`b`A)&TpAq}_AINqo--g{wRP^Rc)*)mWI3XJ9=9&rn_O*QHzSkGSg^x&4 z$&@biv}dzi?_PDmW?GOby=Y*!$(?mb>nu_oJEVRt7?7_6V~|0a6Tb(NIu$ zwsok-&|spgSaC7^55tN)seYr~>EU87vuU09>Xm8$oSyb2?>IIs3G7teX4Rc81XpV=nJeS{ zVjtw4N)hc@H+M)itm?W2n7h^I%fHXWP82)Gv1|8Ou}KLa zxl6`sXe!pUZ%$EHa+)3WVci&1?3lVVu4`vn-{EDz7u+<^B{p1F;{G&-RVJz)|f%I%PqcGKD2#RG9AwPI^p6P%jtAfo`=dSkeD zGCIwxbu&%@>#dz~*d=0?fYqmxdr|udGyi!Q=C-_brv%mJ-8Qh$+xP@9HY4Ay3>fl0 zOCG2+EG%$KZE<^S)IF!RR%|q(Q#>`CjNHUQM*SzH}q zw^iq-OTZYu*;$>O`{IjHQbfBSHG{}yWV1>j<;Pj3PsKS{b;$JRJk_kHG&&*AO>7;( zQL;nNM2hzoXk@nwTYf9m_FA=o6N2_ziRPRjbREruJ{E71tHHH`cUZ?Y*LHR*Wsw7sI-%o z*0xg*R9QW|wz8ee3Srs#wsa2?$h|^S(QC2gHKTxVeZdkRiH(a}9nhIF{Ixx*PGKi_ z7O;Grn|4s<59@2$8W!_g4z+o3t!b4zfP;hMJh>(^>lC*u0$rR1t_y1|_E2sih5!BD8*p_-Ze@fgNU(NC)$79i)wEUHG_d~}HTHt~=QyLxQL0SrX^eK0u0w$NmfkBU@X-#j{bzA8hv;xv|w`8LRx*7N<+Ss=Xyebd4kr;}(&tEuaET&aG( z`VupbZ+6and%e%msh*FPgYK{tP@INg6&4fF<4uVYK}@a2M|bHTTP@y#R(^0KCBc-< z15YdUKlzbMj!x4y)0jR#Gynt&RsAm)~3%ij@Qnb(y<_Lh{JrBZ z#H=-dizqt&(TBPLjb4MPWz*JL1Ce(mX1YGnjJid53#X$T=|4>tqWeqnB1V6w<6O2e zfLtQwMo{%}fZ#IeUM)t_+x+b9oN-eHC6jibgw|5q-b1afo7RzfMd>B!f9f)9J%8{Z z8(<_QSWej3ci3S|cAWWsQ{!ig2+*rb7cQLWY%C6Pc6K56#nqA<<;4?JssypKzLI5I z6EHrEg+h`#ds^9#O=L35u+){j+w0!FTT2Cp@So`Fko52r3TnPq?_>)2xl$3){RLWZ zQ^~u<6c996D?2(giydb#c~IG3pXk!fGIwdA6t}QoL7t+5C{{n$?G_KxHpQy%jKHmL zN2MAdB`|ItrWJOckHpZFm)rI%E0NzbUa$Y*v4|mA9v%V;FdQZFFqMhoWONY7_cnAjbAs@o9z3X<)Zvn{%%5M^2p?G}HXPD5Nr zPbjmE>wj$Yjj61aQ^UX^%<+;LDmDc>IP&x)`|x1>0Y^}2fcBPN!^KIVxPVO1%mx$O zujW3kDZ|L#cKFLV)0UEWfRRa<4K>^n>xq452A4A1zB_y*a5FVmI+UryO^JR<>d`rD z@-OsR(p@jRyb!flmFZHCK`fS1O!SRyimxRBkGhVw1`z6kVC((9dYNMj*6oyQ1jCJFvo&e1t9mk@^7h@BH(_@IUPMOzpxR=( z7xP+C#WQSG6RIrhGZCcM5yCuF6D8k~&YRx$Zhi9f`_nex_FAb=({60M-aU0o}^LqkWTLgt$?8IM^$kY%HXj^k>neoc9~ znnjTqadK>#US4~cmL3$?7nYZ#sTma~f|E^9u51`?wLc}e^lh>WHYL z)v{89K*VW(Id3;EH#fJ=#^@lI1vH{3x|QDXg^71T0tRv*3Y?f-ZX0uVBeV;+J3$6V z{~*8-af*?MlFky9t5?Y?#Ts(e&R0WNhh9mR6X_1xL<3m4Tup;tWtMmkmBL|uKfWY+wcha)*ai1>ei$P-n&#OE!a zw76!R_dT}IHncchOW|n#i50w;abMv?GBhIXnRE1Gol9PVE@Y3VEaGt`E}IetM2q>K zbS7Ndff6`fPS+(WnD9?8LH(Z z)R5A?0GRr#-6W(ZXu*dZgUs&H9&^H z3OzmA?KcSnP&AK(cWJ*;MiPDj-QCU6-j9Roulq-&N0hV`oU`Cjj{&z=yxd@xeWOEX zx0ptJp-HO`#0!Iz{>lDExWWYto#z+d(uexE|Qs_8`Qe}tb1!Vcl!RJkMhcx zw&1Ba=K58MO19LeH@n*vx0DA*5tvASEw7n5E2@&NqXemG z(?Y`ZVy_?dJvAcG2Q!~6X%2Hp=Qw`+the}VOq^VBqAP`CGUnAlNusE)e~)#j@I?o? z&fR->Jck*|jssFq4;e}URq%buBbkgZI7{L<5C;2};1#P97T0A!vE+LHN`7G5@hq-i z5`hmN>u85SOv-n-CGn6HW1U-u=2f~mp_4N{#I@iAiC-N_`_hMmZEs&})?LZ1<#XT#QqB>#PqQhYe>G*%lF zMpaji9u^b3NGOtgl_3%Zw<5qaH9OUi7*lFtvIi9`Dmkj#HtJ$=2SXzi26LVy+kjR zO^lrK$;01|b!EaWzB%ubpGcbpgLz!}+Sr_~N}(z>DTsqAuCZ@yYHzeLYH`FnvX>fE`Q`!xu7f@D@Cs=v{g`X%`AViq? z7Tn4~HQL#(?>z}Q9I_rMMey&eiTV!}+n(;Awbc5~q-Q9+VjMy&lUGJZvKPXk~M6Q3gAOq+)9xCU>K;(TISC z)y+0--Pggpia;0UxNLf(s|cdJ5~Me3SlBr(OHY7K#9D737!`7XZf*J8L z45?6svADU(Nz$7(+UKMylk7y-%M!#Mw-O=A!eHShvXY{|RLak(bxi)y#XYT90of*H z8qMk5r{GuQ$9ki4_DPCrvMQ%;>b0SuE~(a(y}JcRx~IpaO4pPd zV)I~7+QtJl%)_0@>4a`7DvCDCY~e4d283+XsXFjjQJBziN$cR23R!q}45}qU0ZX3! z(Kkh&ZiE!ycGWq?wTm2$+9nM$PDN+|SQCFR2k<>vs|xR2G?@+>ZhGZ~h?&&?*+m<` zuoqoPG(6#>OIL+sLGW>^bzlMBzFUjayz2fDU?QKW=;R4Rnd{?4$#ZXzQPvT<-dm0R z8pqdeK(mwtm{`?pw3$bTzO+~Y4ODeSCoB?W2F4emCT)FD$+E-x9AxXKK}R;Db|FLS zFYGky22e@{x@Z&iR5~uLV{7+qF=h!L(Mr2hS!;TLyW#T?&+xmlEsvf&Y5piL-hx;i zB1YaQI`>%_-z5nuy4gv$k^ZA;wu2FAus+XO@>-^43hb z9Eq0lXL@UnT%fd|scD;twdE()4(14@7utH}=E~=cO#eK*KeXDUbSLl0wLTP(qN}Ao z+O_FSv+GF5rCphVs8&QX_<$4}F^qmO%hCKx#~@|o{CAa)&TY(JtdwNzDEmXH)A&Ao z&{|L<`X?fP7G8qC%j%p)8@WHjCBB-r~C)b{YT9XbBQhh%7 z|8ed9->LimPk%3M1qsqEsw9>c1@yc;<&J&hc(tE{QCL4Ox{Am&_GPxE)YT~v49fYQ z>g;In_bHGDhZ$venxkzx`QunM!rO4_7}Z6Wx=BX zN=f~HwD+A+P3GIXQO}Wa6u5J2gDB{TAR;hyX~{T_A|Rk3H9%CFN>d^=K%8*~js?)r zq{aq_lu)FXsHl|C1Ze>h1d>1~kpKxHB)L1Y=H3tgd+%E3e!1&@m=F2zu4KJ=-(T6k z{XF~Gdp}RRw@aN%8pM=eIntH2oc8Ks^K#nf?FeHCYG1f?=~7yfKq!<-F2J-m&bFGH znO)RUnNAzZqPy?+c+)jAR#>!E?)x7=)=i=D7K}1YIkNGCp(V^NH=r(TFoEK}Llo8- z0e81|rR#El2p-*aTQKz^P!8or!;mr8|NC9L+1@WLb#Bd`*MRaso8|$?+(YGo&9wzrsd2rL&GyT{sO3BNV&MMOsUQC zjAi_h<%$34)0JbMjlaX{PmvR4$e@8h^3&hv*bo*N%I>{zfLb#I73(00;+Sv>(zG+V z^Vo0YEP?b5Q#uK7KAaL9r@y)Nqv@nFP7o zPn7XuS7^(IO-zEY2l}u@;%BNnvX{*tx;jpk|6K2*Q8HTQxt-ZF#Oy-92I^8k{v@&g zbz9k1+1mAzj`x;!M-2^~2>L$MO1FxLIw+!?$I3s~H*xY51I|@rEGAtAEY;P?-!0v0 z#9Krael^g}=mn6|ppKsDKIUi;$(BN(snC9~PA}Il%MO%#`3Zyqe+fyr(%tug@Z$Du zL;`MJnw@h7f|X8?#&)eWoX(!ILlQm^@&V4DzaV)gP4WP1pD9{D4q=GUao+Dh(m<*w zOh-v@O)zM|vr;lMGa20Qi!WaS=RaFO#9y2n44-R}rw>8jV8Fk55Zo#Pb^9(XqXO#s zygFddK3xD{1oXtEei@O+>G@=*)$df<&+4J zroE@B$psTozkb?-VU-FgernQ~In)3e(uB%x*8mI0OCuHLIDW@feP6aCG@_NN2I`-` zJ8&;Cad3zpT>_Peq5g~8K11)9)tuqdRYk+IgiIsoN1%e~@3iJfPAz~oi5 z;JipI+!V7e@B?L!6>{;>Z%^^$lTzV&9oBCE5_CLjBTjNiG1?CF49DQC?Cbze4q5Db z->o`86NN#EmROrKT~0Vx1;S%UHT3CsZKVlYx_!yusdEMaAO=guk+!b?H;E6b@Hpz5355EPL}imSbR z-eLj3*kd~CI{mj0ZQFIq%QH=4GC>i$(zji^<5Js3gfvE@tW4UAiM0flM4F5Su=4^m zTv%D|L9y1>#3CUOL35um1yFn7>H8Ndk-~@~mbtkj6vj5M6uDXi^2qj=HWvc{1t&PQ zMZ@ym-MVKi%wyH$b`{HSi-r#NSFO`LJwbwW51OyN03hciD%&c>2;l8QeFtyd%!=&6 ziqrlH2bQIR;a$XsPk;~7c96PN4%t(M}m zBb?(uG=jP~QuXN3vxHr{SNZ8UNWF)k@$n1XdPLE!!alcU8cvEzAYcHJIWJI4ji&Rz ze(ilH*bcIV(+A8V&i^GvLM9e+JtD``mZG?LyL?=VVW1%TQH5pRUzz##dnP++u(-KHd z883@hT7Gj%nkxdyp!P#&b;T&cj(bSSz^aAZ@Htj{u7(E>ayat z*S_!#I#hbKZk*|n&rAzV52fdYyN-*j`YZYj!@EM%9p3*l-TmDznN6;{;(k?lJSUX- z@$SJL9XsMZ90`|=x{p;u`xo!LU+aAF z;tQ|V#7Ks+wsuY6yJWlK!6R?;?A85AB;g1dkG*Ohhd`9*gP8G3GiDyVvJ}A96f} zbcOK2LgSdR;gr-=pU%5p$tvUZp_DuFB4fYoNGn@YuK-ZuWqO2<2iBFlM+$~2K3O0$ zF=HVPi?z%0C9%qz5KhiRr5?#D+xO^Kn+^ULytIHBuh*6^%q)~cFCNp-Snl#KZNI6u zpZGjcaBH8Uq>2MVI=zT~o8@tTQr8mET<5Sn@+b_+bBhG4n3x!)wf-$oh1M=^hXR4k zX78Y1i^z>xtZOt5z0MoKaV|PKGL~7{IXYggOpSC*TCU*@R}9uCJ+Lly-@ ziYw7nb4W6QcW`n_^9b`atBEGpEi{;Kw4E{*Jt#M34%_*#KO0pFe9wB-fY$2!+jhVI5fZ0&=+#HNhyF#URNs$iGJhD#5Q_{j={6R($ z?F&=1-6K3>g$<)=xb6;SuaA$<2sWt++C`fRI&WGqR&J`XYRC;$HZ;52gRemT4h6T} z#Emz;ywf){$ji5|DXPXVJ=4xBE!DcSRkovQ$Rj-`jH;vO+wD>ibin<3PVHv@S;mJV zp{9XG#ih5uo%7^c((fsaUb-XOSMJr?Nu)ot)^2{rC|4P|m2879t&d_Cs-byA-8`+T zsx4^qxPsi=hg9mXf~BOO&gV(uBS!RSFLwUtk`S_t@;a8%gAS|;C3q)|^E;FpIH|`Y ziR-+DbQQtmX-r$$(^1xZ50OYs@b78C1|F`}{Tn8ggrSZu9{lVQBL?RJ7atd_eyw&xuBC(o~6(IC4c zo|H7w>nc<1i>k>ys=ualJUL?D0{ZSmgyY4H&uxH?8XW4;CA6g_{t?ZGA;0;81?%x`eXW-tGGi zavVK8a^m9RU;&nVU5(<+XDEA0?mz)Cwb0Pe$c0rO)Qjl(a&lgCGg2mTe}*&~%Y zi5R77x!5?@4I%bJGV}PKJ|-Hgd$ne#IAdZAq*`n!7v8iLKQ}pdzI-0F%_PiS*Dt_F z#cjN9p>OrF(R!OjKZzdKPPkNctJDNGM3*~%(3*tP5BhsL*3^`wQ<4lV&yVXJ zV)s6sx~|M(ID1;9jTuEj3U-Z|CusK}PVY1E?GIG;K2v5&BT}%MjT5u_3LOgEV+M?L zqYHBSp_aGL;F?>;Y=3@UIEhxrElRJ-exIIL4naNX1m)s_t~5ut?@d-ocaM&|e*Jn{ zWI}zt5mz)vq8!Btyvf`4-cSYm6!bP}JIo~JQkXlTITnJ%_{7q6VVg@-zr zl!P}6?sAFFz9VmP)G_B(2vwoLuPHM#JA|vQV1E4~Z#0~|v5|&({mJya*)p@sS|Z+( z=DHt0TW=Sv<$5&6(aEsJgFU|YoB7%nTUdjU)7tXdvE7U9%F4AUqw(k#0xPY`{leG5 zl@D0j>Ja@PjPhARwi)krXSVTS^2PvLf_EF)Utb@!o<13PEyrbxhNYN~quUVNmlGu2TBe-LEfz}I6mp0o?DJ;4sLGN+My{VVxi#|; z%(ijEe4~H!%7^>TLTEYD*`A^vIubEO%?8rRd#Zz`D?mjt;jyjdp}OEX#YcvS%93 z2m@HF?Xv|rbyUt?#83X_dN;4I=jO2QFUR{e1lCZx51;WS0nt@NYR;^OraL%s->3)~ z&deAI8x6$Lj9K}?^k&VPB!l!lGU>2_DhJZgjN+S9eef4P&A+e~apKj$u<&saiD!ekn+OCU?fgFnm;`|;+-Wp3>F38SMW?@ z>92-d2F466;Lz&tZp@woegw{~yWr~e!HlF`xv|W`XjTKgTV0Kq zTZzKQ61*Y#y-vU~0>|tF@#9!1|G%tZgIOP2 zt0XdKo+Fd>Y*8BEECn|in49Bx9dCZU!|k)y2B)veeYZH7C_XV7XsVA}sIyawoPKI1 z$X(iuDBcEL5xaIfdt_*6lYgK$EY_>EZwQvLi~)?t7pgu!)g-;la;AtFcK>~fQ8Lqe=Jq^S|5r#Mcg>*Kxchh zoVPrYC-Hy#biPbFodVkb*_K1n>Hf8v>XTYErm2O0Zjri2e zS5Sf?=SpTFutAZD!EJI2oTdA4Jf=8%$&E)E7OK&<`}9=R5?nX<^F-whEV!aXw<>c> zHZ9`tP_z&&Xj#CYExg!a&ZlK*<7c0#w7;-S<_=GlNUk(i6$bnyNs2Ao{ol~nD4I2t z${ys%J-=#N)LcnAm&;ANvFdrBtXcM%J-S4bj%0l}r+h3gyyO!&am8fuRt|2`4*cEj z!dL9q@2U#iDkb(Y>nni*>g4V~sQAd1@tpY=;*yP`{?+rBGa{S7|sL{^cXkCB|v$PVNXY>;1TEKNH zVCt|#3*pnjN#pXhI(k3ZWKiw*ll~Y3xk9H`q2^73q zllS+*&g7coq)vsb?A%AkZExyH=$atG%o*jb&(|FE;AMTP9i5&1;upft5|K@Mk=*Hx zh4R)kLBkElQF>8hqghKhRoy)5^YpJM^M`S9^7z%8xNPBI`)$bkD+-w|NbKB`6`U(V zE#1w&$;^n1-k4el84ESIRP{%=Oz~*!a#5A}egyR_E<1fN1O3e=#HG;eC~kXUX=%4z zaP8Ca$=wvUMniuGX1C}@_!-1)xa}Kqo>!u&p)9nn9R$uY!Z7eMcX|lBq7zSAxQzH3 z{L`Dwkh5m*;W18C+KecROCc=)e-8S!j&J@^x+#&1m( z`QyGp?0WyHHK4INzRao={s_M5{l}kGioUh^>$3P)xV;4RTB|sGGs3!Vvoulf_Rl;2 zOx-)Gzv(}@oGYuA>2-ssnk`GqgP;PI#i5`%L$J((H>@g>9#*3Dz{l2FqCTq9w}>|~ zkVezGo*VF}da9mtTf>v#-K-{O4LYfZcC=sjHir+`c?YAJ2r) zKWk&Tx$KN5j?=_zfBIbB&ee6qZA2NS$pes?R`U!c!zkEOt8S$)dMYzGKR;h}Z?;6) zA9oeRdL<6Zm{hC0Ms5eilE5P3wNAw^J_LpL@#X9b@%z&N18e3n?HB8XiDNkWxaO!K zt=2GpzrM*98M%(%)rf7u_;56|k$7~|FIo%S2BJ#cWCe*SUn9|yM{#>YS}{2y%$ji7 zm_ILRo0?MY={_9R4*Tpe#{<7`thIJZt_3^McBc=JmY6sETrkeTCx_D_aer`H%ZbK^ zvSdfhhGICT8D@f211{)LU#Biqj~hzSIv;-{X0djzTc!Qs+fyMEZI7h*IUn>oV@Q$F zJn@u8k}Ww_#C`w!HozhnW?GAuNBy*e#r{V&TLTHMmA(u(v?=fgod9pLb|#??;bXt{ zfPt-1wG5N2wL)dWnGNrMNZjObH23xvJ@MVv4;qL|IlT@1Nyfo^J0guc zJZH_+5v}vkT9;PoW%wZRNRPd%YX+ITb|q{ik_99~)jS4JlB9`Ozk_zGUusWBZpI%7 zdH*GzHEFHgen;LsWg%Xc@`g%HyB*s0R>trB*DnJ00H*87$vfQVbNGiUk%H88EVI^p zdDc!j2e^JDc*g-X{C^;>=7h5MynFTP)y76XhQ%@xnWWj>HB+?jVWij~0^2k6M-R`j)U?Sj?yKlE$%e)Qos1F-Em@ zKhC>Zgrd7MzDKQpO3;&@zazVDa z1D5$>Du*az-ddm3HhZST3QU$T*y{Yki4HVo}M^`{jyi9qrb;2l`at* z8S~bjqhsdf>m|u{wpRs_j$Rw$)ghnWCpICI+thq0n$=cGN(Pn$@NuM6QL;*EYEH=7 zWeaJS7@$V{eMQ=c+q|;As-La%7)ty82j_t~X#nADSc;WC-|^#>Vo%@}E5muCe)Q<2 zcan1?&nEDH>?^(HLR)jfedsZ~uEmBJGi@?gnqwZqBB1wTaDhvy7+4M!W9wO?+#xbD z^Sg${3OD+{zd^hvh90|QU|^uRtcho3$HayymHS`!m&wPFWs{HSysW6uwbYdYYvIC3 zJHen*Yn}UtF}KamZ#1x)0!)q{&F-FZjXVcUlxg-J9p-uC5+)E%E>C> zv`{~ju=$5lpep4N%Drqmq|nB}4y9S?+v9nMY=9_JEq2&6*OZxd&KGEkRA)?1%6#s| z(yu~nf0vPp^_8AJyLBmT^1&Gy!vJ?|IN7#Kjc0mL>iMk;P$C zRF(DzH8i(HfnL76qphI7TdIgRu8kry_6DxVArQ)+ zO?H>T!l-Cn#N~neqbwXQ12*)RJzDOMK^UgXVC)uj>a?;R-mxfvuX|9E0NWE^UZkX_ z`i!|2_`+J|E{*ff7TD%+TV)n|;uLvy1T+3dr6u8-wdzHg0}*F|3VYl6SjQ{Fi?k@# z2%(GkrMDhHmQB}3#UbXzoihc`o|#$1vimIwtJeqpBNP7Eo}~+`OKKVzg!|e(sm{@w z1xcoLva~?pFXl4t?sR~8J}hTywo?t6)tysRIh2cI4me|M##7WO=92D)#m;8od~#1t zq;ITHNcW>R@h$1iG3Y%vgS9l9$4M~E0aXmA5&s@@DQZn2&pCZ);MAE~?2nBgOqVuD zR=avY6xIen`q4iV5+VhRbO)#A2x6Q-Hc*TNH<0uU$IrB;auF~&&>1B-c4kPym^*Qc zGiYwQc*4wdzRV$t&(859W<8b&x(zZ61Ksv$1$0Wn%8ZR0?kyxZ-bg;725Xu5~zS6Fm zaVX89|G8>co;@v+wZN!`kWqm%iKcn~8F?s9WY`H1pz`XcXS;(WWx^WY2XMZhWY4jx zqXIP%w?o_EOs!Z=L+6zj>e!jD-lDz4dFAzxN=mxIz+quwA`XE&>M&BMtKC?(w&fk< z`T}7kH#=GrtZF9k&dkc{Z$k6oP^0$`e@>D5h^3>PHo6k-I4c)V(Ne-BQY;uT-Jt z#U%<;of&$xa7DzM`o&ad&vp$`V;`Gkm#MD~#IW0!YN?sg1`hk%ngfEu!<8SHSp{IO zfk9gi83mR2^4M|@tBys)Bz)R}@NXgefPa76!47FWFfbsPl{K1PT1rF1IAr`6OcFpJ z-hr4i0Z0Ef-a0h21Wnz9INHqp6Gk8qE(-q<0{Fjz3xECiwV}KVz)5xOAt>*(#&?DR zWHOnCs6=B!#OY6-tY$;hoTmG53OI6sG2g?Z%mD}Y7|aKC;{@tvmdVZU@@j+Ki3|FTIkk2xiQrB z^9V%Q;0k-dNJ@KpP5owwN|Qc&Z!W7jOu#18*AG>S*UcR~#`DbOATN616_%w1w7RUl zGvBS@KtJ5Hs<5diX5n9D`xF)Rd^)BBUVr*HJ6!IC+y5^Ff_l0&F?HnXbL!`TrriAe zYRR7byw37XF6hCJbtI3?PK3@}b3LGNG^?ua^cOlf;toKfDD@od_pNec`ry2GjRyBz z=TBvMZRw>A4%Yo;*5)qB$}UU!#7$cag9LgAMDcyY;U~`PtHQHvwkJko>AE_M3zb4O ziEFoQsCH^bY5xcaZ%P2bUc~-jm|w{{_$f7kK;k zB@EL41p9xF#^0my_hR_p@?d{&jlZ|X|8HAEti1ZnM>P#|Kmc=tusm)1OX<&-e*5o* Cd1zw* literal 0 HcmV?d00001 diff --git a/.impeccable/review/calendar-axis/time-390.png b/.impeccable/review/calendar-axis/time-390.png new file mode 100644 index 0000000000000000000000000000000000000000..e22d6d6dedb8c8f5314a581838ef30c56e0685c4 GIT binary patch literal 57799 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 literal 0 HcmV?d00001 diff --git a/.impeccable/review/genre/details-1200.png b/.impeccable/review/genre/details-1200.png new file mode 100644 index 0000000000000000000000000000000000000000..57228b28566b7950166d7cdcb985a91a23692cee GIT binary patch literal 41593 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 Urr-YNfLwy|b@gkRR}BC9AK4vy7XSbN literal 0 HcmV?d00001 diff --git a/.impeccable/review/genre/details-390.png b/.impeccable/review/genre/details-390.png new file mode 100644 index 0000000000000000000000000000000000000000..cbef72abcad410dff47c8a9c9be079efb8fac814 GIT binary patch literal 30916 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 literal 0 HcmV?d00001 diff --git a/.impeccable/review/genre/edit-1200.png b/.impeccable/review/genre/edit-1200.png new file mode 100644 index 0000000000000000000000000000000000000000..fd56aecf073518c738388a268a14822b8c5cfd12 GIT binary patch literal 49925 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∪pIA!`Zuty0Sn2 zj5kwG)xO?S+}ME~1k2s~an6L5hew$=$=rOcNfER-y>9p#Yc}*sc}Ht0ez;f}9zD=i zyK}M$j244OzQwfrqTNGQfeGa(@X;zZL&{qOs%hdg^eM)26pl-ZAk3&Y5u zLbwI&WRjGB%WBj`qBR;nul(3%z`~2>D2XsUx1c#v*ek5cKs)701h@3##|ltaSd}y_ z1KDo~v+X>NJ@W)7nem|hJ%nHfye5yqd!!pG1n!GC|4MDFS^F{lE?VjWwCk;<-`hcc zOF#suFa8Bk3atCvD9ZsNXq_`QG&Ucr_UISAAt<;N*21Q!O&mwl&Da6>4_@905Go$N z`!B{5@SFci3~|`S?YsYZ9QRaRYG3R*{!rWgov!`IaH^TZ^&%s!WaRgQItd-Cb61qv;wf^+Hz}#0N$^c-5-8M0b=VH|1Z&=qzrB zWie0xWXAoW;OzWYUyfc9*_HkwVe&K702i+@iikXbukxG@bL1yq2u*}MGl+0;D2@Lo z)Fei~hp+!Tfg3da-#5`#-J%=ANf7zFH4=yHUEy;W!};B{?0!NgY_AAg46 z(Bi7ujLbonUzqLi&;Y#b-k3|YrzA~n|HQk{-F^P!G_OUs_8%ta?H7BSMH+2wZTsF%T*nkjS#ND`LkQ&s&r4DU#|kG2 zv5o!3$jlrQ4xu+#9z|iNC4~deW5^^)SvWMHg_R#ND9L~l9>`UM6LANj3<`bagq-K) zhaBLU7ihqJ@Z=Rvh;aMjP8|d?g>vcL-=JW~=uUZ!slnd^Hx7jzqr_S#*NsKsj!pI) zHUqO&v2?Bu#N!ih3ZW%Q9Sji^W)(1ng_bhXLTHn?s6-Ae{(lD;N6$H?dHYYVEUTF9mDP>@c|{7dT94Pv2+9^UWRj0;Z)t}I&!EnZfFtCbOYT|0ZO1U7m5tq|;GDg+Q7A z(w!lw%(LEJ_8P;Ee-Q_GcaN|*Fy}-4uOYb`AZ*ExG_3Ia9dH{-H~gX?Myc-km2f=- zisimY?8u;ET_>qW+^j7)b~cX8B2O$zyJ?KN=Y&M zmd*$n!eg%PlRal{ox6(Q)``?~AXVz=e*U36PS{C~J~kGW+}X)3r64Y(Nl|hJy zZg6PqR{N0ACBP3s$qvDAZHYMKQz8BTK0rL-jm5vaUr$e9VPWnsQ>m{8IW(Laz$=smB(GHpGhFp?DMMG(nJ;6nS6}oGt13X zxenegwAsE2yu48Q=zRwJtP^s$RWX5N!|BgUYYmFWJih1=)I@6=VKT|y)9@v9V28Ij3bj{)qC={+*UyNGpF3YOkU9_VU zvR437sdU+#cv$W&KLqgJIa?zjb&6s?BP}j6(P`9Euh?7?8!Rv09l`SlDmewup$J8} z#!uo>mZxsa*w#SZIo|gXuUwHBaTI?RaqCU2$If2|?HCJEI2N&%SD{kTmDZNzZh**JCgXA@I}qcETnw1d*_1NSYL-R zYR2-!aL!FmUPHLh6Te+tOr4%41vF}B7oL=qghI8?v7tYF_@J$=ZHaZ(31~J%0i-*B z{`?9rAF=Ua%YVV~L?3k-@iXJ%)u@RtwA`xM3-e;I_6@R#@GU;lY- z=c1d$N%@|@FFj}6wIMK9Atw!viW(vd$WhIStlr(VdxS}UA+tj~P~%p>hQmj zETut?Pmx~{LNZitRHw?t+SVByJ9d;(TS)!>{rjawMCOJBXAIGj%?DR|EIgiPF!^0o z67kb}`Ljg!RpBD+eqCnikj{3U3M4?1Vv8YF@qN5knLqV!_9G`GzE8wIqrit)qT$lQ&@Yp5~6g^P4fsYzItGsFd_aIckcleWxi#Lm)dGKinIYy5NIWXfC-RHtAGWPb5@a5WJ!`y zR9X)A^%{H-USSdUZahC0zYA*Bs z6!B@Tdu1FO53VEiPi~lfTOzZd#~W}#aM^sz!Nj+3Poi5h2KSxsElC|bVN?-t@FcRb zF{C8zyzMsK-T_aia^~shJ{X!>zGGCSw^cABhJj`yhWp>w5jPoq4-z$ymg02Wulkzy$op9S>Zeb8TN^Lv z<_{vLv1&F}RN*g7i;M{Eg=UXWC%nKS%aYet;TQLfMgdw;Om4O44gH!xMhy_7L`Ge| zTfVb`XO;hCD$EaYfAL@60cCZk1o$IiVPSa4@Y{Y#a+uq^P7DYLVHREK`bn?Q=659F zSu=@JgIFeG)cVf>UZR4$MGH^3i;~a>AE=c65<@H3PeKkoGT3~pU4ujM#e$HO2HOvR z=`35sVOzGX3BCRP?2J zdPwRgzkh5);C~yNi(BN-<}cpldHOn=7v2p(WH6|!qd_*UIr@W9ruf9cTzGXb?^MN- zuAZJ+hAzv&mU|UAR-si`%SBB`!yAIN-QALae}FkfO#ppMk)6pr{Xrd!;wX}?RKZUH zk$Gxs8x%L%FZ`w*>=}WToRY#JBP*NdbP0Ko?5a+SN#ZC;WhtrR8#h{6uJ;}sIt%Bo zj{M0cM*Y7#ef~+4P2{osH>Sc~S7M*kDMJ#jQ)_K724gFsbg;F0(S?heM}GavIa~33 zH|*BdFRnF3W@81sD@WiINd{sQ>Vht*miC}#27jc@yyu&vpH6%?SXK*rn%9UI93CgF zhAJ+1?)Fdp?b5aqQ2snNF+U#%!7&;OUQrPFbE#q>6N(5Lr`nqL+d&4M2achNiepr? zoZv@-M#6Y3GwdZ_ykGYSYVG~~BVI`M9lFqy_R$V;I6(`!uBQQE0KDDKffTx;b?rm|NdxScUJaTwFN z=h8nPI>)iFK;y@SC&ISKNLX391BgARn3%j_jmQ;GPfz#VDBkg@XUmxaaFOFaetPaX ziQMOCoOE3`7Fr10It@@-l@6rGm4t^U%0Nx3EQVx234C8D(i^2ziW6JyQO`ggtcV`OKh`R~Wx# zquZ?Rd5=bUw})$}odaA!G9fDT=q&^7O&J(fFyDO7%xBi8idYm^ z8cLb19jU~Hgs3NP6u30XaJv~kw^T>BB{qUdZ^U!82mR4#)R++Fj1P&*g=7xTwp`n3Io*kZtabx6Vw9v}NBdu(1?X`(BP_3*3yXNc5 z7G*V};m@S7U=N(0mUa~^#bmKE!9O>r62*H18k$}#7ns91+OIq*MdktQ+mL^&1D?(| z`)V@7`Nx<^q*{7dOTO!et(_c4ok739o)rZn#77qf)<0N=-LS;!JCj&o{Chj%Qk4@@ zVO=F{h(FWVJ-(*=Jz)OmQvy^!aqOoRe>3cVJLt67`m&}PqHZ;;D&9C3Om!nCvw(zL z;QmZOPL2pa>)EXo-m3Ey_I2@qQ8~v0XRl;6l;Isl?tPL9xWJ93$h^dZ7COzCRFA7v zOULkiY}|ivweiP~;)E+R70)&KESfb>pH@S#33w9JLwdS{%Y~z1Vurr+8%)xtCY}4n zdy|?z#E#n5EZ!@nyHf7{9y#u-sFCBdWQVRs-+kT)DyDdaMUU-?-u)?tfYMDT>~cVQHVQCr#&$=}SJj)T zA@h@R;ovp{xd@OPKpFqZoQ$iXJM_2BF8~oo#Pkb%R>&CKSR70ma4+fh@O<{29iA!7 z_Z_v#vb7Zv0(qdf*ygep$cqh}ddpxf=-EaLRv;$qty#wt~Suflh%l=lL}> zGyn*@FUa_V7ps1RXkRwFa1aoP~ z|Ni`U*wRl!8rHx3c70@SEFN|{94;aO2;luK=43LND^2+Wl<7G6`PT#V4~kGN5NuU6 z?}=KM!B#WB0b4$j#r3YwYZHv~($vk%YFzAw=^)-$CkN2m^IyN-WLWIDkoNq@v6-q+ z{nn%gah1wrlK2pu@L-JRSg%a0>O zUDfA>9j>;U<2Y2LHh`7D4PJpI5Z|R^)Ec9N72r%J0%)d|+=+mqinkD~A{Q#mW1OFP zrhAhR*M#_A&N2p7J?6-rEifI>g~~heeR<$H)90j28si2cQLQae91lbkS?u=4e3Ej4 z3{pTY96bsU3zk{%_Sk;i%24YUmyzWfq#&2GPs((Q(qIwMrSEZ4gs6zr?@L_}j2Mbm z^uIcMLgM|>ri#MM+{c_7!eMGRIc2<$omBPSCK2=OXxw)P_s{h>7-)T#(D5Y8nRldd zG~3R0;@O;>oS@Lvn=g8M;*naKqLPkhuXc1N=hY0W3`|$_^F07$6MvAWC!-KR@&mmv z1vfGnUL){%UNL%M7r`w-tT!zlwn_HO!*2ofNCPSJ%R63!r6D>}~kn6uS4GPM8RC$cB zxgrZ6{f^ncaNk2MFfGGBoIh2iMxOI5ZR!!votVH7?l$oH&e$q;0e_aB;1oc5^Fc6> zlwQ8eiUz904^ofQY^xghtg8a>0<*rY&v_NtB9*kFPlKW0&V}Z@crHHFzzrS6ZIEFg zu)_&Q0BN>O1M!pu0W-fwU zN%71bEl`{)VKA7oy?ta3N-W<2FzSA`Hm?}}vy>rZ0GY>K`mWu`4nx=*P+kq4?E}-A zZV#*W&oKk~xtatrDUaG9^aLfP8Z3@ncmNzGUzR1UOH%+w?!7Kr?4)6DpZhwn5c1_Z zh!ajCwO#-$r2`q%faK%i+H!@G&bC}8txGqg}kFR`bBw7-4G!bIrE0EG9dZmr+nrY530&SkqVbTFh?@-_Y3y|{Z>!DZOrPF)! zTZUrpo};6~dwHP%vEw(G6kDH)11}0*-{6SW0aMZnb8r&_AR;7P5KV>Fxwl$Z$iSN zuf4Qwj_HjdEHDb*0Y0fpP_;iX*4aHI+*5sd>_{G~>8XqI<97OkYY+0Hb)u`#9+o*$peiH5Hx&5$-|GZN!%Hg2;U= zGI5ccDFYC)Jyp#d9x6m1c{6=^e#NA@7+8+@Cv{jLVMs5%66MPGkeZ6GG^|3*pb%hw94Fyusphot-pa{Y-yBF`=q@=yw%paF7Dc_xIJg=>luKZ9U+N1yT z?_d$DGT)Pz`Oy`cYCu^j7|IRp$&Z*2Y2BCMkq?khkIfD=jbFtW5M1JWa;@Tkfoa;4 z(*}TfQsG(KEm}x||F(9!@-4$#d0ofmz{p;Ed%(5R?Id@30Aso4AHgRniifip7LYXi zV4vZB-fQ?cSCqAS-4z&lw5v;%8t$&KTdZZnO<-w?wco6Lubb1nJ_lAE6nIsR&Sln* z7UCvGMriD(OA#xVgqfK&vGyVhn|zrDvEM|o@#O7|PWN5%WRJ!~b`4vm{lxc+z>F?U zpK8Fhdo)~)z>ItJIvf>46ff_yvJ+xu?D(I(y$*dwX~>5^2E<+;>>KzGH&DE#cN?ZJBh4i)vH( z&H4ONV7=; zpdwqpm0uS{c`0}p>F%TR0z)#=|GQizpE04Kfk@)pIyu~Lpmlk)Qy;!TTJf`8#{G@BD@^zlrzU+DkLr`Xdr%^lxi0Kj z3pkA*Hz zh-+PwsIcCVMY`zc8maoN%>6Gct_vWhe|F);S1xf!A#5=hq4`a5SYnDGh=&=z2JKp6cJ7lq+vrc?Bl-;?n z`ZLN=HC>zU;}fu@%&M>bUb>J4viwwyf{YtCb8>Clq>di@2@JqwefEUn$HtzhK|%oV zPtw^lFxzDY2K0Mq=)%qA5}uCNbFg2#58R{J!ou4KrESk+Pw2Gg9asbT^fX%B$~aCn zWzbuIPe1##FJCTlRKrrr1>2l?ahrvu=oNzN2#*#Q#ICdUV`Kg43%-vQqqHd*|UnFg0Rd2!1Rjkf^H1t#lFP(=PaB1s9xiY_hKUuXf$P2z|uU@~L`TB|( zXf2GhD zlxO>t4+R#9%j{5;v*2#CH_E z0?OrLM;s2vUuoAA> zr$;ffd!+hrN{B6ubErbUZ`BL9@DlPr{zm=FkUXcKP!;s*zj|)0?j1roG43t!?)^1} z|5Uh1h2_ss0I9_gGhN>zA+L0&5+s`^cD0d3uXyQC76TeutEk1j_P4VX4*!rW>gv(y z#8p-_y&UQ65{3kki)E3WBCNM^-?EB|s$Cb(pWV`GV?j5`N5sURfD%Z8^HCRWl*Dl1 z+TL={Z06LnK3jx0FqCl@Q5+}>7YA@^WW*w!Skl#j(E~_7F|$*G;7V$%G?WI=FQM5^ z6?7`!zkk0|ehL-+P}gPu=bukPArVz^3La}8E;5Qwuf$`J0}Vv*2ctFeiqnutyN#%X z0owb@V;2BMK*LI!Gm+JVsyc+o(*_tlFE#gV<&akVGE2HVE^*_5k zF46bBrF1Whf+IP%`Rv^@*mqB#mWg9O$)03+9{hYKGEY;$#JFjI{9Vu7x=Hw^Yh+L7fpoLVibKS`H zo12?E$H<6>ofR+nOt!JushD{>=J;e?U5nBx&G#&Zn=b8|kX=fFdqvcZ8!Lr6I-IMr+dAGwT zMWky1GtfZJ?-*g3p)Sw>9K`3(NoioU73b~dzI*O`Pke1wetteJ|1E8x-ekiEoge1T z8`;7Y+l_pX&F^GS&H~L;dX&z~g7!Ya699Jy2M0r^Mk$I@r<9&NF_|sadSxjWc3X1t zM+7X9AghwR%onuBriY8D?qe-1EC4^c;q2->yR)?l zWO^MK42B|GX=yh^f>4SMq(uRVIB9<*>Pg>S!oGdZ2Ahh7T*lHS#62v;3j8Q$b z*WKbvMF_boIGTp(w8N-(fd#)FPF|tCWtvPjo;)rA&dOz}Li+BO3Dt5J65hx8%&bkT zq)w}=2sq8^kBpMn33}MIo>{zoXS*<;ao^8Kwa&b!RI|Ha&{@T>M%sL8={ZQf|KX}NueIg=78@v8R4e1+>_@)Y5>rO;A>3Dd+s~fOF+h;+G}lBuqSG0X0+0>*lwPa3KM zNk$E!rhPA!pb@C+Mr3wg9-%(x7)qkf=J}Y}q zs~#uiKR!R6-ew|?2Lm5$JT$LKR=a18ZhbC3vU(&fBpv#Q@yupf6INZaYJi8Xu{h9u zlLZ|U^9a*@%4 zHY#7*TlXRvB3Z;H(hCeU2o)|Al$Nm<+f2-6f-ef${3hRY)nz5y+>Bam+cdkbJf0Y1o_|z0Ty5j_kMzI|y7ncs_vy-}5H@B6$aUXWc z_3;K&ed5vrc~*w=ZQ{6iQJB&&Y`FCFbOsk2{jA+Rk3*pR_IfJmbu?PWWz=6I-THFr zC(o<@&u+7j0V9+iySTQJbwIchfsyw6^%`8XY`X=syoO>|@KMA$W3`!}=DmL!Oo zTdP>HdtbA6rfb=d1^CvAE>z;T6#@bRwx>on@~n0}5ra|z15bqZoRB&>*Zl;IE!e>E zitN}$qejTZkAK$gtRoKO~ zPL1+1|3V8SveU0L-h02G)hQrS{#gBE^E5Q?WU;bdj-6bqHebAt z72CDQOOy{!UR$$+T_lL$o_D6xE^)|TInNzqKAB;Vwx23^dupui?4S3~!^2ZwFO&&K z1ro4Bfl7O^n$y2Z+>p?iY>am>?^Imai|Z7t@iZ75^Z|c*~r_V|6~% z_f0n(KC#CrX|-psnz@>pnL)25Tu@L>0E6h`2!j!-Z(LA}nx3AN*%dv6Vy9ey>Y3jk z{(egG^7&ye`G}wig-y4eBfCMeA?yLGXvwpW9oCv`1+-Q(U0Kj5*bgjcM$Z&D0Y*VQ zk(SBg7iw1dI&Wo_q(PeDfw`|PFYowfR*O_G>#~!T#P@iUT{71q-N3Uq&PvbvJ@7Lk z>)e%v9W8im^#IJ?-YB^XnEKUh%R#Uqg7XY9ajvUF2a0Y72SnWlIUx%C6=u2&HS0zmis5m;V(|S&t-nojB zD7sQ{STW&T#*Pv;FGFl|Nt7~xHkBu$1by^GI(d6LWh&-8vKXP_T+rX6!KoRFscU^z zfA!hR&!5vh^PPt$CH>mJI2En8^iSm3*nYqH#!icI!pbq!|yX3jv$wiuIhQByYx-Rqy zLX)%F#zr}$GYAAwh2JiG+IP|)*w1e?So$34jCq4}tN>;Eg0X$L$ z!^w8A?*mk6brSkw2A*(w5ZN+JDnTr(k#23F!S3%XG2O$3X^M-XYe#_5oB8vp$wO#8Rz7 zs7EAi9DF=>tX5v0!kuMyxu)mrCG?D{Sen<&2z=NEu#*m;SP-_#bxO z0bx=AL&h8r3dN}jorAWHAKDhZa&^6SJrCx(yCszp_w8S`b=~C+Vw{Oiee726D zQbV%C#2;E9HXmI4Vqp6#t?CF!7d#fxHM(}9$c6HPi93f3Z*Gx~YIByHMcHu7 z_e!R!JfVRiBm4E~2S!e?ub&bTEd@i+RCt2ZHBtE?=m>bH%_vvk){$yBMuv)iy>y9F zfhx0p;TS6V5;JRrlCJKSuAs>t%8O3J`3K`QhQA)&zvJ$K`cL#^|8wA=68L}L;@w!I zn;zwb{rS`>T#}E85!in#o;nkBhMI;(g~#EhC#u39FER|K`!(La2rjKHsoK~igUwbvqi2sctHTZCotYvNR2OKRkYsvjND&UI_ODe6 zs*V~c)cCxt+0>BfZp0`1Mvbg)yQ~_AD;AUHG$tg zXP1E2+nq^h?QNQqfC$`A}_C)|H4C)^7@4JeVC%35JxvaRCb70Aua( zM;zp%h1xJx;jd&J*Nv8R0y$Vq5N;N4bTCY_T1aT9*!X+-B6%Kb1gb7%9m{{ZoiWN5 zpkccIHr`|R*i-y)A}n7Gc+R?C;3z%EFrW<8GziDJtPS$r9u;Y55K;)`3oWZ$k@$BW zhoQ5mH)2ZDTA<(wjc>DR^WkXE^W0zD-VW!L)f=p&`VpFwlLJ;A&+2X*I^;lV_Fm03 zS+o+}`*s-J%Cx$do@;03;y4|P-#nin;MR4&zrEO>;hAYZ5ScmS8$F8`2ab=8s^}=) zwaN@$KNS1`*}@a-3a<2mW=O`~qA_d%I*N=^*IJrL?g7^9gfptKVDwxYRj#c+?vrJv)liEqm9Y zQ!SK<{GhnokkG$!V=`t7ZQe!KW^uTUT1OakQi)FEA|TkjA` zHwk95sx#t|a)L%YVKPz=Vs+?t068h2N8dg7((SvJyN`01Q(PQqL`mQ7?3RwQ5y<*2 zq=)bbS{em5-UY?Q?d{AeKnt+kA5r3-b^MGTre&?lDx~kRZ0Wri;z~23-pe(!0~#ju z?pANg)Knky^(e`wzhxs43{CYM=DL)2o#vguQ!tL%tafPFcdiSK9UGmG8*d^cQ}gm@ zxVfb*e7dG3_caXDL1+WgAu}3^-L%xA>chj_s*PWM_o1S1&z=kg@>^BU!0x`wefa?S z?d2rPncfXY#BicFP~4Qn#)wdzvL_wBEh#}Y4v&BWG&Edv;UkNb%ju(dbWkE^MR`W+ zj|8*T34b7{@dCBm`IS#W`%BxiYH?DOh`h^lK{6d&p$*cubg@WeuEbQsekC>!$-Auw z7a^9h8$W;Yu$mmuP2Mj@Gh^CqKwNOQh*W3F!|!g~8$xG59rSzY$Vmj*`+xxLP<)$rBZqtI!(61 z2U4H!P<4_EOWh}r+=M5OrkoLIeiOvDHl4(X1mjQ4&G9BQywLwTiP@~9KgZ!WF?sN| zFRjj@LM3Bhu1F|bSy_EC*gA2V{9i#g=;`T6b0gzOstaK^_~S!*=;&fAc~?SMl_t4mLw5|6b48wF>)%{1=}zpMp;+>ECmHj0wh|JAj3?f@LIm0QbT;VpuHD|Xj}KfN zh;*s?{RzKK6(nn9_O@pkn)uT*T8b_#e9R$oWal`1Dot@%wq3#06!(&;nv>rfvY<^= zejq^3#`o<|T|M(D@j-Vcbn!-{Cs=0OH!?DshBS}Q;@5a+jilTV<*BZdKhflR`SK&! zIaEk9`>s1872*<*I#VoV;^~F+!M;KW*;Il{R_+$qO}4fdDt(4LH4;hM;>&}cK_6BL(#rw&CxLn;Sr40mjs_~rp`Pg<>6=r9tBGUFr*^mm8c`v-+_KRs`Kb$An zt@Am$<-%c+3>+;!(_igdTv+Oed9R^tjQCl?^_$~Ms%ICpRQ&q6n@c7w0b*zaw}Xt5 z#DSD4rMqC>ld&|xjeuYMu8w9sZ|guChl89X_hJwN^0A=*U9<=c%?=G|>ssvnY&~!% zAV9t+$Eg4isubI^Qqu*4o;WxTu4w0DDXQyg10s;NH4fX~WCMaUZgzC{_L@IgyMW+I zu*Eq{e!JcwT>P4{k*ZnyWq~T>a6+#9T5&a}I^jn6Oa{CGYAZHh$;AuNKz|BaL6>9% z2n*EkWJk~RmjpWO?2!rxh|Y=Td=dEqL|7v$$Gtes7Cs%7JP&;XzypI@d&NFw7V7yO zTs=q+M^;Hn+E_3mH3K+PMpar-kqO-jUejjo-xgnmhM3n5J(77K0<+A?aqr5+KVUrx z3wDs?VdIHW9#8t$muILD&nM`L9o@B|^M3$KdULiH&_Jdy0w#R`z3gZGEOC#K!ZT-^ zYHO16^ZI1DG^P@8Tw{xj(cvWy8gM+zD2OM`5b+I=)p+ibCRxaXAU#L7LXEziGd7QT zx`J_eOMFH{CiCYf)4oeCw%$IP?@CUI5FaAzCeWzx#ho)3+8B&+@7%e!C zfFLtAF_GAlH;Vul2|~Ppr6E3B&;@Q|_STc7&ySt19sy|sa=4;v0@&DhbpdjQWm#2K zgLE#)eJ$NNQWNE&2>9H}+S1kK>kA8cAd5Dl#H#|wxjVrxEs72tnsfm zxZ*(AHBSK`cnU`hrT_@*Z1+SJe&T9mL~N|#iz1}yCb0s=tgP!Z9Qb! zX=$t4yLHks^70{&+mo!)9=jLcS#g|ML!(={1@^5YGM1J?04pSZ^b|L0lRdX`Cye;om4>0)k3r`syVNb~M>hGMIH}TD{0&nY6mYmT4aR?H2z@JgN_bhbZ!blRC z(^5dSjQ}U|@AY`JI{@$Ru4>5js1zz9+NjjPc9*5OR+q#WT1e0^Fi7y^eRk)jNgp2K z7fx6kVA8}1ARjZMG#j$^zaS<9?LvqkK=I4lXl>xi zo%)zS%l9-5LrhHoN~?JVy*D#@v21@`Eh6X6FTY5q`<>)<+t!*N$dLt9In{*}3mqj# zYt$MDA(7AAVjTBYa-cCD3n*#O*r?2MzI!52$Aa|W)_BHr&-y4;Pl;23I$;IN;5lc8 zeE4Z@o!QR8^<Q;1p#{*+$WYG@zc$IDjx5-gxaw($4pc_?uE5#- zjUJk61b@Zdm&qPzJNiO2H+fsm!#l$fQI!9 zM>F-C1~r~J7+?|n6owa0b|V5N(xi^7b^VLCr`fcfAMz34eQ63|e|;n0EY$H@*5}3b z$KL97EtYacRywaTwhnr-A^jO>Z`phXR%e2OZzkM$-}O`R!OCk`;_R{;R0}O1|z6&2?WA+ zUxz~a742ClTOFMouDAR0%B~676J53i;nY+#lnN}F6Z{D^^!UM^$Mepz$JbH8-sHvb zI2euOIjh=1aS71B+wbjcHH6qXIN-u{{Dv(q7P(qG|dK+R_s(<}K2#Gm0-j z1P5``wCUIPTzg$BOSPVU!{ak0+K6P-#-?=6(0zTKI5s+J*S!jQY}Im)Bf$5#2N2~d zrz$?gXU@WscU$TnDnY=mS`>(zcz)~d)1=X}2*l-|G1$4AI=I(J`L7Llwf(@0GqrQeV2rvq< zWb9zVt)1N?AfZWvf29)soEo$k>T=B{|A2gIB-XA%A&rTs{?v^#xPy`I zRG%o3PUyiw5ENurw@m>cJOG_5y!1sjdTHhk=`_wLlp4(eNmNqKh3QIyxC1E{ECX0bfz*5k2< zeCFqQbi!K+i#4A@lfXmAwQ-hNjT%xWB-n)dnI4kXS1du~0gMUI%}1`ENrnGC!qIQU z2Y5%gRCQK88lu;S(`$KyJuSZ74PuOqY&ixZ^g8-!ddu`!_ z%Lf4EFdTRQMGLp@{|a&oDmREu$QC|?3T-XZix-k~ z1o-pqnV=u4j({DHSF}~i!liq%9fCY|%*;Qw*TF3al&yRaf2a$9SH=nWA%tP6b5*G3p0w42WiZa)W`Rj%^((9~3NN4hptMP4|hH-Y; zQ#_IN(W5Pg0J&{m0e*v6Yjn7g5<2=c^xR$3mD72(L`B)Mw7bPTw>+|I0zU-XWJMMVtMIxH)oV>R67ZuQF*jTbYQ!7Ub020JyQRYiHO*o7k2;7sy2!sjo8wO`t z<=YMRe{M$>3Or_TCCQ*8&dsa!)<|RRN5%i;v^23m1?(w6+ z4e~*Ke<0so;OSF4khO8Jv9Te>xgZXaTn~S+C4fsz7`NVE!DrepHOE{rqPUyt3$Q=} zG;Zzg>M|WqRjaT6!ILe1d3cH?5d6{Gpucw}ok#0_{(>d8e4NkW%o zyccj{;Dv+wYlTB4xPpj@=?@Pht?b`;^hB1g2kTG@Ous1jwYsJT4^vv^!2?98Wg=RJ z*8K2zbcC~X5MtUaTU&|~l*GLcyB!{~%6?1dA<}4K3DhI4$h;D;&Ooayw6aCHrz(h% zRriY*#Uv>&#ly@vb5PDrJ_8!;3Wo$60^Zqf0`tT^cS1}=I%knkaQ~x%`2K@#K|xvp z$28*~A7Y@D79x^Ew0jec5jrFJ2P&lD#&9l|d$|y|XA}=wm#^l73q(y+bMu$G?WI~b zcW2AUxhn~w(D%GtmZ1RH*yz?zJ`5e{1Zy=|;2i>tk)_`agOO)o!!&&ADykDlNyiU8 z9~q#?pmZ})?!dhvRmz{X;|74}t)*M5Yg0@o&WXCcjP(h8$2<=bhgB~1b16+%WV86M zhU{31FLptrT99HN=em7cvwSBzPV?hV`H6jj%x8K>NuK4laRbmW)t~;R)W(2apu;|m zdB+rJMF?XXNbA$~QfE70gQOf?-7oOy0Oq}=-UkNc?yT%tJ$xA;t_qNMP@z6<$dZ4rjK-OGwRw?L(`&rCb zllPh;4^M_rm`%G&60V@20I+EsBxY<15m;sjJ^`SPM@kls{X%MZb-6=(hlHGXa-*A_ zpC`XdTMtA9zNQy1YhB&899)D2$6jCuv}zPe>h9mmm4=jm@8|H(7+CyOApdvoE(bq% z3MGO5>9|jQTV)Osx3V9HQZz`tI6{k|m^@Ui7P)%-ZOzysjcLl9JaAZYt!YvK6@h9~ z+_(5|NNq3r(leK5z%EsVxW6?}+>$#;=-{0i4De1rVT4lv1?`z*KVc5&BwQ%3mGy*M z_BOeD^76$K_-TYS@G5v1SOds2eNEkZTNNtRYTf_B$>}bGuN%u-5!WSRo@mmXB5Q1EIc*u`}{@YQ$}i2T^Y8S&%crd+t`=;&gfIu{*EfzS-g`*;4>x=Y9xf zH0tt6{P2-kq*AF}vMvsrq0@VJs0$;#Bf(>l6|DY|^qI@R84c)xz1rk)7(GZ4qGill z<5Oq_PAL&8wmTSq1Fmz&(jz7ow4h)&5SNvqEgVEg{iKS!8yuI1lbNRzJ1o@*E)Gx= zkikNY1NOT@m-SLLaGy_JKfiN3nMTt9$cV|dqrc7r+MSiPPmVD(H&22t9I(V;)G8dt zTt13}r!b%C(60`&j((V8VlZ>nw>hpe50TS^*kFyYr;MKqSbYB*7a&K=+1c3Hl{}Sj z{&cbV%*!h=w6KJ~z|ojm`si*P3mW*+ElX2hX!#$%>&P_VI(}TbvDnq|eKwTGE2U1h zem?De3-jFusgXjpJcvz>VA@YLATG@slyavG2I}!e+r25Mw;$`fexHY^$8+%>Wuf6a zz}gVFm6m}%VYtOR&un!Afk3C;kIMA30$T>U2ut85rl%oKj|aCwv;Dn6=opuyg@;~& zpz2#$&Ty|Yym|BH+Kf4#8NxHnxnAom&9RY@SPmyS-WoUqlTS)ThyxC4-o3(t+&bvv zZCY-Ce;k73=zFeGLof_R?-{%DSk;=&jo2EehK2c;gWj{s$>~@QzffkU8 z`QrGXOlUM7j%5Zv4?xNhReKY+j&hpCc9A_{bs-#DEWDTyxniYUF!Q=z9Ul#kn9pm+K7c$HA<6av6lB(6FH(EWQwJ>-TrD)4(xA%u> zw~Xw0?wq}Fs5hjL4RR7okfMaQcN{YZ6O$e+kOZhdc=<}eaRB}512A9W?D#~4WOxas zcYp|wX;04DBMiN{G7b@P;)C#Hjy6`z_rlX*&Ku{D$@+EkO=uc}Ou*+vdml=`xZ*{G*qnU5@|M-t`v~UiPj}RO|X*>xGokUoI%hwv*4PDz~oACLk$d`NMQ&q!sJTE09I9K`tjShn+OsMWjB}2 zFV5pDKx(7LXHNzK9m{-f({#2R{QM0@%E;v72v>TxUma+t+Iu@W*m&c{N?BdxlYu5D zfiniuYB*T!<)+;9vnbHK$|5u{P!>i?bpo=WYzX-o$w$b2A{ST_h1Cp4P;ZA^BE_ry zKSuj7d`g1qZ>|+yg>C;-=G+T#xj|i{J#TwlF=6+!r622nb0|3AR_PaNAYtqG=oren03ivHrsujXVeNxeFDCfMEtdy4FQB6arW_GPF$(qlD-0|5yIfg3kzf3c1kAAa2pGEKd-&n~jX?ov zpsOgoz#7#6=7|)5=QQuU%0Gds)i`e`zA9Y@TUavCD`oEA)&@Mx%Ut=Qp*ZJxAcIvL z1>Lq5a?0uYWOQzg0s@Qc2R@a|ORzvg;uWxxIp9FS|NYN$;r>Gu=|TtWCR`=3eks(E zZwZ7n(YLz-VhG&~_wjwq&`|RM`|kyWCY(2!M*rb__w^4{@|!q~>!(CX95rhZxs$bg z{a-QLkOv%cfRo6O9p8hvL(q8glXuI19DBekun?HLf>Y+ z;hvW*95;nLe}+T{%sC_^GC4=1A*S);uaL;+?}!<~v^#kHlRe^td-|uH0RM09&JhQL zTZjdq2AaiywKMI^x4IzTH*Z=L#CPL!?Itr)^udO%@dLjc(vM_%JQNois$uMon0}yw z5tiI*e#0Jn|F;1=`J!MAqGIx(lM(o2M2F5aEfpp2SU5gO6FSx$qN2OBt_Ten#ZCpu zj)bg{(_s`(HQ;py?padUT>EZ2=&?i4)lKEXCA z3!`=@ZlX{UTBDH7y&j*O1-nA~sdr*KQ%q>($I7uG;^n$Z-p4qYneQ#|nR9N1~V3Vx|Xc( zJg;Wion2L2uG5(T6{&X+@x_j^$pgI%4_q!jkrxN9n&U5#7{23`)5FFHaRu|v^qd9I zMdAGY(-EmX9N}T)rAuJ_o>aRGL5MG{&^Y~eIXSbUK204Y< zq``?Jgc*KYdUfJEcSmT+;>U!jd}|Hp6q9RThkZ;oaG&QRtn}cGws#MA$d7x-BjXj#3007Xri*18k#M-D5}-#$TO~3(*4D$V zr>EJXu&#|^*!T>+5*aMN<-k=xNdOZ&@))z3DUeSqynw6`>h7#K z$Qq_YBg%ohEWdpGl<9Jg>{^Gg^(>yZBiTHZ2W&+&w0i_oe!CC-2^8N8fmlYiZ=lF- z8XFHyoy}(REvwd(;^Wz2O8ZA#(|-hdDe;P8p~)rDsGDL8la-}S zTOP-~9!b8GW`ERm%{|N5KQfZ9ZQTW$hEY(Q7zcG~Z0r@JMHtfjNn1N?z!|T?N9igv+$TP*$!^7IwtjpBX zbW>pRO~21F93PuYJLG)~vsmViIe$L!)rm8tFTT__!u!=S^}$C2bdy|byU5*m)z_y) zdj5t#b>te5GkeTt#yG%*pNF))PA`0GH07dD==;lPU>xTdi;AiMT$%5_&cZgk%*G1) zqh7dx1r)@?p$nE7`C}L#X3CEkg@<172O9vNMVI26)rsCa9B9xkw#J>UHaB>h{o=)o zwXZMkL2Hbje1p_J6cU)eLe$h1;Cc2_q^}HE;NU9FF$y_o|v2ZllPAD8vF|m z`cJag;gbJf70Vt3@WAfD1h`F}InmMnB1B^ELLw8}+s7y_hJ&`=Q;)h^{Go_EY3E3K z0MB7meQSoLG`Rg}rKHr!$ST;`3&J}TOVllqFltqUE{_zRId_8<`b+L@bH;jB6g~rM zvq$hl&S;P52{y6GDP>3;=Fgf9x!Vf4^6VBbCbj`Ab0*7h-zy8LL{?Im(WU}ZQLy+V zs)8~bgqg2yQ4$txrvM)+>cam`tWbneTZlzTu>7y;t~08sv|9&fMjajGQ%101ED
m+=7$0b(i0+GL8K^TKoUxT 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 diff --git a/.impeccable/review/genre/edit-390.png b/.impeccable/review/genre/edit-390.png deleted file mode 100644 index 68f83fd1e12c455b3a28a329fce28a9da93af8d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36721 zcmeEucTf~vyXPPRN)*YG6p$!ca#Bf>5fDUjmYj1`lpI9DNEQJBL836^oTGxoA*Uhd zJTS9|_q*TSyI;Nc?%t}c+JDw6%W{}*x=)|;Jil~0TwPV30QVj)1Og#YcrK#>fnbC{ zAed{nu)!x&3%aY|pPR1F6tr%EKYq8&!@&PBTs7pML5c@y)*+Dl5Cxg1T3%^eGoD_g zFXuYL_<^T#VvMn(k;@sSziJs zCZ2T-9I>JwW%}}Of7r$=vBXE zKY3)Ijf*f1=`teTNd3vvr;_LASj(%cpP@=-_C2mxPR1grIO#@yQcNMn*<4*GlVWWiKC} zh4ppWpeCtgU0rhviyDI`-~!vXbsv%6xV+jwIPq|2%k4669U3AsGBPSJ=j-Y3cS$v2 z2Defz;OOZ1?%fTH_(CN%66W~ZQc{8S_4Nu$N{mucbE6N}i}cwDjJ-^Y+K&cTZ)eRh^vf7#bQD zbG6AT-^9jV*j!pF#|0y~sC{{LwSQEvFTG%d@fL%NT3Z903BI?#U$YewtGe6nl+uAk zu>nS=ozu(9>kcL5{0852#H1awu<)(;0zZ~HGH?>|8<-qBYy}i;Hpk6FLoj_<0eC#n z!~K2dK0Uo^JR_qy7YQ46aN<5|!-aljX4jekIouGJ)$NrI1p1UM6Mf3RG4{jEi}TT= zqp!$7-=Ei8@ zKHRa%^|WDxt9p$6CA(SW>+pz(`guu3JwJV#w-^}hU0rpxq|VZ_v!VjWY2c~)ddDTE z8?2_fz!^iTt6$A}UA?^iySQj-@H#Rxb2r?#K63?{x%)xw&P&{qn@^OLqfE|IOPV@E zcbnw%VraQ9{KKlL<9poJXW2%v>U-H_W)8w0aB(H+tTt?2;*C_u6B+t=XB76`n4iMH zWMgGLCk(5psiBzO-S$+@wS{u|olK&slDaxOOa+s}qN7E&YZ;*5NpyrZm2+HI*4M*( z%-Ij?N^1>x(r9q!0@1lh`= zgE4KoJm84!4@lr{I^!nY$;Xh3p=sGOk=DJOITgQ{NULxVYo2RzqU0j1=#hEb)`Id! zRv%Z13HzPxv2Dxa)61PY7=%YfwA%5Rz~Ga0p7fq`zTC)Ddf{Auef>u;_`^SfBLs=t`pL>!$*QA$R=V3ddKEq%)L@)~1A{LIjzp`){C!u$TRkohIM4(jwp zCgDVlEejmB%X(-J#UhF=C&Gp$n}J(PdUPHhYT57Ru1m4CKt;s+1zkC)?j%fec5#v6 zaaW9$=T711Yp+NX9=%5)R%0o+Q16VT2F+T}UAfUSFRRkeD$HNAv%OE#Vfk7GpR%^W z=3ywFNV?Dwga?;ZBwBL7K_MVW#`;wB9L)3miW8?Mp zQ)C976dfDDOSsL7>7z$&9zJ}ylGduqPFGQ5HzXGk7IvSV9am44uu%JIU}F^hF+E+@ z&rf_|VZowyyWEs*X$ar*c1XPR0wPz*doPQsn5$4mB}FjHI$ksIA=4k1ssimF>_7Bi z?^^j2v59C^^9BuSkh9jy>1|GtoGhU+>9xPgG$|0Jqp5haU(NEk5bifC-~1jwTKD8k zuk%1;$4X%|x7n;zvB8Al`ZJsC*hfv|L4hb;>G2(j^*_1Po^$*Jbu%#?rVDS8QC12K zsHs9PUtcpAJlO+{>9#Q(T|DDk?lQ^_`Sj`2n*YFP-j70GSg~@(W8$Dcf3%9JCFI)F zp%3DFv{otXKagjf!z}u=hlhuSeU4ZQ(Yly~IK&d*By9oL1W%CpvN4XhM_uiFno-58aC4HfvR0%&Y%Eugx z8}$uUo3T0UFYb2t_p&dsqXiJZCm(VR_4h7*HynrXShwC}6<4J6zk0>T#|JsvhRxM% zpNM&#tmpOC4+_|hAFQQyrAtYnTOhj5BfD>K`S)!zsVloE89exI31|FTfqoiMMntAm)5^tq)rd84G{ zV~1%9UdnLsU~y@Wm-jcsZl-pC3Rkwu9&Xr4mQfmT6{4BsfA+geIdCtapP2+q z_MBYWY{f*9xe&#vaCEi#ZCzd1(&na8@Wt^t7!YesFQx=2vWFZr z<9kA#=6q#aP^0d?K1M;oqgd_o#~rL!zSa3F$;-?D{`sM(EBC z$v1rSoU6!4B)#LbNEnACsy=D0kGG#a*ws}NupKjpSJ``!&SqLJeN%Z@9RJDXeYLQW zDXtpyhfWC{q$`G&qwFfBax<-|X)%IhLaS)*>p4k~zwc?H@NF)Qsj(k=Lxbsc`L6{s zN`I*rSAWHJb}qZz@5-Fm_RucYS9tS^vZqJk!_d1uCqt8ZGlc4Q8SMvxf+1H(BID!I za^E2bh@Zc|lQ3?+ff!XpI_q7^J5MG%o}D{c^MEtR8A&CL8~Jun5f&5_;M4Pd*AER< z)cc)NHn7?#%>!b`dvXwi&Wsdjup83$M#dCMp6Lzly{3~gpZnb zj2yPld8Q7?#c+m(?S+vDox3(?%=muUORZ~r5d<4=ie30=0q?F#+)nJl!m>bHOsvEY z$u5-o4uunmF)_V|k=MVC#iO_NEE|qZr=(+(v|b^!(JEQJyh<9-o2ayf9wJf%Y?G>0 zpLd6!zbBv;e75kJ^NCZLBf8@uxoWEz4dGa^o|PA;lvJjI&|GUAqdW$ss5y`O#-GM+ z&xg?Oi)~RBxz6#OKOJUzoe*PRN3^akuS!1;oL!uMN=oXa54`M|a^LJ0T~}Ivi;1&$ zaKgYKo(7g|ywNMq-)}m=df&M`M$!kCnsp8G`Kw{A+{x!6!dAQ$3Z~ku;oj;)YC`16 zHs*ca2MY-mq`e%E6leC?nE&D}7HL zoYJa?CNoT3ad3!e+sy^9>ul>Y=>qLac6)f0$co$EaFP+>+YR!TC$|?srRmkfn{_h8 zabolKMsYx1{m?e_+R;V867##e4<#Adx-2n;cOAzDQU%QZbQ2Fc57`zsreGg$VwP^~ zHl=URdLs;2@r%UrW*7A7$f$a@CRtRY2m1P!phkgM^CN0f?g7~;yjM@Zlh^Ui4#cyF zgx+jIFLaHJdCWIsAgDBFXJ^IF+ounG95tL1j$v~KbslB*a6$0~@tVbmdrZvC^9$=O zs4L`TnHf$@E6Fou=I6@F_xbpS&mD``l;R|$GW+|NgmGzT#P@a;m{W!9SG(gFZ{EDA z4l^`ZTv}34QV~Pc;p^ug2oLj(7R7C8>xAn4&~8hUR#e1olaF#)XNztNC9v4~yqUEJ zKUrU1UL9`edI=Fn9%&B3ZNPLpI5<$P(Vf5?pg+U@vW8Pn_~)3Tr@R0U1nz@OX74+Xy81WU4jvl-q8^us9pTJBLR*gNd79;wKH84 z`69c-lPeQ7fA!OGoG?geR==6rkxO_R`6&V*&|8j8HkDDPd-rUs>}O`FotqQgFhG9t}ySsegNheq#mC0q84U$PV{2}gaex9Ycg zVAH*zv&}mRr+I#SKaB5oOMc$nzcF z-S~`*m`QUNRB(59xA7%`P=*Wj;R2)l{x&R<%}IE#^!080Tg@+oGo5xDPN|-~ZOwjr zn}j7kB? zyuH2i2(W^-@NQw@Hl0}{YO)4p>r3*(#7tQ=+?F9c7Z+vFt;90R`0(Ya9&;;;3U_!F z-bPznTX1{(O$g|wZib%D$A^cEB5dIUdV=vu+6QdkIyySr@6g=spAxVgTDN=)3MqgE zmZupK76G?7$zprV85kJ!Jzq)4*VKsQeEXJo?lCP080f*ByLY4V5V=CoHC(Fob?9lZ z5BTuoQs+3bI`tsM_9fs^N){GYM&;5SD{TCSUNvcP@2@#t%lgh!W)@OX(vRLrbtDOY zQA&MPRYGrX3*=t1lCGttWwO*@h43}i{BU#>w~l{Etx&)(!YGUkC^e}V6U4|wXylGv`VV_EelXyTW|q6IXT80p}se3-nG4G-e01k zk?{G$`3!@WH>^AN%a<=fX6x(bmKMZ!?l|>UsBkHKP*d;k?R80g!ur+tPMnh5Z>Px6 zP#i#jy}Z4t=#*DZXb4>n54wALS}ZGS4DOTGyqA1I97hsCSL+I(Rlj8g|NVYTe)34H z$jPXhiQtOf)V2k1b(xo!HxOu7SJ$4tzB;Dj9c`Yl?uS3XuiwHIMbERR_>uo-qQo`% z4SNgjRR+IkQc!|aT1E!-(uCV-bGm?ITz>`!P<_zk+tB_fHa(bwv%4+>gG0$P!iUG( zuAD-%Jj6y)QUT~Cox6AMdM_`CoSmK3);=aChFRUl$IsZ=U{Hi#jeK)G+k4=U!jrVZ zfm%#;r1+h8TKWEF=-&8&6eKLRr1y9{I#&-yH(@7uvNMC(9JVk{On$FZK<6~ecAPFJ z_nXV!ucrvx(ZW&VC+Md@#wfQ(j*Xl!GPo4*b;xwpp=r|xgTWx~HXQOA1zwRI8u{0> z3p$tWi%TLDhDSzvsw_yzs5&G@zLk3)G8+aS+uyixW1_;72!P7>AtAgz{kK4oO)sI9 z@Oh68KvAJDD=vOsg@x&VpSFns)I40#ByrF--JbZ$){Bmd%OqM#2ffCZg`7X;Ma_pz|OiVQOc)SbK%GV1; z6&0*6a?vS|jP@zQ!xjGg(2OlDRRmq5VmXf<@a{G^Je6n`NeZc$R8F6AM{hH3vqH|# z&jE~j_UswBI~9q=%d5!?HdFQ!BjULDhhvIgPe-rLyw~prT-g^C_Bs3W0Ktoxf_f;e zrb02d2{fDK<%u`H>mSkw9MN$%9??LCB(J_!s5}jjEGUpqMz+%+%8QB)rR-1jk&~s) z67!OC*fQ+|{usg7_)Bj#h@tcn)t5y%?XMMzUN?NzLh2uk#I|>KI=>t$OdJ7pdWFO;vrxXR$o=I>AzUQg^U#&bs_2fnnMVv2MaS18Qw`| zT`|1dC}eN`a5=B<*dx)OyFoqXrd@;S`1kleQ+LfhfeYGK?_B&|UR^QJLg!9G!>XaU zRQQ$g@!l4*exRa&nF8wb9SREh)8ZMgH=X$80S#+uNSlc-7~ar{n4yu8crfDu{qlOV ziZ5t4ed|f+$#%i(O7^#JpMr@ifprq+Mg~HJ9cg-w`E4r=B%v!l&lMBHoB_+kI^7(loM@hSBS*c$K zuBEv6NX;RQ|BU<5+H5dOhTpr}LMmSrS9*)|D|$}I+jCYXL*7TcfKHvGLU*b7 z-tYtj1Uy2a#0>qn1!8E$Jct7~7&Kn9oAc0!x`kC&3$Kb_u)63dX*nUg99JxU}fC5zYddP@4m6q|rbuMaWhTsY;vfFM;l_cx>}045-MUBo`Re z3GOx?3xYAQ0FxA=95|2RN)3=+T8ra1vI{)p*#b4mEXxei(Auo7SJIJM>UEZ@hl^A z+Z(}^UjMp84xQDt-`UFu#7MoaYvb82;)wd!9F;l2#yAU57{95cd<3wrq=Xw(FeVYU zOoKv^LffK^1SM~U(Kk5TTT9Xm@5d^S0tS>5?V-P>o3Wd43Ib^T%osjO? zF#~`gY7kNPjhoGxedw>&BbGmF%gNA1=Qu&4m9|Dl2rV%Ysvty0;GhW2Rn?esOV;Ct2B!Bh8leV0*D+@C&QLO4u#PPMzlzTZ!yT zk*k;i%f7d*3$#HT#lp__wp%~orP~9r`5E;~dN6a7DRbidbZso1Zl;#{0uL8gw2#Hf z!^Fe{Kq5k#OQD-pj&lJ|^HxJb{TtKEe-pQj43Lk)t*Z zYy2gk4c^*2?HU@21=2j?pt-qOX~)eduFv2DGQwkdjrcXpVc>_*TvTjq>_X+&^javC zqAQl3g_|1y7anm5iFEr6?+vy9!vm6+sw9-i(_NhV%%UL{O^;kr2PY>kApG z$R_z4qu*aHA?Trd?b9`oqPbE!+_vnqsv>PXYP=GaYDyeJnr3sp-vvueB#Uh!giDBr zQoLTj?n}eJGNzAA!aTVlI;R^e`eR_t10V*zUA^{NHs?~Snh`s7pfe(oDy^fu68LhN1Em;{VJS@jZnLR0Kp7{6KQB_sv$X1WnBoK z-CStRdM9g93?zX%}=H(?fc%1&&>}tp}uA+qH~*tXDN@Z{T3Vi8@hS6+#ak-?$aCkp|HM5?cE1e z0aOw&Nqmh3Q_n9pOVYQ?D=NaHqRd;Ph4$x$q^x!u8}g0>uGf^;l8QsdJB+Li--ufR-6wUoU>|k7M&$*%BZT^8;9TX<745 zX~KMLtWKo6%k5}f=%k&X!)GTFFslH#dx4_7j1HnjLOoe_^mQdt|&$~n@wIB&hwz^O;;4@&_jV~c?Bo6-zfm=QvUq-x6^hD z!YJVFq@CrT?zo=-sJ1r>I!v|u6HTib8q$G@U^e}^48Y$EuLFfPS&x|bF%FbSI-rHs zA#BW|v$^PdyY*)GTvrF#D^S7j-ht|5-j~E_MI&DVN^srj)&nsyWEzr?hzJ-WqM=Z( zZ=Jt>{nF&J;}`@}o;{I6jJu!1{`ZS(OyzR6w{X|!^z<~(Mdl{lbIXaaCtX!$;pWvk zS1U=}2*;-XVoko2v;vEm$JT_1!HYWU!_~tbq?_39Lw7C#K!1~TSs@PziO4)J&-U+f z=W~SLc)C2S{UG#{jLdQ?ptS#skNkfKB(E*!zyB%}r>%HK%)sCsFjSpF{lE4FKM>=H zeE*(F2l{|v(dG7S1)wC<)Z&lhw1uc_TC11D753dBcCNubzE@^4;-dq7dp&>)8w{_j z-l(LGZBJA?OR&i+B1C!tT8&UNSpd&^|8V%>%(qLWGzIMlp5eFjRVx77Fa>@VxlK<9F|NE~N7UHq)v>#HkgF7IOb4h#^QuFAa zSpXL%*&#FGIp9$=zWGo!D*AswS((Wz$sw-{|7Amzv2e}@<{bj{fP2ko8N7#%Plw%Lt>uW%ZOa5 zGKZOa(6N`Fnw#&_W$>mtHX5`8v*PkAlA6y;SS9uGQn9ZCsKO;$Hl%TVN*}~cLHWB~ zY4cDcTTbP>PSZQC^g3R%i$_2L#>mPtDdrlw&(0T-pa16dV@L1V&BncHaff8TR1@99 zRnG9p$ga7$CelK1CIxUN)`PvG^~(xN0U&7L-xE$K^gUi(XUQ~c&DjUty1G^zB50>S zbVgl*So_V0XmF5`vDi9453zvFNG3N2JsFP4O*Bnpa1kl^1*QxOODL9OLrg4;$e`BE z>TsC`BrPy;@Uz?t1tD57`ThKA4b86H z;%(nls42x(v2DP~$KcEhpiWjAz#XqK48xrf*uM@{Y$^_5RRQP=3z9A_QetNx6P-wVs>nb|c7?M&)X2KJZ*khhQXRWCIC$ zd7^L`?QkY`_7v1OApkGrL_|c8OUxT#5fRM1ypxkU8m9L51nv4OudwGq)&vF<0;a@j zjg{ezX45jzDblt%$?+@?!=-wcbEahEyC`Q*0UqTu-*aLpl!;4BREXZt;W^Bbe=}11 z!z9&xbIj_pI`tO*EvEbTKW0eyI1d?|CQc!^8K5D3?36%k1{M}D+MXlIkvqP(3P*cK zhAu;Yo5}Im9H}219e`D7RuD^)b8@=1J>@aq za5`tXxJ(TJF2;QlmO10I6C?fL3xb+*3)|sgjqAgiRU6-0pU#1#&0;4tbH;E$i=Ly? z%yAp#;~aX>f3!*hI=uZm8C=%uir!(|my)6{Jf0)|*-M-VxDO)-M`UMo%EyGy{Vl;b z02gZgcumkOVi*WdC;-D=VY=cH5=+y*?Kyqp$&BdnHE@JCCQA5vV3t}9IY?fvNd%y; zblOg!mq(0%4k5Ixe%AtieyJhMG@Ab+{?Mn16K`nn^+}(`0Um-;(0;19%&cqg;6U)b zIUrD(f&0ma2tYJVL3ZR;tZ<2aM0f6X`DZiM!M?u8KR>ltX$0BtCDkBykZRV{B(!}% z-t#g)!M7AYy5(*&zOq17(F3HDKJGp*REHJh`Sa&Dj8}SBLXM>_*RC`Qk$IVcIaaZT zTDXO7hMT~rr46Eo`Z>O8v_6ze5wz|k6R>faZ${l6uY_+yKKDasPI2P;rYy+tRZ<0k z>r>{wNe%(wB8=|A!Nr0+w5uYLfLaLRwD#+%L%lUVF>&HL9QhhRN2O50^gW_m^JO9x z-QCY|?h6VQ_uHKApYZk*QLaaEgnu)lB46fhmya?Z|^(5#q`>teA`f8LUG@u|X|n>5qv)+Gabx z^s>z84+~>e_P)~gaW5I1g=w}X%C6pRkiEn80q2q z$#DM9;5u(L136*>=E(ix#qWOKbN7JDeP2L0pMu#Ph&t}V8g<}H_CifU0h&aIMTh5t zWCGy4hm&akExY)5Ge&XocUjVMdo!nVE_?HDH80NBmQHJGbsRVT6!&dw?wB7YsT{2Z zkTJ)HJ5mJtKdlUZ-l6>6>si@y#lh5tof+Q z$mbpA5#ceO>rEG8yPrFO+NrPmPSec|AArGf5kR}85axh&?6%P0x4li%nU(eGs zzoh9x5Ez^I_l9FZbG?CynQkSP-akGL1(0WJwqmmg4w7XLA3fUo38bpcnl{O@XG9Ov zOMuCrwtoz!8h^;M7pdDU1DN_zM@MEkdGuo2n_z)&^-g)K`de68m01lj=C2_tU0UcY=L0_#muI--?8;=FR|4b;?!uVWLZ7t2|tq=ylF|=^;Jl&}n z7*^O+d=xPv5+u6e!MDNMw)GDlx7{3|~0X zNQa)#TB|n^M^g)}01Uf#ddkB4Al$*gw-j{NlO6a{`OtHj944}pu&h%7e?Z&0K~M?L zW>m4ct&Ic{*`YY{Z6G{69P9q$#|ht5Qc3R8yc@OYF#lSb-Z80jbwN;|-GE)jTPE&= z#s@YT#+v)6z_iFQ-Pdfhd|m#xR3la|Dl9o6uMH+s8vToNt>ag{e7p}P(sV(vQC#^0 z^>yPyogKmsP_JZU275O)ZbXRf1NQ<^IaqEKAZeisa+}W1`}L?!4!^oH>JUPzr;M=;gVATK^qeo*&L3=v0=Bcmq?~HxN4gKCT=z7yN*c5?nsCPhzD~S)Mg4$ssd^K zKNxACeFKkkuPd`j3=TqXAt40!!~zGaCRtfoor;l1{Azpf-KNrI#6ys<&ZvD5e<;P^ zLZwiYD6?CLtQjDg)~CY3^;f+EAuUw5U*Df zTsG7I^(`+i-=Rb8k{}ou*Z~|+s~ZF%n;Xr5Y$*C&HNU;05iUi4-MAa4^yhE+YJ|pS ziS`c}kfrwa+pz=Dyx#oZ(p0=QJRn$rPxm+hC^&%5fL`7)G?e)k6PtPrwlV=GmFFN< zS`UaL11wM5)8l^K*GIo=TW!|{DsDG~b+1^AZjdpJDY{&9U2J-zISrMrrh-`~uL#{1VgB zXe^a8I|kzOKz@n~NH)%@bzj4}sqCh!>FAA&bf60tR+4kqW*x1Zs18u~9UbWbK*~Hw ziH+sfE=-JyI&$6M04ptx<~kN&pa!8aZeDw1XN$Cm|iTTa&yeUEs#OOS*x2dL|doot3$dd(?jM@pFbL(y=*d+ z(1Cis7O*vZ3Ie6TZTiht;_c)80;WnkRcXEXX^KlGJA~kT*9t9c(|V9PfRX5}V)=uIqC&vmf?k+q!-4Vh(eP*R2Ce~%l;gY|J{v!HXdJp#>^kLB~} zKZZn6^CtnoL_$N_-usfnd-v+}97u$ST30%Me6X9K5xw9Wf`2axBs(LU&@nnjzR_k~ ziUIw3;DaH_jA4cdo{AS?tBNi zyY{PC0to8*?(W={Qhce)IZTjR_ie?ii(@KLzgGqIR>W+2PEKYEf%UutZsy8$0 zfZOkPHjBJg&dX)-0-XQoJ6ewF7wpp0l5T3l`7n>$B>;8>)g&M`w4&%CI+sI%qxzj;%T z%ZgQcA0t-+K(_^tDx7{ZSh0e%(2r+0ZS6hrL%s*z6TeK9>(`lqTR|GqQPW+4z%Ul1 zYMKOW1k>qgEzY&rg z#`<;Yp?DpRNDIv$T>jsiI29+(n*&0cFjaey0O@Z=f&Oeg+xG#T*%gGs%-4Z&(Fg85 zFyhpI9?u+Y{g;_!*nSjBCu%mwp;HX`;$P=MBkuNbe9kLdYZexk@B`Po9Rv>X(cCpE zzuzA=*%Q);cjIw4UMJl_M(8W}zTI47I+(4}JPCgsUq}%~!MRv3(Htd>z1O}i5fS1o zaz{)>C2zMW#~$=r0Z<_ofaw9?tMTQ8vy6<)-s(H7L3P%3e{!S7i_B5C_2~~L(jh<+ z@67O340_^`BDWKAlHao&CunJ`uB?&Nzg0<}(+^U{e=w zz*hC$p&}6JFatne>dG*mX4<>!@oK*Wk}Yk8lZz_`Y*PT4h4l@MK?N@_VeP_EC%Hd0 z2S0$c7u!Weh73g%N8gDXaRvTE$R|}Z@NkN`7V2pv z{m$Nv4-E7Hp_IVNE+2oB95yhQ@!@mamg-{{?&CA__66^Q^7C2|{ZN zgh&}Ejf1(T zfuElu_yb<%yyT-1qkmQrDJ#Pzo7mc_@cj8A*y3__49hL%>XLYu^&HSC@VS9ONZ9il zMG=?J(bNWkIqK~{u0weGL;rWvME~L#kmBbNlatFSD;HfmI&7ZWIuzpI*?I*TC zOniAhPXE|$;&Wbx*I-Qr7m+JMyklBKEfIbqBQu={HhFo~7Dj#+ID7$gAlH%iWsi(d zEK-+e68=biJmFV$4g`>al&bmK&CXv{?qV@C60Hkup^965ZEf+q*p$o3>F_3r)q3`2R7>`R){`NZ3zz10PGBGh`dcmXtMI1?5F)m%*T)F z-~+11#<%F`=zzvLT9XcK|_L7n_~A*uYFM^;AhEikVlJpKft&g)Fh zYg-wyf}UcAmIE(ir}2~!Vwj9(zPdOcmx9e3gX43L!0wPAfF?xQ zA_;_T2}&9yGes*mZ}6ZKp=o`tE_P8=LJ^=!tu`Fp`=M89vG5hm>+^?l%R`J&jsSbU zxZrfS%*<-mf0q+c3sX++ev63&{7FVeYZcyMba+rtu{M<}Ch*mtOhnT4PpPFTJmM{uV4-YfFUzKejL>k?|{{8S;1>L{k+O}HdXmjNjQX{#pLQ}BK z<|%hu?;Vi=pmHEx&eey(9t*IK?y=+Sa818C-~PrWmcEb;{y$k5-Hx9G!&g3#2M)#| z;<0Og0z8K9&(4h3(VMN$)W8MB95;|k^FB0sRFz9&c0s2d8(Dnb{1y`^1tNhlk&!s} zIXE^Gs_5u4>Q7t5q9_I4t4Se0=d?4eN)`ie@O0(C81kyp21_Bl=dty40?-(l)oK$# zzDW|jh=#lZoC?4eMv)pqd-%`1*P|On2B$-8SMT4y2RIq*JG%v7w7#o5J*)TzuvXeE zD}L9w>Rc}XVdGL01HBl6z(BOCXzQ!$wLq<6{SP}cJ{sAbWY`U#H%{Y_AVfQv#NBlAAcL z{4Z@c^^h5ORTwCY99kug{bMkaE-rQt1Ngat2ZHyd-Q({Gx_*iOu_=;Oefzyva%(*JW;_ure)|Jsqb0_mg`#3dT`j*mO~`fv(I zIh7t!fNd=kcGq~{q{5=EmWH@Sxq8%a91ait{?ZosZEURFEJ8xD?{3r;_PJ2S_b98Y z-vSpN+SW4LP$%s1Xmr#f{5cjvutmMbg*1^}7VNO>sIs>mG>Pt0a&r^s<=qD5BMjpL`?o_Lj7x&gC@-ENURV=H4=OvE>rm0pUY+OROOe4Z9{?TeEg%qIX-8W==?_U)7kcc{w- z`^a8^Q0jI1^>||}S8u%7?`l9OL~yAyD%TY;2&AAgkL@YV3t{*sm^*Uv_*PC!XVjq5 zDA!yGUbh9_X<;q*xrPx+F-v^j-@k9-VDWwlL?8MX$h6ZMe3HlaM=FEK4#)3{D83PJ zy1gB;0=(jznOAca6hG5BO6ot^!(rF^0|L<7Lclvy0U{gVNI>>1-k6O4`SWq{&PeL? zv_41#g_}r+K3(`BIe2|Xb+t^fl*7Y>adFOn_6oau`bLJiwg!Jl)SfmUq9^Ni_gKGQ z#V+ltJoxY)V*T;i?FR(U?;jB=zId82`$9&YEy7fu7>|MW=8H1pCU%eazE=i0O2lu! zBrv_ozkTP~jR#nt22iNy<I9eZpT$Wu0YRW==3}teD);=hq)GoSwN5;{_V~1P|e&-nA zJD(LYZXVTwi8nhL>$}C!N5oNNQv{*i9|XW}+_p4GTe1w};$!0vSneZq|bbi1mZm$vNr`T4mo>Vd4B z%Mo(8HeEmhD1C@JL^#DKAy@&&nvxo?nK4$PwV?Y+Fd=ae@f)&9R?-!=je^*(OIAZE)}CJF&+0=riJ8xJZW z8nAQK#ie`zth3(xBf$^2xhaT<)GGR_v%Gw?LAwRy(9wg9K?6IP4j-s%UfwVH>Y}J4 zGL2pW7V+0ntRuk-dkewB!oqh*wc55c9BvsJk~zD(FYPTbRVWe1@%0`V3;SO@?&$$L z5x+n0h)5jZ%F}XncW2}&6=hMSL9~avRect4CATmkwXj&8nyrWT93c2Mt}bXkpBl?RZM1o`8~y; z_2rAJRgEhbPT^#Opv$3Ug%PmhHfpAh#M|J4k$2Jed zW}GnFaOO>gQthMfbNb(niXUQ0v++93e~gsm+WyD)m2g8ezC6R?w)yb>hH>R+xDVMQaRjBBz(!9QRjZcrBz8$r8+Yu$|u)P4-0#KmxP28eW?kZ20`jZ%k?IT!{1%>kiBJ+p;EW?Si8CXF8BQUvlK!5 z!C*$Y#nsiA?Ck6-+TrBYCK2cgN0PG=k}%5eO~1$x+)fZ=%_k>y>nn{V!A6rN)zQKL zE%eKp-!#f-O7JidM4J|+Uo4;igW*q4J09yp!u+r|0d}pDm7_j+7aX$(^$EP1Y|7r-4cH2VZsU$XtK?JGa zb1pDAUi0ZWz#}-J@1kt~vI!KnrYht0raYSgYr@1Kn%`ONe2*|PT`O%dH%~L34|?F% zRL3H(5i`GukY7sbK?0F*gm;^w4NEK^c~69IVG2_ z^pikRaO!i%!G;}M*6&8gM$yy_s8p4L8dE1Xr{<0hEU>4Dk584y`alV?1#g1-*-GNg z`hfVA8j$$b*R4BtggCD#NoTP^wnRQxF%bj2=EkC$$h+m|F$s8pC7scR=z*L+`n-10@K#rn z43ojlioK&EP z)0AJm5_bQ(F~4@!ghyK_up6PeSLey{t6o=$fie5dbTu2`K;wHa_4PGe?vfb!45GZ| z8XFMyo~tL}+!FE{F2l#HyPy6l5D7muNbs#@-|k)1Pgd8|jMV8Ek)zMRcVhMqBIA?y zrXxYJaDpNaBLIF$&6xsQ997U9f{*J82~K1p*W!tsoSf!YC|LLpT6jSQCexKdM&UdC zNHglN(?|$1zqa-qp$c1CTYEDR;DH=|a-6DktfatBW{ZD?b0R3NsvMQ4lUcVFD<5+& z1}qZr4AUxhizY|T=G#0)y!l9i0J*J_5^|gPQqj3?fu6Li*#E=7)ZN?5Aawc|Zw~q1 zXy`2R)$m3asXl|1r6q`z%hpxFcrH;mPR`C2-SfV>dxLt{Tiif|z8A`^rtIe5h_d|c zUbw6AkGs#&*vAm!kD`)Dy4IG^&5}31W1Cj4@;W)qZ3?17@uaf-&JSqBy&%+gNGaV^ zQ^B$`#<+nQ+}+>5oRNiDtmhB?dNGiDk;{}A!GX=+pDvWjsTTlVJi>f=wnP*nmY|pd zy5~wCG_NX3W&`7CvV>Rf6#aTFGsfjl~4Y6qtZ@% zbwRd2RJBOSBQf`H?=P>cq{CFA?+NUk9$L+z{6W~(==9!z#^7XfX{pmekvDkHl+kz@ zP_LD@e@*4ktAPZ^LTwBu12j+TW?Pi?2&h9pr2v^`6cI`0)PsQ+XjjVY*DER z9RH)X?|_PG-O?;XK_!WR1W6)6M1mlaK?OvSpdvYgWGO&$Do`XR5fG42R}_#eBC!Y} zIg4b9oO8}`cG*4CZ@S;~yjkzfUF)vvMTM$U=lpx`FKzWO>~eA9_sz|X!nvLTE>O!p zpU%?s$eVoxGPSy;qM6ly?R{RDDttfK@@iB^fMBJ#@{LG&vFA| zKRr7w9Z`>Vd-vVgLReJfsT8{((BQwbEL2Jz%Oh7%yA?Hci2}|%mDa;806pedRDuAz zYG^3&W!uyumXTiYoz|6tUF!{-UWcrAX$GW?V5@Dq5UDH@3F2A+d!QGZkgz z@28*jOLqRYwzjtI+yR*_R|U6d+QXTY!8WzG?7tExVSfn$XcDeHM}*J{et-*h(|K6u zc>lo09Ze>=%dAKzm}*oTRAY^;i%M4!hAF|deg(!8z>=n5+=4@h&O3;Ti~spAW>M#5 z;@cYePTV%!F7cZ`=Qv?JC>^vT1TQ0VsopKj_=KzRu}9%bpVEQTQc0$^kdCe{p37Wq z;ETasE+*6=`3^DTJ-DR(7#m)&+aQ?1(0Z`UAdhicf^+FPkghEW62YBm%J_VX6$ikd zFkZfm{HvKk_sb>vmSw4v$KvCER!T$B)NwF+twfkB?iDM1py#xs8VQ9pMm5swhABRqAL3p3?rW zhWPf=708nlb)dtS=bfm*<6X9Md@z&E3$t7mKH=~04^@C>-F4k-FWVS)2YiNlVI?#m zDSF||=Xl>!sh89Df%5X7BIpmP3*Qt$-Pu5@*Uvoogo*dE+6uFh3roAcOu#%pHh zNl8;(^G(43%6Ohyp1N%BQdL#e_U)mSiuk@h4L?#0&ON1vT4NI(bmIb~kzUx=yN`gx z#kuO#GJ_M7YQ`?s>Wn!J_U$J*6}*5P^>8pvL!}_Qqp>v5g5Dv3@CJm7o6E1GWz5>v z)>L3x5-SA8d>t^nWz*C0%M53~Tk2My6S75|9B#CW7%?y!8A*kK4i;1F?5y4zk zMVU$E#fyuJ3P-W~#I(0)zztud=Y(G2_CS*+it_I!0SL%C3W-ZIN{K-QE5^q47wPF+ z!XKd~bC#Vur`p8!T=!lA_I)32K2XQ9Ga$>OqoOEF9V_F9kM{XbT7{s0-kj@>_wqaz zQPjT0!No=7&Eq`W2oHRMKo}qlov8}7(4v;uw0!DZDzY0nsuqrQc&o;({X556O!@#` z&+kv_yrRQBakxBz^CNL+W%#&p{1{k#iD}(<6Oomnz>{?Snl4mIoEu0Xdie0+pp=m? z@Z{8B4XJ|%T(aCvU^%d!me1t^!hL%=#UgmxW2bs&(9MbvZbHp+Q$bzKP@}FyX};-_ zR>rgRd+=`BwA=d!zFUT3Fk)P4IiKORb(E_sJ1q`AtnTx>6%xv=#>DcJU%s2FI(+2B zwyh9kVH?%s_C@+l$+E!>!mjUNpwrykQWxJ@beZo-Z{Cs8DdUA_7ir-|gs`dHAe9TF z=bT;1lr6?!CdQwJ!Bz7kVNw!_dHJTB6!dUTpkO!!+(oNVFAd`*rReLb50sRq;b8B>F!NIjG!+B!?bH8bv4xICnl8R{K$BxgYs$5nq<1r>3R`i^;3X zN+wd$GoEThIcizGs50A|6?)~R4vW7cMo`$AH`MHp^NiTukqwC#T?mf4pK_fBXn>#T z0;!CojN(6jl1Y_~I>^|uu~8+MXY3y6f3tRVc7`D;Pb=FG<5yT$niu)t5pnzUPCrIwX%w>IKwH^kY*7GTgzd|hKjD!0 z`dFJ4M0)=9Ay?Sge0`Zvz&jJJZmk*qv~Sl}(*^YdZ&v%z*C7}$Ml(*`ygKpx?g$dO zZEZG^qt#`)7B02ko+ROS#Jf3m#~ZV}SjW9&V+aPf!(xYXaJzoD!iJ#$8^%-s?x6?3 zpt9sah#!fOMMts-xAynR{BWtUR}p03EC_4%sAYMX9Tg<#H-3HphBwG_D05^fxyPr` z1xh%N@Im{Q@jU+9VzIS%#xP}WQzo%iSN~kZt}HuIU+&E|+iZB!m7}_r-V-6l9m%isw_Zgf;k8l)Zcg9eaUxWr<<(436E6pg01@};E zo#R6K*5sw3IP%D|$eV@Al zh2s?dDVNz-gm@a?92!lSKCzq}?|9KjE~5O185JtHnKvQn4ypD~f zF)}iOtcxo!{0EtpVR@dm)%v;!Bc>dQQ`w_zUlf@vg}|_x&Roz zN5?uoE#*qVGxqkv#Q1^lJj{#Xfnj0ng?I7Um0}G>jwjx+WpR~RYsj=1o;#nVcc?G( z?B0A=y3ZM+z`%0}ZLQ_zSo!Gd9iQ!tU)pcS)d4*+_&bEbcdNyGizHJpP?EX6sF-EKrfFav*^)+Z1?Gs7nU zXUp4S_ae{plP$gE6cp0Wp0jFCj0c2=r#YEh>*(n0F0528GEKg;wf)QR#SM5*%$%IK zew;>fQuULYqqw+uzn4L!r!FqlS4v+hj8U;Za+L*QWhZL_i3{tjQ-Zvr?NNci zj4}cD05AWmeJ_vG%CPk={j11G3OEe@l8?@S(3{tAzu+e37d`~12~Mv!?>hps@g)Dg z;!Atw$hWZpVDPTGTa_RlSCv%m&b#|)6I7>x))$CwU-nw;L!SIX2gJhk0LjQvj6z-G z`S4%ye|D_-#|AqkQ)=7P)zt?O>(T-c_hhLkfbnnM=$ghDn!)Fa6u<;bw`z5is%l@n z=wx?m>r4L>#Q&%R*8j#|?wje-^&T4yD<_d@{hRRrPq~XlRnnCCF_h%w8#nwa$_ZcI z;O^ecB<$>^Vfo1tc;Fe_4}5Yg&+-np%p2Jcx_*0AqtnYsH_@PgD1vk6Ft+y2LKxx= zpO0F$j`@#3g&`hSj4=MJH4^|Lw{CcLxI>IkrxX>^$ku*M~ zu6J#1&7bu0n{G?)HBd6;r0_Eko9%D34=E%{#`O!#kZW;Kdhg#PDYlultYSS+EsdJ&hnCCkhF5{n#~ zd-p7Fu7A7<_+-&e(7ww~dC^|G@*})hDI1(!VeoeaKETFYJ;%D3;WIznS9nLIq_}Il zyQ9gdQTNMBJ7&Hgfrx+CaIFa8vA-4rqJ#l7#;Xs1cW*y$t(Qb0UXnJr_UA(Wj0!-P zfGmC!L`@x=Yfn2&u0a~YWoQex=Uz0$Tf(&JyFoS+-zAeAdP3R^+9!W zzTcmKgzl0U&AWG`Po+}voJWQtA!$V|SF`c2E1pXQi6UxGu05uCUSQ=vHnUJ45p{JN zt0`nNEK}WgAF+5WkjG3zck9;aYJaB6+{YIpnxCfnj2ZmK<5xC41+g#p?-_|dde2kA z&e61W8TC=UU2@mufD%S$DK|7-x77t&O@B}$@xv8b98UZZWs$4rkezIPzGeI|AGj@r zO*^Q5#d&xh<&1U*1RN^Ik^1=(jTDSTJKVg~JhihlK7RgAkICRRB-q69*@+{O%kXJY zBg+dY$jP6yB<&GY`;l=vNx}SwXo(e!?o3mnO%jWB_}T{%SPAWl1-l-FmB;%O-oJkF z9TZwtb+==Cs;cn3POfj)Ln;J;0Ti4diQ!F)e9hhAdIYe~Ece6clmI9L*O{#okNP6& z>C-U8_yFS`8^6$?vq6>Tg=OJo3za4K^Lc0Wa&O! z2oc+HoinQ&>n1L$tH~zKJ@7jf`}@sC;W6*t-3y%;jJxSc+8lEd^TV6DDQ1TmZqSmF zwBVuk*UrO}(J}hQAknC~ZC(Sp866cv*}Hpt0&FX)U|H2ztN?$A8hb8HklKZy{P(N5 z?NV$U9Px$L1D!cb+#mz|VykZ)4oTw)!gjC4kSp@d@3X;MYdpW%xUKw{I@EDH)=V<# zwkJQ<`S4Y4IPcLu>1Wl<+wd0ydQ&SbX%-TCjhlrwsnB18;TZ)+Gp3>8+Wt1JcTo`; zbQsYRl*LWr)c;cpu+IA!E=7vQ>rrWc~0Sjtbcq; zH3GD8`rR(wnZ3-MbEB#!O(9Lu<#sO}CLfG#z6%)agR^`sHA!An#ZGw>ICwv0X8m*^ zqIDdZAWSz!FB0;^f}$GJS;@&uUjBE7_upF}@PDgzKQ;~eioA0B*`T!2rHmz*yYWGg z134q3g%kL!Qi;gIS;e@T7x`Pr{B~<}yTZc+G2poE><$lOleCNJH!=7-#Za(z@g2xSRk5`L2t%fc4`j>3JDh=qA`%k$^XP3v<~a;oBr*tCFWDCimG z|3&VK$o?}4>7xfU9{;O=KO3pHy*(jR%pi!Nho9e6k4<~#=@UPvPCPai@r)>^t!pl_ z1r#MU;=vznR$kFRdL(!>U$rUd7x4ALIBLY`&m{>y@FXHPjDSV}#aCQ{iBAe+VM)1r z?6RGgsltUzXne zDFFe4w*OIAD^SO#5CiwJnllo2Vb$9j7f-cxK^6dnK>0#{56t$=$?*Y2W^dMasSzLo z2MR6PaS%KZZs1k=X5UMCytT&xMxl{ky??!uHt){h22P8Wz0Q8JfgD$E7L7mQxlGT^ z*x5Up{H$5q_VgpJh`CP^zY56;k&T|G-rPv7_5;_ArBDmPFtIz29w zDCZZIDExqs02WA92Ih7eoWRk2Ym^b+#!^ZAkj_qKKy&2vzn}-D>p($uU_ijn+FIWe zo`ZAV0jm$72GX7^5&<6lF2)S(WTsu=>FqzNJeNEr)>nn$5c27^oZ4M;pcAqTsx`V9 zLQO^M8yT5zsQp}q0sgL?o!u3Hcc8Lhh%P;?C?kYN&O5X%apf z(^bIkKPhv+?%d%~Cf{Et%pRT|t_O*GY!1(4Ki?>}NP7peYFuiJF{5k16Jy5Fs)%aD zY)5&oh_&E#wCtXDncW&x_lYgIOrGQFgz`p$#9tb~0 z9cJHr`ZPhsC`evHJNR9lI6Tyy#v2YSVD@UE=K$>v2q7fXmN?KT^Ap#NX~j1^8H$m0 ziv9UBOvwwf#(5eKB%>58Ew3XUHa`6Pnf@bm>@lh;gN50fOCvtG8ReTS7nG;Q=GHUJ z?5TL5vEkWvIYu3W`08DBv@EVf;*L&GzFKyDX$08IRkmJHrl}(SHqFnUEU`ed6_=Kt zg8aX)8aHA*(!A!oED-ec=XnYbkBF4&Fiy+G?2Zy!lP>T%8RgEssHJTmsXQMR7A7nz zy57>+j^6NiZ15EX&OEblQ<$Mqz$&R%?5+#EKRWdKoRYFub$|w5-AVK4b6OhS=**0B zW1(3tenK_`c-%sEy#Wmqs0ZXd4tYce2LcK2hm>Wl{d)!K?Buj# zCjl-DG)-yh>ue@30@BmJ>r3c_fxsv7g}HgGXFN2h)zzK9c(^4Jy)*EheHpC{q^QUH zqLG*UQL)^u199VM#|YF~=k7ds!0nE%W#GMf)dv6o=wACPz0gNt?C{ZdebMu2X^D(E z5`~}mB-Q65Hqp5=+4WI%A%j?9zFVt2^e@2cPXO^48RhX7dhD^uXQ20@r-%Itygf98 zWQ@#^!k?jvAA8&65_}k`Cc$bjdC?4HgQrkW;$VGXaxM#g*+&q%x+Pe#psb+qm+Xcb z^gy^k*4I9-;W0Y(qqlzNTb=g)O05GXUo5xXHPUgR_a#soqE54KA|nNMhNNW1m|3Ww zvHN^9Hv+C3%~XY?yR9FtbY;=r19u2q-O=&&O0KtTkEkgwV*@@2-UFjml5f$6 zOCe@liwpH^QV@0X@ROh7Y~M!#n1SK4sH7?BW)Pg#>u~|?8eUEg5-`0uAT{xTuCE4y zMGZVKvYJqU(U_mE3=(_0E~!fB=L5S`<=4k&C(SFXXXK#*zue!n7}Oa8UuMBQxJyA*15QtE@-cCC)2JR{V^< zoysgMwT_*H)dj0-987#}T^fw8E(xC4JmYkQq;>f?8f6(I&v`#9gVurW!*59LjxD1v zYS{#V7>a=K5lz!Niir5&*JE^$Rfrp?#tW^vBPRkIS|?JEbRWVAkNRgD0s}WbkQem+ zZNY*x?6YLyxBe7*Uw^rGiH>tNE;lSv38g*8dFJKnVLlBAn1f$jL>EJA@b&Z=wW2s( znGMry^PvoG7*~Zqd@ynn0sT{Sco8p@)+|j-(AMRi54uWoK()aapijnqlLkk}TY|oC zPH*H=21RAyqK-D=D(awMr3C*;7yfTN82`}Q{sCpL?b)g)v7{-aRK3)NK--KJW8wI< z%Y$JbbitABI5n}Pl2K9By2<4S!+ypYb+h@+hq%&dlvMkxXy;B?O3DY+mcc%qw2TI; zU8T*q(&|;|LF^$mq0q5gZFXYLYU(NBglaN zH5#zVQ_Gh{6At`HD@~V>lyD6qh#=vWXAq?wW7V^K-*8{uefTVBu&PrMh@i=}tGW%y zC8&L_z{&A>^7De0zQxmg)3bV1WdYd2?!~7vIeoDm#({wrps~UmEq9hIH9tspTH)FC zwyvxPE^u+-so6v5A%20k0DyLjzW48w+S(Gan%^AOOm=n_J1O9)O0zj(q<%p`uM=vP zgh~Q=h^xtO8HAq8F&n>yb{a%fY1HSvUKczvDho67`!{$eWYbk(OL`W5$klryjw`OEKx`v1MN?dZ8Qx7%e zdy&a&_Um1Z?4FBrSa3d<zf}@=XXP@nqzX zc|tq{YtSzWV;a(ft>fZoL&I_`*Z18OD?ae^n7Z7Uw28cE>rx#|!m-8Rp zu$2u;fXz0mE1!k0KU;+cFr~(_R1f*V00B+~uETVLkJtG4aNP$4E*O##{8w<~U4-2! zvzeD&;TAv2N^I;;R^54oaR3Pv+NE$^UEMg5BOKb<&?=z_8c=Ye8XuR50;}`}*p1Sm z{=_RjE44skO*R<96UD*8avs>GW6UB4a6^Ei-0D(w;13JRk~T1SJ5~}WFg-r8B)z}p zu%4|3Z}sbF_71I}>1kL(f{?l2RRz?c+m?~A>pCkEiNv8U_pE%^A*Drkbt@EvIxxb* z+Ac^CNMsLVVd;Z|qU*08WMUfc}y z^sz8Zqbg8f#Q;&B%z~Qr*=(w&SUJYhh7*g3%%Zj4tujgH9+Rbw)mS-;&QjgLZin*0 zTSb|EZ@R|U?9OnMcphx)Jz-j@*tsq3Ph$G(Z3V9B4$`A4N%8bIT9KOn=nwbwXpEy3 zE#DV1e8L?Q5WhhZ=bWt-2jcH{z|@G7{X>fTp{@w;YB^E?%NG2a`W5jN7qSqVKuBhb zzimBvJhsC(UUh(jeuPCt*82K5+AU5%KWV$-i4Pzmv|@=YtgM@_b89>EPl17@+OlAM zw81dMWmS@qR%|`NdA-Q76lZM)65W%L-c<@-*cF&1VrTb3g!EMqN%W~s{0CI({zrG`B-&$8+6`0VG^N-nd!bZy$C`g>^7IvV|c zfGJlmKM2~aUw_?|263HQmgGHYD|}o{?@MzVcG+-*SdRLRPn-zx+c^eng8ckJ1Y5?? z(19Hz2F86}%(UneM?8(qE$VG+eV+XUm~y~+KAF(FQ$2386uz^BeY7-S2+)@u>r{h? zr(ADvol&0c>L}j9J!eq7$%UtmuISeeFSi!WtW9G#a3I6`Z3gH;FUG}jaOzix15yZU zH}t8qDv^n9h!?|Ufq>p3`i{(u?(*F-Z|EuJj`36gziX2NAMmetrW+LyAnttdAjAxm zl-rT(-5Ql+)NWggKH){mc{}OP()r<2_~wrQGtvP`QNEwAEZ-Q22^}5Jd?mz2x1_7* zEW!pa!2}QcmoJ4;hr4Vxm0Ta3@)OKj5r0{BBM`trqdHK~1II}^zL&VcGt=iz&4`U4 z3l*6W(bumu+PMnKAb{_F`mPMD$d|_Er`86;Lq1xQ=tx^sK0TdO*WFDbCs$9DG>i7! zcLlx3-gtAn#`eZZ1gxqdT=5EukH?zyx=dFei1+~@EG47*54&1Bwd^-S))j2>KuJ%4C+37KI5KeN@!6Nmt}+BRhb$3GCYf^ zn#RKD|B9Ve@yY&9H#S3TFYcxFO{BmQhdd2priuk8Gw0*2IdwqBNzN+|{QDFEDhFeWFc>E4H6LUFDpKV=SeI_(cTsjT?g%twwnX_RSVx_{;qi_ELd6u4bIZXU76+$%>Bta;x3VN=SMHE^3Zh1~eMi%CTc2AEUV_|D*}e5T zg9i{^@G_-I!Oi4)yw^cAz_a5sGh}xR?!1*qAY+iP1HXkoBYi8b&RApBE|qPt=awDP zLCph-?JDZzYS{J?5*Iwe>6-h^qO&g3jRcxtll7pF=9e(SkXN>Ur~;CF9JIbPFl;1M zMdw@q!EMcO78Flx=X`(B{{bd57!zKglR4=Y7H_tDlmU$anoMg@VM7u4?{QLH1UQG?0yo2))6CFgn!%0XSZO^y9(X;Q zO9BW;G^yCz=JI|0;M_Op!YlWq`!ZKyrDU9_=esyI#05&q7C4fqkABd3Lx2I;E0#K0 z)SF<;29T6q?7iFY440c~O-EzLv8K-k(9ZSs*cec;>hhm1FDF{IEYO{i7`XxYfm$_8z?#{nm(zfOaF zQAjjg;r0T6r}gHW8e<^#H&$?HY_h=j{0+86g3&6!`3HD;j>bn=ycj?l71WbG@b2x`;7{qCrr^eV zsk`TLaFLO*@k2qTMx|kP|5Q|%!8P~-6xCcDeW;@@r=s%U0pE%I#|Pb>mXw!j`oRb7t)iGc| zooJ^Cr3*&qO(7Tesb!R(eexU*(EJz8hkp|W#&;x!esr&wX9z-}Qw+7W+(gBkk+{m3 z+ReuD^6IsJVDvDJ(X`xx;6`vWj7~kI5OG=c22!}eQ7tv?9d4{Z;k*4V@*+z@ZQB7I zH9j}j2<#<4=KIrZ@O%U6IzFda1tVF_X*kWsJdO|Tg@7|Q-EMJx({sMS#@UIdel~)P zf{_ttc*8YO2TT=H51PoUVUq&sN7c+i=%gZIY1+Y%j2kub!b1y-p#S)1ek~?+kHMIJ|`W}0z!qD2^}QOWxhuzJXB%4P zav_fp|3{x(U7py@SG4)5dQ%2vDywx~d^6m-B=ZhAbcUG1HSdrG(gL8ia<>?+D5O57pVov?x>I!b* zYq2n3y!Oe!dt4x|3SV}et?Gbz8jm^4Nw{77NE}*k1YGz2@bFJQ#$(3hC2@ndsxDl7 z+AQh&-DX4<>Gp8@>;qDlxbFOrp=K_;D~%AB-~uO-71W)pa%5&TK09j- zeGxM{XK?cwDBk*Z7YGPQ<{kl*44S%R=&1nOm9SBSk)D{&g$z!*5YHF4cE~F0QD=VV zuG~QYE|2?+01mx5Ied)kdneFdbO3bwkcE^c8-wT)$9mF=zTkrfl-?VQT!0)mldf38 z-J@{pKO`b&r(SvTO_|9$)zlGENg-6S;TkP7tX{AX(8Fg2_-TK80L`py&iKrVxcLFZ`f;>mQ$kehKe^yb=rB)LGcbR}ijRq$Gj3{hugRXb9fh&u6L^ z{k2kgvKI{e7{2Z34-|0oyk%U}3NuiBG4n8UEEz_@9Stg8Pyi(ZJ`J3^hi1LW)`w^q z4bOXnkE$chSt^-jL1(&yD&kuPw3Ahz@t-HPoMx7g2z^uI0`i2AR@3|VDy?_Ao7}7kl zSnL&~^Ip)(+%_SsjswfXtDot7Hd7sS;|y@%(?z#dP|v)CEHu?lSBN1`)&sdYz@$N2aEiPHVT) zUBMxV+e^^TBj|;TPm&!219WoY_pOco25Jt3Y$?{ymneA@@L5^w@GsEOnU1uBF>7qh zVwNjql_&N3v1(u0l+XeCB@Yj^hg_xcj1wX`d7f?`k?6i?$O}^`RRYwQqM(0MN8ZTj6j)`FaU}QN9)xx&$jDG4 zDkLi&yZq$Vl1cjCG3kA+)wcMu^>r)aS*ch6q~Qh=9w@?40T7)!S>6OmbnUb!Xs=^- z&N*gyE^oNFU*S^cNdqqDS(ZkiV&&2KAIZ6rGi^D}kUu6-C$Z0pIZ>G0#+E|My}R-a zz39oUxsIPGHl$Qpfe#vH$b`<=E(mLu;=z5&Z?5?G<7T#R9<|@N=H+CN3V-^;lu-{W z0<(R)MzR-u#iVj_9DsQ%xVW&2IZ>7c=h9s;w-GWN&xf{19#HGe#g5C+T^$U1MC`uN zZE-h-&2uF(_wRQUwIiTE+nvVdwp~6iTPJmL3pQS+Kt~H})Yj?>1sRnoYLs`BugUlDan(N1JkLJjXi&p1e$W5kv}8@{+2MlYh{Lch-ID!xvH zMcg>pJ85VUhaed4Wm^8tXR;KFf%WAMx#RRCFc zf}|%M;58t{c_{MXry2SN_||^g+-bKTz)fqBpC&|@-eG9qWCgJt@IYvyq#yr=fftTc zIY>fVH{Wgb)n;UPqvCxtIVGinmKGgMm$?~C_U?=NByd*3w4nH#GW6Y${SV?N4iXmIvShP09wY9B)i_C;q78kBMbc=(eI zuBF1v4;VOD9Mr%fOwRelWIg9!!i)byF!-8{MHwTwp#L!87pogyBM_tu4`uE?`+KZ7 z>ewc!G7Rh`vVh7we9%|h(M1V%W%807(3G7c3xD1^pbCpgdKO>G%kfdd7i#LUy|^|p zClfk8R@PXrl*gZ+;nZ%i?VBLCB39Bbx`6*5e{}K$i|Jgw*5nX6abhXf zapUwUO`3P66!3yYGhpW0FXo6zVOG4Bff@W?S_DxG^uN2Cjt=fU-74!=-tsSXUC2H~PVwjB z{qbJcARX~%u78&$g2)~bExRauLQ;+2)od|3Kc~{u-}w9ITOT+<+=R_TCKeXOx#YKR zFXd+=jhZI0jg4*7%_sZsf`WnsdNv!H#sljaKWXM0^w{+M`g{aoq3<~(IVdP8Wgb2} zhrq=l?PKK$$mkT*c5YZ&S%NSuq|$|x=@@;E4fRk|M zC*)9RVsDa+Ox9**Np#mU*uL5DKv`%g$<1p?%hJlKzr-rWOdC!nJdNGW&KHB<$-Upb zyC{h*3?)$%_aP@=V@H$tfySKwXxV+XFYhW(OfWtVHG+hMB#Ew?k4D_~0!)Z9aC_yaA=-5tkwhTN#t0zzZtr}xs5{~-8lCR%+Q zR-&38SIfNd7jXGyz*D~YR8O}cNQ6xMfkzAvN4SX7jS^`;KC5j{oo%rFCkz%9ORC`hEu@ZXuVBaKdiO{mfY zCi+y5ji#WKK&t5*n6zP**Yjs|lNyV8f}=cUOb zQl}}bh@}Mid2!yIVblx*0ZEBpRf%+8g(oJR9b+Q}J9gSXO8XaE910WY3B*Dm{zX{U zRZ#60Z&|d`cX#=#;b!AX_8qFd=KMJChm#Ca#(#zkt=Vl9F3OJ6&DRI@chx1CkdQJ|`#t%tyio zW+y%O+r&PLsH4#?I$7AEw;jCrLWD{NA}mw)yEE187yEAN@KDPsO9V#8#@<0^9*nNc z)Mp)-+D#PO9quTw_V^UtWbHG zCJDVTKaW_=KS=DYz&~|LyeMEfUL>>Q_{;4lW(*joA+6t?r2u~+mJ>v&yd~VX`3|ZG z+k^$k$t~n1sfi059dW8NZ*K%-yr*Ym@GnUn66Q&>I%-h)5$XZjs(fB@cXFJ~imOqn3G}L81{@JC&TGwj~kvKC@C+kcm4EDohY#r+9xhLm@HH-Lc)_xpVk@J zIX9W#UU)l0WN%|m>avum+x{+7mVSFMZ+Xp@ah+{_6lc=WiB9v zr#dBt@)G6mQpbh+CjojgGN&6KJ_Hw>%3}=(C=Hx(QUTl6SyE&jUN2sI3xFA~;r4H8 z3bQT#PU#KHUpudI5rGH7eWfxSf;z*@2~}02lVYYo?{nv|!G(iu&!xFMSd8(V*t&7- zcXd>Bw5uEV3nyaXcxV ziOoaRjXKnI^mK&ng|`%xQjwD{l%2WiH?tu%60I%i{?#M&%5CE94AEQ@(6iWw3<#-9h@kv4MQT) z_Pt1SE(misNBrPqN9XZn7je?7U1_1cKzh{&1uP9$779cP|`Icy=TcOQpoZed>I0t zAN1t7lU4KWPV8#8xh!HN(?H~33V z4m*GHmS%mDuw6o>WDz_aSFVI^V}_96hK#e_s9_h!CnsMiVSfEFYw_&X))qWu_N}8I zla}Duli?NbJB-&+P9DPnPhgIA#LU$fq6&TY_uY;mI@n>>)`G%;mt|a+T80k+(JJ}H zL&%)w6a40wY@_)ojQP;MvssoPv5#3ySwsFKz2{RwLNwy$XQQK|#gA(~g<6KIG8p%B z@fy((bgslr`Qple7PSK3;eynNNmCbg*Qgx{nTE8qLz=sjM#tjLc(=7DazEzez%m1^ zjLb}2ye#V#$+eJry^U>49YWpj=HyL%3pSSP_PBxq-w9EyLm2CMLVSOk%(!FR7j~)s zDzPUfYe}-ou*VE36g$#WAQ|do^FGDiayX_(Z=*te(eNK4~e^_JI9a#BD;;;_7U*uUmqAyO0Z?J91tXIK(8R@Ce# z*K_w|^E0$v84`$}6qk`H8+(1005jA^72`b7qs<;yh#6Y8r(2nsQFhS~PB`zKuemiK zUm>y14dC6rm(vXvqr{O(BBaz-M}0hvb7$)tU*CL(Mk263kl+@gH&M~}-EE93biE;9 zHmE$KbQ9XgaI*tg(i6M$%O|zU&(OsZf$M!?SxmUpUJO%)64T|4tchPj{w`LnQna^L zKiDTl1O)6}#GN=P>baOyMYH3p_U#|n4+BG9gbpERM(@U`OR39D#%S0n9;S~>hm282 zy=N>eJwr~8cD#E-GB}{21h-s1;9q%Ez9+0c#y`kH-j%5_+x;onv2Gx2cPOl6me6e- z5TMaE7cx<^Hu2{Wqg>+tZ1ptg&)0LTo}QO=C(1_R|DE$QTw^E<%C~R9`TDsK<4*s} zeTR+yYDE*5t871X(#mOM+Gb)ekgsKYTfa(4tu3V@+?s|v`?JjU=wRO5z4RZ0)88EY ad-?%FmnyEef73(2KM!S Page alignment defaults to -Left, using the available width and Library/Goals page margins: 24 logical px on -desktop and 16 on mobile. Center retains a 1120 logical px content limit. This -persisted setting currently affects only Statistics. - -Time and Pages sit at the top right, vertically centered beside the activity -title and date range. They wrap within the action area only when text scaling -requires it. Native controls preserve keyboard and selected-state semantics. -Empty states use an icon and title without explanatory body copy. Daily average -sits alongside the other rhythm metrics without a divider. - -## Data definitions - -- Reading time and pages use the corrected reading ledger's existing projection. - Newly recorded EPUB activity counts rendered pages, one per exposed page after - ten seconds, including both pages of a spread. Checkpoints and revisits to the - same page are deduplicated per day. Layout changes can alter EPUB page counts. - Existing estimates remain labeled as estimated. No past activity is fabricated. -- Genre is editable in Edit book and displayed in book details, using the existing - custom metadata field without changing unrelated metadata. -- Days read follows the existing five-minute qualification used for streaks and - reading-day goals. The summary tooltip states this threshold. -- Daily average divides total seconds by elapsed calendar days in the selected - period, including today and days without reading. Future chart buckets are - excluded from this denominator. All time begins with the earliest - effective activity or eligible historical completion, not an arbitrary year. -- Calendar activity axes always cover Monday through Sunday for Week, every date - for Month, and January through December for Year. Future buckets stay empty. - All-time/custom activity covers the selected range: daily through 60 days, - monthly through five years, then yearly. Buckets carry exact seconds, page values and clipped - boundaries. Short durations use second-based scales, with intermediate grid - lines including the top boundary and a visible baseline. Time and Pages share - the same bar renderer. Every bucket has an axis tick. Labels use a fixed integer - interval based on measured text widths, anchored at the latest bucket. The - first bucket may have only a tick to avoid an irregular endpoint gap. The header - always shows the full date range. No smoothing - invents trends. -- The chart has no expandable totals section. First/last partial calendar buckets - are bounded by the date range shown in the header. -- Books read and genre shares count distinct books with reading activity or a - completion in the period. Missing metadata uses Unspecified, including removed - books whose historical activity remains. Unread inventory does not contribute. -- Books finished by month covers the entire selected year/all-time range and - scrolls horizontally when needed. It does not discard older months. -- Streaks remain current/lifetime and are labeled separately. Reading pace is - omitted because independent page-only logs cannot establish a trustworthy rate. -- Empty session averages display an em dash. Existing offline persistence, - correction handling and profile isolation remain unchanged. - -## Verification - -Focused tests cover historical/corrected completions, full-range bucket totals, -sub-minute durations, custom boundaries, midnight-crossing sessions, scoped genre -counts, profile replacement, five-minute days, period/date interactions, equal -panel heights, unchanged date-control geometry, readable short -chart scales, separated monthly labels and responsive empty/populated layouts. - -Committed synthetic Flutter captures in `.impeccable/review/calendar-axis/` show -the full Statistics page on desktop and phone in both Time and Pages modes. -`.impeccable/review/genre/` covers genre editing and book details. Widget tests also -cover e-ink and large text. These checks do not establish native-device or live -browser acceptance. diff --git a/DESIGN.md b/DESIGN.md index 8ca92027..2e110e7e 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -140,8 +140,8 @@ The shared spacing scale supplies gaps, padding and margins. Breakpoint tokens start tablet at 600, small desktop at 840 and large desktop at 1200 logical pixels. They define 4/8/12 grid columns and 16/24/24 gutters for mobile/tablet/desktop. Actual pages choose their composition within available width and text scaling. -The statistics composition and its local width constraints belong in -[its surface brief](.impeccable/surfaces/statistics.md). +Statistics defaults to left alignment with shared page margins. Its optional +center alignment limits content width to 1120 logical pixels. ## Elevation & Depth From 2cd51c368913fb6f9c099d8e31d71f810951d8be Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Mon, 2 Nov 2026 23:32:56 +0200 Subject: [PATCH 05/17] fix: preserve chapter coverage from the pinned reader --- app/lib/reader/reading_activity_tracker.dart | 21 ++- .../powersync/tracking_persistence_test.dart | 2 +- .../reading_activity_integration_test.dart | 131 ++++++++++++++++++ .../reader/reading_activity_tracker_test.dart | 45 +++++- 4 files changed, 189 insertions(+), 10 deletions(-) create mode 100644 app/test/reader/reading_activity_integration_test.dart diff --git a/app/lib/reader/reading_activity_tracker.dart b/app/lib/reader/reading_activity_tracker.dart index e0deff94..6c6beb64 100644 --- a/app/lib/reader/reading_activity_tracker.dart +++ b/app/lib/reader/reading_activity_tracker.dart @@ -76,8 +76,11 @@ class ReadingActivityTracker { } } + String _exposureKey(ReaderContentCoverage extent) => + extent.chapterCount == null ? extent.key : jsonEncode([extent.key, extent.start, extent.end]); + void _updateExposures(DateTime now) { - final keys = _event!.coverage.map((extent) => extent.key).toSet(); + final keys = _event!.coverage.map(_exposureKey).toSet(); _exposedSince.removeWhere((key, _) => !keys.contains(key)); for (final key in keys) { @@ -138,18 +141,26 @@ class ReadingActivityTracker { final coverage = []; for (final extent in _event!.coverage) { - final exposedSince = _exposedSince[extent.key]; + final exposedSince = _exposedSince[_exposureKey(extent)]; if (extent.end <= extent.start || exposedSince == null || now.difference(exposedSince) < exposureThreshold) { continue; } + final chapterCount = extent.chapterCount; + final pageCount = book.pageCount; + + if (chapterCount != null && (pageCount == null || pageCount <= 0)) { + continue; + } + coverage.add( PageCoverage( key: '${book.id}:${extent.key}', - start: 0, - end: 1, - pagesPerUnit: 1, + start: chapterCount == null ? 0 : extent.start, + end: chapterCount == null ? 1 : extent.end, + pagesPerUnit: chapterCount == null ? 1 : pageCount! / chapterCount, + estimated: chapterCount != null, ), ); } diff --git a/app/test/powersync/tracking_persistence_test.dart b/app/test/powersync/tracking_persistence_test.dart index 69e53626..a9e5b8ac 100644 --- a/app/test/powersync/tracking_persistence_test.dart +++ b/app/test/powersync/tracking_persistence_test.dart @@ -35,7 +35,7 @@ void main() { id: 'reading', source: 'reader', coverage: const [ - PageCoverage(key: 'book:epub:0:100:300:1000', start: 0, end: 1, pagesPerUnit: 1), + PageCoverage(key: 'book:epub:0:100:1000', start: 0, end: 1, pagesPerUnit: 1), PageCoverage(key: 'book:epub:0:300:500:1000', start: 0, end: 1, pagesPerUnit: 1), ], startPosition: 0.25, diff --git a/app/test/reader/reading_activity_integration_test.dart b/app/test/reader/reading_activity_integration_test.dart new file mode 100644 index 00000000..3bff2e43 --- /dev/null +++ b/app/test/reader/reading_activity_integration_test.dart @@ -0,0 +1,131 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:archive/archive.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/reader/reading_activity_tracker.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_processor.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; + +import 'reading_activity_tracker_test.dart' show RecordingRepository; + +void main() { + testWidgets('actual reader coverage credits consecutive EPUB pages without collapsing a chapter', (tester) async { + var now = DateTime.utc(2026, 11, 2, 12); + final repository = RecordingRepository(); + final tracker = ReadingActivityTracker( + repository: repository, + book: Book(id: 'book', title: 'Book', author: '', addedAt: now, pageCount: 200), + shelfIds: [], + deviceId: 'one', + onError: (_) {}, + now: () => now, + checkpointInterval: const Duration(days: 1), + ); + final engine = EpubReaderEngine(workerFactory: () async => _InProcessWorker()); + addTearDown(engine.dispose); + await engine.load( + ReaderDocument(id: 'book', format: ReaderFormat.epub, loadBytes: () async => _book()), + preferences: const ReaderPreferences(columnMode: ReaderColumnMode.single, pageTurnAnimation: false), + ); + await tester.pumpWidget(MaterialApp(home: Builder(builder: engine.buildViewport))); + await tester.pumpAndSettle(); + + final first = engine.snapshot.coverage.single; + tracker.onActivity(_event(engine)); + now = now.add(const Duration(seconds: 10)); + await tracker.flush(); + final firstPages = repository.records.values.single.coverage.single; + final firstTotal = (firstPages.end - firstPages.start) * firstPages.pagesPerUnit; + var turned = false; + final turn = engine.goNext().then((_) => turned = true); + + for (var frame = 0; !turned && frame < 100; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + } + + expect(turned, isTrue); + await turn; + await tester.pumpAndSettle(); + final second = engine.snapshot.coverage.single; + expect(second.start, greaterThan(first.start)); + tracker.onActivity(_event(engine)); + now = now.add(const Duration(seconds: 10)); + await tracker.close(); + final coverage = repository.records.values.expand((activity) => activity.coverage).toList(); + expect(coverage, hasLength(2)); + + if (first.chapterCount != null) { + // The Git-pinned reader emits normalized chapter extents. + expect(coverage.map((extent) => (extent.start, extent.end)), [ + (first.start, first.end), + (second.start, second.end), + ]); + expect(coverage.every((extent) => extent.estimated), isTrue); + final total = coverage.fold(0, (sum, extent) => sum + (extent.end - extent.start) * extent.pagesPerUnit); + expect(total, greaterThan(firstTotal)); + } else { + expect(coverage.map((extent) => extent.key).toSet(), hasLength(2)); + expect(coverage.every((extent) => !extent.estimated && extent.end - extent.start == 1), isTrue); + } + }); +} + +ReaderActivityEvent _event(EpubReaderEngine engine) => ReaderActivityEvent( + ready: engine.snapshot.contentReady, + visible: true, + cause: ReaderNavigationCause.viewport, + coverage: engine.snapshot.coverage, +); + +Uint8List _book() { + final files = { + 'mimetype': 'application/epub+zip', + 'META-INF/container.xml': + '' + '', + 'content.opf': + '' + 'book' + 'Booken' + '' + '' + '', + 'toc.ncx': + '' + 'Book', + 'chapter.xhtml': + '' + '${List.filled(200, '

Reading across pages must preserve the amount of content actually viewed.

').join()}' + '', + }; + final archive = Archive(); + + for (final entry in files.entries) { + final bytes = utf8.encode(entry.value); + archive.addFile(ArchiveFile(entry.key, bytes.length, bytes)); + } + + return Uint8List.fromList(ZipEncoder().encode(archive)); +} + +class _InProcessWorker implements EpubWorker { + final _processor = EpubProcessor(); + + @override + Future> request(String command, Object? argument) async { + final response = await processEpubMessage(_processor, {'id': 1, 'command': command, 'argument': argument}); + + if (response['error'] != null) { + throw StateError('${response['error']}: ${response['message']}'); + } + + return Map.from(response['result'] as Map); + } + + @override + void dispose() {} +} diff --git a/app/test/reader/reading_activity_tracker_test.dart b/app/test/reader/reading_activity_tracker_test.dart index 16d7b16e..3a293a26 100644 --- a/app/test/reader/reading_activity_tracker_test.dart +++ b/app/test/reader/reading_activity_tracker_test.dart @@ -141,7 +141,7 @@ void main() { tracker.onActivity( event( coverage: const [ - ReaderContentCoverage(key: 'epub:0:100:300:1000', start: .1, end: .2, chapterCount: 10), + ReaderContentCoverage(key: 'epub:0:100:1000', start: .1, end: .2), ], ), ); @@ -149,7 +149,7 @@ void main() { tracker.onActivity( event( coverage: const [ - ReaderContentCoverage(key: 'epub:0:100:300:1000', start: .15, end: .3, chapterCount: 10), + ReaderContentCoverage(key: 'epub:0:100:1000', start: .15, end: .3), ], ), ); @@ -187,6 +187,43 @@ void main() { expect(repository.records.length, 1); }); + test('chapter coverage preserves calibrated ranges and resets exposure on a turn', () async { + for (final pageCount in [null, 200]) { + var now = start; + final repository = RecordingRepository(); + final tracker = ReadingActivityTracker( + repository: repository, + book: Book(id: 'book', title: 'Book', author: '', addedAt: start, pageCount: pageCount), + shelfIds: [], + deviceId: 'one', + onError: (_) {}, + now: () => now, + checkpointInterval: const Duration(days: 1), + ); + + for (final (from, to, seconds) in [(0.0, .1, 10), (.1, .2, 9), (.2, .3, 10)]) { + tracker.onActivity( + event( + coverage: [ + ReaderContentCoverage(key: 'epub:0:1000', start: from, end: to, chapterCount: 10), + ], + ), + ); + now = now.add(Duration(seconds: seconds)); + } + + await tracker.close(); + final coverage = repository.records.values.expand((activity) => activity.coverage).toList(); + + if (pageCount == null) { + expect(coverage, isEmpty); + } else { + expect(coverage.map((extent) => (extent.start, extent.end)), [(0.0, .1), (.2, .3)]); + expect(coverage.every((extent) => extent.estimated && extent.pagesPerUnit == 20), isTrue); + } + } + }); + test('EPUB rendered pages count without metadata and checkpoints do not duplicate them', () async { for (final count in [null, 200]) { var now = start; @@ -205,8 +242,8 @@ void main() { tracker.onActivity( event( coverage: const [ - ReaderContentCoverage(key: 'epub:0:100:300:1000', start: .1, end: .3, chapterCount: 10), - ReaderContentCoverage(key: 'epub:0:300:500:1000', start: .3, end: .5, chapterCount: 10), + ReaderContentCoverage(key: 'epub:0:100:1000', start: .1, end: .3), + ReaderContentCoverage(key: 'epub:0:300:1000', start: .3, end: .5), ], ), ); From fa46bf2ba5ca70bd6d117e4be59e26f26a7b6354 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Mon, 2 Nov 2026 23:57:14 +0200 Subject: [PATCH 06/17] fix: integrate merged reader page coverage --- app/pubspec.lock | 4 ++-- app/pubspec.yaml | 2 +- .../reading_activity_integration_test.dart | 22 ++++++------------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 240886b5..2ff7532c 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -579,8 +579,8 @@ packages: dependency: "direct main" description: path: "." - ref: eafa444a5acf0ea51018a88eb76de3d19f76187a - resolved-ref: eafa444a5acf0ea51018a88eb76de3d19f76187a + ref: fa667ae96c64e2d1d80c06e83d326265673abc75 + resolved-ref: fa667ae96c64e2d1d80c06e83d326265673abc75 url: "https://github.com/PapyrusReader/reader.git" source: git version: "0.0.1" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index bce049dd..cd5b7da2 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: papyrus_reader: git: url: https://github.com/PapyrusReader/reader.git - ref: eafa444a5acf0ea51018a88eb76de3d19f76187a + ref: fa667ae96c64e2d1d80c06e83d326265673abc75 epub_pro: ^5.6.0 syncfusion_flutter_pdf: ^32.2.3 dart_mobi: ^1.0.2 diff --git a/app/test/reader/reading_activity_integration_test.dart b/app/test/reader/reading_activity_integration_test.dart index 3bff2e43..f8ca0470 100644 --- a/app/test/reader/reading_activity_integration_test.dart +++ b/app/test/reader/reading_activity_integration_test.dart @@ -13,7 +13,7 @@ import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; import 'reading_activity_tracker_test.dart' show RecordingRepository; void main() { - testWidgets('actual reader coverage credits consecutive EPUB pages without collapsing a chapter', (tester) async { + testWidgets('pinned reader records two distinct rendered EPUB pages', (tester) async { var now = DateTime.utc(2026, 11, 2, 12); final repository = RecordingRepository(); final tracker = ReadingActivityTracker( @@ -39,7 +39,9 @@ void main() { now = now.add(const Duration(seconds: 10)); await tracker.flush(); final firstPages = repository.records.values.single.coverage.single; - final firstTotal = (firstPages.end - firstPages.start) * firstPages.pagesPerUnit; + expect(first.chapterCount, isNull); + expect(firstPages.estimated, isFalse); + expect((firstPages.end - firstPages.start) * firstPages.pagesPerUnit, 1); var turned = false; final turn = engine.goNext().then((_) => turned = true); @@ -58,19 +60,9 @@ void main() { final coverage = repository.records.values.expand((activity) => activity.coverage).toList(); expect(coverage, hasLength(2)); - if (first.chapterCount != null) { - // The Git-pinned reader emits normalized chapter extents. - expect(coverage.map((extent) => (extent.start, extent.end)), [ - (first.start, first.end), - (second.start, second.end), - ]); - expect(coverage.every((extent) => extent.estimated), isTrue); - final total = coverage.fold(0, (sum, extent) => sum + (extent.end - extent.start) * extent.pagesPerUnit); - expect(total, greaterThan(firstTotal)); - } else { - expect(coverage.map((extent) => extent.key).toSet(), hasLength(2)); - expect(coverage.every((extent) => !extent.estimated && extent.end - extent.start == 1), isTrue); - } + expect(coverage.map((extent) => extent.key).toSet(), hasLength(2)); + expect(coverage.every((extent) => !extent.estimated && extent.end - extent.start == 1), isTrue); + expect(coverage.fold(0, (sum, extent) => sum + extent.pagesPerUnit), 2); }); } From 3055aed7a9f38fe92f756bc6fbe5f9ec969da1bd Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 02:33:24 +0200 Subject: [PATCH 07/17] feat: add synced reading timer and native background controls Closes #123 --- app/android/app/src/main/AndroidManifest.xml | 7 + .../kotlin/com/papyrus/reader/MainActivity.kt | 16 + .../com/papyrus/reader/TimerNotifications.kt | 318 ++++++++ .../main/res/drawable/ic_reading_timer.xml | 3 + .../powersync_timer_integration_test.dart | 195 +++++ .../support/timer_notification_app.dart | 62 ++ app/ios/Runner.xcodeproj/project.pbxproj | 197 +++++ app/ios/Runner/AppDelegate.swift | 4 + app/ios/Runner/Info.plist | 2 + app/ios/Runner/TimerActivityBridge.swift | 57 ++ app/ios/RunnerTests/RunnerTests.swift | 69 +- app/ios/TimerActivity/Config.xcconfig | 1 + app/ios/TimerActivity/Info.plist | 6 + .../TimerActivity/ReadingTimerWidget.swift | 102 +++ .../TimerActivity/TimerActivityState.swift | 154 ++++ app/lib/config/app_router.dart | 6 + .../reading_timer_repository.dart | 11 + app/lib/main.dart | 13 + app/lib/models/reading_activity.dart | 16 +- app/lib/pages/reading_timer_page.dart | 706 ++++++++++++++++++ app/lib/powersync/library_database.dart | 159 +++- .../papyrus_powersync_connector.dart | 3 +- app/lib/powersync/papyrus_schema.dart | 9 + app/lib/powersync/powersync_service.dart | 4 + app/lib/providers/goals_provider.dart | 6 +- app/lib/providers/reading_timer_provider.dart | 276 +++++++ .../services/reading_timer_notifications.dart | 154 ++++ app/lib/timer/reading_timer.dart | 201 +++++ app/lib/timer/reading_timer_format.dart | 6 + app/lib/widgets/library/library_drawer.dart | 9 + app/lib/widgets/shared/app_page_bar.dart | 128 +++- .../widgets/shared/searchable_book_field.dart | 102 ++- app/lib/widgets/shell/adaptive_app_shell.dart | 6 + .../widgets/timer/reading_timer_clock.dart | 145 ++++ app/test/goals/goals_provider_test.dart | 21 + app/test/pages/reading_timer_page_test.dart | 661 ++++++++++++++++ .../reading_timer_persistence_test.dart | 278 +++++++ .../reading_timer_provider_test.dart | 120 +++ .../reading_timer_notifications_test.dart | 193 +++++ app/test/timer/reading_timer_clock_test.dart | 51 ++ app/test/timer/reading_timer_test.dart | 64 ++ app/test/timer/timer_test_library.dart | 71 ++ .../widgets/shared/app_page_bar_test.dart | 109 +++ docs/TIMER_NOTIFICATIONS.md | 66 ++ 44 files changed, 4742 insertions(+), 45 deletions(-) create mode 100644 app/android/app/src/main/kotlin/com/papyrus/reader/TimerNotifications.kt create mode 100644 app/android/app/src/main/res/drawable/ic_reading_timer.xml create mode 100644 app/integration_test/powersync_timer_integration_test.dart create mode 100644 app/integration_test/support/timer_notification_app.dart create mode 100644 app/ios/Runner/TimerActivityBridge.swift create mode 100644 app/ios/TimerActivity/Config.xcconfig create mode 100644 app/ios/TimerActivity/Info.plist create mode 100644 app/ios/TimerActivity/ReadingTimerWidget.swift create mode 100644 app/ios/TimerActivity/TimerActivityState.swift create mode 100644 app/lib/data/repositories/reading_timer_repository.dart create mode 100644 app/lib/pages/reading_timer_page.dart create mode 100644 app/lib/providers/reading_timer_provider.dart create mode 100644 app/lib/services/reading_timer_notifications.dart create mode 100644 app/lib/timer/reading_timer.dart create mode 100644 app/lib/timer/reading_timer_format.dart create mode 100644 app/lib/widgets/timer/reading_timer_clock.dart create mode 100644 app/test/pages/reading_timer_page_test.dart create mode 100644 app/test/powersync/reading_timer_persistence_test.dart create mode 100644 app/test/providers/reading_timer_provider_test.dart create mode 100644 app/test/services/reading_timer_notifications_test.dart create mode 100644 app/test/timer/reading_timer_clock_test.dart create mode 100644 app/test/timer/reading_timer_test.dart create mode 100644 app/test/timer/timer_test_library.dart create mode 100644 docs/TIMER_NOTIFICATIONS.md diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml index 5a63d016..1a5ce7c0 100644 --- a/app/android/app/src/main/AndroidManifest.xml +++ b/app/android/app/src/main/AndroidManifest.xml @@ -1,11 +1,18 @@ + + + + + + if (call.method == "pick") { if (folderResult != null) { @@ -95,6 +96,21 @@ class MainActivity : FlutterActivity() { } } + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + TimerNotifications.opened(intent) + } + + override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine) { + TimerNotifications.detach(flutterEngine) + super.cleanUpFlutterEngine(flutterEngine) + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == TimerNotifications.permissionRequest) TimerNotifications.refresh(this, true) + } + @Deprecated("Activity result bridge for Flutter folder access") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode != folderRequest) { diff --git a/app/android/app/src/main/kotlin/com/papyrus/reader/TimerNotifications.kt b/app/android/app/src/main/kotlin/com/papyrus/reader/TimerNotifications.kt new file mode 100644 index 00000000..1d64c3b1 --- /dev/null +++ b/app/android/app/src/main/kotlin/com/papyrus/reader/TimerNotifications.kt @@ -0,0 +1,318 @@ +package com.papyrus.reader + +import android.Manifest +import android.app.Activity +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.app.Service +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.content.pm.ServiceInfo +import android.os.Build +import android.os.Handler +import android.os.IBinder +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import org.json.JSONArray +import org.json.JSONObject +import java.util.UUID + +/** Native journal survives suspension and process death without a second database writer. */ +internal class TimerNotificationStore(context: Context) { + private val prefs = context.getSharedPreferences("reading-timer-notification", Context.MODE_PRIVATE) + + fun read(): JSONObject = JSONObject(prefs.getString("state", null) ?: "{}") + + private fun write(state: JSONObject) { + check(prefs.edit().putString("state", state.toString()).commit()) { "Timer action could not be saved" } + } + + fun publish(snapshot: JSONObject?) { + val state = read() + if (state.optJSONArray("actions")?.length() ?: 0 > 0) return + write(JSONObject().put("base", snapshot ?: JSONObject.NULL).put("actions", JSONArray())) + } + + fun clear() = write(JSONObject()) + + fun pending(): JSONObject? { + val state = read() + val actions = state.optJSONArray("actions") ?: return null + if (actions.length() == 0) return null + val base = state.getJSONObject("base") + return JSONObject().put("sessionId", base.getString("id")).put("version", base.getString("version")) + .put("through", actions.getJSONObject(actions.length() - 1).getString("id")).put("actions", actions) + } + + fun acknowledge(through: String, snapshot: JSONObject?) { + val state = read() + val actions = state.optJSONArray("actions") ?: return + val remaining = JSONArray() + var found = false + for (index in 0 until actions.length()) { + val action = actions.getJSONObject(index) + if (found) remaining.put(action) + if (action.getString("id") == through) found = true + } + if (!found) return + // A different session invalidates controls from the previous notification. + val same = snapshot?.optString("id") == state.optJSONObject("base")?.optString("id") + write(JSONObject().put("base", snapshot ?: JSONObject.NULL) + .put("actions", if (same) remaining else JSONArray())) + } + + fun record(id: String?, token: String?, kind: String) { + val state = read() + val view = view(state) ?: return + if (view.optString("id") != id || view.optString("token") != token) return + val phase = view.optString("phase") + if (kind == "pause" && phase != "running") return + if (kind == "resume" && phase != "paused") return + if (kind !in listOf("pause", "resume", "finish")) return + val actions = state.optJSONArray("actions") ?: JSONArray() + check(actions.length() < 256) { "Open Papyrus to sync your timer controls" } + actions.put(JSONObject().put("id", UUID.randomUUID().toString()).put("kind", kind) + .put("atMs", System.currentTimeMillis())) + state.put("actions", actions) + write(state) + } + + fun view(state: JSONObject = read()): JSONObject? { + val base = state.optJSONObject("base") ?: return null + val result = JSONObject(base.toString()).put("token", base.getString("version")) + val actions = state.optJSONArray("actions") ?: JSONArray() + for (index in 0 until actions.length()) { + val action = actions.getJSONObject(index) + val at = action.getLong("atMs") + val recorded = elapsed(result, at) + result.put("recordedMs", recorded).put("runningSinceMs", JSONObject.NULL) + .put("token", action.getString("id")) + when (action.getString("kind")) { + "resume" -> result.put("phase", "running").put("runningSinceMs", at) + "pause" -> result.put("phase", "paused") + "finish" -> return null + } + } + if (!result.isNull("targetMs") && elapsed(result) >= result.getLong("targetMs")) { + result.put("phase", "finished").put("recordedMs", result.getLong("targetMs")) + .put("runningSinceMs", JSONObject.NULL) + } + return result + } + + companion object { + fun elapsed(view: JSONObject, now: Long = System.currentTimeMillis()): Long { + val recorded = view.optLong("recordedMs") + val elapsed = recorded + if (view.isNull("runningSinceMs")) 0 else (now - view.getLong("runningSinceMs")).coerceAtLeast(0) + return if (view.isNull("targetMs")) elapsed else elapsed.coerceAtMost(view.getLong("targetMs")) + } + } +} + +internal object TimerNotifications { + const val channelId = "reading_timer" + const val notificationId = 7143 + const val permissionRequest = 7144 + const val openExtra = "papyrus.open_timer" + private var channel: MethodChannel? = null + private var engine: FlutterEngine? = null + private var openPending = false + + fun configure(activity: Activity, engine: FlutterEngine) { + this.engine = engine + channel = MethodChannel(engine.dartExecutor.binaryMessenger, "papyrus/reading_timer").also { bridge -> + bridge.setMethodCallHandler { call, result -> + try { + val store = TimerNotificationStore(activity) + val args = call.arguments as? Map<*, *> + val snapshot = (args?.get("snapshot") as? Map<*, *>)?.let { JSONObject(it) } + when (call.method) { + "pending" -> { + if (openPending) { + openPending = false + Handler(Looper.getMainLooper()).post { bridge.invokeMethod("open", null) } + } + result.success(store.pending()?.toMap()) + } + "publish" -> { + store.publish(snapshot) + refresh(activity, args?.get("foreground") == true) + result.success(null) + } + "acknowledge" -> { + store.acknowledge(args?.get("through") as String, snapshot) + refresh(activity, false) + result.success(null) + } + "clear" -> { + store.clear() + refresh(activity, false) + result.success(null) + } + else -> result.notImplemented() + } + } catch (error: Exception) { + result.error("notification", error.message, null) + } + } + } + opened(activity.intent) + } + + fun detach(engine: FlutterEngine) { + if (this.engine === engine) { + channel?.setMethodCallHandler(null) + channel = null + this.engine = null + } + } + + fun opened(intent: Intent?) { + if (intent?.getBooleanExtra(openExtra, false) == true) { + openPending = true + channel?.invokeMethod("changed", null) + } + } + + fun changed() = channel?.invokeMethod("changed", null) + + fun refresh(context: Context, foreground: Boolean) { + val view = TimerNotificationStore(context).view() + if (view == null) { + context.stopService(Intent(context, ReadingTimerService::class.java)) + NotificationManagerCompat.from(context).cancel(notificationId) + return + } + if (Build.VERSION.SDK_INT >= 33 && ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + val prefs = context.getSharedPreferences("reading-timer-notification", Context.MODE_PRIVATE) + if (foreground && context is Activity && !prefs.getBoolean("permissionAsked", false)) { + prefs.edit().putBoolean("permissionAsked", true).apply() + ActivityCompat.requestPermissions(context, arrayOf(Manifest.permission.POST_NOTIFICATIONS), permissionRequest) + } + return + } + if (ReadingTimerService.current != null) { + ReadingTimerService.current?.refresh() + } else if (foreground) { + ContextCompat.startForegroundService(context, Intent(context, ReadingTimerService::class.java)) + } + } + + private fun JSONObject.toMap(): Map = keys().asSequence().associateWith { key -> + when (val value = get(key)) { + JSONObject.NULL -> null + is JSONObject -> value.toMap() + is JSONArray -> (0 until value.length()).map { value.getJSONObject(it).toMap() } + else -> value + } + } +} + +class ReadingTimerService : Service() { + private val handler = Handler(Looper.getMainLooper()) + private val update = Runnable { refresh() } + private val wake = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) = refresh() + } + + override fun onCreate() { + super.onCreate() + current = this + ContextCompat.registerReceiver(this, wake, IntentFilter(Intent.ACTION_SCREEN_ON), ContextCompat.RECEIVER_NOT_EXPORTED) + if (Build.VERSION.SDK_INT >= 26) { + getSystemService(NotificationManager::class.java).createNotificationChannel( + NotificationChannel(TimerNotifications.channelId, "Reading timer", NotificationManager.IMPORTANCE_LOW) + .apply { description = "Active reading sessions and timer controls"; setSound(null, null) } + ) + } + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + try { + intent?.getStringExtra("kind")?.let { + TimerNotificationStore(this).record(intent.getStringExtra("id"), intent.getStringExtra("token"), it) + TimerNotifications.changed() + } + refresh() + } catch (_: Exception) { + // A failed durable write leaves the previous timer and its controls intact. + refresh() + } + return START_STICKY + } + + fun refresh() { + handler.removeCallbacks(update) + val view = TimerNotificationStore(this).view() + if (view == null) { + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + return + } + val elapsed = TimerNotificationStore.elapsed(view) + val running = view.getString("phase") == "running" + val finished = view.getString("phase") == "finished" + val countdown = !view.isNull("targetMs") + val shown = if (countdown) (view.getLong("targetMs") - elapsed).coerceAtLeast(0) else elapsed + val open = PendingIntent.getActivity(this, 0, Intent(this, MainActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP) + .putExtra(TimerNotifications.openExtra, true), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + val builder = NotificationCompat.Builder(this, TimerNotifications.channelId) + .setSmallIcon(R.drawable.ic_reading_timer).setContentTitle(view.getString("title")) + .setContentText(if (finished) (if (countdown && shown == 0L) "Reading goal reached" else "Finished") else if (running) "Reading" else "Paused · ${format(shown)}") + .setContentIntent(open).setOnlyAlertOnce(true).setOngoing(!finished).setSilent(true) + .setCategory(NotificationCompat.CATEGORY_STOPWATCH).setVisibility(NotificationCompat.VISIBILITY_PRIVATE) + .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) + .setShowWhen(running).setUsesChronometer(running).setChronometerCountDown(countdown) + .setWhen(if (countdown) System.currentTimeMillis() + shown else System.currentTimeMillis() - elapsed) + if (!finished) builder.addAction(0, if (running) "Pause" else "Resume", action(view, if (running) "pause" else "resume")) + builder.addAction(0, if (finished) "Save" else "Finish", action(view, "finish")) + val notification = builder.build() + if (Build.VERSION.SDK_INT >= 34) { + startForeground(TimerNotifications.notificationId, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE) + } else { + startForeground(TimerNotifications.notificationId, notification) + } + if (!running) { + stopForeground(STOP_FOREGROUND_DETACH) + stopSelf() + } else if (running && countdown) { + handler.postDelayed(update, shown.coerceAtLeast(1)) + } + } + + private fun action(view: JSONObject, kind: String): PendingIntent { + val intent = Intent(this, ReadingTimerService::class.java).putExtra("kind", kind) + .putExtra("id", view.getString("id")).putExtra("token", view.getString("token")) + val flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + return if (Build.VERSION.SDK_INT >= 26) PendingIntent.getForegroundService(this, kind.hashCode(), intent, flags) + else PendingIntent.getService(this, kind.hashCode(), intent, flags) + } + + override fun onDestroy() { + handler.removeCallbacksAndMessages(null) + unregisterReceiver(wake) + if (current === this) current = null + super.onDestroy() + } + + override fun onBind(intent: Intent?): IBinder? = null + + companion object { + internal var current: ReadingTimerService? = null + private fun format(milliseconds: Long): String { + val seconds = milliseconds / 1000 + return if (seconds >= 3600) "%d:%02d:%02d".format(seconds / 3600, seconds / 60 % 60, seconds % 60) + else "%02d:%02d".format(seconds / 60, seconds % 60) + } + } +} diff --git a/app/android/app/src/main/res/drawable/ic_reading_timer.xml b/app/android/app/src/main/res/drawable/ic_reading_timer.xml new file mode 100644 index 00000000..dc861361 --- /dev/null +++ b/app/android/app/src/main/res/drawable/ic_reading_timer.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/integration_test/powersync_timer_integration_test.dart b/app/integration_test/powersync_timer_integration_test.dart new file mode 100644 index 00000000..51a3c9a2 --- /dev/null +++ b/app/integration_test/powersync_timer_integration_test.dart @@ -0,0 +1,195 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:papyrus/auth/auth_api_client.dart'; +import 'package:papyrus/auth/auth_repository.dart'; +import 'package:papyrus/auth/papyrus_api_config.dart'; +import 'package:papyrus/auth/token_store.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/data/repositories/reading_timer_repository.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/powersync/papyrus_powersync_connector.dart'; +import 'package:papyrus/powersync/library_database.dart'; +import 'package:papyrus/powersync/powersync_service.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; +import 'package:papyrus/timer/reading_timer.dart'; +import 'package:uuid/uuid.dart'; + +import 'powersync_books_integration_test.dart' show MemoryRefreshTokenStorage, waitForBook; + +const runIntegration = bool.fromEnvironment('RUN_POWERSYNC_INTEGRATION'); + +Future waitUntil(Future Function() condition, String description) async { + final deadline = DateTime.now().add(const Duration(seconds: 30)); + + while (DateTime.now().isBefore(deadline)) { + if (await condition()) { + return; + } + + await Future.delayed(const Duration(milliseconds: 100)); + } + + fail('Timed out: $description'); +} + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets( + 'PowerSync timer handoff, offline conflicts, save once and isolation', + (tester) async { + final config = PapyrusApiConfig.fromEnvironment(); + final root = await Directory.systemTemp.createTemp('papyrus-timer-sync-'); + final email = 'timer-${DateTime.now().microsecondsSinceEpoch}@example.com'; + const password = 'SecureP@ss123'; + final accounts = []; + final services = []; + final stores = []; + final providers = []; + + AuthRepository auth() => AuthRepository( + apiClient: AuthApiClient(config: config), + tokenStore: TokenStore(MemoryRefreshTokenStorage()), + ); + + Future device(AuthRepository account, String user, String label) async { + final service = PapyrusPowerSyncService( + connectorFactory: () => PapyrusPowerSyncConnector(authRepository: account, config: config), + trackingCapability: () async => 2, + pathResolver: (mode, profile, user) async => '${root.path}/$label-${mode.name}-$user.db', + ); + + services.add(service); + await service.activateAuthenticated(user); + await waitUntil(() async => service.syncState.connected, '$label connects'); + return service; + } + + Future watch(PapyrusPowerSyncService service) async { + final store = DataStore(); + stores.add(store); + await store.attachBookRepository(service); + final provider = ReadingTimerProvider(store, tick: false); + providers.add(provider); + await waitUntil(() async => provider.available, 'timer repository loads'); + return provider; + } + + ReadingTimerRepository timers(PapyrusPowerSyncService service) => + service.trackingRepository as ReadingTimerRepository; + + try { + final browserAuth = auth(); + final owner = await browserAuth.register( + email: email, + password: password, + displayName: 'Timer test', + clientType: 'desktop', + ); + accounts.add(browserAuth); + final phoneAuth = auth(); + await phoneAuth.login(email: email, password: password, clientType: 'desktop'); + final otherAuth = auth(); + final otherOwner = await otherAuth.register( + email: 'other-$email', + password: password, + displayName: 'Other', + clientType: 'desktop', + ); + accounts.add(otherAuth); + final browser = await device(browserAuth, owner.user.userId, 'browser'); + final phone = await device(phoneAuth, owner.user.userId, 'phone'); + final other = await device(otherAuth, otherOwner.user.userId, 'other'); + final browserTimer = await watch(browser); + final phoneTimer = await watch(phone); + final book = Book( + id: const Uuid().v4(), + title: 'Synced timer', + author: 'Papyrus', + addedAt: DateTime.now().toUtc(), + ); + await browser.upsert(book); + await waitForBook(phone, book.id); + final start = DateTime.now().toUtc().subtract(const Duration(minutes: 2)); + final initial = ReadingTimer.start(book, start, 'browser', [], targetSeconds: 60); + await timers(browser).writeTimer(initial); + await waitUntil(() async => phoneTimer.session?.id == initial.id, 'countdown reaches second device'); + expect(phoneTimer.elapsed, const Duration(minutes: 1)); + expect(phoneTimer.goalReached, isTrue); + expect(await timers(other).loadTimer(), isNull); + expect(await phoneTimer.resume(), isTrue); + await waitUntil( + () async => browserTimer.session?.version == phoneTimer.session?.version, + 'resume reaches first device', + ); + expect(browserTimer.session!.targetSeconds, isNull); + expect(browserTimer.running, isTrue); + + await browser.setOnline(false); + expect(await browserTimer.pause(), isTrue); + final offlineVersion = browserTimer.session!.version; + expect(await phoneTimer.pause(), isTrue); + final acceptedVersion = phoneTimer.session!.version; + await waitUntil(() async => !phone.syncState.hasPendingWrites, 'online pause uploads'); + await browser.setOnline(true); + await waitUntil( + () async => browserTimer.session?.version == acceptedVersion, + 'offline stale branch reconciles', + ); + expect(browserTimer.session!.version, isNot(offlineVersion)); + expect(browserTimer.elapsed, phoneTimer.elapsed); + + await browser.setOnline(false); + await phone.setOnline(false); + expect(await browserTimer.save(currentPage: 12), isTrue); + expect(await phoneTimer.save(currentPage: 24), isTrue); + await browser.setOnline(true); + await waitUntil(() async => !browser.syncState.hasPendingWrites, 'first save uploads'); + await phone.setOnline(true); + await waitUntil(() async => !phone.syncState.hasPendingWrites, 'second save acknowledged'); + await waitForBook(phone, book.id); + await waitUntil(() async => (await phone.getById(book.id))?.currentPage == 12, 'accepted progress reconciles'); + await waitUntil( + () async => (await (phone.trackingRepository as LibraryDatabase).snapshot()).activities.isNotEmpty, + 'saved history replicates', + ); + final firstHistory = (await (browser.trackingRepository as LibraryDatabase).snapshot()).activities; + final secondHistory = (await (phone.trackingRepository as LibraryDatabase).snapshot()).activities; + expect(firstHistory.map((entry) => entry.id).toSet(), secondHistory.map((entry) => entry.id).toSet()); + expect(firstHistory.map((entry) => entry.sessionId).toSet(), {initial.id}); + expect(firstHistory.length, 2); + expect(browserTimer.session, isNull); + expect(phoneTimer.session, isNull); + expect(await timers(other).loadTimer(), isNull); + expect((await (other.trackingRepository as LibraryDatabase).snapshot()).activities, isEmpty); + + expect(await phoneTimer.start(book), isTrue); + await waitUntil(() async => browserTimer.session?.id == phoneTimer.session?.id, 'new session syncs'); + expect(await browserTimer.discard(), isTrue); + await waitUntil(() async => phoneTimer.session == null, 'reset clears both devices'); + } finally { + for (final provider in providers) { + provider.dispose(); + } + + for (final store in stores) { + store.dispose(); + } + + for (final service in services) { + await service.close(); + } + + for (final account in accounts) { + await account.deleteAccount(); + } + + await root.delete(recursive: true); + } + }, + skip: !runIntegration, + timeout: const Timeout(Duration(minutes: 4)), + ); +} diff --git a/app/integration_test/support/timer_notification_app.dart b/app/integration_test/support/timer_notification_app.dart new file mode 100644 index 00000000..dd0ef43d --- /dev/null +++ b/app/integration_test/support/timer_notification_app.dart @@ -0,0 +1,62 @@ +// Native notification test host. Uses synthetic data and no user library. +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +void main() => runApp(const MaterialApp(home: TimerNotificationTestHost())); + +class TimerNotificationTestHost extends StatefulWidget { + const TimerNotificationTestHost({super.key}); + + @override + State createState() => _TimerNotificationTestHostState(); +} + +class _TimerNotificationTestHostState extends State { + static const channel = MethodChannel('papyrus/reading_timer'); + String result = ''; + + @override + void initState() { + super.initState(); + channel.setMethodCallHandler((call) async => readActions()); + } + + Future readActions() async { + final pending = await channel.invokeMethod('pending'); + if (mounted) setState(() => result = jsonEncode(pending)); + } + + Future start(bool countdown) async { + await channel.invokeMethod('clear'); + await channel.invokeMethod('publish', { + 'foreground': true, + 'snapshot': { + 'id': 'notification-native-test', + 'version': 'initial', + 'title': 'A Wizard of Earthsea', + 'phase': 'running', + 'recordedMs': 0, + 'runningSinceMs': DateTime.now().millisecondsSinceEpoch, + 'targetMs': countdown ? 60000 : null, + }, + }); + await readActions(); + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: AppBar(title: const Text('Timer notification test')), + body: ListView( + padding: const EdgeInsets.all(24), + children: [ + ElevatedButton(onPressed: () => start(false), child: const Text('Show stopwatch')), + ElevatedButton(onPressed: () => start(true), child: const Text('Show countdown')), + ElevatedButton(onPressed: readActions, child: const Text('Read actions')), + ElevatedButton(onPressed: () => channel.invokeMethod('clear'), child: const Text('Clear')), + Text(result), + ], + ), + ); +} diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj index ffc6375e..453f0e2b 100644 --- a/app/ios/Runner.xcodeproj/project.pbxproj +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -11,15 +11,28 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3CA77AF42BB5232AA187BDF0 /* TimerActivityBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71DAFC778B73A155B06DD63 /* TimerActivityBridge.swift */; }; + 652591C9846567F3C516D822 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB81FA02508ACAF38703F4AE /* Foundation.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 868FF47BFAB5136C34AF6BE4 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F8FEBE2FA3B4198747219C3 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C563601939E0871D48137FD6 /* TimerActivityState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A4B5EE31007F3B419E6F67 /* TimerActivityState.swift */; }; + C7718ECD87F3B481BE52359F /* ReadingTimerWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461635AC1629FD038C3BCB37 /* ReadingTimerWidget.swift */; }; + D44CFA262E7B6F5B1839E7FA /* TimerActivityState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A4B5EE31007F3B419E6F67 /* TimerActivityState.swift */; }; + E65D2B6542AE4DB4126F8453 /* ReadingTimerActivity.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 9A3A1B82A863A588BDD0F91A /* ReadingTimerActivity.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 269D0DA8363325EEF62DEA71 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 16ED858D9EF44D28401EF882; + remoteInfo = ReadingTimerActivity; + }; 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 97C146E61CF9000F007C117D /* Project object */; @@ -30,6 +43,17 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 5779A4CA60B6A50B23EDCB0D /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + E65D2B6542AE4DB4126F8453 /* ReadingTimerActivity.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -49,11 +73,14 @@ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4607D6A26A6B2888B3189E77 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 461635AC1629FD038C3BCB37 /* ReadingTimerWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReadingTimerWidget.swift; sourceTree = ""; }; + 47A4B5EE31007F3B419E6F67 /* TimerActivityState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TimerActivityState.swift; sourceTree = ""; }; 49B6ECE6CE06BC06E01F8D95 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 86F202F71D48A4136C559484 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8A89C5201BBF198124CB9C3A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,11 +89,15 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9A3A1B82A863A588BDD0F91A /* ReadingTimerActivity.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ReadingTimerActivity.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 9F8FEBE2FA3B4198747219C3 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A9CA2F0011A4F0F310447163 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; B80D0741A811213178C7AB3B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BB81FA02508ACAF38703F4AE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS26.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; BE1400E849E2F285D0A2A8EE /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; C7981B0A3A6F9682FF016C05 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + F71DAFC778B73A155B06DD63 /* TimerActivityBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TimerActivityBridge.swift; sourceTree = ""; }; + FE6338B763C834842B5F3A73 /* Config.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -78,6 +109,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3B741A814AF7DE929F3B009C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 652591C9846567F3C516D822 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -90,6 +129,18 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 054013DEBA04F4222784D3F3 /* TimerActivity */ = { + isa = PBXGroup; + children = ( + 47A4B5EE31007F3B419E6F67 /* TimerActivityState.swift */, + 461635AC1629FD038C3BCB37 /* ReadingTimerWidget.swift */, + 86F202F71D48A4136C559484 /* Info.plist */, + FE6338B763C834842B5F3A73 /* Config.xcconfig */, + ); + name = TimerActivity; + path = TimerActivity; + sourceTree = ""; + }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -98,6 +149,14 @@ path = RunnerTests; sourceTree = ""; }; + 3668C4FCB9C5A01536E2DB31 /* iOS */ = { + isa = PBXGroup; + children = ( + BB81FA02508ACAF38703F4AE /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; 3DD4C4359594D66869C92A4F /* Pods */ = { isa = PBXGroup; children = ( @@ -133,6 +192,7 @@ 331C8082294A63A400263BE5 /* RunnerTests */, 3DD4C4359594D66869C92A4F /* Pods */, DE2BE2CEC624568007925435 /* Frameworks */, + 054013DEBA04F4222784D3F3 /* TimerActivity */, ); sourceTree = ""; }; @@ -141,6 +201,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + 9A3A1B82A863A588BDD0F91A /* ReadingTimerActivity.appex */, ); name = Products; sourceTree = ""; @@ -156,6 +217,7 @@ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + F71DAFC778B73A155B06DD63 /* TimerActivityBridge.swift */, ); path = Runner; sourceTree = ""; @@ -165,6 +227,7 @@ children = ( B80D0741A811213178C7AB3B /* Pods_Runner.framework */, 9F8FEBE2FA3B4198747219C3 /* Pods_RunnerTests.framework */, + 3668C4FCB9C5A01536E2DB31 /* iOS */, ); name = Frameworks; sourceTree = ""; @@ -172,6 +235,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 16ED858D9EF44D28401EF882 /* ReadingTimerActivity */ = { + isa = PBXNativeTarget; + buildConfigurationList = C8DFCAC5A101D396EC8409B1 /* Build configuration list for PBXNativeTarget "ReadingTimerActivity" */; + buildPhases = ( + D27B8C6815F4723F489969C3 /* Sources */, + 3B741A814AF7DE929F3B009C /* Frameworks */, + 217AE57C9E9E71C5C0187858 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ReadingTimerActivity; + productName = ReadingTimerActivity; + productReference = 9A3A1B82A863A588BDD0F91A /* ReadingTimerActivity.appex */; + productType = "com.apple.product-type.app-extension"; + }; 331C8080294A63A400263BE5 /* RunnerTests */ = { isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; @@ -196,6 +276,7 @@ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( 1D4DD9B09CAF9E29BC677E7E /* [CP] Check Pods Manifest.lock */, + 5779A4CA60B6A50B23EDCB0D /* Embed App Extensions */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -207,6 +288,7 @@ buildRules = ( ); dependencies = ( + 88EC704D83037C65469AC74E /* PBXTargetDependency */, ); name = Runner; packageProductDependencies = ( @@ -254,11 +336,19 @@ targets = ( 97C146ED1CF9000F007C117D /* Runner */, 331C8080294A63A400263BE5 /* RunnerTests */, + 16ED858D9EF44D28401EF882 /* ReadingTimerActivity */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 217AE57C9E9E71C5C0187858 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 331C807F294A63A400263BE5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -389,6 +479,17 @@ files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + C563601939E0871D48137FD6 /* TimerActivityState.swift in Sources */, + 3CA77AF42BB5232AA187BDF0 /* TimerActivityBridge.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D27B8C6815F4723F489969C3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D44CFA262E7B6F5B1839E7FA /* TimerActivityState.swift in Sources */, + C7718ECD87F3B481BE52359F /* ReadingTimerWidget.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -400,6 +501,12 @@ target = 97C146ED1CF9000F007C117D /* Runner */; targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; }; + 88EC704D83037C65469AC74E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ReadingTimerActivity; + target = 16ED858D9EF44D28401EF882 /* ReadingTimerActivity */; + targetProxy = 269D0DA8363325EEF62DEA71 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -545,6 +652,33 @@ }; name = Profile; }; + 67DCFFAA8AE0DFF3218CBAE4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FE6338B763C834842B5F3A73 /* Config.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TimerActivity/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = com.papyrus.papyrus.ReadingTimerActivity; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -699,6 +833,59 @@ }; name = Release; }; + A982E8604D4588DFEDC7DF22 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FE6338B763C834842B5F3A73 /* Config.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TimerActivity/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = com.papyrus.papyrus.ReadingTimerActivity; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + D5D9F78CDB84B0428AC48AD7 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FE6338B763C834842B5F3A73 /* Config.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TimerActivity/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = com.papyrus.papyrus.ReadingTimerActivity; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -732,6 +919,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C8DFCAC5A101D396EC8409B1 /* Build configuration list for PBXNativeTarget "ReadingTimerActivity" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 67DCFFAA8AE0DFF3218CBAE4 /* Release */, + A982E8604D4588DFEDC7DF22 /* Debug */, + D5D9F78CDB84B0428AC48AD7 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift index 79a628ff..47118eb8 100644 --- a/app/ios/Runner/AppDelegate.swift +++ b/app/ios/Runner/AppDelegate.swift @@ -5,6 +5,7 @@ import UniformTypeIdentifiers @main @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { private var folderAccess: PapyrusFolderAccess? + private var timerActivity: TimerActivityBridge? override func application( _ application: UIApplication, @@ -15,6 +16,9 @@ import UniformTypeIdentifiers func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + if let registrar = engineBridge.pluginRegistry.registrar(forPlugin: "PapyrusTimer") { + timerActivity = TimerActivityBridge(messenger: registrar.messenger()) + } if let registrar = engineBridge.pluginRegistry.registrar(forPlugin: "PapyrusFolders") { folderAccess = PapyrusFolderAccess(messenger: registrar.messenger(), presenter: window?.rootViewController) } diff --git a/app/ios/Runner/Info.plist b/app/ios/Runner/Info.plist index 92bfe327..366bcdc8 100644 --- a/app/ios/Runner/Info.plist +++ b/app/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + NSSupportsLiveActivities + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/app/ios/Runner/TimerActivityBridge.swift b/app/ios/Runner/TimerActivityBridge.swift new file mode 100644 index 00000000..794c5f16 --- /dev/null +++ b/app/ios/Runner/TimerActivityBridge.swift @@ -0,0 +1,57 @@ +import Flutter +import UIKit +import ActivityKit + +@MainActor +final class TimerActivityBridge { + private let channel: FlutterMethodChannel + private var observer: NSObjectProtocol? + + init(messenger: FlutterBinaryMessenger) { + channel = FlutterMethodChannel(name: "papyrus/reading_timer", binaryMessenger: messenger) + observer = NotificationCenter.default.addObserver(forName: Notification.Name("PapyrusTimerChanged"), object: nil, queue: .main) { [weak self] _ in + self?.channel.invokeMethod("changed", arguments: nil) + } + channel.setMethodCallHandler { [weak self] call, result in + Task { @MainActor in + guard self != nil else { result(nil); return } + do { + var journal = try TimerJournal.load() + let arguments = call.arguments as? [String: Any] ?? [:] + let snapshot = try (arguments["snapshot"] as? [String: Any]).map { + try JSONDecoder().decode(TimerSnapshot.self, from: JSONSerialization.data(withJSONObject: $0)) + } + switch call.method { + case "pending": + if let base = journal.base, let last = journal.actions.last { + let actions = try JSONSerialization.jsonObject(with: JSONEncoder().encode(journal.actions)) + result(["sessionId": base.id, "version": base.version, "through": last.id, "actions": actions]) + } else { result(nil) } + return + case "publish": + if journal.actions.isEmpty { + journal.base = snapshot + try journal.save() + } + case "acknowledge": + if let through = arguments["through"] as? String { + try journal.acknowledge(through: through, snapshot: snapshot) + } + case "clear": try TimerJournal().save() + default: result(FlutterMethodNotImplemented); return + } + if #available(iOS 16.2, *) { + try await TimerLiveActivity.refresh(allowStart: arguments["foreground"] as? Bool == true && UIApplication.shared.applicationState == .active) + } + result(nil) + } catch { + result(FlutterError(code: "notification", message: error.localizedDescription, details: nil)) + } + } + } + } + + deinit { + if let observer { NotificationCenter.default.removeObserver(observer) } + } +} diff --git a/app/ios/RunnerTests/RunnerTests.swift b/app/ios/RunnerTests/RunnerTests.swift index 86a7c3b1..2bf2c1fb 100644 --- a/app/ios/RunnerTests/RunnerTests.swift +++ b/app/ios/RunnerTests/RunnerTests.swift @@ -1,12 +1,69 @@ -import Flutter -import UIKit +import ActivityKit import XCTest +@testable import Runner +@MainActor class RunnerTests: XCTestCase { + private func snapshot() -> TimerSnapshot { + TimerSnapshot(id: "native-test", version: "v1", title: "A Wizard of Earthsea", phase: "running", + recordedMs: 0, runningSinceMs: Int64(Date().timeIntervalSince1970 * 1000) - 30_000, + targetMs: 60_000) + } - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } + func testJournalSurvivesReloadAndRejectsStaleControls() throws { + var journal = TimerJournal(base: snapshot()) + try journal.save() + try journal.record(sessionId: "native-test", token: "v1", kind: "pause") + journal = try TimerJournal.load() + XCTAssertEqual(journal.actions.count, 1) + XCTAssertEqual(journal.view()?.phase, "paused") + XCTAssertNil(journal.view()?.runningSinceMs) + XCTAssertGreaterThanOrEqual(journal.view()!.recordedMs, 30_000) + try journal.record(sessionId: "native-test", token: "v1", kind: "finish") + XCTAssertEqual(journal.actions.count, 1) + try TimerJournal().save() + } + func testAcknowledgementPreservesActionsAddedWhileDartWasWriting() throws { + var journal = TimerJournal(base: snapshot()) + try journal.record(sessionId: "native-test", token: "v1", kind: "pause") + let pause = journal.actions[0] + var committed = journal.view()! + committed.version = pause.id + committed.token = nil + try journal.record(sessionId: "native-test", token: pause.id, kind: "resume") + try journal.acknowledge(through: pause.id, snapshot: committed) + journal = try TimerJournal.load() + XCTAssertEqual(journal.actions.count, 1) + XCTAssertEqual(journal.view()?.phase, "running") + XCTAssertEqual(journal.base?.version, pause.id) + try TimerJournal().save() + } + + func testCountdownClampsAtZeroAfterSuspension() throws { + let value = snapshot() + let journal = TimerJournal(base: value) + let later = value.runningSinceMs! + 3_600_000 + XCTAssertEqual(journal.view(at: later)?.recordedMs, 60_000) + XCTAssertEqual(journal.view(at: later)?.phase, "finished") + XCTAssertNil(journal.view(at: later)?.runningSinceMs) + } + + func testLiveActivityIntentPausesResumesAndFinishesWithoutOpeningApp() async throws { + guard #available(iOS 17.0, *) else { return } + try TimerJournal(base: snapshot()).save() + try await TimerLiveActivity.refresh(allowStart: true) + XCTAssertEqual(Activity.activities.count, 1) + _ = try await ReadingTimerIntent(sessionId: "native-test", token: "v1", kind: "pause").perform() + var view = try XCTUnwrap(TimerJournal.load().view()) + XCTAssertEqual(view.phase, "paused") + _ = try await ReadingTimerIntent(sessionId: view.id, token: view.controlToken, kind: "resume").perform() + view = try XCTUnwrap(TimerJournal.load().view()) + XCTAssertEqual(view.phase, "running") + _ = try await ReadingTimerIntent(sessionId: view.id, token: view.controlToken, kind: "finish").perform() + XCTAssertNil(try TimerJournal.load().view()) + XCTAssertEqual(try TimerJournal.load().actions.count, 3) + XCTAssertTrue(Activity.activities.isEmpty) + try TimerJournal().save() + } } diff --git a/app/ios/TimerActivity/Config.xcconfig b/app/ios/TimerActivity/Config.xcconfig new file mode 100644 index 00000000..1cf56b24 --- /dev/null +++ b/app/ios/TimerActivity/Config.xcconfig @@ -0,0 +1 @@ +#include "../Flutter/Generated.xcconfig" diff --git a/app/ios/TimerActivity/Info.plist b/app/ios/TimerActivity/Info.plist new file mode 100644 index 00000000..ff79c79e --- /dev/null +++ b/app/ios/TimerActivity/Info.plist @@ -0,0 +1,6 @@ + + + +CFBundleDisplayNameReading timer +NSExtensionNSExtensionPointIdentifiercom.apple.widgetkit-extension + diff --git a/app/ios/TimerActivity/ReadingTimerWidget.swift b/app/ios/TimerActivity/ReadingTimerWidget.swift new file mode 100644 index 00000000..b0dad652 --- /dev/null +++ b/app/ios/TimerActivity/ReadingTimerWidget.swift @@ -0,0 +1,102 @@ +import ActivityKit +import SwiftUI +import WidgetKit + +@main +struct ReadingTimerWidget: Widget { + var body: some WidgetConfiguration { + ActivityConfiguration(for: ReadingTimerAttributes.self) { context in + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 12) { + Image(systemName: "book.closed").font(.title2) + VStack(alignment: .leading, spacing: 4) { + Text(context.state.title).font(.headline).lineLimit(2).privacySensitive() + Text(status(context)).font(.caption).foregroundStyle(.secondary) + } + Spacer(minLength: 8) + TimerClock(snapshot: context.state).font(.title2.monospacedDigit()) + } + TimerControls(snapshot: context.state, complete: context.isStale) + } + .padding(16) + .activitySystemActionForegroundColor(.primary) + .widgetURL(URL(string: "papyrus:///library/timer")) + } dynamicIsland: { context in + DynamicIsland { + DynamicIslandExpandedRegion(.leading) { + Label("Reading", systemImage: "book.closed").font(.caption) + } + DynamicIslandExpandedRegion(.trailing) { + TimerClock(snapshot: context.state).monospacedDigit() + } + DynamicIslandExpandedRegion(.bottom) { + VStack(alignment: .leading, spacing: 8) { + Text(context.state.title).font(.headline).lineLimit(1).privacySensitive() + TimerControls(snapshot: context.state, complete: context.isStale) + } + } + } compactLeading: { + Image(systemName: context.state.phase == "paused" ? "pause.fill" : "book.closed") + } compactTrailing: { + TimerClock(snapshot: context.state).monospacedDigit().frame(maxWidth: 72) + } minimal: { + Image(systemName: context.state.phase == "paused" ? "pause.fill" : "timer") + } + .widgetURL(URL(string: "papyrus:///library/timer")) + } + } + + private func status(_ context: ActivityViewContext) -> String { + if context.isStale { return "Reading goal reached" } + if context.state.phase == "finished" { + return context.state.targetMs == context.state.recordedMs ? "Reading goal reached" : "Finished" + } + return context.state.phase == "paused" ? "Paused" : "Reading" + } +} + +private struct TimerClock: View { + let snapshot: TimerSnapshot + + var body: some View { + if let start = snapshot.runningSinceMs { + if let deadline = snapshot.deadline { + Text(timerInterval: Date(timeIntervalSince1970: 0)...deadline, countsDown: true) + .multilineTextAlignment(.trailing) + } else { + Text(Date(timeIntervalSince1970: Double(start - snapshot.recordedMs) / 1000), style: .timer) + .multilineTextAlignment(.trailing) + } + } else { + let seconds = max(0, (snapshot.targetMs.map { $0 - snapshot.recordedMs } ?? snapshot.recordedMs) / 1000) + Text(seconds >= 3600 ? String(format: "%lld:%02lld:%02lld", seconds / 3600, seconds / 60 % 60, seconds % 60) + : String(format: "%02lld:%02lld", seconds / 60, seconds % 60)) + } + } +} + +private struct TimerControls: View { + let snapshot: TimerSnapshot + let complete: Bool + + var body: some View { + if #available(iOS 17.0, *) { + HStack { + if !complete && snapshot.phase != "finished" { + let running = snapshot.phase == "running" + Button(intent: ReadingTimerIntent(sessionId: snapshot.id, token: snapshot.controlToken, kind: running ? "pause" : "resume")) { + Label(running ? "Pause" : "Resume", systemImage: running ? "pause.fill" : "play.fill") + .frame(maxWidth: .infinity) + } + } + Button(intent: ReadingTimerIntent(sessionId: snapshot.id, token: snapshot.controlToken, kind: "finish")) { + Label(complete || snapshot.phase == "finished" ? "Save" : "Finish", systemImage: "stop.fill") + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.bordered) + } else { + Link("Open timer", destination: URL(string: "papyrus:///library/timer")!) + } + } +} diff --git a/app/ios/TimerActivity/TimerActivityState.swift b/app/ios/TimerActivity/TimerActivityState.swift new file mode 100644 index 00000000..428951eb --- /dev/null +++ b/app/ios/TimerActivity/TimerActivityState.swift @@ -0,0 +1,154 @@ +import Foundation +import ActivityKit +import AppIntents + +struct TimerSnapshot: Codable, Hashable { + var id: String + var version: String + var title: String + var phase: String + var recordedMs: Int64 + var runningSinceMs: Int64? + var targetMs: Int64? + var token: String? + + var controlToken: String { token ?? version } + var deadline: Date? { + guard let start = runningSinceMs, let target = targetMs else { return nil } + return Date(timeIntervalSince1970: Double(start + target - recordedMs) / 1000) + } + + func elapsed(at: Int64) -> Int64 { + let total = recordedMs + (runningSinceMs.map { max(0, at - $0) } ?? 0) + return targetMs.map { min($0, total) } ?? total + } +} + +struct TimerNativeAction: Codable { + let id: String + let kind: String + let atMs: Int64 +} + +/// Only the app process writes this journal. LiveActivityIntent runs there too. +struct TimerJournal: Codable { + var base: TimerSnapshot? + var actions: [TimerNativeAction] = [] + + static var file: URL { + FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] + .appendingPathComponent("reading-timer-notification.json") + } + + static func load() throws -> TimerJournal { + guard FileManager.default.fileExists(atPath: file.path) else { return TimerJournal() } + return try JSONDecoder().decode(TimerJournal.self, from: Data(contentsOf: file)) + } + + func save() throws { + try FileManager.default.createDirectory(at: Self.file.deletingLastPathComponent(), withIntermediateDirectories: true) + try JSONEncoder().encode(self).write(to: Self.file, options: [.atomic, .completeFileProtectionUntilFirstUserAuthentication]) + } + + func view(at: Int64 = Int64(Date().timeIntervalSince1970 * 1000)) -> TimerSnapshot? { + guard var value = base else { return nil } + for action in actions { + value.recordedMs = value.elapsed(at: action.atMs) + value.runningSinceMs = nil + value.token = action.id + switch action.kind { + case "pause": value.phase = "paused" + case "resume": value.phase = "running"; value.runningSinceMs = action.atMs + case "finish": return nil + default: break + } + } + if let target = value.targetMs, value.elapsed(at: at) >= target { + value.phase = "finished" + value.recordedMs = target + value.runningSinceMs = nil + } + return value + } + + mutating func record(sessionId: String, token: String, kind: String) throws { + guard let current = view(), current.id == sessionId, current.controlToken == token else { return } + guard ["pause", "resume", "finish"].contains(kind), actions.count < 256 else { return } + if kind == "pause" && current.phase != "running" { return } + if kind == "resume" && current.phase != "paused" { return } + actions.append(TimerNativeAction(id: UUID().uuidString, kind: kind, atMs: Int64(Date().timeIntervalSince1970 * 1000))) + try save() + } + + mutating func acknowledge(through: String, snapshot: TimerSnapshot?) throws { + guard let index = actions.firstIndex(where: { $0.id == through }) else { return } + actions = snapshot?.id == base?.id ? Array(actions.dropFirst(index + 1)) : [] + base = snapshot + try save() + } +} + +@available(iOS 16.2, *) +struct ReadingTimerAttributes: ActivityAttributes { + typealias ContentState = TimerSnapshot + var sessionId: String +} + +@available(iOS 16.2, *) +@MainActor +enum TimerLiveActivity { + private static var updating = false + private static var requested = false + private static var mayStart = false + + static func refresh(allowStart: Bool = false) async throws { + requested = true + mayStart = mayStart || allowStart + guard !updating else { return } + updating = true + defer { updating = false } + while requested { + requested = false + let start = mayStart + mayStart = false + let snapshot = try TimerJournal.load().view() + let activities = Activity.activities + for activity in activities where activity.attributes.sessionId != snapshot?.id { + await activity.end(nil, dismissalPolicy: .immediate) + } + guard let snapshot else { continue } + let content = ActivityContent(state: snapshot, staleDate: snapshot.deadline) + if let activity = activities.first(where: { $0.attributes.sessionId == snapshot.id }) { + await activity.update(content) + } else if start && snapshot.phase != "finished" && ActivityAuthorizationInfo().areActivitiesEnabled { + _ = try Activity.request(attributes: ReadingTimerAttributes(sessionId: snapshot.id), content: content, pushType: nil) + } + } + } +} + +@available(iOS 17.0, *) +struct ReadingTimerIntent: LiveActivityIntent { + static var title: LocalizedStringResource = "Control reading timer" + static var openAppWhenRun = false + + @Parameter(title: "Session") var sessionId: String + @Parameter(title: "Version") var token: String + @Parameter(title: "Action") var kind: String + + init() {} + init(sessionId: String, token: String, kind: String) { + self.sessionId = sessionId + self.token = token + self.kind = kind + } + + @MainActor + func perform() async throws -> some IntentResult { + var journal = try TimerJournal.load() + try journal.record(sessionId: sessionId, token: token, kind: kind) + try await TimerLiveActivity.refresh() + NotificationCenter.default.post(name: Notification.Name("PapyrusTimerChanged"), object: nil) + return .result() + } +} diff --git a/app/lib/config/app_router.dart b/app/lib/config/app_router.dart index 8611fda3..5faba8c3 100644 --- a/app/lib/config/app_router.dart +++ b/app/lib/config/app_router.dart @@ -1,3 +1,4 @@ +import 'package:papyrus/pages/reading_timer_page.dart'; import 'package:papyrus/pages/watched_folders_page.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -212,6 +213,11 @@ class AppRouter { path: 'notes', pageBuilder: (context, state) => NoTransitionPage(key: state.pageKey, child: const NotesPage()), ), + GoRoute( + name: 'READING_TIMER', + path: 'timer', + pageBuilder: (context, state) => NoTransitionPage(key: state.pageKey, child: const ReadingTimerPage()), + ), GoRoute( name: 'SEARCH_OPTIONS', path: 'search/options', diff --git a/app/lib/data/repositories/reading_timer_repository.dart b/app/lib/data/repositories/reading_timer_repository.dart new file mode 100644 index 00000000..43a99933 --- /dev/null +++ b/app/lib/data/repositories/reading_timer_repository.dart @@ -0,0 +1,11 @@ +import 'package:papyrus/timer/reading_timer.dart'; + +/// Captured per library so an in-flight operation cannot follow an account switch. +abstract interface class ReadingTimerRepository { + bool get isCurrent; + Future loadTimer(); + Stream watchTimer(); + Future writeTimer(ReadingTimer timer, {ReadingTimer? previous}); + Future discardTimer(ReadingTimer timer); + Future finishTimer(ReadingTimer timer, DateTime now, {int? currentPage}); +} diff --git a/app/lib/main.dart b/app/lib/main.dart index 16efa8ff..3f6e77e5 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,3 +1,5 @@ +import 'package:papyrus/services/reading_timer_notifications.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; import 'package:papyrus/folders/directory_access_factory.dart'; import 'package:papyrus/folders/folder_import_target.dart'; import 'package:papyrus/folders/watched_folders.dart'; @@ -212,6 +214,8 @@ class AcquisitionDownloadsComposition { class _PapyrusState extends State { late final DataStore _dataStore; + late final ReadingTimerProvider _readingTimer; + late final ReadingTimerNotifications _timerNotifications; late final AuthProvider _authProvider; late final AcquisitionAvailabilityProvider _acquisitionAvailabilityProvider; late final AcquisitionDownloadsComposition _acquisitionDownloadsComposition; @@ -343,6 +347,12 @@ class _PapyrusState extends State { acquisitionAvailabilityProvider: _acquisitionAvailabilityProvider, ); + _readingTimer = ReadingTimerProvider(_dataStore); + _timerNotifications = ReadingTimerNotifications( + _readingTimer, + onOpen: () => _appRouter.router.go('/library/timer'), + ); + _authProvider.addListener(_syncPowerSyncAuthState); _syncSettingsProvider.addListener(_handleSyncSettingsChanged); _syncPowerSyncAuthState(); @@ -350,6 +360,8 @@ class _PapyrusState extends State { @override void dispose() { + _timerNotifications.dispose(); + _readingTimer.dispose(); _dataStore.removeListener(_handleFolderLibraryReady); _watchedFolders.dispose(); _authProvider.removeListener(_syncPowerSyncAuthState); @@ -621,6 +633,7 @@ class _PapyrusState extends State { providers: [ // Core data store - single source of truth ChangeNotifierProvider.value(value: _dataStore), + ChangeNotifierProvider.value(value: _readingTimer), ChangeNotifierProvider.value(value: _mediaUploadQueue), ChangeNotifierProvider.value(value: _watchedFolders), ChangeNotifierProvider.value(value: _syncSettingsProvider), diff --git a/app/lib/models/reading_activity.dart b/app/lib/models/reading_activity.dart index 926b726d..b303dcba 100644 --- a/app/lib/models/reading_activity.dart +++ b/app/lib/models/reading_activity.dart @@ -145,12 +145,15 @@ List effectiveActivities(Iterable activities) return unique.values.where((value) => value.kind != 'reversal' && !reversed.contains(value.id)).toList(); } -/// Checkpoints remain immutable records; presentation groups a reader opening. +/// Checkpoints remain immutable records; presentation groups a reading session. List groupReadingActivities(Iterable ledger) { final groups = >{}; for (final entry in ledger) { - final key = entry.source == 'reader' && entry.kind == 'reading' && entry.sessionId != null + final key = + (entry.source == 'reader' || entry.deviceType == 'physical_timer') && + entry.kind == 'reading' && + entry.sessionId != null ? '${entry.bookId}:${entry.sessionId}' : entry.id; @@ -168,11 +171,11 @@ List groupReadingActivities(Iterable ledger) { final last = entries.reduce((left, right) => left.endTime.isAfter(right.endTime) ? left : right); var cursor = first.startTime; var end = first.endTime; - var seconds = 0; + var microseconds = 0; for (final entry in entries.skip(1)) { if (entry.startTime.isAfter(end)) { - seconds += end.difference(cursor).inSeconds; + microseconds += end.difference(cursor).inMicroseconds; cursor = entry.startTime; } @@ -181,7 +184,7 @@ List groupReadingActivities(Iterable ledger) { } } - seconds += end.difference(cursor).inSeconds; + microseconds += end.difference(cursor).inMicroseconds; return ReadingActivity( id: first.id, @@ -197,7 +200,8 @@ List groupReadingActivities(Iterable ledger) { source: first.source, deviceId: first.deviceId, shelfIds: first.shelfIds, - recordedSeconds: seconds, + recordedSeconds: microseconds ~/ Duration.microsecondsPerSecond, + pages: entries.fold(0, (total, activity) => total + activity.pages), coverage: entries.expand((activity) => activity.coverage).toList(), constituentIds: entries.map((activity) => activity.id).toList(), ); diff --git a/app/lib/pages/reading_timer_page.dart b/app/lib/pages/reading_timer_page.dart new file mode 100644 index 00000000..4c951652 --- /dev/null +++ b/app/lib/pages/reading_timer_page.dart @@ -0,0 +1,706 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; +import 'package:papyrus/themes/app_motion.dart'; +import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/widgets/library/library_drawer.dart'; +import 'package:papyrus/widgets/library/library_page_header.dart'; +import 'package:papyrus/widgets/shared/app_drawer.dart'; +import 'package:papyrus/widgets/shared/app_page_bar.dart'; +import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; +import 'package:papyrus/widgets/shared/searchable_book_field.dart'; +import 'package:papyrus/widgets/timer/reading_timer_clock.dart'; +import 'package:provider/provider.dart'; + +class ReadingTimerPage extends StatefulWidget { + const ReadingTimerPage({super.key}) : focusMode = false, initialBookId = null, initialTargetSeconds = null; + + const ReadingTimerPage._focus({required this.initialBookId, required this.initialTargetSeconds}) : focusMode = true; + + final bool focusMode; + final String? initialBookId; + final int? initialTargetSeconds; + + @override + State createState() => _ReadingTimerPageState(); +} + +class _ReadingTimerPageState extends State { + final _scaffold = GlobalKey(); + final _form = GlobalKey(); + final _minutes = TextEditingController(text: '30'); + String? _bookId; + String? _sessionId; + Object? _library; + bool _countdown = false; + bool _customDuration = false; + bool _saveDialogOpen = false; + bool _focusOpen = false; + + @override + void initState() { + super.initState(); + _library = context.read().libraryIdentity; + _bookId = widget.initialBookId; + _countdown = widget.initialTargetSeconds != null; + + if (widget.initialTargetSeconds != null) { + _minutes.text = '${widget.initialTargetSeconds! ~/ 60}'; + } + } + + @override + void dispose() { + _minutes.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final timer = context.watch(); + final books = context.watch().books; + final centered = context.select((preferences) => preferences.pageAlignment == 'center'); + + if (!identical(_library, timer.libraryIdentity)) { + _library = timer.libraryIdentity; + _bookId = null; + } + + if (_sessionId != timer.session?.id) { + _sessionId = timer.session?.id; + + if (timer.session != null) { + _bookId = timer.session!.bookId; + final minutes = timer.session!.targetSeconds; + + _countdown = minutes != null; + + if (minutes != null) { + _minutes.text = '${minutes ~/ 60}'; + _customDuration = ![15, 30, 60].contains(minutes ~/ 60); + } + } + } + + final book = books.where((book) => book.id == (timer.session?.bookId ?? _bookId)).firstOrNull; + final padding = libraryPageHorizontalPadding(context); + + if (widget.focusMode) { + return _focusView(context, timer, book); + } + + return Scaffold( + key: _scaffold, + drawer: const LibraryDrawer(currentPath: '/library/timer'), + body: SafeArea( + child: Column( + children: [ + LibraryCollectionHeader( + title: 'Timer', + onMenuPressed: () => openAppDrawer(context, _scaffold.currentState), + actions: [ + TextButton.icon( + onPressed: timer.available && !timer.busy && (book != null || timer.session != null) + ? () => _openFocus(timer, book) + : null, + icon: const Icon(Icons.fullscreen_rounded), + label: const Text('Focus'), + ), + ], + ), + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.all(padding), + child: Align( + alignment: centered ? Alignment.topCenter : Alignment.topLeft, + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 520), + child: Form( + key: _form, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (timer.loading) const AppLinearProgressIndicator(), + if (timer.error != null && !_saveDialogOpen) + Padding( + padding: const EdgeInsets.only(bottom: Spacing.md), + child: Semantics( + liveRegion: true, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: Spacing.sm, + children: [ + Text(timer.error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), + TextButton(onPressed: timer.busy ? null : timer.reload, child: const Text('Retry')), + ], + ), + ), + ), + _session(context, timer, books, book), + ], + ), + ), + ), + ), + ), + ), + ], + ), + ), + ); + } + + Widget _session(BuildContext context, ReadingTimerProvider timer, List books, Book? book) { + final theme = Theme.of(context); + final shape = theme.cardTheme.shape; + final session = timer.session; + final countdown = session == null ? _countdown : session.targetSeconds != null; + final editable = session == null && timer.available && !timer.busy; + + final settings = Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text('Mode', style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant)), + const SizedBox(height: Spacing.sm), + SegmentedButton( + key: ValueKey(MediaQuery.textScalerOf(context).scale(16) > 24), + expandedInsets: MediaQuery.textScalerOf(context).scale(16) > 24 ? null : EdgeInsets.zero, + direction: MediaQuery.textScalerOf(context).scale(16) > 24 ? Axis.vertical : Axis.horizontal, + style: ButtonStyle( + foregroundColor: WidgetStateProperty.resolveWith( + (states) => states.contains(WidgetState.disabled) ? theme.colorScheme.onSurfaceVariant : null, + ), + backgroundColor: WidgetStateProperty.resolveWith( + (states) => states.contains(WidgetState.disabled) && states.contains(WidgetState.selected) + ? theme.colorScheme.surfaceContainerHighest + : null, + ), + ), + segments: const [ + ButtonSegment(value: false, label: Text('Stopwatch'), icon: Icon(Icons.timer_outlined)), + ButtonSegment(value: true, label: Text('Countdown'), icon: Icon(Icons.hourglass_empty_rounded)), + ], + selected: {countdown}, + showSelectedIcon: false, + onSelectionChanged: editable ? (selection) => setState(() => _countdown = selection.single) : null, + ), + if (_countdown) + Visibility( + visible: countdown, + maintainSize: true, + maintainAnimation: true, + maintainState: true, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: Spacing.lg), + Text( + 'Duration', + style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant), + ), + const SizedBox(height: Spacing.sm), + _duration(timer, editable && countdown), + ], + ), + ), + ], + ); + + return LayoutBuilder( + key: const ValueKey('timer-panel-layout'), + builder: (context, constraints) { + return Container( + key: const ValueKey('reading-session'), + padding: const EdgeInsets.all(Spacing.lg), + decoration: ShapeDecoration( + shape: shape is OutlinedBorder + ? shape.copyWith( + side: BorderSide(color: theme.colorScheme.outlineVariant, width: shape.side.width), + ) + : RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppRadius.lg), + side: BorderSide(color: theme.colorScheme.outlineVariant), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SearchableBookField( + key: ValueKey((_library, book?.id)), + books: books, + value: book?.id, + enabled: editable, + showDetails: true, + onChanged: (id) => setState(() => _bookId = id), + ), + if (books.isEmpty && session == null) + Align( + alignment: Alignment.centerLeft, + child: TextButton(onPressed: () => context.go('/library/books'), child: const Text('Go to library')), + ), + const SizedBox(height: Spacing.xl), + _instrument(context, timer, book), + const SizedBox(height: Spacing.xl), + settings, + ], + ), + ); + }, + ); + } + + Widget _instrument(BuildContext context, ReadingTimerProvider timer, Book? book) { + final session = timer.session; + final countdown = session == null ? _countdown : session.targetSeconds != null; + final target = session?.targetSeconds ?? (int.tryParse(_minutes.text) ?? 30).clamp(1, 1440) * 60; + final elapsed = timer.elapsed; + final remaining = Duration(seconds: (target - elapsed.inSeconds).clamp(0, target)); + + final status = switch (session) { + null => 'Ready', + _ when timer.goalReached => 'Goal reached', + _ when timer.finished => 'Finished', + _ when timer.running => 'Reading', + _ => 'Paused', + }; + + return Column( + children: [ + ConstrainedBox( + constraints: BoxConstraints(maxWidth: widget.focusMode ? 420 : 400), + child: ReadingTimerClock( + key: const ValueKey('timer-clock'), + digitSize: widget.focusMode ? 88 : 64, + time: countdown ? remaining : elapsed, + progress: countdown ? remaining.inSeconds / target : elapsed.inSeconds % 60 / 60, + countdown: countdown, + status: status, + ), + ), + const SizedBox(height: Spacing.xl), + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: _controls(context, timer, book), + ), + ], + ); + } + + Future _openFocus(ReadingTimerProvider timer, Book? book) async { + if (_focusOpen || (timer.session == null && !_form.currentState!.validate())) { + return; + } + + _focusOpen = true; + + try { + await Navigator.of(context, rootNavigator: true).push( + _TimerFocusRoute( + builder: (context) => ReadingTimerPage._focus( + initialBookId: book?.id, + initialTargetSeconds: _countdown ? (int.tryParse(_minutes.text) ?? 30).clamp(1, 1440) * 60 : null, + ), + ), + ); + } finally { + _focusOpen = false; + } + } + + Widget _focusView(BuildContext context, ReadingTimerProvider timer, Book? book) { + final theme = Theme.of(context); + final actions = [ + TextButton.icon( + onPressed: () => Navigator.of(context).maybePop(), + icon: const Icon(Icons.fullscreen_exit_rounded), + label: const Text('Exit focus'), + ), + ]; + + final header = MediaQuery.sizeOf(context).width < Breakpoints.desktopSmall + ? AppPageToolbar(actions: actions) + : Padding( + padding: const EdgeInsets.only(top: Spacing.lg, left: Spacing.lg, right: Spacing.lg), + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: kMinInteractiveDimension), + child: LibraryToolbar(actions: actions), + ), + ); + + return CallbackShortcuts( + bindings: {const SingleActivator(LogicalKeyboardKey.escape): () => Navigator.of(context).maybePop()}, + child: Focus( + autofocus: true, + child: Scaffold( + key: const ValueKey('timer-focus'), + body: SafeArea( + child: Column( + children: [ + header, + Expanded( + child: LayoutBuilder( + builder: (context, constraints) => SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: constraints.maxHeight), + child: Center( + child: Padding( + padding: const EdgeInsets.all(Spacing.lg), + child: SizedBox( + width: 480, + child: Form( + key: _form, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + book?.title ?? timer.session?.bookTitle ?? 'No book selected', + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.titleMedium?.copyWith( + color: theme.colorScheme.onSurfaceVariant, + ), + ), + const SizedBox(height: Spacing.xl), + _instrument(context, timer, book), + if (timer.error != null && !_saveDialogOpen) ...[ + const SizedBox(height: Spacing.md), + Semantics( + liveRegion: true, + child: Text(timer.error!, style: TextStyle(color: theme.colorScheme.error)), + ), + TextButton( + onPressed: timer.busy ? null : timer.reload, + child: const Text('Retry'), + ), + ], + ], + ), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ); + } + + Widget _duration(ReadingTimerProvider timer, bool editable) => Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + spacing: Spacing.sm, + children: [ + for (final minutes in [15, 30, 60]) + ChoiceChip( + showCheckmark: false, + labelPadding: const EdgeInsets.symmetric(horizontal: Spacing.xs), + label: Text('$minutes min'), + selected: !_customDuration && _minutes.text == '$minutes', + onSelected: !editable + ? null + : (_) => setState(() { + _minutes.text = '$minutes'; + _customDuration = false; + }), + ), + ChoiceChip( + showCheckmark: false, + labelPadding: const EdgeInsets.symmetric(horizontal: Spacing.xs), + label: const Text('Custom'), + selected: _customDuration, + onSelected: editable ? (_) => setState(() => _customDuration = true) : null, + ), + ], + ), + ), + if (_customDuration) ...[ + const SizedBox(height: Spacing.sm), + TextFormField( + controller: _minutes, + enabled: editable, + keyboardType: TextInputType.number, + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + decoration: const InputDecoration(labelText: 'Minutes', suffixText: 'min'), + onChanged: (_) => setState(() {}), + validator: (value) { + if (!_countdown || timer.session != null) { + return null; + } + + final minutes = int.tryParse(value ?? ''); + return minutes == null || minutes < 1 || minutes > 1440 ? 'Enter 1 to 1,440 minutes.' : null; + }, + ), + ], + ], + ); + + Widget _controls(BuildContext context, ReadingTimerProvider timer, Book? book) { + final session = timer.session; + final enabled = timer.available; + final theme = Theme.of(context); + final shape = theme.outlinedButtonTheme.style?.shape?.resolve({}); + final buttonStyle = ButtonStyle( + visualDensity: VisualDensity.standard, + minimumSize: const WidgetStatePropertyAll(Size(0, 56)), + padding: const WidgetStatePropertyAll(EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm)), + shape: WidgetStatePropertyAll(shape ?? RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppRadius.md))), + textStyle: WidgetStatePropertyAll(theme.textTheme.labelLarge), + ); + + final primaryLabel = switch (session) { + null => 'Start', + _ when timer.finished => 'Save', + _ when timer.running => 'Pause', + _ => 'Resume', + }; + + final primaryIcon = switch (session) { + _ when timer.finished => Icons.check_rounded, + _ when timer.running => Icons.pause_rounded, + _ => Icons.play_arrow_rounded, + }; + + final primary = FilledButton.icon( + key: const ValueKey('timer-primary-action'), + style: buttonStyle, + onPressed: !enabled || (session == null && book == null) + ? null + : () { + if (timer.busy) { + return; + } + + if (session == null) { + if (_form.currentState!.validate()) { + timer.start(book!, targetSeconds: _countdown ? int.parse(_minutes.text) * 60 : null); + } + } else if (timer.finished) { + _save(timer, book); + } else if (timer.running) { + timer.pause(); + } else { + timer.resume(); + } + }, + icon: Icon(primaryIcon), + label: Text(primaryLabel), + ); + + final reset = IconButton.outlined( + tooltip: 'Reset timer', + style: buttonStyle, + onPressed: enabled && session != null + ? () { + if (!timer.busy) { + _reset(timer); + } + } + : null, + icon: const Icon(Icons.restart_alt_rounded), + ); + + final secondary = IconButton.outlined( + key: const ValueKey('timer-secondary-action'), + tooltip: timer.finished ? 'Resume' : 'Finish', + style: buttonStyle, + onPressed: !enabled || session == null + ? null + : () async { + if (timer.busy) { + return; + } + + if (timer.finished) { + await timer.resume(); + } else if (await timer.pause(finish: true) && mounted) { + await _save(timer, book); + } + }, + icon: Icon(timer.finished ? Icons.play_arrow_rounded : Icons.stop_rounded), + ); + + if (MediaQuery.textScalerOf(context).scale(16) > 24) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + primary, + const SizedBox(height: Spacing.sm), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(width: 56, height: 56, child: reset), + const SizedBox(width: Spacing.md), + SizedBox(width: 56, height: 56, child: secondary), + ], + ), + ], + ); + } + + return Row( + children: [ + SizedBox(width: 56, height: 56, child: reset), + const SizedBox(width: Spacing.sm), + Expanded(child: primary), + const SizedBox(width: Spacing.sm), + SizedBox(width: 56, height: 56, child: secondary), + ], + ); + } + + Future _reset(ReadingTimerProvider timer) async { + final session = timer.session; + final reset = await showDialog( + context: context, + animationStyle: AppMotion.animationStyle(context), + builder: (context) => AlertDialog( + title: const Text('Reset timer?'), + content: const Text('This session’s reading time won’t be saved.'), + actions: [ + TextButton(onPressed: () => Navigator.pop(context, false), child: const Text('Cancel')), + TextButton(onPressed: () => Navigator.pop(context, true), child: const Text('Reset')), + ], + ), + ); + + if (reset == true && mounted && timer.session?.id == session?.id) { + await timer.discard(); + } + } + + Future _save(ReadingTimerProvider timer, Book? book) async { + if (_saveDialogOpen) { + return; + } + + if (timer.elapsed.inSeconds < 1) { + await timer.discard(); + return; + } + + final sessionId = timer.session!.id; + setState(() => _saveDialogOpen = true); + + try { + final saved = await showDialog( + context: context, + animationStyle: AppMotion.animationStyle(context), + builder: (_) => _SaveSessionDialog(timer: timer, book: book, sessionId: sessionId), + ); + + if (saved == true && mounted) { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Reading session saved'))); + } + } finally { + if (mounted) { + setState(() => _saveDialogOpen = false); + } + } + } +} + +class _SaveSessionDialog extends StatefulWidget { + const _SaveSessionDialog({required this.timer, required this.book, required this.sessionId}); + + final ReadingTimerProvider timer; + final Book? book; + final String sessionId; + + @override + State<_SaveSessionDialog> createState() => _SaveSessionDialogState(); +} + +class _SaveSessionDialogState extends State<_SaveSessionDialog> { + final _page = TextEditingController(); + bool _saving = false; + + @override + void dispose() { + _page.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ListenableBuilder( + listenable: widget.timer, + builder: (context, _) { + final timer = widget.timer; + final current = timer.session?.id == widget.sessionId; + final saving = _saving || timer.busy; + final error = timer.error ?? (!current && !_saving ? 'This session is no longer available.' : null); + + return AlertDialog( + title: const Text('Save session'), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextFormField( + controller: _page, + enabled: current && !saving && widget.book != null, + keyboardType: TextInputType.number, + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + decoration: const InputDecoration(labelText: 'Current page (optional)'), + ), + if (error != null) ...[ + const SizedBox(height: Spacing.md), + Semantics( + liveRegion: true, + child: Text(error, style: TextStyle(color: Theme.of(context).colorScheme.error)), + ), + ], + ], + ), + ), + actions: [ + TextButton(onPressed: saving ? null : () => Navigator.pop(context), child: const Text('Cancel')), + FilledButton( + onPressed: !current || saving + ? null + : () async { + setState(() => _saving = true); + final saved = await timer.save(currentPage: int.tryParse(_page.text)); + + if (!context.mounted) { + return; + } + + if (saved) { + Navigator.pop(context, true); + } else { + setState(() => _saving = false); + } + }, + child: const Text('Save'), + ), + ], + ); + }, + ); +} + +class _TimerFocusRoute extends MaterialPageRoute { + _TimerFocusRoute({required super.builder}) : super(settings: const RouteSettings(name: '/library/timer/focus')); + + @override + Duration get transitionDuration => Duration.zero; + + @override + Duration get reverseTransitionDuration => Duration.zero; +} diff --git a/app/lib/powersync/library_database.dart b/app/lib/powersync/library_database.dart index 095ccfcf..cdc6a9dc 100644 --- a/app/lib/powersync/library_database.dart +++ b/app/lib/powersync/library_database.dart @@ -1,4 +1,7 @@ import 'dart:convert'; +import 'package:papyrus/data/repositories/reading_timer_repository.dart'; +import 'package:papyrus/timer/reading_timer.dart'; +import 'package:papyrus/providers/enums/library_reading_status.dart'; import 'package:papyrus/powersync/tracking_schema_version.dart'; import 'package:papyrus/data/repositories/tracking_repository.dart'; import 'package:papyrus/models/reading_goal.dart'; @@ -13,7 +16,7 @@ import 'package:powersync/powersync.dart'; import 'package:sqlite_async/sqlite_async.dart'; /// A handle bound to one opened library, invalidated before a profile switch. -class LibraryDatabase implements LibraryMembershipWriter, TrackingRepository { +class LibraryDatabase implements LibraryMembershipWriter, TrackingRepository, ReadingTimerRepository { final PowerSyncDatabase database; final Future Function() onWrite; bool active = true; @@ -315,6 +318,160 @@ class LibraryDatabase implements LibraryMembershipWriter, TrackingRepository { }, previous: force && existing != null ? {'payload': null} : null); } + static const _activeTimerQuery = + "SELECT payload FROM reading_timers WHERE status = 'active' " + "ORDER BY json_extract(payload, '\$.started_at'), id LIMIT 1"; + + Future migrateTimer() => write((tx) async { + final legacy = await tx.getOptional('SELECT payload FROM reading_timer WHERE id = ?', ['active']); + + if (legacy == null) { + return; + } + + final timer = ReadingTimer.fromJson(jsonDecode(legacy['payload'] as String) as Map); + final existing = await tx.getOptional('SELECT id FROM reading_timers WHERE id = ?', [timer.id]); + + if (existing == null) { + await _writeTimer(tx, timer); + } + + await tx.execute('DELETE FROM reading_timer WHERE id = ?', ['active']); + }); + + @override + Future loadTimer() async { + checkActive(); + final row = await database.getOptional(_activeTimerQuery); + checkActive(); + return row == null ? null : ReadingTimer.fromJson(jsonDecode(row['payload'] as String) as Map); + } + + @override + Stream watchTimer() => database.watch(_activeTimerQuery).map((rows) { + checkActive(); + return rows.isEmpty + ? null + : ReadingTimer.fromJson(jsonDecode(rows.single['payload'] as String) as Map); + }); + + Future _checkTimer(SqliteWriteContext tx, ReadingTimer? expected) async { + final row = await tx.getOptional(_activeTimerQuery); + final current = row == null + ? null + : ReadingTimer.fromJson(jsonDecode(row['payload'] as String) as Map); + + if (current?.id != expected?.id || current?.version != expected?.version) { + throw StateError('The timer changed on another device or window. Reload it before continuing.'); + } + } + + Future _writeTimer( + SqliteWriteContext tx, + ReadingTimer timer, { + ReadingTimer? previous, + String status = 'active', + }) => upsertRow(tx, 'reading_timers', { + 'id': timer.id, + 'payload': jsonEncode(timer.toJson()), + 'status': status, + 'base_version': previous?.version, + 'created_at': timer.startedAt.toIso8601String(), + 'updated_at': DateTime.now().toUtc().toIso8601String(), + }); + + @override + Future writeTimer(ReadingTimer timer, {ReadingTimer? previous}) => write((tx) async { + await _checkTimer(tx, previous); + await _writeTimer(tx, timer, previous: previous); + }); + + @override + Future discardTimer(ReadingTimer timer) => write((tx) async { + await _checkTimer(tx, timer); + await _writeTimer(tx, timer.stop(DateTime.now().toUtc()), previous: timer, status: 'discarded'); + }); + + Future _timerActivity(SqliteWriteContext tx, Map payload) => + upsertRow(tx, 'reading_activities', { + 'id': payload['id'], + 'payload': jsonEncode(payload), + 'created_at': payload['created_at'], + 'updated_at': payload['created_at'], + }); + + @override + Future finishTimer(ReadingTimer timer, DateTime now, {int? currentPage}) => write((tx) async { + await _checkTimer(tx, timer); + final row = await tx.getOptional('SELECT * FROM books WHERE id = ?', [timer.bookId]); + + if (row == null) { + throw StateError('This book is no longer in the library. Discard this session to start another.'); + } + + final book = PowerSyncBookMapper.fromRow(Map.from(row)); + + if (currentPage != null && currentPage < 0) { + throw ArgumentError('Page must not be negative.'); + } + + final pages = currentPage != null && currentPage > timer.startPage ? currentPage - timer.startPage : 0; + final activities = timer.activities(now, pages: pages); + + if (activities.isEmpty || timer.elapsed(now).inSeconds < 1) { + throw StateError('Read for at least a second before saving a session.'); + } + + await _writeTimer(tx, timer.stop(now, finish: true), previous: timer, status: 'saved'); + + for (final activity in activities) { + await _timerActivity(tx, activity.toJson()); + } + + final end = activities.last.endTime; + final completed = currentPage != null && book.pageCount != null && currentPage == book.pageCount; + final position = currentPage != null && (book.pageCount ?? 0) > 0 + ? (currentPage / book.pageCount!).clamp(0.0, 1.0) + : null; + + var status = book.readingStatus; + + if (completed) { + status = LibraryReadingStatus.completed; + } else if (status == LibraryReadingStatus.unread) { + status = LibraryReadingStatus.inProgress; + } + + final updated = book.copyWith( + currentPage: currentPage, + currentPosition: position, + lastReadAt: book.lastReadAt != null && book.lastReadAt!.isAfter(end) ? book.lastReadAt : end, + startedAt: book.startedAt ?? timer.startedAt, + readingStatus: status, + completedAt: completed ? end : null, + ); + + if (completed && book.readingStatus != LibraryReadingStatus.completed) { + await _timerActivity( + tx, + ReadingActivity( + id: timer.id, + bookId: timer.bookId, + bookTitle: timer.bookTitle, + startTime: end, + endTime: end, + createdAt: now.isBefore(end) ? end : now, + kind: 'completion', + deviceId: timer.deviceId, + deviceType: 'physical_timer', + shelfIds: timer.shelfIds, + ).toJson(), + ); + } + + await upsertRow(tx, 'books', PowerSyncBookMapper.toRow(updated), previous: PowerSyncBookMapper.toRow(book)); + }); + @override Future commitTracking({ List goals = const [], diff --git a/app/lib/powersync/papyrus_powersync_connector.dart b/app/lib/powersync/papyrus_powersync_connector.dart index d4a19fb2..d2e07238 100644 --- a/app/lib/powersync/papyrus_powersync_connector.dart +++ b/app/lib/powersync/papyrus_powersync_connector.dart @@ -53,7 +53,8 @@ class PapyrusPowerSyncConnector extends PowerSyncBackendConnector { final version = supportsTracking?.call() == false ? 0 : trackingSchemaVersion?.call() ?? currentTrackingSchemaVersion; - final deferred = version == currentTrackingSchemaVersion + final timerTransaction = transaction.crud.any((entry) => entry.table == 'reading_timers'); + final deferred = version == currentTrackingSchemaVersion || timerTransaction ? [] : transaction.crud.where((entry) => trackingTableNames.contains(entry.table)).toList(); diff --git a/app/lib/powersync/papyrus_schema.dart b/app/lib/powersync/papyrus_schema.dart index 23f3591f..d41ba63f 100644 --- a/app/lib/powersync/papyrus_schema.dart +++ b/app/lib/powersync/papyrus_schema.dart @@ -137,11 +137,18 @@ const _stagingColumns = [ Column.text('payload'), Column.integer('deleted'), ]; +const _timerColumns = [ + ..._trackingColumns, + Column.text('status'), + Column.text('base_version'), +]; const papyrusAccountSchema = Schema([ + Table('reading_timers', _timerColumns), Table('reading_goals', _trackingColumns), Table('reading_activities', _trackingColumns), Table('goal_periods', _trackingColumns), Table.localOnly('tracking_staging', _stagingColumns), + Table.localOnly('reading_timer', [Column.text('payload')]), Table('books', _bookColumns, indexes: _bookIndexes), Table('shelves', _shelvesColumns), Table('tags', _tagsColumns), @@ -153,10 +160,12 @@ const papyrusAccountSchema = Schema([ ]); const papyrusGuestSchema = Schema([ + Table.localOnly('reading_timers', _timerColumns), Table.localOnly('reading_goals', _trackingColumns), Table.localOnly('reading_activities', _trackingColumns), Table.localOnly('goal_periods', _trackingColumns), Table.localOnly('tracking_staging', _stagingColumns), + Table.localOnly('reading_timer', [Column.text('payload')]), Table.localOnly('books', _bookColumns, indexes: _bookIndexes), Table.localOnly('shelves', _shelvesColumns), Table.localOnly('tags', _tagsColumns), diff --git a/app/lib/powersync/powersync_service.dart b/app/lib/powersync/powersync_service.dart index 0b15be97..d341d726 100644 --- a/app/lib/powersync/powersync_service.dart +++ b/app/lib/powersync/powersync_service.dart @@ -203,6 +203,9 @@ class PapyrusPowerSyncService implements BookRepository, LibraryRepository, Trac await deleteFiles(snapshot.books); await database.writeTransaction((tx) async { + await tx.execute('DELETE FROM reading_timer'); + await tx.execute('DELETE FROM reading_timers'); + for (final table in libraryTableNames.reversed) { await tx.execute('DELETE FROM $table'); } @@ -334,6 +337,7 @@ class PapyrusPowerSyncService implements BookRepository, LibraryRepository, Trac _database = database; _library = LibraryDatabase(database, _refreshPendingWrites); _library!.trackingSupported = mode == LibraryDatabaseMode.guest; + await _library!.migrateTimer(); _watchBooks(database); if (mode == LibraryDatabaseMode.authenticated && connectAuthenticated) { diff --git a/app/lib/providers/goals_provider.dart b/app/lib/providers/goals_provider.dart index 6bd15d59..81603e2a 100644 --- a/app/lib/providers/goals_provider.dart +++ b/app/lib/providers/goals_provider.dart @@ -391,7 +391,11 @@ class GoalsProvider extends ChangeNotifier { final shelfIds = correcting?.shelfIds ?? store.getShelfIdsForBook(book.id); final activities = [ - if (correcting != null) store.reversalFor(correcting, note: 'Corrected entry'), + if (correcting != null) + for (final entry in store.effectiveReadingActivities.where( + (activity) => activity.id == correcting.id || correcting.constituentIds.contains(activity.id), + )) + store.reversalFor(entry, note: 'Corrected entry'), ]; if (minutes > 0 || pages > 0) { diff --git a/app/lib/providers/reading_timer_provider.dart b/app/lib/providers/reading_timer_provider.dart new file mode 100644 index 00000000..864db214 --- /dev/null +++ b/app/lib/providers/reading_timer_provider.dart @@ -0,0 +1,276 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/data/repositories/reading_timer_repository.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/services/reading_device_identity.dart'; +import 'package:papyrus/timer/reading_timer.dart'; + +class ReadingTimerProvider extends ChangeNotifier { + ReadingTimerProvider(this.store, {DateTime Function()? now, bool tick = true}) : _now = now ?? DateTime.now { + store.addListener(_libraryChanged); + _libraryChanged(); + + if (tick) { + _clock = Timer.periodic(const Duration(seconds: 1), (_) { + _libraryChanged(); + + final seconds = session?.elapsed(this.now).inSeconds; + + if (seconds != _lastSecond) { + _lastSecond = seconds; + notifyListeners(); + } + }); + } + } + + final DataStore store; + final DateTime Function() _now; + Timer? _clock; + StreamSubscription? _subscription; + ReadingTimerRepository? _repository; + ReadingTimer? _session; + int _generation = 0; + int? _lastSecond; + bool _disposed = false; + bool loading = false; + bool busy = false; + String? error; + + DateTime get now => _now().toUtc(); + Object? get libraryIdentity => _repository; + ReadingTimer? get session => _repository?.isCurrent == true ? _session : null; + bool get available => _repository?.isCurrent == true && !loading; + Duration get elapsed => session?.elapsed(now) ?? Duration.zero; + bool get running => session?.isRunning(now) == true; + bool get goalReached => session?.reachedGoal(now) == true; + bool get finished => goalReached || session?.phase == ReadingTimerPhase.finished; + + ReadingTimerRepository? _currentRepository() { + try { + final repository = store.trackingRepository; + + if (repository is ReadingTimerRepository) { + final timerRepository = repository as ReadingTimerRepository; + return timerRepository.isCurrent ? timerRepository : null; + } + + return null; + } on StateError { + return null; + } + } + + void _libraryChanged() { + final repository = _currentRepository(); + + if (identical(repository, _repository)) { + return; + } + + unawaited(_subscription?.cancel()); + _subscription = null; + _repository = repository; + _session = null; + error = null; + busy = false; + loading = repository != null; + _generation++; + + if (repository != null) { + final generation = _generation; + _subscription = repository.watchTimer().listen( + (value) { + if (_isCurrent(generation, repository)) { + _session = value; + loading = false; + notifyListeners(); + } + }, + onError: (Object failure) { + if (_isCurrent(generation, repository)) { + loading = false; + error = 'Your timer could not be loaded. Try again.'; + notifyListeners(); + } + }, + ); + } else { + notifyListeners(); + } + } + + Future reload() async { + final repository = _repository; + final generation = _generation; + + if (repository == null) { + return; + } + + loading = true; + error = null; + notifyListeners(); + + try { + final restored = await repository.loadTimer(); + + if (_isCurrent(generation, repository)) { + _session = restored; + } + } catch (_) { + if (_isCurrent(generation, repository)) { + error = 'Your timer could not be loaded. Try again.'; + } + } finally { + if (_isCurrent(generation, repository)) { + loading = false; + notifyListeners(); + } + } + } + + bool _isCurrent(int generation, ReadingTimerRepository repository) => + !_disposed && generation == _generation && identical(repository, _repository) && repository.isCurrent; + + Future _change(Future Function(ReadingTimerRepository repository) action) async { + final repository = _repository; + final generation = _generation; + + if (repository == null || !available || busy) { + return false; + } + + busy = true; + error = null; + notifyListeners(); + + try { + await action(repository); + final next = await repository.loadTimer(); + + if (!_isCurrent(generation, repository)) { + return false; + } + + _session = next; + return true; + } catch (failure) { + if (_isCurrent(generation, repository)) { + error = failure is StateError || failure is ArgumentError + ? failure.toString().replaceFirst(RegExp(r'^(Bad state|Invalid argument\(s\)):\s*'), '') + : 'Your session could not be saved. Try again. Your timer is still available.'; + } + + return false; + } finally { + if (_isCurrent(generation, repository)) { + busy = false; + notifyListeners(); + } + } + } + + Future start(Book book, {int? targetSeconds}) => _change((repository) async { + if (session != null) { + throw StateError('Finish or discard the current session before starting another.'); + } + + final timer = ReadingTimer.start( + book, + now, + ReadingDeviceIdentity.current, + store.getShelfIdsForBook(book.id), + targetSeconds: targetSeconds, + ); + + await repository.writeTimer(timer); + return timer; + }); + + Future pause({bool finish = false}) => _change((repository) async { + final previous = session!; + final next = previous.stop(now, finish: finish); + await repository.writeTimer(next, previous: previous); + return next; + }); + + Future resume() => _change((repository) async { + final previous = session!; + final stopped = previous.stop(now); + final next = stopped.resume(now, keepReading: goalReached); + await repository.writeTimer(next, previous: previous); + return next; + }); + + Future save({int? currentPage}) => _change((repository) async { + await repository.finishTimer(session!, now, currentPage: currentPage); + return null; + }); + + Future discard() => _change((repository) async { + await repository.discardTimer(session!); + return null; + }); + + /// Replays native actions at their tap times, never at app-resume time. + /// Command IDs double as versions so a crash between writing and acknowledging + /// cannot apply the same interval twice. A changed remote version wins. + Future applyNotificationActions(Map batch) async { + final current = session; + final actions = (batch['actions'] as List).map((value) => Map.from(value as Map)).toList(); + final appliedIndex = actions.indexWhere((action) => action['id'] == current?.version); + + if (current == null || + current.id != batch['sessionId'] || + (current.version != batch['version'] && appliedIndex < 0)) { + return true; + } + + return _change((repository) async { + var next = current; + + for (var index = 0; index < actions.length; index++) { + final action = actions[index]; + final kind = action['kind'] as String; + final at = DateTime.fromMillisecondsSinceEpoch(action['atMs'] as int, isUtc: true); + + if (index > appliedIndex) { + final previous = next; + + next = switch (kind) { + 'pause' => next.stop(at), + 'resume' => next.stop(at).resume(at, keepReading: next.reachedGoal(at)), + 'finish' => next.stop(at, finish: true), + _ => throw ArgumentError('Unknown timer action.'), + }; + next = ReadingTimer.fromJson({...next.toJson(), 'version': action['id']}); + await repository.writeTimer(next, previous: previous); + } + + if (kind == 'finish' && index >= appliedIndex) { + if (next.elapsed(at).inSeconds < 1) { + await repository.discardTimer(next); + } else { + await repository.finishTimer(next, at); + } + + return null; + } + } + + return next; + }); + } + + @override + void dispose() { + _disposed = true; + _clock?.cancel(); + unawaited(_subscription?.cancel()); + store.removeListener(_libraryChanged); + super.dispose(); + } +} diff --git a/app/lib/services/reading_timer_notifications.dart b/app/lib/services/reading_timer_notifications.dart new file mode 100644 index 00000000..28902298 --- /dev/null +++ b/app/lib/services/reading_timer_notifications.dart @@ -0,0 +1,154 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; + +/// Bridges native controls to the existing, profile-scoped timer repository. +/// Native actions are durably journaled before acknowledgement, including while +/// iOS suspends Dart. Their original timestamps are used when replaying them. +class ReadingTimerNotifications with WidgetsBindingObserver { + ReadingTimerNotifications(this.timer, {required this.onOpen, MethodChannel? channel, bool? supported}) + : _channel = channel ?? const MethodChannel('papyrus/reading_timer'), + _supported = + supported ?? (!kIsWeb && [TargetPlatform.android, TargetPlatform.iOS].contains(defaultTargetPlatform)) { + if (!_supported) { + return; + } + + _channel.setMethodCallHandler((call) async { + if (call.method == 'open') { + onOpen(); + } else if (call.method == 'changed') { + _lastPublished = null; + _schedule(); + } + }); + timer.addListener(_schedule); + WidgetsBinding.instance.addObserver(this); + _schedule(); + } + + final ReadingTimerProvider timer; + final VoidCallback onOpen; + final MethodChannel _channel; + final bool _supported; + bool _disposed = false; + bool _syncing = false; + bool _queued = false; + String? _lastPublished; + Object? _library; + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _lastPublished = null; + _schedule(); + } + } + + void _schedule() { + if (_disposed) { + return; + } + + _queued = true; + + if (!_syncing) { + unawaited(_sync()); + } + } + + Future _sync() async { + _syncing = true; + + try { + while (_queued && !_disposed) { + _queued = false; + + if (_library != null && !identical(_library, timer.libraryIdentity)) { + await _channel.invokeMethod('clear'); + _lastPublished = null; + } + + _library = timer.libraryIdentity; + + if (!timer.available || timer.busy) { + continue; + } + + final pending = await _channel.invokeMapMethod('pending'); + + if (_disposed || !timer.available || timer.busy) { + continue; + } + + if (pending != null) { + final applied = await timer.applyNotificationActions(pending); + + if (!applied) { + // Retain the journal for a later retry if storage is unavailable. + break; + } + + await _channel.invokeMethod('acknowledge', { + 'through': pending['through'], + 'snapshot': snapshot(timer), + }); + _lastPublished = null; + _queued = true; + continue; + } + + final value = snapshot(timer); + final encoded = jsonEncode(value); + + if (encoded != _lastPublished) { + await _channel.invokeMethod('publish', { + 'snapshot': value, + 'foreground': WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed, + }); + _lastPublished = encoded; + } + } + } on MissingPluginException { + // Unsupported runtimes and older local builds keep the in-app timer. + } on PlatformException catch (error) { + debugPrint('Timer notification unavailable: ${error.code}'); + } finally { + _syncing = false; + } + } + + static Map? snapshot(ReadingTimerProvider timer) { + final session = timer.session; + + if (session == null) { + return null; + } + + final view = timer.goalReached ? session.stop(timer.now, finish: true) : session; + + return { + 'id': session.id, + 'version': session.version, + 'title': String.fromCharCodes(session.bookTitle.runes.take(200)), + 'phase': view.phase.name, + 'recordedMs': view.recorded.inMilliseconds, + 'runningSinceMs': view.runningSince?.millisecondsSinceEpoch, + 'targetMs': view.targetSeconds == null ? null : view.targetSeconds! * 1000, + }; + } + + void dispose() { + _disposed = true; + + if (_supported) { + timer.removeListener(_schedule); + WidgetsBinding.instance.removeObserver(this); + _channel.setMethodCallHandler(null); + } + } +} diff --git a/app/lib/timer/reading_timer.dart b/app/lib/timer/reading_timer.dart new file mode 100644 index 00000000..6aa0ab14 --- /dev/null +++ b/app/lib/timer/reading_timer.dart @@ -0,0 +1,201 @@ +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/models/reading_activity.dart'; +import 'package:uuid/uuid.dart'; + +enum ReadingTimerPhase { running, paused, finished } + +class ReadingInterval { + const ReadingInterval(this.start, this.end); + + final DateTime start; + final DateTime end; + Duration get duration => end.difference(start); + + Map toJson() => {'start': start.toIso8601String(), 'end': end.toIso8601String()}; + + factory ReadingInterval.fromJson(Map json) => + ReadingInterval(DateTime.parse(json['start'] as String), DateTime.parse(json['end'] as String)); +} + +/// Timestamp-based state shared across devices. Ticks are calculated locally. +class ReadingTimer { + const ReadingTimer({ + required this.id, + required this.bookId, + required this.bookTitle, + required this.startedAt, + required this.deviceId, + required this.shelfIds, + required this.startPage, + required this.phase, + this.targetSeconds, + this.runningSince, + this.intervals = const [], + this.revision = 0, + this.versionToken, + }); + + factory ReadingTimer.start(Book book, DateTime now, String deviceId, List shelfIds, {int? targetSeconds}) { + if (targetSeconds != null && (targetSeconds < 60 || targetSeconds > 86400)) { + throw ArgumentError('Choose a duration from 1 minute to 24 hours.'); + } + + return ReadingTimer( + id: const Uuid().v4(), + bookId: book.id, + bookTitle: book.title, + startedAt: now.toUtc(), + runningSince: now.toUtc(), + deviceId: deviceId, + shelfIds: List.unmodifiable(shelfIds), + startPage: book.currentPage ?? 0, + targetSeconds: targetSeconds, + phase: ReadingTimerPhase.running, + ); + } + + final String id; + final String bookId; + final String bookTitle; + final DateTime startedAt; + final String deviceId; + final List shelfIds; + final int startPage; + final int? targetSeconds; + final ReadingTimerPhase phase; + final DateTime? runningSince; + final List intervals; + final int revision; + final String? versionToken; + String get version => versionToken ?? '$id:$revision'; + + Duration get recorded => intervals.fold(Duration.zero, (total, interval) => total + interval.duration); + + DateTime? intervalEnd(DateTime now) { + final start = runningSince; + + if (start == null) { + return null; + } + + var end = now.toUtc().isBefore(start) ? start : now.toUtc(); + final target = targetSeconds; + + if (target != null) { + final deadline = start.add(Duration(seconds: target) - recorded); + + if (end.isAfter(deadline)) { + end = deadline; + } + } + + return end; + } + + Duration elapsed(DateTime now) { + final end = intervalEnd(now); + return recorded + (end == null ? Duration.zero : end.difference(runningSince!)); + } + + bool reachedGoal(DateTime now) => targetSeconds != null && elapsed(now).inSeconds >= targetSeconds!; + bool isRunning(DateTime now) => phase == ReadingTimerPhase.running && !reachedGoal(now); + + ReadingTimer stop(DateTime now, {bool finish = false}) { + final end = intervalEnd(now); + + return _copy( + phase: finish || reachedGoal(now) ? ReadingTimerPhase.finished : ReadingTimerPhase.paused, + intervals: [ + ...intervals, + if (end != null && end.isAfter(runningSince!)) ReadingInterval(runningSince!, end), + ], + ); + } + + ReadingTimer resume(DateTime now, {bool keepReading = false}) { + final earliest = intervals.isEmpty ? startedAt : intervals.last.end; + final requested = now.toUtc(); + + return _copy( + phase: ReadingTimerPhase.running, + runningSince: requested.isBefore(earliest) ? earliest : requested, + clearTarget: keepReading, + ); + } + + ReadingTimer _copy({ + required ReadingTimerPhase phase, + DateTime? runningSince, + List? intervals, + bool clearTarget = false, + }) => ReadingTimer( + id: id, + bookId: bookId, + bookTitle: bookTitle, + startedAt: startedAt, + deviceId: deviceId, + shelfIds: shelfIds, + startPage: startPage, + targetSeconds: clearTarget ? null : targetSeconds, + phase: phase, + runningSince: runningSince, + intervals: intervals ?? this.intervals, + revision: revision + 1, + versionToken: const Uuid().v4(), + ); + + List activities(DateTime now, {int pages = 0}) { + final stopped = stop(now, finish: true); + + return [ + for (final (index, interval) in stopped.intervals.indexed) + ReadingActivity( + id: const Uuid().v5(id, '$index'), + sessionId: id, + bookId: bookId, + bookTitle: bookTitle, + startTime: interval.start, + endTime: interval.end, + createdAt: now.isBefore(interval.end) ? interval.end : now.toUtc(), + deviceId: deviceId, + deviceType: 'physical_timer', + shelfIds: shelfIds, + pages: index == stopped.intervals.length - 1 ? pages : 0, + ), + ]; + } + + Map toJson() => { + 'id': id, + 'book_id': bookId, + 'book_title': bookTitle, + 'started_at': startedAt.toIso8601String(), + 'device_id': deviceId, + 'shelf_ids': shelfIds, + 'start_page': startPage, + 'target_seconds': targetSeconds, + 'phase': phase.name, + 'running_since': runningSince?.toIso8601String(), + 'intervals': intervals.map((interval) => interval.toJson()).toList(), + 'revision': revision, + 'version': version, + }; + + factory ReadingTimer.fromJson(Map json) => ReadingTimer( + id: json['id'] as String, + bookId: json['book_id'] as String, + bookTitle: json['book_title'] as String, + startedAt: DateTime.parse(json['started_at'] as String), + deviceId: json['device_id'] as String, + shelfIds: List.from(json['shelf_ids'] as List), + startPage: json['start_page'] as int, + targetSeconds: json['target_seconds'] as int?, + phase: ReadingTimerPhase.values.byName(json['phase'] as String), + runningSince: json['running_since'] == null ? null : DateTime.parse(json['running_since'] as String), + intervals: (json['intervals'] as List) + .map((value) => ReadingInterval.fromJson(Map.from(value as Map))) + .toList(), + revision: json['revision'] as int, + versionToken: json['version'] as String?, + ); +} diff --git a/app/lib/timer/reading_timer_format.dart b/app/lib/timer/reading_timer_format.dart new file mode 100644 index 00000000..38bf9991 --- /dev/null +++ b/app/lib/timer/reading_timer_format.dart @@ -0,0 +1,6 @@ +String readingTimerClock(Duration duration) { + final seconds = duration.inSeconds.clamp(0, 99999999); + final minutes = (seconds ~/ 60 % 60).toString().padLeft(2, '0'); + final remainder = (seconds % 60).toString().padLeft(2, '0'); + return seconds >= 3600 ? '${seconds ~/ 3600}:$minutes:$remainder' : '$minutes:$remainder'; +} diff --git a/app/lib/widgets/library/library_drawer.dart b/app/lib/widgets/library/library_drawer.dart index 882fba42..3d639b1d 100644 --- a/app/lib/widgets/library/library_drawer.dart +++ b/app/lib/widgets/library/library_drawer.dart @@ -110,6 +110,15 @@ class LibraryDrawer extends StatelessWidget { context.go('/library/notes'); }, ), + _DrawerNavItem( + icon: Icons.timer_outlined, + label: 'Timer', + isSelected: currentPath == '/library/timer', + onTap: () { + Navigator.of(context).pop(); + context.go('/library/timer'); + }, + ), ], ), ), diff --git a/app/lib/widgets/shared/app_page_bar.dart b/app/lib/widgets/shared/app_page_bar.dart index 44a0003a..174531a2 100644 --- a/app/lib/widgets/shared/app_page_bar.dart +++ b/app/lib/widgets/shared/app_page_bar.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/themes/design_tokens.dart'; /// Mobile toolbar geometry shared by scaffold app bars and inline page headers. /// The containing page or scaffold owns the system safe-area inset. class AppPageToolbar extends StatelessWidget { - const AppPageToolbar({super.key, this.leading, this.content, this.actions = const []}); + const AppPageToolbar({super.key, this.leading, this.content, this.actions = const [], this.scrollAware = true}); final Widget? leading; final Widget? content; final List actions; + final bool scrollAware; static const padding = EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm); @@ -25,34 +27,106 @@ class AppPageToolbar extends StatelessWidget { } @override - Widget build(BuildContext context) => Padding( - padding: padding, - child: ConstrainedBox( - constraints: BoxConstraints(minHeight: height(context) - padding.vertical), - child: IconTheme.merge( - data: const IconThemeData(size: IconSizes.navigation), - child: Row( - children: [ - if (leading != null) ...[ - SizedBox.square(dimension: TouchTargets.mobileRecommended, child: leading), - const SizedBox(width: Spacing.sm), - ], - Expanded(child: content ?? const SizedBox.shrink()), - for (final action in actions) ...[ - const SizedBox(width: Spacing.sm), - ConstrainedBox( - constraints: const BoxConstraints( - minWidth: TouchTargets.mobileRecommended, - minHeight: TouchTargets.mobileRecommended, + Widget build(BuildContext context) { + final toolbar = Padding( + padding: padding, + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: height(context) - padding.vertical), + child: IconTheme.merge( + data: const IconThemeData(size: IconSizes.navigation), + child: Row( + children: [ + if (leading != null) ...[ + SizedBox.square(dimension: TouchTargets.mobileRecommended, child: leading), + const SizedBox(width: Spacing.sm), + ], + Expanded(child: content ?? const SizedBox.shrink()), + for (final action in actions) ...[ + const SizedBox(width: Spacing.sm), + ConstrainedBox( + constraints: const BoxConstraints( + minWidth: TouchTargets.mobileRecommended, + minHeight: TouchTargets.mobileRecommended, + ), + child: action, ), - child: action, - ), + ], ], - ], + ), ), ), - ), - ); + ); + + return scrollAware ? _ScrolledHeader(child: toolbar) : toolbar; + } +} + +/// Inline headers share the Scaffold's scroll observer with native app bars. +class _ScrolledHeader extends StatefulWidget { + const _ScrolledHeader({required this.child}); + + final Widget child; + + @override + State<_ScrolledHeader> createState() => _ScrolledHeaderState(); +} + +class _ScrolledHeaderState extends State<_ScrolledHeader> { + ScrollNotificationObserverState? _observer; + bool _scrolledUnder = false; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _observer?.removeListener(_onScroll); + _observer = ScrollNotificationObserver.maybeOf(context); + _observer?.addListener(_onScroll); + } + + @override + void dispose() { + _observer?.removeListener(_onScroll); + super.dispose(); + } + + void _onScroll(ScrollNotification notification) { + if (notification is! ScrollUpdateNotification || !defaultScrollNotificationPredicate(notification)) { + return; + } + + final metrics = notification.metrics; + final scrolledUnder = switch (metrics.axisDirection) { + AxisDirection.down => metrics.extentBefore > 0, + AxisDirection.up => metrics.extentAfter > 0, + AxisDirection.left || AxisDirection.right => _scrolledUnder, + }; + + if (scrolledUnder != _scrolledUnder) { + setState(() => _scrolledUnder = scrolledUnder); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final bar = theme.appBarTheme; + final states = {if (_scrolledUnder) WidgetState.scrolledUnder}; + final background = + bar.backgroundColor ?? + (_scrolledUnder && theme.useMaterial3 ? theme.colorScheme.surfaceContainer : theme.colorScheme.surface); + final elevation = bar.elevation ?? (theme.useMaterial3 ? 0 : 4); + + return Material( + color: WidgetStateProperty.resolveAs(background, states), + elevation: _scrolledUnder ? bar.scrolledUnderElevation ?? (theme.useMaterial3 ? 3 : elevation) : elevation, + shadowColor: bar.shadowColor ?? (theme.useMaterial3 ? Colors.transparent : theme.shadowColor), + surfaceTintColor: bar.surfaceTintColor ?? (theme.useMaterial3 ? theme.colorScheme.surfaceTint : null), + shape: bar.shape, + animationDuration: AppMotion.duration(context, kThemeChangeDuration), + textStyle: DefaultTextStyle.of(context).style, + child: widget.child, + ); + } } /// Scaffold app bar using the same mobile toolbar as inline page headers. @@ -112,7 +186,9 @@ class AppPageBar extends StatelessWidget implements PreferredSizeWidget { : null, centerTitle: compact ? false : null, titleSpacing: compact ? 0 : null, - title: compact ? AppPageToolbar(leading: navigation, content: title, actions: actions) : title, + title: compact + ? AppPageToolbar(leading: navigation, content: title, actions: actions, scrollAware: false) + : title, actions: compact ? null : actions, ); } diff --git a/app/lib/widgets/shared/searchable_book_field.dart b/app/lib/widgets/shared/searchable_book_field.dart index 56dcd1d5..d72e02bb 100644 --- a/app/lib/widgets/shared/searchable_book_field.dart +++ b/app/lib/widgets/shared/searchable_book_field.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:papyrus/models/book.dart'; import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/widgets/book/private_book_cover.dart'; import 'package:papyrus/widgets/shared/app_bottom_sheet.dart'; /// A validated library selection, with title, author and ISBN search. @@ -11,12 +12,21 @@ class SearchableBookField extends FormField { required List books, String? value, super.enabled = true, + bool showDetails = false, required ValueChanged onChanged, }) : super( initialValue: value, validator: (value) => books.any((book) => book.id == value) ? null : 'Choose a book.', builder: (field) { final selected = books.where((book) => book.id == field.value).firstOrNull; + final theme = Theme.of(field.context); + final shape = theme.cardTheme.shape; + final cardBorder = OutlineInputBorder( + borderRadius: shape is RoundedRectangleBorder + ? shape.borderRadius.resolve(Directionality.of(field.context)) + : BorderRadius.circular(AppRadius.lg), + borderSide: BorderSide(color: theme.colorScheme.outlineVariant), + ); return InkWell( onTap: !enabled || books.isEmpty @@ -38,19 +48,103 @@ class SearchableBookField extends FormField { } }, child: InputDecorator( - isEmpty: selected == null, + isEmpty: selected == null && !showDetails, decoration: InputDecoration( - labelText: 'Book', + labelText: showDetails ? null : 'Book', + filled: showDetails ? false : null, + contentPadding: showDetails ? const EdgeInsets.all(Spacing.md) : null, + border: showDetails ? cardBorder : null, + enabledBorder: showDetails ? cardBorder : null, errorText: field.errorText, - suffixIcon: const Icon(Icons.search), + suffixIcon: showDetails + ? const Padding( + padding: EdgeInsetsDirectional.only(end: Spacing.md), + child: Icon(Icons.expand_more_rounded), + ) + : const Icon(Icons.search), ), - child: Text(selected?.title ?? '', maxLines: 2, overflow: TextOverflow.ellipsis), + child: showDetails + ? _BookDetails(book: selected) + : Text(selected?.title ?? '', maxLines: 2, overflow: TextOverflow.ellipsis), ), ); }, ); } +class _BookDetails extends StatelessWidget { + const _BookDetails({this.book}); + + final Book? book; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final secondary = theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant); + + final cover = Container( + width: 48, + height: 64, + decoration: BoxDecoration( + color: theme.colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(AppRadius.sm), + ), + clipBehavior: Clip.antiAlias, + child: CoverImage( + bookId: book?.id, + imageUrl: book?.coverUrl, + mediaId: book?.coverMediaId, + placeholder: Icon(Icons.menu_book_rounded, color: theme.colorScheme.onPrimaryContainer), + ), + ); + + final details = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + book == null ? 'Book' : 'Currently reading', + style: secondary, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: Spacing.xs), + Text( + book?.title ?? 'Choose a book', + style: theme.textTheme.titleMedium, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: Spacing.xs), + Text( + book?.allAuthors.isNotEmpty == true ? book!.allAuthors : ' ', + style: secondary, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ); + + if (MediaQuery.textScalerOf(context).scale(16) > 24) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + cover, + const SizedBox(height: Spacing.sm), + details, + ], + ); + } + + return Row( + children: [ + cover, + const SizedBox(width: Spacing.md), + Expanded(child: details), + ], + ); + } +} + class _BookSearchSheet extends StatefulWidget { const _BookSearchSheet({required this.books, this.selectedId}); final List books; diff --git a/app/lib/widgets/shell/adaptive_app_shell.dart b/app/lib/widgets/shell/adaptive_app_shell.dart index 6c360f50..70dd487e 100644 --- a/app/lib/widgets/shell/adaptive_app_shell.dart +++ b/app/lib/widgets/shell/adaptive_app_shell.dart @@ -99,6 +99,12 @@ class AdaptiveAppShell extends StatelessWidget { count: dataStore.notes.length, selectedIcon: Icons.notes, ), + const AppShellNavItem( + path: '/library/timer', + label: 'Timer', + icon: Icons.timer_outlined, + selectedIcon: Icons.timer, + ), ], ), const AppShellNavItem( diff --git a/app/lib/widgets/timer/reading_timer_clock.dart b/app/lib/widgets/timer/reading_timer_clock.dart new file mode 100644 index 00000000..6096128c --- /dev/null +++ b/app/lib/widgets/timer/reading_timer_clock.dart @@ -0,0 +1,145 @@ +import 'dart:math' as math; + +import 'package:flutter/material.dart'; +import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/timer/reading_timer_format.dart'; + +/// A determinate reading clock: remaining fraction, or seconds within a minute. +class ReadingTimerClock extends StatelessWidget { + const ReadingTimerClock({ + super.key, + required this.time, + required this.progress, + required this.countdown, + required this.status, + this.digitSize = 64, + }); + + final Duration time; + final double progress; + final bool countdown; + final String status; + final double digitSize; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final clock = readingTimerClock(time); + + final largeText = MediaQuery.textScalerOf(context).scale(16) > 22; + final label = Text( + countdown ? 'Time remaining' : 'Time elapsed', + textAlign: TextAlign.center, + style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant), + ); + + final digitStyle = theme.textTheme.displayLarge?.copyWith( + fontSize: digitSize, + fontWeight: FontWeight.w300, + fontFeatures: const [FontFeature.tabularFigures()], + ); + + final digits = SizedBox( + width: double.infinity, + height: MediaQuery.textScalerOf(context).scale(digitSize) * (digitStyle?.height ?? 1), + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text(clock, style: digitStyle), + ), + ); + + final state = Container( + padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: Spacing.xs), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppRadius.md), + side: BorderSide(color: theme.colorScheme.outlineVariant), + ), + ), + child: Text(status, textAlign: TextAlign.center, style: theme.textTheme.labelLarge), + ); + + final ring = AspectRatio( + aspectRatio: 1, + child: CustomPaint( + painter: _ClockRing( + progress: progress, + color: theme.colorScheme.primary, + track: Color.alphaBlend(theme.colorScheme.onSurface.withValues(alpha: 0.18), theme.colorScheme.surface), + ), + child: Padding( + padding: const EdgeInsets.all(Spacing.xl), + child: largeText + ? Center(child: digits) + : Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + label, + const SizedBox(height: Spacing.sm), + Flexible(child: digits), + const SizedBox(height: Spacing.sm), + state, + ], + ), + ), + ), + ); + + return Semantics( + label: '${countdown ? 'Time remaining' : 'Time elapsed'}: $clock. $status', + child: ExcludeSemantics( + child: largeText + ? Column( + children: [ + label, + const SizedBox(height: Spacing.sm), + ring, + const SizedBox(height: Spacing.sm), + state, + ], + ) + : ring, + ), + ); + } +} + +class _ClockRing extends CustomPainter { + const _ClockRing({required this.progress, required this.color, required this.track}); + + final double progress; + final Color color; + final Color track; + static const double _strokeWidth = 28; + + @override + void paint(Canvas canvas, Size size) { + final center = size.center(Offset.zero); + final radius = size.shortestSide / 2 - _strokeWidth / 2 - 2; + + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = _strokeWidth + ..strokeCap = StrokeCap.round + ..color = track; + + canvas.drawCircle(center, radius, paint); + + if (progress > 0) { + paint.color = color; + canvas.drawArc( + Rect.fromCircle(center: center, radius: radius), + -math.pi / 2, + math.pi * 2 * progress, + false, + paint, + ); + } else { + canvas.drawCircle(Offset(center.dx, center.dy - radius), _strokeWidth / 2, Paint()..color = color); + } + } + + @override + bool shouldRepaint(_ClockRing oldDelegate) => + progress != oldDelegate.progress || color != oldDelegate.color || track != oldDelegate.track; +} diff --git a/app/test/goals/goals_provider_test.dart b/app/test/goals/goals_provider_test.dart index a8171ee4..5bb721a7 100644 --- a/app/test/goals/goals_provider_test.dart +++ b/app/test/goals/goals_provider_test.dart @@ -1,3 +1,5 @@ +import 'package:papyrus/models/reading_activity.dart'; +import 'package:papyrus/timer/reading_timer.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:papyrus/services/reading_device_identity.dart'; @@ -35,6 +37,25 @@ void main() { expect(ReadingDeviceIdentity.current, 'installation-one'); }); + test('correcting a timer session reverses all paused intervals', () async { + final start = DateTime.utc(2026, 11, 3, 12); + final now = start.add(const Duration(hours: 1)); + final book = Book(id: 'book', title: 'Book', author: '', addedAt: start, isPhysical: true); + final store = DataStore()..loadData(books: [book]); + final provider = GoalsProvider(now: () => now, watchClock: false)..attach(store); + addTearDown(provider.dispose); + addTearDown(store.dispose); + var timer = ReadingTimer.start(book, start, 'device', []); + timer = timer.stop(start.add(const Duration(minutes: 10))); + timer = timer.resume(start.add(const Duration(minutes: 20))); + await store.commitTracking(activities: timer.activities(start.add(const Duration(minutes: 30)))); + final grouped = groupReadingActivities(store.effectiveReadingActivities).single; + await provider.logReading(book: book, end: now, minutes: 15, correcting: grouped); + expect(store.effectiveReadingActivities.length, 1); + expect(store.effectiveReadingActivities.single.seconds, 900); + expect(store.readingActivities.where((activity) => activity.kind == 'reversal').length, 2); + }); + test('correcting duplicate completions only clears status after the last confirmation', () async { var now = DateTime.utc(2026, 10, 5, 12); final book = Book(id: 'book', title: 'Book', author: '', addedAt: now); diff --git a/app/test/pages/reading_timer_page_test.dart b/app/test/pages/reading_timer_page_test.dart new file mode 100644 index 00000000..7d9e8c09 --- /dev/null +++ b/app/test/pages/reading_timer_page_test.dart @@ -0,0 +1,661 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/pages/reading_timer_page.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/shared/app_page_bar.dart'; +import 'package:papyrus/widgets/shared/searchable_book_field.dart'; +import 'package:papyrus/widgets/timer/reading_timer_clock.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../timer/timer_test_library.dart'; + +void main() { + setUpAll(() async { + final flutterRoot = Platform.environment['FLUTTER_ROOT']!; + final font = File('$flutterRoot/bin/cache/artifacts/material_fonts/Roboto-Regular.ttf'); + await (FontLoader('Roboto')..addFont(Future.value(ByteData.sublistView(font.readAsBytesSync())))).load(); + final icons = File('$flutterRoot/bin/cache/artifacts/material_fonts/MaterialIcons-Regular.otf'); + await (FontLoader('MaterialIcons')..addFont(Future.value(ByteData.sublistView(icons.readAsBytesSync())))).load(); + }); + + final start = DateTime.utc(2026, 11, 3, 12); + final book = Book(id: 'digital', title: 'A Wizard of Earthsea', author: 'Ursula K. Le Guin', addedAt: start); + late TimerTestLibrary library; + late DataStore store; + late ReadingTimerProvider timer; + late PreferencesProvider preferences; + late DateTime now; + + setUp(() async { + SharedPreferences.setMockInitialValues({}); + preferences = PreferencesProvider(await SharedPreferences.getInstance()); + library = TimerTestLibrary()..replaceAll([book]); + store = DataStore(bookRepository: library); + now = start; + timer = ReadingTimerProvider(store, now: () => now, tick: false); + await timer.reload(); + }); + + tearDown(() { + timer.dispose(); + store.dispose(); + preferences.dispose(); + library.trackingRepository.changes.close(); + }); + + Future pump( + WidgetTester tester, { + Size size = const Size(1200, 900), + double scale = 1, + ThemeData? theme, + }) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = size; + addTearDown(tester.view.reset); + await tester.pumpWidget( + MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: store), + ChangeNotifierProvider.value(value: timer), + ChangeNotifierProvider.value(value: preferences), + ], + child: MaterialApp( + theme: theme ?? AppTheme.dark, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), + child: child!, + ), + home: const ReadingTimerPage(), + ), + ), + ); + await tester.pumpAndSettle(); + } + + Future tap(WidgetTester tester, String label) async { + final text = find.text(label); + final target = text.evaluate().isEmpty ? find.byTooltip(label).last : text.last; + await tester.ensureVisible(target); + await tester.tap(target); + await tester.pumpAndSettle(); + } + + Future selectBook(WidgetTester tester) async { + await tester.tap(find.byType(SearchableBookField)); + await tester.pumpAndSettle(); + expect(find.text('Search books'), findsOneWidget); + await tap(tester, book.title); + } + + testWidgets('focus preserves setup and the same running timer when opened and closed', (tester) async { + await pump(tester); + expect(tester.widget(find.widgetWithText(TextButton, 'Focus')).onPressed, isNull); + await selectBook(tester); + await tap(tester, 'Countdown'); + await tap(tester, '15 min'); + await tap(tester, 'Focus'); + expect(find.byKey(const ValueKey('timer-focus')), findsOneWidget); + expect(find.byType(SearchableBookField), findsNothing); + expect(find.text('Mode'), findsNothing); + expect(find.text('Duration'), findsNothing); + expect(timer.session, isNull); + await tap(tester, 'Start'); + final session = timer.session!; + expect(session.bookId, book.id); + expect(session.targetSeconds, 900); + now = now.add(const Duration(seconds: 45)); + await tap(tester, 'Exit focus'); + expect(timer.session, same(session)); + expect(timer.elapsed, const Duration(seconds: 45)); + expect(find.byKey(const ValueKey('timer-focus')), findsNothing); + await tap(tester, 'Focus'); + expect(timer.session, same(session)); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); + expect(find.byKey(const ValueKey('timer-focus')), findsNothing); + expect(timer.running, isTrue); + }); + + testWidgets('iOS edge swipe exits focus without stopping the timer', (tester) async { + await pump( + tester, + size: const Size(390, 844), + theme: AppTheme.dark.copyWith(platform: TargetPlatform.iOS), + ); + await selectBook(tester); + await tap(tester, 'Start'); + final session = timer.session!; + await tap(tester, 'Focus'); + await tester.dragFrom(const Offset(1, 400), const Offset(340, 0)); + await tester.pumpAndSettle(); + expect(find.byKey(const ValueKey('timer-focus')), findsNothing); + expect(timer.session, same(session)); + expect(timer.running, isTrue); + }); + + testWidgets('focus opens and closes without transition animations', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Focus'); + final route = ModalRoute.of(tester.element(find.byKey(const ValueKey('timer-focus'))))!; + expect(route.transitionDuration, Duration.zero); + expect(route.reverseTransitionDuration, Duration.zero); + }); + + for (final size in [const Size(1200, 900), const Size(390, 844)]) { + testWidgets('focus toggle keeps its header position at width ${size.width}', (tester) async { + await pump(tester, size: size); + await selectBook(tester); + final enter = tester.getRect(find.widgetWithText(TextButton, 'Focus')); + await tap(tester, 'Focus'); + final exit = tester.getRect(find.widgetWithText(TextButton, 'Exit focus')); + expect(exit.right, enter.right); + expect(exit.center.dy, enter.center.dy); + expect(exit.height, enter.height); + }); + } + + testWidgets('mobile timer header changes surface when scrolled and resets at the top', (tester) async { + final fonts = AppTheme.dark.textTheme.apply(fontFamily: 'Roboto'); + await pump( + tester, + size: const Size(390, 600), + theme: AppTheme.dark.copyWith( + textTheme: fonts, + textButtonTheme: TextButtonThemeData( + style: AppTheme.dark.textButtonTheme.style?.copyWith(textStyle: WidgetStatePropertyAll(fonts.labelLarge)), + ), + ), + ); + + final surface = find.descendant(of: find.byType(AppPageToolbar), matching: find.byType(Material)).first; + final initial = tester.widget(surface).elevation; + final header = tester.getRect(find.byType(AppPageToolbar)); + final scroll = tester.state(find.byType(Scrollable).first).position; + scroll.jumpTo(scroll.maxScrollExtent); + await tester.pumpAndSettle(); + expect(tester.widget(surface).elevation, greaterThan(initial)); + expect(tester.getRect(find.byType(AppPageToolbar)), header); + + scroll.jumpTo(0); + await tester.pumpAndSettle(); + expect(tester.widget(surface).elevation, initial); + }); + + testWidgets('focus actions pause resume and save through the existing session flow', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Start'); + now = now.add(const Duration(minutes: 2)); + await tap(tester, 'Focus'); + await tap(tester, 'Pause'); + expect(timer.running, isFalse); + await tap(tester, 'Resume'); + now = now.add(const Duration(minutes: 1)); + await tap(tester, 'Finish'); + await tester.enterText(find.byType(TextFormField), '12'); + await tap(tester, 'Save'); + expect(library.trackingRepository.savedSeconds, 180); + expect(library.trackingRepository.savedPage, 12); + expect(find.byKey(const ValueKey('timer-focus')), findsOneWidget); + await tester.binding.handlePopRoute(); + await tester.pumpAndSettle(); + expect(find.byKey(const ValueKey('timer-focus')), findsNothing); + expect(timer.session, isNull); + }); + + testWidgets('remote state changes update focus without toggling its local presentation', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Focus'); + await timer.start(book, targetSeconds: 60); + await tester.pumpAndSettle(); + expect(find.text('Time remaining'), findsOneWidget); + now = now.add(const Duration(minutes: 2)); + await timer.reload(); + await tester.pumpAndSettle(); + expect(find.text('Goal reached'), findsOneWidget); + await timer.discard(); + await tester.pumpAndSettle(); + expect(find.byKey(const ValueKey('timer-focus')), findsOneWidget); + expect(find.text('Ready'), findsOneWidget); + }); + + for (final (name, size, scale, theme) in [ + ('desktop-dark', const Size(1440, 900), 1.0, AppTheme.dark), + ('phone-dark', const Size(390, 844), 1.0, AppTheme.dark), + ('phone-light', const Size(390, 844), 1.0, AppTheme.light), + ('phone-eink-large', const Size(320, 700), 2.0, AppTheme.eink), + ('phone-landscape', const Size(844, 390), 1.0, AppTheme.dark), + ]) { + testWidgets('focus $name keeps actions reachable', (tester) async { + final fonts = theme.textTheme.apply(fontFamily: 'Roboto'); + + await pump( + tester, + size: size, + scale: scale, + theme: theme.copyWith( + textTheme: fonts, + textButtonTheme: TextButtonThemeData( + style: theme.textButtonTheme.style?.copyWith(textStyle: WidgetStatePropertyAll(fonts.labelLarge)), + ), + ), + ); + + await selectBook(tester); + await tap(tester, 'Countdown'); + await tap(tester, 'Start'); + now = now.add(const Duration(minutes: 5)); + await tap(tester, 'Focus'); + expect(find.text('25:00'), findsOneWidget); + expect(tester.takeException(), isNull); + + await tap(tester, 'Pause'); + expect(timer.running, isFalse); + + await tap(tester, 'Exit focus'); + expect(find.byKey(const ValueKey('timer-focus')), findsNothing); + expect(tester.takeException(), isNull); + }); + } + + testWidgets('empty library keeps clock visible and start disabled', (tester) async { + store.replaceBooksFromSync([]); + await pump(tester); + expect(find.byType(ReadingTimerClock), findsOneWidget); + expect(tester.widget(find.widgetWithText(FilledButton, 'Start')).onPressed, isNull); + expect(find.text('Go to library'), findsOneWidget); + }); + + testWidgets('selects an ebook, pauses, resumes and saves optional page progress', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Start'); + now = start.add(const Duration(minutes: 2, seconds: 15)); + await tap(tester, 'Pause'); + expect(timer.elapsed, const Duration(minutes: 2, seconds: 15)); + expect(tester.widget(find.byType(ReadingTimerClock)).progress, 0.25); + now = now.add(const Duration(minutes: 5)); + await tap(tester, 'Resume'); + now = now.add(const Duration(minutes: 1)); + await tap(tester, 'Finish'); + expect(find.text('Save session'), findsOneWidget); + expect(library.trackingRepository.saves, 0); + await tester.enterText(find.byType(TextFormField), '12'); + await tap(tester, 'Save'); + expect(timer.session, isNull); + expect(find.byType(AlertDialog), findsNothing); + expect(library.trackingRepository.savedSeconds, 195); + expect(library.trackingRepository.savedPage, 12); + expect(library.trackingRepository.saves, 1); + expect(find.text('Reading session saved'), findsOneWidget); + }); + + testWidgets('countdown drains, caps at zero and can continue without counting the gap', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Countdown'); + await tap(tester, 'Custom'); + await tester.enterText(find.byType(TextFormField), '1'); + await tap(tester, 'Start'); + now = now.add(const Duration(seconds: 30)); + await timer.reload(); + await tester.pumpAndSettle(); + expect(tester.widget(find.byType(ReadingTimerClock)).progress, 0.5); + now = now.add(const Duration(minutes: 10)); + await timer.reload(); + await tester.pumpAndSettle(); + expect(find.text('Goal reached'), findsOneWidget); + expect(tester.widget(find.byType(ReadingTimerClock)).time, Duration.zero); + await tap(tester, 'Resume'); + now = now.add(const Duration(seconds: 30)); + await tap(tester, 'Finish'); + await tap(tester, 'Save'); + expect(library.trackingRepository.savedSeconds, 90); + }); + + for (final countdown in [false, true]) { + testWidgets('immediately finishing ${countdown ? 'countdown' : 'stopwatch'} clears it without a prompt', ( + tester, + ) async { + await pump(tester); + await selectBook(tester); + + if (countdown) { + await tap(tester, 'Countdown'); + } + + await tap(tester, 'Start'); + now = now.add(const Duration(milliseconds: 500)); + await tap(tester, 'Finish'); + expect(timer.session, isNull); + expect(timer.error, isNull); + expect(find.byType(AlertDialog), findsNothing); + expect(find.text('Start'), findsOneWidget); + expect(library.trackingRepository.saves, 0); + expect(find.text('Reading session saved'), findsNothing); + }); + } + + testWidgets('failed save appears only in the dialog and keeps entered progress for retry', (tester) async { + await timer.start(book); + now = now.add(const Duration(minutes: 1)); + await timer.pause(finish: true); + await pump(tester); + await tap(tester, 'Save'); + await tester.enterText(find.byType(TextFormField), '9'); + library.trackingRepository.failWrite = true; + await tap(tester, 'Save'); + expect(find.text('Save failed. Try again.', skipOffstage: false), findsOneWidget); + expect(find.byType(AlertDialog), findsOneWidget); + expect(timer.session, isNotNull); + library.trackingRepository.failWrite = false; + await tap(tester, 'Save'); + expect(timer.session, isNull); + expect(library.trackingRepository.saves, 1); + expect(library.trackingRepository.savedSeconds, 60); + expect(library.trackingRepository.savedPage, 9); + }); + + for (final page in [null, 5, 199]) { + testWidgets('one-second session offers optional page input $page without range checks', (tester) async { + final selected = book.copyWith(pageCount: 98, currentPage: 50); + store.replaceBooksFromSync([selected]); + await timer.start(selected); + now = now.add(const Duration(seconds: 1)); + await pump(tester); + await tap(tester, 'Finish'); + expect(find.text('Save session'), findsOneWidget); + + if (page != null) { + await tester.enterText(find.byType(TextFormField), '$page'); + } + + await tester.tap(find.widgetWithText(FilledButton, 'Save').last); + + for (var frame = 0; frame < 25; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + expect(find.text('This session is no longer available.', skipOffstage: false), findsNothing); + } + + expect(timer.session, isNull); + expect(library.trackingRepository.savedPage, page); + expect(library.trackingRepository.savedSeconds, 1); + expect(find.text('Reading session saved'), findsOneWidget); + }); + } + + testWidgets('invalid custom duration stays editable and cannot start', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Countdown'); + await tap(tester, 'Custom'); + await tester.enterText(find.byType(TextFormField), ''); + await tap(tester, 'Custom'); + await tap(tester, 'Start'); + expect(find.text('Enter 1 to 1,440 minutes.'), findsOneWidget); + expect(timer.session, isNull); + await tap(tester, '15 min'); + await tap(tester, 'Start'); + expect(timer.session!.targetSeconds, 900); + }); + + testWidgets('reset requires confirmation and keeps the selected book and duration', (tester) async { + await pump(tester); + await selectBook(tester); + await tap(tester, 'Countdown'); + await tap(tester, '15 min'); + await tap(tester, 'Start'); + now = now.add(const Duration(minutes: 1)); + await tap(tester, 'Reset timer'); + await tap(tester, 'Cancel'); + expect(timer.session, isNotNull); + await tap(tester, 'Reset timer'); + await tap(tester, 'Reset'); + expect(timer.session, isNull); + expect(library.trackingRepository.saves, 0); + expect(find.text(book.title), findsOneWidget); + expect(tester.widget(find.byType(ReadingTimerClock)).time, const Duration(minutes: 15)); + await tap(tester, 'Start'); + expect(timer.session!.bookId, book.id); + expect(timer.session!.targetSeconds, 900); + }); + + testWidgets('duration appears only for countdown and retains the chosen duration', (tester) async { + final theme = AppTheme.dark; + + await pump( + tester, + size: const Size(390, 1000), + theme: theme.copyWith( + chipTheme: theme.chipTheme.copyWith(labelStyle: theme.textTheme.labelLarge!.copyWith(fontFamily: 'Roboto')), + ), + ); + await selectBook(tester); + final clock = tester.getRect(find.byType(ReadingTimerClock)); + expect(find.text('Duration'), findsNothing); + expect(find.byType(ChoiceChip), findsNothing); + expect(find.byIcon(Icons.expand_more_rounded), findsOneWidget); + expect(tester.widget>(find.byType(SegmentedButton)).showSelectedIcon, isFalse); + await tap(tester, 'Countdown'); + expect(find.text('Duration'), findsOneWidget); + final chips = tester.getRect(find.byType(ChoiceChip).first); + final custom = tester.getRect(find.widgetWithText(ChoiceChip, 'Custom')); + final panel = tester.getRect(find.byKey(const ValueKey('reading-session'))); + expect(custom.top, chips.top); + expect(custom.right, lessThanOrEqualTo(panel.right - 24)); + expect(tester.getRect(find.byType(ReadingTimerClock)), clock); + expect(tester.widget(find.widgetWithText(ChoiceChip, '30 min')).onSelected, isNotNull); + expect(tester.widgetList(find.byType(ChoiceChip)).every((chip) => chip.showCheckmark == false), isTrue); + await tap(tester, '60 min'); + await tap(tester, 'Stopwatch'); + expect(find.text('Duration'), findsNothing); + expect(tester.getRect(find.byType(ReadingTimerClock)), clock); + await tap(tester, 'Countdown'); + expect(tester.widget(find.byType(ReadingTimerClock)).time, const Duration(hours: 1)); + }); + + for (final countdown in [false, true]) { + testWidgets('${countdown ? 'countdown' : 'stopwatch'} anchors survive all session states', (tester) async { + await pump(tester); + await selectBook(tester); + + if (countdown) { + await tap(tester, 'Countdown'); + await tap(tester, 'Custom'); + await tester.enterText(find.byType(TextFormField), '2'); + } + + Rect panelRect(Finder finder) => + tester.getRect(finder).shift(-tester.getTopLeft(find.byKey(const ValueKey('reading-session')))); + + final clock = panelRect(find.byType(ReadingTimerClock)); + final bookField = panelRect(find.byType(SearchableBookField)); + final primary = panelRect(find.byKey(const ValueKey('timer-primary-action'))); + + void expectAnchors() { + expect(panelRect(find.byType(ReadingTimerClock)), clock); + expect(panelRect(find.byType(SearchableBookField)), bookField); + expect(panelRect(find.byKey(const ValueKey('timer-primary-action'))), primary); + } + + await tap(tester, 'Start'); + expectAnchors(); + now = now.add(const Duration(seconds: 10)); + await tap(tester, 'Pause'); + expectAnchors(); + await tap(tester, 'Resume'); + expectAnchors(); + + if (countdown) { + now = now.add(const Duration(minutes: 3)); + await timer.reload(); + await tester.pumpAndSettle(); + expectAnchors(); + await tap(tester, 'Resume'); + expectAnchors(); + } + + await tap(tester, 'Finish'); + await tap(tester, 'Cancel'); + expectAnchors(); + expect(find.textContaining('read.'), findsNothing); + expect(find.text('Discard session'), findsNothing); + expect(bookField.bottom, lessThan(clock.top)); + expect(clock.bottom, lessThan(primary.top)); + expect(primary.bottom, lessThan(panelRect(find.text('Mode')).top)); + }); + } + + testWidgets('changing text scale keeps mode choices visible', (tester) async { + await pump(tester, size: const Size(390, 1000)); + await selectBook(tester); + await tap(tester, 'Start'); + await pump(tester, size: const Size(390, 1000), scale: 2, theme: AppTheme.eink); + final modes = tester.getRect(find.byType(SegmentedButton)); + expect(modes.height, greaterThan(80)); + expect(modes.contains(tester.getCenter(find.text('Stopwatch'))), isTrue); + expect(modes.contains(tester.getCenter(find.text('Countdown'))), isTrue); + expect(tester.takeException(), isNull); + }); + + testWidgets('timer button ink survives pending writes and state changes', (tester) async { + final ink = _TrackingInkFactory(); + await pump(tester, theme: AppTheme.dark.copyWith(splashFactory: ink)); + await selectBook(tester); + + for (final label in ['Start', 'Pause', 'Resume', 'Finish']) { + final gate = Completer(); + library.trackingRepository.writeGate = gate; + final target = label == 'Finish' ? find.byTooltip(label) : find.text(label); + final previousCount = ink.features.length; + await tester.tap(target); + final ripple = ink.features.last; + final color = ripple.color; + await tester.pump(const Duration(milliseconds: 16)); + expect(timer.busy, isTrue); + expect(ink.features.length, previousCount + 1); + expect(ink.removed.contains(ripple), isFalse); + expect(ripple.color, color); + final primary = tester.widget(find.byKey(const ValueKey('timer-primary-action'))); + expect(primary.onPressed, isNotNull); + primary.onPressed!(); + gate.complete(); + await tester.pump(const Duration(milliseconds: 16)); + expect(timer.busy, isFalse); + expect(ink.features.length, previousCount + 1); + expect(ink.removed.contains(ripple), isFalse); + expect(ripple.color, color); + await tester.pumpAndSettle(); + now = now.add(const Duration(minutes: 1)); + } + + expect(find.byType(AlertDialog), findsOneWidget); + expect(library.trackingRepository.saves, 0); + }); + + for (final (size, scale) in [ + (const Size(1200, 900), 1.0), + (const Size(390, 1000), 1.0), + (const Size(320, 1000), 2.0), + ]) { + testWidgets('book selection keeps its height at ${size.width} and text scale $scale', (tester) async { + final longBook = Book( + id: 'long', + title: 'A very long book title that takes several lines in a narrow selection field', + author: 'An author with a very long name and several additional contributors', + addedAt: start, + ); + final untitledAuthor = Book(id: 'short', title: 'Earthsea', author: '', addedAt: start); + store.replaceBooksFromSync([book, longBook, untitledAuthor]); + await pump(tester, size: size, scale: scale); + final field = find.byType(SearchableBookField); + final height = tester.getSize(field).height; + + for (final selected in [book, longBook, untitledAuthor]) { + await tester.ensureVisible(field); + await tester.tap(field); + await tester.pumpAndSettle(); + await tap(tester, selected.title); + expect(tester.getSize(field).height, height); + expect(tester.takeException(), isNull); + } + }); + } + + testWidgets('alignment follows the page preference', (tester) async { + await pump(tester, size: const Size(1600, 900)); + final panel = find.byKey(const ValueKey('reading-session')); + expect(tester.getTopLeft(panel).dx, 24); + preferences.pageAlignment = 'center'; + await tester.pumpAndSettle(); + expect(tester.getCenter(panel).dx, 800); + }); + + for (final (name, size, scale, theme) in [ + ('phone', const Size(390, 844), 1.0, AppTheme.light), + ('large text e-ink', const Size(320, 700), 2.0, AppTheme.eink), + ]) { + testWidgets('$name keeps controls reachable without overflow', (tester) async { + await pump(tester, size: size, scale: scale, theme: theme); + await selectBook(tester); + await tap(tester, 'Countdown'); + await tap(tester, 'Start'); + now = now.add(const Duration(minutes: 1)); + await tap(tester, 'Finish'); + await tap(tester, 'Save'); + expect(library.trackingRepository.saves, 1); + expect(tester.takeException(), isNull); + }); + } +} + +class _TrackingInkFactory extends InteractiveInkFeatureFactory { + final features = []; + final removed = []; + + @override + InteractiveInkFeature create({ + required MaterialInkController controller, + required RenderBox referenceBox, + required Offset position, + required Color color, + required TextDirection textDirection, + bool containedInkWell = false, + RectCallback? rectCallback, + BorderRadius? borderRadius, + ShapeBorder? customBorder, + double? radius, + VoidCallback? onRemoved, + }) { + late InteractiveInkFeature feature; + feature = InkRipple.splashFactory.create( + controller: controller, + referenceBox: referenceBox, + position: position, + color: color, + textDirection: textDirection, + containedInkWell: containedInkWell, + rectCallback: rectCallback, + borderRadius: borderRadius, + customBorder: customBorder, + radius: radius, + onRemoved: () { + removed.add(feature); + onRemoved?.call(); + }, + ); + features.add(feature); + return feature; + } +} diff --git a/app/test/powersync/reading_timer_persistence_test.dart b/app/test/powersync/reading_timer_persistence_test.dart new file mode 100644 index 00000000..924464b8 --- /dev/null +++ b/app/test/powersync/reading_timer_persistence_test.dart @@ -0,0 +1,278 @@ +import 'dart:io'; +import 'dart:convert'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/models/reading_activity.dart'; +import 'package:papyrus/powersync/library_database.dart'; +import 'package:papyrus/auth/papyrus_api_config.dart'; +import 'package:papyrus/powersync/papyrus_powersync_connector.dart'; +import 'tracking_persistence_test.dart' show CapturingUploadRepository; +import 'package:papyrus/powersync/papyrus_schema.dart'; +import 'package:papyrus/providers/enums/library_reading_status.dart'; +import 'package:papyrus/timer/reading_timer.dart'; +import 'package:powersync/powersync.dart'; + +void main() { + final start = DateTime.utc(2026, 11, 3, 23, 50); + final book = Book( + id: 'physical', + title: 'Physical book', + author: 'Author', + addedAt: start, + isPhysical: true, + currentPage: 10, + pageCount: 100, + ); + + late Directory directory; + late PowerSyncDatabase database; + late LibraryDatabase library; + + Future open({bool account = false}) async { + database = PowerSyncDatabase( + path: '${directory.path}/timer.db', + schema: account ? papyrusAccountSchema : papyrusGuestSchema, + ); + await database.initialize(); + library = LibraryDatabase(database, () async {})..trackingSupported = !account; + } + + setUp(() async { + directory = await Directory.systemTemp.createTemp('papyrus-timer-'); + await open(); + await library.books.upsert(book); + }); + + tearDown(() async { + await database.close(); + await directory.delete(recursive: true); + }); + + test('running timer survives closing SQLite and caps a suspended countdown', () async { + final timer = ReadingTimer.start(book, start, 'device', [], targetSeconds: 1200); + await library.writeTimer(timer); + await database.close(); + await open(); + final restored = (await library.loadTimer())!; + final later = start.add(const Duration(hours: 3)); + expect(restored.elapsed(later), const Duration(minutes: 20)); + expect(restored.isRunning(later), isFalse); + await library.finishTimer(restored, later, currentPage: 25); + expect(await library.loadTimer(), isNull); + final snapshot = await library.snapshot(); + expect(snapshot.activities.single.seconds, 1200); + expect(snapshot.activities.single.pages, 15); + expect(snapshot.activities.single.endTime, start.add(const Duration(minutes: 20))); + expect(snapshot.books.single.currentPage, 25); + expect(snapshot.books.single.readingStatus, LibraryReadingStatus.inProgress); + await expectLater(library.finishTimer(restored, later, currentPage: 25), throwsStateError); + expect((await library.snapshot()).activities.length, 1); + }); + + test('pauses preserve real intervals across midnight and group into one session', () async { + var timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + var next = timer.stop(start.add(const Duration(minutes: 5))); + await library.writeTimer(next, previous: timer); + timer = next; + next = timer.resume(start.add(const Duration(minutes: 20))); + await library.writeTimer(next, previous: timer); + timer = next; + final end = start.add(const Duration(minutes: 30)); + await library.finishTimer(timer, end, currentPage: 30); + final activities = (await library.snapshot()).activities; + expect(activities.map((activity) => activity.seconds).reduce((left, right) => left + right), 900); + final grouped = groupReadingActivities(activities); + expect(grouped.length, 1); + expect(grouped.single.seconds, 900); + expect(grouped.single.pages, 20); + expect(grouped.single.constituentIds.length, 2); + expect(activities.map((activity) => activity.startTime), contains(start.add(const Duration(minutes: 20)))); + }); + + test('digital book sessions persist without changing the saved reader position', () async { + final digital = Book( + id: 'digital', + title: 'Ebook', + author: 'Author', + addedAt: start, + currentPage: 12, + currentPosition: 0.3, + currentCfi: 'saved-reader-position', + ); + + await library.books.upsert(digital); + final timer = ReadingTimer.start(digital, start, 'device', [], targetSeconds: 300); + await library.writeTimer(timer); + await library.finishTimer(timer, start.add(const Duration(minutes: 10))); + final snapshot = await library.snapshot(); + final saved = snapshot.books.singleWhere((book) => book.id == digital.id); + expect(snapshot.activities.single.bookId, digital.id); + expect(snapshot.activities.single.seconds, 300); + expect(saved.currentPage, 12); + expect(saved.currentPosition, 0.3); + expect(saved.currentCfi, digital.currentCfi); + expect(await library.loadTimer(), isNull); + }); + + test('subsecond pauses retain the same saved total as the timer display', () async { + var timer = ReadingTimer.start(book, start, 'device', []); + timer = timer.stop(start.add(const Duration(milliseconds: 900))); + timer = timer.resume(start.add(const Duration(seconds: 2))); + final end = start.add(const Duration(milliseconds: 2900)); + await library.writeTimer(timer); + await library.finishTimer(timer, end); + final saved = groupReadingActivities((await library.snapshot()).activities).single; + expect(timer.elapsed(end).inSeconds, 1); + expect(saved.seconds, timer.elapsed(end).inSeconds); + }); + + test('negative page input rolls back and retains the draft for retry', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + final end = start.add(const Duration(minutes: 10)); + await expectLater(library.finishTimer(timer, end, currentPage: -1), throwsArgumentError); + expect((await library.loadTimer())!.id, timer.id); + expect((await library.snapshot()).activities, isEmpty); + await library.finishTimer(timer, end, currentPage: 100); + final snapshot = await library.snapshot(); + expect(snapshot.books.single.readingStatus, LibraryReadingStatus.completed); + expect(snapshot.activities.where((activity) => activity.kind == 'completion').length, 1); + }); + + for (final (page, pagesRead, position) in [(199, 189, 1.0), (5, 0, 0.05)]) { + test('saves page $page outside the prior page range', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + await library.finishTimer(timer, start.add(const Duration(minutes: 2)), currentPage: page); + final snapshot = await library.snapshot(); + expect(snapshot.books.single.currentPage, page); + expect(snapshot.books.single.pageCount, 100); + expect(snapshot.books.single.currentPosition, position); + expect(snapshot.activities.single.pages, pagesRead); + expect(snapshot.activities.single.seconds, 120); + expect(await library.loadTimer(), isNull); + }); + } + + test('stale windows cannot overwrite, discard or save a newer timer', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + final paused = timer.stop(start.add(const Duration(minutes: 2))); + await library.writeTimer(paused, previous: timer); + await expectLater(library.writeTimer(timer.stop(start), previous: timer), throwsStateError); + await expectLater(library.discardTimer(timer), throwsStateError); + await expectLater(library.finishTimer(timer, start.add(const Duration(minutes: 3))), throwsStateError); + expect((await library.loadTimer())!.revision, paused.revision); + }); + + test('same-numbered revisions from different device branches are not interchangeable', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + final accepted = timer.stop(start.add(const Duration(minutes: 1))); + final stale = timer.stop(start.add(const Duration(minutes: 2))); + expect(accepted.revision, stale.revision); + expect(accepted.version, isNot(stale.version)); + await library.writeTimer(accepted, previous: timer); + await expectLater(library.discardTimer(stale), throwsStateError); + await expectLater(library.finishTimer(stale, start.add(const Duration(minutes: 3))), throwsStateError); + expect((await library.loadTimer())!.version, accepted.version); + }); + + test('invalidated profile handle cannot read or mutate its timer', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + library.active = false; + await expectLater(library.loadTimer(), throwsStateError); + await expectLater(library.discardTimer(timer), throwsStateError); + await expectLater(library.finishTimer(timer, start.add(const Duration(minutes: 5))), throwsStateError); + library.active = true; + expect((await library.loadTimer())!.id, timer.id); + }); + + test('account timer transitions and saved history enter one upload transaction', () async { + await database.close(); + await open(account: true); + await library.books.upsert(book); + await database.execute('DELETE FROM ps_crud'); + final timer = ReadingTimer.start(book, start, 'device', [], targetSeconds: 60); + await library.writeTimer(timer); + final startTransaction = (await database.getNextCrudTransaction())!; + expect(startTransaction.crud.single.table, 'reading_timers'); + expect(startTransaction.crud.single.id, timer.id); + expect(startTransaction.crud.single.opData!['status'], 'active'); + await startTransaction.complete(); + await library.finishTimer(timer, start.add(const Duration(minutes: 3))); + expect(await library.loadTimer(), isNull); + expect((await library.snapshot()).activities.single.seconds, 60); + expect(await database.getAll('SELECT * FROM tracking_staging'), isEmpty); + final finishTransaction = (await database.getNextCrudTransaction())!; + expect(finishTransaction.crud.map((entry) => entry.table), ['reading_timers', 'reading_activities', 'books']); + expect(finishTransaction.crud.first.opData!['status'], 'saved'); + expect(finishTransaction.crud.first.opData!['base_version'], timer.version); + expect(await database.getNextCrudTransaction(), isNotNull); + }); + + test('capability discovery cannot split a timer save from its history upload', () async { + await database.close(); + await open(account: true); + await library.books.upsert(book); + await database.execute('DELETE FROM ps_crud'); + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + await library.finishTimer(timer, start.add(const Duration(minutes: 2))); + final auth = CapturingUploadRepository(); + + final connector = PapyrusPowerSyncConnector( + authRepository: auth, + config: PapyrusApiConfig(serverBaseUri: Uri.parse('https://example.invalid')), + supportsTracking: () => false, + ); + + await connector.uploadData(database); + expect(auth.batches, hasLength(2)); + expect(auth.batches.last.map((entry) => entry['type']), ['reading_timers', 'reading_activities', 'books']); + expect((auth.batches.last.first['data'] as Map)['base_version'], timer.version); + expect((auth.batches.last.first['data'] as Map)['payload'], isA()); + expect(await database.getAll('SELECT * FROM tracking_staging'), isEmpty); + expect(await database.getAll('SELECT * FROM ps_crud'), isEmpty); + }); + + test('existing local timers migrate once without losing elapsed time', () async { + final timer = ReadingTimer.start(book, start, 'device', []).stop(start.add(const Duration(minutes: 3))); + final payload = timer.toJson()..remove('version'); + await database.execute('INSERT INTO reading_timer (id, payload) VALUES (?, ?)', ['active', jsonEncode(payload)]); + await library.migrateTimer(); + await library.migrateTimer(); + final restored = (await library.loadTimer())!; + expect(restored.id, timer.id); + expect(restored.elapsed(start.add(const Duration(hours: 1))), const Duration(minutes: 3)); + expect(await database.getAll('SELECT * FROM reading_timer'), isEmpty); + expect(await database.getAll('SELECT * FROM reading_timers'), hasLength(1)); + expect(await database.getAll('SELECT * FROM ps_crud'), isEmpty); + }); + + test('a terminal record disappears from watches and stays durable after reopening', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + final closed = library.watchTimer().firstWhere((value) => value == null); + await library.discardTimer(timer); + await closed.timeout(const Duration(seconds: 2)); + await database.close(); + await open(); + expect(await library.loadTimer(), isNull); + expect((await database.get('SELECT status FROM reading_timers WHERE id = ?', [timer.id]))['status'], 'discarded'); + }); + + test('deleted book leaves the timer recoverable without resurrecting the book', () async { + final timer = ReadingTimer.start(book, start, 'device', []); + await library.writeTimer(timer); + await library.books.delete(book.id); + await expectLater(library.finishTimer(timer, start.add(const Duration(minutes: 2))), throwsStateError); + expect((await library.loadTimer())!.id, timer.id); + expect((await library.snapshot()).books, isEmpty); + await library.discardTimer(timer); + expect(await library.loadTimer(), isNull); + }); +} diff --git a/app/test/providers/reading_timer_provider_test.dart b/app/test/providers/reading_timer_provider_test.dart new file mode 100644 index 00000000..53d5c857 --- /dev/null +++ b/app/test/providers/reading_timer_provider_test.dart @@ -0,0 +1,120 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; +import 'package:papyrus/timer/reading_timer.dart'; + +import '../timer/timer_test_library.dart'; + +void main() { + final now = DateTime.utc(2026, 11, 3, 12); + final book = Book(id: 'physical', title: 'Book', author: 'Author', addedAt: now, isPhysical: true); + + Future flush() => Future.delayed(Duration.zero); + + test('a delayed old-profile load cannot replace the new-profile timer', () async { + final old = TimerTestLibrary(); + final next = TimerTestLibrary(); + final oldGate = Completer(); + old.trackingRepository.loadGate = oldGate; + next.trackingRepository.timer = ReadingTimer.start(book, now, 'next', []); + final store = DataStore(bookRepository: old); + final timer = ReadingTimerProvider(store, now: () => now, tick: false); + addTearDown(timer.dispose); + addTearDown(store.dispose); + await flush(); + old.trackingRepository.isCurrent = false; + await store.attachBookRepository(next); + await flush(); + oldGate.complete(ReadingTimer.start(book, now, 'old', [])); + await flush(); + expect(timer.session!.deviceId, 'next'); + expect(timer.loading, isFalse); + }); + + test('switch during a pending start never copies the old draft into the new library', () async { + final old = TimerTestLibrary(); + final next = TimerTestLibrary(); + final store = DataStore(bookRepository: old); + final timer = ReadingTimerProvider(store, now: () => now, tick: false); + addTearDown(timer.dispose); + addTearDown(store.dispose); + await flush(); + final gate = Completer(); + old.trackingRepository.writeGate = gate; + final starting = timer.start(book); + old.trackingRepository.isCurrent = false; + await store.attachBookRepository(next); + await flush(); + gate.complete(); + expect(await starting, isFalse); + await flush(); + expect(timer.session, isNull); + expect(next.trackingRepository.timer, isNull); + expect(timer.busy, isFalse); + expect(timer.error, isNull); + }); + + test('a second start while persistence is pending cannot create another timer', () async { + final library = TimerTestLibrary(); + final store = DataStore(bookRepository: library); + final timer = ReadingTimerProvider(store, now: () => now, tick: false); + addTearDown(timer.dispose); + addTearDown(store.dispose); + await flush(); + final gate = Completer(); + library.trackingRepository.writeGate = gate; + final starting = timer.start(book); + expect(await timer.start(book), isFalse); + gate.complete(); + expect(await starting, isTrue); + expect(timer.session, isNotNull); + }); + + test('remote transitions update the same clock without resetting elapsed time', () async { + final library = TimerTestLibrary(); + final store = DataStore(bookRepository: library); + var clock = now.add(const Duration(minutes: 2)); + final timer = ReadingTimerProvider(store, now: () => clock, tick: false); + addTearDown(timer.dispose); + addTearDown(store.dispose); + await flush(); + final remote = ReadingTimer.start(book, now, 'browser', [], targetSeconds: 300); + await library.trackingRepository.writeTimer(remote); + await flush(); + expect(timer.session!.id, remote.id); + expect(timer.elapsed, const Duration(minutes: 2)); + expect(timer.running, isTrue); + final paused = remote.stop(clock); + await library.trackingRepository.writeTimer(paused, previous: remote); + clock = clock.add(const Duration(minutes: 4)); + await flush(); + expect(timer.running, isFalse); + expect(timer.elapsed, const Duration(minutes: 2)); + final resumed = paused.resume(clock); + await library.trackingRepository.writeTimer(resumed, previous: paused); + clock = clock.add(const Duration(minutes: 10)); + await flush(); + expect(timer.goalReached, isTrue); + expect(timer.elapsed, const Duration(minutes: 5)); + await library.trackingRepository.finishTimer(resumed, clock); + await flush(); + expect(timer.session, isNull); + }); + + test('deleting the local draft externally clears the displayed session', () async { + final library = TimerTestLibrary(); + final store = DataStore(bookRepository: library); + final timer = ReadingTimerProvider(store, now: () => now, tick: false); + addTearDown(timer.dispose); + addTearDown(store.dispose); + await flush(); + await timer.start(book); + await flush(); + await library.trackingRepository.discardTimer(timer.session!); + await flush(); + expect(timer.session, isNull); + }); +} diff --git a/app/test/services/reading_timer_notifications_test.dart b/app/test/services/reading_timer_notifications_test.dart new file mode 100644 index 00000000..897e6a0d --- /dev/null +++ b/app/test/services/reading_timer_notifications_test.dart @@ -0,0 +1,193 @@ +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/providers/reading_timer_provider.dart'; +import 'package:papyrus/services/reading_timer_notifications.dart'; +import 'package:papyrus/timer/reading_timer.dart'; + +import '../timer/timer_test_library.dart'; + +void main() { + final binding = TestWidgetsFlutterBinding.ensureInitialized(); + const channel = MethodChannel('test/reading_timer_notifications'); + final start = DateTime.utc(2026, 11, 6, 12); + final book = Book(id: 'book', title: 'A book', author: 'Author', addedAt: start); + late TimerTestLibrary library; + late DataStore store; + late ReadingTimerProvider timer; + late DateTime now; + + Map action(String id, String kind, int seconds) => { + 'id': id, + 'kind': kind, + 'atMs': start.add(Duration(seconds: seconds)).millisecondsSinceEpoch, + }; + + Map batch(ReadingTimer original, List> actions) => { + 'sessionId': original.id, + 'version': original.version, + 'through': actions.last['id'], + 'actions': actions, + }; + + setUp(() async { + now = start; + library = TimerTestLibrary(); + store = DataStore(bookRepository: library); + timer = ReadingTimerProvider(store, now: () => now, tick: false); + await pumpEventQueue(); + await timer.start(book); + }); + + tearDown(() async { + timer.dispose(); + store.dispose(); + await library.trackingRepository.changes.close(); + binding.defaultBinaryMessenger.setMockMethodCallHandler(channel, null); + }); + + test('background pause and resume use tap timestamps, not app resume time', () async { + final original = timer.session!; + now = start.add(const Duration(hours: 2)); + expect(await timer.applyNotificationActions(batch(original, [action('pause', 'pause', 30)])), isTrue); + expect(timer.elapsed, const Duration(seconds: 30)); + expect(timer.running, isFalse); + final paused = timer.session!; + expect(await timer.applyNotificationActions(batch(paused, [action('resume', 'resume', 120)])), isTrue); + expect(timer.session!.runningSince, start.add(const Duration(seconds: 120))); + }); + + test('queued finish saves only reading intervals once without page input', () async { + final original = timer.session!; + final pending = batch(original, [ + action('pause', 'pause', 30), + action('resume', 'resume', 90), + action('finish', 'finish', 150), + ]); + now = start.add(const Duration(hours: 2)); + expect(await timer.applyNotificationActions(pending), isTrue); + expect(library.trackingRepository.savedSeconds, 90); + expect(library.trackingRepository.savedPage, isNull); + expect(timer.session, isNull); + expect(await timer.applyNotificationActions(pending), isTrue); + expect(library.trackingRepository.saves, 1); + }); + + test('replay after a crash skips committed actions and completes finish', () async { + final original = timer.session!; + final pending = batch(original, [action('pause', 'pause', 30), action('finish', 'finish', 90)]); + final persisted = ReadingTimer.fromJson({ + ...original.stop(start.add(const Duration(seconds: 30))).toJson(), + 'version': 'pause', + }); + await library.trackingRepository.writeTimer(persisted); + await pumpEventQueue(); + now = start.add(const Duration(hours: 1)); + expect(await timer.applyNotificationActions(pending), isTrue); + expect(library.trackingRepository.savedSeconds, 30); + expect(library.trackingRepository.saves, 1); + }); + + test('replay after finish write retries the save without adding time', () async { + final original = timer.session!; + final pending = batch(original, [action('finish', 'finish', 30)]); + final persisted = ReadingTimer.fromJson({ + ...original.stop(start.add(const Duration(seconds: 30)), finish: true).toJson(), + 'version': 'finish', + }); + await library.trackingRepository.writeTimer(persisted); + await pumpEventQueue(); + now = start.add(const Duration(hours: 1)); + expect(await timer.applyNotificationActions(pending), isTrue); + expect(library.trackingRepository.savedSeconds, 30); + }); + + test('stale notification cannot overwrite a remotely changed timer', () async { + final original = timer.session!; + final remote = original.stop(start.add(const Duration(seconds: 10))); + await library.trackingRepository.writeTimer(remote); + await pumpEventQueue(); + expect(await timer.applyNotificationActions(batch(original, [action('finish', 'finish', 60)])), isTrue); + expect(timer.session, same(remote)); + expect(library.trackingRepository.saves, 0); + }); + + test('immediate finish discards quietly and countdown is capped at its goal', () async { + expect(await timer.applyNotificationActions(batch(timer.session!, [action('finish', 'finish', 0)])), isTrue); + expect(timer.session, isNull); + expect(library.trackingRepository.saves, 0); + await timer.start(book, targetSeconds: 60); + now = start.add(const Duration(minutes: 10)); + expect(await timer.applyNotificationActions(batch(timer.session!, [action('finish2', 'finish', 600)])), isTrue); + expect(library.trackingRepository.savedSeconds, 60); + }); + + test('native publication uses timestamps and does not update every tick', () async { + final published = >[]; + binding.defaultBinaryMessenger.setMockMethodCallHandler(channel, (call) async { + if (call.method == 'publish') published.add(call.arguments as Map); + return null; + }); + final notifications = ReadingTimerNotifications(timer, onOpen: () {}, channel: channel, supported: true); + addTearDown(notifications.dispose); + await pumpEventQueue(); + expect(published.length, 1); + expect((published.last['snapshot'] as Map)['runningSinceMs'], start.millisecondsSinceEpoch); + now = start.add(const Duration(seconds: 15)); + await timer.reload(); + await pumpEventQueue(); + expect(published.length, 1); + await timer.pause(); + await pumpEventQueue(); + expect((published.last['snapshot'] as Map)['phase'], 'paused'); + expect((published.last['snapshot'] as Map)['recordedMs'], 15000); + }); + + test('failed storage keeps native actions queued until retry succeeds', () async { + Map? pending = batch(timer.session!, [action('pause', 'pause', 30)]); + var acknowledgements = 0; + binding.defaultBinaryMessenger.setMockMethodCallHandler(channel, (call) async { + if (call.method == 'pending') return pending; + if (call.method == 'acknowledge') { + acknowledgements++; + pending = null; + } + return null; + }); + library.trackingRepository.failWrite = true; + final notifications = ReadingTimerNotifications(timer, onOpen: () {}, channel: channel, supported: true); + addTearDown(notifications.dispose); + await pumpEventQueue(); + expect(acknowledgements, 0); + expect(pending, isNotNull); + library.trackingRepository.failWrite = false; + now = start.add(const Duration(minutes: 3)); + notifications.didChangeAppLifecycleState(AppLifecycleState.resumed); + await pumpEventQueue(); + expect(acknowledgements, 1); + expect(timer.elapsed, const Duration(seconds: 30)); + }); + + test('switching profiles clears native state and rejects old controls', () async { + final original = timer.session!; + var clears = 0; + binding.defaultBinaryMessenger.setMockMethodCallHandler(channel, (call) async { + if (call.method == 'clear') clears++; + return null; + }); + final notifications = ReadingTimerNotifications(timer, onOpen: () {}, channel: channel, supported: true); + addTearDown(notifications.dispose); + await pumpEventQueue(); + final next = TimerTestLibrary(); + addTearDown(next.trackingRepository.changes.close); + next.trackingRepository.timer = ReadingTimer.start(book, start, 'other', []); + library.trackingRepository.isCurrent = false; + await store.attachBookRepository(next); + await pumpEventQueue(); + expect(clears, greaterThan(0)); + expect(await timer.applyNotificationActions(batch(original, [action('finish', 'finish', 50)])), isTrue); + expect(next.trackingRepository.saves, 0); + }); +} diff --git a/app/test/timer/reading_timer_clock_test.dart b/app/test/timer/reading_timer_clock_test.dart new file mode 100644 index 00000000..fcdf0929 --- /dev/null +++ b/app/test/timer/reading_timer_clock_test.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/timer/reading_timer_clock.dart'; + +void main() { + for (final width in [200.0, 300.0]) { + for (final scale in [1.0, 1.3, 2.0]) { + testWidgets('clock labels stay anchored at width $width and text scale $scale', (tester) async { + Future show(Duration time) async { + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: Scaffold( + body: MediaQuery( + data: MediaQueryData(textScaler: TextScaler.linear(scale)), + child: Center( + child: SizedBox( + width: width, + child: ReadingTimerClock(time: time, progress: 0.5, countdown: true, status: 'Ready'), + ), + ), + ), + ), + ), + ); + } + + await show(const Duration(minutes: 59, seconds: 59)); + final label = tester.getRect(find.text('Time remaining')); + final badge = tester.getRect(find.text('Ready')); + final clock = tester.getRect(find.byType(ReadingTimerClock)); + + for (final time in [ + const Duration(hours: 1), + const Duration(hours: 9, minutes: 59, seconds: 59), + const Duration(hours: 10), + const Duration(hours: 16, minutes: 40), + const Duration(hours: 100), + Duration.zero, + ]) { + await show(time); + expect(tester.getRect(find.text('Time remaining')), label); + expect(tester.getRect(find.text('Ready')), badge); + expect(tester.getRect(find.byType(ReadingTimerClock)), clock); + expect(tester.takeException(), isNull); + } + }); + } + } +} diff --git a/app/test/timer/reading_timer_test.dart b/app/test/timer/reading_timer_test.dart new file mode 100644 index 00000000..c6c1f42d --- /dev/null +++ b/app/test/timer/reading_timer_test.dart @@ -0,0 +1,64 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/timer/reading_timer.dart'; +import 'package:papyrus/timer/reading_timer_format.dart'; + +void main() { + final start = DateTime.utc(2026, 11, 3, 12); + final book = Book(id: 'digital', title: 'Digital book', author: 'Author', addedAt: start); + + test('clock supports sessions longer than an hour', () { + expect(readingTimerClock(const Duration(hours: 2, minutes: 3, seconds: 4)), '2:03:04'); + }); + + test('clock rollback does not produce negative reading intervals', () { + final timer = ReadingTimer.start(book, start, 'device', []); + expect(timer.elapsed(start.subtract(const Duration(minutes: 1))), Duration.zero); + expect(timer.activities(start.subtract(const Duration(minutes: 1))), isEmpty); + }); + + for (final target in [null, 60]) { + test('resume with a slower clock preserves ${target == null ? 'stopwatch' : 'countdown'} intervals', () { + final timer = ReadingTimer.start(book, start, 'device', [], targetSeconds: target); + final pausedAt = start.add(const Duration(seconds: 30)); + final paused = timer.stop(pausedAt); + final resumed = paused.resume(pausedAt.subtract(const Duration(seconds: 1))); + expect(resumed.runningSince, pausedAt); + expect(resumed.elapsed(pausedAt), const Duration(seconds: 30)); + final finished = resumed.stop(pausedAt.add(const Duration(seconds: 10)), finish: true); + expect(finished.intervals.last.start, finished.intervals.first.end); + expect(finished.recorded, const Duration(seconds: 40)); + }); + } + + test('resume without recorded intervals cannot precede session creation', () { + final paused = ReadingTimer.start(book, start, 'device', []).stop(start); + final resumed = paused.resume(start.subtract(const Duration(seconds: 1))); + expect(resumed.runningSince, start); + expect(resumed.elapsed(start), Duration.zero); + }); + + test('continuing a completed countdown clamps a slower clock to the goal time', () { + final timer = ReadingTimer.start(book, start, 'device', [], targetSeconds: 60); + final goalTime = start.add(const Duration(minutes: 1)); + final finished = timer.stop(goalTime); + final resumed = finished.resume(goalTime.subtract(const Duration(seconds: 1)), keepReading: true); + expect(resumed.targetSeconds, isNull); + expect(resumed.runningSince, goalTime); + expect(resumed.elapsed(goalTime), const Duration(minutes: 1)); + }); + + test('countdown stops at its goal and continuation excludes unattended time', () { + final timer = ReadingTimer.start(book, start, 'device', [], targetSeconds: 60); + final returnTime = start.add(const Duration(minutes: 5)); + expect(timer.elapsed(returnTime), const Duration(minutes: 1)); + expect(timer.reachedGoal(returnTime), isTrue); + expect(timer.isRunning(returnTime), isFalse); + final continued = timer.stop(returnTime).resume(returnTime, keepReading: true); + final finishTime = returnTime.add(const Duration(minutes: 2)); + final finished = continued.stop(finishTime, finish: true); + expect(finished.targetSeconds, isNull); + expect(finished.elapsed(finishTime), const Duration(minutes: 3)); + expect(finished.phase, ReadingTimerPhase.finished); + }); +} diff --git a/app/test/timer/timer_test_library.dart b/app/test/timer/timer_test_library.dart new file mode 100644 index 00000000..93242d6b --- /dev/null +++ b/app/test/timer/timer_test_library.dart @@ -0,0 +1,71 @@ +import 'dart:async'; + +import 'package:papyrus/data/repositories/book_repository.dart'; +import 'package:papyrus/data/repositories/reading_timer_repository.dart'; +import 'package:papyrus/data/repositories/tracking_repository.dart'; +import 'package:papyrus/timer/reading_timer.dart'; + +class TimerTestLibrary extends InMemoryBookRepository implements TrackingRepositoryOwner { + @override + final TimerTestRepository trackingRepository = TimerTestRepository(); +} + +class TimerTestRepository implements TrackingRepository, ReadingTimerRepository { + @override + bool isCurrent = true; + ReadingTimer? timer; + int? savedPage; + int? savedSeconds; + bool failWrite = false; + int saves = 0; + Completer? writeGate; + Completer? loadGate; + final changes = StreamController.broadcast(); + + @override + Future loadTimer() async => loadGate == null ? timer : await loadGate!.future; + + @override + Stream watchTimer() async* { + yield await loadTimer(); + yield* changes.stream; + } + + @override + Future writeTimer(ReadingTimer value, {ReadingTimer? previous}) async { + await writeGate?.future; + + if (failWrite) { + throw StateError('Save failed. Try again.'); + } + + if (!isCurrent) { + throw StateError('Library changed.'); + } + + timer = value; + changes.add(timer); + } + + @override + Future discardTimer(ReadingTimer timer) async { + this.timer = null; + changes.add(null); + } + + @override + Future finishTimer(ReadingTimer timer, DateTime now, {int? currentPage}) async { + if (failWrite) { + throw StateError('Save failed. Try again.'); + } + + saves++; + savedPage = currentPage; + savedSeconds = timer.elapsed(now).inSeconds; + this.timer = null; + changes.add(null); + } + + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} diff --git a/app/test/widgets/shared/app_page_bar_test.dart b/app/test/widgets/shared/app_page_bar_test.dart index a0166a33..321104f3 100644 --- a/app/test/widgets/shared/app_page_bar_test.dart +++ b/app/test/widgets/shared/app_page_bar_test.dart @@ -44,6 +44,115 @@ void main() { } } + for (final theme in [AppTheme.light, AppTheme.dark, AppTheme.eink]) { + testWidgets('inline header matches app bar scrolling in ${theme.brightness} ${theme.appBarTheme.shape}', ( + tester, + ) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = const Size(400, 850); + addTearDown(tester.view.reset); + final scroll = ScrollController(); + addTearDown(scroll.dispose); + final surfaces = <(Color?, double, Color?, Color?, ShapeBorder?)>[]; + + for (final inline in [false, true]) { + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pumpWidget( + MaterialApp( + theme: theme, + home: Builder( + builder: (context) { + final body = ListView( + controller: scroll, + children: const [SizedBox(height: 2000)], + ); + + return Scaffold( + appBar: inline ? null : AppPageBar(context: context, title: const Text('Title')), + body: inline + ? Column( + children: [ + const AppPageToolbar(content: Text('Title')), + Expanded(child: body), + ], + ) + : body, + ); + }, + ), + ), + ); + + scroll.jumpTo(0); + await tester.pumpAndSettle(); + final surface = find + .descendant( + of: inline ? find.byType(AppPageToolbar) : find.byType(AppBar), + matching: find.byType(Material), + ) + .first; + final before = tester.widget(surface); + final bounds = tester.getRect(find.byType(AppPageToolbar)); + scroll.jumpTo(200); + await tester.pumpAndSettle(); + final after = tester.widget(surface); + expect(after.elevation, theme.appBarTheme.scrolledUnderElevation); + expect(tester.getRect(find.byType(AppPageToolbar)), bounds); + surfaces.add((after.color, after.elevation, after.surfaceTintColor, after.shadowColor, after.shape)); + scroll.jumpTo(0); + await tester.pumpAndSettle(); + expect(tester.widget(surface).elevation, before.elevation); + expect(tester.takeException(), isNull); + } + + expect(surfaces[1], surfaces[0]); + }); + } + + testWidgets('inline header ignores horizontal and nested scrolling', (tester) async { + final horizontal = ScrollController(); + final nested = ScrollController(); + addTearDown(horizontal.dispose); + addTearDown(nested.dispose); + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: Scaffold( + body: Column( + children: [ + const AppPageToolbar(content: Text('Title')), + SizedBox( + height: 100, + child: ListView( + controller: horizontal, + scrollDirection: Axis.horizontal, + children: const [SizedBox(width: 2000)], + ), + ), + Expanded( + child: ListView( + children: [ + SizedBox( + height: 300, + child: ListView(controller: nested, children: const [SizedBox(height: 2000)]), + ), + ], + ), + ), + ], + ), + ), + ), + ); + + final surface = find.descendant(of: find.byType(AppPageToolbar), matching: find.byType(Material)).first; + horizontal.jumpTo(200); + nested.jumpTo(200); + await tester.pumpAndSettle(); + expect(tester.widget(surface).elevation, 0); + expect(tester.takeException(), isNull); + }); + testWidgets('full screen routes retain automatic close and custom colors', (tester) async { tester.view.devicePixelRatio = 1; tester.view.physicalSize = const Size(400, 850); diff --git a/docs/TIMER_NOTIFICATIONS.md b/docs/TIMER_NOTIFICATIONS.md new file mode 100644 index 00000000..0d3d3c8f --- /dev/null +++ b/docs/TIMER_NOTIFICATIONS.md @@ -0,0 +1,66 @@ +# Reading timer notifications + +The native surfaces mirror the existing reading timer. They do not own a second +PowerSync database or create their own reading sessions. + +- Android shows a silent notification with the book, a native chronometer, + pause/resume and finish. Running timers use a `specialUse` foreground service. + Pausing stops the service but retains the ongoing notification and its controls. + Android 13+ asks for notification permission when an active timer is first shown. +- iOS 16.2+ shows a Live Activity on the Lock Screen and Dynamic Island. iOS 17+ + provides pause/resume and finish through `LiveActivityIntent`, without opening + the app. Earlier supported versions link back to the timer. ActivityKit and the + user's system settings control visibility and lifetime. +- Finish saves time without page input. Subsecond sessions are discarded quietly. + Countdown time is capped at the goal. A completed countdown offers Save. +- Other platforms retain the in-app timer and do not request notification access. + +## Background actions and synchronization + +Native controls first write a private, durable action journal containing the +session ID, base version, command IDs and tap timestamps. They update the native +surface immediately. Dart replays those actions through `ReadingTimerProvider` +and the current profile's repository when it is available. On a suspended or +terminated iPhone app, replay may wait until the app next runs. PowerSync receives +the normal timer and reading-activity writes at that point. + +Command IDs become timer versions, making replay recoverable if the process stops +between persisting an action and acknowledging it. A remote version change or a +different active session rejects stale controls. Switching library profiles clears +the old native surface and journal. Native acknowledgements preserve newer actions +that arrived while Dart was writing. + +The clock renders from timestamps rather than per-second native channel calls. +iOS does not keep a Dart engine or network connection running indefinitely. Remote +PowerSync changes update the Live Activity when the app is running again. There is +no APNs push-to-update integration. Android does not acquire a wake lock. On screen +wake, its service refreshes countdown completion. + +## Validation + +Dart tests cover delayed timestamps, save-once replay, interrupted finish recovery, +stale remote versions, subsecond finish, countdown limits, persistence failures and +profile isolation. Native XCTest covers the durable journal, concurrent +acknowledgement, countdown clamping and real Live Activity intent execution. + +The native smoke-test host at +`app/integration_test/support/timer_notification_app.dart` uses synthetic data and +no user library. Build it only for isolated test simulators/emulators. The normal +application entry point remains `app/lib/main.dart`. Use the fixture for native +XCTest so the production provider does not clear synthetic sessions during a test. +From `app/ios`, with an isolated iOS simulator booted: + +```sh +xcodebuild test -workspace Runner.xcworkspace -scheme Runner \ + -destination 'platform=iOS Simulator,name=YOUR_TEST_SIMULATOR' \ + -only-testing:RunnerTests -parallel-testing-enabled NO CODE_SIGNING_ALLOWED=NO \ + FLUTTER_TARGET=integration_test/support/timer_notification_app.dart +``` + +Use `flutter run -t integration_test/support/timer_notification_app.dart` on an +isolated Android emulator to check notification actions after backgrounding or +killing the app. The fixture is never the release entry point. + +Android special-use foreground service declarations must be included in the Play +Console declaration when this feature is distributed. The widget extension is +embedded in the iOS Runner target and uses the app's build version and signing team. From a47bc609f3d7c5e38a362f3b35dc946d7b022b22 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 02:37:26 +0200 Subject: [PATCH 08/17] fix: reduce reading timer ring size --- app/lib/pages/reading_timer_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/pages/reading_timer_page.dart b/app/lib/pages/reading_timer_page.dart index 4c951652..7832e269 100644 --- a/app/lib/pages/reading_timer_page.dart +++ b/app/lib/pages/reading_timer_page.dart @@ -271,7 +271,7 @@ class _ReadingTimerPageState extends State { return Column( children: [ ConstrainedBox( - constraints: BoxConstraints(maxWidth: widget.focusMode ? 420 : 400), + constraints: BoxConstraints(maxWidth: widget.focusMode ? 380 : 360), child: ReadingTimerClock( key: const ValueKey('timer-clock'), digitSize: widget.focusMode ? 88 : 64, From 4df84e5d401df7510a8f25a23828d060c4fead10 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 02:38:17 +0200 Subject: [PATCH 09/17] fix: tighten timer settings spacing --- app/lib/pages/reading_timer_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/pages/reading_timer_page.dart b/app/lib/pages/reading_timer_page.dart index 7832e269..182212ed 100644 --- a/app/lib/pages/reading_timer_page.dart +++ b/app/lib/pages/reading_timer_page.dart @@ -197,7 +197,7 @@ class _ReadingTimerPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const SizedBox(height: Spacing.lg), + const SizedBox(height: Spacing.md), Text( 'Duration', style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant), @@ -244,7 +244,7 @@ class _ReadingTimerPageState extends State { ), const SizedBox(height: Spacing.xl), _instrument(context, timer, book), - const SizedBox(height: Spacing.xl), + const SizedBox(height: Spacing.lg), settings, ], ), From c063d6053e5dd5aad4d1dc31d2781f36fa91e5f0 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 02:45:27 +0200 Subject: [PATCH 10/17] fix: extend timer panel border to page margins --- app/lib/pages/reading_timer_page.dart | 107 +++++++++++--------- app/test/pages/reading_timer_page_test.dart | 14 ++- 2 files changed, 69 insertions(+), 52 deletions(-) diff --git a/app/lib/pages/reading_timer_page.dart b/app/lib/pages/reading_timer_page.dart index 182212ed..ad57e30e 100644 --- a/app/lib/pages/reading_timer_page.dart +++ b/app/lib/pages/reading_timer_page.dart @@ -115,35 +115,29 @@ class _ReadingTimerPageState extends State { Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(padding), - child: Align( - alignment: centered ? Alignment.topCenter : Alignment.topLeft, - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 520), - child: Form( - key: _form, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (timer.loading) const AppLinearProgressIndicator(), - if (timer.error != null && !_saveDialogOpen) - Padding( - padding: const EdgeInsets.only(bottom: Spacing.md), - child: Semantics( - liveRegion: true, - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - spacing: Spacing.sm, - children: [ - Text(timer.error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), - TextButton(onPressed: timer.busy ? null : timer.reload, child: const Text('Retry')), - ], - ), - ), + child: Form( + key: _form, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (timer.loading) const AppLinearProgressIndicator(), + if (timer.error != null && !_saveDialogOpen) + Padding( + padding: const EdgeInsets.only(bottom: Spacing.md), + child: Semantics( + liveRegion: true, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: Spacing.sm, + children: [ + Text(timer.error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), + TextButton(onPressed: timer.busy ? null : timer.reload, child: const Text('Retry')), + ], ), - _session(context, timer, books, book), - ], - ), - ), + ), + ), + _session(context, timer, books, book, centered: centered), + ], ), ), ), @@ -154,7 +148,13 @@ class _ReadingTimerPageState extends State { ); } - Widget _session(BuildContext context, ReadingTimerProvider timer, List books, Book? book) { + Widget _session( + BuildContext context, + ReadingTimerProvider timer, + List books, + Book? book, { + required bool centered, + }) { final theme = Theme.of(context); final shape = theme.cardTheme.shape; final session = timer.session; @@ -226,27 +226,36 @@ class _ReadingTimerPageState extends State { side: BorderSide(color: theme.colorScheme.outlineVariant), ), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SearchableBookField( - key: ValueKey((_library, book?.id)), - books: books, - value: book?.id, - enabled: editable, - showDetails: true, - onChanged: (id) => setState(() => _bookId = id), + child: Align( + alignment: centered ? Alignment.topCenter : Alignment.topLeft, + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 520 - 2 * Spacing.lg), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SearchableBookField( + key: ValueKey((_library, book?.id)), + books: books, + value: book?.id, + enabled: editable, + showDetails: true, + onChanged: (id) => setState(() => _bookId = id), + ), + if (books.isEmpty && session == null) + Align( + alignment: Alignment.centerLeft, + child: TextButton( + onPressed: () => context.go('/library/books'), + child: const Text('Go to library'), + ), + ), + const SizedBox(height: Spacing.xl), + _instrument(context, timer, book), + const SizedBox(height: Spacing.lg), + settings, + ], ), - if (books.isEmpty && session == null) - Align( - alignment: Alignment.centerLeft, - child: TextButton(onPressed: () => context.go('/library/books'), child: const Text('Go to library')), - ), - const SizedBox(height: Spacing.xl), - _instrument(context, timer, book), - const SizedBox(height: Spacing.lg), - settings, - ], + ), ), ); }, diff --git a/app/test/pages/reading_timer_page_test.dart b/app/test/pages/reading_timer_page_test.dart index 7d9e8c09..d787da2d 100644 --- a/app/test/pages/reading_timer_page_test.dart +++ b/app/test/pages/reading_timer_page_test.dart @@ -593,13 +593,21 @@ void main() { }); } - testWidgets('alignment follows the page preference', (tester) async { + testWidgets('panel fills page width while controls follow the alignment preference', (tester) async { await pump(tester, size: const Size(1600, 900)); final panel = find.byKey(const ValueKey('reading-session')); - expect(tester.getTopLeft(panel).dx, 24); + final field = find.byType(SearchableBookField); + final border = tester.getRect(panel); + final controls = tester.getRect(field); + expect(border.left, 24); + expect(border.right, 1576); + expect(controls.left, border.left + 24); + expect(controls.width, 472); preferences.pageAlignment = 'center'; await tester.pumpAndSettle(); - expect(tester.getCenter(panel).dx, 800); + expect(tester.getRect(panel), border); + expect(tester.getSize(field).width, controls.width); + expect(tester.getCenter(field).dx, border.center.dx); }); for (final (name, size, scale, theme) in [ From 6ba670ce5c6c15dceb77f97db6d2c9f8c12ea9ee Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 02:51:13 +0200 Subject: [PATCH 11/17] feat: show recent sessions alongside the timer --- app/lib/pages/reading_timer_page.dart | 138 +++++++++++------- .../widgets/timer/reading_timer_history.dart | 93 ++++++++++++ app/test/pages/reading_timer_page_test.dart | 19 ++- .../timer/reading_timer_history_test.dart | 103 +++++++++++++ 4 files changed, 301 insertions(+), 52 deletions(-) create mode 100644 app/lib/widgets/timer/reading_timer_history.dart create mode 100644 app/test/timer/reading_timer_history_test.dart diff --git a/app/lib/pages/reading_timer_page.dart b/app/lib/pages/reading_timer_page.dart index ad57e30e..65e7351f 100644 --- a/app/lib/pages/reading_timer_page.dart +++ b/app/lib/pages/reading_timer_page.dart @@ -14,6 +14,7 @@ import 'package:papyrus/widgets/shared/app_page_bar.dart'; import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; import 'package:papyrus/widgets/shared/searchable_book_field.dart'; import 'package:papyrus/widgets/timer/reading_timer_clock.dart'; +import 'package:papyrus/widgets/timer/reading_timer_history.dart'; import 'package:provider/provider.dart'; class ReadingTimerPage extends StatefulWidget { @@ -113,33 +114,44 @@ class _ReadingTimerPageState extends State { ], ), Expanded( - child: SingleChildScrollView( - padding: EdgeInsets.all(padding), - child: Form( - key: _form, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (timer.loading) const AppLinearProgressIndicator(), - if (timer.error != null && !_saveDialogOpen) - Padding( - padding: const EdgeInsets.only(bottom: Spacing.md), - child: Semantics( - liveRegion: true, - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - spacing: Spacing.sm, - children: [ - Text(timer.error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), - TextButton(onPressed: timer.busy ? null : timer.reload, child: const Text('Retry')), - ], + child: LayoutBuilder( + builder: (context, viewport) { + return SingleChildScrollView( + padding: EdgeInsets.all(padding), + child: Form( + key: _form, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (timer.loading) const AppLinearProgressIndicator(), + if (timer.error != null && !_saveDialogOpen) + Padding( + padding: const EdgeInsets.only(bottom: Spacing.md), + child: Semantics( + liveRegion: true, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: Spacing.sm, + children: [ + Text(timer.error!, style: TextStyle(color: Theme.of(context).colorScheme.error)), + TextButton(onPressed: timer.busy ? null : timer.reload, child: const Text('Retry')), + ], + ), + ), ), + _session( + context, + timer, + books, + book, + centered: centered, + minimumHeight: (viewport.maxHeight - 2 * padding).clamp(0, double.infinity), ), - ), - _session(context, timer, books, book, centered: centered), - ], - ), - ), + ], + ), + ), + ); + }, ), ), ], @@ -154,6 +166,7 @@ class _ReadingTimerPageState extends State { List books, Book? book, { required bool centered, + required double minimumHeight, }) { final theme = Theme.of(context); final shape = theme.cardTheme.shape; @@ -210,11 +223,41 @@ class _ReadingTimerPageState extends State { ], ); + final controls = Column( + key: const ValueKey('timer-controls-column'), + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SearchableBookField( + key: ValueKey((_library, book?.id)), + books: books, + value: book?.id, + enabled: editable, + showDetails: true, + onChanged: (id) => setState(() => _bookId = id), + ), + if (books.isEmpty && session == null) + Align( + alignment: Alignment.centerLeft, + child: TextButton( + onPressed: () => context.go('/library/books'), + child: const Text('Go to library'), + ), + ), + const SizedBox(height: Spacing.xl), + _instrument(context, timer, book), + const SizedBox(height: Spacing.lg), + settings, + ], + ); + return LayoutBuilder( key: const ValueKey('timer-panel-layout'), builder: (context, constraints) { + final wide = constraints.maxWidth >= 960 && MediaQuery.textScalerOf(context).scale(16) <= 24; + return Container( key: const ValueKey('reading-session'), + constraints: BoxConstraints(minHeight: minimumHeight), padding: const EdgeInsets.all(Spacing.lg), decoration: ShapeDecoration( shape: shape is OutlinedBorder @@ -229,32 +272,27 @@ class _ReadingTimerPageState extends State { child: Align( alignment: centered ? Alignment.topCenter : Alignment.topLeft, child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 520 - 2 * Spacing.lg), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SearchableBookField( - key: ValueKey((_library, book?.id)), - books: books, - value: book?.id, - enabled: editable, - showDetails: true, - onChanged: (id) => setState(() => _bookId = id), - ), - if (books.isEmpty && session == null) - Align( - alignment: Alignment.centerLeft, - child: TextButton( - onPressed: () => context.go('/library/books'), - child: const Text('Go to library'), - ), + key: const ValueKey('timer-content'), + constraints: BoxConstraints(maxWidth: wide ? 1040 : 520 - 2 * Spacing.lg), + child: wide + ? Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(width: 520 - 2 * Spacing.lg, child: controls), + const SizedBox(width: Spacing.xxl), + const Expanded(child: ReadingTimerHistory()), + ], + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + controls, + const SizedBox(height: Spacing.xl), + const Divider(height: 1), + const SizedBox(height: Spacing.lg), + const ReadingTimerHistory(), + ], ), - const SizedBox(height: Spacing.xl), - _instrument(context, timer, book), - const SizedBox(height: Spacing.lg), - settings, - ], - ), ), ), ); diff --git a/app/lib/widgets/timer/reading_timer_history.dart b/app/lib/widgets/timer/reading_timer_history.dart new file mode 100644 index 00000000..a85a2cbf --- /dev/null +++ b/app/lib/widgets/timer/reading_timer_history.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/models/reading_activity.dart'; +import 'package:papyrus/models/reading_goal.dart'; +import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/widgets/book/private_book_cover.dart'; +import 'package:provider/provider.dart'; + +class ReadingTimerHistory extends StatelessWidget { + const ReadingTimerHistory({super.key}); + + @override + Widget build(BuildContext context) { + final store = context.watch(); + final theme = Theme.of(context); + + final sessions = + groupReadingActivities( + store.effectiveReadingActivities, + ).where((activity) => activity.kind == 'reading' && activity.seconds > 0).toList() + ..sort((left, right) => right.endTime.compareTo(left.endTime)); + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Semantics( + header: true, + child: Text('Recent sessions', style: theme.textTheme.titleMedium), + ), + const SizedBox(height: Spacing.md), + if (sessions.isEmpty) + Text( + 'No saved sessions yet.', + style: theme.textTheme.bodyMedium?.copyWith( + color: theme.colorScheme.onSurfaceVariant, + ), + ), + for (final session in sessions.take(8)) ...[ + if (session != sessions.first) const Divider(height: Spacing.lg), + _session(context, store, session), + ], + ], + ); + } + + Widget _session(BuildContext context, DataStore store, ReadingActivity session) { + final theme = Theme.of(context); + final book = store.getBook(session.bookId); + final title = book?.title ?? session.bookTitle; + final date = DateFormat.yMMMd().add_jm().format(session.endTime.toLocal()); + final duration = session.seconds < 60 ? '${session.seconds}s' : formatDuration(session.seconds ~/ 60); + + return Row( + key: ValueKey('recent-session-${session.id}'), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 36, + height: 54, + child: ClipRRect( + borderRadius: BorderRadius.circular(AppRadius.sm), + child: CoverImage( + bookId: book?.id, + imageUrl: book?.coverUrl, + mediaId: book?.coverMediaId, + placeholder: ColoredBox( + color: theme.colorScheme.primaryContainer, + child: Icon(Icons.menu_book_outlined, color: theme.colorScheme.onPrimaryContainer, size: 20), + ), + ), + ), + ), + const SizedBox(width: Spacing.md), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Tooltip( + message: title, + child: Text(title, maxLines: 2, overflow: TextOverflow.ellipsis, style: theme.textTheme.titleSmall), + ), + const SizedBox(height: Spacing.xs), + Text(date, style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurfaceVariant)), + ], + ), + ), + const SizedBox(width: Spacing.sm), + Text(duration, style: theme.textTheme.labelLarge), + ], + ); + } +} diff --git a/app/test/pages/reading_timer_page_test.dart b/app/test/pages/reading_timer_page_test.dart index d787da2d..46c03c3b 100644 --- a/app/test/pages/reading_timer_page_test.dart +++ b/app/test/pages/reading_timer_page_test.dart @@ -594,20 +594,35 @@ void main() { } testWidgets('panel fills page width while controls follow the alignment preference', (tester) async { - await pump(tester, size: const Size(1600, 900)); + await pump(tester, size: const Size(1600, 1200)); final panel = find.byKey(const ValueKey('reading-session')); final field = find.byType(SearchableBookField); final border = tester.getRect(panel); final controls = tester.getRect(field); expect(border.left, 24); expect(border.right, 1576); + expect(border.bottom, 1176); expect(controls.left, border.left + 24); expect(controls.width, 472); preferences.pageAlignment = 'center'; await tester.pumpAndSettle(); expect(tester.getRect(panel), border); expect(tester.getSize(field).width, controls.width); - expect(tester.getCenter(field).dx, border.center.dx); + expect(tester.getCenter(find.byKey(const ValueKey('timer-content'))).dx, border.center.dx); + expect(tester.getTopLeft(find.text('Recent sessions')).dx, greaterThan(tester.getTopRight(field).dx)); + }); + + testWidgets('narrow layout places history after timer settings and scrolls to its bottom', (tester) async { + await pump(tester, size: const Size(390, 700)); + await tap(tester, 'Countdown'); + expect( + tester.getTopLeft(find.text('Recent sessions')).dy, + greaterThan(tester.getBottomLeft(find.text('Custom')).dy), + ); + await tester.ensureVisible(find.text('No saved sessions yet.')); + await tester.pumpAndSettle(); + expect(find.text('No saved sessions yet.').hitTestable(), findsOneWidget); + expect(tester.takeException(), isNull); }); for (final (name, size, scale, theme) in [ diff --git a/app/test/timer/reading_timer_history_test.dart b/app/test/timer/reading_timer_history_test.dart new file mode 100644 index 00000000..406ab875 --- /dev/null +++ b/app/test/timer/reading_timer_history_test.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/data/repositories/book_repository.dart'; +import 'package:papyrus/models/reading_activity.dart'; +import 'package:papyrus/widgets/timer/reading_timer_history.dart'; +import 'package:provider/provider.dart'; + +void main() { + final date = DateTime.utc(2026, 11, 6, 12); + late DataStore store; + + setUp(() => store = DataStore(bookRepository: InMemoryBookRepository())); + tearDown(() => store.dispose()); + + ReadingActivity entry( + String id, { + int minute = 0, + int seconds = 60, + String? sessionId, + String kind = 'reading', + String? correctionOf, + }) => ReadingActivity( + id: id, + bookId: 'book', + bookTitle: 'Book $id', + sessionId: sessionId, + deviceType: 'physical_timer', + startTime: date.add(Duration(minutes: minute)), + endTime: date.add(Duration(minutes: minute, seconds: seconds)), + createdAt: date, + kind: kind, + correctionOf: correctionOf, + ); + + Future pump(WidgetTester tester, {double width = 500, double scale = 1}) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = Size(width, 900); + addTearDown(tester.view.reset); + await tester.pumpWidget( + ChangeNotifierProvider.value( + value: store, + child: MaterialApp( + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), + child: child!, + ), + home: const Scaffold( + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24), + child: ReadingTimerHistory(), + ), + ), + ), + ), + ), + ); + } + + testWidgets('history groups intervals without counting pauses and orders newest first', (tester) async { + await store.commitTracking( + activities: [ + entry('first', seconds: 120, sessionId: 'shared'), + entry('second', minute: 10, seconds: 180, sessionId: 'shared'), + entry('latest', minute: 30, seconds: 42), + entry('completion', minute: 40, kind: 'completion'), + ], + ); + await pump(tester); + expect(find.text('Book first'), findsOneWidget); + expect(find.text('Book second'), findsNothing); + expect(find.text('Book completion'), findsNothing); + expect(find.text('5m'), findsOneWidget); + expect(find.text('42s'), findsOneWidget); + expect(tester.getTopLeft(find.text('Book latest')).dy, lessThan(tester.getTopLeft(find.text('Book first')).dy)); + }); + + testWidgets('history refreshes for saved and reversed entries', (tester) async { + await pump(tester); + expect(find.text('No saved sessions yet.'), findsOneWidget); + await store.commitTracking(activities: [entry('saved')]); + await tester.pump(); + expect(find.text('Book saved'), findsOneWidget); + expect(find.text('No saved sessions yet.'), findsNothing); + await store.commitTracking( + activities: [entry('reversal', kind: 'reversal', correctionOf: 'saved')], + ); + await tester.pump(); + expect(find.text('Book saved'), findsNothing); + expect(find.text('No saved sessions yet.'), findsOneWidget); + }); + + testWidgets('history limits older sessions and supports narrow large text', (tester) async { + await store.commitTracking(activities: [for (var index = 0; index < 10; index++) entry('$index', minute: index)]); + await pump(tester, width: 320, scale: 2); + expect(find.text('Book 9'), findsOneWidget); + expect(find.text('Book 2'), findsOneWidget); + expect(find.text('Book 1'), findsNothing); + expect(find.text('Book 0'), findsNothing); + expect(tester.takeException(), isNull); + }); +} From 0cd77324597f63d34e914e6a3af8902d2e94c1f9 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 02:53:20 +0200 Subject: [PATCH 12/17] fix: remove outer timer card border and padding --- app/lib/pages/reading_timer_page.dart | 14 +------------- app/test/pages/reading_timer_page_test.dart | 16 ++++++++-------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/app/lib/pages/reading_timer_page.dart b/app/lib/pages/reading_timer_page.dart index 65e7351f..6495187f 100644 --- a/app/lib/pages/reading_timer_page.dart +++ b/app/lib/pages/reading_timer_page.dart @@ -169,7 +169,6 @@ class _ReadingTimerPageState extends State { required double minimumHeight, }) { final theme = Theme.of(context); - final shape = theme.cardTheme.shape; final session = timer.session; final countdown = session == null ? _countdown : session.targetSeconds != null; final editable = session == null && timer.available && !timer.busy; @@ -255,20 +254,9 @@ class _ReadingTimerPageState extends State { builder: (context, constraints) { final wide = constraints.maxWidth >= 960 && MediaQuery.textScalerOf(context).scale(16) <= 24; - return Container( + return ConstrainedBox( key: const ValueKey('reading-session'), constraints: BoxConstraints(minHeight: minimumHeight), - padding: const EdgeInsets.all(Spacing.lg), - decoration: ShapeDecoration( - shape: shape is OutlinedBorder - ? shape.copyWith( - side: BorderSide(color: theme.colorScheme.outlineVariant, width: shape.side.width), - ) - : RoundedRectangleBorder( - borderRadius: BorderRadius.circular(AppRadius.lg), - side: BorderSide(color: theme.colorScheme.outlineVariant), - ), - ), child: Align( alignment: centered ? Alignment.topCenter : Alignment.topLeft, child: ConstrainedBox( diff --git a/app/test/pages/reading_timer_page_test.dart b/app/test/pages/reading_timer_page_test.dart index 46c03c3b..cf7d3c70 100644 --- a/app/test/pages/reading_timer_page_test.dart +++ b/app/test/pages/reading_timer_page_test.dart @@ -593,22 +593,22 @@ void main() { }); } - testWidgets('panel fills page width while controls follow the alignment preference', (tester) async { + testWidgets('content fills page height and follows the alignment preference without extra padding', (tester) async { await pump(tester, size: const Size(1600, 1200)); final panel = find.byKey(const ValueKey('reading-session')); final field = find.byType(SearchableBookField); - final border = tester.getRect(panel); + final bounds = tester.getRect(panel); final controls = tester.getRect(field); - expect(border.left, 24); - expect(border.right, 1576); - expect(border.bottom, 1176); - expect(controls.left, border.left + 24); + expect(bounds.left, 24); + expect(bounds.right, 1576); + expect(bounds.bottom, 1176); + expect(controls.left, bounds.left); expect(controls.width, 472); preferences.pageAlignment = 'center'; await tester.pumpAndSettle(); - expect(tester.getRect(panel), border); + expect(tester.getRect(panel), bounds); expect(tester.getSize(field).width, controls.width); - expect(tester.getCenter(find.byKey(const ValueKey('timer-content'))).dx, border.center.dx); + expect(tester.getCenter(find.byKey(const ValueKey('timer-content'))).dx, bounds.center.dx); expect(tester.getTopLeft(find.text('Recent sessions')).dx, greaterThan(tester.getTopRight(field).dx)); }); From 15888e94aebf011dbc803a5e40237b7471a7c541 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 12:54:54 +0200 Subject: [PATCH 13/17] feat: group settings and refine supporting pages --- app/integration_test/app_updates_test.dart | 131 ++++++++ .../mobile_settings_test.dart | 117 +++++++ app/lib/config/app_router.dart | 14 +- app/lib/pages/app_updates_page.dart | 315 ++++++++++++++++++ app/lib/pages/licenses_page.dart | 59 +++- app/lib/pages/profile_page.dart | 169 ++++++---- app/lib/pages/support_page.dart | 13 +- .../powersync/storage_sync_controller.dart | 12 + app/lib/providers/preferences_provider.dart | 2 +- app/lib/services/license_packages.dart | 15 + app/lib/themes/app_theme.dart | 5 +- app/lib/updates/update_controller.dart | 24 ++ app/lib/updates/update_settings.dart | 95 +----- .../profile/about_settings_section.dart | 35 +- .../accessibility_settings_section.dart | 5 +- .../profile/account_settings_section.dart | 12 +- .../profile/appearance_settings_section.dart | 5 +- .../storage_sync_settings_section.dart | 199 +++++------ app/lib/widgets/settings/settings_row.dart | 2 + app/test/pages/licenses_page_test.dart | 119 +++++++ app/test/pages/profile_page_test.dart | 191 ++++++----- app/test/pages/profile_storage_sync_test.dart | 158 ++------- app/test/pages/support_navigation_test.dart | 3 + app/test/pages/support_page_test.dart | 64 +++- .../storage_sync_controller_test.dart | 32 ++ app/test/updates/update_controller_test.dart | 27 ++ app/test/updates/update_settings_test.dart | 251 ++++++++++---- .../profile/about_settings_section_test.dart | 51 +++ 28 files changed, 1546 insertions(+), 579 deletions(-) create mode 100644 app/integration_test/app_updates_test.dart create mode 100644 app/integration_test/mobile_settings_test.dart create mode 100644 app/lib/pages/app_updates_page.dart create mode 100644 app/lib/services/license_packages.dart diff --git a/app/integration_test/app_updates_test.dart b/app/integration_test/app_updates_test.dart new file mode 100644 index 00000000..665f7b08 --- /dev/null +++ b/app/integration_test/app_updates_test.dart @@ -0,0 +1,131 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/updates/update_controller.dart'; +import 'package:papyrus/updates/update_release.dart'; +import 'package:papyrus/widgets/profile/about_settings_section.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('update settings navigation and states on mobile', (tester) async { + for (final (name, theme, scale) in [ + ('light', AppTheme.light, 1.0), + ('dark', AppTheme.dark, 1.0), + ('large-text', AppTheme.dark, 2.0), + ('eink', AppTheme.eink, 1.0), + ]) { + SharedPreferences.setMockInitialValues({}); + var result = Completer>(); + final installation = Completer(); + final updates = UpdateController( + preferences: await SharedPreferences.getInstance(), + appInfo: () async => + PackageInfo(appName: 'Papyrus', packageName: 'papyrus', version: '0.3.0', buildNumber: '7'), + channelProvider: () async => UpdateChannel.windows, + manifest: () => result.future, + installer: (_, progress) async { + progress(0.5); + return installation.future; + }, + ); + + await tester.pumpWidget( + ChangeNotifierProvider.value( + value: updates, + child: MaterialApp( + key: ValueKey(name), + debugShowCheckedModeBanner: false, + theme: theme, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), + child: child!, + ), + home: const Scaffold(body: SafeArea(child: AboutSettingsSection())), + ), + ), + ); + + await tester.pumpAndSettle(); + await tester.tap(find.text('App updates')); + await tester.pumpAndSettle(); + expect(find.byType(AlertDialog), findsNothing); + expect(find.text('Not checked yet'), findsOneWidget); + await binding.takeScreenshot('updates-$name-unchecked'); + await tester.tap(find.text('Check automatically')); + await tester.pumpAndSettle(); + expect(updates.automatic, isFalse); + + if (name == 'dark') { + await tester.tap(find.text('Check for updates')); + await tester.pump(const Duration(milliseconds: 300)); + await binding.takeScreenshot('updates-dark-checking'); + result.completeError(StateError('Offline')); + await tester.pumpAndSettle(); + expect(find.text('Couldn’t check for updates'), findsOneWidget); + await tester.pump(kThemeChangeDuration); + await binding.takeScreenshot('updates-dark-error'); + final retryButton = find.byKey(const ValueKey('check-updates')); + final retryBounds = tester.getRect(retryButton); + final toggleBounds = tester.getRect(find.byType(Switch)); + result = Completer>(); + await tester.tap(find.text('Retry')); + await tester.pump(const Duration(milliseconds: 100)); + expect(find.text('Retry'), findsOneWidget); + expect(find.text('Please try again.'), findsNothing); + expect(find.byType(LinearProgressIndicator), findsNothing); + expect(tester.getRect(retryButton), retryBounds); + expect(tester.getRect(find.byType(Switch)), toggleBounds); + result.completeError(StateError('Still offline')); + await tester.pumpAndSettle(); + await tester.pump(const Duration(milliseconds: 350)); + expect(find.byType(LinearProgressIndicator), findsNothing); + expect(tester.getRect(retryButton), retryBounds); + await binding.takeScreenshot('updates-dark-quick-retry'); + result = Completer>(); + await tester.tap(find.text('Retry')); + await tester.pump(); + result.complete(_release(7)); + await tester.pumpAndSettle(); + expect(find.text('You’re up to date'), findsOneWidget); + await binding.takeScreenshot('updates-dark-current'); + result = Completer>(); + await tester.tap(find.text('Check for updates')); + await tester.pump(); + result.complete(_release(8)); + await tester.pumpAndSettle(); + await binding.takeScreenshot('updates-dark-available'); + await tester.tap(find.text('Update')); + await tester.pump(const Duration(milliseconds: 300)); + await binding.takeScreenshot('updates-dark-progress'); + installation.complete('Close Papyrus normally to install the update.'); + await tester.pumpAndSettle(); + await binding.takeScreenshot('updates-dark-staged'); + } + + expect(tester.takeException(), isNull); + + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(find.text('Version'), findsOneWidget); + expect(updates.viewingSettings, isFalse); + await tester.pumpWidget(const SizedBox.shrink()); + updates.dispose(); + } + }); +} + +Map _release(int build) => { + 'tag': 'v0.3.0+$build', + 'version': '0.3.0', + 'build_number': build, + 'assets': { + 'installer': {'name': 'papyrus-v0.3.0+$build-windows-x64-setup.exe', 'sha256': 'a' * 64}, + }, +}; diff --git a/app/integration_test/mobile_settings_test.dart b/app/integration_test/mobile_settings_test.dart new file mode 100644 index 00000000..a9583244 --- /dev/null +++ b/app/integration_test/mobile_settings_test.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router/go_router.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:papyrus/main.dart' as app; +import 'package:papyrus/pages/profile_page.dart'; +import 'package:papyrus/pages/licenses_page.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/widgets/settings/settings_row.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('mobile settings groups, saved preferences, and native Back', (tester) async { + SharedPreferences.setMockInitialValues({'offline_mode': true, 'theme_mode': 'light'}); + await app.main(); + await tester.pumpAndSettle(); + final router = GoRouter.of(tester.element(find.byType(Scaffold).first)); + router.go('/profile'); + await tester.pumpAndSettle(); + final preferences = tester.element(find.byType(ProfilePage)).read(); + await binding.takeScreenshot('settings-index-light'); + + for (final (title, control) in [ + ('Account', 'Display name'), + ('Appearance', 'Theme'), + ('Storage', 'Clear local library'), + ('Accessibility', 'Reduce animations'), + ('About', 'Version'), + ]) { + await tester.ensureVisible(find.widgetWithText(ListTile, title)); + await tester.tap(find.widgetWithText(ListTile, title)); + await tester.pumpAndSettle(); + expect(find.text(control), findsOneWidget); + final route = ModalRoute.of(tester.element(find.byType(ProfilePage).last))! as TransitionRoute; + expect(route.transitionDuration, Duration.zero); + expect(route.reverseTransitionDuration, Duration.zero); + await binding.takeScreenshot('settings-${title.toLowerCase()}-light'); + + if (title == 'About') { + await tester.tap(find.widgetWithText(SettingsRow, 'Licenses')); + + for (var frame = 0; frame < 300; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + + if (find.byType(LicensesPage).evaluate().isNotEmpty) { + break; + } + } + + expect(find.byType(LicensesPage), findsOneWidget); + expect(find.byType(ListTile), findsWidgets); + expect(find.text('Loading licenses…'), findsNothing); + await binding.takeScreenshot('settings-licenses-first-frame'); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(find.text('Version'), findsOneWidget); + } + + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(router.routeInformationProvider.value.uri.path, '/profile'); + } + + await tester.tap(find.widgetWithText(ListTile, 'Appearance')); + await tester.pumpAndSettle(); + await tester.tap(find.widgetWithText(SettingsRow, 'Theme')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Dark')); + await tester.pumpAndSettle(); + expect(preferences.themeModePref, 'dark'); + await binding.takeScreenshot('settings-appearance-dark'); + + await tester.binding.handlePopRoute(); + await tester.pumpAndSettle(); + + expect(router.routeInformationProvider.value.uri.path, '/profile'); + expect(find.text('Dark theme, page layout'), findsOneWidget); + tester.state(find.byType(Scrollable).first).position.jumpTo(0); + await tester.pumpAndSettle(); + await binding.takeScreenshot('settings-index-dark'); + preferences.interfaceTextEnlargement = 2; + await tester.pumpAndSettle(); + await binding.takeScreenshot('settings-index-large-text'); + await tester.ensureVisible(find.widgetWithText(ListTile, 'Accessibility')); + await tester.tap(find.widgetWithText(ListTile, 'Accessibility')); + await tester.pumpAndSettle(); + await binding.takeScreenshot('settings-accessibility-large-text'); + expect(tester.takeException(), isNull); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + preferences.interfaceTextEnlargement = 1; + preferences.reduceAnimations = true; + await tester.pumpAndSettle(); + router.go('/profile/appearance'); + await tester.pumpAndSettle(); + final route = ModalRoute.of(tester.element(find.byType(ProfilePage).last))! as TransitionRoute; + expect(route.transitionDuration, Duration.zero); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(router.routeInformationProvider.value.uri.path, '/profile'); + preferences.reduceAnimations = false; + preferences.themeModePref = 'eink'; + await tester.pumpAndSettle(); + tester.state(find.byType(Scrollable).first).position.jumpTo(0); + await tester.pumpAndSettle(); + await binding.takeScreenshot('settings-index-eink'); + await tester.tap(find.widgetWithText(ListTile, 'Appearance')); + await tester.pump(); + expect(find.text('Theme'), findsOneWidget); + await tester.pumpAndSettle(); + await binding.takeScreenshot('settings-appearance-eink'); + expect(tester.takeException(), isNull); + }); +} diff --git a/app/lib/config/app_router.dart b/app/lib/config/app_router.dart index 5faba8c3..e23e5167 100644 --- a/app/lib/config/app_router.dart +++ b/app/lib/config/app_router.dart @@ -20,6 +20,7 @@ import 'package:papyrus/pages/profile_page.dart'; import 'package:papyrus/pages/licenses_page.dart'; import 'package:papyrus/pages/support_page.dart'; import 'package:papyrus/services/support_api_client.dart'; +import 'package:papyrus/services/license_packages.dart'; import 'package:papyrus/pages/register_page.dart'; import 'package:papyrus/pages/reader_page.dart'; import 'package:papyrus/pages/search_options_page.dart'; @@ -289,9 +290,20 @@ class AppRouter { path: '/profile', pageBuilder: (context, state) => NoTransitionPage(key: state.pageKey, child: const ProfilePage()), routes: [ + for (final section in ProfileSection.values) + GoRoute( + path: section.path, + pageBuilder: (context, state) => NoTransitionPage( + key: state.pageKey, + child: ProfilePage(section: section), + ), + ), GoRoute( path: 'licenses', - pageBuilder: (context, state) => NoTransitionPage(key: state.pageKey, child: const LicensesPage()), + pageBuilder: (context, state) => NoTransitionPage( + key: state.pageKey, + child: LicensesPage(initialLicenses: state.extra as LicensePackages?), + ), ), GoRoute( path: 'support', diff --git a/app/lib/pages/app_updates_page.dart b/app/lib/pages/app_updates_page.dart new file mode 100644 index 00000000..08c41ea0 --- /dev/null +++ b/app/lib/pages/app_updates_page.dart @@ -0,0 +1,315 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:papyrus/services/about_links.dart'; +import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/updates/update_controller.dart'; +import 'package:papyrus/updates/update_release.dart'; +import 'package:papyrus/widgets/settings/settings_row.dart'; +import 'package:papyrus/widgets/library/library_page_header.dart'; +import 'package:papyrus/widgets/shared/app_page_bar.dart'; +import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; + +class AppUpdatesPage extends StatefulWidget { + const AppUpdatesPage({super.key, required this.controller}); + + final UpdateController controller; + + @override + State createState() => _AppUpdatesPageState(); +} + +typedef _UpdatePresentation = ({ + String title, + String? detail, + String action, + DateTime? lastChecked, + bool externalLink, +}); + +class _AppUpdatesPageState extends State { + static const _feedbackDelay = Duration(milliseconds: 300); + static const _checkFailedTitle = 'Couldn’t check for updates'; + + late final Future _installedVersion = widget.controller.appInfo(); + late _UpdatePresentation _presentation; + Timer? _feedbackTimer; + bool _showCheckFeedback = false; + + @override + void initState() { + super.initState(); + _presentation = _currentPresentation(); + widget.controller.addListener(_handleUpdate); + + if (widget.controller.checking) { + _scheduleFeedback(); + } + } + + @override + void dispose() { + widget.controller.removeListener(_handleUpdate); + _feedbackTimer?.cancel(); + super.dispose(); + } + + void _scheduleFeedback() { + _feedbackTimer ??= Timer(_feedbackDelay, () { + if (mounted && widget.controller.checking) { + setState(() => _showCheckFeedback = true); + } + }); + } + + void _handleUpdate() { + // Keep the previous result's geometry until a new check result arrives. + if (widget.controller.checking) { + _scheduleFeedback(); + } else { + _feedbackTimer?.cancel(); + _feedbackTimer = null; + _showCheckFeedback = false; + _presentation = _currentPresentation(); + } + + setState(() {}); + } + + _UpdatePresentation _currentPresentation() { + final controller = widget.controller; + + return ( + title: _statusTitle(controller), + detail: _statusDetail(controller), + action: _actionLabel(controller), + lastChecked: controller.lastChecked, + externalLink: controller.external && !controller.available && !controller.busy, + ); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final controller = widget.controller; + final lastChecked = _presentation.lastChecked; + final compact = MediaQuery.sizeOf(context).width < Breakpoints.desktopSmall; + + final content = SingleChildScrollView( + padding: EdgeInsets.all(compact ? Spacing.md : Spacing.lg), + child: Align( + alignment: AlignmentDirectional.topStart, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: compact ? 600 : 480), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text('Installed version', style: theme.textTheme.bodyMedium), + const SizedBox(height: Spacing.xs), + FutureBuilder( + future: _installedVersion, + builder: (context, snapshot) => Text( + switch (snapshot) { + AsyncSnapshot(data: final PackageInfo info) => AboutLinks.versionLabel(info), + AsyncSnapshot(hasError: true) => 'Unavailable', + _ => 'Loading…', + }, + style: theme.textTheme.titleLarge, + ), + ), + const SizedBox(height: Spacing.md), + Semantics( + liveRegion: true, + // Reserve wrapped error text so a failed check never moves the action. + child: IndexedStack( + index: 0, + alignment: AlignmentDirectional.topStart, + children: [ + Text(_presentation.title, style: theme.textTheme.titleLarge), + Text(_checkFailedTitle, style: theme.textTheme.titleLarge), + ], + ), + ), + if (lastChecked != null) ...[ + const SizedBox(height: Spacing.sm), + Text( + _lastCheckedLabel(context, lastChecked), + style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant), + ), + ], + if (_presentation.detail case final String detail) ...[ + const SizedBox(height: Spacing.sm), + Text(detail, style: theme.textTheme.bodyMedium), + ], + Padding( + padding: const EdgeInsets.symmetric(vertical: Spacing.sm), + child: SizedBox( + height: Spacing.xs, + child: controller.busy && (!controller.checking || _showCheckFeedback) + ? AppLinearProgressIndicator( + value: controller.progress, + semanticsLabel: controller.checking ? 'Checking for updates' : 'Update progress', + ) + : null, + ), + ), + if (!controller.staged) + Align( + alignment: AlignmentDirectional.centerStart, + child: FilledButton( + key: const ValueKey('check-updates'), + onPressed: controller.busy ? null : () => _performAction(context, controller), + style: controller.checking + ? FilledButton.styleFrom( + disabledBackgroundColor: theme.colorScheme.primary, + disabledForegroundColor: theme.colorScheme.onPrimary, + ) + : null, + child: IndexedStack( + index: controller.checking && _showCheckFeedback ? 1 : 0, + alignment: Alignment.center, + children: [Text(_presentation.action), const Text('Checking…')], + ), + ), + ), + if (_presentation.externalLink) + Align( + alignment: AlignmentDirectional.centerStart, + child: TextButton( + onPressed: () => _openExternalUpdate(context, controller), + child: Text(controller.channel == UpdateChannel.apt ? 'Repository setup' : 'Downloads'), + ), + ), + const SizedBox(height: Spacing.xl), + const Divider(height: 1), + const SizedBox(height: Spacing.md), + SettingsToggleRow( + label: 'Check automatically', + value: controller.automatic, + onChanged: controller.setAutomatic, + padding: const EdgeInsets.symmetric(vertical: Spacing.xs), + ), + Text( + 'Check for new versions in the background.', + style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant), + ), + ], + ), + ), + ), + ); + + return Scaffold( + appBar: compact + ? AppPageBar(context: context, title: const Text('App updates'), leading: const BackButton()) + : null, + body: SafeArea( + child: compact + ? content + : Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const LibraryPageHeader(title: 'App updates', leading: BackButton()), + Expanded(child: content), + ], + ), + ), + ); + } + + String _lastCheckedLabel(BuildContext context, DateTime checked) { + final local = checked.toLocal(); + final localizations = MaterialLocalizations.of(context); + final date = localizations.formatMediumDate(local); + final time = localizations.formatTimeOfDay( + TimeOfDay.fromDateTime(local), + alwaysUse24HourFormat: MediaQuery.alwaysUse24HourFormatOf(context), + ); + + return 'Last checked $date at $time'; + } + + String _statusTitle(UpdateController controller) => switch (controller.status) { + UpdateStatus.unchecked => controller.lastChecked == null ? 'Not checked yet' : 'Ready to check for updates', + UpdateStatus.checking => 'Checking for updates…', + UpdateStatus.upToDate => 'You’re up to date', + UpdateStatus.available => + controller.release == null + ? 'Update available' + : 'Version ${controller.release!.version} (${controller.release!.buildNumber}) is available', + UpdateStatus.installing => 'Updating Papyrus', + UpdateStatus.staged => 'Ready to finish updating', + UpdateStatus.handedOff => 'Update started', + UpdateStatus.checkFailed => _checkFailedTitle, + UpdateStatus.installFailed => 'Couldn’t finish the update', + }; + + String? _statusDetail(UpdateController controller) { + if (controller.status == UpdateStatus.checkFailed || controller.status == UpdateStatus.installFailed) { + return null; + } + + if (controller.status == UpdateStatus.installing || + controller.status == UpdateStatus.staged || + controller.status == UpdateStatus.handedOff) { + return controller.message; + } + + if (controller.checking || (!controller.available && !controller.external)) { + return null; + } + + return switch (controller.channel) { + UpdateChannel.apt => + 'Install updates through your system’s software updater. Set up the Papyrus repository if needed.', + UpdateChannel.manual => 'Install updates by downloading the latest Papyrus package.', + UpdateChannel.windows => 'The update will install after you close Papyrus normally.', + UpdateChannel.appImage => 'The update takes effect when you close and reopen Papyrus.', + UpdateChannel.web => 'Reload when you have finished reading to use the latest version.', + _ => 'Your device will guide you through installation.', + }; + } + + String _actionLabel(UpdateController controller) { + if (controller.checking) return 'Checking…'; + if (controller.busy) return 'Updating…'; + if (controller.status == UpdateStatus.checkFailed || controller.status == UpdateStatus.installFailed) { + return 'Retry'; + } + + if (controller.available && controller.status != UpdateStatus.handedOff) { + return switch (controller.channel) { + UpdateChannel.web => 'Reload', + UpdateChannel.apt => 'Repository setup', + UpdateChannel.manual => 'Downloads', + _ => 'Update', + }; + } + + return 'Check for updates'; + } + + void _performAction(BuildContext context, UpdateController controller) { + if (!controller.available || controller.status == UpdateStatus.handedOff) { + controller.check(); + return; + } + + switch (controller.channel) { + case UpdateChannel.apt: + case UpdateChannel.manual: + _openExternalUpdate(context, controller); + default: + controller.install(); + } + } + + void _openExternalUpdate(BuildContext context, UpdateController controller) { + final uri = controller.channel == UpdateChannel.apt + ? Uri.https('github.com', '/PapyrusReader/client/blob/master/docs/INSTALL.md') + : AboutLinks.releases; + + AboutLinks.open(context, uri); + } +} diff --git a/app/lib/pages/licenses_page.dart b/app/lib/pages/licenses_page.dart index a0ada2fb..c446607b 100644 --- a/app/lib/pages/licenses_page.dart +++ b/app/lib/pages/licenses_page.dart @@ -1,31 +1,56 @@ +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:papyrus/services/license_packages.dart'; import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/library/library_page_header.dart'; import 'package:papyrus/widgets/shared/app_motion_control.dart'; class LicensesPage extends StatefulWidget { - const LicensesPage({super.key}); + const LicensesPage({super.key, this.initialLicenses}); + + final LicensePackages? initialLicenses; @override State createState() => _LicensesPageState(); } class _LicensesPageState extends State { - late Future>> _licenses = _loadLicenses(); + late Future _licenses = widget.initialLicenses == null + ? _loadLicenses() + : SynchronousFuture(widget.initialLicenses!); + Timer? _loadingTimer; + bool _showLoading = false; String? _selectedPackage; - Future>> _loadLicenses() async { - final packages = >{}; + @override + void dispose() { + _loadingTimer?.cancel(); + super.dispose(); + } - await for (final entry in LicenseRegistry.licenses) { - for (final package in entry.packages) { - (packages[package] ??= []).add(entry); + Future _loadLicenses() async { + Future? minimumFeedback; + _showLoading = false; + _loadingTimer = Timer(const Duration(milliseconds: 300), () { + if (mounted) { + minimumFeedback = Future.delayed(const Duration(milliseconds: 500)); + setState(() => _showLoading = true); } - } + }); - return packages; + try { + return await loadLicensePackages(); + } finally { + _loadingTimer?.cancel(); + + // Fast loads stay immediate. Once visible, feedback remains readable. + if (minimumFeedback != null) { + await minimumFeedback; + } + } } @override @@ -39,7 +64,9 @@ class _LicensesPageState extends State { if (snapshot.hasError) { return Center( child: TextButton( - onPressed: () => setState(() => _licenses = _loadLicenses()), + onPressed: () => setState(() { + _licenses = _loadLicenses(); + }), child: const Text('Could not load licenses. Retry'), ), ); @@ -48,7 +75,7 @@ class _LicensesPageState extends State { final packages = snapshot.data; if (packages == null) { - return const Center(child: Text('Loading licenses…')); + return _showLoading ? const Center(child: Text('Loading licenses…')) : const SizedBox.shrink(); } if (packages.isEmpty) { @@ -63,7 +90,7 @@ class _LicensesPageState extends State { builder: (context, constraints) { final wide = constraints.maxWidth >= Breakpoints.tablet; - final list = ListView.builder( + final listView = ListView.builder( key: const PageStorageKey('license-packages'), padding: const EdgeInsets.all(Spacing.md), itemCount: names.length, @@ -103,6 +130,13 @@ class _LicensesPageState extends State { }, ); + // ListTile ink paints on its nearest Material, outside the scroll viewport. + final list = Material( + type: MaterialType.transparency, + clipBehavior: Clip.hardEdge, + child: listView, + ); + if (!wide) { return list; } @@ -141,7 +175,6 @@ class _LicenseScaffold extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ LibraryPageHeader(title: title, leading: const BackButton(), compact: compact), - if (compact) const Divider(height: 1), Expanded(child: child), ], ), diff --git a/app/lib/pages/profile_page.dart b/app/lib/pages/profile_page.dart index 793561cd..0008bff5 100644 --- a/app/lib/pages/profile_page.dart +++ b/app/lib/pages/profile_page.dart @@ -4,39 +4,42 @@ import 'package:flutter/material.dart'; import 'package:papyrus/widgets/shared/app_page_bar.dart'; import 'package:go_router/go_router.dart'; import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/profile/about_settings_section.dart'; import 'package:papyrus/widgets/profile/accessibility_settings_section.dart'; import 'package:papyrus/widgets/profile/account_settings_section.dart'; import 'package:papyrus/widgets/profile/appearance_settings_section.dart'; -import 'package:papyrus/widgets/profile/notifications_settings_section.dart'; -import 'package:papyrus/widgets/profile/privacy_settings_section.dart'; -import 'package:papyrus/widgets/profile/profile_menu_item.dart'; import 'package:papyrus/widgets/profile/storage_sync_settings_section.dart'; import 'package:provider/provider.dart'; -enum _ProfileSection { - account, - appearance, - storageSync, - accessibility, - about, +enum ProfileSection { + account('account', 'Account', Icons.person_outline), + appearance('appearance', 'Appearance', Icons.palette_outlined), + storageSync('storage', 'Storage', Icons.cloud_outlined), + accessibility('accessibility', 'Accessibility', Icons.accessibility_outlined), + about('about', 'About', Icons.info_outline); + + const ProfileSection(this.path, this.title, this.icon); + + final String path; + final String title; + final IconData icon; } -/// User profile page with account settings, preferences, and app configuration. -/// -/// Mobile: AppBar with title, inline settings sections. -/// Desktop: Sidebar nav + content panel (similar to GitHub Settings). +/// Compact settings index with pushed detail pages, or a wide sidebar and panel. class ProfilePage extends StatefulWidget { - const ProfilePage({super.key}); + const ProfilePage({super.key, this.section}); + + final ProfileSection? section; @override State createState() => _ProfilePageState(); } class _ProfilePageState extends State { - _ProfileSection _selectedSection = _ProfileSection.account; + late ProfileSection _selectedSection = widget.section ?? ProfileSection.account; @override Widget build(BuildContext context) { @@ -47,33 +50,87 @@ class _ProfilePageState extends State { return _buildDesktopLayout(context); } + if (widget.section != null) { + return _buildMobileDetail(context); + } + return _buildMobileLayout(context); } Widget _buildMobileLayout(BuildContext context) { + final auth = context.watch(); + final preferences = context.watch(); + return Scaffold( appBar: AppPageBar(context: context, title: const Text('Settings')), body: SafeArea( child: ListView( - padding: const EdgeInsets.all(Spacing.md), + key: const PageStorageKey('settings-index'), + padding: const EdgeInsets.symmetric(vertical: Spacing.sm), children: [ - const AccountSettingsSection(isDesktop: false), - const AppearanceSettingsSection(isDesktop: false), - const NotificationsSettingsSection(isDesktop: false), - const StorageSyncSettingsSection(isDesktop: false), - StorageSyncSettingsSection.buildMobileAcquisitionSection(context), - const PrivacySettingsSection(isDesktop: false), - const AccessibilitySettingsSection(isDesktop: false), - const AboutSettingsSection(isDesktop: false), - const Divider(height: 1), - ProfileMenuItem( - icon: Icons.logout, - label: 'Log out', - isDestructive: true, - showChevron: false, + _buildMobileItem( + context, + ProfileSection.account, + subtitle: auth.isOfflineMode ? 'Offline profile' : auth.profileDisplayName, + ), + const Divider(height: Spacing.lg), + _buildMobileItem( + context, + ProfileSection.appearance, + subtitle: '${AppearanceSettingsSection.getThemeLabel(preferences.themeModePref)} theme, page layout', + ), + _buildMobileItem(context, ProfileSection.accessibility, subtitle: 'Text size, contrast, motion'), + const Divider(height: Spacing.lg), + _buildMobileItem( + context, + ProfileSection.storageSync, + subtitle: auth.isOfflineMode ? 'On-device library, backups' : 'Sync, servers, downloads', + ), + const ListTile( + enabled: false, + leading: Icon(Icons.notifications_outlined), + title: Text('Notifications'), + subtitle: Text('Not available yet'), + ), + const ListTile( + enabled: false, + leading: Icon(Icons.shield_outlined), + title: Text('Privacy'), + subtitle: Text('Not available yet'), + ), + const Divider(height: Spacing.lg), + _buildMobileItem(context, ProfileSection.about, subtitle: 'Version, support, licenses'), + const Divider(height: Spacing.lg), + ListTile( + leading: Icon(Icons.logout, color: Theme.of(context).colorScheme.error), + title: Text('Log out', style: TextStyle(color: Theme.of(context).colorScheme.error)), onTap: () => _showLogoutConfirmation(context), ), - const SizedBox(height: Spacing.lg), + ], + ), + ), + ); + } + + Widget _buildMobileItem(BuildContext context, ProfileSection section, {required String subtitle}) { + return ListTile( + leading: Icon(section.icon), + title: Text(section.title), + subtitle: Text(subtitle), + trailing: const Icon(Icons.chevron_right), + onTap: () => context.push('/profile/${section.path}'), + ); + } + + Widget _buildMobileDetail(BuildContext context) { + return Scaffold( + appBar: AppPageBar(context: context, title: Text(_selectedSection.title), leading: const BackButton()), + body: SafeArea( + child: ListView( + key: PageStorageKey('settings-${_selectedSection.path}'), + padding: const EdgeInsets.fromLTRB(Spacing.md, Spacing.sm, Spacing.md, Spacing.lg), + children: [ + _buildSectionContent(context, isDesktop: false), ], ), ), @@ -112,13 +169,13 @@ class _ProfilePageState extends State { context, icon: Icons.person_outline, label: 'Account', - section: _ProfileSection.account, + section: ProfileSection.account, ), _buildNavItem( context, icon: Icons.palette_outlined, label: 'Appearance', - section: _ProfileSection.appearance, + section: ProfileSection.appearance, ), _buildNavItem( context, @@ -130,7 +187,7 @@ class _ProfilePageState extends State { context, icon: Icons.cloud_outlined, label: 'Storage', - section: _ProfileSection.storageSync, + section: ProfileSection.storageSync, ), _buildNavItem( context, @@ -142,9 +199,9 @@ class _ProfilePageState extends State { context, icon: Icons.accessibility_outlined, label: 'Accessibility', - section: _ProfileSection.accessibility, + section: ProfileSection.accessibility, ), - _buildNavItem(context, icon: Icons.info_outline, label: 'About', section: _ProfileSection.about), + _buildNavItem(context, icon: Icons.info_outline, label: 'About', section: ProfileSection.about), const SizedBox(height: Spacing.sm), Divider(height: 1, color: colorScheme.outlineVariant), const SizedBox(height: Spacing.sm), @@ -169,7 +226,7 @@ class _ProfilePageState extends State { BuildContext context, { required IconData icon, required String label, - _ProfileSection? section, + ProfileSection? section, bool enabled = true, bool isDestructive = false, VoidCallback? onTap, @@ -232,7 +289,7 @@ class _ProfilePageState extends State { final textTheme = Theme.of(context).textTheme; return SingleChildScrollView( - padding: const EdgeInsets.all(Spacing.xl), + padding: const EdgeInsets.fromLTRB(Spacing.lg, Spacing.md, Spacing.lg, Spacing.lg), child: Align( alignment: Alignment.topLeft, child: ConstrainedBox( @@ -250,34 +307,16 @@ class _ProfilePageState extends State { ); } - String get _sectionTitle { - switch (_selectedSection) { - case _ProfileSection.account: - return 'Account'; - case _ProfileSection.appearance: - return 'Appearance'; - case _ProfileSection.storageSync: - return 'Storage'; - case _ProfileSection.accessibility: - return 'Accessibility'; - case _ProfileSection.about: - return 'About'; - } - } + String get _sectionTitle => _selectedSection.title; - Widget _buildSectionContent(BuildContext context) { - switch (_selectedSection) { - case _ProfileSection.account: - return const AccountSettingsSection(isDesktop: true); - case _ProfileSection.appearance: - return const AppearanceSettingsSection(isDesktop: true); - case _ProfileSection.storageSync: - return const StorageSyncSettingsSection(isDesktop: true); - case _ProfileSection.accessibility: - return const AccessibilitySettingsSection(isDesktop: true); - case _ProfileSection.about: - return const AboutSettingsSection(isDesktop: true); - } + Widget _buildSectionContent(BuildContext context, {bool isDesktop = true}) { + return switch (_selectedSection) { + ProfileSection.account => AccountSettingsSection(isDesktop: isDesktop, showHeader: false), + ProfileSection.appearance => AppearanceSettingsSection(isDesktop: isDesktop, showHeader: false), + ProfileSection.storageSync => StorageSyncSettingsSection(isDesktop: isDesktop, showHeader: false), + ProfileSection.accessibility => AccessibilitySettingsSection(isDesktop: isDesktop, showHeader: false), + ProfileSection.about => AboutSettingsSection(isDesktop: isDesktop, showHeader: false), + }; } Future _handleLogout(BuildContext context) async { diff --git a/app/lib/pages/support_page.dart b/app/lib/pages/support_page.dart index e00e410d..960109fa 100644 --- a/app/lib/pages/support_page.dart +++ b/app/lib/pages/support_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/services/about_links.dart'; import 'package:papyrus/services/app_info.dart'; import 'package:papyrus/services/support_api_client.dart'; @@ -146,6 +148,7 @@ class _SupportPageState extends State { final issue = _issue; final textTheme = Theme.of(context).textTheme; final compact = MediaQuery.sizeOf(context).width < Breakpoints.desktopSmall; + final centered = context.select((preferences) => preferences.pageAlignment == 'center'); return Scaffold( body: SafeArea( @@ -153,13 +156,17 @@ class _SupportPageState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ LibraryPageHeader(title: 'Support', leading: const BackButton(), compact: compact), - if (compact) const Divider(height: 1), Expanded( child: SingleChildScrollView( controller: _scrollController, - padding: const EdgeInsets.all(Spacing.lg), + padding: EdgeInsets.fromLTRB( + Spacing.lg, + compact ? Spacing.sm : Spacing.lg, + Spacing.lg, + Spacing.lg, + ), child: Align( - alignment: Alignment.topCenter, + alignment: centered ? Alignment.topCenter : AlignmentDirectional.topStart, child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 640), child: issue != null diff --git a/app/lib/powersync/storage_sync_controller.dart b/app/lib/powersync/storage_sync_controller.dart index d2a8a49b..691a05fd 100644 --- a/app/lib/powersync/storage_sync_controller.dart +++ b/app/lib/powersync/storage_sync_controller.dart @@ -84,6 +84,18 @@ class StorageSyncController { return syncSettings.fileStorageLabel(usedBytes: fileStorageUsedBytes); } + double? get fileStorageFraction { + final usage = isAuthenticated ? mediaStorageUsage : null; + final usedBytes = usage?.usedBytes ?? fileStorageUsedBytes; + final quotaBytes = usage?.quotaBytes ?? syncSettings.fileStorageQuotaBytes; + + if (quotaBytes == null || quotaBytes <= 0) { + return null; + } + + return (usedBytes / quotaBytes).clamp(0.0, 1.0); + } + String get statusLabel { if (isGuest) { return 'Guest local'; diff --git a/app/lib/providers/preferences_provider.dart b/app/lib/providers/preferences_provider.dart index b8ca7b95..a134bb23 100644 --- a/app/lib/providers/preferences_provider.dart +++ b/app/lib/providers/preferences_provider.dart @@ -87,7 +87,7 @@ class PreferencesProvider extends ChangeNotifier { notifyListeners(); } - /// Page content alignment. Currently applied only by Statistics. + /// Alignment of pages with constrained content widths. String get pageAlignment => _prefs.get(_keyPageAlignment) == 'center' ? 'center' : 'left'; set pageAlignment(String value) { diff --git a/app/lib/services/license_packages.dart b/app/lib/services/license_packages.dart new file mode 100644 index 00000000..06736d40 --- /dev/null +++ b/app/lib/services/license_packages.dart @@ -0,0 +1,15 @@ +import 'package:flutter/foundation.dart'; + +typedef LicensePackages = Map>; + +Future loadLicensePackages() async { + final packages = >{}; + + await for (final entry in LicenseRegistry.licenses) { + for (final package in entry.packages) { + (packages[package] ??= []).add(entry); + } + } + + return packages; +} diff --git a/app/lib/themes/app_theme.dart b/app/lib/themes/app_theme.dart index 560a84c4..d11b39d8 100644 --- a/app/lib/themes/app_theme.dart +++ b/app/lib/themes/app_theme.dart @@ -341,9 +341,8 @@ class AppTheme { static final _switchTheme = SwitchThemeData( overlayColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.hovered) && - !states.contains(WidgetState.focused) && - !states.contains(WidgetState.pressed)) { + if (states.contains(WidgetState.pressed) || + (states.contains(WidgetState.hovered) && !states.contains(WidgetState.focused))) { return Colors.transparent; } diff --git a/app/lib/updates/update_controller.dart b/app/lib/updates/update_controller.dart index 68681117..92f6e8cc 100644 --- a/app/lib/updates/update_controller.dart +++ b/app/lib/updates/update_controller.dart @@ -9,6 +9,18 @@ import 'package:papyrus/updates/update_platform.dart' as platform; import 'package:papyrus/updates/update_release.dart'; import 'package:shared_preferences/shared_preferences.dart'; +enum UpdateStatus { + unchecked, + checking, + upToDate, + available, + installing, + staged, + handedOff, + checkFailed, + installFailed, +} + class UpdateController extends ChangeNotifier { static const checkFailureMessage = 'Could not check for updates. Try again.'; @@ -20,6 +32,7 @@ class UpdateController extends ChangeNotifier { final Future Function(UpdateAsset?, void Function(double?)) installer; UpdateChannel? channel; UpdateRelease? release; + UpdateStatus status = UpdateStatus.unchecked; bool busy = false; bool checking = false; bool available = false; @@ -39,6 +52,11 @@ class UpdateController extends ChangeNotifier { this.installer = platform.installUpdate, }); + DateTime? get lastChecked { + final timestamp = preferences.getInt('updates.lastCheck'); + return timestamp == null ? null : DateTime.fromMillisecondsSinceEpoch(timestamp); + } + bool get automatic => preferences.getBool('updates.automatic') ?? true; bool get external => channel == UpdateChannel.apt || channel == UpdateChannel.manual; @@ -78,6 +96,7 @@ class UpdateController extends ChangeNotifier { busy = true; checking = true; + status = UpdateStatus.checking; _notify(); try { @@ -103,12 +122,14 @@ class UpdateController extends ChangeNotifier { } } + status = available ? UpdateStatus.available : UpdateStatus.upToDate; message = available ? 'A newer version of Papyrus is available.' : 'Papyrus is up to date.'; await preferences.setInt('updates.lastCheck', DateTime.now().millisecondsSinceEpoch); } catch (_) { available = false; release = null; message = checkFailureMessage; + status = UpdateStatus.checkFailed; } finally { checking = false; busy = false; @@ -130,6 +151,7 @@ class UpdateController extends ChangeNotifier { busy = true; progress = null; + status = UpdateStatus.installing; message = 'Preparing the update…'; _notify(); @@ -152,8 +174,10 @@ class UpdateController extends ChangeNotifier { }); staged = channel == UpdateChannel.windows || channel == UpdateChannel.appImage; + status = staged ? UpdateStatus.staged : UpdateStatus.handedOff; } catch (_) { message = 'Could not finish the update. Please try again.'; + status = UpdateStatus.installFailed; } finally { busy = false; progress = null; diff --git a/app/lib/updates/update_settings.dart b/app/lib/updates/update_settings.dart index 8f1faadd..e9257c91 100644 --- a/app/lib/updates/update_settings.dart +++ b/app/lib/updates/update_settings.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:papyrus/services/about_links.dart'; -import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/pages/app_updates_page.dart'; import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/updates/update_controller.dart'; import 'package:papyrus/updates/update_release.dart'; -import 'package:papyrus/widgets/settings/settings_row.dart'; Future showUpdateSettings(BuildContext context, UpdateController controller) async { if (controller.viewingSettings) { @@ -15,90 +13,13 @@ Future showUpdateSettings(BuildContext context, UpdateController controlle controller.setViewingSettings(true); try { - await showDialog( - context: context, - animationStyle: AppMotion.animationStyle(context), - builder: (context) => ListenableBuilder( - listenable: controller, - builder: (context, child) => AlertDialog( - title: const Text('App updates'), - contentPadding: const EdgeInsets.fromLTRB(Spacing.lg, Spacing.md, Spacing.lg, Spacing.sm), - content: SizedBox( - width: 420, - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(controller.message), - const SizedBox(height: Spacing.sm), - Theme( - data: Theme.of(context).copyWith( - splashFactory: NoSplash.splashFactory, - highlightColor: Colors.transparent, - ), - child: SettingsToggleRow( - label: 'Check automatically', - value: controller.automatic, - onChanged: controller.setAutomatic, - padding: const EdgeInsets.symmetric(vertical: Spacing.xs), - ), - ), - if (controller.channel == UpdateChannel.apt) ...[ - const SizedBox(height: Spacing.md), - const Text( - 'Install updates through your system’s software updater. Enable the Papyrus repository once to receive future releases.', - ), - TextButton( - onPressed: () => AboutLinks.open( - context, - Uri.https('github.com', '/PapyrusReader/client/blob/master/docs/INSTALL.md'), - ), - child: const Text('Repository setup'), - ), - ], - if (controller.channel == UpdateChannel.manual) ...[ - const SizedBox(height: Spacing.md), - const Text( - 'This portable or development build uses manual installation. Install a supported package to receive integrated updates.', - ), - TextButton( - onPressed: () => AboutLinks.open(context, AboutLinks.releases), - child: const Text('Downloads'), - ), - ], - if (controller.available && !controller.external && !controller.staged) ...[ - const SizedBox(height: Spacing.md), - Text(switch (controller.channel) { - UpdateChannel.windows => 'The update will install after you close Papyrus normally.', - UpdateChannel.appImage => 'The update takes effect when you close and reopen Papyrus.', - UpdateChannel.web => 'Reload when you have finished reading to use the latest version.', - _ => 'Your device will guide you through installation.', - }), - ], - ], - ), - ), - ), - actions: [ - TextButton(onPressed: () => Navigator.pop(context), child: const Text('Close')), - if (controller.available && !controller.external && !controller.staged) - FilledButton( - onPressed: controller.busy ? null : controller.install, - child: Text(controller.channel == UpdateChannel.web ? 'Reload' : 'Update'), - ) - else - FilledButton( - onPressed: controller.busy || controller.staged ? null : controller.check, - key: const ValueKey('check-updates'), - child: IndexedStack( - index: controller.checking ? 1 : 0, - alignment: Alignment.center, - children: const [Text('Check now'), Text('Checking…')], - ), - ), - ], - ), + final page = AppUpdatesPage(controller: controller); + + await Navigator.of(context).push( + PageRouteBuilder( + transitionDuration: Duration.zero, + reverseTransitionDuration: Duration.zero, + pageBuilder: (_, _, _) => page, ), ); } finally { diff --git a/app/lib/widgets/profile/about_settings_section.dart b/app/lib/widgets/profile/about_settings_section.dart index d419234f..efb3acd7 100644 --- a/app/lib/widgets/profile/about_settings_section.dart +++ b/app/lib/widgets/profile/about_settings_section.dart @@ -6,14 +6,16 @@ import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:papyrus/services/about_links.dart'; import 'package:papyrus/services/app_info.dart'; +import 'package:papyrus/services/license_packages.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:papyrus/widgets/settings/settings_section.dart'; class AboutSettingsSection extends StatefulWidget { final bool isDesktop; + final bool showHeader; - const AboutSettingsSection({super.key, this.isDesktop = false}); + const AboutSettingsSection({super.key, this.isDesktop = false, this.showHeader = true}); @override State createState() => _AboutSettingsSectionState(); @@ -21,6 +23,33 @@ class AboutSettingsSection extends StatefulWidget { class _AboutSettingsSectionState extends State { late final Future _packageInfo = loadAppInfo(); + late final Future _licenses; + bool _openingLicenses = false; + + @override + void initState() { + super.initState(); + _licenses = loadLicensePackages().then((packages) => packages, onError: (Object _) => null); + } + + Future _openLicenses() async { + if (_openingLicenses) { + return; + } + + _openingLicenses = true; + final route = ModalRoute.of(context); + + try { + final packages = await _licenses; + + if (mounted && (route?.isCurrent ?? true)) { + await context.push('/profile/licenses', extra: packages); + } + } finally { + _openingLicenses = false; + } + } @override Widget build(BuildContext context) { @@ -49,7 +78,7 @@ class _AboutSettingsSectionState extends State { value: updates.available ? 'Update available' : 'Check for updates', onTap: () => showUpdateSettings(context, updates), ), - SettingsRow(label: 'Licenses', onTap: () => context.push('/profile/licenses')), + SettingsRow(label: 'Licenses', onTap: _openLicenses), SettingsRow(label: 'Support', onTap: () => context.push('/profile/support')), SettingsRow( label: "What's new", @@ -70,7 +99,7 @@ class _AboutSettingsSectionState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader(title: 'About'), + if (widget.showHeader) const SettingsSectionHeader(title: 'About'), ...rows, ], ); diff --git a/app/lib/widgets/profile/accessibility_settings_section.dart b/app/lib/widgets/profile/accessibility_settings_section.dart index 7a6d47ab..6cac9f06 100644 --- a/app/lib/widgets/profile/accessibility_settings_section.dart +++ b/app/lib/widgets/profile/accessibility_settings_section.dart @@ -8,8 +8,9 @@ import 'package:provider/provider.dart'; class AccessibilitySettingsSection extends StatelessWidget { final bool isDesktop; + final bool showHeader; - const AccessibilitySettingsSection({super.key, this.isDesktop = false}); + const AccessibilitySettingsSection({super.key, this.isDesktop = false, this.showHeader = true}); static String enlargementLabel(double value) => value == 1 ? 'System default' : '+${((value - 1) * 100).round()}%'; @@ -93,7 +94,7 @@ class AccessibilitySettingsSection extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader(title: 'Accessibility'), + if (showHeader) const SettingsSectionHeader(title: 'Accessibility'), ...children, ], ); diff --git a/app/lib/widgets/profile/account_settings_section.dart b/app/lib/widgets/profile/account_settings_section.dart index 0b4b557a..5c6cbf87 100644 --- a/app/lib/widgets/profile/account_settings_section.dart +++ b/app/lib/widgets/profile/account_settings_section.dart @@ -10,8 +10,9 @@ import 'package:provider/provider.dart'; /// Account settings section for ProfilePage. class AccountSettingsSection extends StatelessWidget { final bool isDesktop; + final bool showHeader; - const AccountSettingsSection({super.key, this.isDesktop = false}); + const AccountSettingsSection({super.key, this.isDesktop = false, this.showHeader = true}); @override Widget build(BuildContext context) { @@ -26,10 +27,11 @@ class AccountSettingsSection extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader( - title: 'Account', - padding: EdgeInsets.only(bottom: Spacing.md), - ), + if (showHeader) + const SettingsSectionHeader( + title: 'Account', + padding: EdgeInsets.only(bottom: Spacing.md), + ), _buildProfileForm(context), const SizedBox(height: Spacing.lg), const SettingsRow(label: 'Change password', enabled: false, showChevron: false), diff --git a/app/lib/widgets/profile/appearance_settings_section.dart b/app/lib/widgets/profile/appearance_settings_section.dart index 52a3db35..26f9dcff 100644 --- a/app/lib/widgets/profile/appearance_settings_section.dart +++ b/app/lib/widgets/profile/appearance_settings_section.dart @@ -9,8 +9,9 @@ import 'package:provider/provider.dart'; /// Appearance and theme settings section for ProfilePage. class AppearanceSettingsSection extends StatelessWidget { final bool isDesktop; + final bool showHeader; - const AppearanceSettingsSection({super.key, this.isDesktop = false}); + const AppearanceSettingsSection({super.key, this.isDesktop = false, this.showHeader = true}); static String getThemeLabel(String theme) { switch (theme) { @@ -41,7 +42,7 @@ class AppearanceSettingsSection extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader(title: 'Appearance'), + if (showHeader) const SettingsSectionHeader(title: 'Appearance'), SettingsRow(label: 'Theme', value: getThemeLabel(prefs.themeModePref), onTap: () => _showThemePicker(context)), _buildPageAlignment(context), ], diff --git a/app/lib/widgets/profile/storage_sync_settings_section.dart b/app/lib/widgets/profile/storage_sync_settings_section.dart index 45d3c4a1..201e0dc0 100644 --- a/app/lib/widgets/profile/storage_sync_settings_section.dart +++ b/app/lib/widgets/profile/storage_sync_settings_section.dart @@ -3,16 +3,13 @@ import 'package:papyrus/widgets/shared/app_bottom_sheet.dart'; import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/media/media_upload_queue.dart'; import 'package:papyrus/media/media_storage_scope.dart'; import 'package:papyrus/powersync/powersync_service.dart'; import 'package:papyrus/powersync/storage_sync_controller.dart'; import 'package:papyrus/powersync/sync_state.dart'; -import 'package:papyrus/providers/acquisition_availability_provider.dart'; import 'package:papyrus/providers/auth_provider.dart'; -import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/providers/sync_settings_provider.dart'; import 'package:papyrus/services/book_import_service_stub.dart' if (dart.library.js_interop) 'package:papyrus/services/book_import_service.dart'; @@ -22,13 +19,14 @@ import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:papyrus/widgets/settings/settings_section.dart'; import 'package:provider/provider.dart'; -/// Storage, synchronization, and acquisition settings section. +/// Storage and synchronization settings section. /// /// Supports both mobile ListView presentation and desktop card layout. class StorageSyncSettingsSection extends StatelessWidget { final bool isDesktop; + final bool showHeader; - const StorageSyncSettingsSection({super.key, this.isDesktop = false}); + const StorageSyncSettingsSection({super.key, this.isDesktop = false, this.showHeader = true}); @override Widget build(BuildContext context) { @@ -46,17 +44,8 @@ class StorageSyncSettingsSection extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader(title: 'Storage'), + if (showHeader) const SettingsSectionHeader(title: 'Storage'), const SettingsRow(label: 'Library', value: 'Stored on this device'), - Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: Spacing.xs), - child: Text( - 'Nothing is sent to Papyrus servers while offline mode is on.', - style: Theme.of( - context, - ).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), - ), - ), SettingsRow( label: 'Backup', value: 'Export or import a backup', @@ -70,14 +59,14 @@ class StorageSyncSettingsSection extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader(title: 'Storage'), + if (showHeader) const SettingsSectionHeader(title: 'Storage'), SettingsRow( label: 'Data sync', value: controller.dataSyncLabel, onTap: () => _showManageSyncServersSheet(context), ), SettingsRow(label: 'Current status', value: controller.statusLabel), - SettingsRow(label: 'File storage', value: controller.fileStorageLabel), + _buildStorageUsage(context, controller), if (controller.hasFailedMediaUploads) SettingsRow( label: 'Media uploads', @@ -111,7 +100,6 @@ class StorageSyncSettingsSection extends StatelessWidget { children: [ _buildInfoRow(context, label: 'Active server', value: controller.dataSyncLabel), _buildInfoRow(context, label: 'Status', value: controller.statusLabel), - _buildInfoRow(context, label: 'File storage', value: controller.fileStorageLabel), if (controller.hasFailedMediaUploads) _buildInfoRow(context, label: 'Media uploads', value: controller.failedMediaUploadLabel), const SizedBox(height: Spacing.sm), @@ -122,49 +110,83 @@ class StorageSyncSettingsSection extends StatelessWidget { style: textTheme.bodySmall?.copyWith(color: colorScheme.onSurfaceVariant), ), ), - const SizedBox(height: Spacing.sm), - Wrap( - spacing: Spacing.sm, - runSpacing: Spacing.sm, - alignment: WrapAlignment.start, - children: [ - if (controller.canReconnect) - OutlinedButton.icon( - onPressed: () => _handleReconnectSync(context), - icon: const Icon(Icons.sync, size: IconSizes.small), - label: const Text('Reconnect'), - ), - OutlinedButton.icon( - onPressed: () => _showManageSyncServersSheet(context), - icon: const Icon(Icons.dns_outlined, size: IconSizes.small), - label: const Text('Manage servers'), - ), - if (controller.hasFailedMediaUploads) - OutlinedButton.icon( - onPressed: () => _retryFailedMediaUploads(context), - icon: const Icon(Icons.refresh, size: IconSizes.small), - label: const Text('Retry uploads'), - ), - if (controller.canClearAuthenticatedCache) + const SizedBox(height: Spacing.md), + _buildStorageUsage(context, controller), + const SizedBox(height: Spacing.md), + OutlinedButtonTheme( + data: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + minimumSize: const Size(0, ComponentSizes.buttonHeightMobile), + padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm), + ).merge(Theme.of(context).outlinedButtonTheme.style), + ), + child: Wrap( + spacing: Spacing.sm, + runSpacing: Spacing.sm, + alignment: WrapAlignment.start, + children: [ + if (controller.canReconnect) + OutlinedButton.icon( + onPressed: () => _handleReconnectSync(context), + icon: const Icon(Icons.sync, size: IconSizes.small), + label: const Text('Reconnect'), + ), OutlinedButton.icon( - onPressed: () => _confirmClearAuthenticatedCache(context), - icon: const Icon(Icons.cleaning_services_outlined, size: IconSizes.small), - label: const Text('Clear local copy'), + onPressed: () => _showManageSyncServersSheet(context), + icon: const Icon(Icons.dns_outlined, size: IconSizes.small), + label: const Text('Manage servers'), ), - ], + if (controller.hasFailedMediaUploads) + OutlinedButton.icon( + onPressed: () => _retryFailedMediaUploads(context), + icon: const Icon(Icons.refresh, size: IconSizes.small), + label: const Text('Retry uploads'), + ), + if (controller.canClearAuthenticatedCache) + OutlinedButton.icon( + onPressed: () => _confirmClearAuthenticatedCache(context), + icon: const Icon(Icons.cleaning_services_outlined, size: IconSizes.small), + label: const Text('Clear local copy'), + ), + ], + ), ), ], ), - const SizedBox(height: Spacing.lg), - SettingsCard( - key: const Key('profile-acquisition-card'), - title: 'Acquisition', - children: [_buildAcquisitionDescription(context), ..._buildAcquisitionSettings(context)], - ), ], ); } + Widget _buildStorageUsage(BuildContext context, StorageSyncController controller) { + final theme = Theme.of(context); + final fraction = controller.fileStorageFraction; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: Spacing.sm), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('File storage', style: theme.textTheme.bodyMedium), + if (fraction != null) ...[ + const SizedBox(height: Spacing.sm), + LinearProgressIndicator( + value: fraction, + minHeight: Spacing.sm, + color: theme.colorScheme.primary, + backgroundColor: theme.colorScheme.surfaceContainerHighest, + semanticsLabel: 'File storage', + ), + ], + const SizedBox(height: Spacing.sm), + Text( + controller.fileStorageLabel, + style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant), + ), + ], + ), + ); + } + Widget _buildOfflineStorageSyncContent(BuildContext context) { final textTheme = Theme.of(context).textTheme; final mutedStyle = textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant); @@ -180,7 +202,7 @@ class StorageSyncSettingsSection extends StatelessWidget { Text('Your library is stored on this device.', style: textTheme.bodyLarge), const SizedBox(height: Spacing.sm), Text( - 'Nothing is sent to Papyrus servers while offline mode is on. Export a backup before changing devices or clearing app data.', + 'Export a backup before changing devices or clearing app data.', style: mutedStyle, ), ], @@ -212,77 +234,6 @@ class StorageSyncSettingsSection extends StatelessWidget { ); } - static Widget buildMobileAcquisitionSection(BuildContext context) { - final auth = context.watch(); - - if (auth.isOfflineMode) { - return const SizedBox.shrink(); - } - - return Column( - key: const Key('profile-acquisition-section'), - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SettingsSectionHeader(title: 'Acquisition'), - _buildAcquisitionDescription(context), - ..._buildAcquisitionSettings(context), - ], - ); - } - - static Widget _buildAcquisitionDescription(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: Spacing.xs), - child: Text( - 'Search external sources and send releases to your connected clients.', - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), - ), - ); - } - - static List _buildAcquisitionSettings(BuildContext context) { - final prefs = context.watch(); - final availability = context.watch(); - final acquisitionAvailable = availability.state == AcquisitionAvailabilityState.available; - - return [ - MergeSemantics( - child: Semantics( - label: 'Enable acquisition', - enabled: true, - toggled: prefs.acquisitionEnabled, - onTap: () => prefs.acquisitionEnabled = !prefs.acquisitionEnabled, - child: ExcludeSemantics( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () => prefs.acquisitionEnabled = !prefs.acquisitionEnabled, - child: SettingsToggleRow( - label: 'Enable acquisition', - value: prefs.acquisitionEnabled, - onChanged: (value) => prefs.acquisitionEnabled = value, - ), - ), - ), - ), - ), - SettingsRow( - label: 'Server support', - value: _acquisitionAvailabilityLabel(availability.state), - showChevron: false, - ), - if (prefs.acquisitionEnabled && acquisitionAvailable) - SettingsRow(label: 'Manage integrations', onTap: () => context.push('/acquisition')), - ]; - } - - static String _acquisitionAvailabilityLabel(AcquisitionAvailabilityState state) { - return switch (state) { - AcquisitionAvailabilityState.available => 'Available on this server', - AcquisitionAvailabilityState.unavailable => 'Unavailable on this server', - AcquisitionAvailabilityState.unknown || AcquisitionAvailabilityState.loading => 'Checking server support…', - }; - } - StorageSyncController _storageSyncController(BuildContext context) { return StorageSyncController( authProvider: context.watch(), diff --git a/app/lib/widgets/settings/settings_row.dart b/app/lib/widgets/settings/settings_row.dart index f3578838..56056604 100644 --- a/app/lib/widgets/settings/settings_row.dart +++ b/app/lib/widgets/settings/settings_row.dart @@ -164,6 +164,8 @@ class SettingsToggleRow extends StatelessWidget { enabled: enabled, builder: (focusNode) => InkWell( hoverColor: Colors.transparent, + splashFactory: NoSplash.splashFactory, + highlightColor: Colors.transparent, focusNode: focusNode, canRequestFocus: enabled, onTap: toggle, diff --git a/app/test/pages/licenses_page_test.dart b/app/test/pages/licenses_page_test.dart index 0b76ca05..17322c39 100644 --- a/app/test/pages/licenses_page_test.dart +++ b/app/test/pages/licenses_page_test.dart @@ -1,5 +1,9 @@ +import 'dart:async'; +import 'dart:ui' as ui; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/pages/licenses_page.dart'; import 'package:papyrus/themes/app_theme.dart'; @@ -17,6 +21,76 @@ void main() { }); tearDown(LicenseRegistry.reset); + testWidgets('prepared licenses render on the first frame', (tester) async { + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: const LicensesPage( + initialLicenses: { + 'alpha': [ + LicenseEntryWithLineBreaks(['alpha'], 'Alpha license text'), + ], + }, + ), + ), + ); + + expect(find.widgetWithText(ListTile, 'alpha'), findsOneWidget); + expect(find.text('Loading licenses…'), findsNothing); + }); + + testWidgets('fast loads never flash loading feedback', (tester) async { + await tester.pumpWidget(MaterialApp(theme: AppTheme.dark, home: const LicensesPage())); + expect(find.text('Loading licenses…'), findsNothing); + await tester.pump(); + expect(find.widgetWithText(ListTile, 'alpha'), findsOneWidget); + await tester.pump(const Duration(milliseconds: 800)); + expect(find.text('Loading licenses…'), findsNothing); + }); + + for (final fails in [false, true]) { + testWidgets('slow load feedback stays readable before completion, fails=$fails', (tester) async { + final result = Completer(); + LicenseRegistry.reset(); + LicenseRegistry.addLicense(() => Stream.fromFuture(result.future)); + await tester.pumpWidget(MaterialApp(theme: AppTheme.dark, home: const LicensesPage())); + await tester.pump(const Duration(milliseconds: 299)); + expect(find.text('Loading licenses…'), findsNothing); + await tester.pump(const Duration(milliseconds: 1)); + expect(find.text('Loading licenses…'), findsOneWidget); + + if (fails) { + result.completeError(StateError('License load failed')); + } else { + result.complete(const LicenseEntryWithLineBreaks(['alpha'], 'Alpha license text')); + } + + await tester.pump(); + await tester.pump(const Duration(milliseconds: 499)); + expect(find.text('Loading licenses…'), findsOneWidget); + await tester.pump(const Duration(milliseconds: 1)); + await tester.pump(); + expect(find.text('Loading licenses…'), findsNothing); + expect( + fails ? find.text('Could not load licenses. Retry') : find.widgetWithText(ListTile, 'alpha'), + findsOneWidget, + ); + + if (fails) { + LicenseRegistry.reset(); + LicenseRegistry.addLicense( + () => Stream.value(const LicenseEntryWithLineBreaks(['alpha'], 'Alpha license text')), + ); + + await tester.tap(find.text('Could not load licenses. Retry')); + await tester.pump(); + expect(find.text('Loading licenses…'), findsNothing); + await tester.pumpAndSettle(); + expect(find.widgetWithText(ListTile, 'alpha'), findsOneWidget); + } + }); + } + testWidgets('wide licenses show all notices and switch without animation', (tester) async { tester.view.physicalSize = const Size(1200, 800); tester.view.devicePixelRatio = 1; @@ -34,6 +108,51 @@ void main() { expect(tester.takeException(), isNull); }); + testWidgets('scrolling the selected license never paints over the header', (tester) async { + tester.view.physicalSize = const Size(1200, 800); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + final captureKey = GlobalKey(); + + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: RepaintBoundary( + key: captureKey, + child: LicensesPage( + initialLicenses: { + for (var index = 0; index < 40; index++) + 'package-${index.toString().padLeft(2, '0')}': [ + const LicenseEntryWithLineBreaks(['package'], 'License text'), + ], + }, + ), + ), + ), + ); + + await tester.pumpAndSettle(); + final headerBottom = tester.getBottomLeft(find.byType(LibraryPageHeader)).dy.floor(); + + Future> headerPixels() async { + final boundary = captureKey.currentContext!.findRenderObject()! as RenderRepaintBoundary; + final image = await boundary.toImage(); + final bytes = await image.toByteData(format: ui.ImageByteFormat.rawRgba); + final pixels = bytes!.buffer.asUint8List(0, image.width * headerBottom * 4).toList(); + image.dispose(); + return pixels; + } + + final before = await tester.runAsync(headerPixels); + final list = find.byKey(const PageStorageKey('license-packages')); + await tester.drag(list, const Offset(0, -50)); + await tester.pumpAndSettle(); + final after = await tester.runAsync(headerPixels); + expect(listEquals(before, after), isTrue, reason: 'Selection ink must stay below the header while scrolling.'); + expect(tester.takeException(), isNull); + }); + testWidgets('compact license navigation and back are immediate', (tester) async { tester.view.physicalSize = const Size(390, 844); tester.view.devicePixelRatio = 1; diff --git a/app/test/pages/profile_page_test.dart b/app/test/pages/profile_page_test.dart index cb0390f1..ba691fcc 100644 --- a/app/test/pages/profile_page_test.dart +++ b/app/test/pages/profile_page_test.dart @@ -4,6 +4,8 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router/go_router.dart'; +import 'package:papyrus/themes/app_theme.dart'; import 'package:papyrus/auth/auth_api_client.dart'; import 'package:papyrus/auth/auth_models.dart'; import 'package:papyrus/auth/auth_repository.dart'; @@ -18,8 +20,6 @@ import 'package:papyrus/providers/acquisition_availability_provider.dart'; import 'package:papyrus/providers/auth_provider.dart'; import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/providers/sync_settings_provider.dart'; -import 'package:papyrus/widgets/profile/profile_menu_item.dart'; -import 'package:papyrus/widgets/settings/settings_section.dart'; import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:powersync/powersync.dart' hide Column; import 'package:provider/provider.dart'; @@ -117,6 +117,25 @@ void main() { }); Widget buildApp({required Size screenSize, TextScaler textScaler = TextScaler.noScaling}) { + final router = GoRouter( + initialLocation: '/profile', + routes: [ + GoRoute( + path: '/profile', + builder: (_, _) => const ProfilePage(), + routes: [ + for (final section in ProfileSection.values) + GoRoute( + path: section.path, + builder: (_, _) => ProfilePage(section: section), + ), + ], + ), + ], + ); + + addTearDown(router.dispose); + return MultiProvider( providers: [ ChangeNotifierProvider.value(value: authProvider), @@ -128,95 +147,115 @@ void main() { ChangeNotifierProvider.value(value: prefsProvider), ChangeNotifierProvider.value(value: availabilityProvider), ], - child: MaterialApp( - home: MediaQuery( - data: MediaQueryData(size: screenSize, textScaler: textScaler), - child: const ProfilePage(), + child: MaterialApp.router( + theme: AppTheme.light, + routerConfig: router, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(size: screenSize, textScaler: textScaler), + child: child!, ), ), ); } - testWidgets('mobile layout renders all sections and displays logout dialog', (tester) async { + testWidgets('mobile index opens focused pages and Back restores the index', (tester) async { await tester.binding.setSurfaceSize(const Size(400, 900)); addTearDown(() => tester.binding.setSurfaceSize(null)); await tester.pumpWidget(buildApp(screenSize: const Size(400, 900))); await tester.pumpAndSettle(); expect(find.text('Settings'), findsOneWidget); - expect(find.text('Reader Profile'), findsOneWidget); - expect(find.text('reader@example.com'), findsOneWidget); - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'Account'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Change password'), findsOneWidget); - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'Appearance'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Theme'), findsOneWidget); - expect(find.text('Default font'), findsNothing); - expect(find.text('Default view'), findsNothing); - expect(find.text('Developer options'), findsNothing); - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'Notifications'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Goal reminders'), findsOneWidget); - final reminders = find.widgetWithText(SettingsToggleRow, 'Goal reminders'); - final remindersValue = prefsProvider.goalReminders; - expect(tester.widget(reminders).onChanged, isNull); - await tester.tap(reminders); - expect(prefsProvider.goalReminders, remindersValue); - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'Storage'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Clear local library'), findsOneWidget); - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'Privacy & data'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Analytics'), findsOneWidget); - final analytics = find.widgetWithText(SettingsToggleRow, 'Analytics'); - final analyticsValue = prefsProvider.analyticsOptIn; - expect(tester.widget(analytics).onChanged, isNull); - await tester.tap(analytics); - expect(prefsProvider.analyticsOptIn, analyticsValue); - - for (final label in ['Privacy policy', 'Export all data', 'Import data', 'Clear local data']) { - final row = tester.widget(find.widgetWithText(SettingsRow, label)); - expect(row.enabled, isFalse); - expect(row.onTap, isNull); + expect(find.byType(TextFormField), findsNothing); + expect(find.text('Theme'), findsNothing); + expect(find.text('Version'), findsNothing); + + for (final label in ['Notifications', 'Privacy']) { + final item = tester.widget(find.widgetWithText(ListTile, label)); + expect(item.enabled, isFalse); + expect(item.onTap, isNull); } - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'Accessibility'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Reduce animations'), findsOneWidget); - await tester.scrollUntilVisible( - find.widgetWithText(SettingsSectionHeader, 'About'), - 300, - scrollable: find.byType(Scrollable).first, - ); - expect(find.text('Version'), findsOneWidget); - await tester.scrollUntilVisible( - find.widgetWithText(ProfileMenuItem, 'Log out'), - 300, - scrollable: find.byType(Scrollable).first, - ); - await tester.tap(find.widgetWithText(ProfileMenuItem, 'Log out')); + + for (final (title, control) in [ + ('Account', 'Change password'), + ('Appearance', 'Theme'), + ('Storage', 'Clear local library'), + ('Accessibility', 'Reduce animations'), + ('About', 'Version'), + ]) { + await tester.ensureVisible(find.widgetWithText(ListTile, title)); + await tester.tap(find.widgetWithText(ListTile, title)); + await tester.pumpAndSettle(); + expect(find.text(title), findsOneWidget); + expect(find.text(control), findsOneWidget); + expect(find.widgetWithText(ListTile, 'About'), findsNothing); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(find.text('Settings'), findsOneWidget); + } + + await tester.ensureVisible(find.widgetWithText(ListTile, 'Log out')); + await tester.tap(find.widgetWithText(ListTile, 'Log out')); await tester.pumpAndSettle(); expect(find.text('Are you sure you want to log out?'), findsOneWidget); await tester.tap(find.text('Cancel')); await tester.pumpAndSettle(); - expect(find.text('Are you sure you want to log out?'), findsNothing); + expect(find.text('Settings'), findsOneWidget); + }); + + testWidgets('mobile appearance persists a choice across Back and reopening', (tester) async { + await tester.binding.setSurfaceSize(const Size(400, 900)); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget(buildApp(screenSize: const Size(400, 900))); + await tester.pumpAndSettle(); + await tester.tap(find.widgetWithText(ListTile, 'Appearance')); + await tester.pumpAndSettle(); + await tester.tap(find.widgetWithText(SettingsRow, 'Theme')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Dark')); + await tester.pumpAndSettle(); + expect(PreferencesProvider(prefs).themeModePref, 'dark'); + await tester.binding.handlePopRoute(); + await tester.pumpAndSettle(); + expect(find.text('Dark theme, page layout'), findsOneWidget); + await tester.tap(find.widgetWithText(ListTile, 'Appearance')); + await tester.pumpAndSettle(); + expect(find.text('Dark'), findsOneWidget); + }); + + testWidgets('narrow mobile with enlarged text retains index scroll position on Back', (tester) async { + const size = Size(320, 568); + await tester.binding.setSurfaceSize(size); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget(buildApp(screenSize: size, textScaler: TextScaler.linear(2))); + await tester.pumpAndSettle(); + await tester.scrollUntilVisible(find.widgetWithText(ListTile, 'About'), 200); + final before = tester.state(find.byType(Scrollable)).position.pixels; + await tester.tap(find.widgetWithText(ListTile, 'About')); + await tester.pumpAndSettle(); + expect(find.text('Version'), findsOneWidget); + expect(tester.takeException(), isNull); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(tester.state(find.byType(Scrollable)).position.pixels, before); + expect(tester.takeException(), isNull); + }); + + testWidgets('every detail page opens directly and returns to Settings at 320px with enlarged text', (tester) async { + const size = Size(320, 568); + await tester.binding.setSurfaceSize(size); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget(buildApp(screenSize: size, textScaler: TextScaler.linear(2))); + await tester.pumpAndSettle(); + final router = GoRouter.of(tester.element(find.byType(ProfilePage))); + + for (final section in ProfileSection.values) { + router.go('/profile/${section.path}'); + await tester.pumpAndSettle(); + expect(find.text(section.title), findsOneWidget); + expect(tester.takeException(), isNull); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(router.routeInformationProvider.value.uri.path, '/profile'); + } }); testWidgets('desktop settings scrolls when the pointer is over empty space beside the form', (tester) async { diff --git a/app/test/pages/profile_storage_sync_test.dart b/app/test/pages/profile_storage_sync_test.dart index 8adb6484..4ce2959b 100644 --- a/app/test/pages/profile_storage_sync_test.dart +++ b/app/test/pages/profile_storage_sync_test.dart @@ -1,7 +1,5 @@ -import 'dart:async'; -import 'dart:ui' show SemanticsAction, Tristate; - import 'package:flutter/material.dart'; +import 'package:papyrus/themes/app_theme.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/acquisition/acquisition_models.dart'; import 'package:papyrus/auth/auth_api_client.dart'; @@ -224,9 +222,10 @@ void main() { ChangeNotifierProvider(create: (_) => PreferencesProvider(prefs)), ], child: MaterialApp( + theme: AppTheme.light, home: MediaQuery( data: MediaQueryData(size: screenSize), - child: pageBuilder?.call(const ProfilePage()) ?? const ProfilePage(), + child: pageBuilder?.call(const ProfilePage()) ?? const ProfilePage(section: ProfileSection.storageSync), ), ), ); @@ -279,12 +278,11 @@ void main() { final service = _FakePowerSyncService(currentMode: LibraryDatabaseMode.guest, currentSyncState: const SyncState()); await tester.pumpWidget(await buildPage(authProvider: auth, powerSyncService: service)); await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.text('Storage'), 400, scrollable: find.byType(Scrollable).first); await tester.pumpAndSettle(); expect(find.text('Stored on this device'), findsOneWidget); expect(find.text('Export or import a backup'), findsOneWidget); expect(find.text('Clear local library'), findsOneWidget); - expect(find.textContaining('Nothing is sent to Papyrus servers'), findsOneWidget); + expect(find.textContaining('Nothing is sent to Papyrus servers'), findsNothing); expect(find.text('Guest local'), findsNothing); expect(find.text('papyrus-guest.db'), findsNothing); expect(find.text('Metadata sync off'), findsNothing); @@ -306,14 +304,12 @@ void main() { expect(find.text('Enable acquisition'), findsNothing); }); - testWidgets('authenticated mobile profile separates supported acquisition settings from storage', (tester) async { + testWidgets('authenticated mobile storage omits acquisition settings', (tester) async { final auth = await buildAuthProvider(signedIn: true); - final service = _FakePowerSyncService( currentMode: LibraryDatabaseMode.authenticated, currentSyncState: const SyncState(connected: true), ); - final availability = AcquisitionAvailabilityProvider(loadCapabilities: (_) async => _capabilities(enabled: true)); await availability.refresh(Uri.parse('https://api.test')); @@ -322,92 +318,9 @@ void main() { ); await tester.pumpAndSettle(); - await tester.scrollUntilVisible( - find.byKey(const Key('profile-acquisition-section')), - 400, - scrollable: find.byType(Scrollable).first, - ); - await tester.pumpAndSettle(); - final acquisitionSection = find.byKey(const Key('profile-acquisition-section')); - expect(find.descendant(of: acquisitionSection, matching: find.text('Data sync')), findsNothing); - expect(find.descendant(of: acquisitionSection, matching: find.text('Acquisition')), findsOneWidget); - - expect( - find.descendant( - of: acquisitionSection, - matching: find.text('Search external sources and send releases to your connected clients.'), - ), - findsOneWidget, - ); - - expect(find.descendant(of: acquisitionSection, matching: find.text('Available on this server')), findsOneWidget); - expect(find.descendant(of: acquisitionSection, matching: find.text('Manage integrations')), findsNothing); - final semantics = tester.getSemantics(find.bySemanticsLabel('Enable acquisition')); - expect(semantics.label, 'Enable acquisition'); - expect(semantics.flagsCollection.isEnabled, Tristate.isTrue); - expect(semantics.flagsCollection.isToggled, Tristate.isFalse); - expect(semantics.getSemanticsData().hasAction(SemanticsAction.tap), isTrue); - await tester.tap(find.bySemanticsLabel('Enable acquisition')); - await tester.pumpAndSettle(); - expect(tester.getSemantics(find.bySemanticsLabel('Enable acquisition')).flagsCollection.isToggled, Tristate.isTrue); - expect(find.descendant(of: acquisitionSection, matching: find.text('Manage integrations')), findsOneWidget); - }); - - testWidgets('authenticated mobile profile reports pending acquisition availability', (tester) async { - final completer = Completer(); - final auth = await buildAuthProvider(signedIn: true); - - final service = _FakePowerSyncService( - currentMode: LibraryDatabaseMode.authenticated, - currentSyncState: const SyncState(connected: true), - ); - - final availability = AcquisitionAvailabilityProvider(loadCapabilities: (_) => completer.future); - final refresh = availability.refresh(Uri.parse('https://api.test')); - - await tester.pumpWidget( - await buildPage(authProvider: auth, powerSyncService: service, acquisitionAvailabilityProvider: availability), - ); - - await tester.pump(); - await tester.scrollUntilVisible( - find.byKey(const Key('profile-acquisition-section')), - 400, - scrollable: find.byType(Scrollable).first, - ); - await tester.pump(); - expect(find.text('Checking server support…'), findsOneWidget); - completer.complete(_capabilities(enabled: true)); - await refresh; - await tester.pumpAndSettle(); - expect(find.text('Available on this server'), findsOneWidget); - }); - - testWidgets('authenticated mobile profile hides acquisition management when server is unavailable', (tester) async { - final auth = await buildAuthProvider(signedIn: true); - - final service = _FakePowerSyncService( - currentMode: LibraryDatabaseMode.authenticated, - currentSyncState: const SyncState(connected: true), - ); - - final availability = AcquisitionAvailabilityProvider(loadCapabilities: (_) async => _capabilities(enabled: false)); - await availability.refresh(Uri.parse('https://api.test')); - - await tester.pumpWidget( - await buildPage(authProvider: auth, powerSyncService: service, acquisitionAvailabilityProvider: availability), - ); - - await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.text('Storage'), 400, scrollable: find.byType(Scrollable).first); - await tester.pumpAndSettle(); - final acquisitionSection = find.byKey(const Key('profile-acquisition-section')); - expect(acquisitionSection, findsOneWidget); - expect(find.text('Enable acquisition'), findsOneWidget); - expect(find.text('Unavailable on this server'), findsOneWidget); - expect(find.text('Manage integrations'), findsNothing); - await tester.tap(find.bySemanticsLabel('Enable acquisition')); - await tester.pumpAndSettle(); + expect(find.text('File storage'), findsOneWidget); + expect(find.text('Acquisition'), findsNothing); + expect(find.text('Enable acquisition'), findsNothing); expect(find.text('Manage integrations'), findsNothing); }); @@ -424,7 +337,7 @@ void main() { await tester.pump(); expect(find.text('Library storage'), findsOneWidget); expect(find.text('Your library is stored on this device.'), findsOneWidget); - expect(find.textContaining('Nothing is sent to Papyrus servers'), findsOneWidget); + expect(find.textContaining('Nothing is sent to Papyrus servers'), findsNothing); expect(find.text('Export backup'), findsOneWidget); expect(find.text('Import backup'), findsOneWidget); expect(find.text('Clear local library'), findsOneWidget); @@ -443,6 +356,8 @@ void main() { }); testWidgets('authenticated storage sync UI shows data sync and hides implementation details', (tester) async { + await tester.binding.setSurfaceSize(const Size(1200, 900)); + addTearDown(() => tester.binding.setSurfaceSize(null)); final auth = await buildAuthProvider(signedIn: true); final dataStore = dataStoreWithBooks([ @@ -474,15 +389,23 @@ void main() { expect(find.text('Data sync'), findsOneWidget); expect(find.text('Official server'), findsWidgets); expect(find.text('350 MB used, 674 MB available of 1 GB'), findsOneWidget); + expect(tester.widget(find.byType(LinearProgressIndicator)).value, 350 / 1024); + final reconnectButton = find.widgetWithText(OutlinedButton, 'Reconnect'); + final manageButton = find.widgetWithText(OutlinedButton, 'Manage servers'); + expect( + tester.getSize(reconnectButton).width, + lessThan(tester.getSize(find.byKey(const Key('profile-data-sync-card'))).width / 2), + ); + expect(tester.getTopLeft(reconnectButton).dy, tester.getTopLeft(manageButton).dy); expect(find.text('Connected'), findsWidgets); expect(find.text('Reconnect'), findsOneWidget); expect(find.text('Manage servers'), findsOneWidget); expect(find.byKey(const Key('profile-data-sync-card')), findsOneWidget); - expect(find.byKey(const Key('profile-acquisition-card')), findsOneWidget); - expect(find.text('Acquisition'), findsOneWidget); - expect(find.text('Enable acquisition'), findsOneWidget); - expect(find.text('Available on this server'), findsOneWidget); - expect(find.text('Search external sources and send releases to your connected clients.'), findsOneWidget); + expect(find.byKey(const Key('profile-acquisition-card')), findsNothing); + expect(find.text('Acquisition'), findsNothing); + expect(find.text('Enable acquisition'), findsNothing); + expect(find.text('Available on this server'), findsNothing); + expect(find.text('Search external sources and send releases to your connected clients.'), findsNothing); expect(find.text('Manage integrations'), findsNothing); expect(find.text('Clear local copy'), findsOneWidget); expect(find.text('Clear account local cache'), findsNothing); @@ -499,38 +422,6 @@ void main() { await tester.tap(find.text('Reconnect')); await tester.pump(); expect(service.reconnectCalls, 1); - await tester.tap(find.bySemanticsLabel('Enable acquisition')); - await tester.pumpAndSettle(); - expect(find.text('Manage integrations'), findsOneWidget); - }); - - testWidgets('authenticated desktop profile reports unsupported acquisition separately', (tester) async { - final auth = await buildAuthProvider(signedIn: true); - - final service = _FakePowerSyncService( - currentMode: LibraryDatabaseMode.authenticated, - currentSyncState: const SyncState(connected: true), - ); - - final availability = AcquisitionAvailabilityProvider(loadCapabilities: (_) async => _capabilities(enabled: false)); - await availability.refresh(Uri.parse('https://api.test')); - - await tester.pumpWidget( - await buildPage( - authProvider: auth, - powerSyncService: service, - screenSize: const Size(1200, 900), - acquisitionAvailabilityProvider: availability, - ), - ); - - await tester.pumpAndSettle(); - await tester.tap(find.text('Storage').first); - await tester.pumpAndSettle(); - expect(find.byKey(const Key('profile-data-sync-card')), findsOneWidget); - expect(find.byKey(const Key('profile-acquisition-card')), findsOneWidget); - expect(find.text('Unavailable on this server'), findsOneWidget); - expect(find.text('Manage integrations'), findsNothing); }); testWidgets('manage servers lists official and custom servers for switching', (tester) async { @@ -562,7 +453,6 @@ void main() { ); await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.text('Storage'), 400, scrollable: find.byType(Scrollable).first); await tester.pumpAndSettle(); await tester.tap(find.text('Manage servers')); await tester.pumpAndSettle(); diff --git a/app/test/pages/support_navigation_test.dart b/app/test/pages/support_navigation_test.dart index de9b1294..fd307b38 100644 --- a/app/test/pages/support_navigation_test.dart +++ b/app/test/pages/support_navigation_test.dart @@ -12,6 +12,7 @@ import 'package:papyrus/opds/opds_catalog_store.dart'; import 'package:papyrus/opds/opds_catalogs.dart'; import 'package:papyrus/pages/support_page.dart'; import 'package:papyrus/providers/sidebar_provider.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/services/support_api_client.dart'; import 'package:papyrus/themes/app_theme.dart'; import 'package:papyrus/widgets/shell/adaptive_app_shell.dart'; @@ -57,6 +58,7 @@ void main() { final completion = Completer(); final clients = <_TrackingClient>[]; var submissions = 0; + final preferences = await SharedPreferences.getInstance(); final catalogs = OpdsCatalogs( OpdsCatalogStore(await SharedPreferences.getInstance(), secrets: MemorySecrets()), @@ -110,6 +112,7 @@ void main() { providers: [ ChangeNotifierProvider(create: (_) => DataStore()), ChangeNotifierProvider(create: (_) => SidebarProvider()), + ChangeNotifierProvider(create: (_) => PreferencesProvider(preferences)), ChangeNotifierProvider.value(value: catalogs), ], child: MaterialApp.router(theme: AppTheme.eink, routerConfig: router), diff --git a/app/test/pages/support_page_test.dart b/app/test/pages/support_page_test.dart index 4d1d8146..f4105754 100644 --- a/app/test/pages/support_page_test.dart +++ b/app/test/pages/support_page_test.dart @@ -9,13 +9,21 @@ import 'package:http/testing.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:papyrus/auth/papyrus_api_config.dart'; import 'package:papyrus/pages/support_page.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:papyrus/services/support_api_client.dart'; import 'package:papyrus/themes/app_theme.dart'; import '../helpers/support_file_picker.dart'; void main() { - setUp(() { + late PreferencesProvider preferences; + + setUp(() async { + SharedPreferences.setMockInitialValues({}); + preferences = PreferencesProvider(await SharedPreferences.getInstance()); + addTearDown(preferences.dispose); PackageInfo.setMockInitialValues( appName: 'Papyrus', packageName: 'papyrus', @@ -25,6 +33,45 @@ void main() { ); }); + for (final width in [390.0, 1280.0]) { + testWidgets('page alignment updates without losing the draft at width $width', (tester) async { + tester.view.physicalSize = Size(width, 1100); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + final client = SupportApiClient( + config: PapyrusApiConfig(serverBaseUri: Uri.parse('https://api.example')), + httpClient: MockClient((request) async => http.Response('', 503)), + ); + + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: ChangeNotifierProvider.value( + value: preferences, + child: SupportPage(client: client), + ), + ), + ); + + await tester.pumpAndSettle(); + final leftBounds = tester.getRect(find.byType(Form)); + expect(leftBounds.left, 24); + expect(leftBounds.width, width > 688 ? 640 : width - 48); + await tester.enterText(find.byType(TextFormField).first, 'Reader issue'); + preferences.pageAlignment = 'center'; + await tester.pumpAndSettle(); + final centeredBounds = tester.getRect(find.byType(Form)); + expect(centeredBounds.center.dx, width / 2); + expect(centeredBounds.width, leftBounds.width); + expect(find.text('Reader issue'), findsOneWidget); + preferences.pageAlignment = 'left'; + await tester.pumpAndSettle(); + expect(tester.getRect(find.byType(Form)), leftBounds); + expect(find.text('Reader issue'), findsOneWidget); + expect(tester.takeException(), isNull); + }); + } + testWidgets('validation, failure recovery, and single successful submission', (tester) async { tester.view.physicalSize = const Size(1000, 1100); tester.view.devicePixelRatio = 1; @@ -48,7 +95,10 @@ void main() { await tester.pumpWidget( MaterialApp( theme: AppTheme.eink, - home: SupportPage(client: client), + home: ChangeNotifierProvider.value( + value: preferences, + child: SupportPage(client: client), + ), ), ); await tester.pumpAndSettle(); @@ -98,7 +148,10 @@ void main() { data: MediaQuery.of(context).copyWith(textScaler: const TextScaler.linear(1.5)), child: child!, ), - home: SupportPage(client: client), + home: ChangeNotifierProvider.value( + value: preferences, + child: SupportPage(client: client), + ), ), ); await tester.pumpAndSettle(); @@ -139,7 +192,10 @@ void main() { await tester.pumpWidget( MaterialApp( theme: AppTheme.dark, - home: SupportPage(client: client), + home: ChangeNotifierProvider.value( + value: preferences, + child: SupportPage(client: client), + ), ), ); await tester.pumpAndSettle(); diff --git a/app/test/powersync/storage_sync_controller_test.dart b/app/test/powersync/storage_sync_controller_test.dart index a0f71a14..98cd7150 100644 --- a/app/test/powersync/storage_sync_controller_test.dart +++ b/app/test/powersync/storage_sync_controller_test.dart @@ -1,4 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/media/media_models.dart'; import 'package:papyrus/auth/auth_api_client.dart'; import 'package:papyrus/auth/auth_models.dart'; import 'package:papyrus/auth/auth_repository.dart'; @@ -91,4 +92,35 @@ void main() { expect(controller.hasFailedMediaUploads, isTrue); expect(controller.failedMediaUploadLabel, '2 failed'); }); + + test('storage fraction uses server usage and handles capacity limits', () async { + final prefs = await SharedPreferences.getInstance(); + final auth = AuthProvider(prefs, repository: _FakeAuthRepository(), bootstrapOnCreate: false); + await auth.bootstrap(); + final settings = SyncSettingsProvider( + prefs, + officialConfig: PapyrusApiConfig(serverBaseUri: Uri.parse('https://api.test')), + ); + + StorageSyncController controller({MediaStorageUsage? usage, int usedBytes = 0}) { + return StorageSyncController( + authProvider: auth, + powerSyncService: _FakePowerSyncService(), + syncSettings: settings, + syncState: const SyncState(), + fileStorageUsedBytes: usedBytes, + mediaStorageUsage: usage, + ); + } + + expect(controller(usedBytes: 536870912).fileStorageFraction, 0.5); + expect(controller().fileStorageFraction, 0); + + for (final (used, quota, expected) in [(25, 100, 0.25), (120, 100, 1.0), (0, 0, null)]) { + final state = controller( + usage: MediaStorageUsage(usedBytes: used, quotaBytes: quota, availableBytes: 0), + ); + expect(state.fileStorageFraction, expected); + } + }); } diff --git a/app/test/updates/update_controller_test.dart b/app/test/updates/update_controller_test.dart index 437d0851..a7e33edd 100644 --- a/app/test/updates/update_controller_test.dart +++ b/app/test/updates/update_controller_test.dart @@ -187,6 +187,33 @@ void main() { expect(updates.busy, isFalse); }); + test('last successful check survives failure and does not claim freshness after restart', () async { + var fails = false; + final updates = controller( + manifest: () async { + if (fails) { + throw StateError('Offline'); + } + + return metadata(build: 6); + }, + ); + + expect(updates.status, UpdateStatus.unchecked); + expect(updates.lastChecked, isNull); + await updates.check(); + expect(updates.status, UpdateStatus.upToDate); + final checked = updates.lastChecked; + expect(checked, isNotNull); + fails = true; + await updates.check(); + expect(updates.status, UpdateStatus.checkFailed); + expect(updates.lastChecked, checked); + final restarted = controller(); + expect(restarted.lastChecked, checked); + expect(restarted.status, UpdateStatus.unchecked); + }); + test('invalid release identity fails closed', () { for (final data in [ {...metadata(), 'tag': 'v0.2.0+8'}, diff --git a/app/test/updates/update_settings_test.dart b/app/test/updates/update_settings_test.dart index b15bbd60..d6776aaa 100644 --- a/app/test/updates/update_settings_test.dart +++ b/app/test/updates/update_settings_test.dart @@ -7,6 +7,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:papyrus/updates/update_controller.dart'; +import 'package:papyrus/pages/app_updates_page.dart'; +import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; import 'package:papyrus/themes/app_theme.dart'; import 'package:papyrus/updates/update_release.dart'; import 'package:papyrus/updates/update_settings.dart'; @@ -14,12 +16,14 @@ import 'package:shared_preferences/shared_preferences.dart'; void main() { for (final eink in [false, true]) { - testWidgets('automatic toggle stays aligned and has no pressed ink, eink=$eink', (tester) async { + testWidgets('automatic toggle has no pressed ink and Back releases the settings guard, eink=$eink', (tester) async { SharedPreferences.setMockInitialValues({'updates.automatic': false}); var checks = 0; final preferences = await SharedPreferences.getInstance(); final updates = UpdateController( preferences: preferences, + appInfo: () async => + PackageInfo(appName: 'Papyrus', packageName: 'papyrus', version: '0.2.0', buildNumber: '6'), channelProvider: () async { checks++; return UpdateChannel.windows; @@ -27,10 +31,7 @@ void main() { ); addTearDown(updates.dispose); - const status = UpdateController.checkFailureMessage; - updates.message = status; final boundaryKey = GlobalKey(); - await tester.pumpWidget( RepaintBoundary( key: boundaryKey, @@ -50,9 +51,14 @@ void main() { await tester.tap(find.text('Open updates')); await tester.pumpAndSettle(); - final dialog = tester.getRect(find.byType(AlertDialog)); + expect(find.byType(AlertDialog), findsNothing); + final route = ModalRoute.of(tester.element(find.byType(AppUpdatesPage)))! as TransitionRoute; + expect(route.transitionDuration, Duration.zero); + expect(route.reverseTransitionDuration, Duration.zero); + expect(find.text('0.2.0 (6)'), findsOneWidget); + expect(find.text('Not checked yet'), findsOneWidget); + expect(updates.viewingSettings, isTrue); final label = tester.getTopLeft(find.text('Check automatically')); - expect(label.dx, tester.getTopLeft(find.text(status).hitTestable()).dx); final before = await capture(tester, boundaryKey); final gesture = await tester.startGesture(tester.getCenter(find.byType(Switch))); await tester.pump(const Duration(milliseconds: 100)); @@ -60,25 +66,27 @@ void main() { await gesture.up(); await tester.pumpAndSettle(); expect(preferences.getBool('updates.automatic'), isTrue); - expect(tester.widget(find.byType(Switch)).value, isTrue); - expect(find.text(status).hitTestable(), findsOneWidget); - expect(tester.getRect(find.byType(AlertDialog)), dialog); expect(tester.getTopLeft(find.text('Check automatically')), label); expect(checks, 0); - await tester.tap(find.text('Check automatically')); + await tester.tap(find.byType(BackButton)); await tester.pumpAndSettle(); - expect(preferences.getBool('updates.automatic'), isFalse); - expect(tester.getRect(find.byType(AlertDialog)), dialog); - expect(checks, 0); + expect(find.text('Open updates'), findsOneWidget); + expect(updates.viewingSettings, isFalse); }); } - for (final (width, scale, eink) in [(800.0, 1.0, false), (360.0, 1.0, false), (360.0, 2.0, true)]) { - testWidgets('Check now keeps status and controls in place at width $width, scale $scale', (tester) async { + for (final (width, scale, eink) in [ + (1280.0, 1.0, false), + (360.0, 1.0, false), + (320.0, 2.0, false), + (360.0, 2.0, true), + ]) { + testWidgets('check, failure, retry and success stay usable at width $width, scale $scale, eink=$eink', ( + tester, + ) async { tester.view.physicalSize = Size(width, 900); tester.view.devicePixelRatio = 1; - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); + addTearDown(tester.view.reset); SharedPreferences.setMockInitialValues({}); var result = Completer(); final updates = UpdateController( @@ -97,49 +105,33 @@ void main() { data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), child: child!, ), - home: Scaffold( - body: Builder( - builder: (context) => TextButton( - onPressed: () => showUpdateSettings(context, updates), - child: const Text('Open updates'), - ), - ), - ), + home: AppUpdatesPage(controller: updates), ), ); - await tester.tap(find.text('Open updates')); await tester.pumpAndSettle(); final checkButton = find.byKey(const ValueKey('check-updates')); - var dialog = tester.getRect(find.byType(AlertDialog)); - var toggle = tester.getRect(find.byType(Switch)); - var check = tester.getRect(checkButton); - - void expectStableLayout() { - expect(tester.getRect(find.byType(AlertDialog)), dialog); - expect(tester.getRect(find.byType(Switch)), toggle); - expect(tester.getRect(checkButton), check); - expect(tester.takeException(), isNull); - } for (final fails in [true, false]) { - final message = updates.message; - dialog = tester.getRect(find.byType(AlertDialog)); - toggle = tester.getRect(find.byType(Switch)); - check = tester.getRect(checkButton); - final statusBottom = tester.getBottomLeft(find.text(message)).dy; - final toggleTop = tester - .getTopLeft(find.ancestor(of: find.byType(Switch), matching: find.byType(Theme)).first) - .dy; - expect(toggleTop - statusBottom, 8); - await tester.tap(find.text('Check now')); + await tester.ensureVisible(checkButton); + final buttonBounds = tester.getRect(checkButton); + final buttonOffset = buttonBounds.top - tester.getTopLeft(find.text('Installed version')).dy; + final toggleBounds = tester.getRect(find.byType(Switch)); + final previousStatus = fails ? 'Not checked yet' : 'Couldn’t check for updates'; + await tester.tap(checkButton); await tester.pump(); - expect(find.text('Checking…'), findsOneWidget); - expect(find.text(message), findsOneWidget); + expect(find.text(previousStatus), findsOneWidget); + expect(find.byType(AppLinearProgressIndicator), findsNothing); expect(tester.widget(checkButton).onPressed, isNull); - expectStableLayout(); - await tester.pump(const Duration(milliseconds: 200)); - expectStableLayout(); + expect(tester.getRect(checkButton), buttonBounds); + expect(tester.getRect(find.byType(Switch)), toggleBounds); + await tester.pump(const Duration(milliseconds: 350)); + expect(find.text('Checking…'), findsOneWidget); + expect(find.text(previousStatus), findsOneWidget); + expect(find.byType(AppLinearProgressIndicator), findsOneWidget); + expect(tester.getRect(checkButton), buttonBounds); + expect(tester.getRect(find.byType(Switch)), toggleBounds); + expect(tester.takeException(), isNull); if (fails) { result.completeError(StateError('Offline')); @@ -148,18 +140,165 @@ void main() { } await tester.pumpAndSettle(); - expect( - find.text(fails ? UpdateController.checkFailureMessage : 'Papyrus is up to date.').hitTestable(), - findsOneWidget, - ); - expect(find.text('Check now'), findsOneWidget); + expect(find.text(fails ? 'Couldn’t check for updates' : 'You’re up to date'), findsOneWidget); + expect(find.text(fails ? 'Retry' : 'Check for updates'), findsOneWidget); + expect(find.textContaining('Last checked'), fails ? findsNothing : findsOneWidget); expect(tester.widget(checkButton).onPressed, isNotNull); + final action = tester.element(find.text(fails ? 'Retry' : 'Check for updates')); + expect(DefaultTextStyle.of(action).style.color, Theme.of(action).colorScheme.onPrimary); expect(tester.takeException(), isNull); result = Completer(); + + if (fails) { + expect( + tester.getRect(checkButton).top - tester.getTopLeft(find.text('Installed version')).dy, + buttonOffset, + ); + + await tester.ensureVisible(checkButton); + final retryBounds = tester.getRect(checkButton); + final retryToggleBounds = tester.getRect(find.byType(Switch)); + await tester.tap(checkButton); + await tester.pump(const Duration(milliseconds: 100)); + expect(find.text('Retry'), findsOneWidget); + expect(find.text('Couldn’t check for updates'), findsOneWidget); + expect(find.text('Please try again.'), findsNothing); + expect(find.byType(AppLinearProgressIndicator), findsNothing); + expect(tester.getRect(checkButton), retryBounds); + expect(tester.getRect(find.byType(Switch)), retryToggleBounds); + final retry = tester.element(find.text('Retry')); + expect(DefaultTextStyle.of(retry).style.color, Theme.of(retry).colorScheme.onPrimary); + result.completeError(StateError('Still offline')); + await tester.pumpAndSettle(); + await tester.pump(const Duration(milliseconds: 350)); + expect(find.byType(AppLinearProgressIndicator), findsNothing); + expect(find.text('Retry'), findsOneWidget); + expect(tester.getRect(checkButton), retryBounds); + expect(tester.getRect(find.byType(Switch)), retryToggleBounds); + result = Completer(); + } } }); } + testWidgets('download progress, retry and staged guidance preserve the automatic setting', (tester) async { + SharedPreferences.setMockInitialValues({}); + var attempt = 0; + final download = Completer(); + final updates = UpdateController( + preferences: await SharedPreferences.getInstance(), + appInfo: () async => PackageInfo(appName: 'Papyrus', packageName: 'papyrus', version: '0.2.0', buildNumber: '6'), + channelProvider: () async => UpdateChannel.windows, + manifest: () async => { + 'tag': 'v0.3.0+7', + 'version': '0.3.0', + 'build_number': 7, + 'assets': { + 'installer': {'name': 'papyrus-v0.3.0+7-windows-x64-setup.exe', 'sha256': 'a' * 64}, + }, + }, + installer: (_, progress) async { + if (attempt++ == 0) { + throw StateError('Disk full'); + } + + progress(0.5); + return download.future; + }, + ); + + addTearDown(updates.dispose); + await updates.check(); + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.eink, + home: AppUpdatesPage(controller: updates), + ), + ); + await tester.pumpAndSettle(); + expect(find.text('Version 0.3.0 (7) is available'), findsOneWidget); + await tester.tap(find.text('Update')); + await tester.pumpAndSettle(); + expect(find.text('Couldn’t finish the update'), findsOneWidget); + await tester.tap(find.text('Retry')); + await tester.pump(); + expect(find.text('Downloading update: 50%'), findsOneWidget); + expect(tester.widget(find.byType(LinearProgressIndicator)).value, 0.5); + expect(tester.widget(find.byType(FilledButton)).onPressed, isNull); + download.complete('Close Papyrus to update'); + await tester.pumpAndSettle(); + expect(find.text('Ready to finish updating'), findsOneWidget); + expect(find.text('Close Papyrus to update'), findsOneWidget); + expect(find.byType(FilledButton), findsNothing); + expect(find.text('Check automatically'), findsOneWidget); + expect(tester.takeException(), isNull); + }); + + for (final (channel, label) in [ + (UpdateChannel.web, 'Reload'), + (UpdateChannel.apt, 'Repository setup'), + (UpdateChannel.manual, 'Downloads'), + ]) { + testWidgets('$channel offers the correct platform action', (tester) async { + SharedPreferences.setMockInitialValues({}); + final updates = UpdateController( + preferences: await SharedPreferences.getInstance(), + appInfo: () async => + PackageInfo(appName: 'Papyrus', packageName: 'papyrus', version: '0.2.0', buildNumber: '6'), + channelProvider: () async => channel, + manifest: () async => {'tag': 'v0.3.0+7', 'version': '0.3.0', 'build_number': 7}, + ); + + addTearDown(updates.dispose); + await updates.check(); + await tester.pumpWidget(MaterialApp(home: AppUpdatesPage(controller: updates))); + await tester.pumpAndSettle(); + expect(find.widgetWithText(FilledButton, label), findsOneWidget); + expect(find.text('Update'), findsNothing); + }); + } + + testWidgets('Back during a check allows reopening without losing the result', (tester) async { + SharedPreferences.setMockInitialValues({}); + final result = Completer(); + final updates = UpdateController( + preferences: await SharedPreferences.getInstance(), + appInfo: () async => PackageInfo(appName: 'Papyrus', packageName: 'papyrus', version: '0.2.0', buildNumber: '6'), + channelProvider: () async => UpdateChannel.play, + playCheck: () => result.future, + ); + + addTearDown(updates.dispose); + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.eink, + home: Builder( + builder: (context) => Scaffold( + body: TextButton( + onPressed: () => showUpdateSettings(context, updates), + child: const Text('Open updates'), + ), + ), + ), + ), + ); + + await tester.tap(find.text('Open updates')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Check for updates')); + await tester.pump(); + await tester.tap(find.byType(BackButton)); + await tester.pumpAndSettle(); + expect(updates.viewingSettings, isFalse); + result.complete(null); + await tester.pumpAndSettle(); + await tester.tap(find.text('Open updates')); + await tester.pumpAndSettle(); + expect(find.text('You’re up to date'), findsOneWidget); + expect(find.textContaining('Last checked'), findsOneWidget); + expect(tester.takeException(), isNull); + }); + for (final scale in [1.0, 2.0]) { testWidgets('notice and dialog work on a narrow e-ink screen at text scale $scale', (tester) async { tester.view.physicalSize = const Size(360, 780); diff --git a/app/test/widgets/profile/about_settings_section_test.dart b/app/test/widgets/profile/about_settings_section_test.dart index 399c7502..6f5bd655 100644 --- a/app/test/widgets/profile/about_settings_section_test.dart +++ b/app/test/widgets/profile/about_settings_section_test.dart @@ -1,8 +1,13 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:papyrus/pages/licenses_page.dart'; +import 'package:papyrus/services/license_packages.dart'; import 'package:papyrus/widgets/profile/about_settings_section.dart'; void main() { @@ -84,4 +89,50 @@ void main() { await tester.pumpAndSettle(); expect(find.textContaining('Could not open'), findsOneWidget); }); + + testWidgets('opening licenses keeps About visible until the list is ready', (tester) async { + final license = Completer(); + LicenseRegistry.reset(); + LicenseRegistry.addLicense(() => Stream.fromFuture(license.future)); + addTearDown(LicenseRegistry.reset); + final router = GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (context, state) => const Scaffold(body: AboutSettingsSection()), + ), + GoRoute( + path: '/profile/licenses', + pageBuilder: (context, state) => NoTransitionPage( + child: LicensesPage(initialLicenses: state.extra as LicensePackages?), + ), + ), + ], + ); + + addTearDown(router.dispose); + await tester.pumpWidget(MaterialApp.router(routerConfig: router)); + await tester.pumpAndSettle(); + await tester.tap(find.text('Licenses')); + await tester.pump(const Duration(milliseconds: 100)); + expect(find.byType(AboutSettingsSection), findsOneWidget); + expect(find.byType(LicensesPage), findsNothing); + license.complete(const LicenseEntryWithLineBreaks(['alpha'], 'Alpha license text')); + + for (var frame = 0; frame < 3; frame++) { + await tester.pump(); + + if (find.byType(LicensesPage).evaluate().isNotEmpty) { + expect(find.widgetWithText(ListTile, 'alpha'), findsOneWidget); + expect(find.text('Loading licenses…'), findsNothing); + } + } + + expect(find.byType(LicensesPage), findsOneWidget); + await tester.pageBack(); + await tester.pumpAndSettle(); + await tester.tap(find.text('Licenses')); + await tester.pumpAndSettle(); + expect(find.widgetWithText(ListTile, 'alpha'), findsOneWidget); + }); } From 1bc85c2eae7831cced7b18be936d3f699203dafb Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Fri, 6 Nov 2026 12:58:10 +0200 Subject: [PATCH 14/17] docs: describe grouped settings and add UI evidence --- docs/about-and-support.md | 14 ++++++++++++++ docs/images/settings/licenses-scrolled.png | Bin 0 -> 113891 bytes docs/images/settings/mobile-appearance.png | Bin 0 -> 43059 bytes docs/images/settings/mobile-index.png | Bin 0 -> 89792 bytes docs/images/settings/storage-wide.png | Bin 0 -> 68574 bytes docs/images/settings/updates-retry.png | Bin 0 -> 55595 bytes 6 files changed, 14 insertions(+) create mode 100644 docs/images/settings/licenses-scrolled.png create mode 100644 docs/images/settings/mobile-appearance.png create mode 100644 docs/images/settings/mobile-index.png create mode 100644 docs/images/settings/storage-wide.png create mode 100644 docs/images/settings/updates-retry.png diff --git a/docs/about-and-support.md b/docs/about-and-support.md index ce13d922..9efeb401 100644 --- a/docs/about-and-support.md +++ b/docs/about-and-support.md @@ -1,9 +1,20 @@ # About and support +On phones, Settings opens a grouped index. Account, Appearance, Storage, +Accessibility, and About each open their own page. Desktop Settings retains its +sidebar. Settings navigation is immediate, including Back. + +About → App updates opens a dedicated page with the installed version, latest +check result, automatic-check preference, and the action appropriate to the +installation channel. Fast retries preserve the previous result while checking, +and longer checks show progress without moving the action. + About reads the installed package version and build number. What's new opens the matching `v+` release in `PapyrusReader/client`, using the release notes generated by the release workflow. Development versions without a published tag do not have release notes yet. Licenses are bundled with the app and work offline. +About prepares the license list before opening it to avoid a blank first frame. +Direct license routes retain delayed loading feedback and retry on failure. Support submits a bug report or feature request to the selected Papyrus server. No GitHub account is required. Its text, attachments, and app @@ -14,3 +25,6 @@ keep the current form text and selected files, and uncertain submissions are not Attach up to five images or videos, 10 MB per file. PNG, JPEG, GIF, WebP, MP4, MOV, and WebM are supported. Files can be removed before submission and upload only when Submit is pressed. Images and videos are embedded in the GitHub issue. + +The Support form follows Appearance → Page alignment (Left or Center). Changing +alignment preserves the draft and selected attachments. diff --git a/docs/images/settings/licenses-scrolled.png b/docs/images/settings/licenses-scrolled.png new file mode 100644 index 0000000000000000000000000000000000000000..db9ee57a7dad8dd508829f0de134ec176f9f7412 GIT binary patch literal 113891 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 literal 0 HcmV?d00001 diff --git a/docs/images/settings/mobile-appearance.png b/docs/images/settings/mobile-appearance.png new file mode 100644 index 0000000000000000000000000000000000000000..00258a9bddf5c9cfa536cefdd0f938ae665ed17f GIT binary patch literal 43059 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
m+=7$0b(i0+GL8K^TKoUxT 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 literal 0 HcmV?d00001 diff --git a/.impeccable/review/genre/edit-390.png b/.impeccable/review/genre/edit-390.png new file mode 100644 index 0000000000000000000000000000000000000000..68f83fd1e12c455b3a28a329fce28a9da93af8d0 GIT binary patch literal 36721 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 ad-?%FmnyEef73(2KM!S Page alignment defaults to +Left, using the available width and Library/Goals page margins: 24 logical px on +desktop and 16 on mobile. Center retains a 1120 logical px content limit. This +persisted setting currently affects only Statistics. + +Time and Pages sit at the top right, vertically centered beside the activity +title and date range. They wrap within the action area only when text scaling +requires it. Native controls preserve keyboard and selected-state semantics. +Empty states use an icon and title without explanatory body copy. Daily average +sits alongside the other rhythm metrics without a divider. + +## Data definitions + +- Reading time and pages use the corrected reading ledger's existing projection. + Newly recorded EPUB activity counts rendered pages, one per exposed page after + ten seconds, including both pages of a spread. Checkpoints and revisits to the + same page are deduplicated per day. Layout changes can alter EPUB page counts. + Existing estimates remain labeled as estimated. No past activity is fabricated. +- Genre is editable in Edit book and displayed in book details, using the existing + custom metadata field without changing unrelated metadata. +- Days read follows the existing five-minute qualification used for streaks and + reading-day goals. The summary tooltip states this threshold. +- Daily average divides total seconds by elapsed calendar days in the selected + period, including today and days without reading. Future chart buckets are + excluded from this denominator. All time begins with the earliest + effective activity or eligible historical completion, not an arbitrary year. +- Calendar activity axes always cover Monday through Sunday for Week, every date + for Month, and January through December for Year. Future buckets stay empty. + All-time/custom activity covers the selected range: daily through 60 days, + monthly through five years, then yearly. Buckets carry exact seconds, page values and clipped + boundaries. Short durations use second-based scales, with intermediate grid + lines including the top boundary and a visible baseline. Time and Pages share + the same bar renderer. Every bucket has an axis tick. Labels use a fixed integer + interval based on measured text widths, anchored at the latest bucket. The + first bucket may have only a tick to avoid an irregular endpoint gap. The header + always shows the full date range. No smoothing + invents trends. +- The chart has no expandable totals section. First/last partial calendar buckets + are bounded by the date range shown in the header. +- Books read and genre shares count distinct books with reading activity or a + completion in the period. Missing metadata uses Unspecified, including removed + books whose historical activity remains. Unread inventory does not contribute. +- Books finished by month covers the entire selected year/all-time range and + scrolls horizontally when needed. It does not discard older months. +- Streaks remain current/lifetime and are labeled separately. Reading pace is + omitted because independent page-only logs cannot establish a trustworthy rate. +- Empty session averages display an em dash. Existing offline persistence, + correction handling and profile isolation remain unchanged. + +## Verification + +Focused tests cover historical/corrected completions, full-range bucket totals, +sub-minute durations, custom boundaries, midnight-crossing sessions, scoped genre +counts, profile replacement, five-minute days, period/date interactions, equal +panel heights, unchanged date-control geometry, readable short +chart scales, separated monthly labels and responsive empty/populated layouts. + +Committed synthetic Flutter captures in `.impeccable/review/calendar-axis/` show +the full Statistics page on desktop and phone in both Time and Pages modes. +`.impeccable/review/genre/` covers genre editing and book details. Widget tests also +cover e-ink and large text. These checks do not establish native-device or live +browser acceptance. diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 00000000..8ca92027 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,192 @@ +--- +name: "Papyrus" +description: "Existing Flutter visual system for the cross-platform library and reader." +colors: + light-primary: "#5654A8" + light-on-primary: "#FFFFFF" + light-primary-container: "#E2DFFF" + light-on-primary-container: "#100563" + light-secondary: "#5D5C71" + light-secondary-container: "#E3E0F9" + light-on-secondary-container: "#1A1A2C" + light-tertiary: "#7A5368" + light-surface: "#FFFBFF" + light-on-surface: "#1C1B1F" + light-surface-container-highest: "#E4E1EC" + light-on-surface-variant: "#47464F" + light-outline: "#787680" + light-outline-variant: "#C8C5D0" + light-error: "#BA1A1A" + dark-primary: "#C3C0FF" + dark-on-primary: "#272377" + dark-primary-container: "#3E3C8F" + dark-on-primary-container: "#E2DFFF" + dark-secondary: "#C7C4DD" + dark-secondary-container: "#464559" + dark-on-secondary-container: "#E3E0F9" + dark-tertiary: "#EAB9D2" + dark-surface: "#1C1B1F" + dark-on-surface: "#E5E1E6" + dark-surface-container-highest: "#47464F" + dark-on-surface-variant: "#C8C5D0" + dark-outline: "#928F9A" + dark-outline-variant: "#47464F" + dark-error: "#FFB4AB" + eink-primary: "#000000" + eink-on-primary: "#FFFFFF" + eink-primary-container: "#000000" + eink-on-primary-container: "#FFFFFF" + eink-secondary: "#404040" + eink-secondary-container: "#F5F5F5" + eink-on-secondary-container: "#000000" + eink-tertiary: "#404040" + eink-surface: "#FFFFFF" + eink-on-surface: "#000000" + eink-surface-container-highest: "#F5F5F5" + eink-on-surface-variant: "#404040" + eink-outline: "#000000" + eink-outline-variant: "#000000" + eink-error: "#000000" + eink-black: "#000000" + eink-white: "#FFFFFF" + eink-dark-gray: "#404040" + eink-light-gray: "#C0C0C0" + eink-container: "#F5F5F5" +typography: + display-large: {"fontSize": "57px", "fontWeight": 400, "letterSpacing": "-0.25px"} + display-medium: {"fontSize": "45px", "fontWeight": 400, "letterSpacing": "0px"} + display-small: {"fontSize": "36px", "fontWeight": 400, "letterSpacing": "0px"} + headline-large: {"fontSize": "32px", "fontWeight": 400, "letterSpacing": "0px"} + headline-medium: {"fontSize": "28px", "fontWeight": 400, "letterSpacing": "0px"} + headline-small: {"fontSize": "24px", "fontWeight": 400, "letterSpacing": "0px"} + title-large: {"fontSize": "22px", "fontWeight": 400, "letterSpacing": "0px"} + title-medium: {"fontSize": "16px", "fontWeight": 500, "letterSpacing": "0.15px"} + title-small: {"fontSize": "14px", "fontWeight": 500, "letterSpacing": "0.1px"} + body-large: {"fontSize": "16px", "fontWeight": 400, "letterSpacing": "0.5px"} + body-medium: {"fontSize": "14px", "fontWeight": 400, "letterSpacing": "0.25px"} + body-small: {"fontSize": "12px", "fontWeight": 400, "letterSpacing": "0.4px"} + label-large: {"fontSize": "14px", "fontWeight": 500, "letterSpacing": "0.1px"} + label-medium: {"fontSize": "12px", "fontWeight": 500, "letterSpacing": "0.5px"} + label-small: {"fontSize": "11px", "fontWeight": 500, "letterSpacing": "0.5px"} +rounded: + none: "0px" + sm: "4px" + md: "8px" + lg: "12px" + xl: "16px" + xxl: "28px" + full: "9999px" +spacing: + xs: "4px" + sm: "8px" + md: "16px" + lg: "24px" + xl: "32px" + xxl: "48px" +components: + button-outlined: {"rounded": "{rounded.md}", "padding": "12px 24px"} + button-text: {"padding": "8px 12px"} + input: {"rounded": "{rounded.sm}", "padding": "16px"} + card: {"rounded": "{rounded.lg}"} + button-eink: {"backgroundColor": "{colors.eink-black}", "textColor": "{colors.eink-white}", "rounded": "{rounded.none}", "padding": "12px 24px"} + button-outlined-eink: {"backgroundColor": "{colors.eink-white}", "textColor": "{colors.eink-black}", "rounded": "{rounded.none}", "padding": "12px 24px"} + input-eink: {"backgroundColor": "{colors.eink-container}", "textColor": "{colors.eink-black}", "rounded": "{rounded.none}", "padding": "16px"} + chip-eink: {"backgroundColor": "{colors.eink-white}", "textColor": "{colors.eink-black}"} + chip-eink-selected: {"backgroundColor": "{colors.eink-light-gray}", "textColor": "{colors.eink-black}"} +--- + +# Design System: Papyrus + +## Overview + +Papyrus uses its existing Material 3 theme for a readable, adaptive library and reader. Muted violet accents sit on neutral surfaces, with separate light, dark, high-contrast and e-ink themes. This record describes the implemented system, without introducing a new visual identity. + +Sources: `app/lib/themes/app_theme.dart`, `design_tokens.dart`, +`color_schemes.g.dart` and `app_motion.dart`. Flutter source remains authoritative. +Frontmatter `px` values represent Flutter logical pixels. Mode prefixes identify +actual palette variants, not interchangeable colors within one theme. + +**Key Characteristics:** +- Semantic theme colors and text roles. +- Shared spacing and shape tokens. +- Dedicated e-ink and reduced-motion behavior. + +## Colors + +The primary accent is muted violet in light mode and pale violet in dark mode. +Secondary colors support tonal controls. Tertiary colors provide a muted rose +accent. Surfaces, text and outlines use the corresponding semantic neutral roles. +E-ink resolves these roles to solid grayscale colors. + +The frontmatter records explicit source values. Surface-container roles omitted +from `color_schemes.g.dart`, including `surfaceContainerLow`, retain Flutter's +runtime defaults and are deliberately not assigned inferred hex values here. +High-contrast schemes are generated from the primary seed with contrast level 1. + +## Typography + +The frontmatter mirrors the explicit Material text scale. The theme does not +specify a custom default font family or line heights. Flutter resolves those +values. Headline, title, body and label roles provide hierarchy without a new +brand font. + +E-ink strengthens body-medium/body-small to weight 500 and label-medium/label-small +to 600. Accessibility settings can substitute OpenDyslexic and promote text to +bold. Components inherit these adaptations through the active text theme. + +## Layout + +The shared spacing scale supplies gaps, padding and margins. Breakpoint tokens +start tablet at 600, small desktop at 840 and large desktop at 1200 logical pixels. +They define 4/8/12 grid columns and 16/24/24 gutters for mobile/tablet/desktop. +Actual pages choose their composition within available width and text scaling. +The statistics composition and its local width constraints belong in +[its surface brief](.impeccable/surfaces/statistics.md). + +## Elevation & Depth + +Standard themes combine Material elevation and tonal surfaces. Shared cards and +elevated buttons use elevation 1, bottom navigation 3 and popup menus 6. These +are Flutter elevation values, not CSS shadow recipes. E-ink component themes use +zero elevation and visible borders. Motion durations live in the sidecar. +`AppMotion` disables motion when requested by the theme or platform settings. + +## Shapes + +Shared buttons use the md radius, inputs sm, cards lg, dialogs xxl and bottom +sheets xl. E-ink button, input and card themes have square corners. Default input +borders are 1 logical pixel, increasing to 2 for focus/error. E-ink input borders +use 2 at rest and 4 for focus/error. E-ink card themes use a 2-pixel border. + +## Components + +- **Buttons:** elevated and outlined themes use shared horizontal/vertical + padding, minimum height 50, and 16-point medium text. Text buttons have smaller + padding. E-ink buttons become square, instant and semibold. Standard interactive + state layers otherwise come from Flutter Material. +- **Inputs:** outlined fields use semantic outline, primary focus and error + colors. E-ink fields use a solid container fill and persistent bold labels. +- **Cards:** standard shared cards have a small elevation and rounded shape. + Statistics section containers are flat, use `surfaceContainerLow` and a + semantic outline, and inherit the card shape. Their local 1-pixel border is + an implementation detail, not an override of the shared e-ink card theme. +- **Chips:** standard choices inherit Material styling. The e-ink theme uses + white or selected light-gray fills, black text and 2-pixel black borders. +- **Navigation:** bottom navigation maps selected items to primary and other + items to on-surface-variant. E-ink navigation removes elevation and strengthens + selected labels. App bars use the surface and on-surface roles. + +The sidecar's small HTML/CSS examples preview explicit e-ink theme properties. +They are reference swatches, not substitutes for Flutter widgets or their full +platform interaction behavior. + +## Do's and Don'ts + +### Do: +- Do resolve colors and typography through the active Flutter theme. +- Do preserve text scaling, accessibility typography and reduced-motion settings. +- Do use existing spacing and radius tokens for shared components. + +### Don't: +- Don't hard-code the light palette into adaptive widgets. +- Don't carry standard-theme elevation and animation into e-ink components. diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 00000000..b003810f --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,28 @@ +# Product + + + +## Platform + +adaptive + +## Product Purpose + +Papyrus is an offline-first, cross-platform book library and reader. The reading +statistics page helps readers understand their reading habits. This priority was +confirmed for the statistics redesign. + +## Capabilities and Constraints + +The Flutter client uses Provider and DataStore. Preserve guest, user and server +profile isolation and durable reading activity. Statistics must reflect existing +provider calculations, with explicit labels for different date scopes. + +## Accessibility & Inclusion + +Preserve light, dark and e-ink themes, reduced motion, keyboard access, text scaling +and responsive layouts. Follow existing design tokens and shared controls. + +## Open Decisions + +No broader audience or brand changes were requested in this page redesign. diff --git a/app/lib/models/book.dart b/app/lib/models/book.dart index fb02a9be..6c6325f9 100644 --- a/app/lib/models/book.dart +++ b/app/lib/models/book.dart @@ -117,6 +117,11 @@ class Book { this.lastReadAt, }); + String? get genre { + final value = customMetadata?['genre']; + return value is String && value.trim().isNotEmpty ? value.trim() : null; + } + /// Progress as a percentage (0-100). int get progressPercent => (currentPosition * 100).round(); diff --git a/app/lib/models/reading_activity.dart b/app/lib/models/reading_activity.dart index 87c05f42..926b726d 100644 --- a/app/lib/models/reading_activity.dart +++ b/app/lib/models/reading_activity.dart @@ -1,6 +1,6 @@ import 'package:papyrus/models/reading_session.dart'; -/// Stable document coverage, independent of the current screen's pagination. +/// Coverage of an identified reader page, deduplicated across checkpoints. class PageCoverage { const PageCoverage({ required this.key, diff --git a/app/lib/pages/book_edit_page.dart b/app/lib/pages/book_edit_page.dart index 0c187b8a..f63e2d29 100644 --- a/app/lib/pages/book_edit_page.dart +++ b/app/lib/pages/book_edit_page.dart @@ -52,6 +52,7 @@ class _BookEditPageState extends State { // Text controllers final _titleController = TextEditingController(); final _subtitleController = TextEditingController(); + final _genreController = TextEditingController(); final _authorController = TextEditingController(); final _publisherController = TextEditingController(); final _languageController = TextEditingController(); @@ -95,6 +96,7 @@ class _BookEditPageState extends State { _titleController.text = book.title; _subtitleController.text = book.subtitle ?? ''; + _genreController.text = book.genre ?? ''; _authorController.text = book.author; _publisherController.text = book.publisher ?? ''; _languageController.text = book.language ?? ''; @@ -126,6 +128,7 @@ class _BookEditPageState extends State { void dispose() { _titleController.dispose(); _subtitleController.dispose(); + _genreController.dispose(); _authorController.dispose(); _publisherController.dispose(); _languageController.dispose(); @@ -359,6 +362,8 @@ class _BookEditPageState extends State { const SizedBox(height: Spacing.md), BookTextField(controller: _subtitleController, label: 'Subtitle', onChanged: _provider.updateSubtitle), const SizedBox(height: Spacing.md), + BookTextField(controller: _genreController, label: 'Genre', onChanged: _provider.updateGenre), + const SizedBox(height: Spacing.md), BookTextField( controller: _descriptionController, label: 'Description', @@ -766,6 +771,7 @@ class _BookEditPageState extends State { if (book != null) { _titleController.text = book.title; _subtitleController.text = book.subtitle ?? ''; + _genreController.text = book.genre ?? ''; _authorController.text = book.author; _publisherController.text = book.publisher ?? ''; _languageController.text = book.language ?? ''; diff --git a/app/lib/pages/statistics_page.dart b/app/lib/pages/statistics_page.dart index ee49112e..ef3c645b 100644 --- a/app/lib/pages/statistics_page.dart +++ b/app/lib/pages/statistics_page.dart @@ -1,41 +1,35 @@ import 'package:flutter/material.dart'; -import 'package:papyrus/widgets/shared/empty_state.dart'; +import 'package:intl/intl.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/providers/statistics_provider.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/widgets/library/library_page_header.dart'; import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/widgets/shared/app_date_picker.dart'; +import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; +import 'package:papyrus/widgets/shared/empty_state.dart'; import 'package:papyrus/widgets/statistics/reading_charts.dart'; import 'package:papyrus/widgets/statistics/stat_card.dart'; +import 'package:papyrus/widgets/statistics/statistics_row.dart'; import 'package:provider/provider.dart'; -import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; -import 'package:papyrus/widgets/shared/app_date_picker.dart'; -/// Statistics page displaying reading analytics and charts. -/// -/// Provides two responsive layouts: -/// - **Mobile**: Vertical scrolling with stacked charts -/// - **Desktop**: Full-width charts with period segmented control class StatisticsPage extends StatefulWidget { - const StatisticsPage({super.key}); + const StatisticsPage({super.key, this.now}); + + final DateTime Function()? now; @override State createState() => _StatisticsPageState(); } class _StatisticsPageState extends State { - late StatisticsProvider _provider; - - @override - void initState() { - super.initState(); - _provider = StatisticsProvider(); - } + late final _provider = StatisticsProvider(now: widget.now); + bool _showPages = false; @override void didChangeDependencies() { super.didChangeDependencies(); - // Connect to DataStore for persistent storage - final dataStore = context.read(); - _provider.attach(dataStore); + _provider.attach(context.watch()); } @override @@ -46,525 +40,431 @@ class _StatisticsPageState extends State { @override Widget build(BuildContext context) { - return ChangeNotifierProvider.value( - value: _provider, - child: Consumer( - builder: (context, provider, _) { - final screenWidth = MediaQuery.of(context).size.width; - final isDesktop = screenWidth >= Breakpoints.desktopSmall; - - if (provider.isLoading) { - return _buildLoadingState(context); - } - - if (isDesktop) { - return _buildDesktopLayout(context, provider); - } - - return _buildMobileLayout(context, provider); - }, + final centered = context.select((preferences) => preferences.pageAlignment == 'center'); + + return ListenableBuilder( + listenable: _provider, + builder: (context, child) => Scaffold( + body: SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + final wide = constraints.maxWidth >= Breakpoints.desktopSmall; + final padding = libraryPageHorizontalPadding(context); + + return RefreshIndicator( + onRefresh: _provider.refresh, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + padding: EdgeInsets.all(padding), + child: Align( + alignment: centered ? Alignment.topCenter : Alignment.topLeft, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: centered ? 1120 : double.infinity), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _periodControls(context), + const SizedBox(height: Spacing.lg), + if (_provider.isLoading) const AppLinearProgressIndicator(), + if (_provider.error != null) + Padding( + padding: const EdgeInsets.only(bottom: Spacing.md), + child: Text( + _provider.error!, + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + ), + _overview(context), + const SizedBox(height: Spacing.xl), + _columns(context, _activity(context, wide), _sessions(context)), + const SizedBox(height: Spacing.xl), + _columns(context, _consistency(context), _genres(context)), + if (_provider.selectedPeriod == StatsPeriod.year || + _provider.selectedPeriod == StatsPeriod.allTime) ...[ + const SizedBox(height: Spacing.xl), + StatSectionCard( + title: 'Books finished by month', + subtitle: _periodTitle, + child: _provider.monthlyStats.every((month) => month.booksRead == 0) + ? const EmptyState.compact( + icon: Icons.auto_stories_outlined, + title: 'No books finished in this range', + ) + : SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox( + width: (_provider.monthlyStats.length * 64.0).clamp(280, 100000), + child: BooksPerMonthChart( + monthlyStats: _provider.monthlyStats, + isDesktop: wide, + ), + ), + ), + ), + ], + ], + ), + ), + ), + ), + ); + }, + ), + ), ), ); } - Widget _buildLoadingState(BuildContext context) { - return const Scaffold(body: Center(child: AppCircularProgressIndicator())); - } - - Widget _buildMobileLayout(BuildContext context, StatisticsProvider provider) { - return Scaffold( - body: SafeArea( - child: RefreshIndicator( - onRefresh: provider.refresh, - child: ListView( - padding: const EdgeInsets.all(Spacing.md), - children: [ - // Period filter - _buildPeriodSegmentedButton(context, provider), - const SizedBox(height: Spacing.md), - // Custom range indicator - if (provider.hasCustomRange) ...[ - _buildCustomRangeChip(context, provider), - const SizedBox(height: Spacing.md), - ], - // Summary cards - _buildMobileSummaryCards(context, provider), - const SizedBox(height: Spacing.lg), - // Reading time chart - StatSectionCard( - title: 'Reading time', - child: ReadingTimeBarChart( - activities: provider.readingTimeData, - isWeekly: provider.selectedPeriod == StatsPeriod.week, - ), - ), - const SizedBox(height: Spacing.lg), - // Pages read trend - StatSectionCard( - title: 'Pages read', - child: PagesReadLineChart( - activities: provider.pagesReadData, - isWeekly: provider.selectedPeriod == StatsPeriod.week, + Widget _periodControls(BuildContext context) => LayoutBuilder( + builder: (context, constraints) { + final compact = constraints.maxWidth < Breakpoints.tablet; + final controls = Row( + mainAxisSize: MainAxisSize.min, + children: [ + for (final period in StatsPeriod.values.where((period) => period != StatsPeriod.custom)) + Semantics( + selected: _provider.selectedPeriod == period, + child: TextButton( + key: ValueKey('statistics-period-${period.name}'), + style: TextButton.styleFrom( + minimumSize: const Size(48, 48), + padding: EdgeInsets.symmetric(horizontal: compact ? Spacing.sm : Spacing.md), + textStyle: Theme.of(context).textTheme.labelLarge, + foregroundColor: _provider.selectedPeriod == period + ? Theme.of(context).colorScheme.onPrimaryContainer + : Theme.of(context).colorScheme.primary, + backgroundColor: _provider.selectedPeriod == period + ? Theme.of(context).colorScheme.primaryContainer + : Colors.transparent, ), + onPressed: () => _provider.setPeriod(period), + child: Text(_periodLabel(period)), ), - const SizedBox(height: Spacing.lg), - // Books per month (for year/all time views) - if (provider.selectedPeriod == StatsPeriod.year || provider.selectedPeriod == StatsPeriod.allTime) ...[ - StatSectionCard( - title: 'Books per month', - child: BooksPerMonthChart(monthlyStats: provider.monthlyStats), - ), - const SizedBox(height: Spacing.lg), - ], - // Genre distribution - _buildGenreDistributionCard(context, provider), - const SizedBox(height: Spacing.lg), - // Reading insights (session stats + streaks) - _buildInsightsCard(context, provider), - ], + ), + ], + ); + + return Row( + children: [ + Expanded( + child: SingleChildScrollView(scrollDirection: Axis.horizontal, child: controls), ), - ), - ), - ); - } + const SizedBox(width: Spacing.sm), + Semantics( + selected: _provider.hasCustomRange, + child: compact + ? IconButton.outlined( + onPressed: _pickDates, + tooltip: 'Custom range', + isSelected: _provider.hasCustomRange, + icon: const Icon(Icons.date_range_outlined), + ) + : OutlinedButton.icon( + style: OutlinedButton.styleFrom(minimumSize: const Size(48, 48)), + onPressed: _pickDates, + icon: const Icon(Icons.date_range_outlined, size: 18), + label: const Text('Custom range'), + ), + ), + ], + ); + }, + ); - Widget _buildPeriodSegmentedButton(BuildContext context, StatisticsProvider provider) { - final colorScheme = Theme.of(context).colorScheme; + Widget _overview(BuildContext context) { final textTheme = Theme.of(context).textTheme; - final periods = StatsPeriod.values.where((item) => item != StatsPeriod.custom).toList(); - final selectedPeriod = provider.selectedPeriod == StatsPeriod.custom ? StatsPeriod.week : provider.selectedPeriod; + final colors = Theme.of(context).colorScheme; - return Row( + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(AppRadius.lg), - border: Border.all(color: colorScheme.outlineVariant, width: BorderWidths.thin), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(AppRadius.lg), - child: IntrinsicHeight( - child: Row( - children: [ - for (int i = 0; i < periods.length; i++) ...[ - Expanded( - child: GestureDetector( - onTap: () => provider.setPeriod(periods[i]), - child: Container( - padding: const EdgeInsets.symmetric(vertical: Spacing.sm), - color: selectedPeriod == periods[i] - ? colorScheme.primaryContainer - : colorScheme.surfaceContainerLow, - child: Center( - child: Text( - _getPeriodLabel(periods[i]), - style: textTheme.labelLarge?.copyWith( - color: selectedPeriod == periods[i] - ? colorScheme.onPrimaryContainer - : colorScheme.onSurfaceVariant, - ), - ), - ), - ), + Text(_periodTitle, style: textTheme.headlineSmall), + const SizedBox(height: Spacing.sm), + Text('Your reading at a glance', style: textTheme.bodyMedium?.copyWith(color: colors.onSurfaceVariant)), + const SizedBox(height: Spacing.lg), + LayoutBuilder( + builder: (context, constraints) { + final minimumWidth = MediaQuery.textScalerOf(context).scale(140); + final columns = (constraints.maxWidth / minimumWidth).floor().clamp(1, 4); + final width = (constraints.maxWidth - Spacing.md * (columns - 1)) / columns; + + return Wrap( + spacing: Spacing.md, + runSpacing: Spacing.lg, + children: [ + for (final metric in [ + (_provider.totalReadingLabel, 'Reading time'), + ('${_provider.pagesRead}', _provider.hasEstimatedPages ? 'Pages read (estimated)' : 'Pages read'), + ('${_provider.totalBooks}', 'Books finished'), + ('${_provider.daysRead}', 'Days read'), + ]) + SizedBox( + width: width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + metric.$1, + style: textTheme.headlineMedium?.copyWith(fontFeatures: const [FontFeature.tabularFigures()]), ), - ), - if (i < periods.length - 1) - VerticalDivider(width: 1, thickness: 1, color: colorScheme.outlineVariant), - ], - ], - ), - ), - ), - ), - ), - const SizedBox(width: Spacing.sm), - IconButton.outlined( - onPressed: () => _showDateRangePicker(context, provider), - icon: const Icon(Icons.date_range_outlined, size: 20), - tooltip: 'Custom date range', - style: IconButton.styleFrom(side: BorderSide(color: colorScheme.outlineVariant)), + const SizedBox(height: Spacing.xs), + if (metric.$2 == 'Days read') + Tooltip( + message: 'Days with at least 5 minutes of reading', + child: Text( + metric.$2, + style: textTheme.bodySmall?.copyWith(color: colors.onSurfaceVariant), + ), + ) + else + Text(metric.$2, style: textTheme.bodySmall?.copyWith(color: colors.onSurfaceVariant)), + ], + ), + ), + ], + ); + }, ), ], ); } - Widget _buildCustomRangeChip(BuildContext context, StatisticsProvider provider) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; + Widget _columns(BuildContext context, Widget main, Widget aside) => LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxWidth < 800 || MediaQuery.textScalerOf(context).scale(16) > 24) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + main, + const SizedBox(height: Spacing.lg), + aside, + ], + ); + } - return Container( - padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm), - decoration: BoxDecoration( - color: colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(AppRadius.full), - ), - child: Row( - mainAxisSize: MainAxisSize.min, + return StatisticsRow(main: main, aside: aside); + }, + ); + + String get _chartRange { + final activities = _provider.readingTimeData; + + if (activities.isEmpty) { + return _provider.periodLabel; + } + + final dates = + '${DateFormat.yMMMd().format(activities.first.date)} – ' + '${DateFormat.yMMMd().format(activities.last.endDate.subtract(const Duration(microseconds: 1)))}'; + if (activities.length == 1 && _provider.bucketSize == StatisticsBucketSize.day) { + return DateFormat.yMMMd().format(activities.first.date); + } + + return dates; + } + + Widget _activity(BuildContext context, bool wide) { + final activities = _provider.readingTimeData; + final hasData = activities.any((activity) => _showPages ? activity.pages > 0 : activity.seconds > 0); + + return StatSectionCard( + title: 'Reading activity', + subtitle: _chartRange, + action: Wrap( + spacing: Spacing.xs, + alignment: WrapAlignment.end, children: [ - Icon(Icons.date_range, size: 16, color: colorScheme.onSecondaryContainer), - const SizedBox(width: Spacing.sm), - Text(provider.periodLabel, style: textTheme.labelMedium?.copyWith(color: colorScheme.onSecondaryContainer)), - const SizedBox(width: Spacing.sm), - GestureDetector( - onTap: () => provider.setPeriod(StatsPeriod.week), - child: Icon(Icons.close, size: 16, color: colorScheme.onSecondaryContainer), + ChoiceChip( + label: const Text('Time'), + padding: const EdgeInsets.symmetric(horizontal: Spacing.xs), + labelPadding: const EdgeInsets.symmetric(horizontal: Spacing.xs), + showCheckmark: false, + selected: !_showPages, + onSelected: (_) => setState(() => _showPages = false), + ), + ChoiceChip( + label: const Text('Pages'), + padding: const EdgeInsets.symmetric(horizontal: Spacing.xs), + labelPadding: const EdgeInsets.symmetric(horizontal: Spacing.xs), + showCheckmark: false, + selected: _showPages, + onSelected: (_) => setState(() => _showPages = true), ), ], ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (!hasData) + EmptyState.compact( + icon: Icons.auto_stories_outlined, + title: _showPages ? 'No pages recorded in this range' : 'No reading time in this range', + ) + else + ReadingActivityBarChart( + activities: activities, + metric: _showPages ? ReadingActivityMetric.pages : ReadingActivityMetric.time, + isDesktop: wide, + ), + ], + ), ); } - Widget _buildMobileSummaryCards(BuildContext context, StatisticsProvider provider) { - return Row( - children: [ - Expanded( - child: CompactStatCard(value: provider.totalBooks.toString(), label: 'Books'), - ), - const SizedBox(width: Spacing.sm), - Expanded( - child: CompactStatCard(value: provider.pagesRead.toString(), label: 'Pages'), - ), - const SizedBox(width: Spacing.sm), - Expanded( - child: CompactStatCard(value: provider.totalReadingLabel, label: 'Reading time'), - ), - const SizedBox(width: Spacing.sm), - Expanded( - child: CompactStatCard(value: provider.goalsCompleted.toString(), label: 'Goals'), - ), - ], - ); - } - - Widget _buildInsightsCard(BuildContext context, StatisticsProvider provider, {bool isDesktop = false}) { - final colorScheme = Theme.of(context).colorScheme; - final sessionStats = provider.sessionStats; - final streak = provider.streak; - final rowGap = SizedBox(height: isDesktop ? Spacing.md : Spacing.sm); + Widget _sessions(BuildContext context) { + final sessions = _provider.sessionStats; return StatSectionCard( - title: 'Reading insights', - isDesktop: isDesktop, + title: 'Your reading rhythm', + subtitle: _periodTitle, child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - _buildStatRow( - context, - icon: Icons.timer_outlined, - label: 'Average session', - value: sessionStats.averageSessionLabel, - ), - rowGap, - _buildStatRow( - context, - icon: Icons.speed_outlined, - label: 'Reading velocity', - value: sessionStats.velocityLabel, - ), - rowGap, - _buildStatRow( - context, - icon: Icons.repeat_outlined, - label: 'Total sessions', - value: '${sessionStats.totalSessions}', - ), - rowGap, - _buildStatRow( - context, - icon: Icons.show_chart_outlined, - label: 'Avg. daily reading', - value: provider.averageReadingLabel, - ), - Divider(height: isDesktop ? Spacing.xl : Spacing.lg, color: colorScheme.outlineVariant), - _buildStreakRow( - context, - icon: Icons.local_fire_department, - iconColor: streak.hasActiveStreak ? colorScheme.tertiary : colorScheme.onSurfaceVariant, - label: 'Current streak', - value: '${streak.currentStreak} days', - isHighlighted: streak.isCurrentBest, - ), - rowGap, - _buildStreakRow( - context, - icon: Icons.emoji_events_outlined, - iconColor: colorScheme.primary, - label: 'Best streak', - value: '${streak.bestStreak} days', - ), - rowGap, - _buildStreakRow( - context, - icon: Icons.calendar_month_outlined, - iconColor: colorScheme.onSurfaceVariant, - label: 'Days this month', - value: '${streak.daysThisMonth} of ${streak.totalDaysInMonth}', + _detail(context, 'Sessions', '${sessions.totalSessions}'), + _detail(context, 'Average session', sessions.totalSessions == 0 ? '—' : sessions.averageSessionLabel), + _detail(context, 'Books read', '${_provider.booksRead}'), + Tooltip( + message: 'Reading time per elapsed calendar day in the selected period, including days without reading', + child: _detail(context, 'Daily average', _provider.averageReadingLabel), ), ], ), ); } - Widget _buildStatRow(BuildContext context, {required IconData icon, required String label, required String value}) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; + Widget _consistency(BuildContext context) { + final streak = _provider.streak; + String days(int count) => '$count ${count == 1 ? 'day' : 'days'}'; - return Row( - children: [ - Icon(icon, size: 20, color: colorScheme.onSurfaceVariant), - const SizedBox(width: Spacing.sm), - Text(label, style: textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant)), - const Spacer(), - Text(value, style: textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.w600)), - ], + return StatSectionCard( + title: 'Reading consistency', + subtitle: 'Lifetime streaks', + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _detail(context, 'Current streak', days(streak.currentStreak)), + _detail(context, 'Best streak', days(streak.bestStreak)), + ], + ), ); } - Widget _buildGenreDistributionCard(BuildContext context, StatisticsProvider provider) { - return _buildGenreBarsCard(context, provider); - } - - Widget _buildGenreBarsCard(BuildContext context, StatisticsProvider provider, {bool isDesktop = false}) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - final genres = provider.genreDistribution; - - if (genres.isEmpty) { - return StatSectionCard( - title: 'Books by genre', - isDesktop: isDesktop, - child: const EmptyState.compact(icon: Icons.category_outlined, title: 'No genre data available'), - ); - } - - final chartColors = [ - colorScheme.primary, - colorScheme.primary.withValues(alpha: 0.7), - colorScheme.tertiary, - colorScheme.tertiary.withValues(alpha: 0.7), - colorScheme.secondary, - colorScheme.secondary.withValues(alpha: 0.7), - ]; + Widget _genres(BuildContext context) { + final colors = Theme.of(context).colorScheme; + final genres = [..._provider.genreDistribution]..sort((left, right) => right.bookCount.compareTo(left.bookCount)); return StatSectionCard( - title: 'Books by genre', - isDesktop: isDesktop, - child: Column( - children: genres.asMap().entries.map((entry) { - final genre = entry.value; - final color = chartColors[entry.key % chartColors.length]; - final pct = (genre.percentage * 100).round(); - - return Padding( - padding: EdgeInsets.only(bottom: entry.key < genres.length - 1 ? Spacing.md : 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + title: 'Reading by genre', + subtitle: switch (_provider.selectedPeriod) { + StatsPeriod.week => 'Books read this week', + StatsPeriod.month => 'Books read this month', + StatsPeriod.year => 'Books read this year', + StatsPeriod.allTime => 'All books read', + StatsPeriod.custom => 'Books read in this range', + }, + child: genres.isEmpty + ? const EmptyState.compact( + icon: Icons.category_outlined, + title: 'No genre data in this range', + ) + : Column( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(genre.genre, style: textTheme.bodySmall?.copyWith(color: colorScheme.onSurfaceVariant)), - Text('$pct%', style: textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600)), - ], - ), - const SizedBox(height: 4), - ClipRRect( - borderRadius: BorderRadius.circular(AppRadius.sm), - child: AppLinearProgressIndicator( - value: genre.percentage.clamp(0.0, 1.0), - minHeight: 6, - backgroundColor: colorScheme.surfaceContainerHighest, - color: color, + for (final genre in genres) + Padding( + padding: const EdgeInsets.only(bottom: Spacing.sm), + child: Semantics( + label: '${genre.genre}, ${genre.bookCount} books, ${(genre.percentage * 100).round()} percent', + child: ExcludeSemantics( + child: Column( + children: [ + _detail(context, genre.genre, '${(genre.percentage * 100).round()}%'), + AppLinearProgressIndicator( + value: genre.percentage.clamp(0, 1), + minHeight: 4, + color: colors.primary, + backgroundColor: colors.surfaceContainerHighest, + ), + ], + ), + ), + ), ), - ), ], ), - ); - }).toList(), - ), ); } - Widget _buildStreakRow( - BuildContext context, { - required IconData icon, - required Color iconColor, - required String label, - required String value, - bool isHighlighted = false, - }) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - - return Row( - children: [ - Icon(icon, size: 20, color: iconColor), - const SizedBox(width: Spacing.sm), - Text(label, style: textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant)), - const Spacer(), - Text( + Widget _detail(BuildContext context, String label, String value) => Padding( + padding: const EdgeInsets.symmetric(vertical: Spacing.sm), + child: LayoutBuilder( + builder: (context, constraints) { + final textTheme = Theme.of(context).textTheme; + final labelWidget = Text( + label, + style: textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), + ); + final valueWidget = Text( value, style: textTheme.bodyMedium?.copyWith( fontWeight: FontWeight.w600, - color: isHighlighted ? colorScheme.tertiary : null, + fontFeatures: const [FontFeature.tabularFigures()], ), - ), - ], - ); - } + ); - Widget _buildDesktopLayout(BuildContext context, StatisticsProvider provider) { - return Scaffold( - body: SafeArea( - child: SingleChildScrollView( - padding: const EdgeInsets.all(Spacing.xl), - child: Column( + if (constraints.maxWidth < MediaQuery.textScalerOf(context).scale(240)) { + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Period toggle - _buildPeriodSegmentedButton(context, provider), - // Custom range indicator - if (provider.hasCustomRange) ...[ - const SizedBox(height: Spacing.md), - _buildCustomRangeChip(context, provider), - ], - const SizedBox(height: Spacing.lg), - // Summary cards row - _buildDesktopSummaryRow(context, provider), - const SizedBox(height: Spacing.lg), - // Charts row: Reading time + Pages read - IntrinsicHeight( - child: Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: StatSectionCard( - title: 'Reading time', - isDesktop: true, - child: ReadingTimeBarChart( - activities: provider.readingTimeData, - isWeekly: provider.selectedPeriod == StatsPeriod.week, - isDesktop: true, - ), - ), - ), - const SizedBox(width: Spacing.lg), - Expanded( - child: StatSectionCard( - title: 'Pages read', - isDesktop: true, - child: PagesReadLineChart( - activities: provider.pagesReadData, - isWeekly: provider.selectedPeriod == StatsPeriod.week, - isDesktop: true, - ), - ), - ), - ], - ), - ), - const SizedBox(height: Spacing.lg), - // Second row: Genre + Books per month (if applicable) - if (provider.selectedPeriod == StatsPeriod.year || provider.selectedPeriod == StatsPeriod.allTime) - IntrinsicHeight( - child: Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded(child: _buildDesktopGenreDistributionCard(context, provider)), - const SizedBox(width: Spacing.lg), - Expanded( - child: StatSectionCard( - title: 'Books per month', - isDesktop: true, - child: BooksPerMonthChart(monthlyStats: provider.monthlyStats, isDesktop: true), - ), - ), - ], - ), - ) - else - _buildDesktopGenreDistributionCard(context, provider), - const SizedBox(height: Spacing.lg), - // Reading insights (session stats + streaks) - _buildInsightsCard(context, provider, isDesktop: true), + labelWidget, + const SizedBox(height: Spacing.xs), + valueWidget, ], - ), - ), - ), - ); - } - - Widget _buildDesktopSummaryRow(BuildContext context, StatisticsProvider provider) { - return Row( - children: [ - Expanded( - child: CompactStatCard(value: provider.totalBooks.toString(), label: 'Books', isDesktop: true), - ), - const SizedBox(width: Spacing.md), - Expanded( - child: CompactStatCard(value: provider.pagesRead.toString(), label: 'Pages', isDesktop: true), - ), - const SizedBox(width: Spacing.md), - Expanded( - child: CompactStatCard(value: provider.totalReadingLabel, label: 'Reading time', isDesktop: true), - ), - const SizedBox(width: Spacing.md), - Expanded( - child: CompactStatCard(value: provider.goalsCompleted.toString(), label: 'Goals', isDesktop: true), - ), - ], - ); - } + ); + } + + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: labelWidget), + const SizedBox(width: Spacing.md), + Expanded( + child: Align(alignment: AlignmentDirectional.centerEnd, child: valueWidget), + ), + ], + ); + }, + ), + ); - Widget _buildDesktopGenreDistributionCard(BuildContext context, StatisticsProvider provider) { - return _buildGenreBarsCard(context, provider, isDesktop: true); - } + String get _periodTitle => _provider.hasCustomRange ? 'Custom range' : _provider.periodLabel; - String _getPeriodLabel(StatsPeriod period) { - switch (period) { - case StatsPeriod.week: - return 'Week'; - case StatsPeriod.month: - return 'Month'; - case StatsPeriod.year: - return 'Year'; - case StatsPeriod.allTime: - return 'All time'; - case StatsPeriod.custom: - return 'Custom'; - } - } + String _periodLabel(StatsPeriod period) => switch (period) { + StatsPeriod.week => 'Week', + StatsPeriod.month => 'Month', + StatsPeriod.year => 'Year', + StatsPeriod.allTime => 'All time', + StatsPeriod.custom => 'Custom range', + }; - Future _showDateRangePicker(BuildContext context, StatisticsProvider provider) async { + Future _pickDates() async { final now = DateTime.now(); - final initialRange = provider.hasCustomRange - ? DateTimeRange(start: provider.customStartDate!, end: provider.customEndDate!) - : DateTimeRange(start: now.subtract(const Duration(days: 30)), end: now); - final picked = await showAppDateRangePicker( context: context, useRootNavigator: false, - initialDateRange: initialRange, - firstDate: DateTime(2020), + initialDateRange: DateTimeRange( + start: _provider.customStartDate ?? now.subtract(const Duration(days: 30)), + end: _provider.customEndDate ?? now, + ), + firstDate: DateTime(2000), lastDate: now, helpText: 'Select date range', - cancelText: 'Cancel', confirmText: 'Apply', saveText: 'Apply', - initialEntryMode: DatePickerEntryMode.calendarOnly, - builder: (context, child) { - return Dialog( - insetPadding: const EdgeInsets.symmetric(horizontal: Spacing.xl, vertical: Spacing.xl), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppRadius.xl)), - clipBehavior: Clip.antiAlias, - child: ConstrainedBox(constraints: const BoxConstraints(maxWidth: 400, maxHeight: 500), child: child), - ); - }, ); - if (picked != null) { - provider.setCustomDateRange(picked.start, picked.end); + if (picked != null && mounted) { + _provider.setCustomDateRange(picked.start, picked.end); } } } diff --git a/app/lib/providers/book_edit_provider.dart b/app/lib/providers/book_edit_provider.dart index abfc810a..c9d560a8 100644 --- a/app/lib/providers/book_edit_provider.dart +++ b/app/lib/providers/book_edit_provider.dart @@ -176,6 +176,26 @@ class BookEditProvider extends ChangeNotifier { notifyListeners(); } + void updateGenre(String value) { + final book = _editedBook; + + if (book == null) { + return; + } + + final metadata = Map.from(book.customMetadata ?? {}); + final genre = value.trim(); + + if (genre.isEmpty) { + metadata.remove('genre'); + } else { + metadata['genre'] = genre; + } + + _editedBook = book.copyWith(customMetadata: metadata); + notifyListeners(); + } + void updatePublisher(String? value) { if (_editedBook == null) { return; diff --git a/app/lib/providers/preferences_provider.dart b/app/lib/providers/preferences_provider.dart index 2fad0e64..b8ca7b95 100644 --- a/app/lib/providers/preferences_provider.dart +++ b/app/lib/providers/preferences_provider.dart @@ -16,6 +16,7 @@ class PreferencesProvider extends ChangeNotifier { // Theme static const _keyThemeMode = 'theme_mode'; + static const _keyPageAlignment = 'page_alignment'; // Reading static const _keyDefaultFont = 'default_font'; @@ -86,6 +87,20 @@ class PreferencesProvider extends ChangeNotifier { notifyListeners(); } + /// Page content alignment. Currently applied only by Statistics. + String get pageAlignment => _prefs.get(_keyPageAlignment) == 'center' ? 'center' : 'left'; + + set pageAlignment(String value) { + final alignment = value == 'center' ? 'center' : 'left'; + + if (pageAlignment == alignment) { + return; + } + + _prefs.setString(_keyPageAlignment, alignment); + notifyListeners(); + } + // -- Reading -------------------------------------------------------------- String get defaultFont => _prefs.getString(_keyDefaultFont) ?? 'Georgia'; diff --git a/app/lib/providers/statistics_provider.dart b/app/lib/providers/statistics_provider.dart index 6acf3498..2099673f 100644 --- a/app/lib/providers/statistics_provider.dart +++ b/app/lib/providers/statistics_provider.dart @@ -1,4 +1,5 @@ import 'package:flutter/foundation.dart'; +import 'package:intl/intl.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/models/daily_activity.dart'; import 'package:papyrus/models/genre_stats.dart'; @@ -11,6 +12,42 @@ import 'package:papyrus/goals/goal_progress.dart'; /// Time period for statistics filtering. enum StatsPeriod { week, month, year, allTime, custom } +enum StatisticsBucketSize { day, month, year } + +/// A chart interval with exact values and explicit calendar boundaries. +class StatisticsActivity extends DailyActivity { + StatisticsActivity({ + required super.date, + required this.endDate, + required this.seconds, + required this.pages, + required this.bucketSize, + required super.booksRead, + }) : super(readingMinutes: seconds ~/ 60, pagesRead: pages.floor()); + + final DateTime endDate; + final int seconds; + final double pages; + final StatisticsBucketSize bucketSize; + + double get minutes => seconds / 60; + + String get intervalLabel => switch (bucketSize) { + StatisticsBucketSize.day => DateFormat.yMMMd().format(date), + StatisticsBucketSize.month => DateFormat.yMMM().format(date), + StatisticsBucketSize.year => DateFormat.y().format(date), + }; + + String get axisLabel => switch (bucketSize) { + StatisticsBucketSize.day => DateFormat.MMMd().format(date), + StatisticsBucketSize.month => DateFormat('MMM yy').format(date), + StatisticsBucketSize.year => DateFormat.y().format(date), + }; + + @override + String get readingTimeLabel => seconds > 0 && seconds < 60 ? '${seconds}s' : super.readingTimeLabel; +} + /// Monthly reading statistics. class MonthlyStats { final int month; @@ -57,17 +94,29 @@ class SessionStats { final int totalSessions; final int totalMinutes; final int totalPages; + final int totalSeconds; - const SessionStats({required this.totalSessions, required this.totalMinutes, required this.totalPages}); + const SessionStats({ + required this.totalSessions, + required this.totalMinutes, + required this.totalPages, + int? totalSeconds, + }) : totalSeconds = totalSeconds ?? totalMinutes * 60; /// Average session duration in minutes. - double get averageSessionDuration => totalSessions > 0 ? totalMinutes / totalSessions : 0; + double get averageSessionDuration => totalSessions > 0 ? totalSeconds / 60 / totalSessions : 0; /// Reading velocity (pages per hour). double get pagesPerHour => totalMinutes > 0 ? (totalPages / totalMinutes) * 60 : 0; /// Formatted average session duration. String get averageSessionLabel { + final seconds = (averageSessionDuration * 60).round(); + + if (seconds > 0 && seconds < 60) { + return '${seconds}s'; + } + final avg = averageSessionDuration.round(); if (avg < 60) { @@ -91,6 +140,10 @@ class SessionStats { /// Provider for statistics page state management. /// Uses DataStore as the single source of truth. class StatisticsProvider extends ChangeNotifier { + StatisticsProvider({DateTime Function()? now}) : _now = now ?? DateTime.now; + + final DateTime Function() _now; + GoalProgress? _periodTotals; DataStore? _dataStore; // Loading state @@ -105,8 +158,8 @@ class StatisticsProvider extends ChangeNotifier { DateTime? _customEndDate; // Chart data - List _readingTimeData = []; - List _pagesReadData = []; + List _readingTimeData = []; + List _pagesReadData = []; List _monthlyStats = []; List _genreDistribution = []; ReadingStreak _streak = ReadingStreak.empty; @@ -183,7 +236,7 @@ class StatisticsProvider extends ChangeNotifier { } final range = _getDateRangeForPeriod(); - final now = DateTime.now().toUtc(); + final now = _now().toUtc(); final periods = {}; for (final record in _dataStore!.goalPeriods) { @@ -210,24 +263,50 @@ class StatisticsProvider extends ChangeNotifier { .length; } - /// Total reading minutes in the selected period. - int get totalReadingMinutes { - if (_dataStore == null) { - return 0; - } + int get totalReadingSeconds => _periodTotals?.seconds ?? 0; + int get totalReadingMinutes => totalReadingSeconds ~/ 60; + int get pagesRead => (_periodTotals?.pages ?? 0).floor(); + bool get hasEstimatedPages => _periodTotals?.estimated ?? false; + /// Uses the same five-minute qualification as reading-day goals and streaks. + int get daysRead => _periodTotals?.days ?? 0; + + Set get _readBookIds { final range = _getDateRangeForPeriod(); - return _dataStore!.activityTotals(range.start, range.end).seconds ~/ 60; + return { + for (final activity in _periodTotals?.activities ?? []) + if (activity.kind == 'reading') activity.bookId, + ..._completedBooks(range.start, range.end), + }; } - /// Pages read in the selected period. - int get pagesRead { - if (_dataStore == null) { - return 0; - } + int get booksRead => _readBookIds.length; + int get periodDays { final range = _getDateRangeForPeriod(); - return _dataStore!.activityTotals(range.start, range.end).pages.floor(); + return DateTime.utc( + range.end.year, + range.end.month, + range.end.day, + ).difference(DateTime.utc(range.start.year, range.start.month, range.start.day)).inDays.clamp(1, 1000000); + } + + String get activityIntervalLabel => switch (bucketSize) { + StatisticsBucketSize.day => 'Daily totals', + StatisticsBucketSize.month => 'Monthly totals', + StatisticsBucketSize.year => 'Yearly totals', + }; + + StatisticsBucketSize get bucketSize { + if (_selectedPeriod == StatsPeriod.year) { + return StatisticsBucketSize.month; + } + + if (periodDays <= 60) { + return StatisticsBucketSize.day; + } + + return periodDays <= 366 * 5 ? StatisticsBucketSize.month : StatisticsBucketSize.year; } /// Session statistics for the selected period. @@ -247,17 +326,26 @@ class StatisticsProvider extends ChangeNotifier { ), ); - return SessionStats(totalSessions: sessions.length, totalMinutes: totalReadingMinutes, totalPages: pagesRead); + return SessionStats( + totalSessions: sessions.length, + totalMinutes: totalReadingMinutes, + totalPages: pagesRead, + totalSeconds: totalReadingSeconds, + ); } - List get readingTimeData => _readingTimeData; - List get pagesReadData => _pagesReadData; + List get readingTimeData => _readingTimeData; + List get pagesReadData => _pagesReadData; List get monthlyStats => _monthlyStats; List get genreDistribution => _genreDistribution; ReadingStreak get streak => _streak; /// Total reading time formatted (e.g., "3.5h"). String get totalReadingLabel { + if (totalReadingSeconds > 0 && totalReadingSeconds < 60) { + return '${totalReadingSeconds}s'; + } + final hours = totalReadingMinutes / 60; if (hours < 1) { @@ -271,30 +359,19 @@ class StatisticsProvider extends ChangeNotifier { return '${hours.toStringAsFixed(1)}h'; } - /// Average reading time per day for the period. + /// Includes every calendar day in the selected period, including today. String get averageReadingLabel { - if (_readingTimeData.isEmpty) { - return '0m'; - } - - final avgMinutes = _readingTimeData.averageMinutes; + final seconds = (totalReadingSeconds / periodDays).round(); - if (avgMinutes < 60) { - return '${avgMinutes}m'; + if (seconds > 0 && seconds < 60) { + return '${seconds}s'; } - final hours = avgMinutes / 60; - return '${hours.toStringAsFixed(1)}h'; + final minutes = (seconds / 60).round(); + return minutes < 60 ? '${minutes}m' : '${(minutes / 60).toStringAsFixed(1)}h'; } - /// Average daily reading time in minutes. - int get averageDailyMinutes { - if (_readingTimeData.isEmpty) { - return 0; - } - - return _readingTimeData.averageMinutes; - } + int get averageDailyMinutes => (totalReadingSeconds / 60 / periodDays).round(); /// Period label for display. String get periodLabel { @@ -342,8 +419,6 @@ class StatisticsProvider extends ChangeNotifier { notifyListeners(); try { - // Simulate network delay for realistic UX - await Future.delayed(const Duration(milliseconds: 100)); _updateDataForPeriod(); _isLoading = false; notifyListeners(); @@ -384,7 +459,7 @@ class StatisticsProvider extends ChangeNotifier { } ({DateTime start, DateTime end}) _getDateRangeForPeriod() { - final now = DateTime.now(); + final now = _now(); switch (_selectedPeriod) { case StatsPeriod.week: @@ -398,11 +473,23 @@ class StatisticsProvider extends ChangeNotifier { case StatsPeriod.year: return (start: DateTime(now.year, 1, 1), end: DateTime(now.year, now.month, now.day + 1)); case StatsPeriod.allTime: - return (start: DateTime(2000), end: DateTime(now.year, now.month, now.day + 1)); + final trackedBooks = { + for (final activity in _dataStore?.readingActivities ?? []) + if (activity.kind == 'completion') activity.bookId, + }; + + final dates = [ + for (final activity in _dataStore?.effectiveReadingActivities ?? []) + activity.startTime.toLocal(), + for (final book in _dataStore?.books ?? []) + if (book.completedAt != null && !trackedBooks.contains(book.id)) book.completedAt!.toLocal(), + ].where((date) => !date.isAfter(now)).toList()..sort(); + final first = dates.isEmpty ? now : dates.first; + return (start: DateTime(first.year, first.month, first.day), end: DateTime(now.year, now.month, now.day + 1)); case StatsPeriod.custom: if (_customStartDate != null && _customEndDate != null) { return ( - start: _customStartDate!, + start: DateTime(_customStartDate!.year, _customStartDate!.month, _customStartDate!.day), end: DateTime(_customEndDate!.year, _customEndDate!.month, _customEndDate!.day + 1), ); } @@ -410,16 +497,28 @@ class StatisticsProvider extends ChangeNotifier { } } + ({DateTime start, DateTime end}) _getChartDateRange() { + final range = _getDateRangeForPeriod(); + final start = range.start; + final end = switch (_selectedPeriod) { + StatsPeriod.week => DateTime(start.year, start.month, start.day + 7), + StatsPeriod.month => DateTime(start.year, start.month + 1), + StatsPeriod.year => DateTime(start.year + 1), + StatsPeriod.allTime || StatsPeriod.custom => range.end, + }; + + return (start: start, end: end); + } + void _updateDataForPeriod() { - final books = _dataStore?.books ?? []; + final range = _getDateRangeForPeriod(); + _periodTotals = _dataStore?.activityTotals(range.start, range.end); + final readBookIds = _readBookIds; final genres = {}; - for (final book in books) { - final genre = book.customMetadata?['genre']; - - if (genre is String && genre.trim().isNotEmpty) { - genres.update(genre.trim(), (n) => n + 1, ifAbsent: () => 1); - } + for (final bookId in readBookIds) { + final genre = _dataStore?.getBook(bookId)?.genre ?? 'Unspecified'; + genres.update(genre, (count) => count + 1, ifAbsent: () => 1); } final count = genres.values.fold(0, (total, value) => total + value); @@ -428,7 +527,7 @@ class StatisticsProvider extends ChangeNotifier { .map((entry) => GenreStats(genre: entry.key, bookCount: entry.value, percentage: entry.value / count)) .toList(); - final now = DateTime.now(); + final now = _now(); final qualified = _dataStore?.activityTotals(DateTime.utc(1900), now.toUtc()).qualifiedDays.toList() ?? []; qualified.sort(); var best = 0; @@ -476,45 +575,71 @@ class StatisticsProvider extends ChangeNotifier { _pagesReadData = _readingTimeData; } - List _generateActivityData() { - if (_dataStore == null) { + List _generateActivityData() { + final store = _dataStore; + + if (store == null) { return []; } - final range = _getDateRangeForPeriod(); - final end = DateTime(range.end.year, range.end.month, range.end.day); - final count = end.difference(range.start).inDays.clamp(1, 60); - final first = DateTime(end.year, end.month, end.day - count); - - return List.generate(count, (i) { - final day = DateTime(first.year, first.month, first.day + i); - final totals = _dataStore!.activityTotals(day, DateTime(day.year, day.month, day.day + 1)); - - return DailyActivity( - date: day, - readingMinutes: totals.seconds ~/ 60, - pagesRead: totals.pages.floor(), - booksRead: _completedBooks(day, DateTime(day.year, day.month, day.day + 1)).toList(), + final range = _getChartDateRange(); + final elapsedEnd = _getDateRangeForPeriod().end; + final size = bucketSize; + final activities = []; + var cursor = range.start; + + while (cursor.isBefore(range.end)) { + final boundary = switch (size) { + StatisticsBucketSize.day => DateTime(cursor.year, cursor.month, cursor.day + 1), + StatisticsBucketSize.month => DateTime(cursor.year, cursor.month + 1), + StatisticsBucketSize.year => DateTime(cursor.year + 1), + }; + + final end = boundary.isAfter(range.end) ? range.end : boundary; + final dataEnd = end.isAfter(elapsedEnd) ? elapsedEnd : end; + final totals = cursor.isBefore(dataEnd) ? store.activityTotals(cursor, dataEnd) : null; + + activities.add( + StatisticsActivity( + date: cursor, + endDate: end, + seconds: totals?.seconds ?? 0, + pages: totals?.pages ?? 0, + bucketSize: size, + booksRead: cursor.isBefore(dataEnd) ? _completedBooks(cursor, dataEnd).toList() : const [], + ), ); - }); + + cursor = end; + } + + return activities; } List _generateMonthlyStats() { - final now = DateTime.now(); - - return List.generate(12, (i) { - final start = DateTime(now.year, now.month - i); - final end = DateTime(start.year, start.month + 1); - final totals = _dataStore?.activityTotals(start, end); - - return MonthlyStats( - month: start.month, - year: start.year, - booksRead: _completedBooks(start, end).length, - pagesRead: totals?.pages.floor() ?? 0, - readingMinutes: (totals?.seconds ?? 0) ~/ 60, + final range = _getDateRangeForPeriod(); + final months = []; + var cursor = range.start; + + while (cursor.isBefore(range.end)) { + final boundary = DateTime(cursor.year, cursor.month + 1); + final end = boundary.isAfter(range.end) ? range.end : boundary; + final totals = _dataStore?.activityTotals(cursor, end); + + months.add( + MonthlyStats( + month: cursor.month, + year: cursor.year, + booksRead: _completedBooks(cursor, end).length, + pagesRead: totals?.pages.floor() ?? 0, + readingMinutes: (totals?.seconds ?? 0) ~/ 60, + ), ); - }).reversed.toList(); + + cursor = end; + } + + return months; } String _formatShortDate(DateTime date) { diff --git a/app/lib/reader/reading_activity_tracker.dart b/app/lib/reader/reading_activity_tracker.dart index 0076e40f..e0deff94 100644 --- a/app/lib/reader/reading_activity_tracker.dart +++ b/app/lib/reader/reading_activity_tracker.dart @@ -37,7 +37,7 @@ class ReadingActivityTracker { bool _foreground = true; bool _disposed = false; DateTime? _started; - DateTime? _exposedSince; + final Map _exposedSince = {}; String _coverageKey = ''; final List _pending = []; Map? _pendingPatch; @@ -59,16 +59,12 @@ class ReadingActivityTracker { _event = event; _coverageKey = key; - if (changed) { - _exposedSince = null; - } - if (!_active) { _started = null; - _exposedSince = null; + _exposedSince.clear(); } else { _started ??= now; - _exposedSince ??= now; + _updateExposures(now); } if (event.locator != null) { @@ -80,6 +76,15 @@ class ReadingActivityTracker { } } + void _updateExposures(DateTime now) { + final keys = _event!.coverage.map((extent) => extent.key).toSet(); + _exposedSince.removeWhere((key, _) => !keys.contains(key)); + + for (final key in keys) { + _exposedSince.putIfAbsent(key, () => now); + } + } + void updateScope(List ids) { if (_disposed || ids.length == shelfIds.length && ids.every(shelfIds.contains)) { return; @@ -98,7 +103,12 @@ class ReadingActivityTracker { _capture(_now().toUtc()); _foreground = foreground; _started = _active ? _now().toUtc() : null; - _exposedSince = _started; + _exposedSince.clear(); + + if (_active) { + _updateExposures(_started!); + } + unawaited(_drain()); } @@ -127,29 +137,21 @@ class ReadingActivityTracker { final coverage = []; - if (_exposedSince != null && now.difference(_exposedSince!) >= exposureThreshold) { - for (final extent in _event!.coverage) { - if (extent.end <= extent.start) { - continue; - } - - final chapterCount = extent.chapterCount; - final pageCount = book.pageCount; + for (final extent in _event!.coverage) { + final exposedSince = _exposedSince[extent.key]; - if (chapterCount != null && (pageCount == null || pageCount <= 0)) { - continue; - } - - coverage.add( - PageCoverage( - key: '${book.id}:${extent.key}', - start: extent.start, - end: extent.end, - pagesPerUnit: chapterCount == null ? 1 : pageCount! / chapterCount, - estimated: chapterCount != null, - ), - ); + if (extent.end <= extent.start || exposedSince == null || now.difference(exposedSince) < exposureThreshold) { + continue; } + + coverage.add( + PageCoverage( + key: '${book.id}:${extent.key}', + start: 0, + end: 1, + pagesPerUnit: 1, + ), + ); } _pending.add( diff --git a/app/lib/widgets/book_details/book_info_grid.dart b/app/lib/widgets/book_details/book_info_grid.dart index 2b988c48..1cf4d26a 100644 --- a/app/lib/widgets/book_details/book_info_grid.dart +++ b/app/lib/widgets/book_details/book_info_grid.dart @@ -20,6 +20,11 @@ class BookInfoGrid extends StatelessWidget { List<_InfoEntry> _buildEntries() { final entries = <_InfoEntry>[]; entries.add(_InfoEntry('Format', book.formatLabel)); + final genre = book.genre; + + if (genre != null) { + entries.add(_InfoEntry('Genre', genre)); + } if (book.pageCount != null) { entries.add(_InfoEntry('Pages', '${book.pageCount}')); diff --git a/app/lib/widgets/goals/log_reading_sheet.dart b/app/lib/widgets/goals/log_reading_sheet.dart index dfd84ac7..28bdaf67 100644 --- a/app/lib/widgets/goals/log_reading_sheet.dart +++ b/app/lib/widgets/goals/log_reading_sheet.dart @@ -421,7 +421,7 @@ class ReadingActivityTile extends StatelessWidget { false => [ if (activity.seconds > 0) activity.seconds < 60 ? '${activity.seconds} sec' : '${activity.seconds ~/ 60} min', if (activity.pages > 0) '${activity.pages} pages', - if (activity.coverage.isNotEmpty) activity.isEstimated ? 'Estimated pages' : 'PDF pages', + if (activity.coverage.isNotEmpty) activity.isEstimated ? 'Estimated pages' : 'Reader pages', ].join(' · '), }; @@ -581,7 +581,7 @@ class _ActivityDetailsState extends State<_ActivityDetails> { final parts = [ if (activity.seconds > 0) _duration(activity.seconds), if (activity.pages > 0) '${activity.pages} ${activity.pages == 1 ? 'page' : 'pages'}', - if (activity.coverage.isNotEmpty) activity.isEstimated ? 'Estimated EPUB pages' : 'PDF pages', + if (activity.coverage.isNotEmpty) activity.isEstimated ? 'Estimated EPUB pages' : 'Reader pages', ]; return parts.isEmpty ? 'No reading time or pages recorded.' : parts.join(' · '); diff --git a/app/lib/widgets/profile/appearance_settings_section.dart b/app/lib/widgets/profile/appearance_settings_section.dart index ce0c10ce..52a3db35 100644 --- a/app/lib/widgets/profile/appearance_settings_section.dart +++ b/app/lib/widgets/profile/appearance_settings_section.dart @@ -43,6 +43,7 @@ class AppearanceSettingsSection extends StatelessWidget { children: [ const SettingsSectionHeader(title: 'Appearance'), SettingsRow(label: 'Theme', value: getThemeLabel(prefs.themeModePref), onTap: () => _showThemePicker(context)), + _buildPageAlignment(context), ], ); } @@ -52,10 +53,28 @@ class AppearanceSettingsSection extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ SettingsCard(title: 'Theme', children: [_buildThemeRadioGroup(context)]), + const SizedBox(height: Spacing.lg), + SettingsCard(title: 'Page layout', children: [_buildPageAlignment(context)]), ], ); } + Widget _buildPageAlignment(BuildContext context) { + final prefs = context.watch(); + + return SettingsRow( + label: 'Page alignment', + value: prefs.pageAlignment == 'center' ? 'Center' : 'Left', + onTap: () => showProfilePickerSheet( + context, + title: 'Page alignment', + items: const [('Left', 'left'), ('Center', 'center')], + selected: prefs.pageAlignment, + onSelected: (value) => prefs.pageAlignment = value, + ), + ); + } + Widget _buildThemeRadioGroup(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; diff --git a/app/lib/widgets/statistics/reading_charts.dart b/app/lib/widgets/statistics/reading_charts.dart index af02018f..67c38c2a 100644 --- a/app/lib/widgets/statistics/reading_charts.dart +++ b/app/lib/widgets/statistics/reading_charts.dart @@ -8,80 +8,14 @@ import 'package:papyrus/providers/statistics_provider.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/themes/app_motion.dart'; -/// A bucket of aggregated daily activities (e.g., a week). -class _AggregatedBucket { - final DateTime startDate; - final DateTime endDate; - final int totalMinutes; - final int totalPages; - final int dayCount; - - const _AggregatedBucket({ - required this.startDate, - required this.endDate, - required this.totalMinutes, - required this.totalPages, - required this.dayCount, - }); - - bool get containsToday { - final now = DateTime.now(); - final today = DateTime(now.year, now.month, now.day); - return !today.isBefore(startDate) && !today.isAfter(endDate); - } - - String get label { - if (startDate.month == endDate.month) { - return '${_months[startDate.month - 1]} ${startDate.day}-${endDate.day}'; - } - - return '${_months[startDate.month - 1]} ${startDate.day} - ${_months[endDate.month - 1]} ${endDate.day}'; - } -} - -/// Aggregates daily activities into weekly buckets. -List<_AggregatedBucket> _aggregateWeekly(List activities) { - if (activities.isEmpty) { - return []; - } - - final buckets = <_AggregatedBucket>[]; - var bucketStart = 0; - - while (bucketStart < activities.length) { - var bucketEnd = bucketStart; - - while (bucketEnd + 1 < activities.length) { - final nextDate = activities[bucketEnd + 1].date; - - if (nextDate.weekday == DateTime.monday && bucketEnd > bucketStart) { - break; - } +double _readingMinutes(DailyActivity activity) => + activity is StatisticsActivity ? activity.minutes : activity.readingMinutes.toDouble(); - if (bucketEnd - bucketStart >= 6) { - break; - } +double _pagesRead(DailyActivity activity) => + activity is StatisticsActivity ? activity.pages : activity.pagesRead.toDouble(); - bucketEnd++; - } - - final slice = activities.sublist(bucketStart, bucketEnd + 1); - - buckets.add( - _AggregatedBucket( - startDate: slice.first.date, - endDate: slice.last.date, - totalMinutes: slice.fold(0, (total, item) => total + item.readingMinutes), - totalPages: slice.fold(0, (total, item) => total + item.pagesRead), - dayCount: slice.length, - ), - ); - - bucketStart = bucketEnd + 1; - } - - return buckets; -} +String _activityLabel(DailyActivity activity) => + activity is StatisticsActivity ? activity.intervalLabel : activity.dayName; const _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; @@ -91,8 +25,12 @@ String _formatMinutesLabel(double value) { return '0'; } + if (value < 1) { + return '${(value * 60).round()}s'; + } + if (value < 60) { - return '${value.round()}m'; + return value == value.roundToDouble() ? '${value.round()}m' : '${value.toStringAsFixed(1)}m'; } final hours = value / 60; @@ -114,13 +52,33 @@ String _formatPagesLabel(double value) { } /// Computes a nice Y-axis interval and maxY that align cleanly. -({double interval, double maxY}) _niceYAxis(double maxValue) { +({double interval, double maxY}) _niceYAxis(double maxValue, {bool minutes = false}) { if (maxValue <= 0) { - return (interval: 15.0, maxY: 60.0); + return (interval: 1.0, maxY: 4.0); } - final rawInterval = maxValue / 3; - const niceSteps = [5, 10, 15, 20, 25, 30, 50, 60, 100, 120, 150, 200, 250, 300, 500, 1000]; + final rawInterval = maxValue / 4; + final niceSteps = [ + if (minutes) ...[1 / 60, 5 / 60, 10 / 60, 15 / 60, 30 / 60], + 1, + 2, + 5, + 10, + 15, + 20, + 25, + 30, + 50, + 60, + 100, + 120, + 150, + 200, + 250, + 300, + 500, + 1000, + ]; var interval = (rawInterval / 100).ceil() * 100.0; for (final step in niceSteps) { @@ -130,7 +88,7 @@ String _formatPagesLabel(double value) { } } - final maxY = (maxValue / interval).ceil() * interval; + final maxY = math.max(3, (maxValue / interval).ceil()) * interval; return (interval: interval, maxY: maxY); } @@ -140,94 +98,118 @@ Widget _buildYAxisLabel(double value, TextTheme textTheme, ColorScheme colorSche padding: const EdgeInsets.only(right: 4), child: Text( formatter(value), - style: textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant, fontSize: 10), + style: textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant), ), ); } -/// Builds a bottom axis label for chart data points. -Widget _buildBottomLabel(double value, List activities, TextTheme textTheme, ColorScheme colorScheme) { - final idx = value.toInt(); - - if (idx < 0 || idx >= activities.length) { - return const SizedBox.shrink(); +String _activityAxisLabel(DailyActivity activity, int index, int count) { + if (activity is StatisticsActivity && activity.bucketSize != StatisticsBucketSize.day) { + return activity.axisLabel; } - final activity = activities[idx]; - final count = activities.length; - String? label; - if (count <= 7) { - label = activity.dayInitial; - } else if (count <= 31) { - final day = activity.date.day; - final interval = count > 14 ? 5 : 3; + return activity.dayLabel; + } - if (day == 1 || day % interval == 0 || idx == count - 1) { - label = '${activity.date.day}'; - } - } else { - if (idx == 0 || activities[idx].date.month != activities[idx - 1].date.month) { - label = _months[activity.date.month - 1]; - } + if (index == 0 || index == count - 1 || activity.date.day == 1) { + return '${_months[activity.date.month - 1]} ${activity.date.day}'; } - if (label == null) { - return const SizedBox.shrink(); + return '${activity.date.day}'; +} + +int _bottomLabelStep(BuildContext context, double width, List activities) { + final textScaler = MediaQuery.textScalerOf(context); + final availableWidth = math.max(1.0, width - textScaler.scale(60)); + final style = Theme.of(context).textTheme.labelSmall?.copyWith(fontWeight: FontWeight.bold); + var labelWidth = 0.0; + + for (var index = 0; index < activities.length; index++) { + final painter = TextPainter( + text: TextSpan(text: _activityAxisLabel(activities[index], index, activities.length), style: style), + textDirection: Directionality.of(context), + textScaler: textScaler, + )..layout(); + + labelWidth = math.max(labelWidth, painter.width); + painter.dispose(); } - return Padding( - padding: const EdgeInsets.only(top: 8), - child: Text( - label, - style: textTheme.labelSmall?.copyWith( - color: activity.isToday ? colorScheme.primary : colorScheme.onSurfaceVariant, - fontWeight: activity.isToday ? FontWeight.bold : FontWeight.normal, - fontSize: 10, - ), - ), - ); + final bucketWidth = availableWidth / math.max(1, activities.length); + final step = math.max(1, ((labelWidth + 12) / bucketWidth).ceil()); + return step; } -/// Builds a bottom axis label for aggregated weekly buckets. -Widget _buildBucketBottomLabel( +/// Builds a bottom axis label for chart data points. +Widget _buildBottomLabel( double value, - List<_AggregatedBucket> buckets, + List activities, TextTheme textTheme, - ColorScheme colorScheme, -) { - final idx = value.toInt(); + ColorScheme colorScheme, { + int labelStep = 1, +}) { + final index = value.toInt(); - if (idx < 0 || idx >= buckets.length) { + if (index < 0 || index >= activities.length || value != index.toDouble()) { return const SizedBox.shrink(); } - final bucket = buckets[idx]; - - if (idx > 0 && buckets[idx].startDate.month == buckets[idx - 1].startDate.month) { - return const SizedBox.shrink(); - } - - return Padding( - padding: const EdgeInsets.only(top: 8), - child: Text( - _months[bucket.startDate.month - 1], - style: textTheme.labelSmall?.copyWith( - color: bucket.containsToday ? colorScheme.primary : colorScheme.onSurfaceVariant, - fontWeight: bucket.containsToday ? FontWeight.bold : FontWeight.normal, - fontSize: 10, + final count = activities.length; + final showLabel = (count - 1 - index) % labelStep == 0; + final activity = activities[index]; + final label = _activityAxisLabel(activity, index, count); + + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + key: ValueKey('activity-axis-tick-$index'), + width: 1, + height: 4, + color: colorScheme.outline, ), - ), + if (showLabel) ...[ + const SizedBox(height: 4), + Text( + label, + style: textTheme.labelSmall?.copyWith( + color: activity.isToday ? colorScheme.primary : colorScheme.onSurfaceVariant, + fontWeight: activity.isToday ? FontWeight.bold : FontWeight.normal, + ), + ), + ], + ], ); } -/// A bar chart displaying reading time data using fl_chart. -class ReadingTimeBarChart extends StatelessWidget { +enum ReadingActivityMetric { time, pages } + +/// Shared plotting and axes keep Time and Pages visually consistent. +class ReadingActivityBarChart extends StatelessWidget { final List activities; - final bool isWeekly; + final ReadingActivityMetric metric; final bool isDesktop; - const ReadingTimeBarChart({super.key, required this.activities, this.isWeekly = true, this.isDesktop = false}); + const ReadingActivityBarChart({ + super.key, + required this.activities, + this.metric = ReadingActivityMetric.time, + this.isDesktop = false, + }); + + double _value(DailyActivity activity) => + metric == ReadingActivityMetric.time ? _readingMinutes(activity) : _pagesRead(activity); + + String _valueLabel(DailyActivity activity) { + if (metric == ReadingActivityMetric.time) { + return activity.readingTimeLabel; + } + + final pages = _pagesRead(activity); + final count = pages == pages.roundToDouble() ? '${pages.round()}' : pages.toStringAsFixed(1); + return '$count ${pages == 1 ? 'page' : 'pages'}'; + } @override Widget build(BuildContext context) { @@ -235,32 +217,26 @@ class ReadingTimeBarChart extends StatelessWidget { return _buildEmptyState(context); } - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - final chartHeight = isDesktop ? 200.0 : 160.0; - - if (activities.length > 21) { - return _buildAggregatedChart(context, colorScheme, textTheme, chartHeight); - } - - return _buildDailyChart(context, colorScheme, textTheme, chartHeight); + return _buildDailyChart(context, Theme.of(context).colorScheme, Theme.of(context).textTheme, isDesktop ? 200 : 160); } Widget _buildDailyChart(BuildContext context, ColorScheme colorScheme, TextTheme textTheme, double chartHeight) { - final maxMinutes = activities.maxMinutes.toDouble(); - final yAxis = _niceYAxis(maxMinutes); + final maxValue = activities.map(_value).reduce(math.max); + final yAxis = _niceYAxis(maxValue, minutes: metric == ReadingActivityMetric.time); return SizedBox( height: chartHeight, child: LayoutBuilder( builder: (context, constraints) { - final availableWidth = constraints.maxWidth - 60; + final availableWidth = constraints.maxWidth - MediaQuery.textScalerOf(context).scale(60); final barWidth = (availableWidth / activities.length * 0.6).clamp(4.0, isDesktop ? 20.0 : 16.0); + final labelStep = _bottomLabelStep(context, constraints.maxWidth, activities); return BarChart( - key: ValueKey(AppMotion.disabled(context)), + key: ValueKey((AppMotion.disabled(context), metric)), BarChartData( alignment: BarChartAlignment.spaceAround, + minY: 0, maxY: yAxis.maxY, barTouchData: BarTouchData( enabled: true, @@ -271,7 +247,7 @@ class ReadingTimeBarChart extends StatelessWidget { final activity = activities[groupIndex]; return BarTooltipItem( - '${activity.dayName}\n${activity.readingTimeLabel}', + '${_activityLabel(activity)}\n${_valueLabel(activity)}', textTheme.bodySmall!.copyWith(color: colorScheme.onInverseSurface), ); }, @@ -284,17 +260,28 @@ class ReadingTimeBarChart extends StatelessWidget { bottomTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, - getTitlesWidget: (value, meta) => _buildBottomLabel(value, activities, textTheme, colorScheme), - reservedSize: 28, + interval: 1, + getTitlesWidget: (value, meta) => _buildBottomLabel( + value, + activities, + textTheme, + colorScheme, + labelStep: labelStep, + ), + reservedSize: MediaQuery.textScalerOf(context).scale(28), ), ), leftTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, - reservedSize: 40, + reservedSize: MediaQuery.textScalerOf(context).scale(40), interval: yAxis.interval, - getTitlesWidget: (value, meta) => - _buildYAxisLabel(value, textTheme, colorScheme, _formatMinutesLabel), + getTitlesWidget: (value, meta) => _buildYAxisLabel( + value, + textTheme, + colorScheme, + metric == ReadingActivityMetric.time ? _formatMinutesLabel : _formatPagesLabel, + ), ), ), ), @@ -303,115 +290,25 @@ class ReadingTimeBarChart extends StatelessWidget { drawVerticalLine: false, horizontalInterval: yAxis.interval, getDrawingHorizontalLine: (value) => - FlLine(color: colorScheme.outlineVariant.withValues(alpha: 0.5), strokeWidth: 1), + FlLine(color: colorScheme.outline.withValues(alpha: 0.7), strokeWidth: 1), ), - borderData: FlBorderData(show: false), - barGroups: activities.asMap().entries.map((entry) { - final index = entry.key; - final activity = entry.value; - - return BarChartGroupData( - x: index, - barRods: [ - BarChartRodData( - toY: activity.readingMinutes.toDouble(), - color: activity.isToday ? colorScheme.primary : colorScheme.primary.withValues(alpha: 0.6), - width: barWidth, - borderRadius: const BorderRadius.vertical(top: Radius.circular(4)), - ), - ], - ); - }).toList(), - ), - duration: AppMotion.duration(context, AnimationDurations.standard), - ); - }, - ), - ); - } - - Widget _buildAggregatedChart(BuildContext context, ColorScheme colorScheme, TextTheme textTheme, double chartHeight) { - final buckets = _aggregateWeekly(activities); - - if (buckets.isEmpty) { - return _buildEmptyState(context); - } - - final maxMinutes = buckets - .map((item) => item.totalMinutes) - .reduce((total, value) => math.max(total, value)) - .toDouble(); - - final yAxis = _niceYAxis(maxMinutes); - - return SizedBox( - height: chartHeight, - child: LayoutBuilder( - builder: (context, constraints) { - final availableWidth = constraints.maxWidth - 60; - final barWidth = (availableWidth / buckets.length * 0.6).clamp(6.0, isDesktop ? 24.0 : 18.0); - - return BarChart( - key: ValueKey(AppMotion.disabled(context)), - BarChartData( - alignment: BarChartAlignment.spaceAround, - maxY: yAxis.maxY, - barTouchData: BarTouchData( - enabled: true, - touchTooltipData: BarTouchTooltipData( - getTooltipColor: (group) => colorScheme.inverseSurface, - tooltipRoundedRadius: AppRadius.md, - getTooltipItem: (group, groupIndex, rod, rodIndex) { - final bucket = buckets[groupIndex]; - final hours = bucket.totalMinutes / 60; - final timeLabel = hours >= 1 ? '${hours.toStringAsFixed(1)}h' : '${bucket.totalMinutes}m'; - - return BarTooltipItem( - '${bucket.label}\n$timeLabel total', - textTheme.bodySmall!.copyWith(color: colorScheme.onInverseSurface), - ); - }, - ), - ), - titlesData: FlTitlesData( + borderData: FlBorderData( show: true, - rightTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), - topTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), - bottomTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - getTitlesWidget: (value, meta) => _buildBucketBottomLabel(value, buckets, textTheme, colorScheme), - reservedSize: 28, - ), - ), - leftTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - reservedSize: 40, - interval: yAxis.interval, - getTitlesWidget: (value, meta) => - _buildYAxisLabel(value, textTheme, colorScheme, _formatMinutesLabel), - ), + border: Border( + top: BorderSide(color: colorScheme.outline.withValues(alpha: 0.7)), + bottom: BorderSide(color: colorScheme.outline), ), ), - gridData: FlGridData( - show: true, - drawVerticalLine: false, - horizontalInterval: yAxis.interval, - getDrawingHorizontalLine: (value) => - FlLine(color: colorScheme.outlineVariant.withValues(alpha: 0.5), strokeWidth: 1), - ), - borderData: FlBorderData(show: false), - barGroups: buckets.asMap().entries.map((entry) { + barGroups: activities.asMap().entries.map((entry) { final index = entry.key; - final bucket = entry.value; + final activity = entry.value; return BarChartGroupData( x: index, barRods: [ BarChartRodData( - toY: bucket.totalMinutes.toDouble(), - color: bucket.containsToday ? colorScheme.primary : colorScheme.primary.withValues(alpha: 0.6), + toY: _value(activity), + color: activity.isToday ? colorScheme.primary : colorScheme.primary.withValues(alpha: 0.6), width: barWidth, borderRadius: const BorderRadius.vertical(top: Radius.circular(4)), ), @@ -434,231 +331,6 @@ class ReadingTimeBarChart extends StatelessWidget { } } -/// A line chart displaying pages read trends using fl_chart. -class PagesReadLineChart extends StatelessWidget { - final List activities; - final bool isWeekly; - final bool isDesktop; - - const PagesReadLineChart({super.key, required this.activities, this.isWeekly = true, this.isDesktop = false}); - - @override - Widget build(BuildContext context) { - if (activities.isEmpty) { - return _buildEmptyState(context); - } - - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - final chartHeight = isDesktop ? 200.0 : 160.0; - - if (activities.length > 21) { - return _buildAggregatedChart(context, colorScheme, textTheme, chartHeight); - } - - return _buildDailyChart(context, colorScheme, textTheme, chartHeight); - } - - Widget _buildDailyChart(BuildContext context, ColorScheme colorScheme, TextTheme textTheme, double chartHeight) { - final maxPages = activities - .map((item) => item.pagesRead) - .reduce((total, value) => math.max(total, value)) - .toDouble(); - - final yAxis = _niceYAxis(maxPages); - - final spots = activities.asMap().entries.map((entry) { - return FlSpot(entry.key.toDouble(), entry.value.pagesRead.toDouble()); - }).toList(); - - final showDots = activities.length <= 14; - - return SizedBox( - height: chartHeight, - child: LineChart( - key: ValueKey(AppMotion.disabled(context)), - LineChartData( - minY: 0, - maxY: yAxis.maxY, - lineTouchData: LineTouchData( - enabled: true, - touchTooltipData: LineTouchTooltipData( - getTooltipColor: (spot) => colorScheme.inverseSurface, - tooltipRoundedRadius: AppRadius.md, - getTooltipItems: (touchedSpots) { - return touchedSpots.map((spot) { - final activity = activities[spot.x.toInt()]; - - return LineTooltipItem( - '${activity.dayName}\n${activity.pagesRead} pages', - textTheme.bodySmall!.copyWith(color: colorScheme.onInverseSurface), - ); - }).toList(); - }, - ), - ), - titlesData: FlTitlesData( - show: true, - rightTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), - topTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), - bottomTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - interval: 1, - getTitlesWidget: (value, meta) => _buildBottomLabel(value, activities, textTheme, colorScheme), - reservedSize: 28, - ), - ), - leftTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - reservedSize: 40, - interval: yAxis.interval, - getTitlesWidget: (value, meta) => _buildYAxisLabel(value, textTheme, colorScheme, _formatPagesLabel), - ), - ), - ), - gridData: FlGridData( - show: true, - drawVerticalLine: false, - horizontalInterval: yAxis.interval, - getDrawingHorizontalLine: (value) => - FlLine(color: colorScheme.outlineVariant.withValues(alpha: 0.5), strokeWidth: 1), - ), - borderData: FlBorderData(show: false), - lineBarsData: [ - LineChartBarData( - spots: spots, - isCurved: true, - curveSmoothness: 0.3, - color: colorScheme.tertiary, - barWidth: 2.5, - isStrokeCapRound: true, - dotData: FlDotData( - show: showDots, - getDotPainter: (spot, percent, barData, index) { - return FlDotCirclePainter( - radius: 3, - color: colorScheme.tertiary, - strokeWidth: 2, - strokeColor: colorScheme.surface, - ); - }, - ), - belowBarData: BarAreaData(show: true, color: colorScheme.tertiary.withValues(alpha: 0.1)), - ), - ], - ), - duration: AppMotion.duration(context, AnimationDurations.standard), - ), - ); - } - - Widget _buildAggregatedChart(BuildContext context, ColorScheme colorScheme, TextTheme textTheme, double chartHeight) { - final buckets = _aggregateWeekly(activities); - - if (buckets.isEmpty) { - return _buildEmptyState(context); - } - - final maxPages = buckets.map((item) => item.totalPages).reduce((total, value) => math.max(total, value)).toDouble(); - final yAxis = _niceYAxis(maxPages); - - final spots = buckets.asMap().entries.map((entry) { - return FlSpot(entry.key.toDouble(), entry.value.totalPages.toDouble()); - }).toList(); - - final showDots = buckets.length <= 14; - - return SizedBox( - height: chartHeight, - child: LineChart( - key: ValueKey(AppMotion.disabled(context)), - LineChartData( - minY: 0, - maxY: yAxis.maxY, - lineTouchData: LineTouchData( - enabled: true, - touchTooltipData: LineTouchTooltipData( - getTooltipColor: (spot) => colorScheme.inverseSurface, - tooltipRoundedRadius: AppRadius.md, - getTooltipItems: (touchedSpots) { - return touchedSpots.map((spot) { - final bucket = buckets[spot.x.toInt()]; - - return LineTooltipItem( - '${bucket.label}\n${bucket.totalPages} pages', - textTheme.bodySmall!.copyWith(color: colorScheme.onInverseSurface), - ); - }).toList(); - }, - ), - ), - titlesData: FlTitlesData( - show: true, - rightTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), - topTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), - bottomTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - interval: 1, - getTitlesWidget: (value, meta) => _buildBucketBottomLabel(value, buckets, textTheme, colorScheme), - reservedSize: 28, - ), - ), - leftTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - reservedSize: 40, - interval: yAxis.interval, - getTitlesWidget: (value, meta) => _buildYAxisLabel(value, textTheme, colorScheme, _formatPagesLabel), - ), - ), - ), - gridData: FlGridData( - show: true, - drawVerticalLine: false, - horizontalInterval: yAxis.interval, - getDrawingHorizontalLine: (value) => - FlLine(color: colorScheme.outlineVariant.withValues(alpha: 0.5), strokeWidth: 1), - ), - borderData: FlBorderData(show: false), - lineBarsData: [ - LineChartBarData( - spots: spots, - isCurved: true, - curveSmoothness: 0.3, - color: colorScheme.tertiary, - barWidth: 2.5, - isStrokeCapRound: true, - dotData: FlDotData( - show: showDots, - getDotPainter: (spot, percent, barData, index) { - return FlDotCirclePainter( - radius: 3, - color: colorScheme.tertiary, - strokeWidth: 2, - strokeColor: colorScheme.surface, - ); - }, - ), - belowBarData: BarAreaData(show: true, color: colorScheme.tertiary.withValues(alpha: 0.1)), - ), - ], - ), - duration: AppMotion.duration(context, AnimationDurations.standard), - ), - ); - } - - Widget _buildEmptyState(BuildContext context) { - return SizedBox( - height: isDesktop ? 200 : 160, - child: const EmptyState.compact(icon: Icons.bar_chart_outlined, title: 'No reading data for this period'), - ); - } -} - /// A bar chart displaying books read per month using fl_chart. class BooksPerMonthChart extends StatelessWidget { final List monthlyStats; @@ -682,8 +354,7 @@ class BooksPerMonthChart extends StatelessWidget { final chartHeight = isDesktop ? 200.0 : 160.0; - // Take last 6 months for display - final displayStats = monthlyStats.length > 6 ? monthlyStats.sublist(monthlyStats.length - 6) : monthlyStats; + final displayStats = monthlyStats; return SizedBox( height: chartHeight, @@ -706,7 +377,7 @@ class BooksPerMonthChart extends StatelessWidget { final stats = displayStats[groupIndex]; return BarTooltipItem( - '${stats.fullMonthLabel}\n${stats.booksRead} books', + '${stats.fullMonthLabel} ${stats.year}\n${stats.booksRead} books', textTheme.bodySmall!.copyWith(color: colorScheme.onInverseSurface), ); }, @@ -729,12 +400,12 @@ class BooksPerMonthChart extends StatelessWidget { return Padding( padding: const EdgeInsets.only(top: 8), child: Text( - stats.monthLabel, - style: textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant, fontSize: 10), + '${stats.monthLabel} ${stats.year % 100}', + style: textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant), ), ); }, - reservedSize: 28, + reservedSize: MediaQuery.textScalerOf(context).scale(28), ), ), leftTitles: AxisTitles( @@ -748,7 +419,7 @@ class BooksPerMonthChart extends StatelessWidget { padding: const EdgeInsets.only(right: 4), child: Text( '${value.toInt()}', - style: textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant, fontSize: 10), + style: textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant), ), ); } @@ -763,9 +434,12 @@ class BooksPerMonthChart extends StatelessWidget { drawVerticalLine: false, horizontalInterval: 1, getDrawingHorizontalLine: (value) => - FlLine(color: colorScheme.outlineVariant.withValues(alpha: 0.5), strokeWidth: 1), + FlLine(color: colorScheme.outline.withValues(alpha: 0.7), strokeWidth: 1), + ), + borderData: FlBorderData( + show: true, + border: Border(bottom: BorderSide(color: colorScheme.outline)), ), - borderData: FlBorderData(show: false), barGroups: displayStats.asMap().entries.map((entry) { final index = entry.key; final stats = entry.value; diff --git a/app/lib/widgets/statistics/stat_card.dart b/app/lib/widgets/statistics/stat_card.dart index 932826ed..9d43212c 100644 --- a/app/lib/widgets/statistics/stat_card.dart +++ b/app/lib/widgets/statistics/stat_card.dart @@ -171,6 +171,7 @@ class CompactStatCard extends StatelessWidget { class StatSectionCard extends StatelessWidget { /// The section title. final String title; + final String? subtitle; /// Optional action widget (e.g., button). final Widget? action; @@ -181,28 +182,56 @@ class StatSectionCard extends StatelessWidget { /// Whether to use desktop styling. final bool isDesktop; - const StatSectionCard({super.key, required this.title, this.action, required this.child, this.isDesktop = false}); + const StatSectionCard({ + super.key, + required this.title, + this.action, + this.subtitle, + required this.child, + this.isDesktop = false, + }); @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; final textTheme = Theme.of(context).textTheme; + final shape = Theme.of(context).cardTheme.shape; + return Container( padding: EdgeInsets.all(isDesktop ? Spacing.lg : Spacing.md), - decoration: BoxDecoration( + decoration: ShapeDecoration( color: colorScheme.surfaceContainerLow, - borderRadius: BorderRadius.circular(AppRadius.xl), - border: Border.all(color: colorScheme.outlineVariant, width: BorderWidths.thin), + shape: (shape is OutlinedBorder ? shape : const RoundedRectangleBorder()).copyWith( + side: BorderSide(color: colorScheme.outlineVariant, width: BorderWidths.thin), + ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(title, style: textTheme.titleMedium), - ?action, + Expanded( + flex: 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: textTheme.titleMedium), + if (subtitle != null) ...[ + const SizedBox(height: Spacing.xs), + Text(subtitle!, style: textTheme.bodySmall?.copyWith(color: colorScheme.onSurfaceVariant)), + ], + ], + ), + ), + if (action != null) ...[ + const SizedBox(width: Spacing.sm), + Expanded( + flex: 1, + child: Align(alignment: AlignmentDirectional.centerEnd, child: action!), + ), + ], ], ), const SizedBox(height: Spacing.md), diff --git a/app/lib/widgets/statistics/statistics_row.dart b/app/lib/widgets/statistics/statistics_row.dart new file mode 100644 index 00000000..9f61dd86 --- /dev/null +++ b/app/lib/widgets/statistics/statistics_row.dart @@ -0,0 +1,72 @@ +import 'dart:math' as math; + +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:papyrus/themes/design_tokens.dart'; + +/// Equal-height panels whose contents may use LayoutBuilder or scroll views. +/// Measure real layouts instead of requesting unsupported intrinsic dimensions. +class StatisticsRow extends MultiChildRenderObjectWidget { + StatisticsRow({super.key, required Widget main, required Widget aside}) : super(children: [main, aside]); + + @override + RenderObject createRenderObject(BuildContext context) => _RenderStatisticsRow(Directionality.of(context)); + + @override + void updateRenderObject(BuildContext context, covariant RenderObject renderObject) { + (renderObject as _RenderStatisticsRow).textDirection = Directionality.of(context); + } +} + +class _StatisticsParentData extends ContainerBoxParentData {} + +class _RenderStatisticsRow extends RenderBox + with + ContainerRenderObjectMixin, + RenderBoxContainerDefaultsMixin { + _RenderStatisticsRow(this._textDirection); + + TextDirection _textDirection; + + set textDirection(TextDirection value) { + if (value != _textDirection) { + _textDirection = value; + markNeedsLayout(); + } + } + + @override + void setupParentData(RenderBox child) { + if (child.parentData is! _StatisticsParentData) { + child.parentData = _StatisticsParentData(); + } + } + + @override + void performLayout() { + final main = firstChild!; + final aside = lastChild!; + final available = constraints.maxWidth - Spacing.lg; + final mainWidth = available * 5 / 8; + final asideWidth = available - mainWidth; + main.layout(BoxConstraints.tightFor(width: mainWidth), parentUsesSize: true); + aside.layout(BoxConstraints.tightFor(width: asideWidth), parentUsesSize: true); + final height = math.max(main.size.height, aside.size.height); + // A minimum height keeps content changes bubbling up during expansion. + // Tight height constraints would make each panel a separate layout boundary. + main.layout(BoxConstraints(minWidth: mainWidth, maxWidth: mainWidth, minHeight: height), parentUsesSize: true); + aside.layout(BoxConstraints(minWidth: asideWidth, maxWidth: asideWidth, minHeight: height), parentUsesSize: true); + final mainData = main.parentData! as ContainerBoxParentData; + final asideData = aside.parentData! as ContainerBoxParentData; + mainData.offset = Offset(_textDirection == TextDirection.ltr ? 0 : asideWidth + Spacing.lg, 0); + asideData.offset = Offset(_textDirection == TextDirection.ltr ? mainWidth + Spacing.lg : 0, 0); + size = constraints.constrain(Size(constraints.maxWidth, height)); + } + + @override + void paint(PaintingContext context, Offset offset) => defaultPaint(context, offset); + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) => + defaultHitTestChildren(result, position: position); +} diff --git a/app/test/pages/book_edit_page_layout_test.dart b/app/test/pages/book_edit_page_layout_test.dart index 66670a63..a2dc3418 100644 --- a/app/test/pages/book_edit_page_layout_test.dart +++ b/app/test/pages/book_edit_page_layout_test.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/pages/book_edit_page.dart'; +import 'package:papyrus/providers/book_edit_provider.dart'; +import 'package:papyrus/widgets/book_details/book_info_grid.dart'; +import 'package:provider/provider.dart'; import 'package:papyrus/themes/app_theme.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/book_edit/cover_image_picker.dart'; @@ -43,6 +46,29 @@ void main() { await tester.pumpAndSettle(); } + for (final width in [390.0, 1400.0]) { + testWidgets('genre can be edited and cleared at $width', (tester) async { + await pumpPage(tester, size: Size(width, 1000)); + final field = find.ancestor(of: find.text('Genre'), matching: find.byType(TextFormField)); + await tester.ensureVisible(field); + await tester.enterText(field, 'Science fiction'); + final editor = tester.element(field).read(); + expect(editor.editedBook?.genre, 'Science fiction'); + expect(await editor.save(), isTrue); + final saved = editor.editedBook!; + await tester.enterText(field, ''); + expect(editor.editedBook?.genre, isNull); + await tester.pumpWidget( + MaterialApp( + home: Scaffold(body: BookInfoGrid(book: saved)), + ), + ); + expect(find.text('Genre'), findsOneWidget); + expect(find.text('Science fiction'), findsOneWidget); + expect(tester.takeException(), isNull); + }); + } + testWidgets('desktop uses a left-aligned page header with a persistent Save action', (tester) async { await pumpPage(tester, size: const Size(1400, 1000)); expect(find.text('Edit book'), findsOneWidget); diff --git a/app/test/pages/statistics_page_test.dart b/app/test/pages/statistics_page_test.dart new file mode 100644 index 00000000..3cb3cf8e --- /dev/null +++ b/app/test/pages/statistics_page_test.dart @@ -0,0 +1,288 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/models/reading_activity.dart'; +import 'package:papyrus/pages/statistics_page.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/statistics/reading_charts.dart'; +import 'package:papyrus/widgets/statistics/stat_card.dart'; +import 'package:provider/provider.dart'; + +Future pumpStatistics( + WidgetTester tester, { + Size size = const Size(390, 844), + double scale = 1, + ThemeData? theme, + bool empty = false, + PreferencesProvider? preferences, + DateTime? at, +}) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = size; + addTearDown(tester.view.reset); + final now = at ?? DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final store = DataStore()..loadData(); + addTearDown(store.dispose); + + if (!empty) { + await store.commitTracking( + activities: [ + ReadingActivity( + id: 'today', + bookId: 'book', + bookTitle: 'A book', + startTime: today, + endTime: today.add(const Duration(minutes: 30)), + createdAt: today, + pages: 12, + ), + ReadingActivity( + id: 'previous-year', + bookId: 'book', + bookTitle: 'A book', + startTime: DateTime(now.year - 1), + endTime: DateTime(now.year - 1).add(const Duration(minutes: 60)), + createdAt: DateTime(now.year - 1), + pages: 24, + ), + ], + ); + } + + if (preferences == null) { + SharedPreferences.setMockInitialValues({}); + preferences = PreferencesProvider(await SharedPreferences.getInstance()); + addTearDown(preferences.dispose); + } + + await tester.pumpWidget( + MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: store), + ChangeNotifierProvider.value(value: preferences), + ], + child: MaterialApp( + theme: theme ?? AppTheme.light, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), + child: child!, + ), + home: StatisticsPage(now: () => now), + ), + ), + ); + + await tester.pumpAndSettle(); +} + +void main() { + for (final width in [390.0, 1440.0]) { + testWidgets('page alignment updates statistics with standard margins at $width', (tester) async { + SharedPreferences.setMockInitialValues({}); + final preferences = PreferencesProvider(await SharedPreferences.getInstance()); + addTearDown(preferences.dispose); + await pumpStatistics(tester, size: Size(width, 1000), preferences: preferences); + final period = find.byKey(const ValueKey('statistics-period-week')); + final margin = width < 840 ? 16.0 : 24.0; + final custom = width < 600 + ? find.widgetWithIcon(IconButton, Icons.date_range_outlined) + : find.widgetWithIcon(OutlinedButton, Icons.date_range_outlined); + expect(tester.getRect(period).left, margin); + expect(tester.getRect(period).top, margin); + expect(tester.getRect(custom).right, width - margin); + preferences.pageAlignment = 'center'; + await tester.pumpAndSettle(); + final centeredMargin = width > 1168 ? (width - 1120) / 2 : margin; + expect(tester.getRect(period).left, centeredMargin); + expect(tester.getRect(period).top, margin); + expect(tester.getRect(custom).right, width - centeredMargin); + preferences.pageAlignment = 'left'; + await tester.pumpAndSettle(); + expect(tester.getRect(period).left, margin); + expect(tester.getRect(custom).right, width - margin); + expect(tester.takeException(), isNull); + }); + } + + for (final width in [390.0, 1200.0]) { + testWidgets('Monday Week shows all seven days at $width', (tester) async { + await pumpStatistics(tester, size: Size(width, 1000), at: DateTime(2026, 11, 2, 12)); + expect(find.text('Nov 2, 2026 – Nov 8, 2026'), findsOneWidget); + + for (final metric in ['Time', 'Pages']) { + await tester.tap(find.text(metric)); + await tester.pumpAndSettle(); + final chart = tester.widget(find.byType(ReadingActivityBarChart)); + expect(chart.activities.length, 7); + expect(chart.activities.first.date, DateTime(2026, 11, 2)); + expect(chart.activities.last.date, DateTime(2026, 11, 8)); + expect(chart.activities.skip(1).every((day) => day.readingMinutes == 0 && day.pagesRead == 0), isTrue); + + for (var day = 0; day < 7; day++) { + expect(find.byKey(ValueKey('activity-axis-tick-$day')), findsOneWidget); + } + + if (width > 600) { + for (final day in ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']) { + expect(find.text(day), findsOneWidget); + } + } + } + + expect(tester.takeException(), isNull); + }); + } + + testWidgets('period and chart controls update totals while broader scopes stay explicit', (tester) async { + await pumpStatistics(tester, size: const Size(1200, 900)); + expect(find.text('30m'), findsWidgets); + expect(find.byType(ReadingActivityBarChart), findsOneWidget); + await tester.tap(find.text('Pages')); + await tester.pumpAndSettle(); + expect( + tester.widget(find.byType(ReadingActivityBarChart)).metric, + ReadingActivityMetric.pages, + ); + await tester.tap(find.text('All time')); + await tester.pumpAndSettle(); + expect(find.text('1.5h'), findsOneWidget); + expect(find.textContaining('latest 60 days'), findsNothing); + expect(find.text('Reading by genre'), findsOneWidget); + expect(find.textContaining('Lifetime streaks'), findsOneWidget); + expect(find.byType(ExpansionTile), findsNothing); + expect(find.byType(Divider), findsNothing); + expect(tester.takeException(), isNull); + }); + + testWidgets('custom dates do not falsely select Week and cancelling preserves the range', (tester) async { + await pumpStatistics(tester, size: const Size(1200, 900)); + await tester.tap(find.text('Custom range')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Apply').last); + await tester.pumpAndSettle(); + expect( + tester + .widget( + find + .ancestor(of: find.byKey(const ValueKey('statistics-period-week')), matching: find.byType(Semantics)) + .first, + ) + .properties + .selected, + isFalse, + ); + expect(find.text('This week'), findsNothing); + final dateButton = find.widgetWithIcon(OutlinedButton, Icons.date_range_outlined); + await tester.tap(dateButton); + await tester.pumpAndSettle(); + await tester.tap(find.byTooltip('Close')); + await tester.pumpAndSettle(); + expect( + tester + .widget( + find + .ancestor(of: find.byKey(const ValueKey('statistics-period-week')), matching: find.byType(Semantics)) + .first, + ) + .properties + .selected, + isFalse, + ); + await tester.tap(find.text('Week')); + await tester.pumpAndSettle(); + expect(find.text('This week'), findsWidgets); + expect(tester.takeException(), isNull); + }); + + testWidgets('adjacent panels match height and activity controls share the header', (tester) async { + await pumpStatistics(tester, size: const Size(1200, 1000)); + final cards = find.byType(StatSectionCard); + expect(tester.getSize(cards.at(0)).height, tester.getSize(cards.at(1)).height); + expect(tester.getSize(cards.at(2)).height, tester.getSize(cards.at(3)).height); + final header = tester.getRect(find.text('Reading activity')); + final controls = tester.getRect(find.byType(ChoiceChip).first); + expect(controls.left, greaterThan(header.right)); + expect(controls.center.dy, greaterThan(header.center.dy)); + expect(controls.center.dy, lessThan(header.bottom + 24)); + expect(tester.takeException(), isNull); + }); + + testWidgets('phone custom range stays beside periods and empty states omit explanatory copy', (tester) async { + await pumpStatistics(tester, size: const Size(320, 740), empty: true); + final week = tester.getRect(find.byKey(const ValueKey('statistics-period-week'))); + final custom = tester.getRect(find.widgetWithIcon(IconButton, Icons.date_range_outlined)); + expect(custom.center.dy, closeTo(week.center.dy, 1)); + expect(custom.right, closeTo(304, 1)); + expect(find.text('Custom range'), findsNothing); + expect(find.textContaining('Read a book or log reading'), findsNothing); + expect(find.textContaining('Daily average uses'), findsNothing); + await tester.tap(find.byTooltip('Custom range')); + await tester.pumpAndSettle(); + expect(find.text('Select date range'), findsOneWidget); + expect(tester.takeException(), isNull); + }); + + for (final size in [const Size(390, 844), const Size(1200, 900)]) { + testWidgets('period selection keeps button geometry fixed at ${size.width}', (tester) async { + await pumpStatistics(tester, size: size); + final keys = ['week', 'month', 'year', 'allTime']; + Rect buttonRect(String key) => tester.getRect(find.byKey(ValueKey('statistics-period-$key'))); + final original = {for (final key in keys) key: buttonRect(key)}; + final custom = size.width < 600 + ? find.widgetWithIcon(IconButton, Icons.date_range_outlined) + : find.widgetWithIcon(OutlinedButton, Icons.date_range_outlined); + final customRect = tester.getRect(custom); + expect(customRect.right, closeTo(size.width - (size.width < 600 ? 16 : 24), 1)); + + for (final period in ['month', 'week']) { + await tester.tap(find.byKey(ValueKey('statistics-period-$period'))); + await tester.pumpAndSettle(); + + for (final key in keys) { + expect(buttonRect(key), original[key]); + } + + expect(tester.getRect(custom), customRect); + } + + await tester.tap(custom); + await tester.pumpAndSettle(); + await tester.tap(find.text('Apply').last); + await tester.pumpAndSettle(); + + for (final key in keys) { + expect(buttonRect(key), original[key]); + } + + expect(tester.getRect(custom), customRect); + expect(find.textContaining('·'), findsNothing); + expect(tester.takeException(), isNull); + }); + } + + for (final scenario in [ + (name: 'small phone', size: const Size(320, 740), scale: 1.0, theme: AppTheme.light), + (name: 'large text', size: const Size(390, 844), scale: 2.0, theme: AppTheme.dark), + (name: 'tablet e-ink', size: const Size(768, 1024), scale: 1.3, theme: AppTheme.eink), + (name: 'desktop', size: const Size(1440, 900), scale: 1.0, theme: AppTheme.dark), + ]) { + testWidgets('${scenario.name} keeps populated and empty content usable', (tester) async { + await pumpStatistics(tester, size: scenario.size, scale: scenario.scale, theme: scenario.theme); + expect(tester.takeException(), isNull); + await tester.scrollUntilVisible( + find.text('Reading by genre'), + 300, + scrollable: find.byType(Scrollable).first, + ); + expect(tester.takeException(), isNull); + await tester.pumpWidget(const SizedBox()); + await pumpStatistics(tester, size: scenario.size, scale: scenario.scale, theme: scenario.theme, empty: true); + expect(find.text('No reading time in this range'), findsOneWidget); + expect(find.byType(ReadingActivityBarChart), findsNothing); + expect(tester.takeException(), isNull); + }); + } +} diff --git a/app/test/powersync/tracking_persistence_test.dart b/app/test/powersync/tracking_persistence_test.dart index a22da10e..69e53626 100644 --- a/app/test/powersync/tracking_persistence_test.dart +++ b/app/test/powersync/tracking_persistence_test.dart @@ -33,6 +33,11 @@ void main() { final activity = ReadingActivity( id: 'reading', + source: 'reader', + coverage: const [ + PageCoverage(key: 'book:epub:0:100:300:1000', start: 0, end: 1, pagesPerUnit: 1), + PageCoverage(key: 'book:epub:0:300:500:1000', start: 0, end: 1, pagesPerUnit: 1), + ], startPosition: 0.25, endPosition: 0.35, deviceType: 'android', diff --git a/app/test/providers/appearance_preferences_test.dart b/app/test/providers/appearance_preferences_test.dart new file mode 100644 index 00000000..c9fa7f99 --- /dev/null +++ b/app/test/providers/appearance_preferences_test.dart @@ -0,0 +1,36 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('page alignment defaults left and both choices survive storage reload', () async { + SharedPreferences.setMockInitialValues({}); + final storage = await SharedPreferences.getInstance(); + final preferences = PreferencesProvider(storage); + addTearDown(preferences.dispose); + expect(preferences.pageAlignment, 'left'); + var notifications = 0; + preferences.addListener(() => notifications++); + + for (final alignment in ['center', 'left']) { + preferences.pageAlignment = alignment; + await storage.reload(); + final restored = PreferencesProvider(storage); + expect(restored.pageAlignment, alignment); + restored.dispose(); + } + + expect(notifications, 2); + }); + + for (final value in ['invalid', true, 1]) { + test('invalid saved page alignment $value uses left', () async { + SharedPreferences.setMockInitialValues({'page_alignment': value}); + final preferences = PreferencesProvider(await SharedPreferences.getInstance()); + addTearDown(preferences.dispose); + expect(preferences.pageAlignment, 'left'); + }); + } +} diff --git a/app/test/providers/book_edit_persistence_test.dart b/app/test/providers/book_edit_persistence_test.dart index 86b26d71..e13b56fe 100644 --- a/app/test/providers/book_edit_persistence_test.dart +++ b/app/test/providers/book_edit_persistence_test.dart @@ -39,6 +39,29 @@ void main() { await directory.delete(recursive: true); }); + test('genre edits persist, can be cleared, and preserve other custom metadata', () async { + final original = await service.getById('book'); + await service.scopedBooks.update( + original!.copyWith(customMetadata: {'source': 'imported', 'genre': 'Fiction'}), + previous: original, + ); + + await editor.loadBook('book'); + editor.updateGenre(' Science fiction '); + expect(await editor.save(), isTrue); + await service.activateAuthenticated('other-account'); + await service.activateGuest(); + final saved = await service.getById('book'); + expect(saved?.genre, 'Science fiction'); + expect(saved?.customMetadata?['source'], 'imported'); + await editor.loadBook('book'); + editor.updateGenre(' '); + expect(await editor.save(), isTrue); + final cleared = await service.getById('book'); + expect(cleared?.genre, isNull); + expect(cleared?.customMetadata, {'source': 'imported'}); + }); + test('saving a stale editor preserves an unrelated remote field', () async { final original = editor.originalBook!; editor.updateTitle('Edited title'); diff --git a/app/test/providers/statistics_provider_test.dart b/app/test/providers/statistics_provider_test.dart index e29d8301..e4d09d5b 100644 --- a/app/test/providers/statistics_provider_test.dart +++ b/app/test/providers/statistics_provider_test.dart @@ -8,6 +8,56 @@ import 'package:papyrus/providers/enums/library_reading_status.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); + for (final now in [DateTime(2026, 11, 2, 12), DateTime(2026, 11, 4, 12), DateTime(2026, 11, 8, 12)]) { + test('calendar charts retain empty future buckets on weekday ${now.weekday}', () async { + final store = DataStore()..loadData(); + addTearDown(store.dispose); + final monday = DateTime(2026, 11, 2); + await store.commitTracking( + activities: [ + ReadingActivity( + id: 'monday', + bookId: 'book', + bookTitle: 'Book', + startTime: monday, + endTime: monday.add(const Duration(minutes: 7)), + createdAt: monday.add(const Duration(minutes: 7)), + pages: 2, + ), + ], + ); + final provider = StatisticsProvider(now: () => now)..attach(store); + addTearDown(provider.dispose); + expect(provider.readingTimeData.length, 7); + expect(provider.readingTimeData.last.date, DateTime(2026, 11, 8)); + expect(provider.readingTimeData.first.seconds, 420); + expect(provider.readingTimeData.skip(1).every((day) => day.seconds == 0 && day.pages == 0), isTrue); + expect(provider.totalReadingSeconds, 420); + expect(provider.pagesRead, 2); + expect(provider.periodDays, now.weekday); + expect(provider.averageDailyMinutes, (7 / now.weekday).round()); + provider.setPeriod(StatsPeriod.month); + expect(provider.readingTimeData.length, 30); + expect(provider.periodDays, now.day); + provider.setPeriod(StatsPeriod.year); + expect(provider.bucketSize, StatisticsBucketSize.month); + expect(provider.readingTimeData.length, 12); + expect(provider.readingTimeData.last.date, DateTime(2026, 12)); + expect(provider.readingTimeData.last.seconds, 0); + }); + } + + test('January uses twelve monthly ticks from the first day', () { + final store = DataStore()..loadData(); + addTearDown(store.dispose); + final provider = StatisticsProvider(now: () => DateTime(2026, 1, 1, 12))..attach(store); + addTearDown(provider.dispose); + provider.setPeriod(StatsPeriod.year); + expect(provider.bucketSize, StatisticsBucketSize.month); + expect(provider.readingTimeData.length, 12); + expect(provider.periodDays, 1); + }); + test('historical completion dates survive the ledger upgrade without resurrecting undone entries', () async { final now = DateTime.now(); final today = DateTime(now.year, now.month, now.day); @@ -60,10 +110,174 @@ void main() { provider.setPeriod(StatsPeriod.allTime); expect(provider.totalBooks, 3); expect(provider.monthlyStats.last.booksRead, 2); - expect(provider.monthlyStats[10].booksRead, 1); + expect(provider.monthlyStats.first.booksRead, 1); expect(provider.readingTimeData.last.booksRead, unorderedEquals(['legacy-today', 'tracked'])); provider.setCustomDateRange(previousMonth, previousMonth); expect(provider.totalBooks, 1); expect(store.readingActivities.where((activity) => activity.bookId.startsWith('legacy')), isEmpty); }); + test('full-period buckets preserve old activity and fractional minutes', () async { + final store = DataStore()..loadData(); + addTearDown(store.dispose); + final now = DateTime(2026, 11, 2, 12); + + ReadingActivity reading(String id, DateTime start, int seconds, int pages) => ReadingActivity( + id: id, + bookId: id, + bookTitle: id, + startTime: start, + endTime: start.add(Duration(seconds: seconds)), + createdAt: start, + pages: pages, + ); + + await store.commitTracking( + activities: [ + reading('january', DateTime(2026, 1, 10), 30, 4), + reading('october', DateTime(2026, 10, 15), 30, 6), + reading('november', DateTime(2026, 11, 1), 600, 12), + ], + ); + + final provider = StatisticsProvider(now: () => now)..attach(store); + addTearDown(provider.dispose); + provider.setPeriod(StatsPeriod.year); + expect(provider.bucketSize, StatisticsBucketSize.month); + expect(provider.readingTimeData.length, 12); + expect(provider.readingTimeData.first.seconds, 30); + expect(provider.readingTimeData.fold(0, (sum, bucket) => sum + bucket.seconds), 660); + expect(provider.readingTimeData.fold(0, (sum, bucket) => sum + bucket.pages), 22); + expect(provider.totalReadingSeconds, 660); + expect(provider.pagesRead, 22); + expect(provider.periodDays, 306); + expect(provider.averageReadingLabel, '2s'); + expect(provider.monthlyStats.length, 11); + + provider.setCustomDateRange(DateTime(2026, 10, 15), DateTime(2026, 11, 1)); + expect(provider.bucketSize, StatisticsBucketSize.day); + expect(provider.periodDays, 18); + expect(provider.totalReadingSeconds, 630); + expect(provider.readingTimeData.first.date, DateTime(2026, 10, 15)); + expect(provider.readingTimeData.last.endDate, DateTime(2026, 11, 2)); + expect(provider.averageReadingLabel, '35s'); + }); + + test('genres count distinct books read in range and respect corrections', () async { + final now = DateTime(2026, 11, 2, 12); + final store = DataStore() + ..loadData( + books: [ + for (final id in ['read', 'old', 'undone', 'unread']) + Book(id: id, title: id, author: '', addedAt: now, customMetadata: {'genre': id}), + ], + ); + addTearDown(store.dispose); + + ReadingActivity reading(String id, String bookId, DateTime start) => ReadingActivity( + id: id, + bookId: bookId, + bookTitle: bookId, + startTime: start, + endTime: start.add(const Duration(minutes: 10)), + createdAt: start, + ); + + final undone = reading('undo', 'undone', DateTime(2026, 11, 1)); + + await store.commitTracking( + activities: [ + reading('one', 'read', DateTime(2026, 11, 1)), + reading('two', 'read', DateTime(2026, 11, 2)), + reading('old', 'old', DateTime(2026, 9, 1)), + undone, + store.reversalFor(undone), + ], + ); + + final provider = StatisticsProvider(now: () => now)..attach(store); + addTearDown(provider.dispose); + provider.setPeriod(StatsPeriod.month); + expect(provider.booksRead, 1); + expect(provider.daysRead, 2); + expect(provider.genreDistribution.single.genre, 'read'); + expect(provider.genreDistribution.single.bookCount, 1); + expect(provider.genreDistribution.single.percentage, 1); + final book = store.getBook('read')!; + await store.updateBookAndWait(book.copyWith(customMetadata: {'genre': 'Science fiction'}), previous: book); + expect(provider.genreDistribution.single.genre, 'Science fiction'); + await store.updateBookAndWait(book, previous: store.getBook('read')); + + provider.setPeriod(StatsPeriod.allTime); + expect(provider.booksRead, 2); + expect(provider.genreDistribution.map((genre) => genre.genre), unorderedEquals(['read', 'old'])); + + final emptyStore = DataStore()..loadData(); + addTearDown(emptyStore.dispose); + provider.attach(emptyStore); + expect(provider.totalReadingSeconds, 0); + expect(provider.daysRead, 0); + expect(provider.booksRead, 0); + expect(provider.genreDistribution, isEmpty); + }); + + test('long history uses yearly buckets and custom boundaries clip cross-midnight sessions', () async { + final store = DataStore()..loadData(); + addTearDown(store.dispose); + final start = DateTime(2020, 1, 31, 23, 50); + + await store.commitTracking( + activities: [ + ReadingActivity( + id: 'cross-midnight', + bookId: 'book', + bookTitle: 'Book', + startTime: start, + endTime: start.add(const Duration(minutes: 20)), + createdAt: start, + pages: 8, + ), + ], + ); + + final provider = StatisticsProvider(now: () => DateTime(2026, 11, 2))..attach(store); + addTearDown(provider.dispose); + provider.setPeriod(StatsPeriod.allTime); + expect(provider.bucketSize, StatisticsBucketSize.year); + expect(provider.readingTimeData.length, 7); + expect(provider.readingTimeData.first.date, DateTime(2020, 1, 31)); + expect(provider.totalReadingSeconds, 1200); + expect(provider.periodDays, DateTime.utc(2026, 11, 3).difference(DateTime.utc(2020, 1, 31)).inDays); + provider.setCustomDateRange(DateTime(2020, 2, 1), DateTime(2020, 2, 1)); + expect(provider.totalReadingSeconds, 600); + expect(provider.daysRead, 1); + expect(provider.pagesRead, 8); + expect(provider.readingTimeData.single.seconds, 600); + expect(provider.sessionStats.totalSessions, 1); + }); + + test('reading days use the established five-minute threshold', () async { + final store = DataStore()..loadData(); + addTearDown(store.dispose); + + await store.commitTracking( + activities: [ + for (var day = 1; day <= 2; day++) + ReadingActivity( + id: '$day', + bookId: 'book', + bookTitle: 'Book', + startTime: DateTime(2026, 11, day), + endTime: DateTime(2026, 11, day, 0, day + 3), + createdAt: DateTime(2026, 11, day), + ), + ], + ); + + final provider = StatisticsProvider(now: () => DateTime(2026, 11, 2, 12))..attach(store); + addTearDown(provider.dispose); + provider.setPeriod(StatsPeriod.month); + expect(provider.daysRead, 1); + expect(provider.totalReadingMinutes, 9); + expect(provider.averageDailyMinutes, 5); + }); } diff --git a/app/test/reader/reading_activity_tracker_test.dart b/app/test/reader/reading_activity_tracker_test.dart index a59bab80..16d7b16e 100644 --- a/app/test/reader/reading_activity_tracker_test.dart +++ b/app/test/reader/reading_activity_tracker_test.dart @@ -1,5 +1,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/data/repositories/tracking_repository.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/providers/statistics_provider.dart'; import 'package:papyrus/models/book.dart'; import 'package:papyrus/models/reading_activity.dart'; import 'package:papyrus/models/reading_goal.dart'; @@ -123,6 +125,40 @@ void main() { }); }); + test('scrolling within a rendered page retains its exposure timer', () async { + var now = start; + final repository = RecordingRepository(); + final tracker = ReadingActivityTracker( + repository: repository, + book: Book(id: 'book', title: 'Book', author: '', addedAt: start), + shelfIds: [], + deviceId: 'one', + onError: (_) {}, + now: () => now, + checkpointInterval: const Duration(days: 1), + ); + + tracker.onActivity( + event( + coverage: const [ + ReaderContentCoverage(key: 'epub:0:100:300:1000', start: .1, end: .2, chapterCount: 10), + ], + ), + ); + now = now.add(const Duration(seconds: 6)); + tracker.onActivity( + event( + coverage: const [ + ReaderContentCoverage(key: 'epub:0:100:300:1000', start: .15, end: .3, chapterCount: 10), + ], + ), + ); + now = now.add(const Duration(seconds: 4)); + await tracker.close(); + expect(repository.records.values.first.coverage, isEmpty); + expect(repository.records.values.last.coverage.single.pagesPerUnit, 1); + }); + test('write retries reuse UUIDs and captured profiles cannot write into another library', () async { var now = start; final repository = RecordingRepository()..failures = 1; @@ -151,7 +187,7 @@ void main() { expect(repository.records.length, 1); }); - test('EPUB metadata calibration is estimated; no metadata still records time', () async { + test('EPUB rendered pages count without metadata and checkpoints do not duplicate them', () async { for (final count in [null, 200]) { var now = start; final repository = RecordingRepository(); @@ -167,19 +203,29 @@ void main() { ); tracker.onActivity( - event(coverage: const [ReaderContentCoverage(key: 'epub:0:1000', start: .1, end: .3, chapterCount: 10)]), + event( + coverage: const [ + ReaderContentCoverage(key: 'epub:0:100:300:1000', start: .1, end: .3, chapterCount: 10), + ReaderContentCoverage(key: 'epub:0:300:500:1000', start: .3, end: .5, chapterCount: 10), + ], + ), ); + now = now.add(const Duration(seconds: 10)); + await tracker.flush(); now = now.add(const Duration(seconds: 10)); await tracker.close(); - final activity = repository.records.values.single; - expect(activity.seconds, 10); - expect(activity.coverage.length, count == null ? 0 : 1); - - if (count != null) { - expect(activity.coverage.single.pagesPerUnit, 20); - expect(activity.isEstimated, isTrue); - } + expect(repository.records.values.first.coverage.length, 2); + expect(repository.records.values.every((activity) => !activity.isEstimated), isTrue); + final store = DataStore()..loadData(); + addTearDown(store.dispose); + await store.commitTracking(activities: repository.records.values.toList()); + final statistics = StatisticsProvider(now: () => now)..attach(store); + addTearDown(statistics.dispose); + expect(statistics.totalReadingSeconds, 20); + expect(statistics.pagesRead, 2); + expect(statistics.hasEstimatedPages, isFalse); + expect(statistics.readingTimeData.fold(0, (sum, day) => sum + day.pages), 2); } }); } diff --git a/app/test/widgets/profile/appearance_settings_section_test.dart b/app/test/widgets/profile/appearance_settings_section_test.dart index befe7d66..288d6b15 100644 --- a/app/test/widgets/profile/appearance_settings_section_test.dart +++ b/app/test/widgets/profile/appearance_settings_section_test.dart @@ -13,6 +13,7 @@ void main() { SharedPreferences.setMockInitialValues({'theme_mode': 'light'}); final prefs = await SharedPreferences.getInstance(); prefsProvider = PreferencesProvider(prefs); + addTearDown(prefsProvider.dispose); }); Widget buildSection({bool isDesktop = false}) { @@ -24,6 +25,26 @@ void main() { ); } + for (final isDesktop in [false, true]) { + testWidgets('page alignment picker saves both choices on ${isDesktop ? "desktop" : "mobile"}', (tester) async { + await tester.pumpWidget(buildSection(isDesktop: isDesktop)); + expect(find.text('Left'), findsOneWidget); + await tester.tap(find.text('Page alignment')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Center')); + await tester.pumpAndSettle(); + expect(prefsProvider.pageAlignment, 'center'); + expect(find.text('Center'), findsOneWidget); + await tester.tap(find.text('Page alignment')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Left')); + await tester.pumpAndSettle(); + expect(prefsProvider.pageAlignment, 'left'); + expect(find.text('Left'), findsOneWidget); + expect(tester.takeException(), isNull); + }); + } + testWidgets('renders mobile appearance settings and opens theme picker', (tester) async { await tester.pumpWidget(buildSection(isDesktop: false)); expect(find.text('Appearance'), findsOneWidget); diff --git a/app/test/widgets/shared/page_empty_states_test.dart b/app/test/widgets/shared/page_empty_states_test.dart index f2677317..61eef942 100644 --- a/app/test/widgets/shared/page_empty_states_test.dart +++ b/app/test/widgets/shared/page_empty_states_test.dart @@ -82,7 +82,7 @@ void main() { 'No book in progress': ContinueReadingCard(), 'No reading goals set': ReadingGoalCard(goals: []), 'No books added recently': RecentlyAddedSection(books: []), - 'No reading data for this period': ReadingTimeBarChart(activities: []), + 'No reading data for this period': ReadingActivityBarChart(activities: []), 'No books read data available': BooksPerMonthChart(monthlyStats: []), }; diff --git a/app/test/widgets/statistics/reading_charts_test.dart b/app/test/widgets/statistics/reading_charts_test.dart new file mode 100644 index 00000000..cf978db9 --- /dev/null +++ b/app/test/widgets/statistics/reading_charts_test.dart @@ -0,0 +1,175 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/providers/statistics_provider.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/statistics/reading_charts.dart'; + +void main() { + final activities = List.generate(11, (index) { + final date = DateTime(2026, 10, 23 + index); + return StatisticsActivity( + date: date, + endDate: DateTime(date.year, date.month, date.day + 1), + seconds: index == 0 ? 49 : (index == 1 ? 7 : 0), + pages: 0, + bucketSize: StatisticsBucketSize.day, + booksRead: const [], + ); + }); + + Future pumpChart( + WidgetTester tester, + double width, { + List? data, + ReadingActivityMetric metric = ReadingActivityMetric.time, + }) async { + tester.view.physicalSize = Size(width, 600); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: Scaffold( + body: ReadingActivityBarChart(activities: data ?? activities, metric: metric, isDesktop: width > 600), + ), + ), + ); + + await tester.pumpAndSettle(); + } + + testWidgets('sub-minute sessions have a readable seconds scale and intermediate grid lines', (tester) async { + await pumpChart(tester, 800); + final data = tester.widget(find.byType(BarChart)).data; + expect(find.text('15s'), findsOneWidget); + expect(find.text('30s'), findsOneWidget); + expect(find.text('45s'), findsOneWidget); + expect(find.text('1m'), findsOneWidget); + expect(data.gridData.show, isTrue); + expect(data.maxY / data.gridData.horizontalInterval!, greaterThanOrEqualTo(3)); + expect(data.borderData.show, isTrue); + expect(data.barGroups.first.barRods.first.toY, closeTo(49 / 60, .0001)); + expect(tester.takeException(), isNull); + }); + + testWidgets('wide daily charts label every day including both range boundaries', (tester) async { + await pumpChart(tester, 1200); + expect(find.text('Oct 23'), findsOneWidget); + expect(find.text('Nov 2'), findsOneWidget); + + for (final day in ['24', '25', '26', '27', '28', '29', '30', '31', 'Nov 1']) { + expect(find.text(day), findsOneWidget); + } + + expect(tester.takeException(), isNull); + }); + + testWidgets('narrow charts retain the latest date and a tick for every bucket', (tester) async { + await pumpChart(tester, 300); + expect(find.text('Nov 2'), findsOneWidget); + expect(find.text('24'), findsNothing); + + for (var index = 0; index < activities.length; index++) { + expect(find.byKey(ValueKey('activity-axis-tick-$index')), findsOneWidget); + } + expect(tester.takeException(), isNull); + }); + testWidgets('monthly axis labels stay separated on desktop and phone', (tester) async { + final months = List.generate(23, (index) { + final date = DateTime(2025, 1 + index); + return StatisticsActivity( + date: date, + endDate: DateTime(date.year, date.month + 1), + seconds: index == 0 ? 3600 : 0, + pages: 0, + bucketSize: StatisticsBucketSize.month, + booksRead: const [], + ); + }); + + for (final width in [650.0, 360.0]) { + await pumpChart(tester, width, data: months); + expect(find.text('Nov 26'), findsOneWidget); + final labels = find.byWidgetPredicate( + (widget) => widget is Text && RegExp(r'^[A-Z][a-z]{2} \d{2}$').hasMatch(widget.data ?? ''), + ); + final rectangles = labels.evaluate().map((element) => tester.getRect(find.byWidget(element.widget))).toList() + ..sort((left, right) => left.left.compareTo(right.left)); + + final interval = rectangles[1].center.dx - rectangles[0].center.dx; + + for (var index = 1; index < rectangles.length; index++) { + expect(rectangles[index].left - rectangles[index - 1].right, greaterThanOrEqualTo(8)); + expect(rectangles[index].center.dx - rectangles[index - 1].center.dx, closeTo(interval, 0.1)); + } + + expect(tester.takeException(), isNull); + } + }); + testWidgets('Time and Pages use identical centered bars and complete grid boundaries', (tester) async { + final activity = StatisticsActivity( + date: DateTime(2026, 11, 2), + endDate: DateTime(2026, 11, 3), + seconds: 70, + pages: 2, + bucketSize: StatisticsBucketSize.day, + booksRead: const [], + ); + final bars = []; + + for (final metric in ReadingActivityMetric.values) { + await pumpChart(tester, 800, data: [activity], metric: metric); + final data = tester.widget(find.byType(BarChart)).data; + bars.add(data.barGroups.single.barRods.single); + expect(find.byType(LineChart), findsNothing); + expect(data.borderData.border.top.style, BorderStyle.solid); + expect(data.borderData.border.top.width, greaterThan(0)); + expect(data.borderData.border.bottom.width, greaterThan(0)); + expect(tester.getCenter(find.text('Mon')).dx, closeTo(420, 1)); + expect(find.text(metric == ReadingActivityMetric.time ? '1.5m' : '3'), findsOneWidget); + } + + expect(bars[0].width, bars[1].width); + expect(bars[0].color, bars[1].color); + expect(bars[0].borderRadius, bars[1].borderRadius); + expect(bars[0].toY, closeTo(70 / 60, .0001)); + expect(bars[1].toY, 2); + }); + + testWidgets('24-day ranges have uniform label intervals with no missing bucket ticks', (tester) async { + final days = List.generate(24, (index) { + final date = DateTime(2026, 10, 10 + index); + return StatisticsActivity( + date: date, + endDate: DateTime(date.year, date.month, date.day + 1), + seconds: index == 23 ? 70 : 0, + pages: 0, + bucketSize: StatisticsBucketSize.day, + booksRead: const [], + ); + }); + + for (final width in [700.0, 350.0]) { + await pumpChart(tester, width, data: days); + final labels = find.byWidgetPredicate( + (widget) => widget is Text && RegExp(r'^(Oct \d+|Nov \d+|\d{2})$').hasMatch(widget.data ?? ''), + ); + final positions = labels.evaluate().map((element) => tester.getCenter(find.byWidget(element.widget)).dx).toList() + ..sort(); + final interval = positions[1] - positions[0]; + + for (var index = 1; index < positions.length; index++) { + expect(positions[index] - positions[index - 1], closeTo(interval, 0.1)); + } + + for (var index = 0; index < days.length; index++) { + expect(find.byKey(ValueKey('activity-axis-tick-$index')), findsOneWidget); + } + + expect(find.text('Nov 2'), findsOneWidget); + expect(tester.takeException(), isNull); + } + }); +} From fa2dc494455d075292b341469dc9c023baa784f8 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Mon, 2 Nov 2026 22:22:14 +0200 Subject: [PATCH 04/17] chore: keep Impeccable artifacts local --- .gitignore | 1 + .impeccable/config.json | 3 - .impeccable/design.json | 120 ------------------ .../review/calendar-axis/pages-1200.png | Bin 71851 -> 0 bytes .../review/calendar-axis/pages-390.png | Bin 57163 -> 0 bytes .impeccable/review/calendar-axis/review.md | 18 --- .../review/calendar-axis/time-1200.png | Bin 72614 -> 0 bytes .impeccable/review/calendar-axis/time-390.png | Bin 57799 -> 0 bytes .impeccable/review/genre/details-1200.png | Bin 41593 -> 0 bytes .impeccable/review/genre/details-390.png | Bin 30916 -> 0 bytes .impeccable/review/genre/edit-1200.png | Bin 49925 -> 0 bytes .impeccable/review/genre/edit-390.png | Bin 36721 -> 0 bytes .impeccable/review/genre/review.md | 27 ---- .impeccable/surfaces/statistics.md | 87 ------------- DESIGN.md | 4 +- 15 files changed, 3 insertions(+), 257 deletions(-) delete mode 100644 .impeccable/config.json delete mode 100644 .impeccable/design.json delete mode 100644 .impeccable/review/calendar-axis/pages-1200.png delete mode 100644 .impeccable/review/calendar-axis/pages-390.png delete mode 100644 .impeccable/review/calendar-axis/review.md delete mode 100644 .impeccable/review/calendar-axis/time-1200.png delete mode 100644 .impeccable/review/calendar-axis/time-390.png delete mode 100644 .impeccable/review/genre/details-1200.png delete mode 100644 .impeccable/review/genre/details-390.png delete mode 100644 .impeccable/review/genre/edit-1200.png delete mode 100644 .impeccable/review/genre/edit-390.png delete mode 100644 .impeccable/review/genre/review.md delete mode 100644 .impeccable/surfaces/statistics.md diff --git a/.gitignore b/.gitignore index 9f009562..29e75621 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ test/data/ app/pubspec_overrides.yaml __pycache__/ *.pyc +.impeccable/ diff --git a/.impeccable/config.json b/.impeccable/config.json deleted file mode 100644 index 747d7b34..00000000 --- a/.impeccable/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "buildPath": "code" -} diff --git a/.impeccable/design.json b/.impeccable/design.json deleted file mode 100644 index 21fdc58f..00000000 --- a/.impeccable/design.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "schemaVersion": 2, - "generatedAt": "2026-11-02T16:45:57.133728+00:00", - "title": "Design System: Papyrus", - "extensions": { - "motion": [ - { - "name": "quick", - "value": "100ms", - "purpose": "Quick transitions." - }, - { - "name": "standard", - "value": "200ms", - "purpose": "Standard transitions." - }, - { - "name": "emphasis", - "value": "300ms", - "purpose": "Emphasis transitions." - }, - { - "name": "complex", - "value": "500ms", - "purpose": "Complex transitions." - }, - { - "name": "eink", - "value": "0ms", - "purpose": "E-ink and reduced-motion behavior via AppMotion." - } - ], - "breakpoints": [ - { - "name": "mobile", - "value": "0px" - }, - { - "name": "tablet", - "value": "600px" - }, - { - "name": "desktopSmall", - "value": "840px" - }, - { - "name": "desktopLarge", - "value": "1200px" - } - ], - "shadows": [] - }, - "components": [ - { - "name": "E-ink elevated button", - "kind": "button", - "refersTo": "button-eink", - "description": "Explicit e-ink elevated-button appearance. Browser focus remains available.", - "html": "", - "css": ".ds-eink-button { background: #000; color: #fff; border: 0; border-radius: 0; padding: 12px 24px; min-height: 50px; font-size: 16px; font-weight: 600; }" - }, - { - "name": "E-ink outlined button", - "kind": "button", - "refersTo": "button-outlined-eink", - "description": "Explicit e-ink outlined-button appearance. Flutter owns actual interactive states.", - "html": "", - "css": ".ds-eink-outlined { background: #fff; color: #000; border: 2px solid #000; border-radius: 0; padding: 12px 24px; min-height: 50px; font-size: 16px; font-weight: 600; }" - }, - { - "name": "E-ink field", - "kind": "input", - "refersTo": "input-eink", - "description": "E-ink fill, label, border and focus thickness from InputDecorationTheme.", - "html": "", - "css": ".ds-eink-field-label { color: #000; font-size: 16px; font-weight: 700; } .ds-eink-field { display: block; background: #f5f5f5; color: #000; border: 2px solid #000; border-radius: 0; padding: 16px; } .ds-eink-field::placeholder { color: #404040; } .ds-eink-field:focus { border-width: 4px; outline: none; }" - }, - { - "name": "E-ink selected chip", - "kind": "chip", - "refersTo": "chip-eink-selected", - "description": "Color and border swatch only. Shape and padding are inherited from Flutter.", - "html": "Time", - "css": ".ds-eink-chip { display: inline-block; background: #c0c0c0; color: #000; border: 2px solid #000; }" - }, - { - "name": "E-ink card", - "kind": "card", - "refersTo": "card", - "description": "E-ink shared card shape and margin. Content padding belongs to callers.", - "html": "
Reading activity
", - "css": ".ds-eink-card { background: #fff; color: #000; border: 2px solid #000; border-radius: 0; margin: 8px; }" - }, - { - "name": "E-ink navigation", - "kind": "nav", - "description": "Bottom-navigation label color and weight swatch. Layout remains platform-owned.", - "html": "", - "css": ".ds-eink-nav { background: #fff; color: #404040; font-size: 14px; font-weight: 500; } .ds-eink-nav-selected { color: #000; font-weight: 700; }" - } - ], - "narrative": { - "overview": "Papyrus uses its existing Material 3 theme for a readable, adaptive library and reader. Muted violet accents sit on neutral surfaces, with separate light, dark, high-contrast and e-ink themes. This record describes the implemented system, without introducing a new visual identity.", - "keyCharacteristics": [ - "Semantic theme colors and text roles.", - "Shared spacing and shape tokens.", - "Dedicated e-ink and reduced-motion behavior." - ], - "rules": [], - "dos": [ - "Do resolve colors and typography through the active Flutter theme.", - "Do preserve text scaling, accessibility typography and reduced-motion settings.", - "Do use existing spacing and radius tokens for shared components." - ], - "donts": [ - "Don't hard-code the light palette into adaptive widgets.", - "Don't carry standard-theme elevation and animation into e-ink components." - ] - } -} diff --git a/.impeccable/review/calendar-axis/pages-1200.png b/.impeccable/review/calendar-axis/pages-1200.png deleted file mode 100644 index 719cd6a7947cf89c51388a7851fbdfb98a916114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71851 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 Cd1zw* diff --git a/.impeccable/review/calendar-axis/time-390.png b/.impeccable/review/calendar-axis/time-390.png deleted file mode 100644 index e22d6d6dedb8c8f5314a581838ef30c56e0685c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57799 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 diff --git a/.impeccable/review/genre/details-1200.png b/.impeccable/review/genre/details-1200.png deleted file mode 100644 index 57228b28566b7950166d7cdcb985a91a23692cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41593 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
Cz&;WfO^5HyD>O;X9+Knl*xng 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 Urr-YNfLwy|b@gkRR}BC9AK4vy7XSbN diff --git a/.impeccable/review/genre/details-390.png b/.impeccable/review/genre/details-390.png deleted file mode 100644 index cbef72abcad410dff47c8a9c9be079efb8fac814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30916 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 diff --git a/.impeccable/review/genre/edit-1200.png b/.impeccable/review/genre/edit-1200.png deleted file mode 100644 index fd56aecf073518c738388a268a14822b8c5cfd12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49925 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∪pIA!`Zuty0Sn2 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