From bb7c15d406ae04a830622edc82afe8383dcdc917 Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Sun, 14 Jul 2024 21:56:16 -0400 Subject: [PATCH 01/12] Just email reset --- android/app/build.gradle | 2 +- android/app/src/debug/AndroidManifest.xml | 2 +- android/app/src/main/AndroidManifest.xml | 2 +- .../kotlin/de/voidspace/recon/MainActivity.kt | 2 +- .../kotlin/me/voidspace/recon/MainActivity.kt | 2 +- android/app/src/profile/AndroidManifest.xml | 2 +- lib/widgets/login_screen.dart | 27 +++++++- linux/CMakeLists.txt | 2 +- pubspec.lock | 68 +++++++++++++------ 9 files changed, 78 insertions(+), 31 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5ddc060..9696678 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -49,7 +49,7 @@ android { } defaultConfig { - applicationId "me.voidspace.recon" + applicationId "debug.tojcklguy.opencontacts" minSdkVersion 24 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 68748a4..86a2564 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="debug.tojcklguy.opencontacts"> diff --git a/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt b/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt index 78c26aa..b4bb367 100644 --- a/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt +++ b/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt @@ -1,4 +1,4 @@ -package de.voidspace.recon +package debug.tojcklguy.opencontacts import io.flutter.embedding.android.FlutterActivity diff --git a/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt b/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt index 7d54812..b4bb367 100644 --- a/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt +++ b/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt @@ -1,4 +1,4 @@ -package me.voidspace.recon +package debug.tojcklguy.opencontacts import io.flutter.embedding.android.FlutterActivity diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 68748a4..86a2564 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="debug.tojcklguy.opencontacts"> diff --git a/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt b/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt index b4bb367..78c26aa 100644 --- a/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt +++ b/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt @@ -1,4 +1,4 @@ -package debug.tojcklguy.opencontacts +package de.voidspace.recon import io.flutter.embedding.android.FlutterActivity diff --git a/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt b/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt index b4bb367..78c26aa 100644 --- a/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt +++ b/android/app/src/main/kotlin/me/voidspace/recon/MainActivity.kt @@ -1,4 +1,4 @@ -package debug.tojcklguy.opencontacts +package de.voidspace.recon import io.flutter.embedding.android.FlutterActivity diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 86a2564..68748a4 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="de.voidspace.recon"> @@ -31,7 +31,7 @@ @@ -65,7 +65,7 @@ @@ -82,7 +82,7 @@ @@ -93,7 +93,7 @@ diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 2ca4313..997e8dc 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -7,7 +7,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - ReCon + recon CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -15,7 +15,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - ReCon + recon CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/apis/github_api.dart b/lib/apis/github_api.dart index 0452f1a..4da578c 100644 --- a/lib/apis/github_api.dart +++ b/lib/apis/github_api.dart @@ -6,7 +6,7 @@ class GithubApi { static const baseUrl = "https://api.github.com"; static Future getLatestTagName() async { - final response = await http.get(Uri.parse("$baseUrl/repos/Nutcake/ReCon/releases?per_page=1")); + final response = await http.get(Uri.parse("$baseUrl/repos/Nutcake/recon/releases?per_page=1")); if (response.statusCode != 200) return ""; final body = jsonDecode(response.body) as List; if (body.isEmpty) return ""; diff --git a/lib/clients/messaging_client.dart b/lib/clients/messaging_client.dart index 37de60f..59c97f2 100644 --- a/lib/clients/messaging_client.dart +++ b/lib/clients/messaging_client.dart @@ -228,17 +228,19 @@ class MessagingClient extends ChangeNotifier { // Adjusting values to ensure correct placement of 'headless' if (friend.isHeadless) return 2.5; switch (friend.userStatus.onlineStatus) { - case OnlineStatus.online: + case OnlineStatus.sociable: return 0; - case OnlineStatus.away: + case OnlineStatus.online: return 1; - case OnlineStatus.busy: + case OnlineStatus.away: return 2; + case OnlineStatus.busy: + return 3; case OnlineStatus.invisible: - return 2.5; + return 3.5; case OnlineStatus.offline: default: - return 3; + return 4; } } diff --git a/lib/clients/notification_client.dart b/lib/clients/notification_client.dart index 812cdde..999ddf6 100644 --- a/lib/clients/notification_client.dart +++ b/lib/clients/notification_client.dart @@ -26,7 +26,7 @@ class NotificationClient { android: fln.AndroidInitializationSettings("ic_notification"), iOS: fln.DarwinInitializationSettings(), macOS: fln.DarwinInitializationSettings(), - linux: fln.LinuxInitializationSettings(defaultActionName: "Open ReCon"), + linux: fln.LinuxInitializationSettings(defaultActionName: "Open recon"), )); Future showUnreadMessagesNotification(Iterable messages) async { diff --git a/lib/main.dart b/lib/main.dart index 897c1a2..3e84ffb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -59,20 +59,20 @@ void main() async { // Ignore } - runApp(ReCon(settingsClient: settingsClient, cachedAuthentication: cachedAuth)); + runApp(recon(settingsClient: settingsClient, cachedAuthentication: cachedAuth)); } -class ReCon extends StatefulWidget { - const ReCon({required this.settingsClient, required this.cachedAuthentication, super.key}); +class recon extends StatefulWidget { + const recon({required this.settingsClient, required this.cachedAuthentication, super.key}); final SettingsClient settingsClient; final AuthenticationData cachedAuthentication; @override - State createState() => _ReConState(); + State createState() => _reconState(); } -class _ReConState extends State { +class _reconState extends State { final Typography _typography = Typography.material2021(platform: defaultTargetPlatform); final ReceivePort _port = ReceivePort(); late AuthenticationData _authData = widget.cachedAuthentication; @@ -165,7 +165,7 @@ class _ReConState extends State { child: DynamicColorBuilder( builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) => MaterialApp( debugShowCheckedModeBanner: true, - title: 'ReCon', + title: 'recon', theme: ThemeData( useMaterial3: true, textTheme: _typography.black, diff --git a/lib/models/users/online_status.dart b/lib/models/users/online_status.dart index 2d8d8bf..d02edd4 100644 --- a/lib/models/users/online_status.dart +++ b/lib/models/users/online_status.dart @@ -5,14 +5,16 @@ enum OnlineStatus { invisible, away, busy, - online; + online, + sociable; static final List _colors = [ Colors.transparent, - Colors.transparent, + Colors.grey, Colors.yellow, Colors.red, Colors.green, + Colors.blue, ]; Color color(BuildContext context) => this == OnlineStatus.offline || this == OnlineStatus.invisible @@ -28,6 +30,8 @@ enum OnlineStatus { int compareTo(OnlineStatus other) { if (this == other) return 0; + if (this == OnlineStatus.sociable) return -1; + if (other == OnlineStatus.sociable) return 1; if (this == OnlineStatus.online) return -1; if (other == OnlineStatus.online) return 1; if (this == OnlineStatus.away) return -1; diff --git a/lib/widgets/friends/friend_online_status_indicator.dart b/lib/widgets/friends/friend_online_status_indicator.dart index 65e4d58..48e13e1 100644 --- a/lib/widgets/friends/friend_online_status_indicator.dart +++ b/lib/widgets/friends/friend_online_status_indicator.dart @@ -12,7 +12,7 @@ class FriendOnlineStatusIndicator extends StatelessWidget { Widget build(BuildContext context) { final UserStatus userStatus = friend.userStatus; final OnlineStatus onlineStatus = userStatus.onlineStatus; - return userStatus.appVersion.contains("ReCon") && friend.isOnline + return userStatus.appVersion.contains("recon") && friend.isOnline ? SizedBox.square( dimension: 10, child: Image.asset( diff --git a/lib/widgets/friends/friends_list_app_bar.dart b/lib/widgets/friends/friends_list_app_bar.dart index fbee120..218c27c 100644 --- a/lib/widgets/friends/friends_list_app_bar.dart +++ b/lib/widgets/friends/friends_list_app_bar.dart @@ -21,7 +21,7 @@ class _FriendsListAppBarState extends State with AutomaticKee Widget build(BuildContext context) { super.build(context); return AppBar( - title: const Text("ReCon"), + title: const Text("recon"), actions: [ Consumer(builder: (context, client, _) { return PopupMenuButton( diff --git a/lib/widgets/login_screen.dart b/lib/widgets/login_screen.dart index 6b38e48..09b370d 100644 --- a/lib/widgets/login_screen.dart +++ b/lib/widgets/login_screen.dart @@ -55,13 +55,8 @@ class _LoginScreenState extends State { ); Future submit() async { - if (_usernameController.text.contains(emailReg) || _passwordController.text.isEmpty) { - setState(() { - _error = "Email found! YAAAAY!"; - _isUsernameEmail = true; - }); - } - if (_usernameController.text.isEmpty ||_usernameController.text.contains(emailReg) || _passwordController.text.isEmpty) { //some little thing is giving me the hiccups + + if (_usernameController.text.isEmpty || _passwordController.text.isEmpty) { setState(() { _error = "Please enter a valid username/password combination."; }); @@ -116,7 +111,62 @@ class _LoginScreenState extends State { }); } } - + Future passwordResetSubmit() async { + if (_usernameController.text.contains(emailReg) || _passwordController.text.isEmpty) { + setState(() { + _error = "Please provide an email on the 'Username' textbox"; + }); + return; + } + setState(() { + _error = ""; + _isLoading = false; + }); + /*try { + final authData = await ApiClient.tryLogin( + username: _usernameController.text, + password: _passwordController.text, + oneTimePad: _totpController.text.isEmpty ? null : _totpController.text, + ); + if (!authData.isAuthenticated) { + setState(() { + _error = "Login unsuccessful: Server sent invalid response."; + _isLoading = false; + }); + return; + } + setState(() { + _error = ""; + _isLoading = false; + }); + await loginSuccessful(authData); + } catch (e, s) { + setState(() { + if (e == ApiClient.totpKey) { + if (_needsTotp == false) { + _error = "Please enter your 2FA-Code"; + _totpFocusNode.requestFocus(); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + _scrollController.animateTo(_scrollController.position.maxScrollExtent, + duration: const Duration(milliseconds: 400), curve: Curves.easeOutCirc); + }); + } else { + _error = "The given 2FA code is not valid."; + } + _needsTotp = true; + } else { + _error = "Login unsuccessful: $e."; + } + if (kDebugMode) { + FlutterError.reportError(FlutterErrorDetails( + exception: e, + stack: s, + )); + } + _isLoading = false; + }); + }*/ + } Future loginSuccessful(AuthenticationData authData) async { final settingsClient = ClientHolder.of(context).settingsClient; final notificationManager = FlutterLocalNotificationsPlugin(); @@ -173,7 +223,7 @@ class _LoginScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("OpenContacts"), + title: const Text("recon"), ), body: Builder(builder: (context) { return ListView( @@ -240,13 +290,13 @@ class _LoginScreenState extends State { label: const Text("Login"), ), ), - Padding( + Padding( padding: const EdgeInsets.only(top: 16), - child: _isLoading + child: _isUsernameEmail ? const Center(child: CircularProgressIndicator()) : TextButton.icon( - onPressed: submit, - icon: const Icon(Icons.question_mark), + onPressed: passwordResetSubmit, + icon: const Icon(Icons.refresh), label: const Text("Forgot Password?"), ), ), diff --git a/lib/widgets/settings_page.dart b/lib/widgets/settings_page.dart index fc50aaf..b16b940 100644 --- a/lib/widgets/settings_page.dart +++ b/lib/widgets/settings_page.dart @@ -74,14 +74,14 @@ class SettingsPage extends StatelessWidget { ), ListTile( trailing: const Icon(Icons.info_outline), - title: const Text("About ReCon"), + title: const Text("About recon"), onTap: () async { showAboutDialog( context: context, applicationVersion: (await PackageInfo.fromPlatform()).version, applicationIcon: InkWell( onTap: () async { - if (!await launchUrl(Uri.parse("https://github.com/Nutcake/ReCon"), + if (!await launchUrl(Uri.parse("https://github.com/Nutcake/recon"), mode: LaunchMode.externalApplication)) { if (context.mounted) { ScaffoldMessenger.of(context) diff --git a/lib/widgets/update_notifier.dart b/lib/widgets/update_notifier.dart index 4fe903a..415cec7 100644 --- a/lib/widgets/update_notifier.dart +++ b/lib/widgets/update_notifier.dart @@ -38,7 +38,7 @@ class UpdateNotifier extends StatelessWidget { children: [ TextButton.icon( onPressed: () { - launchUrl(Uri.parse("https://github.com/Nutcake/ReCon/releases/latest"), + launchUrl(Uri.parse("https://github.com/Nutcake/recon/releases/latest"), mode: LaunchMode.externalApplication, ); }, diff --git a/linux/my_application.cc b/linux/my_application.cc index 26ee844..dbd4e93 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "ReCon"); + gtk_header_bar_set_title(header_bar, "recon"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "ReCon"); + gtk_window_set_title(window, "recon"); } gtk_window_set_default_size(window, 480, 900); diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 4bc5c96..578036b 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -54,7 +54,7 @@ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* ReCon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReCon.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* recon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = recon.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -134,7 +134,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* ReCon.app */, + 33CC10ED2044A3C60003C045 /* recon.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -238,7 +238,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* ReCon.app */; + productReference = 33CC10ED2044A3C60003C045 /* recon.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -570,7 +570,7 @@ DEVELOPMENT_TEAM = P9AV4LPNLL; FLUTTER_BUILD_NAME = "0.11.1-beta"; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = ReCon; + INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -578,7 +578,7 @@ ); MARKETING_VERSION = "0.11.1-beta"; PRODUCT_BUNDLE_IDENTIFIER = ch.isota.recon; - PRODUCT_NAME = ReCon; + PRODUCT_NAME = recon; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -710,7 +710,7 @@ DEVELOPMENT_TEAM = P9AV4LPNLL; FLUTTER_BUILD_NAME = "0.11.1-beta"; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = ReCon; + INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -718,7 +718,7 @@ ); MARKETING_VERSION = "0.11.1-beta"; PRODUCT_BUNDLE_IDENTIFIER = ch.isota.recon; - PRODUCT_NAME = ReCon; + PRODUCT_NAME = recon; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -741,7 +741,7 @@ DEVELOPMENT_TEAM = P9AV4LPNLL; FLUTTER_BUILD_NAME = "0.11.1-beta"; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = ReCon; + INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -749,7 +749,7 @@ ); MARKETING_VERSION = "0.11.1-beta"; PRODUCT_BUNDLE_IDENTIFIER = ch.isota.recon; - PRODUCT_NAME = ReCon; + PRODUCT_NAME = recon; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 1c305fd..00df61e 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -65,7 +65,7 @@ @@ -82,7 +82,7 @@ diff --git a/pubspec.yaml b/pubspec.yaml index 7fc7ea6..d01ac17 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,4 +1,4 @@ -name: recon +name: OpenContacts description: A Resonite Contacts App for Android # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.11.3-beta+1 +version: 0.1.0-indev+1 environment: sdk: ">=3.0.1" diff --git a/test/widget_test.dart b/test/widget_test.dart index 59c6120..5462ad9 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -14,7 +14,7 @@ import 'package:recon/models/authentication_data.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(ReCon( + await tester.pumpWidget(recon( settingsClient: SettingsClient(), cachedAuthentication: AuthenticationData.unauthenticated(), )); From a844815424638457338e61e1b4c7b19c922b4805 Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 00:23:04 -0400 Subject: [PATCH 04/12] It works! --- lib/apis/cloud_variable_api.dart | 4 +-- lib/apis/contact_api.dart | 12 ++++---- lib/apis/message_api.dart | 4 +-- lib/apis/record_api.dart | 14 ++++----- lib/apis/session_api.dart | 4 +-- lib/apis/user_api.dart | 8 ++--- lib/auxiliary.dart | 2 +- lib/client_holder.dart | 8 ++--- lib/clients/api_client.dart | 2 +- lib/clients/audio_cache_client.dart | 6 ++-- lib/clients/inventory_client.dart | 8 ++--- lib/clients/messaging_client.dart | 30 +++++++++---------- lib/clients/notification_client.dart | 6 ++-- lib/clients/session_client.dart | 8 ++--- lib/clients/settings_client.dart | 2 +- lib/hub_manager.dart | 4 +-- lib/main.dart | 22 +++++++------- lib/models/cloud_variable.dart | 2 +- lib/models/inventory/resonite_directory.dart | 2 +- lib/models/message.dart | 8 ++--- lib/models/personal_profile.dart | 6 ++-- lib/models/records/asset_diff.dart | 2 +- lib/models/records/asset_digest.dart | 2 +- lib/models/records/preprocess_status.dart | 2 +- lib/models/records/record.dart | 10 +++---- lib/models/session.dart | 2 +- lib/models/session_metadata.dart | 2 +- lib/models/settings.dart | 4 +-- lib/models/users/entitlement.dart | 2 +- lib/models/users/friend.dart | 10 +++---- lib/models/users/user.dart | 2 +- lib/models/users/user_status.dart | 10 +++---- lib/widgets/formatted_text.dart | 2 +- lib/widgets/friends/friend_list_tile.dart | 18 +++++------ .../friend_online_status_indicator.dart | 6 ++-- lib/widgets/friends/friends_list.dart | 8 ++--- lib/widgets/friends/friends_list_app_bar.dart | 10 +++---- lib/widgets/friends/user_list_tile.dart | 10 +++---- lib/widgets/friends/user_search.dart | 12 ++++---- lib/widgets/homepage.dart | 16 +++++----- lib/widgets/inventory/inventory_browser.dart | 14 ++++----- .../inventory/inventory_browser_app_bar.dart | 4 +-- .../inventory/object_inventory_tile.dart | 4 +-- .../inventory/path_inventory_tile.dart | 4 +-- lib/widgets/login_screen.dart | 6 ++-- lib/widgets/messages/message_asset.dart | 12 ++++---- .../messages/message_audio_player.dart | 8 ++--- lib/widgets/messages/message_bubble.dart | 12 ++++---- lib/widgets/messages/message_input_bar.dart | 16 +++++----- .../messages/message_session_invite.dart | 14 ++++----- .../messages/message_state_indicator.dart | 4 +-- lib/widgets/messages/message_text.dart | 6 ++-- lib/widgets/messages/messages_list.dart | 14 ++++----- .../messages/messages_session_header.dart | 10 +++---- lib/widgets/my_profile_dialog.dart | 12 ++++---- .../sessions/session_filter_dialog.dart | 6 ++-- lib/widgets/sessions/session_list.dart | 12 ++++---- .../sessions/session_list_app_bar.dart | 4 +-- lib/widgets/sessions/session_view.dart | 14 ++++----- lib/widgets/settings_page.dart | 2 +- lib/widgets/update_notifier.dart | 4 +-- pubspec.yaml | 2 +- test/widget_test.dart | 6 ++-- 63 files changed, 241 insertions(+), 241 deletions(-) diff --git a/lib/apis/cloud_variable_api.dart b/lib/apis/cloud_variable_api.dart index 20700f4..99172fd 100644 --- a/lib/apis/cloud_variable_api.dart +++ b/lib/apis/cloud_variable_api.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/cloud_variable.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/cloud_variable.dart'; class CloudVariableApi { static Future readCloudVariable(ApiClient client, diff --git a/lib/apis/contact_api.dart b/lib/apis/contact_api.dart index 1cd6517..4531e0a 100644 --- a/lib/apis/contact_api.dart +++ b/lib/apis/contact_api.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/users/friend.dart'; -import 'package:recon/models/users/friend_status.dart'; -import 'package:recon/models/users/user.dart'; -import 'package:recon/models/users/user_profile.dart'; -import 'package:recon/models/users/user_status.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/users/friend.dart'; +import 'package:OpenContacts/models/users/friend_status.dart'; +import 'package:OpenContacts/models/users/user.dart'; +import 'package:OpenContacts/models/users/user_profile.dart'; +import 'package:OpenContacts/models/users/user_status.dart'; class ContactApi { static Future> getFriendsList(ApiClient client, {DateTime? lastStatusUpdate}) async { diff --git a/lib/apis/message_api.dart b/lib/apis/message_api.dart index 1b7662f..73d3c94 100644 --- a/lib/apis/message_api.dart +++ b/lib/apis/message_api.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/message.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/message.dart'; class MessageApi { static Future> getUserMessages(ApiClient client, {String userId = "", DateTime? fromTime, diff --git a/lib/apis/record_api.dart b/lib/apis/record_api.dart index 35c5110..5661e82 100644 --- a/lib/apis/record_api.dart +++ b/lib/apis/record_api.dart @@ -3,16 +3,16 @@ import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; import 'package:collection/collection.dart'; -import 'package:recon/models/records/asset_digest.dart'; -import 'package:recon/models/records/json_template.dart'; +import 'package:OpenContacts/models/records/asset_digest.dart'; +import 'package:OpenContacts/models/records/json_template.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/records/asset_upload_data.dart'; -import 'package:recon/models/records/resonite_db_asset.dart'; -import 'package:recon/models/records/preprocess_status.dart'; -import 'package:recon/models/records/record.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/records/asset_upload_data.dart'; +import 'package:OpenContacts/models/records/resonite_db_asset.dart'; +import 'package:OpenContacts/models/records/preprocess_status.dart'; +import 'package:OpenContacts/models/records/record.dart'; import 'package:http_parser/http_parser.dart'; import 'package:path/path.dart'; diff --git a/lib/apis/session_api.dart b/lib/apis/session_api.dart index 035ec6e..124c7f1 100644 --- a/lib/apis/session_api.dart +++ b/lib/apis/session_api.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/session.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/session.dart'; class SessionApi { static Future getSession(ApiClient client, {required String sessionId}) async { diff --git a/lib/apis/user_api.dart b/lib/apis/user_api.dart index 5f29968..cbf6ec8 100644 --- a/lib/apis/user_api.dart +++ b/lib/apis/user_api.dart @@ -1,9 +1,9 @@ import 'dart:convert'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/personal_profile.dart'; -import 'package:recon/models/users/user.dart'; -import 'package:recon/models/users/user_status.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/personal_profile.dart'; +import 'package:OpenContacts/models/users/user.dart'; +import 'package:OpenContacts/models/users/user_status.dart'; class UserApi { static Future> searchUsers(ApiClient client, {required String needle}) async { diff --git a/lib/auxiliary.dart b/lib/auxiliary.dart index 864f64c..d529b26 100644 --- a/lib/auxiliary.dart +++ b/lib/auxiliary.dart @@ -1,4 +1,4 @@ -import 'package:recon/config.dart'; +import 'package:OpenContacts/config.dart'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as p; import 'package:html/parser.dart' as htmlparser; diff --git a/lib/client_holder.dart b/lib/client_holder.dart index 11ddc5b..99c8e8e 100644 --- a/lib/client_holder.dart +++ b/lib/client_holder.dart @@ -1,8 +1,8 @@ -import 'package:recon/clients/api_client.dart'; -import 'package:recon/clients/notification_client.dart'; -import 'package:recon/clients/settings_client.dart'; -import 'package:recon/models/authentication_data.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/clients/notification_client.dart'; +import 'package:OpenContacts/clients/settings_client.dart'; +import 'package:OpenContacts/models/authentication_data.dart'; import 'package:flutter/material.dart'; class ClientHolder extends InheritedWidget { diff --git a/lib/clients/api_client.dart b/lib/clients/api_client.dart index 01b15ad..8a7c602 100644 --- a/lib/clients/api_client.dart +++ b/lib/clients/api_client.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:http/http.dart' as http; -import 'package:recon/models/authentication_data.dart'; +import 'package:OpenContacts/models/authentication_data.dart'; import 'package:logging/logging.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/clients/audio_cache_client.dart b/lib/clients/audio_cache_client.dart index 619b0ab..6d22c50 100644 --- a/lib/clients/audio_cache_client.dart +++ b/lib/clients/audio_cache_client.dart @@ -4,9 +4,9 @@ import 'package:ffmpeg_kit_flutter_audio/ffmpeg_kit.dart'; import 'package:http/http.dart' as http; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/message.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/message.dart'; class AudioCacheClient { final Future _directoryFuture = getTemporaryDirectory(); diff --git a/lib/clients/inventory_client.dart b/lib/clients/inventory_client.dart index a25026e..5c9a394 100644 --- a/lib/clients/inventory_client.dart +++ b/lib/clients/inventory_client.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:recon/apis/record_api.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/inventory/resonite_directory.dart'; -import 'package:recon/models/records/record.dart'; +import 'package:OpenContacts/apis/record_api.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/inventory/resonite_directory.dart'; +import 'package:OpenContacts/models/records/record.dart'; enum SortMode { name, diff --git a/lib/clients/messaging_client.dart b/lib/clients/messaging_client.dart index 59c97f2..9fa4ae2 100644 --- a/lib/clients/messaging_client.dart +++ b/lib/clients/messaging_client.dart @@ -5,21 +5,21 @@ import 'package:flutter/widgets.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:logging/logging.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:recon/apis/contact_api.dart'; -import 'package:recon/apis/message_api.dart'; -import 'package:recon/apis/session_api.dart'; -import 'package:recon/apis/user_api.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/clients/notification_client.dart'; -import 'package:recon/clients/settings_client.dart'; -import 'package:recon/crypto_helper.dart'; -import 'package:recon/hub_manager.dart'; -import 'package:recon/models/hub_events.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/models/session.dart'; -import 'package:recon/models/users/friend.dart'; -import 'package:recon/models/users/online_status.dart'; -import 'package:recon/models/users/user_status.dart'; +import 'package:OpenContacts/apis/contact_api.dart'; +import 'package:OpenContacts/apis/message_api.dart'; +import 'package:OpenContacts/apis/session_api.dart'; +import 'package:OpenContacts/apis/user_api.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/clients/notification_client.dart'; +import 'package:OpenContacts/clients/settings_client.dart'; +import 'package:OpenContacts/crypto_helper.dart'; +import 'package:OpenContacts/hub_manager.dart'; +import 'package:OpenContacts/models/hub_events.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/models/session.dart'; +import 'package:OpenContacts/models/users/friend.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; +import 'package:OpenContacts/models/users/user_status.dart'; class MessagingClient extends ChangeNotifier { static const Duration _autoRefreshDuration = Duration(seconds: 10); diff --git a/lib/clients/notification_client.dart b/lib/clients/notification_client.dart index 999ddf6..23d78f6 100644 --- a/lib/clients/notification_client.dart +++ b/lib/clients/notification_client.dart @@ -2,9 +2,9 @@ import 'dart:convert'; import 'package:collection/collection.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart' as fln; -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/models/session.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/models/session.dart'; class NotificationChannel { final String id; diff --git a/lib/clients/session_client.dart b/lib/clients/session_client.dart index d564e18..c323d2a 100644 --- a/lib/clients/session_client.dart +++ b/lib/clients/session_client.dart @@ -1,8 +1,8 @@ import 'package:collection/collection.dart'; -import 'package:recon/apis/session_api.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/clients/settings_client.dart'; -import 'package:recon/models/session.dart'; +import 'package:OpenContacts/apis/session_api.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/clients/settings_client.dart'; +import 'package:OpenContacts/models/session.dart'; import 'package:flutter/foundation.dart'; class SessionClient extends ChangeNotifier { diff --git a/lib/clients/settings_client.dart b/lib/clients/settings_client.dart index 174cad9..fd79235 100644 --- a/lib/clients/settings_client.dart +++ b/lib/clients/settings_client.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:recon/models/settings.dart'; +import 'package:OpenContacts/models/settings.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; diff --git a/lib/hub_manager.dart b/lib/hub_manager.dart index 0b8333c..64c8fce 100644 --- a/lib/hub_manager.dart +++ b/lib/hub_manager.dart @@ -3,8 +3,8 @@ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; -import 'package:recon/config.dart'; -import 'package:recon/models/hub_events.dart'; +import 'package:OpenContacts/config.dart'; +import 'package:OpenContacts/models/hub_events.dart'; import 'package:logging/logging.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/main.dart b/lib/main.dart index 3e84ffb..7382fd5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,17 +13,17 @@ import 'package:intl/intl.dart'; import 'package:logging/logging.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; -import 'package:recon/apis/github_api.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/clients/inventory_client.dart'; -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/clients/session_client.dart'; -import 'package:recon/clients/settings_client.dart'; -import 'package:recon/models/sem_ver.dart'; -import 'package:recon/widgets/homepage.dart'; -import 'package:recon/widgets/login_screen.dart'; -import 'package:recon/widgets/update_notifier.dart'; +import 'package:OpenContacts/apis/github_api.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/clients/inventory_client.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/clients/session_client.dart'; +import 'package:OpenContacts/clients/settings_client.dart'; +import 'package:OpenContacts/models/sem_ver.dart'; +import 'package:OpenContacts/widgets/homepage.dart'; +import 'package:OpenContacts/widgets/login_screen.dart'; +import 'package:OpenContacts/widgets/update_notifier.dart'; import 'models/authentication_data.dart'; diff --git a/lib/models/cloud_variable.dart b/lib/models/cloud_variable.dart index 3ce6f4a..d64ff6c 100644 --- a/lib/models/cloud_variable.dart +++ b/lib/models/cloud_variable.dart @@ -1,4 +1,4 @@ -import 'package:recon/auxiliary.dart'; +import 'package:OpenContacts/auxiliary.dart'; class CloudVariable { final String ownerId; diff --git a/lib/models/inventory/resonite_directory.dart b/lib/models/inventory/resonite_directory.dart index 202ab0d..22fdce4 100644 --- a/lib/models/inventory/resonite_directory.dart +++ b/lib/models/inventory/resonite_directory.dart @@ -1,5 +1,5 @@ import 'package:collection/collection.dart'; -import 'package:recon/models/records/record.dart'; +import 'package:OpenContacts/models/records/record.dart'; class ResoniteDirectory { static const rootName = "Inventory"; diff --git a/lib/models/message.dart b/lib/models/message.dart index 5c7661e..873d762 100644 --- a/lib/models/message.dart +++ b/lib/models/message.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'dart:developer'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/apis/message_api.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/string_formatter.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/apis/message_api.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/string_formatter.dart'; import 'package:uuid/uuid.dart'; enum MessageType { diff --git a/lib/models/personal_profile.dart b/lib/models/personal_profile.dart index 7443875..b033c7a 100644 --- a/lib/models/personal_profile.dart +++ b/lib/models/personal_profile.dart @@ -1,6 +1,6 @@ -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/users/entitlement.dart'; -import 'package:recon/models/users/user_profile.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/users/entitlement.dart'; +import 'package:OpenContacts/models/users/user_profile.dart'; class PersonalProfile { final String id; diff --git a/lib/models/records/asset_diff.dart b/lib/models/records/asset_diff.dart index 5e590c5..503200e 100644 --- a/lib/models/records/asset_diff.dart +++ b/lib/models/records/asset_diff.dart @@ -1,5 +1,5 @@ -import 'package:recon/models/records/resonite_db_asset.dart'; +import 'package:OpenContacts/models/records/resonite_db_asset.dart'; class AssetDiff extends ResoniteDBAsset{ final Diff state; diff --git a/lib/models/records/asset_digest.dart b/lib/models/records/asset_digest.dart index 86da2b8..6069b68 100644 --- a/lib/models/records/asset_digest.dart +++ b/lib/models/records/asset_digest.dart @@ -1,7 +1,7 @@ import 'dart:typed_data'; -import 'package:recon/models/records/resonite_db_asset.dart'; +import 'package:OpenContacts/models/records/resonite_db_asset.dart'; import 'package:path/path.dart'; class AssetDigest { diff --git a/lib/models/records/preprocess_status.dart b/lib/models/records/preprocess_status.dart index 675b1c8..b974652 100644 --- a/lib/models/records/preprocess_status.dart +++ b/lib/models/records/preprocess_status.dart @@ -1,4 +1,4 @@ -import 'package:recon/models/records/asset_diff.dart'; +import 'package:OpenContacts/models/records/asset_diff.dart'; enum RecordPreprocessState { diff --git a/lib/models/records/record.dart b/lib/models/records/record.dart index 174efc1..383da56 100644 --- a/lib/models/records/record.dart +++ b/lib/models/records/record.dart @@ -1,8 +1,8 @@ -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/models/records/asset_digest.dart'; -import 'package:recon/models/records/resonite_db_asset.dart'; -import 'package:recon/string_formatter.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/models/records/asset_digest.dart'; +import 'package:OpenContacts/models/records/resonite_db_asset.dart'; +import 'package:OpenContacts/string_formatter.dart'; import 'package:flutter/material.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/models/session.dart b/lib/models/session.dart index 1bc2791..9af34f6 100644 --- a/lib/models/session.dart +++ b/lib/models/session.dart @@ -1,4 +1,4 @@ -import 'package:recon/string_formatter.dart'; +import 'package:OpenContacts/string_formatter.dart'; class Session { final String id; diff --git a/lib/models/session_metadata.dart b/lib/models/session_metadata.dart index 1e97a97..e189841 100644 --- a/lib/models/session_metadata.dart +++ b/lib/models/session_metadata.dart @@ -1,4 +1,4 @@ -import 'package:recon/models/session.dart'; +import 'package:OpenContacts/models/session.dart'; import 'package:intl/intl.dart'; class SessionMetadata { diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 1269733..bf00aeb 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:recon/models/sem_ver.dart'; -import 'package:recon/models/users/online_status.dart'; +import 'package:OpenContacts/models/sem_ver.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; import 'package:flutter/material.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/models/users/entitlement.dart b/lib/models/users/entitlement.dart index 75a573e..c945387 100644 --- a/lib/models/users/entitlement.dart +++ b/lib/models/users/entitlement.dart @@ -1,4 +1,4 @@ -import 'package:recon/auxiliary.dart'; +import 'package:OpenContacts/auxiliary.dart'; class Entitlement { Entitlement(); diff --git a/lib/models/users/friend.dart b/lib/models/users/friend.dart index 461937b..c9278f4 100644 --- a/lib/models/users/friend.dart +++ b/lib/models/users/friend.dart @@ -1,8 +1,8 @@ -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/users/friend_status.dart'; -import 'package:recon/models/users/online_status.dart'; -import 'package:recon/models/users/user_profile.dart'; -import 'package:recon/models/users/user_status.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/users/friend_status.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; +import 'package:OpenContacts/models/users/user_profile.dart'; +import 'package:OpenContacts/models/users/user_status.dart'; class Friend implements Comparable { static const _emptyId = "-1"; diff --git a/lib/models/users/user.dart b/lib/models/users/user.dart index 91ca1d1..1592f0f 100644 --- a/lib/models/users/user.dart +++ b/lib/models/users/user.dart @@ -1,4 +1,4 @@ -import 'package:recon/models/users/user_profile.dart'; +import 'package:OpenContacts/models/users/user_profile.dart'; class User { final String id; diff --git a/lib/models/users/user_status.dart b/lib/models/users/user_status.dart index 3f1f76d..20a5f02 100644 --- a/lib/models/users/user_status.dart +++ b/lib/models/users/user_status.dart @@ -1,9 +1,9 @@ import 'package:intl/intl.dart'; -import 'package:recon/config.dart'; -import 'package:recon/crypto_helper.dart'; -import 'package:recon/models/session.dart'; -import 'package:recon/models/session_metadata.dart'; -import 'package:recon/models/users/online_status.dart'; +import 'package:OpenContacts/config.dart'; +import 'package:OpenContacts/crypto_helper.dart'; +import 'package:OpenContacts/models/session.dart'; +import 'package:OpenContacts/models/session_metadata.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; import 'package:uuid/uuid.dart'; enum UserSessionType diff --git a/lib/widgets/formatted_text.dart b/lib/widgets/formatted_text.dart index 0d50bef..c693fc0 100644 --- a/lib/widgets/formatted_text.dart +++ b/lib/widgets/formatted_text.dart @@ -1,4 +1,4 @@ -import 'package:recon/string_formatter.dart'; +import 'package:OpenContacts/string_formatter.dart'; import 'package:flutter/material.dart'; class FormattedText extends StatelessWidget { diff --git a/lib/widgets/friends/friend_list_tile.dart b/lib/widgets/friends/friend_list_tile.dart index 36dc4e4..e670ca3 100644 --- a/lib/widgets/friends/friend_list_tile.dart +++ b/lib/widgets/friends/friend_list_tile.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/models/users/friend.dart'; -import 'package:recon/models/users/online_status.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/friends/friend_online_status_indicator.dart'; -import 'package:recon/widgets/generic_avatar.dart'; -import 'package:recon/widgets/messages/messages_list.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/models/users/friend.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/friends/friend_online_status_indicator.dart'; +import 'package:OpenContacts/widgets/generic_avatar.dart'; +import 'package:OpenContacts/widgets/messages/messages_list.dart'; class FriendListTile extends StatelessWidget { const FriendListTile({required this.friend, required this.unreads, this.onTap, super.key}); diff --git a/lib/widgets/friends/friend_online_status_indicator.dart b/lib/widgets/friends/friend_online_status_indicator.dart index 48e13e1..fbd7a36 100644 --- a/lib/widgets/friends/friend_online_status_indicator.dart +++ b/lib/widgets/friends/friend_online_status_indicator.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:recon/models/users/friend.dart'; -import 'package:recon/models/users/online_status.dart'; -import 'package:recon/models/users/user_status.dart'; +import 'package:OpenContacts/models/users/friend.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; +import 'package:OpenContacts/models/users/user_status.dart'; class FriendOnlineStatusIndicator extends StatelessWidget { const FriendOnlineStatusIndicator({required this.friend, super.key}); diff --git a/lib/widgets/friends/friends_list.dart b/lib/widgets/friends/friends_list.dart index 3fd2430..69d106e 100644 --- a/lib/widgets/friends/friends_list.dart +++ b/lib/widgets/friends/friends_list.dart @@ -1,7 +1,7 @@ -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/widgets/default_error_widget.dart'; -import 'package:recon/widgets/friends/expanding_input_fab.dart'; -import 'package:recon/widgets/friends/friend_list_tile.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/widgets/default_error_widget.dart'; +import 'package:OpenContacts/widgets/friends/expanding_input_fab.dart'; +import 'package:OpenContacts/widgets/friends/friend_list_tile.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/friends/friends_list_app_bar.dart b/lib/widgets/friends/friends_list_app_bar.dart index 218c27c..245c3ba 100644 --- a/lib/widgets/friends/friends_list_app_bar.dart +++ b/lib/widgets/friends/friends_list_app_bar.dart @@ -1,9 +1,9 @@ import 'package:collection/collection.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/models/users/online_status.dart'; -import 'package:recon/widgets/friends/user_search.dart'; -import 'package:recon/widgets/my_profile_dialog.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/models/users/online_status.dart'; +import 'package:OpenContacts/widgets/friends/user_search.dart'; +import 'package:OpenContacts/widgets/my_profile_dialog.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/friends/user_list_tile.dart b/lib/widgets/friends/user_list_tile.dart index 2cd3999..2e4f881 100644 --- a/lib/widgets/friends/user_list_tile.dart +++ b/lib/widgets/friends/user_list_tile.dart @@ -1,8 +1,8 @@ -import 'package:recon/apis/contact_api.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/models/users/user.dart'; -import 'package:recon/widgets/generic_avatar.dart'; +import 'package:OpenContacts/apis/contact_api.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/models/users/user.dart'; +import 'package:OpenContacts/widgets/generic_avatar.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/widgets/friends/user_search.dart b/lib/widgets/friends/user_search.dart index fa36fe2..dc374a8 100644 --- a/lib/widgets/friends/user_search.dart +++ b/lib/widgets/friends/user_search.dart @@ -1,11 +1,11 @@ import 'dart:async'; -import 'package:recon/apis/user_api.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/models/users/user.dart'; -import 'package:recon/widgets/default_error_widget.dart'; -import 'package:recon/widgets/friends/user_list_tile.dart'; +import 'package:OpenContacts/apis/user_api.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/models/users/user.dart'; +import 'package:OpenContacts/widgets/default_error_widget.dart'; +import 'package:OpenContacts/widgets/friends/user_list_tile.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/homepage.dart b/lib/widgets/homepage.dart index 2cbece2..fe8118b 100644 --- a/lib/widgets/homepage.dart +++ b/lib/widgets/homepage.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:recon/widgets/friends/friends_list.dart'; -import 'package:recon/widgets/friends/friends_list_app_bar.dart'; -import 'package:recon/widgets/inventory/inventory_browser.dart'; -import 'package:recon/widgets/inventory/inventory_browser_app_bar.dart'; -import 'package:recon/widgets/sessions/session_list.dart'; -import 'package:recon/widgets/sessions/session_list_app_bar.dart'; -import 'package:recon/widgets/settings_app_bar.dart'; -import 'package:recon/widgets/settings_page.dart'; +import 'package:OpenContacts/widgets/friends/friends_list.dart'; +import 'package:OpenContacts/widgets/friends/friends_list_app_bar.dart'; +import 'package:OpenContacts/widgets/inventory/inventory_browser.dart'; +import 'package:OpenContacts/widgets/inventory/inventory_browser_app_bar.dart'; +import 'package:OpenContacts/widgets/sessions/session_list.dart'; +import 'package:OpenContacts/widgets/sessions/session_list_app_bar.dart'; +import 'package:OpenContacts/widgets/settings_app_bar.dart'; +import 'package:OpenContacts/widgets/settings_page.dart'; class Home extends StatefulWidget { const Home({super.key}); diff --git a/lib/widgets/inventory/inventory_browser.dart b/lib/widgets/inventory/inventory_browser.dart index 016874d..cf05849 100644 --- a/lib/widgets/inventory/inventory_browser.dart +++ b/lib/widgets/inventory/inventory_browser.dart @@ -5,13 +5,13 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:photo_view/photo_view.dart'; import 'package:provider/provider.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/inventory_client.dart'; -import 'package:recon/models/inventory/resonite_directory.dart'; -import 'package:recon/models/records/record.dart'; -import 'package:recon/widgets/default_error_widget.dart'; -import 'package:recon/widgets/inventory/object_inventory_tile.dart'; -import 'package:recon/widgets/inventory/path_inventory_tile.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/clients/inventory_client.dart'; +import 'package:OpenContacts/models/inventory/resonite_directory.dart'; +import 'package:OpenContacts/models/records/record.dart'; +import 'package:OpenContacts/widgets/default_error_widget.dart'; +import 'package:OpenContacts/widgets/inventory/object_inventory_tile.dart'; +import 'package:OpenContacts/widgets/inventory/path_inventory_tile.dart'; class InventoryBrowser extends StatefulWidget { const InventoryBrowser({super.key}); diff --git a/lib/widgets/inventory/inventory_browser_app_bar.dart b/lib/widgets/inventory/inventory_browser_app_bar.dart index f2ec14e..9df8483 100644 --- a/lib/widgets/inventory/inventory_browser_app_bar.dart +++ b/lib/widgets/inventory/inventory_browser_app_bar.dart @@ -9,8 +9,8 @@ import 'package:intl/intl.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/inventory_client.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/clients/inventory_client.dart'; import 'package:share_plus/share_plus.dart'; class InventoryBrowserAppBar extends StatefulWidget { diff --git a/lib/widgets/inventory/object_inventory_tile.dart b/lib/widgets/inventory/object_inventory_tile.dart index b3df1d3..b7d1676 100644 --- a/lib/widgets/inventory/object_inventory_tile.dart +++ b/lib/widgets/inventory/object_inventory_tile.dart @@ -1,6 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/records/record.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/records/record.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/widgets/inventory/path_inventory_tile.dart b/lib/widgets/inventory/path_inventory_tile.dart index c1d56b0..f6c2fbd 100644 --- a/lib/widgets/inventory/path_inventory_tile.dart +++ b/lib/widgets/inventory/path_inventory_tile.dart @@ -1,5 +1,5 @@ -import 'package:recon/models/records/record.dart'; -import 'package:recon/widgets/formatted_text.dart'; +import 'package:OpenContacts/models/records/record.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; import 'package:flutter/material.dart'; class PathInventoryTile extends StatelessWidget { diff --git a/lib/widgets/login_screen.dart b/lib/widgets/login_screen.dart index 09b370d..c2f1137 100644 --- a/lib/widgets/login_screen.dart +++ b/lib/widgets/login_screen.dart @@ -3,9 +3,9 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/models/authentication_data.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/models/authentication_data.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({this.onLoginSuccessful, this.cachedUsername, super.key}); diff --git a/lib/widgets/messages/message_asset.dart b/lib/widgets/messages/message_asset.dart index ab2adeb..50f14fd 100644 --- a/lib/widgets/messages/message_asset.dart +++ b/lib/widgets/messages/message_asset.dart @@ -2,12 +2,12 @@ import 'dart:convert'; import 'package:cached_network_image/cached_network_image.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/photo_asset.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/string_formatter.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/messages/message_state_indicator.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/photo_asset.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/string_formatter.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/messages/message_state_indicator.dart'; import 'package:flutter/material.dart'; import 'package:photo_view/photo_view.dart'; diff --git a/lib/widgets/messages/message_audio_player.dart b/lib/widgets/messages/message_audio_player.dart index f8e67f7..fe83002 100644 --- a/lib/widgets/messages/message_audio_player.dart +++ b/lib/widgets/messages/message_audio_player.dart @@ -3,10 +3,10 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; import 'package:provider/provider.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/audio_cache_client.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/widgets/messages/message_state_indicator.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/clients/audio_cache_client.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/widgets/messages/message_state_indicator.dart'; class MessageAudioPlayer extends StatefulWidget { const MessageAudioPlayer({required this.message, this.foregroundColor, super.key}); diff --git a/lib/widgets/messages/message_bubble.dart b/lib/widgets/messages/message_bubble.dart index 0c2d9f0..baf04cd 100644 --- a/lib/widgets/messages/message_bubble.dart +++ b/lib/widgets/messages/message_bubble.dart @@ -1,9 +1,9 @@ -import 'package:recon/client_holder.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/widgets/messages/message_asset.dart'; -import 'package:recon/widgets/messages/message_audio_player.dart'; -import 'package:recon/widgets/messages/message_session_invite.dart'; -import 'package:recon/widgets/messages/message_text.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/widgets/messages/message_asset.dart'; +import 'package:OpenContacts/widgets/messages/message_audio_player.dart'; +import 'package:OpenContacts/widgets/messages/message_session_invite.dart'; +import 'package:OpenContacts/widgets/messages/message_text.dart'; import 'package:flutter/material.dart'; class MessageBubble extends StatelessWidget { diff --git a/lib/widgets/messages/message_input_bar.dart b/lib/widgets/messages/message_input_bar.dart index ebe1a35..45a8b62 100644 --- a/lib/widgets/messages/message_input_bar.dart +++ b/lib/widgets/messages/message_input_bar.dart @@ -7,14 +7,14 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; -import 'package:recon/apis/record_api.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/clients/api_client.dart'; -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/models/users/friend.dart'; -import 'package:recon/widgets/messages/message_attachment_list.dart'; +import 'package:OpenContacts/apis/record_api.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/clients/api_client.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/models/users/friend.dart'; +import 'package:OpenContacts/widgets/messages/message_attachment_list.dart'; import 'package:record/record.dart'; class MessageInputBar extends StatefulWidget { diff --git a/lib/widgets/messages/message_session_invite.dart b/lib/widgets/messages/message_session_invite.dart index f7f9d88..e346ccc 100644 --- a/lib/widgets/messages/message_session_invite.dart +++ b/lib/widgets/messages/message_session_invite.dart @@ -1,12 +1,12 @@ import 'dart:convert'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/models/session.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/generic_avatar.dart'; -import 'package:recon/widgets/messages/message_state_indicator.dart'; -import 'package:recon/widgets/sessions/session_view.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/models/session.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/generic_avatar.dart'; +import 'package:OpenContacts/widgets/messages/message_state_indicator.dart'; +import 'package:OpenContacts/widgets/sessions/session_view.dart'; import 'package:flutter/material.dart'; class MessageSessionInvite extends StatelessWidget { diff --git a/lib/widgets/messages/message_state_indicator.dart b/lib/widgets/messages/message_state_indicator.dart index e3a2b17..a78eb87 100644 --- a/lib/widgets/messages/message_state_indicator.dart +++ b/lib/widgets/messages/message_state_indicator.dart @@ -1,5 +1,5 @@ -import 'package:recon/client_holder.dart'; -import 'package:recon/models/message.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/models/message.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/widgets/messages/message_text.dart b/lib/widgets/messages/message_text.dart index 5587505..1ca33de 100644 --- a/lib/widgets/messages/message_text.dart +++ b/lib/widgets/messages/message_text.dart @@ -2,9 +2,9 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:recon/models/message.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/messages/message_state_indicator.dart'; +import 'package:OpenContacts/models/message.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/messages/message_state_indicator.dart'; class MessageText extends StatelessWidget { const MessageText({required this.message, this.foregroundColor, super.key}); diff --git a/lib/widgets/messages/messages_list.dart b/lib/widgets/messages/messages_list.dart index 2c2539e..b5d3e29 100644 --- a/lib/widgets/messages/messages_list.dart +++ b/lib/widgets/messages/messages_list.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:recon/clients/audio_cache_client.dart'; -import 'package:recon/clients/messaging_client.dart'; -import 'package:recon/models/users/friend.dart'; -import 'package:recon/widgets/default_error_widget.dart'; -import 'package:recon/widgets/friends/friend_online_status_indicator.dart'; -import 'package:recon/widgets/messages/message_input_bar.dart'; -import 'package:recon/widgets/messages/messages_session_header.dart'; +import 'package:OpenContacts/clients/audio_cache_client.dart'; +import 'package:OpenContacts/clients/messaging_client.dart'; +import 'package:OpenContacts/models/users/friend.dart'; +import 'package:OpenContacts/widgets/default_error_widget.dart'; +import 'package:OpenContacts/widgets/friends/friend_online_status_indicator.dart'; +import 'package:OpenContacts/widgets/messages/message_input_bar.dart'; +import 'package:OpenContacts/widgets/messages/messages_session_header.dart'; import 'message_bubble.dart'; diff --git a/lib/widgets/messages/messages_session_header.dart b/lib/widgets/messages/messages_session_header.dart index 9c4d96f..a709ed8 100644 --- a/lib/widgets/messages/messages_session_header.dart +++ b/lib/widgets/messages/messages_session_header.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/models/session.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/generic_avatar.dart'; -import 'package:recon/widgets/sessions/session_view.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/models/session.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/generic_avatar.dart'; +import 'package:OpenContacts/widgets/sessions/session_view.dart'; class SessionTile extends StatelessWidget { const SessionTile({required this.session, super.key}); diff --git a/lib/widgets/my_profile_dialog.dart b/lib/widgets/my_profile_dialog.dart index 7e5b49b..db19418 100644 --- a/lib/widgets/my_profile_dialog.dart +++ b/lib/widgets/my_profile_dialog.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:recon/apis/user_api.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/models/personal_profile.dart'; -import 'package:recon/widgets/default_error_widget.dart'; -import 'package:recon/widgets/generic_avatar.dart'; +import 'package:OpenContacts/apis/user_api.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/models/personal_profile.dart'; +import 'package:OpenContacts/widgets/default_error_widget.dart'; +import 'package:OpenContacts/widgets/generic_avatar.dart'; class MyProfileDialog extends StatefulWidget { const MyProfileDialog({super.key}); diff --git a/lib/widgets/sessions/session_filter_dialog.dart b/lib/widgets/sessions/session_filter_dialog.dart index 1b27d40..6395c73 100644 --- a/lib/widgets/sessions/session_filter_dialog.dart +++ b/lib/widgets/sessions/session_filter_dialog.dart @@ -1,8 +1,8 @@ import 'dart:math'; -import 'package:recon/client_holder.dart'; -import 'package:recon/clients/session_client.dart'; -import 'package:recon/models/session.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/clients/session_client.dart'; +import 'package:OpenContacts/models/session.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/sessions/session_list.dart b/lib/widgets/sessions/session_list.dart index 3565432..f4a6c1c 100644 --- a/lib/widgets/sessions/session_list.dart +++ b/lib/widgets/sessions/session_list.dart @@ -1,10 +1,10 @@ import 'package:cached_network_image/cached_network_image.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/clients/session_client.dart'; -import 'package:recon/models/session.dart'; -import 'package:recon/widgets/default_error_widget.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/sessions/session_view.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/clients/session_client.dart'; +import 'package:OpenContacts/models/session.dart'; +import 'package:OpenContacts/widgets/default_error_widget.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/sessions/session_view.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/sessions/session_list_app_bar.dart b/lib/widgets/sessions/session_list_app_bar.dart index 205eee7..b0d3c31 100644 --- a/lib/widgets/sessions/session_list_app_bar.dart +++ b/lib/widgets/sessions/session_list_app_bar.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:recon/clients/session_client.dart'; -import 'package:recon/widgets/sessions/session_filter_dialog.dart'; +import 'package:OpenContacts/clients/session_client.dart'; +import 'package:OpenContacts/widgets/sessions/session_filter_dialog.dart'; class SessionListAppBar extends StatefulWidget { const SessionListAppBar({super.key}); diff --git a/lib/widgets/sessions/session_view.dart b/lib/widgets/sessions/session_view.dart index 5f3a72e..8f20525 100644 --- a/lib/widgets/sessions/session_view.dart +++ b/lib/widgets/sessions/session_view.dart @@ -1,11 +1,11 @@ import 'package:cached_network_image/cached_network_image.dart'; -import 'package:recon/apis/session_api.dart'; -import 'package:recon/auxiliary.dart'; -import 'package:recon/client_holder.dart'; -import 'package:recon/models/session.dart'; -import 'package:recon/widgets/formatted_text.dart'; -import 'package:recon/widgets/panorama.dart'; -import 'package:recon/widgets/settings_page.dart'; +import 'package:OpenContacts/apis/session_api.dart'; +import 'package:OpenContacts/auxiliary.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/models/session.dart'; +import 'package:OpenContacts/widgets/formatted_text.dart'; +import 'package:OpenContacts/widgets/panorama.dart'; +import 'package:OpenContacts/widgets/settings_page.dart'; import 'package:flutter/material.dart'; class SessionView extends StatefulWidget { diff --git a/lib/widgets/settings_page.dart b/lib/widgets/settings_page.dart index b16b940..e16e07f 100644 --- a/lib/widgets/settings_page.dart +++ b/lib/widgets/settings_page.dart @@ -1,4 +1,4 @@ -import 'package:recon/client_holder.dart'; +import 'package:OpenContacts/client_holder.dart'; import 'package:flutter/material.dart'; import 'package:flutter_phoenix/flutter_phoenix.dart'; import 'package:intl/intl.dart'; diff --git a/lib/widgets/update_notifier.dart b/lib/widgets/update_notifier.dart index 415cec7..7080f03 100644 --- a/lib/widgets/update_notifier.dart +++ b/lib/widgets/update_notifier.dart @@ -1,5 +1,5 @@ -import 'package:recon/client_holder.dart'; -import 'package:recon/models/sem_ver.dart'; +import 'package:OpenContacts/client_holder.dart'; +import 'package:OpenContacts/models/sem_ver.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index d01ac17..7686589 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.1.0-indev+1 +version: 0.0.1-indev+1 environment: sdk: ">=3.0.1" diff --git a/test/widget_test.dart b/test/widget_test.dart index 5462ad9..acd3281 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -7,9 +7,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:recon/clients/settings_client.dart'; -import 'package:recon/main.dart'; -import 'package:recon/models/authentication_data.dart'; +import 'package:OpenContacts/clients/settings_client.dart'; +import 'package:OpenContacts/main.dart'; +import 'package:OpenContacts/models/authentication_data.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { From bfcee0318551c419b7b1710beee3d17c48ea65cb Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 01:00:34 -0400 Subject: [PATCH 05/12] Changed README --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index cfbddfb..a8e9305 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ - + -# recon +## OpenContacts -A Resonite Contacts App +A Resonite Contacts App, based on Nutcake's Recon. -[Get it here](https://github.com/Nutcake/recon/releases/latest) +[Get the latest version of OpenContacts here](https://git.mrdab.vore.media/ThatOneJackalGuy/OpenContacts) -## Building +[Get ReCon here](https://github.com/Nutcake/ReCon) + +# Building This is a standard Flutter application, refer to the [Flutter docs](https://docs.flutter.dev/get-started/install) on how to build it. @@ -15,6 +17,7 @@ Currently only Android is fully supported. The app works on other platforms, though not every feature will be functional. For example, notifications are currently not supported on non-android builds. -## Screenshots +# Screenshots +TODO: Screenshots! - + \ No newline at end of file From 3953f8094035f476329d06e72e1fe2052b988114 Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 02:08:17 -0400 Subject: [PATCH 06/12] Changed several strings --- lib/widgets/friends/expanding_input_fab.dart | 2 +- lib/widgets/friends/friends_list_app_bar.dart | 4 ++-- lib/widgets/friends/user_search.dart | 2 +- lib/widgets/login_screen.dart | 19 +++++++++++++------ lib/widgets/settings_page.dart | 2 +- lib/widgets/update_notifier.dart | 2 +- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/widgets/friends/expanding_input_fab.dart b/lib/widgets/friends/expanding_input_fab.dart index fffd932..dff6a41 100644 --- a/lib/widgets/friends/expanding_input_fab.dart +++ b/lib/widgets/friends/expanding_input_fab.dart @@ -66,7 +66,7 @@ class _ExpandingInputFabState extends State { }, splashRadius: 16, iconSize: 28, - icon: _isExtended ? const Icon(Icons.close) : const Icon(Icons.search), + icon: _isExtended ? const Icon(Icons.close) : const Icon(Icons.person_search), ), ) ], diff --git a/lib/widgets/friends/friends_list_app_bar.dart b/lib/widgets/friends/friends_list_app_bar.dart index 245c3ba..f2ac86a 100644 --- a/lib/widgets/friends/friends_list_app_bar.dart +++ b/lib/widgets/friends/friends_list_app_bar.dart @@ -21,7 +21,7 @@ class _FriendsListAppBarState extends State with AutomaticKee Widget build(BuildContext context) { super.build(context); return AppBar( - title: const Text("recon"), + title: const Text("OpenContacts"), actions: [ Consumer(builder: (context, client, _) { return PopupMenuButton( @@ -85,7 +85,7 @@ class _FriendsListAppBarState extends State with AutomaticKee }, itemBuilder: (BuildContext context) => [ MenuItemDefinition( - name: "Find Users", + name: "Add Users", icon: Icons.person_add, onTap: () async { final mClient = Provider.of(context, listen: false); diff --git a/lib/widgets/friends/user_search.dart b/lib/widgets/friends/user_search.dart index dc374a8..d22f563 100644 --- a/lib/widgets/friends/user_search.dart +++ b/lib/widgets/friends/user_search.dart @@ -56,7 +56,7 @@ class _UserSearchState extends State { final mClient = Provider.of(context, listen: false); return Scaffold( appBar: AppBar( - title: const Text("Find Users"), + title: const Text("Add Users"), ), body: SafeArea( top: false, diff --git a/lib/widgets/login_screen.dart b/lib/widgets/login_screen.dart index c2f1137..a0bd481 100644 --- a/lib/widgets/login_screen.dart +++ b/lib/widgets/login_screen.dart @@ -27,7 +27,7 @@ class _LoginScreenState extends State { late final FocusNode _totpFocusNode; bool _isLoading = false; - bool _isUsernameEmail = false; + bool _isEmailResetSend = false; String _error = ""; bool _needsTotp = false; @@ -47,7 +47,7 @@ class _LoginScreenState extends State { _totpFocusNode.dispose(); super.dispose(); } - RegExp emailReg = new RegExp( + RegExp emailReg = RegExp( r"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$", caseSensitive: false, @@ -112,15 +112,22 @@ class _LoginScreenState extends State { } } Future passwordResetSubmit() async { - if (_usernameController.text.contains(emailReg) || _passwordController.text.isEmpty) { + if (_usernameController.text.isEmpty) { setState(() { _error = "Please provide an email on the 'Username' textbox"; }); return; + } + if (_usernameController.text.contains(emailReg)) { + setState(() { + _error = "An email to reset your password has been requested to resonite."; + _isEmailResetSend = true; + }); + return; } setState(() { _error = ""; - _isLoading = false; + _isEmailResetSend = true; }); /*try { final authData = await ApiClient.tryLogin( @@ -223,7 +230,7 @@ class _LoginScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("recon"), + title: const Text("OpenContacts"), ), body: Builder(builder: (context) { return ListView( @@ -292,7 +299,7 @@ class _LoginScreenState extends State { ), Padding( padding: const EdgeInsets.only(top: 16), - child: _isUsernameEmail + child: _isEmailResetSend ? const Center(child: CircularProgressIndicator()) : TextButton.icon( onPressed: passwordResetSubmit, diff --git a/lib/widgets/settings_page.dart b/lib/widgets/settings_page.dart index e16e07f..dcc18f3 100644 --- a/lib/widgets/settings_page.dart +++ b/lib/widgets/settings_page.dart @@ -95,7 +95,7 @@ class SettingsPage extends StatelessWidget { child: Image.asset("assets/images/logo512.png"), ), ), - applicationLegalese: "Created by Nutcake with love <3", + applicationLegalese: "ReCon by Nutcake, OpenContacts by ThatOneJackalGuy. Both apps made with <3", ); }, ) diff --git a/lib/widgets/update_notifier.dart b/lib/widgets/update_notifier.dart index 7080f03..f07ad32 100644 --- a/lib/widgets/update_notifier.dart +++ b/lib/widgets/update_notifier.dart @@ -54,7 +54,7 @@ class UpdateNotifier extends StatelessWidget { .secondary ), icon: const Icon(Icons.download), - label: const Text("Get it on Github"), + label: const Text("Get it on Forgejo"), ), ], ), From 66c8c066736fdc4c695dce87dc67fdd20ba17b6d Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 11:13:40 -0400 Subject: [PATCH 07/12] Preping for merge in main --- .gitignore | 2 ++ android/app/build.gradle | 2 +- android/app/src/debug/AndroidManifest.xml | 2 +- android/app/src/main/AndroidManifest.xml | 2 +- .../main/kotlin/de/voidspace/recon/MainActivity.kt | 2 +- android/app/src/profile/AndroidManifest.xml | 2 +- lib/widgets/friends/friends_list_app_bar.dart | 2 +- lib/widgets/homepage.dart | 12 ++++++------ lib/widgets/login_screen.dart | 8 ++++---- linux/CMakeLists.txt | 2 +- 10 files changed, 19 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index d5aa5f0..b9e9a75 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,5 @@ app.*.map.json /android/app/profile /android/app/release /android/key.properties + +# NEVER STORE ANY KEY OR API KEYS WHEN COMMITING CODE!! diff --git a/android/app/build.gradle b/android/app/build.gradle index cf8a587..73e9618 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -49,7 +49,7 @@ android { } defaultConfig { - applicationId "de.voidspace.recon" + applicationId "de.tojcklguy.opencontacts" minSdkVersion 24 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 68748a4..15eb43f 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="de.tojcklguy.opencontacts"> diff --git a/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt b/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt index 61d9bb0..d86b75a 100644 --- a/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt +++ b/android/app/src/main/kotlin/de/voidspace/recon/MainActivity.kt @@ -1,4 +1,4 @@ -package de.voidspace.recon +package de.tojcklguy.opencontacts import io.flutter.embedding.android.FlutterActivity diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 68748a4..15eb43f 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="de.tojcklguy.opencontacts"> =@WbSgh?pjWk?p~&@7J!$R7l)0botwF-vjvBft5w>O7&!pY0!p%P-g~DX zE_tQD|2v0vvf_3$^x_4P?Cb z(m%2Un6gn!p6&9yFKN5ML9n-42D-C6yw_sKG=m+9b4#o{wJAIIw~Qk=yraTyJIlVA z!q%c+%mE1ZRz4>F`a}CTl$nBaPnmYghudJikn@V#%wZXwd9n=@r4xZ+tp) zQpB<4nwO2gXy^0y19!4kcJ@*6rSqcl(4^3hRoiUuOxL_GbT$3h>?LsEu|Tv*Pi)uj z8+fb3A_9jq9~2uPFiJ^tDY(=d7j zBCG*BaXb|y;DV_q36AYx>>I`UofjhI%S{>?)9xLUJws4ZgRIxdZFE06WBd%3MrU9I z;n8C!BqZ1>J^VGZrhY3cqhwBsgl{In=sB(hd(eA{)E z;0su6AM`jgs;tL-(COxxATT`kc%4MA5e7TPH%WoqL8J_DAxfzO`If(KKLGFVKy^Uo z2^k-!X;D61SJKoABDRz!lXfF?I-KvwQk%`3D_jN2{?*RN*(`+Tq^N2jhKdb&fpNrN zZ|FhRRGrK{7}#v@Q&;*1I|rfqj9&ENi_8#MpKzg0<}z!lF)vPO;qL+^02TDEm~R;^ z)9Esu5s**?^m=|HWK}u;defaM7T|xBBUgh*ABH$+rICe2zFz$E{ySB^5LmxSB%OS~ zLFhXI80A|aRlHY<>dW%GRTA@W#(v&&>%?p<3b9)V<$ko8Qq9GPILsN(yXE7`Lh0cC zC(!pDIs4YmjRPbE1L6IS3*1S*DGmZ(E{Z!fYhcq=Mlu5Qb}EfF6Wqv8JaaR}r(L;mN(4tVt02oVE$9}D)v<_0pmSKZ)3 zW4nZc!fB%E0Ht^9e|Grv84T-j2KdIlV-?j0+_ZmCu9XP~Vv(hgJ7yPpJu!PR)fl$j z(34T+Nu|!?8X18fKz$m(=f7+@Mqnw9OXTBxv{3Oc7*B!)0y`-?TNn@}l(r(+FyKuQB`p(2bK%cgVt~wt7dtY|ois zA!*tn)W=03Ljd!nE=&YqxKA}Nve8}+c#RseSK(nCD}ian_)ncC)u#1~e3Mj=Dc*_TR@{ddL=hhpH7Md8=^R- zR0H<2HBh99Nk0Hr1m_Z5IauZN?;`ogng5KN03WOyoE<0I$P9^(Iitrzk~;wp6gO%Z zJ<9%&o|l6+j$!*t1Tu23YY>2vFp`OE`hew@rz2IbiqJvo>9q>kFSt(No;`q4MlLQz z01G8GhMjW5RL80_be)*wMCS^qRH{Gh-Haq#{QFh>=5Nsbi>Y>*Bm+&O-%d1*`;EF@ zl|^CTXtOe(pz$x+F{opNeerp)$YhWcHI2T=Z<2XYo z<7a>(JkPVKR9}2%+HU-=l%fb3W|#bD89dE96^2zB)>H6ZTmQ`7_k6L{;7#>#e z+`O`+o^>%#O@P3yOiJm-^iV5IwU0v+E|&>s+D>c^*qKMNM7FKzOK7T&a0}4+u34Os zBaeg=0X_*M)m4hlKl^Aqj&y zb~JC{IiJr4I~9IUxTD9`R$5;f4f!10N4>=p@W#1dVL{wPk;^78fw^>mZyuwg?6lrv zXY#oD2_=|ImH;sAibpFVjQmJp!5fB#-LgrYWjYOE^RMFjRF zwMqb!*T7z+Vg7L2wcympUYMi$0|*Zu@$=IgefQpQINQla-t;{5an(GF1vth(H^}F{ zZYbFqG+~Xc#te-lD~c~S$#DZ+pnww)!j+q@3cTA5wOS5vUdMl^2ZeQzF5k(9coQ;d166w`9Y5ivY=rE%QU| z(bz*83EPS1zV#X>LMkKf$pJ0&548it1;PvGV*mp9b5AdQdfX_fQ7mJrCg0Q|rm z4EE;?=TNTawuxO#L45oSue0Q}-~ZgMjhTh!uOaaEXMG^8?fLK*(}Yao1|z7?)EN3O zbX02IW^z(T!E&m^3_AIZCdJE@#kZ1Qa+4 z0t3#S^kdJF3wOPoWqOq@mxTlkh=@kXcV9l?T)m^AV>_IHMLDpTLl<`J14slGK&AE; zjGwLs)6$nEr1K6+CtMUls{Qf5SRqYeo;ZNViZHTQO8mo?ABGyO_6hwMW4jUJaVJS| z+ws^fc4UK6Z%r67rNOJ3xG?M<@PwbvHAADMz;${p+uY}rC-_;x z6=pXl4EVT)L-2g83rD|YD+Ft7JUjO_o^@MPIH}#3%4)|V(++;n*8Wx2x!gK5?PuQU z;Lje=-^nQs_|So7Mzh49ZOF!0DnH2C%#k{jl)OpqzfWQW{1N~_3R|jee|{%fawOxm zxYL{p0gUac?0M+h@3N;JIQq5#xvTdK5*$mFd=#&EWvFfaHox47mQGBQ+x-GB?dBD* z146%NLjYk&*Iw)4?Dq9?yi#>#JR|VY`bxj5bGlH!!fdP}S@>AW-2NqqYYge#aQ1yi zs*~U8HoJSY%&`BU9Tk(Dxa9eHcr_)#7!1tF(qczmEI0(X{T7g$U zse*hWimGPox4eK10Ka3yTd&T}mLF*N9adN@!%PqulnOZ0 z>~_)Xr7`Kb*`%;W^94vnL5s7j(9trt(U0#B{(9om&%BqV|9rV7!)bZKNhXAG!UvkA zNh7g4(J?k`a5t~alJQn1fWdC&Fs(Am+P!RhOp70-y*35lMV75He@P6^y96`8kHe+C zH!mh8)a-YjIg=|arQd9vXEFlVxSnaQv&$B8>aW~)eTOvX2cd~rNccl1l%`~Q5`McK~^mg)$xtu zYrlUrTM;D8&ye7>_!(lnuaE0nRTVI8r|kZH(@YaTHQ5zheM7a_9%FQTs6>A|J`T+@4r=kT2x$SU^B `tTp<;j8G89x?F*QZyNhaEkhqP0 zcB!+XkVTJ8s+Cr#>N+n?M@>(7fm*`kanRc$Ew9xw0&)gBvMg`#G z9S;DJ;-$OmGdgTOVm0%aEPbTFDE{Mif?GNBNgU89qW!k_St7=KTFT}jq)%;>!B*86%8i|kl!U%LgOiUm zi20Db{?28fDsOPgI(~NC%Go)S9tQ!&xbV0=U$W$OB4cjLv2ab!0g?%%)vpvrqB|u5 zlS^1cB79oLO<#a^Zv|dM&y^JQr!OzRy^aiH>X&u z92P&{lSAobeKYk>ds3}GJfXv!LP)$YxHv{)LbBM|*~ODlYb#;niUO- ziHJMwCeCn@Vx=Vlr0W5D7eUb>p^6)v!HT_@uV1ugCx-$jtCSr`!Xpubs7V=z0doy9 zJ^-cb;JRDkpMuX=?lxD-)X~?#RNyTOH05%$40{xvPWCQ5oEewQMVNP~ORBJEC*vPT z$b<%IhtsIxrkL*+hX}1WfKzWVew*}V&jv6w;P8oZI1iT`^;v&`z#ASj7jIj=U%%ly zKa4<~dILXvSTEw){tH{KZb6KIJpSY7aTGy*1cOjs?683tTp(k*_FKoGE50MRO;p$Y)>be=xU%JJw(ZEq4tg>ILX z_1zx|*>NOux>gy0Gy5n1tWDft(l!4!x$PkS?2-;%71qIIPPgjrh)KA9#pztL$i@hf zLOt?1xKL~Q)u|40FNo;ofgOl)Qn}6_TS~B(SVQQ<&KLLPnqHI|@F2m}Nu4Y7Gr3C& zl$SPg<)d6Z-d@@>Bmood3-jMbrkBSEhmvQjU$3kw1HSgEB+sUIxiP+%4Iy~+v0r5r zhCZo2o4lLp*`aJe9y=8F$*{dFWjaVaRH~S6Q1t;OoS(lbH-=t^7&DsWM0B?nX3PHv zl#|^5cvImu7TWKD7R}G49Pc?}b|rI~d@U?-l>klmUQv?E$nJe((7SE3KhNKCi!SQ4 zo-Z>aEHLO~-x?XVexjN~$%Q+ghG8VRQn&Eg&(>2PC8SU>f)v{ypUZ@JC~I~Ii@M5q zQud}F6%0G z*?M;W1FDbL@5Az9ZosAN(kp;>>yN0|{g^a*Y|z=+S|_c(wsi zHH-a1rv)$WW7A4=zdn#7Bm7RO1c*4#=o5#@D~Y3-WK(S6Z@6jOc2uwo$9;GR#tY>;IMGV?ne>j(qGq3;hOsF<`HiH3`t^uTvM-u?59 zg#B@hSD+1M2ax6RoNg~mb{>|ZToD$hlFjRhkMt`*zj;%ME!y6~2z$eT`C+Neq6c2v zPYXx>53D5>gV0C_ZyN5zfj5`2$QR%%AUD;BweBUkH_>u25_epBYORIv_t*JIJyaiv zzO@o-yT9LXqrzUdo1dChYAyV`frARF4Hz<6RT_xMVz)!9M$iTOP@0Zux7jTe&9s1G zixpg2%kiE2Qqt#oCri8aApzt#C5KKY!t?9XRGv)7RZlZ>6!h0(Go=)K&w$3KC?}`G zwYU$C=$nw`c)L7NnWXQ?+k69*Yo3X@oQvdlGmM-4j%F5%;_#%aEiP7LXNU;etnqiO z$V*%dV6V}w%Aihz;zayN_$ed{FZck26AEEA*YSQTA ziGRK*h->HV&J3(32S|5XXbIxo9CV^4EUl~Aw9}dcS84YnAv3lG#>~x$xK-u=5xHZ8 zQUTTyBMz?&A$z~C`Pi&oMT@}Eojif`X8O;TfhKAn#m7pq4kf9{gTwR*{)Ylp)k$cD z6|Kr}5&@quYWCK7>S@(hN#X;JGywp3Z)QY{Af3>Q2Ey?Yx}2Pz9Ze;GfPa}i%Si=*eNlqNL8LlwYz;1^e=$8v zMGxL812JWd-jty0&Jb?aMEWAnw@MUwJ8=tI3GsHV(TY~X&^0{T?1F9l4okG+2 zp48lIOlY~+GU;L~UA?}YSEQ=})P^2PlGsmzut>COcSe8r*>a7 zLh!&Fp^@p65cj6D>?mheNFPJUXC|h?3y(q}=)fF8hBh}1byeM=Y{E2;CQ)Zd_Rj?< z^jci7wJqwJ*$t9yfz?q3O}Xo_!qp0Maw-@iVsnq0A-3p0I@H`wuDUrf}3z~k&V8qy(>?v3eq`0)p2P$bm&iMzyOiF4wQ zDvIdi%=DUs%JMCmMJM7;Bih3?2}1R{by-+Z@rHXwF3W={+<yRiy=X42B(mIb(^Uhl;?uRN*8W8qIdNm>oH z%O^#h2T!UrURl=_!R}1}*Lqu2O0jfLP1bK`;LK7l6_bOZuPj z-%(EV-K;u?`@$7J=@*0q(tOEW)%F-?>l73e&$KRU7v$ja#h)??nXBGP65lT&@Yghk znsC_|u+U<^Ykbc8?JFDueo_0_%?%$p*zIC*`$5it=#Wyu+G;IpDy@5Tv3&S>{10(Y+Pe7 z#A1!~9B!}&AvKC`JJ9Y`KGoHZ0eK&_I1SaN99w&^udI>+Fq7ixxSJbOEUAqHa!DsP zTLwKs{m<*68u|YT)9};J`tuCeOk0A2(4Q~&Ym?MSV{3K`Uo!?sVTtA#^_?>XVyM}- z$w(&_CEDyQXdhqM`2v~Gs|THAhr1Io$kK|puLEr>1Vlz=8%@3X=NXLe4;OH=prv*R z1k&DS(w}ZvZw;o^TY_QyPTPQZg zOy`_gbF2phF7{rRTN4*7)ZXtZ&8l{>QGqCX@2XPA5~H#tFE16;TG|g9(dmX##XfDO z)8{|!FPcdNh~^4^jfqe&$NljBy^s${3P~km%yIEJ(#A6Oo@Edn#iL|z8#;X)u@-k- z65#igUX0mX{2i|&Zvs&!PKHJr87jtWc|8hAFn{-+XgYShO_=PiXD>kowVpf)j-Z-y z@P=RG`Y8(~bAEXPn||W=Z|H9G;zR$v1#kX@3fh0H7__D}jT_Z(;tW+^zNgd^{5l8_ zt^MA>o%6iG5Bc(mn~pBX<}4iF|19TcKArPSH0pT1$UDyQ)y8<#e>M1NAX#2gNt|nk7CE7;G4WSEW74;600>Ha2 zU>Dv-Q;!q#qC(vVODf0(l_L^VR2;oNiR)QIj+6~@j@WsL?0)RA8_MwS*BdXRKPm`k z?oeQkBKJ^v!@i6GQs9$F8sNXs9%ZV}r0(JdR5y6uVLK;X8O7O)6N*Jw6>!^4vl)E@ zFx_$Cn8yb1yU3rB@jU4RHd>xGw}ax<-qOufZA4NXcxBZy`SgvPQ>PHSlxs?dzgMBs z6sRc*6%0m@(VO)ibu}=a`JEvA5{DR{zWaH1#z}=FY`uwo3?fypbu$Xw2@$X4z;N&E z0=2|0lF6EC5BDx^3w|Z+hzV`bhy7v-R-CB*5j*qZyN??FR{ot4A$EoFT|``Q*zf~u zc)9Cu@|Lo94>34BUIr!$bvlyG7g+R-UBx#q_^}=aUnxt{!?tM*&No&Ap2 zpyn-IkV@Unoj(3i}b!T*zKeX)oOGLp8U`&5s!m$S)KMk|~!(5lpN?W?@k=qUaU%&13#GLWlwQ zG&gDSkCMtQb_8PD>UH@x6OZCyQy} z&tPteLv{I2P1{=|e60WA4tZ(8j>IuYlO*SF@UA5nSN=16ZN-beHV)A>XIu2PF{XF5 zm#{>+n=PYx4j@yBdtrIFWJLIDx%s%5^Vx0Qsiiy`Z!RaOk9RslwAs;74WVTfRP@qmd(PhnN{$2_$aJJ z6jHp5G8Q{OdSJ6N&l%ve-=by2L#`W6`JVc#`|<>fD;n#iXvA)~Wt6hi2zS8s^soFG zkay4f=51rlt%cQvAa_<;E(knFHOr4Mn;R!&#k6FW7^nLR+jW(ZprYo_!6PTLYD?L} z6%O+!Ct zdr;^>y7gNVx$S-#GHYbP$|Esi^-Di*EG@>uMK2kod-+;*js2&V#Xn>X`FKyi4Eu&p z|2p9^Dl*WaB`>@ua2Cu%^P7SZt6n5!WWlMeHcrtH9H#bF_93iQMxJUz)_xKk3%t}{ zLWTeQP=2%h?F}yJ0l^usqdC76!=Dt5$NtvlC7L6jjVUxW57#rqKwAFe${P~Bw~q^& zQxvXHXp>52%d%d>t}swXhBY_!b6~noh-l&E3Jaht(fD8hZasW=!{1zYw1d;__-bF8 zjLL28LbItV^OwZUdQb6nyyT{zjWn_rBSAmK9Ov0R-gri$c^zNGm3tY-13svP5(7Go zC_YAo9~%F;C7(wM5gN>yn861tS?BCmq_1tfY}r*{%PSp3~)OB zyyc~$tK*|nyx74gOPK4MbRotl9}}whsECh2*uorV+!R1ob9@~^iYdTRRMp=K3lw2l z=iRONf)?Xp|J8@kF9Ud4<`^u4X@s{69sTz3NX24ypO7{~{I4jgQ zf5{bK(H#rQJKSLpNkOh|D)7U>MmiZ9NO(3ZBb^Z!^(8JQ((f}HB=TzRdTW(zfN*Gt2*a=kzJn9Y z0&_h6Te28?Ysa%Sh%B{m_Y9t}@j^BUUxxFdfU;WJfQ(&)GNk1#2g zjhWF^_A}$eZAfculT2Pfg%s=35%a$`-{pY&DD|)XDGes*{um-Nk6p2|WM_up-}dJT zECiFdlo-#WlW2?2c`|=^f9y$1_P2Hp#(gui%iVrlVu=xUe~PxLLxd;#rYLb%R|7G% z(T~~6M0je#uunj_-XGgjb70hiUf|2K7aTU;D~c~l*s2T=%?X10yl5|WJPmfP9`_`6 zwKj!vJ^elET6}E3DX$s+hlWQoW?q5aCcsk| zukkzk{WVV4aCij)EFo)%1MP%ZA&BsCHL@M|Q1Q~i=9%YuEf%h{g1T$Jl@i#<&i`|l z<*#~7lie>ZUNMZduiV{8Z3D9EtkM-K>)s2-Nom@M!Bz&0Mif6S@ca&oRAS`o?B1Cw zmQr6!Iq>Kr$tS&5i%mmx*mB<3 z;9i}7$9k~Szdk|{1bYt#jwuxRJxm4Gv!08AbXzR0lz>(T37+1cmxpd#GXgZC*%Q{u zhT`>PMJpQ0muV%>d`}gG7DJ&YWpC;EYoVL3l#8JsWyLdI=H_w(bMq&6-9adr>#4Vz zz@J*9xOOk+ze-30-zK3=WSK00-uSTdYOQ2YkI<|9+Hslc}OeAQ(71-ws5*sQ^OztK8zwgd`MO@)49Vxn(dU-8YG(QY>>O%xt}vj z@+V=dE(tn(a2LKP(CYQ9p-oy5hR!h2vYa)M=I7gdS8EonTWkL@3iZ(`2Ri6Jh6WPE zt1%)SV9#U%?CORkFyVM;(wxc5JDI&y;S}DB`+@pecvi5$-Cq7zjl}^YUHUA`dzRzU zeB@e-$0bCSnKe?qAm=UGzB0?{6@(jzk-+T=HVEF$`&JW1o{a*gD#OmN zUubWOVUMh>oT2mAC2vWHIA%E_AdteS*BnRVojsFu9UtOH%p}M#Zr1kMa4UoP?Ow2> zIk)ZABV+B0J9niZYwykw9?ekCE8}HtU{vHQRiQn zmSZN*BtqAR@0aVG+P)_|hk{k<&UT*y>TqUOvtAhF#$RdyO;qTHdvctx1C-Xfeto>XH;50ue%xPC?Fd%#iou~jm4ZxUpPgKbspS(QtimJs4j1Xz(poq$SwxY z&RlhR1shTUB8LwoNJ9PY29}SHTD~iKP9l!AE@!DZIxMf7UWKM!mlUctw?3F7Tp`a+ zPf2OK#2;-4!upU&z`niFj#K{F=&cZ~-{RvD57!aJYxEu*5z%q-@?;0;Hr3MO%5LvS zS~iOn-z*nK^$ttN=d%zQS|P&tCHG%ZPpH_QIsy%f!?SVpz1_KY{1LlgQiGvhqPCcM zFVRq%QoWiB7XXLNe55TBF}B>^VBVe|p%y9awE(Vp$l`!9nf+IB+*R^H4D8AaPyjm) z^{>Bf2F-KnQxvP9`sr|4wz;L8SjL`mwUgiRQ|{UMZ(UGlb9qEx;NvlV{|0zga8!Jh*<<20|KFw<~fyUrsA{aG5|d(m@04 zHFsiCKJZK*_=Hb0Ur;%lz8v+*43EBQn}O_EkdGE>@Az zN%J|dE;PX-3+!>#DB&>PSD?}K@$K9UxS;K&MD%%EeV_eMmw^!LhgYa6#w!^oWA*Dz zEBw@g5&Zf_e1lNK*?aq`vX#l5@Bic$S`1XeKjOno8IrIQYq0!G3|w4dGF`+f!k>Eg zy8U<(UPDCj7AME&5$TR9+~7R+Hq3DdbJZI}b2NKp0Tj%L*Yfw8sxq+|FD!GoG z%Olmit*-kt;zlarx1p6}-P;8}h*@7BFVqs`YBy8yL{fgBhtkR|*hIj;|YbK&Q(ME2Cj(s=Xh^ zdKN~eErhH)cUB}&;MSd{<^$UYSiSZmVQA@JS;I3@(BNSduLE~Se5RlVyuOG>BsMlA z;|V(8l1h?)-X9}ee5KE)a>Q!`hh^>Tgk)BuFEy8|+qDY?$lf2~8Di4f@-Tntxh5BK z4en277hXWh_UPb`=WWmS?IBvJYIk2WfH!zzXQLoIXx@Xr)41-1eVY45-iCOQH0a~i zC3SpSTtPxSQHzAhssa6_9k`)2Ii`>5n8Wx1U&>9T_rvDlel23=lvWEZB>B>6CS)&O z^{C&;jq7aplV&t^&Hkei+ZXJj1B7)ej?_N<@z5&w3gD*e#uf*n^fRT1bFFZwcibBq z9PJqq`IaRoQ%+TQded@Nq&w#5Ww5w4QEvds?=>=;z4X>EVOiD!+iwsL(>uilNdMVd ztd6*_EH!n1QW>rBjZBjO^+8YoA)G0PMT%OlX)*qPBG)8@^m4BH*$4$3OTNlFP1NN3 zy>~v5X-OmLpI@TGxq!85)M;8)U+~OLc@8M3NvC-k&tb1BV}+GjX~%iRQvv(o-HUrcbO8=L>?Hjh@+1kluqQ&BFeAf2+q3e zYu-1!P>!UnWIqrgrN#tSD~)8rJozaJVKNX{^hO#mr1twwGVj%mXdQV}ig~36J51#; zi_iM5df<$`P^Ymj880wEM<7?l5tEOR;OnL;IoB!&_~^Z?&2Wx8cX@PxCOVaR&!N0@k+)Sn z>*@3D?Q6yM@rC?mIt6>YGQ-=Izg*3lv`D>Eu7z$YJ;;=bK(bBkUb5_6Oo91!Ua*#V zztT2|F(svRx#w5)^GJEZFRwMu3va@NYD=(+x?V{b;yk8`p+IC;M9`UkA4 zXP8t>B96yZl_~ZW4biP?Cb3Us--#}RWGoi#?`6Z9O%zmZQXEmlb}GYt8kRL52%XhK z7)y{Bx$#YTXi7V~F95Foury+LxG%IXF~3lEpUAN=06jP~lU8welamXnASpPFuwi17 ztH2_^;lmG*Kk?+InG91O^iPjVXbKTv9IotO)TeF1Lx#a;oyTh=|F?K_+~2h}4duXd5`Yu-F@r%1%>9OdFE>lcn<* zM~YVJ)%Ql%affa!ZvPdxX2cyfoAh{S6~t4g`k=UVCI|ZWhRR&vgsYu3a+LSSMvvM* z#{ah}z?#!Wj^pdi)^^XP)gH+NAPa~~{nVSgNkh;DgFY@fl)kI>FWsHZl3?NUN*5Cj zJM&bP1m$xIk_(d4!)jk$=UQ_TC@+(iN#tE+>oIK;%HASL$<_kskeh7slfE4zXtwoU zv;|1Drq^aLTl7Es>UAVQ#`|G$n+7LwBb)N}&06veiH5A;KdL`MwI&B2XBZoj-?=6M z(09?BQZ6uk?Z8v_%mek%H^#v{#9h4o` z9zcDtBR@R9Uvqx`S)T9u=vzJw-brJBGV&8DS-soK4dm6yUm3ihDnb`LH%H@puiahG z5;S;Qp}m_fZ%)=!Y)jQusuonw(Vd%a*iY;8=LW(JEI+4?vG$$d^RpGRyt-s{y@$nA z=FhLQPXtkq1SrpvH&&MT#3yM}t^qENK_Pj!tmB%E7>a0C#E3D{oc8J?5hBkh9KEr* z-Ik4j6kipB9S5ZhPrCC_ZAnQJWNjzL+66&(rbQPo&imzEhb+VHT0)+|Cn5dGU47nM zCh`#YRm;jggm!~1FGQG7t-fN!d5Cg)6N}!8P+_-)8(~yY0qrWQ!BV?aPUbELPSmMb z(X7%w_NPPY8{%$e9Al(0Xa7&Kl z;^%Pj8`P^s-7+|qsTOv)ASOM(Q2LW-$%2O(L^muX8b?aT1Pu8FFdwU%X!N^ym2p#Q z9kT5F*vwlZosGOx<$rq|y~KCGLP&1;`#o7Td*pFshH#$x{PA@IBtQ1d&!Wu2Y_cSb zd~45T^3(C@V7PBv7kaAK%ExL9cv@(um*zx5TlO4*s9YA=u=hczZz#PJfo z!qcePA?4>wm9ua#nt8hcIR?k~D=vxU@8Oa)uhcQ8i|zITEq$wzFZ2gIT@M^<={g-K zV+KB{!Kw*?G#L`O{pg%yf)3016K0i|2(+ifEZpBxy?yMnlRVaV`;YB?a)PGR`B`=iIy>Fn7W0e4lg4Q?Lt8!dsw7ebABUZa^Iwh7FS#5XsU zO?YY_TYTD$0Nk|5{_N_7^=bmxKVv^mu!&S-2(#JXYFi}ZWOQ7G-aX&`df`4x{}^XI zD7|j*LXV=HT$En(N0!d-5#}X@)Td1p=Ohv;lLB9?Fv>+cXPY+nAgS3)nv7-guT3pIa%U2D`@(+&w2XZf=z!I|s{M&c}*r;u*8y~1JPftYp3@^^0;@7;TsAh z=kHB6;r$bo6i+=DuOJiNr|Tu9!Zi1s{M_)j$u^UHJ7!pT z;R_Oy9hUpVJVIE|{w^bcN^+EK@fdSA$n1718>XnnG8a+U_5G;=n7*0+#@|c&pQ_4M+y?6agZK5um z30BSIbC@kwBLM?jTd^ael4Q;FRvi_o zii?t|fdY`ia!rp(GjLFED!`q=g|_KO6{*KO8dV)(SkLbKaPzZUq`bCkR=~6WjphVn z9@n?21C4uT^UWXEI-G_O_~zD$#DBC)mqNmv00hTp{?PEy^X+gJQ@^pze8$0aEc_&F zh7^70AwJYPQM|jgLBC@o+B!YmSfXX&-Te$Hq)acy*nY8Lr6L~@ml;2F@S_PC{)rDX z_U@UROg-G77hbcql^>QCE$XuPog!C&`jeUicUJnU+I4gvNS14!`N!MxVYT(_^53Ki z%;LYeAikJaA1lZscQ_@)P0~I@=t~5JG6($^4UfV;o^Oaq%+LPlN$KnH zPaHQTk#*iVQdD>JpZ{Xpqz zGRgP4wPsnj*&wlFoZkFv^V;^sAhMs^Kzut{#neYVpAL_05XT5R#p$}B4^y2o|WjkFyMEh&&xnPvoaAs z=MWgzgG-?^TRf=XGR->7dK6-EIR3=4Fiw+fTJ7+Of~t0jDh5O=F!zY7dxwI6gQn{q zhm;qEX`6#?D&Ob%ew*PrZWptD^#k_{;^FzZZokSP(Uqp7Y|^$v|A1nJ?|*8Ic_>{C z6gYQjK}A@B+!OB|0Q>!wjc5A)r&|EO!gf7xE3^>a_;W+75p5v|>N*AJF` z^V1bDk8yQYUs9~-bj9PbEkKj@O##FF>#O;U(vl@)lhMr4Fwm}9sdQ+QknC9>njz5e zIJhVm8E1Ayr?m7!S5s57+I%PbdVl?NGNU~4K;_t(y1GZWnPlhJZ4W&+j=1Hj!oO&U ztsrPDk=(A72dFliG^C_gI%^tvy=?D|YApHrEZehUBZhbE9%CR$TH=4}|#RD^#H9J&tH6AfvgtG{!nGVkgQ*F7?1F&;c-F-W-55L@3; zVPls1%bp~(r|5AB=nHoqai^6bCFfm`ncKAo!)G}vPlu%_-66HRX?Xf-7-ykOU{M~I zBI}?v7_MT&2&i;oPp{V-#vbg#UfQttHde|02c2=^k7> zykD^~W?a*+eW1<$fCpzml_^LC3_hU$ZZDTMvgb%tR93J9@d=yvn>v117buY1i@84U zS8$HZa-+>MY#`(?g`1@H%fyI#zBkQ*DtT)cmDh%W(bHaKCNJ|5E9VvGR#6Jx$0!D6 zQAAHu{&Fa>U>08=i#`}R9W!FJFQuL%Vpza8EpB%2|MD_vhCvbyzq-tB|V3`>;fcNS2A!?aJzP z+BUvts=r;5m+smp(O@(?%I2tX6?n-?`RvbW9)Mfxl=RgtG7N;+A3IxaaVire9kl>0 z49^!i9vLVPB^0pnm%Ga*&t9uc@pk$zsr$Ygp{&hGVUKw67wp}uE45DdHB;?7@O~Sg z3$EJ^=lSwSHdRCcX;Jz^R&3hwi+uKhi z$k_!2ufXs{pVclWiU_8OX)d}9Npgm@phRO29^;lz5L$JCAbam|a+#E7cO&P+tCmMS ziMdyx-@>QX?bWe09SFyHLD(kCdTd*BdYwOHb2Fn^?b0%U)U=z+JwSEG^OaT z1q`v9P7ldcu9B6_74<9?c%hybRdqV_l9IX5!T7{m9I}SpQejPug@Zh$QZ|1z4FO^s z4xWSgkx+-Cex1|6|Gx`B9>GHJ_LrBSmplj~mo%CM{3ESa8E0v++GQh11aDc8IHu@w zwpAOE$RR}$qxW4t6A62i)_D=co=3O^E!6fKt%bXhbPdT4@lZyFj+hvRAOoV zM!&Ipmd4ks>VJ5_t75Wy4Qv{S2|c=sH{z!7j9o&Q$iJE0WEw2KP93hzLU!~Z&D2H8 zB)H3)KDnKOiNu2%kk{hVDLa-s{$Z)G^$p+WV`m|xr33WK13KjgncN~m}smf1n_rsRTaI)1osuS|=uWBqK< zaoeuJL`$y>TpvAL#}DnA7C|9_*35~06gFjc(B>U)RQNwawBPiV@@-!ilFYkBv=+?u z7p@eZ9Zp|IswNx%$)Yqh68P(%DLH$IHeNXyQY=vSh)D}OvA za5hNjMI}i`A~`=;wK9Jv5o@l7G|q0jS)uJ}(e%Z@q?B0Vq9Ph6jREL=<7K0V_84EN z(=amUtr(tzVO%|Q+;>XyZFgxK41%UT7P%;zgHZhhndxXeHf`{;)%0Kq2OM;G)t8nY39 z`BuF6Ze4ZtCQq1n8%1+NsfjL(kB<}=FZB|De>Fsc!I}zn{!%2S58*#IVvTA4=vO52 z|Bl_C#R34;od!%|b6}vm#|J=E;)*vozqYAD6AZdT>L1u?brCuS@Nv{ ztc>BK1l;+NtysI^Wq1!2!24)|geS&NsKDE;^ei6ji6B>||C4^m*fX*)FB>{H)K5$P zCUk+@`Z>O7Zf@CKaf;A66BXXBnQw}2)hC(U`u&0lC(yl)xiK2=^8^<(^aU@?P9NQm z69n%-1|TeZKd?v7!u3@7$xXw-2OVE7y%K}GHOq6;Tj`8H0OQ0vQdwuO0X&!^C7{E6 ziY_7K7btSq8a&^xk|xSX1U{dH@JlqR7uY3#d`72j9K zr1N1)d-wSt^4ob?-sD_Yed)H%==Wk)4vS(!fcEnDS!4-kp)|j0-n+hX`6y>xbqOG= zl=_){@Ej+JEy9sj6ksmSB8E`HtLP zH{=GGpSgqgW>TJS_< zD6w@L?+-Z004~ga zLrk4Q8-^giE8xJ5^LP=Av8v&Y@?(A}qj$brO|ANE(~O{qwqn2@q}}I%M*k@Z&|wE{ z#pPQ~58?O=dRIq})z>66yZ-9wQEZC7glYCc&lk098yN4lZ!e0d0`4BEI6cwf-%9|C z!&)T38)Al@;CG{-;nnd+0q7u;-mTlAc72SJ?OD(s#%Iy$_=!5 z=^f*E>fWm_gYo_FD)AXVc$kXA)R!^C|14Hos5xwAt}XZceXXdaPGWkA>qw|Lk{d+B z1A?fRGpM`DmO6nTDfaqp0QL%@h6O9@2ONp}^u_KEWP5H++SrtVf9*|H#T6@om5AqK77kEL+HG=d#KaE6}>?N%ruTvs@ttsi6q6cM$AAlG*a|#M|vKtihp~~Bc449+A zg`#ZDY8xI;3kK($K4(zzgM?K5`w&DEOfdlnTvAvOMJp7CN{AFIH|#XIUFO2@N$9 z1Sgo4>Y@X=ozDv$kl5`!TEyljQ6YhPf&>a$YL$1E&y+3A&>r2Jtuv;3*&6N&^@UB2 zl9;l;FYk>>qTBJ4q{?La|-D& zSHPzSorW;1{&oYrI%5s%2*yAbN+>V*xjhk0@y_wI&)+(nmkI-JIuwBR3|o+&BWq(K za=TOI3G%lVB{+3LxWP_@C|e5h3J3Vb{Kg&0a|s-`6*JI&?S3#b4Mr_Mg20FOG+6N7 zhytxixO|jSW10UW4!cO!HTo8=r3XI{#L8I6Ofx3^^ilKJ9ku!iF#2 zu{7M=0!_DH1PcOF>z=QY4%3AlpOde)ajeFJ48%%ZDc&Zu>)hgw&VkeY#x-Y*;>t|h z{PXo;k+5nk&7uEiHX`Jk_66)ehE*_-qOPIpx|#Pm%?{x)Njyjc%w%xpDA>fy>PiZ# zmfBB;M{ld+mialEu|_RvknX$x+TTTH{#GS6E%EJ+ZuG23qrIP>X{>d0FZ7)bZ&b@f z9xD%rOUOqeBTFLlt0E&yxt^roJkX(sZZR|rrW~!@+(Z~L{7P4B@Y4>(#{->4 zdDNWygdTDPU~aBPZTB%O9J1p5RU3w@MqTR!0$li-P zHfE)Opc7UAK=JWxxa63L{hf1f=kLx~d;F*5j1TaEuJ_lv{%fpmeP`g^= zCE5~eE&mBfRVRx@60qcZ8Z*xM6^Ew2Y4ASEXiPR3-v|9!+9Fdt`(}a>IfOaQ(T-t6 z(W3EnaR_98`V$`NLB>pOwwTba@2l_sKD@-w7$fbM7zlOiseIT7)RR<1$Y$ZE44eA$ zfX7Ogi8FA^_05WU?IzEG&r_0h2PKPp1^g>ttB1Cxi)&(*hNM#4VLx$3#qICCOsWV2 zbKE!x^oD+q{b1%%p2&NH_S~6<$5P@0sIM8IJ1&1%X%3u3k}^tvsOxdHbmXHD*?&Oc zD`zbY)enNV+SRQrNG2IAWLB+wpp1zz9_Z${BS4P$FkPf34wNT}b?=s4=a2!mCjXGR ze$NO==KR8C&f^1j{utzFHOaZ4ba29tB=(1RaNy+ zktz!z2U8dPjv8SMCUUkpY_~RXiDgEh+qY#N8wKQw@~?)R6137bH>$t?v)La0dG zpFz%eS`*IoVOH9viTbpn@dw8^krCD!i&qwP9%|wzPFY{p=Q-t91%NOCR35Zo7)R?q zQaNb`vP_2gNBP&Zw482Yyd2vb8}ilS)weN0Da3pK{e*{T`TJgQHC`eQ=UNX=;BFWk z30_&xt4{{FXWW5eiT*(8m10*KdO-pb8MHsDFOw2cNz1c_0RV1NIO(>JUSZ}5T-uo( zRwWmZwi(r2b~`B`J+RcR1Yv%(E6&xT+R^6)5^WOqhmc830Ry_QBGXqtqtbW}K#@Un za#@TfB@_4e`-0vG(zFvvs#)GEcE>#xHZnN7Zmd21nu4J>?C)M+(5Z6eGMaw@*fR|B$%_ja`tJbboavCwZs!XT{z!?>ML{LQw=~h|a5zPvOU!&x-i}Hx8{}dYIw*VpcS42ou)YgXwN~*S+&hc7-e{ zA4w2<{x-lzYTspOK#7raOeSZ`z;SbNoG+s%#U`fp5ilRHgNKegmUWjEu+aYj-C;MF z7DmhXn9q-toO1d$af z#hrFru@Gt1)aYY^&y!Q+tvDo@D6s$IkWlYh#HAl|_WE5CU!R$gEVuFBx-Vq3l=Uq= z))9I-7@C|epR+o|V=72r>jC$+q`kA@Qp^72j_^ZtIM~N)d)Io|pK;c;p7Y+1i$=Re zkocI|87R z0Xrp#Z}kPtMFuaOSMfv79KJz!8FSd?H~#foO@*#ddr;t=p06YweVsI=7;}W%FZs7W zMw{iP^E-gX{RuPJ-NHFan%O-6wRX_ZKkApFYTs95eoAe852N+s_t^LYQQKK5{HaGS>1|S15PU*^E+3bcQMJ3iWqi)feJF zqJ;!xe^hzfMezsG#BkAHG{apP1Cyfa{DAzydTKJ}qx)mkTvIox5NSEWDMZ4`5L=W3M(9r5}mEExvjO;N_)*)>>Z9u;~qf(zPRje@9F2 z;)LoP&l$gQ%g`K#WsM_*VN7gAnh-o#DKuqN+|MlUOL$=0`Nk9_YATVzycB$srXb(C zt&bA~_wAGPS64F3MpeA|vvB-a6z6o={&KvcXuFYL^_UV7*s+cl)h+E3BGQQRrH?As z*uHlb)wA+xe6>G(X;-)-x39nHbK2yR6%Z98CD{_v6O?hVEE0{q8{eF>UU!ydhZ|!P>)?3;M>|`kEv@I(SvD}UEzL?Qw zkMW&e3EkObB=Io@;~FyCf#*&nArrt|KB=mY)x#*6M z1EG@O_O8@k&{}yE2j9;u-H*TJQlqVN%`O)+c6(G$nfIEBB$!~W@k$&gir zt@cn%iJKUeVpQA<`}Y-@bM;yUzsAs_&466=D9RIk%#(kr)}fm}RBW5r;u@8!VEqe( zU-%hZ&HpYRV+Qbyo9VA*=NT_&I>_X@<`3FN*lvk}(LF`0p>s`#U&te@r!QZvw6f%UBU4#FUVl<( zJ$d!OSIgV*!AvOHt)=40C;DTk*~89HB#DDp_5H0;Dg%JI%aJf}O`kJPpjGS*4~1T> zyb%%e{8RUdk@r1&avPU*x@GsW?)un6KN`ISAmka~AuMsikb@T%EMw<%l&QkEOP5}SKY23N;&le4jUQ(H)>J7!{a)job2)9NO5{0&v8Hz z3%>4vlM+pF@Y?0SEfLxK@ZOHvD6su{3@X9l=HOevtJeeW-ufV-&mMGI0!RtH>CYr~ zv$5d;B0To^!0ix2ANR4_dHsNK zrjSoJJNe!2KU)s-c3Rai%2;nEIN)S*eDgWe_&Cn!RgoUHb6L9J#Rbpd9aPqDGCh<1 z8NA>N!aA*LeAn@)aFl8zEp$aDw76Tx_4Z3IUEJopLe7J#yyva*a+I`}a$UX$*jZ=R z>KP;RzXAsEdm_jBfZxhWDr2@GOeJ{N*64>T z|IBK#|H{{$jB$||0$!FOx_c<6Tt+_Jp4equbVA7g4F{a_wzK41w`8xs!K}59)O?H_ z=?KJ{aj;rPnhRXsT?_l`er(^x&E@m@8SoT- zX*t%AYQY~NjBGSpjNZ-wMg*p@T0E1JsTNr6_4-wosnB6rA6%>N35!y=)uxim7)LHY zek~xF0wvm2*o$H)mbJf-GKD9TMhrcb#D`Pg#6Br%*C9HNTR*79Grw|SXL zO`1LH+3j8){RbnSGRy^qcjS{+?Qxr+uj8zLzT9f63mzazMmBKyGX%BJUwo)&!akaFyn)Wldq&}FvxUCV1XB#GP zS+3l>G`3Y;Vx93Lo&RR24mCWGo{ODHUHm*jPp;;#G5Meqa#qPTR-uU<7lC zTZSA8QU~mh9m4r$gyfjr^glb>H=#d77S=vwN$3m5Ti?arxqq7r>$1-A+fJZTaan?Q z6mUByIvOIqXx3TsQg8viZZD3nc~x*Q0mzhp<2&-x^Zx=}@Za}{q&tP_S?n;rE*wO}q8YX&su|Dk!||QN9StE2b6iJGycFC(JJ)iP5>k#q9eW6MTIA=L zpAkoMstW2Q8+Rzip;{cP6jV$SIOZneeq)8^EJlJ)!NEwAuz)$p9^rwQ(Pb%CqnZn+ zv$86%IA-`4tfJp^X8Y7w_+CFcT$}j^zE_E)C;7i5WaWY;C2{5w+drO#MGMZ9a8RRr z%I%G^=o2`G49J}A7;RN(muqwuL_Jxq5tAsX|&d|0WN%hZ*BL0%V z!OW!M=)oGB&-Ktjd#0~LoKa(`>zM|*n|{}N=_gCvLlWNc=;FQ;`>`uQ8M4dDlOI8oy)}ts4!X8gQ99&0g_OnBDvL*g&3-bbH1Ae3Z~x`qUsL+T<5{Qq2lE;`E*gL7{a8hz^FGN1Fl_hN!5Yc5b$ z)gfWp#G3KSDea-(?joK6fzrh4i6F4D5Po|@be&D3;lGj+R<;>BLh4d~F{}3S-ZM^7 zKHuvuINL&i44I}j^yF$*tCO>5D80e0?L)&WjCnnS%KMOR3@t-R`=6+%X+v|ix-+N&hx5wmp@xNvT<*y@TWLF0`M@y-cPDzYv!USar|xSpPCzp{OW!XU?t# z%I$}oD7rk|C#|#;C5an)cRWxQxf4n(a0ARj9Ea*{fqUx5LvBu^O3B7F(pN&2$-x{5 zB}&iJ$P3txIKi;q^(bXj>q zOzbr0S&}3@#g@d%oS9CU;Oq-wDZh+sva6+<94YF>!yMxRa9~XVCXKbf_ZQY1r&5Zgr*_vO4~bZ|%S&(`>)& z^extc0M@DX=c9c#$R(x7*Pua%xRoB#4qyARXpC7biI?M1d&_L`d8ks<)MNr5q4|8~ z5$lJU{~SM20fpBd?WJ;jK4qW&@+A=L^>FVx%7FtIK0{|Gu_gWMY#AxROk;ZNfKQHgWBQfuED`UPd076pa_%B+kxS!w$fqPMa=nw$up6 z%5w>K$*24mr+IB<#-;D~GD`me-_uhUZ=CarD~SG75Us=ElBloMQ1yuvpkCr54Dr4B z5#AP!MrFj_BKA+U_p<<2rKFIl-V7z*F2h$V9{_-jt-t8>uMyjS%eXb#o))#AxaJ*a zwqn-QSv=LIIbsMKr+zN;t63zq8EAgq@>Ph36~bONY9x@?51BOJ3_6511Gz z(6DzVUK^<8{;gu90(dUczg!Odpw?W-{fYaF8zFL|u#W@OE8u|zz4CFOubfcd$Kdqc`1w1o z6&J5Uauo4LV6dWuVEw^rvDbhv|eDou}>QyD@egL1(r zYu;DNsm7!b!wiRDblbL7<7q6*bFTWxeWsQEbAafd--m=vlNDbk&fldGv6lH%PnPy^ zcKbEu74Ml0>XjsWw%d(sJ7X4bJfi;(5Vj}In|&_dO%RI^w~O$o^qN4x_V3)zbntSl zjd{pf8$$^z8sf};*vjgVC4q(gq*&Khr4-xjyh-|HWKex5-re2pD=>EJt@NS^TU+1Q z8>AX%KSY|GDK1PgZnZss+}0!}%lFR8oBFseZyu&@i&14(rtTL+;?r_@D9GH&eTxOm z^YzV=B{n8Hq{q^cir511jtDVhN%P6y{u`U%bc@~%Y?lcSr5Ux^AK^ru0r--w+|1I& zz`dSK@hYvsWR=%>7GP3IQ zP7Hec*VSfym+kV<*jR6~p}^YsCw+Df4WZS)k?olSeIxRcT36R}{}hd$VP{hVWjRM= zsvvz4tPrswUJoN46QqL6gtH|JyV@ZZz@K6@ zu+Q0a?#gCmUsRaq#WbOoNaP)k#K#!1`;&M2VolEsNKsiYG*hb5Wy*Sjr7v@09CK&W zK~|XrPF(gUf-peZmqg@;r*7a+VgI|0WbBW8nDex(S*Z(LlTkm@wnrWIt(4M0upS%# zhimlC#;>ejv6FX9p!*W%i3;-Y=O>jT3ZMRzVJYkTfP;8{xqxyG7~;mIelX zTxe@N(cr4x;jy?{b*Xm~{b7r9L6S;O{{4gsj+m!a_Of)h*z?n`ez)O`@OzSjkMH0d z_IQj2Iyx@Xnzh!8A1KrecW`3yAs^vl{NLTX>kKCSM{?h^8LDcu3ObU`EP%^(-=_1} z%|toz+TJH_O#f;7d2?1o>}h5Bld{5DcdpW?ionTKmVWx=T0^|eJhH|faz*V*DS=XJ z9(-z%uX`bf7<_Y28^B6;o~l|@;4=s$Pku2|dG)wOKFGn+&-wAP6R_bj4US}erDl`c zc)x>Erp@jtEFL}A0U7zl(=rr8$m2i!?Tx};z!E9h+o#RUCxUI07Riu`cc}Ao-1NRs zX=@4bSLqcWFN?8Xi`~B#PqwHaXLKI!q2|xfhRr`5-AdorqnhohG_lAW7W;5d7)K$ z-$vHcZ!$^q^G5miHZnK=&G1qvXTuhG(r2zwdQnM$rxRz=ar z(E0kE-X$*@NX;qS4gl$XbK-63b#jinDF#I{m$r<<|*|;GmAGa z@RQ9n;a5r;3k$K_6aCzu+Z{p)aKZEK-7LCSC%Zq2av^&yfzXd!=w$iONRXi55f4u4 z!`}@fW#quTZ(a-L0kDzF^ER6yWxbEhK37G8f3!qZ2WQ&l>0LELy$emRFB$dNXf%Za zAXlO`(DvGCMh2g}BG>UWkG;jPG9Q3!4*bavcSaSEvnBr5_-08xpE$GMJ6C_x#5{Gn z4^52t_t5PR%H>B7iS~m}QOt*W-*`(>+H9wBfED`ez>Jxyo3|i*eo#*X33&n@QGiVGSB867rvZoz2>jpPWC6gpE53r?9pq zlXXGK7%<0xlNC8;nI!W3GYq801jvKazwR$`i-?rNa%0NpK7p*0HGY!Y3Z)OytQ&(f z#k$p<4F39O%Pernxo>kh0C$*VWd;U9l$@J&H@srb*6w;_-~wI}vNG2}g5Vv|id{KJ z$V(`cbtLNaO~78EJYm$IA~BX{^X-?n_@X89TmK<$hLI?heB~_F)`0`(oMjJMG!aKQ3gBmo2yYScd_`_+xO%mBN?~J(N*AP@^jtI?i5q zF$wVWo-y^a&?UMntEuH#oo6@_XlorKp9G3zd7l6ikm==DK` z$lAlM^CYM(ETo^!Gg_Z+7l3q^p3uGsyRuda&cV#RrjdLd`O3819}D}^GWi+~>}Y6i zXh)cCuS7LPOh%lRN0fPWy6u71awg6q^ZUy0MhSm8rrM}Hizw`D_ZDZ&4uAPx!x*N0s3qRvk7S6qR4x^Y zpnq1=FlxnU7yrDQXCmseO+(^GF~ry&9r0Tua+FW%3aiGjTRQZmSf^rFGi{6V%^OSr zkhbMoL0dBiA{MenVQ|u|x)X4Vz&9@0NTAA0R=^GB%|CGL0PhAbYiukP= zAbag?a!_0|`_)3`6EIg<6uZ%=42bK(d#c8Li>PXl!Z1Uz`{qb@as7Noetrt*g&DJ7 z4KRHCQU*Yo)vDkF zdmAJWfMH8>_~rZVsQmGoSU*JLQ!_GZwVNs0z6n&-bb*_YS&@e~K#Za$SNcDf(QN25 zvk;ADQlK zt0R>jU3G*5HS;h(AzKa5Rt^Mu7k`ACW+)QdYn#RA7RTGrdP#&69;OSH)LPz5e>!GT zZctg%ahar{O9=cvc|go=A?F;Yt2rnRiW4ug8vW}0`)L!ew$xNhFF*TAt-z>Am1-bz zY0ZP-5U%dtGrsqyRPbBSns6nkLI(Um)Xo801Ewpdmn>!5^8uH}acH*v}Nw3H@xG-<~~ z4l{r72BA$|D1i;+|)9-Ep5# zF&Q@0k$`-`tYzU5c6OtaK@{uIEz*D`bbcoF8~sFg*rcWBiMYN_Q_k6ON)WUXOgdaE zw^-+57*p$Xxk}O7I;TCl`JdV9iJoO>q~1z|{#;DshV6lY-hXW+p9)|8-9Ufnt5tYW zs>glzMHy?KZ!x+bg0;T#wd$P3p{o@{GRXVUi_+U_&54FEuWxVi?9bTvQGnQs_NRqm zQtiuL4eVzCmg<{!@n6U-68iJraB*ys*n^3MZr#_RA;}Jj^7Pj~^H>Jdev#Fj09YNX zmIM`NRT@~&60gVsfMot*yKt!d#-9b8_~l(eN$ybwZ?44#VNKQPgWMWqTb<5UW(0avw8yF}7Mj&vWhn<#&mu{R12*2H>pIj_bv504tHlJDl<$<_vE)J)_JbkIQ#zE(F@za=!Vism zj5%#du@;yT2AgQvJ1uu4aM32Zxq9w<61e|8Sr0%GI>b(6PL-_bV2*5bki2}B__rdg z#=}@&QvQwXbY{Ph$9U;blvpLT(r$ma}0gBP9WiTFJ&3LNeLeUt{LRf;f2;%{>QYWs`=6?Z>DK zjJck?AIkEfxqMdCf%|Z0uTi_isLN=kFJyHSG<0x}EM8t9nzk((0xO_3vzC$Rf0YZe zL5#HaRAeU`Ba;+EfF2rgG? zK&?lrir3yHlqEN>JpW-p+rz>mwYnzvE6by;!`FC7hozDN3*v0Tm;i`BN%Ol{7%%M+ z;v>=AbY9e}yUvH``+dV}rrI^EG|d0K(VKZNZXaj-Cm5e=qvZ($ewove5dw*jcAtMp zgVwj71{D~XN z-AhYJ;MBGiHtrOnz>seNcHePa(Dia<+&ufGQkQCMt0Cu8S&RWx5_iG;7Tx>lt?8qv z`5G_pJvaLgOo=K`ARh@}*=%Uk@H;agueX|(4GRDib$#A@DE;=~3sJ6~1UOas8QOUe z`w!@Qs*C?%J^K#-2xllf#iaBL$-4gYr}3{g%0}dpxTaQ$ZR^XPDNR(^uU}!RG7(|| zdJD!?AXp}E(@(DA+}zy8u&s}&)$b4iL*d~+R5FlVR`*h;GU94f6WsFE>L%wt;1JDh zk}=vCB+U;5Vg7Fz*#~eXfg&^CT=Q8?#Yvg_brf1~925W64n({VYnhn$HXl%vYtMjW zPLDoblEJU=dg2IK{%ey={WgPG;AcZ`3nz7*b_pwCEWpf|`eyoIdmwWdPa6lcc#geGbq)7Al z6x{=X>&>^h=#gQzYkeus+TNxvktIvGMhwSLQh)B&&15PY{u7d!^_!fc6dwYcz1H(< zunYuCH#!8vMlm;-IErx1LhjLt1eK#!S!kN3e8z-8E| zN=oFo$F+$ef%~lJxol6Xdc~*oD}&pAKS)Z~lE7OMD5g*9e0{N6b*iv1WuYu^Y{RPm z?OEjFFFJ1jScp{uR_DJFA$Qn}9DiEq@I{I*2!@RClPQ5t2*GjV3s!KoiU0lrknauSc2(Oc!4eLKlj?ft zq(HVfJDc$>5ZV$6iu{{4$PqYZdLO+E$y}ew^||@848T2^_@1AKyifWc{3UU-xvO8s zCf|qO>jORTMmWVXP)+zoP%ENbv~$k*#xW+`8JYffABA+<_o05F+ZP*9v2q z|8oi-!{h?kq%QU5w?}y{YCOo{;cf2%DC6KD7?Y+6WG_5Iwz;nF?))_}4PhTbWXw=0 z^U0rP=Kw4%D1`7lPQ94G#UBM0V#9=(s>kkN61Y|}Z()1!G2T5fI7z?+AmINcBp?e0 zuz4m4I_KOs-_u3$2^+}=LvvXfar(%e;K%5Ajf{3cs`BaN%yUT|;b1GYd9qYt=M5tM z#Y0oW1CK#Q*;;6lC7V_(dK#1wlJPg!$knz0fk%~OSzzsQbDp!kNeQ_H9h#I++$_fl z>txq^nlX6d&Of=yBc%Yw$0_PJCABwsq>Dwu(MDC4dRU=Ecwk&`0uhn<5oTCE_or6G z1ghPjLas{#TQWdUzfL^6zs4g0C%T^hy~ho8v#@py;0V1DA*27w34C(W*HrnUvdMLr zGYH`Bc1j4RCzW12^oEeYNxWS;YL4DkTZPkZ%{u^OCvws-2+t=JMYG2jtTc@cEmE{# zC?H{k@cD5yM_IVeKP1z~%SH8Ij_!^xUV(KEz<))WJADHK8$TU>g+d`vDx*L3+y%8W zJ{hD|LMDL5GBMKX@qCK=eW#g`@!pI#Mle)5B=T#*{r1xU^0B>;awgXZ3GmBKWAkz1 zU7oOMUn61ej{Y4%1c~Phv(Z@y3dI!0o7DTxRnDVWBPpC6V3^r|97f_xd)Pel^yu~`SL{3tqLp(z^16> zyfEh89cSUmG#LoHOX4B}cm5ZPH0A$LfTZe6O*kdOEBYMg5Mnre`w;M2&IkAweAm-l z=lCYSH(iNH+~P;gmNpOj@wRniFcd9Xz+cr!<<+4s+S+TzNsFKPLlSgR1skA(rnB9P!JFn+UvnVBUx+QeU6FWtn(L!U%@3NK1D@ww}U+#Iv4hT%8Cio)E-= zkBH+OD20&8qJc>8s3aQs!~d`44#!lC7+#g2hAZ1qRMPCepZtkZNgFq` zdTl7kn+`^10mM2B?EM^26^~ylquv9Rf9@qBx}>vEv{>UrOxQJLZ}IIN=NaYbFMjVj z-#1V+DdxDB%}2$m&0naXrN0j|m!F@zO50G^6d)tUI<3ySkAlPtQa*tFMhs0D3sR;C zV1do31T}Et_IKO-et{~GUJFHg+f^RKNNMGFhbRe<%(M_Zy9FvP!a{8L&fN! zz3jS`=DtfQ#HI+k4p=e$Cv_iRlPG9SHUdjx*$I}9(s-YdW5EWJ#MQIff+sX_O(`hy z7L{7eN6j#SGuRv#D>5Lju4 z0!0fh5VTtxi-(+YgHfktAaYm$xZX+f?yoO?Ut=7AXuVT*@rvED$1W;ESL4667l zndIfrJE6_J1Q%KIl;AGpTsW+LM-o!{{;4SdVPUlCz4r&1esXkkV|iRs^mDr(O0~tcZs5{To?gfs|G#+KPD>JS!=@-try%VEs`-9Jp0~OUBT#>Ya<) z{)URZpe`53sC=z0`ijXB=pOqS*j= z<9(8h#!gI{GSR_p7^L2gDx4yU!EL_sIB--i*!A2X!KPq$pGQ3^ETi>raO7WiCqwSM zftp}kb|K**|9m0Qe>x;SvIwe8Q_7!WsI;F<>XPshxE=cFj(}Y!DY};QSGcBt$iQ+pakM2y8TZ(@C>Vh~bKq^7a;NRp zgZY9@f3u)yE}yg<9ecmZpE@!$h6Sm1dL&`C-@sb^lx6m+Z%3q@kq|SnQ&;s0o4?;D znowDkw%!#0uo6E=OKN-?2Y7b_d!tTpAi^TL0<~kVC924hkpt4SX8oBoNj#fnm~N=q z$To=0$zgtK@o9j#BzBV*88!ZYU2=3{h~o^OWT<2=g6c(?P5@j{Bl5fT94@D?BE#Fw zXu)HVt_UY>vRF>a?Z)IbpeE?n+ z-mWOM-+j$?`=j}e&VLkRbXtrWvkxZtq{F&2LN~T!u(7 zj7dp2HV(^zB{F9bd8*d>N-wJ+M%wx)5`g+VEgOSf{p-Kv@$Nh-xa2^rql(Bw%4`0v{b6vVH~ul1?W16#q%#)#)9TblO0nHjm|AG3!q+TT!7ei5>J3D ziT))soW}s6b@L+7!_M%`7(~U?m~CC9kAN11vXZM=hPJ_OEbX40V_7Cmix7B_DW|cn zfl=eze0)5SFoZcgE*sKjy`Kk9D&e0ov3=SRK(vlhF*Zj_l<(p`WzmoYDtRi1g5ZnW z(PaszI1B$@N7v%dWZcD{XLlO5+(w$AhL+mQEs04km1HU<#mqG%qC&-tT(Y8aCzmcL zmsHa0zKK;@QMon6x_MC;$tB`_djEju{Lbf`@9&)7_k5mn&Nw{wr(n<(?))mDalfa> zA1Pw7Zun_3=m1U@%-x7lk;3RsGs$3pSqLS*s9YYUX^^=Mfza}^lP9F#u$>4&O&=X<7Y0tI%>5>@B@;8mnAFbp#6J4mL^a7j|8U?IEk^bdwFG>Wi5^8 z^G>)QqinF2nyJd0)#q!kAn{lHL;Djah%{ikVEOr$=fo8suM!dRx-2A#7P2@ssu|CV zJtERkUkBu)!8%_+{pbz#cxC`$IoqvYbaZSFD8oh9ljgq>@AOn*)zNk)>5<*1mfdfI zIU)FvOG5Xu<*!tBoREsvrBbrcqyKhKe~Hc?S*j zjGB&Lb@QXH2tDnG^a`Cd!WwuGfgrC{qg?IUo}C+mW?{NFu+BdR9A(wxJRRLl4tosV z)nfziI6qdm|FLk5%u`FMH$oNL!fQ@#f1uO-wexb*K?@J^TD(gdt=Z{>rf4JxXj#us zbH@%$uH(qvStz}A`O<1?40$Is9fGv)KWArh<`Tc4l@`c;h^BY&?iYYj@DeC_inZ

B-$D28# zz{ogR4*NwxM0@pZ^}G0A#x#bjB6~V~JD0u%4Ar441P%}n@XrbWoHXuk=yTEK>&i?g zdk1Daa7VwtC449}RchKX`t>1^6R_0BIq^sk8PaF)*s}bv5~7P4+ICNuu;=)L@Mq!mf=_4-3!)@NG&(ByCn*LdO;vjl874L` zEaONlRk58@87F#F^n|a0Kj1$216?`3lXi5%*|W>PYK`9q=H1LlS4jqO(#J2o8}hw= zfE^dEunEMUU~*kEioZ%&wtI5F(B-uK?kD>?bTF^=2kr;nRu9gf;b5Vw5%^DcPqvB1`U4?E^7JqXQS7| zC7nAvkVvE->(gPI0hhxZ=>enM{9!bTbro#582Ewv9fyFl%43i=>1i0NNYJ@qcaqKn zb0;6H#x@I8fT_5}iK)S<1!oZ_9gDoUln7H>pNM~N>$o7psg@9m>gHF@egZ1tZ;!vv zGFVVRl;GJwLOI0tG1e1JSu(AMWs{x3Pz9l7Ek14 z%~g>{kXUb7ThY18E6%k{n`w-GTi47?L;e$?LwXo7z6;e&4AA074?}(A?{yl@lU7`h z9cw~!yJ3*P9KsIYh`L3aiPzXa#`JT)OTd9sjRHMyp%J;T{x@g+#+m!1X1&ot(~N7q zQF?BD7~B;$i}7q&jI9|m2HY95tg~dR<43fckMA6WtoMa2O7#|3h{S{Z<-I8L#a_VZ zLyICm7;Zst>l5Y1797ZAO=E~7omw{0k8O4MMqGYbyuNM;>&FgwjWYk4+h?AxtS`z+ zOTHbz$k0YQXcJYUyy;44Z}Yj?dT<~+sbP2+n8hD??SIS7rgzL&k?iOkrg~knDf?!` zIFm{(D0b2kj$5bRRewgc z{>X))B-^Ql)mJ3bW0@P>wJ*EK>~BVa1wYTxpzT2bN!kuqYLYv&mcCv{45g z)M)_M^Zi}t_pp_2bDhf7Z)uBF25>AxPfkHRHpezRKA zG_mZEK19Abt7|KghTS~OHMuM}8$b-I&3&oyRu*jskL~7(jOc(tfHVX?t52!)Z7XXZ z06NxX>|RH28xfu>bgcTG7HeYOO0nJQ*eZ3c_{M|;|c}}HY-cS#!KHF(ZFvIZRZYAsD6twNm z`Dw)2ftKPZUBxB{9>MGpRR^`MCY{t-j6B55LJPRNks~AP2kouzg|!oqBoeCl%$0J% z$=FX+dR^Q!9BfQs+K9I2;88Wr*6~U$=(&Etx&QOAvi_)HlS#}7iLstv0G0;B#PM%s z7}RTg3X0WwQ5)fSC_xprL;i13)39m*L}MhI%66Qa6Obz?GUL&JeG2F>00i{bP$E-7 z00@RHcqZZ_8$w?;b!lO?Kzd0Lin>lleyag1)JLHkbGD+=H=;K_mX@AlE80nx_6MnDl&ddv6o#;B)TBjq3n z`fK67TSfIb!^izadO)`_4qg*mIPn(xqI0TFj_-$3h0WT1euP}3g(2EPYOnb}WMltc zY=Kp87%AfX$O=-1v(gfwVo;2|DbVX^ge>kiXa1h`&wep}ojZ?*lNPRCQ%Dmrwa!$# zjBCTLz`C8V91rO1s^#izoi+uQ;~~-1Pm`ds&eo&lYC%HkF}g{H#{0oEz?m`&Vzku~|J; zw+%xXze&mh7U!yNH;Fwd*Q2mm2`b7=B z|L2MiUbDWwSXd-3ZV7flL+K0%8L(A&j&&iJLjgDYzdAAp{q2=?hLi5?q#G%nPLZyy(i$WcIlbq+n=Wvx!&RI!2)(rt80(;Q1=#eM_d z%GVD?XSOP`LhMBD showUnreadMessagesNotification(Iterable messages) async { diff --git a/lib/main.dart b/lib/main.dart index 7382fd5..018ecc1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -165,7 +165,7 @@ class _reconState extends State { child: DynamicColorBuilder( builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) => MaterialApp( debugShowCheckedModeBanner: true, - title: 'recon', + title: 'OpenContacts', theme: ThemeData( useMaterial3: true, textTheme: _typography.black, From 198f99d8f7fb962246b362c422939a99f7fdfdf2 Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 11:30:08 -0400 Subject: [PATCH 10/12] test --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a8e9305..10d7bf8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + ## OpenContacts From 58dd75a5db26ee219139de3d3da5133975040d18 Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 11:30:40 -0400 Subject: [PATCH 11/12] Changed README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10d7bf8..594b1d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + ## OpenContacts From ae5c2bab1dafdf00d15040fdf74fdf0b0e929df4 Mon Sep 17 00:00:00 2001 From: Mrdabup Date: Mon, 15 Jul 2024 11:45:55 -0400 Subject: [PATCH 12/12] Finishing --- lib/widgets/settings_page.dart | 6 +++--- pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/widgets/settings_page.dart b/lib/widgets/settings_page.dart index dcc18f3..c261985 100644 --- a/lib/widgets/settings_page.dart +++ b/lib/widgets/settings_page.dart @@ -74,14 +74,14 @@ class SettingsPage extends StatelessWidget { ), ListTile( trailing: const Icon(Icons.info_outline), - title: const Text("About recon"), + title: const Text("About OpenContacts"), onTap: () async { showAboutDialog( context: context, applicationVersion: (await PackageInfo.fromPlatform()).version, applicationIcon: InkWell( onTap: () async { - if (!await launchUrl(Uri.parse("https://github.com/Nutcake/recon"), + if (!await launchUrl(Uri.parse("https://git.mrdab.vore.media/ThatOneJackalGuy/OpenContacts"), mode: LaunchMode.externalApplication)) { if (context.mounted) { ScaffoldMessenger.of(context) @@ -92,7 +92,7 @@ class SettingsPage extends StatelessWidget { child: Container( margin: const EdgeInsets.all(16), constraints: const BoxConstraints(maxWidth: 64), - child: Image.asset("assets/images/logo512.png"), + child: Image.asset("assets/images/testingIcon512.png"), ), ), applicationLegalese: "ReCon by Nutcake, OpenContacts by ThatOneJackalGuy. Both apps made with <3", diff --git a/pubspec.yaml b/pubspec.yaml index 7686589..e729211 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.0.1-indev+1 +version: 0.0.1-alpha+2 environment: sdk: ">=3.0.1"