From e74b472895d444fb7d09090ea184b316ccc4711d Mon Sep 17 00:00:00 2001 From: Ebrahim Tahernejad Date: Sun, 4 Feb 2024 19:16:55 +0330 Subject: [PATCH 01/83] Added shared instance for LogsEventHandler --- ios/Runner/Handlers/LogsEventHandler.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ios/Runner/Handlers/LogsEventHandler.swift b/ios/Runner/Handlers/LogsEventHandler.swift index c1b86208..a3a85247 100644 --- a/ios/Runner/Handlers/LogsEventHandler.swift +++ b/ios/Runner/Handlers/LogsEventHandler.swift @@ -3,6 +3,7 @@ import Combine import Libcore class LogsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol { + static let shared: LogsEventHandler = LogsEventHandler() static let name = "\(Bundle.main.serviceIdentifier)/service.logs" private var channel: FlutterEventChannel? @@ -15,7 +16,7 @@ class LogsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCom private var lock: NSLock = NSLock() public static func register(with registrar: FlutterPluginRegistrar) { - let instance = LogsEventHandler() + let instance = LogsEventHandler.shared instance.channel = FlutterEventChannel(name: Self.name, binaryMessenger: registrar.messenger()) instance.channel?.setStreamHandler(instance) } From faf69288898fa503091bb03d9ffe0b95066dc27a Mon Sep 17 00:00:00 2001 From: Ebrahim Tahernejad Date: Sun, 4 Feb 2024 19:19:55 +0330 Subject: [PATCH 02/83] Use shared instance of logs to log --- ios/Runner/VPN/VPNManager.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/Runner/VPN/VPNManager.swift b/ios/Runner/VPN/VPNManager.swift index 8bdff45b..24370285 100644 --- a/ios/Runner/VPN/VPNManager.swift +++ b/ios/Runner/VPN/VPNManager.swift @@ -86,7 +86,7 @@ class VPNManager: ObservableObject { do { try await loadVPNPreference() } catch { - LogsEventHandler().writeLog(error.localizedDescription) + LogsEventHandler.shared.writeLog(error.localizedDescription) } } @@ -107,7 +107,7 @@ class VPNManager: ObservableObject { try await newManager.loadFromPreferences() self.manager = newManager } catch { - LogsEventHandler().writeLog(error.localizedDescription) + LogsEventHandler.shared.writeLog(error.localizedDescription) } } @@ -117,7 +117,7 @@ class VPNManager: ObservableObject { try await manager.saveToPreferences() try await manager.loadFromPreferences() } catch { - LogsEventHandler().writeLog(error.localizedDescription) + LogsEventHandler.shared.writeLog(error.localizedDescription) } } @@ -157,7 +157,7 @@ class VPNManager: ObservableObject { } try await self?.loadVPNPreference() } catch { - LogsEventHandler().writeLog(error.localizedDescription) + LogsEventHandler.shared.writeLog(error.localizedDescription) } } }.store(in: &cancelBag) @@ -188,7 +188,7 @@ class VPNManager: ObservableObject { } } } catch { - LogsEventHandler().writeLog(error.localizedDescription) + LogsEventHandler.shared.writeLog(error.localizedDescription) } } @@ -202,7 +202,7 @@ class VPNManager: ObservableObject { "DisableMemoryLimit": (disableMemoryLimit ? "YES" : "NO") as NSString, ]) } catch { - LogsEventHandler().writeLog(error.localizedDescription) + LogsEventHandler.shared.writeLog(error.localizedDescription) } connectTime = .now } From ccf4d8c98cf0ce784421dfca96128b6df45c13e1 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Mon, 5 Feb 2024 17:00:23 +0100 Subject: [PATCH 03/83] new: display go errors --- lib/core/model/failures.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/model/failures.dart b/lib/core/model/failures.dart index 1f28b6d9..3e3d95de 100644 --- a/lib/core/model/failures.dart +++ b/lib/core/model/failures.dart @@ -25,7 +25,7 @@ extension ErrorPresenter on TranslationsEn { UnexpectedFailure(error: final nestedErr?) => errorToPair(nestedErr), Failure() => error.present(this), DioException() => error.present(this), - _ => (type: failure.unexpected, message: null), + _ => (type: failure.unexpected, message: error.toString()), }; PresentableError presentError( From 78f9246fdd22170c5d3ad7e4d845e1989be75c50 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Mon, 5 Feb 2024 19:21:51 +0100 Subject: [PATCH 04/83] new: move running admin service to core --- .../data/connection_platform_source.dart | 118 ------------------ .../data/connection_repository.dart | 10 -- 2 files changed, 128 deletions(-) diff --git a/lib/features/connection/data/connection_platform_source.dart b/lib/features/connection/data/connection_platform_source.dart index 3fc5dd67..e0e88a7c 100644 --- a/lib/features/connection/data/connection_platform_source.dart +++ b/lib/features/connection/data/connection_platform_source.dart @@ -12,8 +12,6 @@ import 'package:win32/win32.dart'; abstract interface class ConnectionPlatformSource { Future checkPrivilege(); - Future activateTunnel(); - Future deactivateTunnel(); } class ConnectionPlatformSourceImpl @@ -63,122 +61,6 @@ class ConnectionPlatformSourceImpl return true; // return true so core handles it } } - - @override - Future activateTunnel() async { - if (!Platform.isWindows && !Platform.isLinux) { - return await checkPrivilege(); - } - try { - final socket = await Socket.connect('127.0.0.1', 18020, - timeout: Duration(seconds: 1)); - await socket.close(); - return await startTunnelRequest(); - } catch (error) { - loggy.warning( - 'Tunnel Service is not running. Error: $error.--> Running...'); - return await runTunnelService(); - } - } - - @override - Future deactivateTunnel() async { - if (!Platform.isWindows && !Platform.isLinux && !Platform.isMacOS) { - return true; - } - try { - return await stopTunnelRequest(); - } catch (error) { - loggy.error('Tunnel Service Stop Error: $error.'); - return false; - } - } - - Future startTunnelRequest() async { - final params = { - "Ipv6": false, - "ServerPort": "2334", - "StrictRoute": false, - "EndpointIndependentNat": false, - "Stack": "gvisor", - }; - - final query = mapToQueryString(params); - - try { - final request = - await HttpClient().get('localhost', 18020, "/start?$query"); - final response = await request.close(); - final body = await response.transform(utf8.decoder).join(); - loggy.debug( - 'Status Code: ${response.statusCode} ${response.reasonPhrase}'); - loggy.debug('Response Body: ${body}'); - return true; - } catch (error) { - loggy.error('HTTP Request Error: $error'); - return false; - } - } - - Future stopTunnelRequest() async { - try { - final request = await HttpClient().get('localhost', 18020, "/stop"); - final response = await request.close(); - final body = await response.transform(utf8.decoder).join(); - loggy.debug( - 'Status Code: ${response.statusCode} ${response.reasonPhrase}'); - loggy.debug('Response Body: ${body}'); - return true; - } catch (error) { - loggy.error('HTTP Request Error: $error'); - return false; - } - } - - String mapToQueryString(Map params) { - return params.entries.map((entry) { - final key = Uri.encodeQueryComponent(entry.key); - final value = Uri.encodeQueryComponent(entry.value.toString()); - return '$key=$value'; - }).join('&'); - } - - Future runTunnelService() async { - final executablePath = getTunnelServicePath(); - - var command = [executablePath, "install"]; - if (Platform.isLinux) { - command.insert(0, 'pkexec'); - } - - try { - final result = - await Process.run(command[0], command.sublist(1), runInShell: true); - loggy.debug('Shell command executed: ${result.stdout} ${result.stderr}'); - return await startTunnelRequest(); - } catch (error) { - loggy.error('Error executing shell command: $error'); - return false; - } - } - - static String getTunnelServicePath() { - String fullPath = ""; - final binFolder = - Directory(Platform.resolvedExecutable).parent.absolute.path; - if (Platform.environment.containsKey('FLUTTER_TEST')) { - fullPath = "libcore"; - } - if (Platform.isWindows) { - fullPath = p.join(fullPath, "HiddifyService.exe"); - } else if (Platform.isMacOS) { - fullPath = p.join(fullPath, "HiddifyService"); - } else { - fullPath = p.join(fullPath, "HiddifyService"); - } - - return "$binFolder/$fullPath"; - } } sealed class _TokenElevation extends Struct { diff --git a/lib/features/connection/data/connection_repository.dart b/lib/features/connection/data/connection_repository.dart index 57eb892e..e4d55c9b 100644 --- a/lib/features/connection/data/connection_repository.dart +++ b/lib/features/connection/data/connection_repository.dart @@ -159,11 +159,6 @@ class ConnectionRepositoryImpl await $( TaskEither(() async { if (options.enableTun) { - final active = await platformSource.activateTunnel(); - if (!active) { - loggy.warning("Possiblity missing privileges for tun mode"); - return left(const MissingPrivilege()); - } // final hasPrivilege = await platformSource.checkPrivilege(); // if (!hasPrivilege) { // loggy.warning("missing privileges for tun mode"); @@ -197,11 +192,6 @@ class ConnectionRepositoryImpl await $( TaskEither(() async { if (options.enableTun) { - final active = await platformSource.deactivateTunnel(); - if (!active) { - loggy.warning("Possiblity missing privileges for tun mode"); - return left(const MissingPrivilege()); - } // final hasPrivilege = await platformSource.checkPrivilege(); // if (!hasPrivilege) { // loggy.warning("missing privileges for tun mode"); From e04d23736d766e9ca6c0c5a9cb878b9822af49e0 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Wed, 7 Feb 2024 11:24:33 +0100 Subject: [PATCH 05/83] new: hide hidden nodes --- lib/features/proxy/data/proxy_repository.dart | 1 + lib/features/proxy/model/proxy_entity.dart | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/features/proxy/data/proxy_repository.dart b/lib/features/proxy/data/proxy_repository.dart index f318ecaf..13b0b576 100644 --- a/lib/features/proxy/data/proxy_repository.dart +++ b/lib/features/proxy/data/proxy_repository.dart @@ -42,6 +42,7 @@ class ProxyRepositoryImpl selectedTag: groupWithSelected[e.tag], ), ) + .filter((t) => t.isVisible) .toList(), ), ) diff --git a/lib/features/proxy/model/proxy_entity.dart b/lib/features/proxy/model/proxy_entity.dart index 2dbf96d0..8b6c8472 100644 --- a/lib/features/proxy/model/proxy_entity.dart +++ b/lib/features/proxy/model/proxy_entity.dart @@ -31,6 +31,7 @@ class ProxyItemEntity with _$ProxyItemEntity { String get name => _sanitizedTag(tag); String? get selectedName => selectedTag == null ? null : _sanitizedTag(selectedTag!); + bool get isVisible => !tag.contains("§hide§"); } String _sanitizedTag(String tag) => From b86cd26bed20f68ebb9d56846daeb2a3e4dec3d4 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Thu, 8 Feb 2024 10:23:47 +0100 Subject: [PATCH 06/83] new: add intro based on user lang and region --- lib/features/intro/widget/intro_page.dart | 51 ++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/features/intro/widget/intro_page.dart b/lib/features/intro/widget/intro_page.dart index c458b3fe..0a8909c5 100644 --- a/lib/features/intro/widget/intro_page.dart +++ b/lib/features/intro/widget/intro_page.dart @@ -1,15 +1,20 @@ +import 'dart:convert'; import 'package:flutter/gestures.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/analytics/analytics_controller.dart'; +import 'package:hiddify/core/localization/locale_preferences.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/constants.dart'; +import 'package:hiddify/core/model/region.dart'; import 'package:hiddify/core/preferences/general_preferences.dart'; import 'package:hiddify/features/common/general_pref_tiles.dart'; import 'package:hiddify/gen/assets.gen.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:http/http.dart' as http; import 'package:sliver_tools/sliver_tools.dart'; class IntroPage extends HookConsumerWidget with PresLogger { @@ -20,7 +25,8 @@ class IntroPage extends HookConsumerWidget with PresLogger { final t = ref.watch(translationsProvider); final isStarting = useState(false); - + autoSelectRegion(ref) + .then((value) => loggy.debug("Auto Region selection finished!")); return Scaffold( body: SafeArea( child: CustomScrollView( @@ -109,4 +115,47 @@ class IntroPage extends HookConsumerWidget with PresLogger { ), ); } + + Future autoSelectRegion(WidgetRef ref) async { + final response = await http.get(Uri.parse('https://ipapi.co/json/')); + + if (response.statusCode == 200) { + final jsonData = jsonDecode(response.body); + final regionLocale = + _getRegionLocale(jsonData['country']?.toString() ?? ""); + + loggy.debug( + 'Region: ${regionLocale.region} Locale: ${regionLocale.locale}'); + await ref + .read(regionNotifierProvider.notifier) + .update(regionLocale.region); + await ref + .read(localePreferencesProvider.notifier) + .changeLocale(regionLocale.locale); + } else { + loggy.warning('Request failed with status: ${response.statusCode}'); + } + } + + RegionLocale _getRegionLocale(String country) { + switch (country) { + case "IR": + return RegionLocale(Region.ir, AppLocale.fa); + case "CN": + return RegionLocale(Region.cn, AppLocale.zhCn); + case "RU": + return RegionLocale(Region.ru, AppLocale.ru); + case "AF": + return RegionLocale(Region.af, AppLocale.fa); + default: + return RegionLocale(Region.other, AppLocale.en); + } + } +} + +class RegionLocale { + final Region region; + final AppLocale locale; + + RegionLocale(this.region, this.locale); } From 37dc33667ef8f5356eeeb62009408b5e3fb57f2e Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 8 Feb 2024 20:21:06 +0330 Subject: [PATCH 07/83] Add ip info fetcher --- .gitignore | 1 + .../proxy/data/proxy_data_providers.dart | 2 + lib/features/proxy/data/proxy_repository.dart | 38 +++++++++- lib/features/proxy/model/ip_info_entity.dart | 70 +++++++++++++++++++ pubspec.lock | 24 +++++++ pubspec.yaml | 2 + 6 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 lib/features/proxy/model/ip_info_entity.dart diff --git a/.gitignore b/.gitignore index b21277a5..ccae89b2 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ migrate_working_dir/ # generated files **/*.g.dart **/*.freezed.dart +**/*.mapper.dart **/*.gen.dart **/libclash.so **/libclash.h diff --git a/lib/features/proxy/data/proxy_data_providers.dart b/lib/features/proxy/data/proxy_data_providers.dart index 1c0c0823..bfc29735 100644 --- a/lib/features/proxy/data/proxy_data_providers.dart +++ b/lib/features/proxy/data/proxy_data_providers.dart @@ -1,3 +1,4 @@ +import 'package:hiddify/core/http_client/http_client_provider.dart'; import 'package:hiddify/features/proxy/data/proxy_repository.dart'; import 'package:hiddify/singbox/service/singbox_service_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -8,5 +9,6 @@ part 'proxy_data_providers.g.dart'; ProxyRepository proxyRepository(ProxyRepositoryRef ref) { return ProxyRepositoryImpl( singbox: ref.watch(singboxServiceProvider), + client: ref.watch(httpClientProvider), ); } diff --git a/lib/features/proxy/data/proxy_repository.dart b/lib/features/proxy/data/proxy_repository.dart index 13b0b576..9a3781b3 100644 --- a/lib/features/proxy/data/proxy_repository.dart +++ b/lib/features/proxy/data/proxy_repository.dart @@ -1,5 +1,7 @@ import 'package:fpdart/fpdart.dart'; +import 'package:hiddify/core/http_client/dio_http_client.dart'; import 'package:hiddify/core/utils/exception_handler.dart'; +import 'package:hiddify/features/proxy/model/ip_info_entity.dart'; import 'package:hiddify/features/proxy/model/proxy_entity.dart'; import 'package:hiddify/features/proxy/model/proxy_failure.dart'; import 'package:hiddify/singbox/service/singbox_service.dart'; @@ -7,6 +9,7 @@ import 'package:hiddify/utils/custom_loggers.dart'; abstract interface class ProxyRepository { Stream>> watchProxies(); + TaskEither getCurrentIpInfo(); TaskEither selectProxy( String groupTag, String outboundTag, @@ -17,13 +20,18 @@ abstract interface class ProxyRepository { class ProxyRepositoryImpl with ExceptionHandler, InfraLogger implements ProxyRepository { - ProxyRepositoryImpl({required this.singbox}); + ProxyRepositoryImpl({ + required this.singbox, + required this.client, + }); final SingboxService singbox; + final DioHttpClient client; @override Stream>> watchProxies() { return singbox.watchOutbounds().map((event) { + print("outbounds: $event"); final groupWithSelected = { for (final group in event) group.tag: group.selected, }; @@ -76,4 +84,32 @@ class ProxyRepositoryImpl ProxyUnexpectedFailure.new, ); } + + final Map response)> + _ipInfoSources = { + "https://ipapi.co/json/": IpInfo.fromIpApiCoJson, + "https://ipinfo.io/json/": IpInfo.fromIpInfoIoJson, + }; + + @override + TaskEither getCurrentIpInfo() { + return TaskEither.tryCatch( + () async { + for (final source in _ipInfoSources.entries) { + try { + loggy.debug("getting current ip info using [${source.key}]"); + final response = await client.get>(source.key); + if (response.statusCode == 200 && response.data != null) { + return source.value(response.data!); + } + } catch (e) { + loggy.debug("failed getting ip info using [${source.key}]", e); + continue; + } + } + throw const ProxyFailure.unexpected(); + }, + ProxyUnexpectedFailure.new, + ); + } } diff --git a/lib/features/proxy/model/ip_info_entity.dart b/lib/features/proxy/model/ip_info_entity.dart new file mode 100644 index 00000000..6a5536d5 --- /dev/null +++ b/lib/features/proxy/model/ip_info_entity.dart @@ -0,0 +1,70 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'ip_info_entity.mapper.dart'; + +@MappableClass() +class IpInfo with IpInfoMappable { + const IpInfo({ + required this.ip, + required this.countryCode, + required this.region, + required this.city, + this.timezone, + this.asn, + this.org, + }); + + final String ip; + final String countryCode; + final String region; + final String city; + final String? timezone; + final String? asn; + final String? org; + + static IpInfo fromIpInfoIoJson(Map json) { + return switch (json) { + { + "ip": final String ip, + "country": final String country, + "region": final String region, + "city": final String city, + "timezone": final String timezone, + "org": final String org, + } => + IpInfo( + ip: ip, + countryCode: country, + region: region, + city: city, + timezone: timezone, + org: org, + ), + _ => throw const FormatException("invalid json"), + }; + } + + static IpInfo fromIpApiCoJson(Map json) { + return switch (json) { + { + "ip": final String ip, + "country_code": final String countryCode, + "region": final String region, + "city": final String city, + "timezone": final String timezone, + "asn": final String asn, + "org": final String org, + } => + IpInfo( + ip: ip, + countryCode: countryCode, + region: region, + city: city, + timezone: timezone, + asn: asn, + org: org, + ), + _ => throw const FormatException("invalid json"), + }; + } +} diff --git a/pubspec.lock b/pubspec.lock index 36ca7197..c44e14a1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -289,6 +289,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.8" + dart_mappable: + dependency: "direct main" + description: + name: dart_mappable + sha256: "7b6d38ae95f1ae8ffa65df9a5464f14b56c2de94699a035202ca4cd3a0ba249e" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + dart_mappable_builder: + dependency: "direct dev" + description: + name: dart_mappable_builder + sha256: "98c058f7e80a98ea42d357d888ed1648d96bedac8b16872b58fc7024faefcdfe" + url: "https://pub.dev" + source: hosted + version: "4.2.0" dart_style: dependency: transitive description: @@ -1538,6 +1554,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + type_plus: + dependency: transitive + description: + name: type_plus + sha256: "2e33cfac2e129297d5874567bdf7587502ec359881e9318551e014d91b02f84a" + url: "https://pub.dev" + source: hosted + version: "2.1.0" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 500a0f4e..fcaea7ba 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -71,6 +71,7 @@ dependencies: dio_smart_retry: ^6.0.0 cupertino_http: ^1.3.0 wolt_modal_sheet: ^0.4.0 + dart_mappable: ^4.2.0 dev_dependencies: flutter_test: @@ -86,6 +87,7 @@ dev_dependencies: flutter_gen_runner: ^5.4.0 go_router_builder: ^2.4.1 dependency_validator: ^3.2.3 + dart_mappable_builder: ^4.2.0 flutter: uses-material-design: true From 7394f7c4c36200acfc2b41da8206a13f4ef6ec9a Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Fri, 9 Feb 2024 12:02:52 +0330 Subject: [PATCH 08/83] Add connection info footer --- .../hiddify/hiddify/ActiveGroupsChannel.kt | 60 +++++++ .../com/hiddify/hiddify/GroupsChannel.kt | 62 ++------ .../com/hiddify/hiddify/MainActivity.kt | 1 + .../hiddify/hiddify/utils/CommandClient.kt | 3 +- .../hiddify/hiddify/utils/OutboundMapper.kt | 31 ++++ assets/translations/strings_en.i18n.json | 3 +- assets/translations/strings_es.i18n.json | 3 +- assets/translations/strings_fa.i18n.json | 3 +- assets/translations/strings_ru.i18n.json | 3 +- assets/translations/strings_tr.i18n.json | 3 +- assets/translations/strings_zh-CN.i18n.json | 3 +- lib/core/widget/animated_visibility.dart | 38 +++++ lib/core/widget/skeleton_widget.dart | 39 +++++ lib/features/home/widget/home_page.dart | 19 +-- .../proxy/active/active_proxy_footer.dart | 149 ++++++++++++++++++ .../proxy/active/active_proxy_notifier.dart | 75 +++++++++ lib/features/proxy/data/proxy_repository.dart | 45 +++++- .../stats/notifier/stats_notifier.dart | 2 + lib/singbox/service/ffi_singbox_service.dart | 6 + .../service/platform_singbox_service.dart | 17 ++ lib/singbox/service/singbox_service.dart | 2 + pubspec.lock | 16 ++ pubspec.yaml | 2 + 23 files changed, 520 insertions(+), 65 deletions(-) create mode 100644 android/app/src/main/kotlin/com/hiddify/hiddify/ActiveGroupsChannel.kt create mode 100644 android/app/src/main/kotlin/com/hiddify/hiddify/utils/OutboundMapper.kt create mode 100644 lib/core/widget/animated_visibility.dart create mode 100644 lib/core/widget/skeleton_widget.dart create mode 100644 lib/features/proxy/active/active_proxy_footer.dart create mode 100644 lib/features/proxy/active/active_proxy_notifier.dart diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/ActiveGroupsChannel.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/ActiveGroupsChannel.kt new file mode 100644 index 00000000..34c5d547 --- /dev/null +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/ActiveGroupsChannel.kt @@ -0,0 +1,60 @@ +package com.hiddify.hiddify + +import android.util.Log +import com.google.gson.Gson +import com.hiddify.hiddify.utils.CommandClient +import com.hiddify.hiddify.utils.ParsedOutboundGroup +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.EventChannel +import io.nekohasekai.libbox.OutboundGroup +import kotlinx.coroutines.CoroutineScope + + +class ActiveGroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, + CommandClient.Handler { + companion object { + const val TAG = "A/ActiveGroupsChannel" + const val CHANNEL = "com.hiddify.app/active-groups" + val gson = Gson() + } + + private val client = + CommandClient(scope, CommandClient.ConnectionType.GroupOnly, this) + + private var channel: EventChannel? = null + private var event: EventChannel.EventSink? = null + + override fun updateGroups(groups: List) { + MainActivity.instance.runOnUiThread { + val parsedGroups = groups.map { group -> ParsedOutboundGroup.fromOutbound(group) } + event?.success(gson.toJson(parsedGroups)) + } + } + + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + channel = EventChannel( + flutterPluginBinding.binaryMessenger, + CHANNEL + ) + + channel!!.setStreamHandler(object : EventChannel.StreamHandler { + override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { + event = events + Log.d(TAG, "connecting active groups command client") + client.connect() + } + + override fun onCancel(arguments: Any?) { + event = null + Log.d(TAG, "disconnecting active groups command client") + client.disconnect() + } + }) + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + event = null + client.disconnect() + channel?.setStreamHandler(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt index bf492953..7f2b907b 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt @@ -2,85 +2,57 @@ package com.hiddify.hiddify import android.util.Log import com.google.gson.Gson -import com.google.gson.annotations.SerializedName import com.hiddify.hiddify.utils.CommandClient +import com.hiddify.hiddify.utils.ParsedOutboundGroup import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.EventChannel import io.nekohasekai.libbox.OutboundGroup -import io.nekohasekai.libbox.OutboundGroupItem import kotlinx.coroutines.CoroutineScope class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler { companion object { const val TAG = "A/GroupsChannel" - const val GROUP_CHANNEL = "com.hiddify.app/groups" + const val CHANNEL = "com.hiddify.app/groups" val gson = Gson() } - private val commandClient = + private val client = CommandClient(scope, CommandClient.ConnectionType.Groups, this) - private var groupsChannel: EventChannel? = null - - private var groupsEvent: EventChannel.EventSink? = null + private var channel: EventChannel? = null + private var event: EventChannel.EventSink? = null override fun updateGroups(groups: List) { MainActivity.instance.runOnUiThread { - val kGroups = groups.map { group -> KOutboundGroup.fromOutbound(group) } - groupsEvent?.success(gson.toJson(kGroups)) + val parsedGroups = groups.map { group -> ParsedOutboundGroup.fromOutbound(group) } + event?.success(gson.toJson(parsedGroups)) } } override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - groupsChannel = EventChannel( + channel = EventChannel( flutterPluginBinding.binaryMessenger, - GROUP_CHANNEL + CHANNEL ) - groupsChannel!!.setStreamHandler(object : EventChannel.StreamHandler { + channel!!.setStreamHandler(object : EventChannel.StreamHandler { override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { - groupsEvent = events + event = events Log.d(TAG, "connecting groups command client") - commandClient.connect() + client.connect() } override fun onCancel(arguments: Any?) { - groupsEvent = null + event = null Log.d(TAG, "disconnecting groups command client") - commandClient.disconnect() + client.disconnect() } }) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - groupsEvent = null - commandClient.disconnect() - groupsChannel?.setStreamHandler(null) - } - - data class KOutboundGroup( - @SerializedName("tag") val tag: String, - @SerializedName("type") val type: String, - @SerializedName("selected") val selected: String, - @SerializedName("items") val items: List - ) { - companion object { - fun fromOutbound(group: OutboundGroup): KOutboundGroup { - val outboundItems = group.items - val items = mutableListOf() - while (outboundItems.hasNext()) { - items.add(KOutboundGroupItem(outboundItems.next())) - } - return KOutboundGroup(group.tag, group.type, group.selected, items) - } - } - } - - data class KOutboundGroupItem( - @SerializedName("tag") val tag: String, - @SerializedName("type") val type: String, - @SerializedName("url-test-delay") val urlTestDelay: Int, - ) { - constructor(item: OutboundGroupItem) : this(item.tag, item.type, item.urlTestDelay) + event = null + client.disconnect() + channel?.setStreamHandler(null) } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt index 47a452d6..1b48d640 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt @@ -49,6 +49,7 @@ class MainActivity : FlutterFragmentActivity(), ServiceConnection.Callback { flutterEngine.plugins.add(EventHandler()) flutterEngine.plugins.add(LogHandler()) flutterEngine.plugins.add(GroupsChannel(lifecycleScope)) + flutterEngine.plugins.add(ActiveGroupsChannel(lifecycleScope)) flutterEngine.plugins.add(StatsChannel(lifecycleScope)) } diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/utils/CommandClient.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/utils/CommandClient.kt index 8cf2f8bd..852a0439 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/utils/CommandClient.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/utils/CommandClient.kt @@ -23,7 +23,7 @@ open class CommandClient( ) { enum class ConnectionType { - Status, Groups, Log, ClashMode + Status, Groups, Log, ClashMode, GroupOnly } interface Handler { @@ -50,6 +50,7 @@ open class CommandClient( ConnectionType.Groups -> Libbox.CommandGroup ConnectionType.Log -> Libbox.CommandLog ConnectionType.ClashMode -> Libbox.CommandClashMode + ConnectionType.GroupOnly -> Libbox.CommandGroupInfoOnly } options.statusInterval = 2 * 1000 * 1000 * 1000 val commandClient = CommandClient(clientHandler, options) diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/utils/OutboundMapper.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/utils/OutboundMapper.kt new file mode 100644 index 00000000..27937e83 --- /dev/null +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/utils/OutboundMapper.kt @@ -0,0 +1,31 @@ +package com.hiddify.hiddify.utils + +import com.google.gson.annotations.SerializedName +import io.nekohasekai.libbox.OutboundGroup +import io.nekohasekai.libbox.OutboundGroupItem + +data class ParsedOutboundGroup( + @SerializedName("tag") val tag: String, + @SerializedName("type") val type: String, + @SerializedName("selected") val selected: String, + @SerializedName("items") val items: List +) { + companion object { + fun fromOutbound(group: OutboundGroup): ParsedOutboundGroup { + val outboundItems = group.items + val items = mutableListOf() + while (outboundItems.hasNext()) { + items.add(ParsedOutboundGroupItem(outboundItems.next())) + } + return ParsedOutboundGroup(group.tag, group.type, group.selected, items) + } + } +} + +data class ParsedOutboundGroupItem( + @SerializedName("tag") val tag: String, + @SerializedName("type") val type: String, + @SerializedName("url-test-delay") val urlTestDelay: Int, +) { + constructor(item: OutboundGroupItem) : this(item.tag, item.type, item.urlTestDelay) +} \ No newline at end of file diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 669d4e97..1e7cb765 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -14,7 +14,8 @@ "addToClipboard": "Add to clipboard", "notSet": "Not Set", "agree": "Agree", - "decline": "Decline" + "decline": "Decline", + "unknown": "Unknown" }, "intro": { "termsAndPolicyCaution(rich)": "by continuing you agree with ${tap(@:about.termsAndConditions)}", diff --git a/assets/translations/strings_es.i18n.json b/assets/translations/strings_es.i18n.json index b15358cf..e9fc16c1 100644 --- a/assets/translations/strings_es.i18n.json +++ b/assets/translations/strings_es.i18n.json @@ -14,7 +14,8 @@ "addToClipboard": "Añadir al portapapeles", "notSet": "No establecido", "agree": "Aceptar", - "decline": "Rechazar" + "decline": "Rechazar", + "unknown": "Desconocido" }, "home": { "emptyProfilesMsg": "Comience agregando un perfil de suscripción", diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index 024da3bc..b64e83d2 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -14,7 +14,8 @@ "addToClipboard": "به کلیپ بورد اضافه کنید", "notSet": "تنظیم نشده", "agree": "موافق", - "decline": "کاهش می یابد" + "decline": "کاهش می یابد", + "unknown": "ناشناخته" }, "intro": { "termsAndPolicyCaution(rich)": "در صورت ادامه با ${tap(@:about.termsAndConditions)} موافقت میکنید", diff --git a/assets/translations/strings_ru.i18n.json b/assets/translations/strings_ru.i18n.json index ce4f1eab..707eac4a 100644 --- a/assets/translations/strings_ru.i18n.json +++ b/assets/translations/strings_ru.i18n.json @@ -14,7 +14,8 @@ "addToClipboard": "Копировать в буфер обмена", "notSet": "Не задано", "agree": "Соглашаться", - "decline": "Отклонить" + "decline": "Отклонить", + "unknown": "Неизвестный" }, "intro": { "termsAndPolicyCaution(rich)": "Продолжая, Вы соглашаетесь с ${tap(@:about.termsAndConditions)}", diff --git a/assets/translations/strings_tr.i18n.json b/assets/translations/strings_tr.i18n.json index 5f4148b9..428e1a8c 100644 --- a/assets/translations/strings_tr.i18n.json +++ b/assets/translations/strings_tr.i18n.json @@ -14,7 +14,8 @@ "addToClipboard": "Panoya ekle", "notSet": "Ayarlanmadı", "agree": "Kabul etmek", - "decline": "Reddetmek" + "decline": "Reddetmek", + "unknown": "Bilinmeyen" }, "intro": { "termsAndPolicyCaution(rich)": "devam ederek ${tap(@:about.termsAndConditions)} kabul etmiş olursunuz", diff --git a/assets/translations/strings_zh-CN.i18n.json b/assets/translations/strings_zh-CN.i18n.json index 3f4e3b25..9679ac95 100644 --- a/assets/translations/strings_zh-CN.i18n.json +++ b/assets/translations/strings_zh-CN.i18n.json @@ -14,7 +14,8 @@ "addToClipboard": "添加到剪贴板", "notSet": "没有设置", "agree": "同意", - "decline": "衰退" + "decline": "衰退", + "unknown": "未知" }, "intro": { "termsAndPolicyCaution(rich)": "继续即表示您同意 ${tap(@:about.termsAndConditions)}", diff --git a/lib/core/widget/animated_visibility.dart b/lib/core/widget/animated_visibility.dart new file mode 100644 index 00000000..c1227b5c --- /dev/null +++ b/lib/core/widget/animated_visibility.dart @@ -0,0 +1,38 @@ +import 'package:flutter/widgets.dart'; + +class AnimatedVisibility extends StatelessWidget { + const AnimatedVisibility({ + super.key, + required this.visible, + this.axis = Axis.horizontal, + this.padding = EdgeInsets.zero, + required this.child, + }); + + final bool visible; + final Axis axis; + final EdgeInsets padding; + final Widget child; + + @override + Widget build(BuildContext context) { + final replacement = axis == Axis.vertical + ? const SizedBox(width: double.infinity) + : const SizedBox.shrink(); + + return AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: (child, animation) => SizeTransition( + sizeFactor: animation, + child: FadeTransition(opacity: animation, child: child), + ), + child: visible + ? AnimatedPadding( + padding: padding, + duration: const Duration(milliseconds: 200), + child: child, + ) + : replacement, + ); + } +} diff --git a/lib/core/widget/skeleton_widget.dart b/lib/core/widget/skeleton_widget.dart new file mode 100644 index 00000000..5efd8b07 --- /dev/null +++ b/lib/core/widget/skeleton_widget.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +class Skeleton extends StatelessWidget { + const Skeleton({ + this.width, + this.height, + this.widthFactor, + this.heightFactor, + this.shape = BoxShape.rectangle, + this.alignment = AlignmentDirectional.center, + }); + + final double? width; + final double? height; + final double? widthFactor; + final double? heightFactor; + final BoxShape shape; + final AlignmentGeometry alignment; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return FractionallySizedBox( + widthFactor: widthFactor, + heightFactor: heightFactor, + alignment: alignment, + child: Container( + width: width, + height: height, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + shape: shape, + color: theme.hintColor.withOpacity(.16), + ), + ), + ); + } +} diff --git a/lib/features/home/widget/home_page.dart b/lib/features/home/widget/home_page.dart index 785b0e2b..38c07345 100644 --- a/lib/features/home/widget/home_page.dart +++ b/lib/features/home/widget/home_page.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/app_info/app_info_provider.dart'; @@ -9,6 +11,7 @@ import 'package:hiddify/features/home/widget/connection_button.dart'; import 'package:hiddify/features/home/widget/empty_profiles_home_body.dart'; import 'package:hiddify/features/profile/notifier/active_profile_notifier.dart'; import 'package:hiddify/features/profile/widget/profile_tile.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_footer.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:sliver_tools/sliver_tools.dart'; @@ -53,16 +56,14 @@ class HomePage extends HookConsumerWidget { AsyncData(value: final profile?) => MultiSliver( children: [ ProfileTile(profile: profile, isMain: true), - const SliverFillRemaining( + SliverFillRemaining( hasScrollBody: false, - child: Padding( - padding: EdgeInsets.only( - left: 8, - right: 8, - top: 8, - bottom: 86, - ), - child: ConnectionButton(), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Expanded(child: ConnectionButton()), + if (Platform.isAndroid) const ActiveProxyFooter(), + ], ), ), ], diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart new file mode 100644 index 00000000..55102a11 --- /dev/null +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -0,0 +1,149 @@ +import 'package:circle_flags/circle_flags.dart'; +import 'package:dartx/dartx.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:gap/gap.dart'; +import 'package:hiddify/core/localization/translations.dart'; +import 'package:hiddify/core/widget/animated_visibility.dart'; +import 'package:hiddify/core/widget/skeleton_widget.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; +import 'package:hiddify/features/stats/notifier/stats_notifier.dart'; +import 'package:hiddify/utils/utils.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +class ActiveProxyFooter extends HookConsumerWidget { + const ActiveProxyFooter({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final t = ref.watch(translationsProvider); + final asyncState = ref.watch(activeProxyNotifierProvider); + final stats = ref.watch(statsNotifierProvider).value; + + return AnimatedVisibility( + axis: Axis.vertical, + visible: asyncState is AsyncData, + child: switch (asyncState) { + AsyncData(value: final info) => Padding( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _InfoProp( + icon: FluentIcons.arrow_routing_24_regular, + text: info.proxy.selectedName.isNotNullOrBlank + ? info.proxy.selectedName! + : info.proxy.name, + ), + const Gap(8), + switch (info.ipInfo) { + AsyncData(value: final ip?) => _InfoProp.flag( + countryCode: ip.countryCode, + text: ip.ip, + ), + AsyncError() => _InfoProp( + icon: FluentIcons.error_circle_20_regular, + text: t.general.unknown, + ), + _ => _InfoProp.loading( + icon: FluentIcons.question_circle_24_regular, + ), + }, + ], + ), + ), + Directionality( + textDirection: TextDirection.values[ + (Directionality.of(context).index + 1) % + TextDirection.values.length], + child: Flexible( + child: Column( + children: [ + _InfoProp( + icon: FluentIcons + .arrow_bidirectional_up_down_24_regular, + text: (stats?.downlinkTotal ?? 0).size(), + ), + const Gap(8), + _InfoProp( + icon: FluentIcons.arrow_download_24_regular, + text: (stats?.downlink ?? 0).speed(), + ), + ], + ), + ), + ), + ], + ), + ), + _ => const SizedBox(), + }, + ); + } +} + +class _InfoProp extends StatelessWidget { + _InfoProp({ + required IconData icon, + required String text, + }) : icon = Icon(icon), + child = Text( + text, + overflow: TextOverflow.ellipsis, + ), + isLoading = false; + + _InfoProp.flag({ + required String countryCode, + required String text, + }) : icon = Container( + width: 24, + height: 24, + padding: const EdgeInsets.all(2), + child: CircleFlag(countryCode), + ), + child = Text( + text, + overflow: TextOverflow.ellipsis, + ), + isLoading = false; + + _InfoProp.loading({ + required IconData icon, + }) : icon = Icon(icon), + child = const SizedBox(), + isLoading = true; + + final Widget icon; + final Widget child; + final bool isLoading; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + icon, + const Gap(8), + if (isLoading) + Flexible( + child: const Skeleton(height: 16, widthFactor: 1) + .animate( + onPlay: (controller) => controller.loop(), + ) + .shimmer( + duration: 1000.ms, + angle: 45, + color: Theme.of(context).colorScheme.secondary, + ), + ) + else + Flexible(child: child), + ], + ); + } +} diff --git a/lib/features/proxy/active/active_proxy_notifier.dart b/lib/features/proxy/active/active_proxy_notifier.dart new file mode 100644 index 00000000..9926a24a --- /dev/null +++ b/lib/features/proxy/active/active_proxy_notifier.dart @@ -0,0 +1,75 @@ +import 'package:dio/dio.dart'; +import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; +import 'package:hiddify/features/proxy/data/proxy_data_providers.dart'; +import 'package:hiddify/features/proxy/model/ip_info_entity.dart'; +import 'package:hiddify/features/proxy/model/proxy_entity.dart'; +import 'package:hiddify/features/proxy/model/proxy_failure.dart'; +import 'package:hiddify/utils/riverpod_utils.dart'; +import 'package:hiddify/utils/utils.dart'; +import 'package:loggy/loggy.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'active_proxy_notifier.g.dart'; + +typedef ActiveProxyInfo = ({ + ProxyItemEntity proxy, + AsyncValue ipInfo, +}); + +@riverpod +Stream activeProxyGroup(ActiveProxyGroupRef ref) async* { + final serviceRunning = await ref.watch(serviceRunningProvider.future); + if (!serviceRunning) { + throw const ServiceNotRunning(); + } + yield* ref + .watch(proxyRepositoryProvider) + .watchActiveProxies() + .map((event) => event.getOrElse((l) => throw l)) + .map((event) => event.firstOrNull?.items.firstOrNull); +} + +@riverpod +Future proxyIpInfo(ProxyIpInfoRef ref) async { + final serviceRunning = await ref.watch(serviceRunningProvider.future); + if (!serviceRunning) { + return null; + } + final cancelToken = CancelToken(); + ref.onDispose(() { + Loggy("ProxyIpInfo").debug("canceling"); + cancelToken.cancel(); + }); + return ref + .watch(proxyRepositoryProvider) + .getCurrentIpInfo(cancelToken) + .getOrElse( + (err) { + Loggy("ProxyIpInfo").error("error getting proxy ip info", err); + throw err; + }, + ).run(); +} + +@riverpod +class ActiveProxyNotifier extends _$ActiveProxyNotifier with AppLogger { + @override + AsyncValue build() { + ref.disposeDelay(const Duration(seconds: 20)); + final ipInfo = ref.watch(proxyIpInfoProvider); + final activeProxies = ref.watch(activeProxyGroupProvider); + return switch (activeProxies) { + AsyncData(value: final activeGroup?) => + AsyncData((proxy: activeGroup, ipInfo: ipInfo)), + AsyncError(:final error, :final stackTrace) => + AsyncError(error, stackTrace), + _ => const AsyncLoading(), + }; + } + + Future refreshIpInfo() async { + if (state case AsyncData(:final value) when !value.ipInfo.isLoading) { + ref.invalidate(proxyIpInfoProvider); + } + } +} diff --git a/lib/features/proxy/data/proxy_repository.dart b/lib/features/proxy/data/proxy_repository.dart index 9a3781b3..640558f4 100644 --- a/lib/features/proxy/data/proxy_repository.dart +++ b/lib/features/proxy/data/proxy_repository.dart @@ -1,3 +1,4 @@ +import 'package:dio/dio.dart'; import 'package:fpdart/fpdart.dart'; import 'package:hiddify/core/http_client/dio_http_client.dart'; import 'package:hiddify/core/utils/exception_handler.dart'; @@ -9,7 +10,8 @@ import 'package:hiddify/utils/custom_loggers.dart'; abstract interface class ProxyRepository { Stream>> watchProxies(); - TaskEither getCurrentIpInfo(); + Stream>> watchActiveProxies(); + TaskEither getCurrentIpInfo(CancelToken cancelToken); TaskEither selectProxy( String groupTag, String outboundTag, @@ -31,7 +33,6 @@ class ProxyRepositoryImpl @override Stream>> watchProxies() { return singbox.watchOutbounds().map((event) { - print("outbounds: $event"); final groupWithSelected = { for (final group in event) group.tag: group.selected, }; @@ -63,6 +64,39 @@ class ProxyRepositoryImpl ); } + @override + Stream>> watchActiveProxies() { + return singbox.watchActiveOutbounds().map((event) { + final groupWithSelected = { + for (final group in event) group.tag: group.selected, + }; + return event + .map( + (e) => ProxyGroupEntity( + tag: e.tag, + type: e.type, + selected: e.selected, + items: e.items + .map( + (e) => ProxyItemEntity( + tag: e.tag, + type: e.type, + urlTestDelay: e.urlTestDelay, + selectedTag: groupWithSelected[e.tag], + ), + ) + .toList(), + ), + ) + .toList(); + }).handleExceptions( + (error, stackTrace) { + loggy.error("error watching active proxies", error, stackTrace); + return ProxyUnexpectedFailure(error, stackTrace); + }, + ); + } + @override TaskEither selectProxy( String groupTag, @@ -92,13 +126,16 @@ class ProxyRepositoryImpl }; @override - TaskEither getCurrentIpInfo() { + TaskEither getCurrentIpInfo(CancelToken cancelToken) { return TaskEither.tryCatch( () async { for (final source in _ipInfoSources.entries) { try { loggy.debug("getting current ip info using [${source.key}]"); - final response = await client.get>(source.key); + final response = await client.get>( + source.key, + cancelToken: cancelToken, + ); if (response.statusCode == 200 && response.data != null) { return source.value(response.data!); } diff --git a/lib/features/stats/notifier/stats_notifier.dart b/lib/features/stats/notifier/stats_notifier.dart index d04adbf8..fcce03d3 100644 --- a/lib/features/stats/notifier/stats_notifier.dart +++ b/lib/features/stats/notifier/stats_notifier.dart @@ -2,6 +2,7 @@ import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; import 'package:hiddify/features/stats/data/stats_data_providers.dart'; import 'package:hiddify/features/stats/model/stats_entity.dart'; import 'package:hiddify/utils/custom_loggers.dart'; +import 'package:hiddify/utils/riverpod_utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'stats_notifier.g.dart'; @@ -10,6 +11,7 @@ part 'stats_notifier.g.dart'; class StatsNotifier extends _$StatsNotifier with AppLogger { @override Stream build() async* { + ref.disposeDelay(const Duration(seconds: 10)); final serviceRunning = await ref.watch(serviceRunningProvider.future); if (serviceRunning) { yield* ref diff --git a/lib/singbox/service/ffi_singbox_service.dart b/lib/singbox/service/ffi_singbox_service.dart index a026f2d4..c065fd62 100644 --- a/lib/singbox/service/ffi_singbox_service.dart +++ b/lib/singbox/service/ffi_singbox_service.dart @@ -318,6 +318,12 @@ class FFISingboxService with InfraLogger implements SingboxService { return _outboundsStream = outboundsStream; } + @override + Stream> watchActiveOutbounds() { + // TODO: implement watchActiveOutbounds + throw UnimplementedError(); + } + @override TaskEither selectOutbound(String groupTag, String outboundTag) { return TaskEither( diff --git a/lib/singbox/service/platform_singbox_service.dart b/lib/singbox/service/platform_singbox_service.dart index 12cc5f70..d0a3ad94 100644 --- a/lib/singbox/service/platform_singbox_service.dart +++ b/lib/singbox/service/platform_singbox_service.dart @@ -182,6 +182,23 @@ class PlatformSingboxService with InfraLogger implements SingboxService { ); } + @override + Stream> watchActiveOutbounds() { + const channel = EventChannel("com.hiddify.app/active-groups"); + loggy.debug("watching active outbounds"); + return channel.receiveBroadcastStream().map( + (event) { + if (event case String _) { + return (jsonDecode(event) as List).map((e) { + return SingboxOutboundGroup.fromJson(e as Map); + }).toList(); + } + loggy.error("[active group client] unexpected type, msg: $event"); + throw "invalid type"; + }, + ); + } + @override Stream watchStatus() => _status; diff --git a/lib/singbox/service/singbox_service.dart b/lib/singbox/service/singbox_service.dart index 7535a50e..bf3f7f6c 100644 --- a/lib/singbox/service/singbox_service.dart +++ b/lib/singbox/service/singbox_service.dart @@ -56,6 +56,8 @@ abstract interface class SingboxService { Stream> watchOutbounds(); + Stream> watchActiveOutbounds(); + TaskEither selectOutbound(String groupTag, String outboundTag); TaskEither urlTest(String groupTag); diff --git a/pubspec.lock b/pubspec.lock index c44e14a1..0b5b4908 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -169,6 +169,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.0" + circle_flags: + dependency: "direct main" + description: + name: circle_flags + sha256: "028d5ca1bb12b9a4b29dc1a25f32a428ffd69e91343274375d9e574855af2daa" + url: "https://pub.dev" + source: hosted + version: "4.0.2" cli_util: dependency: transitive description: @@ -449,6 +457,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + fluentui_system_icons: + dependency: "direct main" + description: + name: fluentui_system_icons + sha256: "1c02e6a4898dfc45e470ddcd62fb9c8fe59a7f8bb380e7f3edcb0d127c23bfd3" + url: "https://pub.dev" + source: hosted + version: "1.1.225" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index fcaea7ba..60fc0534 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,6 +72,8 @@ dependencies: cupertino_http: ^1.3.0 wolt_modal_sheet: ^0.4.0 dart_mappable: ^4.2.0 + fluentui_system_icons: ^1.1.225 + circle_flags: ^4.0.2 dev_dependencies: flutter_test: From 8a7a907fd3a5b873fb79faafec4c2307e8e735a6 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Fri, 9 Feb 2024 14:12:41 +0330 Subject: [PATCH 09/83] Fix android bugs --- .../com/hiddify/hiddify/bg/BoxService.kt | 8 +++++- .../hiddify/hiddify/bg/ServiceNotification.kt | 27 ++++++++++--------- .../com/hiddify/hiddify/bg/VPNService.kt | 15 ++++------- android/app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt index 115280d4..3b370159 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt @@ -14,6 +14,7 @@ import androidx.annotation.RequiresApi import androidx.core.content.ContextCompat import androidx.lifecycle.MutableLiveData import com.hiddify.hiddify.Application +import com.hiddify.hiddify.R import com.hiddify.hiddify.Settings import com.hiddify.hiddify.constant.Action import com.hiddify.hiddify.constant.Alert @@ -140,6 +141,9 @@ class BoxService( private suspend fun startService(delayStart: Boolean = false) { try { Log.d(TAG, "starting service") + withContext(Dispatchers.Main) { + notification.show(activeProfileName, R.string.status_starting) + } val selectedConfigPath = Settings.activeConfigPath if (selectedConfigPath.isBlank()) { @@ -168,6 +172,7 @@ class BoxService( } withContext(Dispatchers.Main) { + notification.show(activeProfileName, R.string.status_starting) binder.broadcast { it.onServiceResetLogs(listOf()) } @@ -194,8 +199,9 @@ class BoxService( status.postValue(Status.Started) withContext(Dispatchers.Main) { - notification.show(activeProfileName) + notification.show(activeProfileName, R.string.status_started) } + notification.start() } catch (e: Exception) { stopAndAlert(Alert.StartService, e.message) return diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt index 4dcdd67e..5eb08620 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt @@ -9,6 +9,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Build +import androidx.annotation.StringRes import androidx.core.app.NotificationCompat import androidx.core.app.ServiceCompat import androidx.lifecycle.MutableLiveData @@ -79,25 +80,27 @@ class ServiceNotification(private val status: MutableLiveData, private v } } - suspend fun show(profileName: String) { + fun show(profileName: String, @StringRes contentTextId: Int) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Application.notification.createNotificationChannel( - NotificationChannel( - notificationChannel, "hiddify service", NotificationManager.IMPORTANCE_LOW - ) + NotificationChannel( + notificationChannel, "hiddify service", NotificationManager.IMPORTANCE_LOW + ) ) } service.startForeground( - notificationId, notificationBuilder + notificationId, notificationBuilder .setContentTitle(profileName.takeIf { it.isNotBlank() } ?: "Hiddify Next") - .setContentText("service started").build() + .setContentText(service.getString(contentTextId)).build() ) - withContext(Dispatchers.IO) { - if (Settings.dynamicNotification) { - commandClient.connect() - withContext(Dispatchers.Main) { - registerReceiver() - } + } + + + suspend fun start() { + if (Settings.dynamicNotification) { + commandClient.connect() + withContext(Dispatchers.Main) { + registerReceiver() } } } diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/VPNService.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/VPNService.kt index da38b11a..7830c1e2 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/VPNService.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/VPNService.kt @@ -165,19 +165,14 @@ class VPNService : VpnService(), PlatformInterfaceWrapper { } } - if (options.isHTTPProxyEnabled) { + if (options.isHTTPProxyEnabled && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { systemProxyAvailable = true systemProxyEnabled = Settings.systemProxyEnabled - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - if (systemProxyEnabled) builder.setHttpProxy( - ProxyInfo.buildDirectProxy( - options.httpProxyServer, - options.httpProxyServerPort - ) + if (systemProxyEnabled) builder.setHttpProxy( + ProxyInfo.buildDirectProxy( + options.httpProxyServer, options.httpProxyServerPort ) - } else { - error("android: tun.platform.http_proxy requires android 10 or higher") - } + ) } else { systemProxyAvailable = false systemProxyEnabled = false diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 31c16b69..608ae199 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -2,4 +2,6 @@ Stop Toggle + Service starting… + Service started \ No newline at end of file From ae1053498f96aae64dc563928be11a0e6029b230 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Fri, 9 Feb 2024 15:20:13 +0330 Subject: [PATCH 10/83] Fix local build commands --- Makefile | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 1cf36ddc..e0176810 100644 --- a/Makefile +++ b/Makefile @@ -19,17 +19,19 @@ GEO_ASSETS_DIR=assets$(SEP)core CORE_PRODUCT_NAME=hiddify-core CORE_NAME=$(CORE_PRODUCT_NAME) +CORE_LIB_NAME=libcore SRV_NAME=HiddifyService + ifeq ($(CHANNEL),prod) -CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) + CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) else -CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft + CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft endif ifeq ($(CHANNEL),prod) -TARGET=lib/main_prod.dart + TARGET=lib/main_prod.dart else -TARGET=lib/main.dart + TARGET=lib/main.dart endif BUILD_ARGS=--dart-define sentry_dsn=$(SENTRY_DSN) @@ -37,8 +39,6 @@ DISTRIBUTOR_ARGS=--skip-clean --build-target $(TARGET) --build-dart-define sentr - - get: flutter pub get @@ -50,7 +50,7 @@ translate: -prepare: #get-geo-assets get gen translate +prepare: @echo use the following commands to prepare the library for each platform: @echo make android-prepare @echo make windows-prepare @@ -62,7 +62,7 @@ windows-prepare: get-geo-assets get gen translate windows-libs ios-prepare: get-geo-assets get gen translate ios-libs macos-prepare: get-geo-assets get gen translate macos-libs linux-prepare: get-geo-assets get gen translate linux-libs -android-prepare: get-geo-assets get gen translate android-libs +android-prepare: get-geo-assets get gen translate android-libs @@ -92,7 +92,6 @@ linux-deb-release: linux-rpm-release: flutter_distributor package --platform linux --targets rpm $(DISTRIBUTOR_ARGS) - macos-release: flutter_distributor package --platform macos --targets dmg $(DISTRIBUTOR_ARGS) @@ -114,7 +113,6 @@ linux-libs: @$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... curl -L $(CORE_URL)/$(CORE_NAME)-linux-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ - linux-deb-libs:linux-libs linux-rpm-libs:linux-libs linux-appimage-libs:linux-libs @@ -137,27 +135,22 @@ build-headers: build-android-libs: make -C libcore -f Makefile android - mv $(BINDIR)/$(CORE_NAME).aar $(ANDROID_OUT)/ + mv $(BINDIR)/$(CORE_LIB_NAME).aar $(ANDROID_OUT)/ build-windows-libs: make -C libcore -f Makefile windows-amd64 - mv $(BINDIR)/$(CORE_NAME).dll $(DESKTOP_OUT)/ - mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/ build-linux-libs: - make -C libcore -f Makefile linux-amd64 - mv $(BINDIR)/$(CORE_NAME).so $(DESKTOP_OUT)/ - mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/ + make -C libcore -f Makefile linux-amd64 build-macos-libs: make -C libcore -f Makefile macos-universal - mv $(BINDIR)/$(CORE_NAME).dylib $(DESKTOP_OUT)/ mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/ build-ios-libs: @$(RM) $(IOS_OUT)/Libcore.xcframework && \ make -C libcore -f Makefile ios && \ - mv $(BINDIR)/$(CORE_NAME)-ios.xcframework $(IOS_OUT)/Libcore.xcframework + mv $(BINDIR)/Libcore.xcframework $(IOS_OUT)/Libcore.xcframework release: # Create a new tag for release. From 775cbec6eecb3adc0d0aee94c052c7db816bf611 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Fri, 9 Feb 2024 15:30:07 +0330 Subject: [PATCH 11/83] Fix ui inconsistency --- .../config_option/overview/warp_options_widgets.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/features/config_option/overview/warp_options_widgets.dart b/lib/features/config_option/overview/warp_options_widgets.dart index a5b798a4..951bae41 100644 --- a/lib/features/config_option/overview/warp_options_widgets.dart +++ b/lib/features/config_option/overview/warp_options_widgets.dart @@ -34,12 +34,12 @@ class WarpOptionsTiles extends HookConsumerWidget { return Column( children: [ - SwitchListTile.adaptive( + SwitchListTile( title: Text(t.settings.config.enableWarp), value: options.enableWarp, onChanged: (value) async { if (!warpPrefaceCompleted) { - final agreed = await showAdaptiveDialog( + final agreed = await showDialog( context: context, builder: (context) => const WarpLicenseAgreementModal(), ); @@ -154,7 +154,7 @@ class WarpLicenseAgreementModal extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final t = ref.watch(translationsProvider); - return AlertDialog.adaptive( + return AlertDialog( title: Text(t.settings.config.warpConsent.title), content: Text.rich( t.settings.config.warpConsent.description( From 146d95205d3cdb77fa3a0482a3fde997835cbe2c Mon Sep 17 00:00:00 2001 From: Hiddify-com Date: Fri, 9 Feb 2024 16:04:48 +0100 Subject: [PATCH 12/83] new: add custom AppRun: need forked distributor --- linux/packaging/appimage/AppRun | 9 +++++++++ linux/packaging/appimage/make_config.yaml | 3 +++ 2 files changed, 12 insertions(+) create mode 100644 linux/packaging/appimage/AppRun diff --git a/linux/packaging/appimage/AppRun b/linux/packaging/appimage/AppRun new file mode 100644 index 00000000..0133767f --- /dev/null +++ b/linux/packaging/appimage/AppRun @@ -0,0 +1,9 @@ +#!/bin/bash + +cd "\$(dirname "\$0")" +export LD_LIBRARY_PATH=usr/lib +if [ $1 == "HiddifyService" ];then + exec ./$@ +else + exec ./$appName $@ +fi diff --git a/linux/packaging/appimage/make_config.yaml b/linux/packaging/appimage/make_config.yaml index 73a36cac..684704e8 100644 --- a/linux/packaging/appimage/make_config.yaml +++ b/linux/packaging/appimage/make_config.yaml @@ -29,6 +29,9 @@ categories: startup_notify: true +app_run_content: " +Hi +" # You can specify the shared libraries that you want to bundle with your app # # flutter_distributor automatically detects the shared libraries that your app From f70f2665d8e4f3b92ab79d040ce716a0735e9dd4 Mon Sep 17 00:00:00 2001 From: Hiddify-com Date: Fri, 9 Feb 2024 16:05:22 +0100 Subject: [PATCH 13/83] fix: service location bug in linux --- linux/CMakeLists.txt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index ba38a4ab..8abb9b5b 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -108,6 +108,16 @@ install(CODE " set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") +install(FILES "../libcore/bin/libcore.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +install( + FILES "../libcore/bin/HiddifyService" + DESTINATION "${CMAKE_INSTALL_PREFIX}" + PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ + COMPONENT Runtime +) + install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime) @@ -117,14 +127,7 @@ install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR} install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -install(FILES "../libcore/bin/libcore.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -install( - FILES "../libcore/bin/HiddifyService" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime -) foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) install(FILES "${bundled_library}" From 22cf3b5f7f32022cf75948466ff97117cb4a0bf4 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 17:18:58 +0100 Subject: [PATCH 14/83] fix: appimage build and add make req for linux --- .github/workflows/build.yml | 35 +++++++++-------------------- Makefile | 44 +++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 944bc00b..2ed962b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,11 +39,11 @@ jobs: targets: exe filename: hiddify-windows-x64 - # - platform: linux-appimage - # os: ubuntu-20.04 - # aarch: amd64 - # targets: AppImage - # filename: hiddify-linux-x64 + - platform: linux-appimage + os: ubuntu-20.04 + aarch: amd64 + targets: AppImage + filename: hiddify-linux-x64 - platform: linux-deb os: ubuntu-20.04 @@ -105,28 +105,11 @@ jobs: - name: Setup Linux dependencies if: ${{ startsWith(matrix.platform,'linux') }} run: | - sudo apt install -y locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf - sudo modprobe fuse - wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" - chmod +x appimagetool - mv appimagetool /usr/local/bin/ + make linux-install-dependencies - - name: Get Geo Assets + - name: Prepare for ${{ matrix.platform }} run: | - make get-geo-assets - - - name: Get Dependencies - run: | - make get - - - name: Generate - run: | - make translate - make gen - - - name: Get Libs & Bindings ${{ matrix.platform }} - run: | - make ${{ matrix.platform }}-libs + make ${{ matrix.platform }}-prepare - name: Setup Android Signing Properties if: startsWith(matrix.platform,'android') @@ -230,7 +213,9 @@ jobs: cd tmp_out 7z a ${{matrix.filename}}.zip ./ mv *.zip ../out/ + mv ${{matrix.filename}}.AppImage HiddifyNext.AppImage || echo "no appimage" # added for appimage link fi + - name: Clean up keychain and provisioning profile if: ${{ always() && startsWith(matrix.os,'macos')}} diff --git a/Makefile b/Makefile index e0176810..400eaae0 100644 --- a/Makefile +++ b/Makefile @@ -19,19 +19,17 @@ GEO_ASSETS_DIR=assets$(SEP)core CORE_PRODUCT_NAME=hiddify-core CORE_NAME=$(CORE_PRODUCT_NAME) -CORE_LIB_NAME=libcore SRV_NAME=HiddifyService - ifeq ($(CHANNEL),prod) - CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) +CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) else - CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft +CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft endif ifeq ($(CHANNEL),prod) - TARGET=lib/main_prod.dart +TARGET=lib/main_prod.dart else - TARGET=lib/main.dart +TARGET=lib/main.dart endif BUILD_ARGS=--dart-define sentry_dsn=$(SENTRY_DSN) @@ -62,9 +60,27 @@ windows-prepare: get-geo-assets get gen translate windows-libs ios-prepare: get-geo-assets get gen translate ios-libs macos-prepare: get-geo-assets get gen translate macos-libs linux-prepare: get-geo-assets get gen translate linux-libs -android-prepare: get-geo-assets get gen translate android-libs +android-prepare: get-geo-assets get gen translate android-libs +linux-install-dependencies: + if [ "$(flutter)" = "true" ]; then \ + wget -O ~/Downloads/flutter_linux_3.16.9-stable.tar.xz https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.16.9-stable.tar.xz; \ + mkdir -p ~/develop; \ + cd ~/develop; \ + tar xf ~/Downloads/flutter_linux_3.16.9-stable.tar.xz; \ + export PATH="$$PATH:$$HOME/develop/flutter/bin"; \ + echo 'export PATH="$$PATH:$$HOME/develop/flutter/bin"' >> ~/.bashrc; \ + fi + PATH="$$PATH":"$$HOME/.pub-cache/bin" + echo 'export PATH="$$PATH:$$HOME/.pub-cache/bin"' >>~/.bashrc + sudo apt install -y clang ninja-build pkg-config cmake libgtk-3-dev locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf file appstream + dart pub global activate flutter_distributor + sudo modprobe fuse + wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" + chmod +x appimagetool + sudo mv appimagetool /usr/local/bin/ + sync_translate: cd .github && bash sync_translate.sh @@ -110,7 +126,7 @@ windows-libs: curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ linux-libs: - @$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... + mkdir -p $(DESKTOP_OUT) curl -L $(CORE_URL)/$(CORE_NAME)-linux-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ linux-deb-libs:linux-libs @@ -118,12 +134,12 @@ linux-rpm-libs:linux-libs linux-appimage-libs:linux-libs macos-libs: - @$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... + mkdir -p $(DESKTOP_OUT) curl -L $(CORE_URL)/$(CORE_NAME)-macos-universal.tar.gz | tar xz -C $(DESKTOP_OUT) ios-libs: #not tested - @$(MKDIR) $(IOS_OUT) || echo Folder already exists. Skipping... - @$(RM) $(IOS_OUT)/Libcore.xcframework + mkdir -p $(IOS_OUT) + rm -rf $(IOS_OUT)/Libcore.xcframework curl -L $(CORE_URL)/$(CORE_NAME)-ios.tar.gz | tar xz -C "$(IOS_OUT)" get-geo-assets: @@ -141,15 +157,15 @@ build-windows-libs: make -C libcore -f Makefile windows-amd64 build-linux-libs: - make -C libcore -f Makefile linux-amd64 + make -C libcore -f Makefile linux-amd64 build-macos-libs: make -C libcore -f Makefile macos-universal mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/ build-ios-libs: - @$(RM) $(IOS_OUT)/Libcore.xcframework && \ - make -C libcore -f Makefile ios && \ + rf -rf $(IOS_OUT)/Libcore.xcframework + make -C libcore -f Makefile ios mv $(BINDIR)/Libcore.xcframework $(IOS_OUT)/Libcore.xcframework release: # Create a new tag for release. From ede904a024b7c2880053b64246acbcc0b23864d1 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Fri, 9 Feb 2024 20:20:24 +0330 Subject: [PATCH 15/83] Add ios connection info --- ios/Runner.xcodeproj/project.pbxproj | 12 ++ ios/Runner/AppDelegate.swift | 3 +- .../Handlers/ActiveGroupsEventHandler.swift | 49 ++++++ ios/Runner/Handlers/GroupsEventHandler.swift | 81 ++------- ios/Runner/Handlers/StatsEventHandler.swift | 50 ++---- ios/Shared/CommandClient.swift | 166 ++++++++++++++++++ ios/Shared/Outbound.swift | 18 ++ lib/features/home/widget/home_page.dart | 3 +- 8 files changed, 287 insertions(+), 95 deletions(-) create mode 100644 ios/Runner/Handlers/ActiveGroupsEventHandler.swift create mode 100644 ios/Shared/CommandClient.swift create mode 100644 ios/Shared/Outbound.swift diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 225a73c1..13a0e531 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -42,6 +42,9 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + D703EE932B764EA3001D88B3 /* CommandClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = D703EE922B764EA3001D88B3 /* CommandClient.swift */; }; + D703EE962B765176001D88B3 /* ActiveGroupsEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D703EE952B765176001D88B3 /* ActiveGroupsEventHandler.swift */; }; + D7CC50862B768C50006BC140 /* Outbound.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CC50852B768C50006BC140 /* Outbound.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -164,6 +167,9 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9AC67B4DCF829F5B6F63AA7D /* Pods-Runner-SingBoxPacketTunnel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner-SingBoxPacketTunnel.release.xcconfig"; path = "Target Support Files/Pods-Runner-SingBoxPacketTunnel/Pods-Runner-SingBoxPacketTunnel.release.xcconfig"; sourceTree = ""; }; C20A211B58CE31B2738D133C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + D703EE922B764EA3001D88B3 /* CommandClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandClient.swift; sourceTree = ""; }; + D703EE952B765176001D88B3 /* ActiveGroupsEventHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveGroupsEventHandler.swift; sourceTree = ""; }; + D7CC50852B768C50006BC140 /* Outbound.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Outbound.swift; sourceTree = ""; }; F3FFE1D9C2D5629FACC123EE /* Pods-Runner-SingBoxPacketTunnel.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner-SingBoxPacketTunnel.profile.xcconfig"; path = "Target Support Files/Pods-Runner-SingBoxPacketTunnel/Pods-Runner-SingBoxPacketTunnel.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -218,6 +224,7 @@ 03B5166C2AE7325500EA47E2 /* LogsEventHandler.swift */, 03B5167C2AE7AC6200EA47E2 /* GroupsEventHandler.swift */, 0736958C2B3B79E0007249BE /* StatsEventHandler.swift */, + D703EE952B765176001D88B3 /* ActiveGroupsEventHandler.swift */, ); path = Handlers; sourceTree = ""; @@ -258,6 +265,8 @@ isa = PBXGroup; children = ( 03E392CE2ADDEFC8000ADF15 /* FilePath.swift */, + D703EE922B764EA3001D88B3 /* CommandClient.swift */, + D7CC50852B768C50006BC140 /* Outbound.swift */, ); path = Shared; sourceTree = ""; @@ -672,13 +681,16 @@ 03B5167B2AE79DB400EA47E2 /* FileMethodHandler.swift in Sources */, 03B516772AE7634400EA47E2 /* Logger.swift in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + D703EE962B765176001D88B3 /* ActiveGroupsEventHandler.swift in Sources */, 03B516712AE74CCD00EA47E2 /* VPNConfig.swift in Sources */, 03B5166B2AE7315E00EA47E2 /* AlertsEventHandler.swift in Sources */, 0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */, 0736958D2B3B79E0007249BE /* StatsEventHandler.swift in Sources */, 03B516692AE7306B00EA47E2 /* StatusEventHandler.swift in Sources */, + D7CC50862B768C50006BC140 /* Outbound.swift in Sources */, 032158B82ADDF8BF008D943B /* VPNManager.swift in Sources */, 0736958F2B3B8048007249BE /* PlatformMethodHandler.swift in Sources */, + D703EE932B764EA3001D88B3 /* CommandClient.swift in Sources */, 03B516672AE6B93A00EA47E2 /* MethodHandler.swift in Sources */, 03B5166D2AE7325500EA47E2 /* LogsEventHandler.swift in Sources */, 03E392D02ADDF1BD000ADF15 /* FilePath.swift in Sources */, diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 95848ad7..ed2afd47 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -4,7 +4,7 @@ import Libcore @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { - + override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? @@ -28,6 +28,7 @@ import Libcore AlertsEventHandler.register(with: self.registrar(forPlugin: AlertsEventHandler.name)!) LogsEventHandler.register(with: self.registrar(forPlugin: LogsEventHandler.name)!) GroupsEventHandler.register(with: self.registrar(forPlugin: GroupsEventHandler.name)!) + ActiveGroupsEventHandler.register(with: self.registrar(forPlugin: ActiveGroupsEventHandler.name)!) StatsEventHandler.register(with: self.registrar(forPlugin: StatsEventHandler.name)!) } } diff --git a/ios/Runner/Handlers/ActiveGroupsEventHandler.swift b/ios/Runner/Handlers/ActiveGroupsEventHandler.swift new file mode 100644 index 00000000..431e1ebc --- /dev/null +++ b/ios/Runner/Handlers/ActiveGroupsEventHandler.swift @@ -0,0 +1,49 @@ +import Foundation +import Combine +import Libcore + +public class ActiveGroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { + + static let name = "\(Bundle.main.serviceIdentifier)/active-groups" + private var commandClient: CommandClient? + private var channel: FlutterEventChannel? + private var events: FlutterEventSink? + private var cancellable: AnyCancellable? + + public static func register(with registrar: FlutterPluginRegistrar) { + let instance = ActiveGroupsEventHandler() + instance.channel = FlutterEventChannel(name: Self.name, + binaryMessenger: registrar.messenger()) + instance.channel?.setStreamHandler(instance) + } + + public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { + FileManager.default.changeCurrentDirectoryPath(FilePath.sharedDirectory.path) + self.events = events + commandClient = CommandClient(.groupsInfoOnly) + commandClient?.connect() + cancellable = commandClient?.$groups.sink{ [self] sbGroups in + self.writeGroups(sbGroups) + } + return nil + } + + public func onCancel(withArguments arguments: Any?) -> FlutterError? { + commandClient?.disconnect() + cancellable?.cancel() + events = nil + return nil + } + + func writeGroups(_ sbGroups: [SBGroup]?) { + guard let sbGroups else {return} + if + let groups = try? JSONEncoder().encode(sbGroups), + let groups = String(data: groups, encoding: .utf8) + { + DispatchQueue.main.async { [events = self.events, groups] () in + events?(groups) + } + } + } +} diff --git a/ios/Runner/Handlers/GroupsEventHandler.swift b/ios/Runner/Handlers/GroupsEventHandler.swift index c6179807..e0dcce2b 100644 --- a/ios/Runner/Handlers/GroupsEventHandler.swift +++ b/ios/Runner/Handlers/GroupsEventHandler.swift @@ -1,93 +1,50 @@ -// -// GroupsEventHandler.swift -// Runner -// -// Created by GFWFighter on 10/24/23. -// - import Foundation +import Combine import Libcore -struct SBItem: Codable { - let tag: String - let type: String - let urlTestDelay: Int - - enum CodingKeys: String, CodingKey { - case tag - case type - case urlTestDelay = "url-test-delay" - } -} - -struct SBGroup: Codable { - let tag: String - let type: String - let selected: String - let items: [SBItem] -} - -public class GroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol { +public class GroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler{ static let name = "\(Bundle.main.serviceIdentifier)/groups" + private var commandClient: CommandClient? private var channel: FlutterEventChannel? - - private var commandClient: LibboxCommandClient? private var events: FlutterEventSink? + private var cancellable: AnyCancellable? public static func register(with registrar: FlutterPluginRegistrar) { let instance = GroupsEventHandler() - instance.channel = FlutterEventChannel(name: Self.name, binaryMessenger: registrar.messenger()) + instance.channel = FlutterEventChannel(name: Self.name, + binaryMessenger: registrar.messenger()) instance.channel?.setStreamHandler(instance) } public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { FileManager.default.changeCurrentDirectoryPath(FilePath.sharedDirectory.path) self.events = events - let opts = LibboxCommandClientOptions() - opts.command = LibboxCommandGroup - opts.statusInterval = 3000 - commandClient = LibboxCommandClient(self, options: opts) - try? commandClient?.connect() + commandClient = CommandClient(.groups) + commandClient?.connect() + cancellable = commandClient?.$groups.sink{ [self] groups in + self.writeGroups(groups) + } return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { - try? commandClient?.disconnect() + commandClient?.disconnect() + cancellable?.cancel() + events = nil return nil } - public func writeGroups(_ message: LibboxOutboundGroupIteratorProtocol?) { - guard let message else { return } - var groups = [SBGroup]() - while message.hasNext() { - let group = message.next()! - var items = [SBItem]() - var groupItems = group.getItems() - while groupItems?.hasNext() ?? false { - let item = groupItems?.next()! - items.append(SBItem(tag: item!.tag, type: item!.type, urlTestDelay: Int(item!.urlTestDelay))) - } - groups.append(.init(tag: group.tag, type: group.type, selected: group.selected, items: items)) - } - if - let groups = try? JSONEncoder().encode(groups), + func writeGroups(_ sbGroups: [SBGroup]?) { + guard let sbGroups else {return} + if + let groups = try? JSONEncoder().encode(sbGroups), let groups = String(data: groups, encoding: .utf8) { - DispatchQueue.main.async { [events = self.events, groups] () in + DispatchQueue.main.async { [events = self.events, groups] in events?(groups) } } } } - -extension GroupsEventHandler { - public func clearLog() {} - public func connected() {} - public func disconnected(_ message: String?) {} - public func initializeClashMode(_ modeList: LibboxStringIteratorProtocol?, currentMode: String?) {} - public func updateClashMode(_ newMode: String?) {} - public func writeLog(_ message: String?) {} - public func writeStatus(_ message: LibboxStatusMessage?) {} -} diff --git a/ios/Runner/Handlers/StatsEventHandler.swift b/ios/Runner/Handlers/StatsEventHandler.swift index 6b91ec44..8884cdea 100644 --- a/ios/Runner/Handlers/StatsEventHandler.swift +++ b/ios/Runner/Handlers/StatsEventHandler.swift @@ -1,48 +1,46 @@ -// -// StatsEventHandler.swift -// Runner -// -// Created by Hiddify on 12/27/23. -// - import Foundation import Flutter +import Combine import Libcore -public class StatsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol { +public class StatsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { + static let name = "\(Bundle.main.serviceIdentifier)/stats" + private var commandClient: CommandClient? private var channel: FlutterEventChannel? - - private var commandClient: LibboxCommandClient? private var events: FlutterEventSink? + private var cancellable: AnyCancellable? public static func register(with registrar: FlutterPluginRegistrar) { let instance = StatsEventHandler() - instance.channel = FlutterEventChannel(name: Self.name, binaryMessenger: registrar.messenger(), codec: FlutterJSONMethodCodec()) + instance.channel = FlutterEventChannel(name: Self.name, + binaryMessenger: registrar.messenger(), + codec: FlutterJSONMethodCodec()) instance.channel?.setStreamHandler(instance) } public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { FileManager.default.changeCurrentDirectoryPath(FilePath.sharedDirectory.path) self.events = events - let opts = LibboxCommandClientOptions() - opts.command = LibboxCommandStatus - opts.statusInterval = Int64(NSEC_PER_SEC) - commandClient = LibboxCommandClient(self, options: opts) - try? commandClient?.connect() + commandClient = CommandClient(.status) + commandClient?.connect() + cancellable = commandClient?.$status.sink{ [self] status in + self.writeStatus(status) + } return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { - try? commandClient?.disconnect() + commandClient?.disconnect() + cancellable?.cancel() + events = nil return nil } - public func writeStatus(_ message: LibboxStatusMessage?) { - guard - let message - else { return } + func writeStatus(_ message: LibboxStatusMessage?) { + guard let message else { return } + let data = [ "connections-in": message.connectionsIn, "connections-out": message.connectionsOut, @@ -54,13 +52,3 @@ public class StatsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, L events?(data) } } - -extension StatsEventHandler { - public func clearLog() {} - public func connected() {} - public func disconnected(_ message: String?) {} - public func initializeClashMode(_ modeList: LibboxStringIteratorProtocol?, currentMode: String?) {} - public func updateClashMode(_ newMode: String?) {} - public func writeGroups(_ message: LibboxOutboundGroupIteratorProtocol?) {} - public func writeLog(_ message: String?) {} -} diff --git a/ios/Shared/CommandClient.swift b/ios/Shared/CommandClient.swift new file mode 100644 index 00000000..b98a1045 --- /dev/null +++ b/ios/Shared/CommandClient.swift @@ -0,0 +1,166 @@ +import Foundation +import Libcore + +public class CommandClient: ObservableObject { + public enum ConnectionType { + case status + case groups + case log + case groupsInfoOnly + } + + private let connectionType: ConnectionType + private let logMaxLines: Int + private var commandClient: LibboxCommandClient? + private var connectTask: Task? + + @Published private(set) var isConnected: Bool + @Published private(set) var status: LibboxStatusMessage? + @Published private(set) var groups: [SBGroup]? + @Published private(set) var logList: [String] + + public init(_ connectionType: ConnectionType, logMaxLines: Int = 300) { + self.connectionType = connectionType + self.logMaxLines = logMaxLines + logList = [] + isConnected = false + } + + public func connect() { + if isConnected { + return + } + if let connectTask { + connectTask.cancel() + } + connectTask = Task { + await connect0() + } + } + + public func disconnect() { + if let connectTask { + connectTask.cancel() + self.connectTask = nil + } + if let commandClient { + try? commandClient.disconnect() + self.commandClient = nil + } + } + + private nonisolated func connect0() async { + let clientOptions = LibboxCommandClientOptions() + switch connectionType { + case .status: + clientOptions.command = LibboxCommandStatus + case .groups: + clientOptions.command = LibboxCommandGroup + case .log: + clientOptions.command = LibboxCommandLog + case .groupsInfoOnly: + clientOptions.command = LibboxCommandGroupInfoOnly + } + clientOptions.statusInterval = Int64(2 * NSEC_PER_SEC) + let client = LibboxNewCommandClient(clientHandler(self), clientOptions)! + do { + for i in 0 ..< 10 { + try await Task.sleep(nanoseconds: UInt64(Double(100 + (i * 50)) * Double(NSEC_PER_MSEC))) + try Task.checkCancellation() + do { + try client.connect() + await MainActor.run { + commandClient = client + } + return + } catch {} + try Task.checkCancellation() + } + } catch { + try? client.disconnect() + } + } + + private class clientHandler: NSObject, LibboxCommandClientHandlerProtocol { + private let commandClient: CommandClient + + init(_ commandClient: CommandClient) { + self.commandClient = commandClient + } + + func connected() { + DispatchQueue.main.async { [self] in + if commandClient.connectionType == .log { + commandClient.logList = [] + } + commandClient.isConnected = true + } + } + + func disconnected(_: String?) { + DispatchQueue.main.async { [self] in + commandClient.isConnected = false + } + } + + func clearLog() { + DispatchQueue.main.async { [self] in + commandClient.logList.removeAll() + } + } + + func writeLog(_ message: String?) { + guard let message else { + return + } + DispatchQueue.main.async { [self] in + if commandClient.logList.count > commandClient.logMaxLines { + commandClient.logList.removeFirst() + } + commandClient.logList.append(message) + } + } + + func writeStatus(_ message: LibboxStatusMessage?) { + DispatchQueue.main.async { [self] in + commandClient.status = message + } + } + + func writeGroups(_ groups: LibboxOutboundGroupIteratorProtocol?) { + guard let groups else { + return + } + var sbGroups = [SBGroup]() + while groups.hasNext() { + let group = groups.next()! + var items = [SBItem]() + let groupItems = group.getItems() + while groupItems?.hasNext() ?? false { + let item = groupItems?.next()! + items.append(SBItem(tag: item!.tag, + type: item!.type, + urlTestDelay: Int(item!.urlTestDelay) + ) + ) + } + + sbGroups.append(.init(tag: group.tag, + type: group.type, + selected: group.selected, + items: items) + ) + + } + DispatchQueue.main.async { [self] in + commandClient.groups = sbGroups + } + } + + func initializeClashMode(_ modeList: LibboxStringIteratorProtocol?, currentMode: String?) { + } + + func updateClashMode(_ newMode: String?) { + } + } +} diff --git a/ios/Shared/Outbound.swift b/ios/Shared/Outbound.swift new file mode 100644 index 00000000..e3abbcf2 --- /dev/null +++ b/ios/Shared/Outbound.swift @@ -0,0 +1,18 @@ +public struct SBItem: Codable { + let tag: String + let type: String + let urlTestDelay: Int + + enum CodingKeys: String, CodingKey { + case tag + case type + case urlTestDelay = "url-test-delay" + } +} + +public struct SBGroup: Codable { + let tag: String + let type: String + let selected: String + let items: [SBItem] +} diff --git a/lib/features/home/widget/home_page.dart b/lib/features/home/widget/home_page.dart index 38c07345..8118b70a 100644 --- a/lib/features/home/widget/home_page.dart +++ b/lib/features/home/widget/home_page.dart @@ -62,7 +62,8 @@ class HomePage extends HookConsumerWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Expanded(child: ConnectionButton()), - if (Platform.isAndroid) const ActiveProxyFooter(), + if (Platform.isAndroid || Platform.isIOS) + const ActiveProxyFooter(), ], ), ), From e1486acba05e0983327198caa939416ff89a17c4 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 18:36:27 +0100 Subject: [PATCH 16/83] fix: windows build --- Makefile | 7 +++++++ dependencies.properties | 2 +- windows/CMakeLists.txt | 7 +++---- windows/packaging/exe/make_config.yaml | 3 +-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 400eaae0..a865a8d2 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,14 @@ windows-prepare: get-geo-assets get gen translate windows-libs ios-prepare: get-geo-assets get gen translate ios-libs macos-prepare: get-geo-assets get gen translate macos-libs linux-prepare: get-geo-assets get gen translate linux-libs +linux-appimage-prepare:linux-prepare +linux-rpm-prepare:linux-prepare +linux-deb-prepare:linux-prepare + android-prepare: get-geo-assets get gen translate android-libs +android-apk-prepare:android-prepare +android-aab-prepare:android-prepare + linux-install-dependencies: diff --git a/dependencies.properties b/dependencies.properties index ed250c79..7258ef63 100644 --- a/dependencies.properties +++ b/dependencies.properties @@ -1 +1 @@ -core.version=0.13.1 \ No newline at end of file +core.version=0.14.0 \ No newline at end of file diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 7bca9452..01966e1b 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -83,12 +83,11 @@ install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" # install(FILES "../libcore/bin/libcore.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" # COMPONENT Runtime) -set(HIDDIFY_NEXT_LIB "../libcore/bin/libcore.dll") -install(FILES "${HIDDIFY_NEXT_LIB}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + +install(FILES "../libcore/bin/libcore.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime RENAME libcore.dll) -set(HIDDIFY_NEXT_LIB "../libcore/bin/HiddifyService.exe") -install(FILES "${HIDDIFY_NEXT_LIB}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" +install(FILES "../libcore/bin/HiddifyService.exe" DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime RENAME HiddifyService.exe) diff --git a/windows/packaging/exe/make_config.yaml b/windows/packaging/exe/make_config.yaml index 78f61e98..abb3c636 100644 --- a/windows/packaging/exe/make_config.yaml +++ b/windows/packaging/exe/make_config.yaml @@ -10,8 +10,7 @@ setup_icon_file: ..\..\windows\runner\resources\app_icon.ico locales: - en - fa - - zh - ru - pt - tr -#script_template: inno_setup.sas \ No newline at end of file +#script_template: inno_setup.sas From d50dfc20dc5a3f09cb45ab37d0ed07ef3fa32b74 Mon Sep 17 00:00:00 2001 From: Hiddify <114227601+hiddify-com@users.noreply.github.com> Date: Fri, 9 Feb 2024 19:25:35 +0100 Subject: [PATCH 17/83] rerun windows without cache --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ed962b4..fc421f17 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -327,4 +327,3 @@ jobs: releaseName: ${{ env.TAG_NAME }} releaseFiles: ./hiddify-android-market.aab track: 'beta' - From 23dc53a65aa0b08205420c33b611875fe94e6760 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 19:50:46 +0100 Subject: [PATCH 18/83] chg: use our flutter distrobutor version and downgrade windows version (possible fix of build error) --- .github/workflows/build.yml | 6 +++--- libcore | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fc421f17..39a46d39 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: targets: aab - platform: windows - os: windows-latest + os: windows-2019 aarch: amd64 targets: exe filename: hiddify-windows-x64 @@ -100,7 +100,7 @@ jobs: - name: Setup Flutter Distributor if: ${{ !startsWith(matrix.platform,'android') }} run: | - dart pub global activate flutter_distributor + dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor - name: Setup Linux dependencies if: ${{ startsWith(matrix.platform,'linux') }} @@ -326,4 +326,4 @@ jobs: packageName: app.hiddify.com releaseName: ${{ env.TAG_NAME }} releaseFiles: ./hiddify-android-market.aab - track: 'beta' + track: 'beta' \ No newline at end of file diff --git a/libcore b/libcore index ad764a86..66e8beac 160000 --- a/libcore +++ b/libcore @@ -1 +1 @@ -Subproject commit ad764a86b11bd3aca37e0de2d22e21659f6d61f0 +Subproject commit 66e8beac53efce8ca73180bc0e23e0a81bd5045c From ae878e7b1211588fb15463710b8ab3574d829615 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 19:51:40 +0100 Subject: [PATCH 19/83] fix: typo --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39a46d39..df8760a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -100,7 +100,7 @@ jobs: - name: Setup Flutter Distributor if: ${{ !startsWith(matrix.platform,'android') }} run: | - dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor + dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor - name: Setup Linux dependencies if: ${{ startsWith(matrix.platform,'linux') }} From 546987c28d41b4b9190155923d6924168ad10ab9 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 20:03:19 +0100 Subject: [PATCH 20/83] add debug build for windows --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index a865a8d2..24537d21 100644 --- a/Makefile +++ b/Makefile @@ -104,6 +104,7 @@ android-aab-release: ls -R build/app/outputs windows-release: + flutter build -v windows --target lib/main.dart --dart-define sentry_dsn=*** --dart-define FLUTTER_BUILD_NAME=0.15.4 --dart-define FLUTTER_BUILD_NUMBER=1504 flutter_distributor package --platform windows --targets exe $(DISTRIBUTOR_ARGS) linux-release: linux-appimage-release linux-deb-release linux-rpm-release From edb758eede39a89008be695eabec2aef0a1da87e Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 20:51:26 +0100 Subject: [PATCH 21/83] refactor build --- .github/workflows/build.yml | 75 ++++++++++++++++++------------------- Makefile | 19 +++------- 2 files changed, 42 insertions(+), 52 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index df8760a2..ed4ece5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,17 @@ env: NDK_VERSION: r26b UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" TAG_NAME: "${{ inputs.tag-name }}" - + TARGET_MAP: | + { + "AppImage": "Hiddify-Linux-x64", + "deb": "Hiddify-Debian-x64", + "rpm": "Hiddify-rpm-x64", + "apk": "Hiddify-Android", + "aab": "Hiddify-Android", + "exe": "Hiddify-Windows-x64", + "dmg": "Hiddify-MacOS", + "ipa": "Hiddify-iOS", + } jobs: build: permissions: write-all @@ -37,31 +47,16 @@ jobs: os: windows-2019 aarch: amd64 targets: exe - filename: hiddify-windows-x64 - - platform: linux-appimage + - platform: linux os: ubuntu-20.04 aarch: amd64 - targets: AppImage - filename: hiddify-linux-x64 - - - platform: linux-deb - os: ubuntu-20.04 - aarch: amd64 - targets: deb - filename: hiddify-debian-x64 - - - platform: linux-rpm - os: ubuntu-20.04 - aarch: amd64 - targets: rpm - filename: hiddify-rpm-x64 + targets: AppImage,deb,rpm - platform: macos os: macos-13 aarch: universal targets: dmg - filename: hiddify-macos-universal runs-on: ${{ matrix.os }} steps: @@ -181,10 +176,10 @@ jobs: run: | mkdir out ls -R ./build/app/outputs - cp ./build/app/outputs/flutter-apk/*arm64-v8a*.apk out/hiddify-android-arm64.apk || echo "no arm64 apk" - cp ./build/app/outputs/flutter-apk/*armeabi-v7a*.apk out/hiddify-android-arm7.apk || echo "no arm7 apk" - cp ./build/app/outputs/flutter-apk/*x86_64*.apk out/hiddify-android-x86_64.apk || echo "no x64 apk" - cp ./build/app/outputs/flutter-apk/app-release.apk out/hiddify-android-universal.apk || echo "no universal apk" + cp ./build/app/outputs/flutter-apk/*arm64-v8a*.apk out/${TARGET_MAP[apk]}-arm64.apk || echo "no arm64 apk" + cp ./build/app/outputs/flutter-apk/*armeabi-v7a*.apk out/${TARGET_MAP[apk]}-arm7.apk || echo "no arm7 apk" + cp ./build/app/outputs/flutter-apk/*x86_64*.apk out/${TARGET_MAP[apk]}-x86_64.apk || echo "no x64 apk" + cp ./build/app/outputs/flutter-apk/app-release.apk out/${TARGET_MAP[apk]}-universal.apk || echo "no universal apk" - name: Copy to out Android AAB if: matrix.platform == 'android-aab' @@ -199,22 +194,26 @@ jobs: ls -R dist/ mkdir out mkdir tmp_out - EXT="${{ matrix.targets }}" - mv dist/*/*.$EXT tmp_out/${{matrix.filename}}.$EXT - chmod +x tmp_out/${{matrix.filename}}.$EXT - if [ "${{matrix.platform}}" == "linux" ];then - cp ./.github/help/linux/* tmp_out/ - else - cp ./.github/help/mac-windows/* tmp_out/ - fi - if [[ "${{matrix.platform}}" == 'ios' ]];then - mv tmp_out/${{matrix.filename}}.ipa bin/${{matrix.filename}}.ipa - else - cd tmp_out - 7z a ${{matrix.filename}}.zip ./ - mv *.zip ../out/ - mv ${{matrix.filename}}.AppImage HiddifyNext.AppImage || echo "no appimage" # added for appimage link - fi + + for EXT in $(echo ${{ matrix.targets }} | tr ',' '\n'); do + targetFile=${TARGET_MAP[$EXT]}.$EXT + mv dist/*/*.$EXT tmp_out/${targetFile} + chmod +x tmp_out/${targetFile} + if [ "${{matrix.platform}}" == "linux" ];then + cp ./.github/help/linux/* tmp_out/ + else + cp ./.github/help/mac-windows/* tmp_out/ + fi + if [[ "${{matrix.platform}}" == 'ios' ]];then + mv tmp_out/${targetFile} bin/${targetFile} + else + cd tmp_out + 7z a ${TARGET_MAP[$EXT]}.zip ./ + mv *.zip ../out/ + if [[ $EXT == 'AppImage' ]];then + mv ${targetFile} ../out/${targetFile} # added for appimage link + fi + fi - name: Clean up keychain and provisioning profile diff --git a/Makefile b/Makefile index 24537d21..2d7aa2d5 100644 --- a/Makefile +++ b/Makefile @@ -104,17 +104,10 @@ android-aab-release: ls -R build/app/outputs windows-release: - flutter build -v windows --target lib/main.dart --dart-define sentry_dsn=*** --dart-define FLUTTER_BUILD_NAME=0.15.4 --dart-define FLUTTER_BUILD_NUMBER=1504 - flutter_distributor package --platform windows --targets exe $(DISTRIBUTOR_ARGS) + flutter_distributor package --flutter-build-args=verbose --platform windows --targets exe $(DISTRIBUTOR_ARGS) -linux-release: linux-appimage-release linux-deb-release linux-rpm-release - -linux-appimage-release: - flutter_distributor package --platform linux --targets appimage $(DISTRIBUTOR_ARGS) -linux-deb-release: - flutter_distributor package --platform linux --targets deb $(DISTRIBUTOR_ARGS) -linux-rpm-release: - flutter_distributor package --platform linux --targets rpm $(DISTRIBUTOR_ARGS) +linux-release: + flutter_distributor package --platform linux --targets deb,rpm,appimage $(DISTRIBUTOR_ARGS) macos-release: flutter_distributor package --platform macos --targets dmg $(DISTRIBUTOR_ARGS) @@ -131,15 +124,13 @@ android-aab-libs: android-libs windows-libs: @$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... - curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ + curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)$(SEP) + ls $(DESKTOP_OUT)$(SEP) linux-libs: mkdir -p $(DESKTOP_OUT) curl -L $(CORE_URL)/$(CORE_NAME)-linux-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ -linux-deb-libs:linux-libs -linux-rpm-libs:linux-libs -linux-appimage-libs:linux-libs macos-libs: mkdir -p $(DESKTOP_OUT) From dab173f3219afc8b8d331b2748921615cee854ff Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 21:07:47 +0100 Subject: [PATCH 22/83] fix: windows build? --- .github/workflows/build.yml | 20 +++----------------- Makefile | 23 ++++++++++++++++++++--- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ed4ece5c..75541ca4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,27 +62,18 @@ jobs: steps: - name: checkout uses: actions/checkout@v3 - - name: Setup Apple dependencies - if: matrix.platform == 'macos' || matrix.platform == 'ios' - run: | - brew install create-dmg tree - echo "installed create-dmg tree " - npm install -g appdmg - - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: '3.16.x' channel: 'stable' cache: true - - name: Setup Java if: startsWith(matrix.platform,'android') uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 - - name: Setup NDK if: startsWith(matrix.platform,'android') uses: nttld/setup-ndk@v1.4.1 @@ -92,15 +83,10 @@ jobs: add-to-path: true link-to-sdk: true - - name: Setup Flutter Distributor - if: ${{ !startsWith(matrix.platform,'android') }} - run: | - dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor - - name: Setup Linux dependencies - if: ${{ startsWith(matrix.platform,'linux') }} + - name: Setup dependencies run: | - make linux-install-dependencies + make ${{ matrix.platform }}-install-dependencies - name: Prepare for ${{ matrix.platform }} run: | @@ -214,7 +200,7 @@ jobs: mv ${targetFile} ../out/${targetFile} # added for appimage link fi fi - + done - name: Clean up keychain and provisioning profile if: ${{ always() && startsWith(matrix.os,'macos')}} diff --git a/Makefile b/Makefile index 2d7aa2d5..31caebca 100644 --- a/Makefile +++ b/Makefile @@ -70,6 +70,19 @@ android-aab-prepare:android-prepare +macos-install-dependencies: + brew install create-dmg tree + npm install -g appdmg + dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor + +ios-install-dependencies: + echo "not yet implemented" + +android-install-dependencies: + echo "nothing yet" +android-apk-install-dependencies: android-install-dependencies +android-aab-install-dependencies: android-install-dependencies + linux-install-dependencies: if [ "$(flutter)" = "true" ]; then \ wget -O ~/Downloads/flutter_linux_3.16.9-stable.tar.xz https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.16.9-stable.tar.xz; \ @@ -82,12 +95,16 @@ linux-install-dependencies: PATH="$$PATH":"$$HOME/.pub-cache/bin" echo 'export PATH="$$PATH:$$HOME/.pub-cache/bin"' >>~/.bashrc sudo apt install -y clang ninja-build pkg-config cmake libgtk-3-dev locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf file appstream - dart pub global activate flutter_distributor + sudo modprobe fuse wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" chmod +x appimagetool sudo mv appimagetool /usr/local/bin/ + dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor + +windows-install-dependencies: + dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor sync_translate: cd .github && bash sync_translate.sh @@ -123,9 +140,9 @@ android-apk-libs: android-libs android-aab-libs: android-libs windows-libs: - @$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... + $(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)$(SEP) - ls $(DESKTOP_OUT)$(SEP) + ls $(DESKTOP_OUT)$(SEP) || dir $(DESKTOP_OUT)$(SEP) || tree linux-libs: mkdir -p $(DESKTOP_OUT) From 53721e04e7493382e836a9da7d343286f20d9448 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 21:29:11 +0100 Subject: [PATCH 23/83] fix: windows? --- .github/workflows/build.yml | 10 +++++++++- Makefile | 11 ++++++----- macos/packaging/pkg/make_config.yaml | 2 ++ 3 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 macos/packaging/pkg/make_config.yaml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 75541ca4..c2bf4a93 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,7 @@ env: "aab": "Hiddify-Android", "exe": "Hiddify-Windows-x64", "dmg": "Hiddify-MacOS", + "pkg": "Hiddify-MacOS-Installer", "ipa": "Hiddify-iOS", } jobs: @@ -56,7 +57,7 @@ jobs: - platform: macos os: macos-13 aarch: universal - targets: dmg + targets: dmg,pkg runs-on: ${{ matrix.os }} steps: @@ -91,6 +92,7 @@ jobs: - name: Prepare for ${{ matrix.platform }} run: | make ${{ matrix.platform }}-prepare + tree - name: Setup Android Signing Properties if: startsWith(matrix.platform,'android') @@ -158,6 +160,8 @@ jobs: .\scripts\package_windows.ps1 - name: Copy to out Android APK + env: + TARGET_MAP: ${{ env.TARGET_MAP }} if: matrix.platform == 'android-apk' run: | mkdir out @@ -169,6 +173,8 @@ jobs: - name: Copy to out Android AAB if: matrix.platform == 'android-aab' + env: + TARGET_MAP: ${{ env.TARGET_MAP }} run: | mkdir out ls -R ./build/app/outputs @@ -176,6 +182,8 @@ jobs: - name: Copy to out unix if: startsWith(matrix.platform,'linux') || matrix.platform == 'macos' || matrix.platform == 'ios' + env: + TARGET_MAP: ${{ env.TARGET_MAP }} run: | ls -R dist/ mkdir out diff --git a/Makefile b/Makefile index 31caebca..12d04c40 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ include dependencies.properties -ifeq ($(OS),Windows_NT) +ifeq ($(OS),Windows_1NT) MKDIR := -mkdir RM := rmdir /s /q SEP:=\\ @@ -73,7 +73,7 @@ android-aab-prepare:android-prepare macos-install-dependencies: brew install create-dmg tree npm install -g appdmg - dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor + dart pub global activate flutter_distributor ios-install-dependencies: echo "not yet implemented" @@ -94,7 +94,8 @@ linux-install-dependencies: fi PATH="$$PATH":"$$HOME/.pub-cache/bin" echo 'export PATH="$$PATH:$$HOME/.pub-cache/bin"' >>~/.bashrc - sudo apt install -y clang ninja-build pkg-config cmake libgtk-3-dev locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf file appstream + sudo apt install -y clang ninja-build pkg-config cmake libgtk-3-dev locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf file appstream + sudo modprobe fuse wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" @@ -104,7 +105,7 @@ linux-install-dependencies: dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor windows-install-dependencies: - dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor + dart pub global activate flutter_distributor sync_translate: cd .github && bash sync_translate.sh @@ -142,7 +143,7 @@ android-aab-libs: android-libs windows-libs: $(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)$(SEP) - ls $(DESKTOP_OUT)$(SEP) || dir $(DESKTOP_OUT)$(SEP) || tree + ls $(DESKTOP_OUT) || dir $(DESKTOP_OUT)$(SEP) linux-libs: mkdir -p $(DESKTOP_OUT) diff --git a/macos/packaging/pkg/make_config.yaml b/macos/packaging/pkg/make_config.yaml new file mode 100644 index 00000000..0c2b8eaa --- /dev/null +++ b/macos/packaging/pkg/make_config.yaml @@ -0,0 +1,2 @@ +install-path: /Applications +#sign-identity: From 68268b2cbc03b5a62819a8b1fa62fc09b4965abd Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 21:57:49 +0100 Subject: [PATCH 24/83] fix: dynamic varible in github action --- .github/workflows/build.yml | 49 ++++++++++++++++--------------------- Makefile | 20 +++++++-------- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c2bf4a93..1508a504 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,22 +13,20 @@ on: default: "dev" env: + IS_GITHUB_ACTIONS: 1 CHANNEL: "${{ inputs.channel }}" NDK_VERSION: r26b UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" TAG_NAME: "${{ inputs.tag-name }}" - TARGET_MAP: | - { - "AppImage": "Hiddify-Linux-x64", - "deb": "Hiddify-Debian-x64", - "rpm": "Hiddify-rpm-x64", - "apk": "Hiddify-Android", - "aab": "Hiddify-Android", - "exe": "Hiddify-Windows-x64", - "dmg": "Hiddify-MacOS", - "pkg": "Hiddify-MacOS-Installer", - "ipa": "Hiddify-iOS", - } + TARGET_NAME_AppImage: "Hiddify-Linux-x64" + TARGET_NAME_deb": "Hiddify-Debian-x64" + TARGET_NAME_rpm": "Hiddify-rpm-x64" + TARGET_NAME_apk": "Hiddify-Android" + TARGET_NAME_aab": "Hiddify-Android" + TARGET_NAME_exe": "Hiddify-Windows-x64" + TARGET_NAME_dmg": "Hiddify-MacOS" + TARGET_NAME_pkg": "Hiddify-MacOS-Installer" + TARGET_NAME_ipa": "Hiddify-iOS" jobs: build: permissions: write-all @@ -160,21 +158,17 @@ jobs: .\scripts\package_windows.ps1 - name: Copy to out Android APK - env: - TARGET_MAP: ${{ env.TARGET_MAP }} if: matrix.platform == 'android-apk' run: | mkdir out ls -R ./build/app/outputs - cp ./build/app/outputs/flutter-apk/*arm64-v8a*.apk out/${TARGET_MAP[apk]}-arm64.apk || echo "no arm64 apk" - cp ./build/app/outputs/flutter-apk/*armeabi-v7a*.apk out/${TARGET_MAP[apk]}-arm7.apk || echo "no arm7 apk" - cp ./build/app/outputs/flutter-apk/*x86_64*.apk out/${TARGET_MAP[apk]}-x86_64.apk || echo "no x64 apk" - cp ./build/app/outputs/flutter-apk/app-release.apk out/${TARGET_MAP[apk]}-universal.apk || echo "no universal apk" + cp ./build/app/outputs/flutter-apk/*arm64-v8a*.apk out/${TARGET_NAME_apk}-arm64.apk || echo "no arm64 apk" + cp ./build/app/outputs/flutter-apk/*armeabi-v7a*.apk out/${TARGET_NAME_apk}-arm7.apk || echo "no arm7 apk" + cp ./build/app/outputs/flutter-apk/*x86_64*.apk out/${TARGET_NAME_apk}-x86_64.apk || echo "no x64 apk" + cp ./build/app/outputs/flutter-apk/app-release.apk out/${TARGET_NAME_apk}-universal.apk || echo "no universal apk" - name: Copy to out Android AAB if: matrix.platform == 'android-aab' - env: - TARGET_MAP: ${{ env.TARGET_MAP }} run: | mkdir out ls -R ./build/app/outputs @@ -182,30 +176,29 @@ jobs: - name: Copy to out unix if: startsWith(matrix.platform,'linux') || matrix.platform == 'macos' || matrix.platform == 'ios' - env: - TARGET_MAP: ${{ env.TARGET_MAP }} run: | ls -R dist/ mkdir out mkdir tmp_out for EXT in $(echo ${{ matrix.targets }} | tr ',' '\n'); do - targetFile=${TARGET_MAP[$EXT]}.$EXT - mv dist/*/*.$EXT tmp_out/${targetFile} - chmod +x tmp_out/${targetFile} + KEY=TARGET_NAME_${EXT} + FILENAME=${!KEY} + mv dist/*/*.$EXT tmp_out/${FILENAME}.$EXT + chmod +x tmp_out/${FILENAME}.$EXT if [ "${{matrix.platform}}" == "linux" ];then cp ./.github/help/linux/* tmp_out/ else cp ./.github/help/mac-windows/* tmp_out/ fi if [[ "${{matrix.platform}}" == 'ios' ]];then - mv tmp_out/${targetFile} bin/${targetFile} + mv tmp_out/${FILENAME}.$EXT bin/${FILENAME}.$EXT else cd tmp_out - 7z a ${TARGET_MAP[$EXT]}.zip ./ + 7z a ${FILENAME}.zip ./ mv *.zip ../out/ if [[ $EXT == 'AppImage' ]];then - mv ${targetFile} ../out/${targetFile} # added for appimage link + mv ${FILENAME}.$EXT ../out/${FILENAME}.$EXT # added for appimage link fi fi done diff --git a/Makefile b/Makefile index 12d04c40..89bdae89 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,14 @@ include dependencies.properties -ifeq ($(OS),Windows_1NT) - MKDIR := -mkdir - RM := rmdir /s /q - SEP:=\\ - PLATFORM_REQ:= @set /p platform="Run 'make prepare platform=ios' or enter platform name:"; -else - MKDIR := mkdir -p - RM := rm -rf - SEP :=/ - PLATFORM_REQ:= @read -p "Run make prepare platform=ios or enter platform name: " platform; +MKDIR := mkdir -p +RM := rm -rf +SEP :=/ + +ifeq ($(OS),Windows_NT) + ifeq ($(IS_GITHUB_ACTIONS),) + MKDIR := -mkdir + RM := rmdir /s /q + SEP:=\\ + endif endif BINDIR=libcore$(SEP)bin From 8b7f8b7babad41907eb08ba47a9c86659ea32ef8 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 22:04:05 +0100 Subject: [PATCH 25/83] fix: build linux --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1508a504..4aadbd0a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -200,6 +200,7 @@ jobs: if [[ $EXT == 'AppImage' ]];then mv ${FILENAME}.$EXT ../out/${FILENAME}.$EXT # added for appimage link fi + cd .. fi done From e083c68caadec1c337d9ed6e3f9bfbf0152124be Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 22:33:26 +0100 Subject: [PATCH 26/83] fix: unix copy bug --- .github/workflows/build.yml | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4aadbd0a..f8329eaa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,14 +19,14 @@ env: UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" TAG_NAME: "${{ inputs.tag-name }}" TARGET_NAME_AppImage: "Hiddify-Linux-x64" - TARGET_NAME_deb": "Hiddify-Debian-x64" - TARGET_NAME_rpm": "Hiddify-rpm-x64" - TARGET_NAME_apk": "Hiddify-Android" - TARGET_NAME_aab": "Hiddify-Android" - TARGET_NAME_exe": "Hiddify-Windows-x64" - TARGET_NAME_dmg": "Hiddify-MacOS" - TARGET_NAME_pkg": "Hiddify-MacOS-Installer" - TARGET_NAME_ipa": "Hiddify-iOS" + TARGET_NAME_deb: "Hiddify-Debian-x64" + TARGET_NAME_rpm: "Hiddify-rpm-x64" + TARGET_NAME_apk: "Hiddify-Android" + TARGET_NAME_aab: "Hiddify-Android" + TARGET_NAME_exe: "Hiddify-Windows-x64" + TARGET_NAME_dmg: "Hiddify-MacOS" + TARGET_NAME_pkg: "Hiddify-MacOS-Installer" + TARGET_NAME_ipa: "Hiddify-iOS" jobs: build: permissions: write-all @@ -184,6 +184,7 @@ jobs: for EXT in $(echo ${{ matrix.targets }} | tr ',' '\n'); do KEY=TARGET_NAME_${EXT} FILENAME=${!KEY} + echo "For $EXT ($KEY) filename is ${FILENAME}" mv dist/*/*.$EXT tmp_out/${FILENAME}.$EXT chmod +x tmp_out/${FILENAME}.$EXT if [ "${{matrix.platform}}" == "linux" ];then @@ -196,10 +197,8 @@ jobs: else cd tmp_out 7z a ${FILENAME}.zip ./ - mv *.zip ../out/ - if [[ $EXT == 'AppImage' ]];then - mv ${FILENAME}.$EXT ../out/${FILENAME}.$EXT # added for appimage link - fi + mv ${FILENAME}.zip ../out/ + [[ $EXT == 'AppImage' ]]&& mv ${FILENAME}.$EXT ../out/ # added for appimage link cd .. fi done From 632ec973725a113454260a47454bf9b21a1fcadc Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 23:02:19 +0100 Subject: [PATCH 27/83] new: add macos pkg file and remove zip wrapper --- .github/workflows/build.yml | 7 ++++--- Makefile | 2 +- scripts/package_windows.ps1 | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f8329eaa..1eb5966a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -196,9 +196,10 @@ jobs: mv tmp_out/${FILENAME}.$EXT bin/${FILENAME}.$EXT else cd tmp_out - 7z a ${FILENAME}.zip ./ - mv ${FILENAME}.zip ../out/ - [[ $EXT == 'AppImage' ]]&& mv ${FILENAME}.$EXT ../out/ # added for appimage link + # 7z a ${FILENAME}.zip ./ + # mv ${FILENAME}.zip ../out/ + # [[ $EXT == 'AppImage' ]]&& mv ${FILENAME}.$EXT ../out/ # added for appimage link + mv ${FILENAME}.$EXT ../out/ cd .. fi done diff --git a/Makefile b/Makefile index 89bdae89..9d7fefb9 100644 --- a/Makefile +++ b/Makefile @@ -128,7 +128,7 @@ linux-release: flutter_distributor package --platform linux --targets deb,rpm,appimage $(DISTRIBUTOR_ARGS) macos-release: - flutter_distributor package --platform macos --targets dmg $(DISTRIBUTOR_ARGS) + flutter_distributor package --platform macos --targets dmg,pkg $(DISTRIBUTOR_ARGS) ios-release: #not tested flutter_distributor package --platform ios --targets ipa --build-export-options-plist ios/exportOptions.plist $(DISTRIBUTOR_ARGS) diff --git a/scripts/package_windows.ps1 b/scripts/package_windows.ps1 index fec75749..cc57dfb2 100644 --- a/scripts/package_windows.ps1 +++ b/scripts/package_windows.ps1 @@ -3,9 +3,11 @@ New-Item -ItemType Directory -Force -Name "out" # windows setup Get-ChildItem -Recurse -File -Path "dist" -Filter "*windows-setup.exe" | Copy-Item -Destination "dist\tmp\hiddify-next-setup.exe" -ErrorAction SilentlyContinue -Compress-Archive -Force -Path "dist\tmp\hiddify-next-setup.exe",".github\help\mac-windows\*.url" -DestinationPath "out\hiddify-windows-x64-setup.zip" +# Compress-Archive -Force -Path "dist\tmp\hiddify-next-setup.exe",".github\help\mac-windows\*.url" -DestinationPath "out\hiddify-windows-x64-setup.zip" +xcopy dist\tmp\hiddify-next-setup.exe out\Hiddify-Windows-Setup-x64.exe /E/H/C/I/Y # windows portable xcopy "build\windows\x64\runner\Release" "dist\tmp\hiddify-next" /E/H/C/I/Y xcopy ".github\help\mac-windows\*.url" "dist\tmp\hiddify-next" /E/H/C/I/Y -Compress-Archive -Force -Path "dist\tmp\hiddify-next" -DestinationPath "out\hiddify-windows-x64-portable.zip" -ErrorAction SilentlyContinue \ No newline at end of file +Compress-Archive -Force -Path "dist\tmp\hiddify-next" -DestinationPath "out\Hiddify-Windows-Portable-x64.zip" -ErrorAction SilentlyContinue + From 3716ec049eff9bda59c03509327fd9964c2008a1 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Fri, 9 Feb 2024 23:50:11 +0100 Subject: [PATCH 28/83] release: version 0.15.6 --- .github/workflows/build.yml | 2 +- dependencies.properties | 2 +- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ pubspec.yaml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1eb5966a..a7a31f1f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ env: TARGET_NAME_rpm: "Hiddify-rpm-x64" TARGET_NAME_apk: "Hiddify-Android" TARGET_NAME_aab: "Hiddify-Android" - TARGET_NAME_exe: "Hiddify-Windows-x64" + #TARGET_NAME_exe: "Hiddify-Windows-x64" TARGET_NAME_dmg: "Hiddify-MacOS" TARGET_NAME_pkg: "Hiddify-MacOS-Installer" TARGET_NAME_ipa: "Hiddify-iOS" diff --git a/dependencies.properties b/dependencies.properties index 7258ef63..623f42e1 100644 --- a/dependencies.properties +++ b/dependencies.properties @@ -1 +1 @@ -core.version=0.14.0 \ No newline at end of file +core.version=0.14.2 \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 13a0e531..4e6cb41c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -751,7 +751,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1504; + CURRENT_PROJECT_VERSION = 1506; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -770,7 +770,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.4; + MARKETING_VERSION = 0.15.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-lresolv"; @@ -802,7 +802,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1504; + CURRENT_PROJECT_VERSION = 1506; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -821,7 +821,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.4; + MARKETING_VERSION = 0.15.6; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; @@ -851,7 +851,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1504; + CURRENT_PROJECT_VERSION = 1506; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -870,7 +870,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.4; + MARKETING_VERSION = 0.15.6; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; diff --git a/pubspec.yaml b/pubspec.yaml index 60fc0534..a0a51ed1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: hiddify description: Cross Platform Multi Protocol Proxy Frontend. publish_to: "none" -version: 0.15.4+1504 +version: 0.15.6+1506 environment: sdk: ">=3.2.0 <4.0.0" From 5c8aaaf8c29e0252411170e0992b2ff1a8284f25 Mon Sep 17 00:00:00 2001 From: realWLF Date: Sat, 10 Feb 2024 04:42:58 +0330 Subject: [PATCH 29/83] Fix iOS Logger --- ios/Runner/Handlers/LogsEventHandler.swift | 58 +++++++--------------- ios/Runner/VPN/VPNManager.swift | 12 ++--- 2 files changed, 23 insertions(+), 47 deletions(-) diff --git a/ios/Runner/Handlers/LogsEventHandler.swift b/ios/Runner/Handlers/LogsEventHandler.swift index a3a85247..09fb600f 100644 --- a/ios/Runner/Handlers/LogsEventHandler.swift +++ b/ios/Runner/Handlers/LogsEventHandler.swift @@ -2,66 +2,41 @@ import Foundation import Combine import Libcore -class LogsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol { - static let shared: LogsEventHandler = LogsEventHandler() +class LogsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { static let name = "\(Bundle.main.serviceIdentifier)/service.logs" - private var channel: FlutterEventChannel? - - private var commandClient: LibboxCommandClient? + private var commandClient: CommandClient? private var events: FlutterEventSink? - private var maxLines: Int - private var logList: [String] = [] - - private var lock: NSLock = NSLock() + private var channel: FlutterEventChannel? + private var cancellable: AnyCancellable? public static func register(with registrar: FlutterPluginRegistrar) { - let instance = LogsEventHandler.shared - instance.channel = FlutterEventChannel(name: Self.name, binaryMessenger: registrar.messenger()) + let instance = LogsEventHandler() + instance.channel = FlutterEventChannel(name: Self.name, + binaryMessenger: registrar.messenger()) instance.channel?.setStreamHandler(instance) } - init(maxLines: Int = 32) { - self.maxLines = maxLines - super.init() - let opts = LibboxCommandClientOptions() - opts.command = LibboxCommandLog - opts.statusInterval = Int64(2 * NSEC_PER_SEC) - commandClient = LibboxCommandClient(self, options: opts) - try? commandClient?.connect() - } - - deinit { - try? commandClient?.disconnect() - } - public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { - events(logList) + FileManager.default.changeCurrentDirectoryPath(FilePath.sharedDirectory.path) self.events = events + commandClient = CommandClient(.log) + commandClient?.connect() + cancellable = commandClient?.$logList.sink{ [self] logs in + events(logs) + } return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { + commandClient?.disconnect() + cancellable?.cancel() events = nil return nil } - - func writeLog(_ message: String?) { - guard let message else { - return - } - lock.withLock { [self] in - if logList.count > maxLines { - logList.removeFirst() - } - logList.append(message) - DispatchQueue.main.async { [self] () in - events?(logList) - } - } - } } +/* extension LogsEventHandler { public func clearLog() {} public func connected() {} @@ -71,3 +46,4 @@ extension LogsEventHandler { public func writeGroups(_ message: LibboxOutboundGroupIteratorProtocol?) {} public func writeStatus(_ message: LibboxStatusMessage?) {} } +*/ diff --git a/ios/Runner/VPN/VPNManager.swift b/ios/Runner/VPN/VPNManager.swift index 24370285..6f263d84 100644 --- a/ios/Runner/VPN/VPNManager.swift +++ b/ios/Runner/VPN/VPNManager.swift @@ -86,7 +86,7 @@ class VPNManager: ObservableObject { do { try await loadVPNPreference() } catch { - LogsEventHandler.shared.writeLog(error.localizedDescription) + print(error.localizedDescription) } } @@ -107,7 +107,7 @@ class VPNManager: ObservableObject { try await newManager.loadFromPreferences() self.manager = newManager } catch { - LogsEventHandler.shared.writeLog(error.localizedDescription) + print(error.localizedDescription) } } @@ -117,7 +117,7 @@ class VPNManager: ObservableObject { try await manager.saveToPreferences() try await manager.loadFromPreferences() } catch { - LogsEventHandler.shared.writeLog(error.localizedDescription) + print(error.localizedDescription) } } @@ -157,7 +157,7 @@ class VPNManager: ObservableObject { } try await self?.loadVPNPreference() } catch { - LogsEventHandler.shared.writeLog(error.localizedDescription) + print(error.localizedDescription) } } }.store(in: &cancelBag) @@ -188,7 +188,7 @@ class VPNManager: ObservableObject { } } } catch { - LogsEventHandler.shared.writeLog(error.localizedDescription) + print(error.localizedDescription) } } @@ -202,7 +202,7 @@ class VPNManager: ObservableObject { "DisableMemoryLimit": (disableMemoryLimit ? "YES" : "NO") as NSString, ]) } catch { - LogsEventHandler.shared.writeLog(error.localizedDescription) + print(error.localizedDescription) } connectTime = .now } From 7576a3ee5d8b917bc785587e1f4486f3e679aec1 Mon Sep 17 00:00:00 2001 From: Hiddify <114227601+hiddify-com@users.noreply.github.com> Date: Sat, 10 Feb 2024 10:38:58 +0100 Subject: [PATCH 30/83] Update CONTRIBUTING.md --- CONTRIBUTING.md | 71 ++++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e5b5d061..99b1cea7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,9 +25,14 @@ If you encounter any issue, or you have an idea to improve, please: When contributing a complex change to the Hiddify Next repository, please discuss the change you wish to make within a GitHub issue with the owners of this repository before making the change. + ## Development -Hiddify Next uses [Flutter](https://flutter.dev) and [Go](https://go.dev), make sure that you have the correct version installed before starting development. You can use the following commands to check your installed version: +### Adding Feature / Fix bug in Core: +Please follow our [Go Core Development repository](https://github.com/hiddify/hiddify-next-core/main/CONTRIBUTING.m). + +### Working with the Flutter Code +Hiddify Next uses [Flutter](https://flutter.dev), make sure that you have the correct version installed before starting development. You can use the following commands to check your installed version: ```shell $ flutter --version @@ -37,62 +42,31 @@ Flutter 3.13.4 • channel stable • https://github.com/flutter/flutter.git Framework • revision 367f9ea16b (4 weeks ago) • 2023-09-12 23:27:53 -0500 Engine • revision 9064459a8b Tools • Dart 3.1.2 • DevTools 2.25.0 - - -$ go version - -# example response -go version go1.21.1 darwin/arm64 ``` -### Working with the Go Code - -> if you're not interested in building/contributing to the Go code, you can skip this section - -The Go code for Hiddify Next can be found in the `libcore` folder, as a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) and in [core repository](https://github.com/hiddify/hiddify-next-core). The entrypoints for the desktop version are available in the [`libcore/custom`](https://github.com/hiddify/hiddify-next-core/tree/main/custom) folder and for the mobile version they can be found in the [`libcore/mobile`](https://github.com/hiddify/hiddify-next-core/tree/main/mobile) folder. - -For the desktop version, we have to compile the Go code into a C shared library. We are providing a Makefile to generate the C shared libraries for all operating systems. The following Make commands will build libcore and copy the resulting output in [`libcore/bin`](https://github.com/hiddify/hiddify-next-core/tree/main/bin): - -- `make windows-amd64` -- `make linux-amd64` -- `make macos-universal` - -For the mobile version, we are using the [`gomobile`](https://github.com/golang/go/wiki/Mobile) tools. The following Make commands will build libcore for Android and iOS and copy the resulting output in [`libcore/bin`](https://github.com/hiddify/hiddify-next-core/tree/main/bin): - -- `make android` -- `make ios` - -### Working with the Flutter Code We recommend using [Visual Studio Code](https://docs.flutter.dev/development/tools/vs-code) extensions for development. #### Setting up the Environment We have extensive use of code generation in the form of [freezed](https://github.com/rrousselGit/freezed), [riverpod](https://github.com/rrousselGit/riverpod), etc. So it's generate these before running the code. Execute the following make commands in order: - -```shell -# fetch dependencies -$ make get - -# generate translations -$ make translate - -# fetch geo assets -$ make get-geo-assets - -# generate dart code using build_runner -$ make gen -``` - Assuming you have not built the `libcore` and want to use [existing releases](https://github.com/hiddify/hiddify-next-core/releases), you should run the following command (based on your target platform): -- `make windows-libs` -- `make linux-libs` -- `make macos-libs` -- `make android-libs` -- `make ios-libs` -If you want to build the `libcore` from source, prefix the above command with `build-` like `make build-windows-libs`. +- `make windows-prepare` +- `make linux-prepare` +- `make macos-prepare` +- `make ios-prepare` +- `make android-prepare` + + +##### build the `libcore` from source (Optional) +If you want to build the `libcore` from source after `make prepare`, use: +- `make build-windows-libs` +- `make build-linux-libs` +- `make build-macos-libs` +- `make build-ios-libs` +- `make build-android-libs` #### Run Release Build on a Device @@ -112,7 +86,9 @@ Chrome (web) • chrome • web-javascript • Google Chrome 117.0.5938.1 Then we can use one of the listed devices and execute the following command to build and run the app on this device: ```shell -flutter run --release --target lib/main_dev.dart --device-id=35492ae2 +flutter run +# or +flutter run --device-id=35492ae2 ``` ## Release @@ -132,7 +108,6 @@ We need your collaboration in order to develop this project. If you have experie - Flutter Developing - Swift Developing -- Kotlin Developing - Go Developing
From 39a204e71829a313efa81415de536a5690e7728e Mon Sep 17 00:00:00 2001 From: Hiddify Date: Sat, 10 Feb 2024 11:17:58 +0100 Subject: [PATCH 31/83] new: add unavailble mark, fix: windows release bug --- Makefile | 2 +- lib/features/proxy/widget/proxy_tile.dart | 2 +- scripts/package_windows.ps1 | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 9d7fefb9..266e2d19 100644 --- a/Makefile +++ b/Makefile @@ -190,7 +190,7 @@ release: # Create a new tag for release. @echo "previous version was $$(git describe --tags $$(git rev-list --tags --max-count=1))" @echo "WARNING: This operation will creates version tag and push to github" @bash -c '\ - [ "404" == $$(curl -I -s -w "%{http_code}" https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version)/hiddify-libcore-windows-amd64.h.gz -o /dev/null) ]&&{ echo "Core Not Found"; exit 1 ; };\ + [ "404" == $$(curl -I -s -w "%{http_code}" https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version)/hiddify-core-linux-amd64.tar.gz -o /dev/null) ]&&{ echo "Core Not Found"; exit 1 ; };\ cversion_string=`grep -e "^version:" pubspec.yaml | cut -d: -f2-`; \ cstr_version=`echo "$${cversion_string}" | sed -n "s/[ ]*\\([0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\)+.*/\\1/p"`; \ cbuild_number=`echo "$${cversion_string}" | sed -n "s/.*+\\([0-9]\\+\\)/\\1/p"`; \ diff --git a/lib/features/proxy/widget/proxy_tile.dart b/lib/features/proxy/widget/proxy_tile.dart index e23630e0..b8474295 100644 --- a/lib/features/proxy/widget/proxy_tile.dart +++ b/lib/features/proxy/widget/proxy_tile.dart @@ -51,7 +51,7 @@ class ProxyTile extends HookConsumerWidget with PresLogger { ), trailing: proxy.urlTestDelay != 0 ? Text( - proxy.urlTestDelay.toString(), + proxy.urlTestDelay > 65000 ? "x" : proxy.urlTestDelay.toString(), style: TextStyle(color: delayColor(context, proxy.urlTestDelay)), ) : null, diff --git a/scripts/package_windows.ps1 b/scripts/package_windows.ps1 index cc57dfb2..f4e67308 100644 --- a/scripts/package_windows.ps1 +++ b/scripts/package_windows.ps1 @@ -2,9 +2,10 @@ New-Item -ItemType Directory -Force -Name "dist\tmp" New-Item -ItemType Directory -Force -Name "out" # windows setup -Get-ChildItem -Recurse -File -Path "dist" -Filter "*windows-setup.exe" | Copy-Item -Destination "dist\tmp\hiddify-next-setup.exe" -ErrorAction SilentlyContinue +# Get-ChildItem -Recurse -File -Path "dist" -Filter "*windows-setup.exe" | Copy-Item -Destination "dist\tmp\hiddify-next-setup.exe" -ErrorAction SilentlyContinue # Compress-Archive -Force -Path "dist\tmp\hiddify-next-setup.exe",".github\help\mac-windows\*.url" -DestinationPath "out\hiddify-windows-x64-setup.zip" -xcopy dist\tmp\hiddify-next-setup.exe out\Hiddify-Windows-Setup-x64.exe /E/H/C/I/Y +Get-ChildItem -Recurse -File -Path "dist" -Filter "*windows-setup.exe" | Copy-Item -Destination "out\Hiddify-Windows-Setup-x64.exe" -ErrorAction SilentlyContinue + # windows portable xcopy "build\windows\x64\runner\Release" "dist\tmp\hiddify-next" /E/H/C/I/Y From c016b5ef90f05a1f92995eb07835d390a71f9068 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 10 Feb 2024 11:02:10 +0330 Subject: [PATCH 32/83] Change translation fallback strategy --- build.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/build.yaml b/build.yaml index c34cb667..ea4b8fac 100644 --- a/build.yaml +++ b/build.yaml @@ -7,6 +7,7 @@ targets: slang_build_runner: options: base_locale: en + fallback_strategy: base_locale input_directory: assets/translations input_file_pattern: .i18n.json output_directory: lib/gen From 8014528beac12ad1905a3d1029b0d66cab54e647 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 10 Feb 2024 11:20:56 +0330 Subject: [PATCH 33/83] Fix commands --- Makefile | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 266e2d19..a6267325 100644 --- a/Makefile +++ b/Makefile @@ -19,17 +19,18 @@ GEO_ASSETS_DIR=assets$(SEP)core CORE_PRODUCT_NAME=hiddify-core CORE_NAME=$(CORE_PRODUCT_NAME) +LIB_NAME=libcore SRV_NAME=HiddifyService ifeq ($(CHANNEL),prod) -CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) + CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) else -CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft + CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft endif ifeq ($(CHANNEL),prod) -TARGET=lib/main_prod.dart + TARGET=lib/main_prod.dart else -TARGET=lib/main.dart + TARGET=lib/main.dart endif BUILD_ARGS=--dart-define sentry_dsn=$(SENTRY_DSN) @@ -107,7 +108,7 @@ linux-install-dependencies: windows-install-dependencies: dart pub global activate flutter_distributor -sync_translate: +gen_translations: #generating missing translations using google translate cd .github && bash sync_translate.sh make translate @@ -168,7 +169,7 @@ build-headers: build-android-libs: make -C libcore -f Makefile android - mv $(BINDIR)/$(CORE_LIB_NAME).aar $(ANDROID_OUT)/ + mv $(BINDIR)/$(LIB_NAME).aar $(ANDROID_OUT)/ build-windows-libs: make -C libcore -f Makefile windows-amd64 From a820f4d43efb7e1cdad29c4705a1c0d2e376fc43 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 10 Feb 2024 13:55:31 +0330 Subject: [PATCH 34/83] Add active proxy delay indicator --- lib/features/home/widget/home_page.dart | 13 +++- .../active/active_proxy_delay_indicator.dart | 78 +++++++++++++++++++ .../proxy/active/active_proxy_notifier.dart | 22 ++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 lib/features/proxy/active/active_proxy_delay_indicator.dart diff --git a/lib/features/home/widget/home_page.dart b/lib/features/home/widget/home_page.dart index 8118b70a..9b43ba45 100644 --- a/lib/features/home/widget/home_page.dart +++ b/lib/features/home/widget/home_page.dart @@ -11,6 +11,7 @@ import 'package:hiddify/features/home/widget/connection_button.dart'; import 'package:hiddify/features/home/widget/empty_profiles_home_body.dart'; import 'package:hiddify/features/profile/notifier/active_profile_notifier.dart'; import 'package:hiddify/features/profile/widget/profile_tile.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_delay_indicator.dart'; import 'package:hiddify/features/proxy/active/active_proxy_footer.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -61,7 +62,17 @@ class HomePage extends HookConsumerWidget { child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const Expanded(child: ConnectionButton()), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const ConnectionButton(), + if (Platform.isAndroid || Platform.isIOS) + const ActiveProxyDelayIndicator(), + ], + ), + ), if (Platform.isAndroid || Platform.isIOS) const ActiveProxyFooter(), ], diff --git a/lib/features/proxy/active/active_proxy_delay_indicator.dart b/lib/features/proxy/active/active_proxy_delay_indicator.dart new file mode 100644 index 00000000..605d8188 --- /dev/null +++ b/lib/features/proxy/active/active_proxy_delay_indicator.dart @@ -0,0 +1,78 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:gap/gap.dart'; +import 'package:hiddify/core/widget/animated_visibility.dart'; +import 'package:hiddify/core/widget/skeleton_widget.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +class ActiveProxyDelayIndicator extends HookConsumerWidget { + const ActiveProxyDelayIndicator({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final asyncState = ref.watch(activeProxyNotifierProvider); + + return AnimatedVisibility( + axis: Axis.vertical, + visible: asyncState is AsyncData, + child: () { + switch (asyncState) { + case AsyncData(:final value): + final delay = value.proxy.urlTestDelay; + return Center( + child: InkWell( + onTap: () async { + await ref + .read(activeProxyNotifierProvider.notifier) + .urlTest(value.proxy.tag); + }, + borderRadius: BorderRadius.circular(24), + child: Padding( + padding: + const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(FluentIcons.wifi_1_24_regular), + const Gap(8), + if (delay > 0) + Text.rich( + TextSpan( + children: [ + TextSpan( + text: delay.toString(), + style: theme.textTheme.titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + ), + const TextSpan(text: " ms"), + ], + ), + ) + else + const Skeleton( + height: 18, + width: 48, + ) + .animate( + onPlay: (controller) => controller.loop(), + ) + .shimmer( + duration: 1000.ms, + angle: 45, + color: Theme.of(context).colorScheme.secondary, + ), + ], + ), + ), + ), + ); + default: + return const SizedBox(); + } + }(), + ); + } +} diff --git a/lib/features/proxy/active/active_proxy_notifier.dart b/lib/features/proxy/active/active_proxy_notifier.dart index 9926a24a..4dd32eee 100644 --- a/lib/features/proxy/active/active_proxy_notifier.dart +++ b/lib/features/proxy/active/active_proxy_notifier.dart @@ -56,6 +56,9 @@ class ActiveProxyNotifier extends _$ActiveProxyNotifier with AppLogger { @override AsyncValue build() { ref.disposeDelay(const Duration(seconds: 20)); + ref.onDispose(() { + _urlTestDebouncer.dispose(); + }); final ipInfo = ref.watch(proxyIpInfoProvider); final activeProxies = ref.watch(activeProxyGroupProvider); return switch (activeProxies) { @@ -67,9 +70,28 @@ class ActiveProxyNotifier extends _$ActiveProxyNotifier with AppLogger { }; } + final _urlTestDebouncer = CallbackDebouncer(const Duration(seconds: 1)); + Future refreshIpInfo() async { if (state case AsyncData(:final value) when !value.ipInfo.isLoading) { ref.invalidate(proxyIpInfoProvider); } } + + Future urlTest(String groupTag) async { + _urlTestDebouncer( + () async { + loggy.debug("testing group: [$groupTag]"); + if (state case AsyncData()) { + await ref + .read(proxyRepositoryProvider) + .urlTest(groupTag) + .getOrElse((err) { + loggy.error("error testing group", err); + throw err; + }).run(); + } + }, + ); + } } From 927e080899cb9b10482cf2518e13813963c380df Mon Sep 17 00:00:00 2001 From: Hiddify Date: Sat, 10 Feb 2024 11:39:37 +0100 Subject: [PATCH 35/83] chg: Change name to Hiddify --- .github/ISSUE_TEMPLATE/bug_report.yaml | 6 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/dev-i copy.yml | 206 ++++++++++++++++++ 1distribute_options.yaml | 45 ++++ CHANGELOG.md | 2 +- CONTRIBUTING.md | 6 +- README.md | 4 +- README_cn.md | 4 +- README_ja.md | 4 +- a.sh | 37 ++++ android/app/src/main/AndroidManifest.xml | 2 +- .../hiddify/hiddify/bg/ServiceNotification.kt | 4 +- assets/translations/strings_en.i18n.json | 6 +- assets/translations/strings_es.i18n.json | 6 +- assets/translations/strings_fa.i18n.json | 6 +- assets/translations/strings_ru.i18n.json | 6 +- assets/translations/strings_tr.i18n.json | 6 +- assets/translations/strings_zh-CN.i18n.json | 6 +- devtools_options.yaml | 1 + ios/Runner/Info.plist | 2 +- lib/core/model/constants.dart | 2 +- lib/features/proxy/widget/proxy_tile.dart | 2 +- .../window/notifier/window_notifier.dart | 2 +- libcore | 2 +- linux/my_application.cc | 4 +- linux/packaging/appimage/make_config.yaml | 2 +- linux/packaging/deb/make_config.yaml | 10 +- linux/packaging/rpm/make_config.yaml | 6 +- macos/Runner.xcodeproj/project.pbxproj | 12 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- macos/Runner/Configs/AppInfo.xcconfig | 2 +- macos/packaging/dmg/make_config.yaml | 2 +- windows/CMakeLists.txt | 2 +- windows/packaging/exe/make_config.yaml | 6 +- windows/packaging/msix/make_config.yaml | 6 +- windows/runner/Runner.rc | 2 +- windows/runner/main.cpp | 6 +- 37 files changed, 361 insertions(+), 76 deletions(-) create mode 100644 .github/workflows/dev-i copy.yml create mode 100644 1distribute_options.yaml create mode 100644 a.sh create mode 100644 devtools_options.yaml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index f6acd8af..a6454a48 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,6 +1,6 @@ name: Bug Report -description: Report a bug encountered while using Hiddify Next -labels: ['bug'] +description: Report a bug encountered while using Hiddify +labels: ["bug"] body: - type: markdown attributes: @@ -52,7 +52,7 @@ body: id: version attributes: label: Version - description: What version of Hiddify Next are you using? + description: What version of Hiddify are you using? placeholder: v1.3.8 etc validations: required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 51356b73..2fe745c7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,4 +2,4 @@ blank_issues_enabled: false contact_links: - name: Questions & Help url: https://t.me/hiddify_board - about: Ask a question about Hiddify Next + about: Ask a question about Hiddify diff --git a/.github/workflows/dev-i copy.yml b/.github/workflows/dev-i copy.yml new file mode 100644 index 00000000..f11f97e2 --- /dev/null +++ b/.github/workflows/dev-i copy.yml @@ -0,0 +1,206 @@ +name: dev i new +on: + push: + branches: + - main + paths-ignore: + - '**.md' + - 'docs/**' + - '.github/**' + - '!.github/workflows/*' + - 'appcast.xml' + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +env: + CHANNEL: ${{ github.ref_type == 'tag' && endsWith(github.ref_name, 'dev') && 'dev' || github.ref_type != 'tag' && 'dev' || 'prod' }} + NDK_VERSION: r26b + +jobs: + build: + permissions: write-all + strategy: + fail-fast: false + matrix: + include: + # - platform: android-apk + # os: ubuntu-latest + # targets: apk + + # - platform: android-aab + # os: ubuntu-latest + # targets: aab + + # - platform: windows + # os: windows-latest + # aarch: amd64 + # targets: exe + # filename: hiddify-windows-x64 + + # - platform: linux + # os: ubuntu-latest + # aarch: amd64 + # targets: AppImage + # filename: hiddify-linux-x64 + + # - platform: macos + # os: macos-13 + # aarch: universal + # targets: dmg + # filename: hiddify-macos-universal + + - platform: ios + os: macos-13 + aarch: universal + filename: hiddify-ios + targets: ipa + + runs-on: ${{ matrix.os }} + steps: + - name: checkout + uses: actions/checkout@v3 + - name: Install macos dmg needed tools + if: matrix.platform == 'macos' || matrix.platform == 'ios' + run: | + # xcode-select --install || softwareupdate --all --install --force + # brew uninstall --force $(brew list | grep python@) && brew cleanup || echo "python not installed" + brew uninstall --ignore-dependencies python@3.12 + brew reinstall python@3.10 + python3 -m pip install --upgrade setuptools pip + brew install create-dmg tree + npm install -g appdmg + brew install graphicsmagick imagemagick + gem install fastlane + bundle install + pip install setuptools + npm install --global create-dmg + + - name: Fastlane Release + shell: bash + run: fastlane release + env: + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 120 # x86 is slooooooow + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '15.0.1' + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.16.x' + channel: 'stable' + cache: true + + + - name: Setup Flutter Distributor + if: ${{ !startsWith(matrix.platform,'android') }} + run: | + dart pub global activate flutter_distributor + + + - name: Get Geo Assets + run: | + make get-geo-assets + + - name: Get Dependencies + run: | + make get + + - name: Generate + run: | + make translate + make gen + + - name: Get Libs ${{ matrix.platform }} + run: | + make ${{ matrix.platform }}-libs + + + - name: Setup Apple certificate and provisioning profile + if: startsWith(matrix.os,'macos') + env: + BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_BUILD_CERTIFICATE_BASE64 }} + P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_P12_PASSWORD }} + BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.APPLE_BUILD_PROVISION_PROFILE_BASE64 }} + BUILD_PACKET_TUNNEL_PROVISION_PROFILE_BASE64: ${{ secrets.APPLE_BUILD_PACKET_TUNNEL_PROVISION_PROFILE_BASE64 }} + KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }} + run: | + # create variables + CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 + PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision + PP_PACKET_TUNNEL_PATH=$RUNNER_TEMP/build_pppt.mobileprovision + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + + # import certificate and provisioning profile from secrets + echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH + echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH + echo -n "$BUILD_PACKET_TUNNEL_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PACKET_TUNNEL_PATH + + # create temporary keychain + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + + # import certificate to keychain + security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH + security list-keychain -d user -s $KEYCHAIN_PATH + + # apply provisioning profile + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles + cp $PP_PACKET_TUNNEL_PATH ~/Library/MobileDevice/Provisioning\ Profiles + + - name: Release ${{ matrix.platform }} + env: + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + run: | + make ${{ matrix.platform }}-release + + - name: Upload Debug Symbols + if: ${{ github.ref_type == 'tag' }} + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + SENTRY_DIST: ${{ matrix.platform == 'android-aab' && 'google-play' || 'general' }} + run: | + flutter packages pub run sentry_dart_plugin + + + - name: Copy to out unix + if: matrix.platform == 'linux' || matrix.platform == 'macos' || matrix.platform == 'ios' + run: | + ls -R dist/ + mkdir out + mkdir tmp_out + EXT="${{ matrix.targets }}" + mv dist/*/*.$EXT tmp_out/${{matrix.filename}}.$EXT + chmod +x tmp_out/${{matrix.filename}}.$EXT + if [ "${{matrix.platform}}" == "linux" ];then + cp ./.github/help/linux/* tmp_out/ + else + cp ./.github/help/mac-windows/* tmp_out/ + fi + if [[ "${{matrix.platform}}" == 'ios' ]];then + mv tmp_out/${{matrix.filename}}.ipa bin/${{matrix.filename}}.ipa + else + cd tmp_out + 7z a ${{matrix.filename}}.zip ./ + mv *.zip ../out/ + fi + + - name: Clean up keychain and provisioning profile + if: ${{ always() && startsWith(matrix.os,'macos')}} + run: | + security delete-keychain $RUNNER_TEMP/app-signing.keychain-db + rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: artifact + path: ./out + retention-days: 2 diff --git a/1distribute_options.yaml b/1distribute_options.yaml new file mode 100644 index 00000000..1e08a464 --- /dev/null +++ b/1distribute_options.yaml @@ -0,0 +1,45 @@ +# output: dist/ +# releases: +# - name: prod +# jobs: +# - name: release-windows-exe +# package: +# platform: windows +# target: exe + +# - name: release-android-apk +# package: +# platform: android +# target: apk +# build_args: +# target-platform: android-arm,android-arm64,android-x64 + +# - name: release-android-bundle +# package: +# platform: android +# target: aab +# build_args: +# target-platform: android-arm,android-arm64,android-x64 + + + +# variables: +# APPSTORE_USERNAME: "xxx" +# APPSTORE_PASSWORD: "xxx" +# # or +# # APPSTORE_APIKEY: "xxx" +# # APPSTORE_APIISSUER: "xxx" +# output: dist/ +# releases: +# - name: dev +# jobs: +# - name: release-dev-ios +# package: +# platform: ios +# target: ipa +# build_args: +# target: lib/main.dart +# export-options-plist: ios/ExportOptions.plist +# # Publish to appstore +# publish: +# target: appstore \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d1d9f5e..f2398752 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -203,7 +203,7 @@ - Added Geo Asset Settings - Update geo assets and use recommended providers - Added **winget** Release - - Now you're able to install and update Hiddify Next on Windows using [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/). + - Now you're able to install and update Hiddify on Windows using [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/). - Added Turkish Translations. [PR#173](https://github.com/hiddify/hiddify-next/pull/173) by [Hasan Karlı](https://github.com/hasankarli) - Changed in-app Toasts - Updated Core Sing-box Version to 1.7.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 99b1cea7..2627c143 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -Every contribution to Hiddify Next is welcome, whether it is reporting a bug, submitting a fix, proposing new features, or just asking a question. To make contributing to Hiddify Next as easy as possible, you will find more details for the development flow in this documentation. +Every contribution to Hiddify is welcome, whether it is reporting a bug, submitting a fix, proposing new features, or just asking a question. To make contributing to Hiddify as easy as possible, you will find more details for the development flow in this documentation. Please note, we have a [Code of Conduct](https://github.com/hiddify/hiddify-next/blob/main/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. @@ -23,7 +23,7 @@ If you encounter any issue, or you have an idea to improve, please: ## Adding new Features -When contributing a complex change to the Hiddify Next repository, please discuss the change you wish to make within a GitHub issue with the owners of this repository before making the change. +When contributing a complex change to the Hiddify repository, please discuss the change you wish to make within a GitHub issue with the owners of this repository before making the change. ## Development @@ -32,7 +32,7 @@ When contributing a complex change to the Hiddify Next repository, please discus Please follow our [Go Core Development repository](https://github.com/hiddify/hiddify-next-core/main/CONTRIBUTING.m). ### Working with the Flutter Code -Hiddify Next uses [Flutter](https://flutter.dev), make sure that you have the correct version installed before starting development. You can use the following commands to check your installed version: +Hiddify uses [Flutter](https://flutter.dev), make sure that you have the correct version installed before starting development. You can use the following commands to check your installed version: ```shell $ flutter --version diff --git a/README.md b/README.md index 030a3ace..4d035df7 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ ## What is Hiddify-Next? -

A multi-platform proxy client based on Sing-box universal proxy tool-chain. Hiddify Next offers a wide range of capabilities, like automatic node selection, TUN mode, remote profiles etc. Hiddify Next is ad-free and open-source. With support for a wide range of protocols, it provides a secure and private way for accessing free internet.

+

A multi-platform proxy client based on Sing-box universal proxy tool-chain. Hiddify offers a wide range of capabilities, like automatic node selection, TUN mode, remote profiles etc. Hiddify is ad-free and open-source. With support for a wide range of protocols, it provides a secure and private way for accessing free internet.

English Demo @@ -144,7 +144,7 @@ We also need financial support for our services. All of our activities are done ## 👩‍🏫 Collaboration and Contact Information -Hiddify Next is a community driven project. If you're interested in contributing, please read the [contribution guidelines](./CONTRIBUTING.md). We would specially appreciate any help we can get in these areas: **Flutter, Go, iOS development (Swift), Android development (Kotlin).** +Hiddify is a community driven project. If you're interested in contributing, please read the [contribution guidelines](./CONTRIBUTING.md). We would specially appreciate any help we can get in these areas: **Flutter, Go, iOS development (Swift), Android development (Kotlin).**
diff --git a/README_cn.md b/README_cn.md index 9826a3cc..3c6459ef 100644 --- a/README_cn.md +++ b/README_cn.md @@ -18,7 +18,7 @@ ## Hiddify-Next 是什么? -

一款基于 Sing-box 通用代理工具的跨平台代理客户端。Hiddify Next 提供了较全面的代理功能,例如自动选择节点、TUN 模式、使用远程配置文件等。Hiddify Next 无广告,并且代码开源。它为大家自由访问互联网提供了一个支持多种协议的、安全且私密的工具。

+

一款基于 Sing-box 通用代理工具的跨平台代理客户端。Hiddify 提供了较全面的代理功能,例如自动选择节点、TUN 模式、使用远程配置文件等。Hiddify 无广告,并且代码开源。它为大家自由访问互联网提供了一个支持多种协议的、安全且私密的工具。

English Demo @@ -138,7 +138,7 @@ ## 👩‍🏫 合作及联系信息 -Hiddify Next 是一个由社区驱动的项目。如果您有兴趣为本项目做出贡献,请阅读 [贡献指南](./CONTRIBUTING.md)。我们将非常感谢您,如果您能够在以下领域提供任何帮助:Flutter、Go、iOS 开发 (Swift)、Android 开发 (Kotlin)。 +Hiddify 是一个由社区驱动的项目。如果您有兴趣为本项目做出贡献,请阅读 [贡献指南](./CONTRIBUTING.md)。我们将非常感谢您,如果您能够在以下领域提供任何帮助:Flutter、Go、iOS 开发 (Swift)、Android 开发 (Kotlin)。
diff --git a/README_ja.md b/README_ja.md index f85aa688..dc0e2f88 100644 --- a/README_ja.md +++ b/README_ja.md @@ -23,7 +23,7 @@ ## Hiddify-Next とは? -

Sing-box ユニバーサルプロキシツールチェーンに基づくマルチプラットフォームプロキシクライアントです。Hiddify Next は、自動ノード選択、TUN モード、リモートプロファイルなど、幅広い機能を提供します。Hiddify Next は無料でオープンソースです。幅広いプロトコルをサポートし、無料インターネットにアクセスするための安全でプライベートな方法を提供します。

+

Sing-box ユニバーサルプロキシツールチェーンに基づくマルチプラットフォームプロキシクライアントです。Hiddify は、自動ノード選択、TUN モード、リモートプロファイルなど、幅広い機能を提供します。Hiddify は無料でオープンソースです。幅広いプロトコルをサポートし、無料インターネットにアクセスするための安全でプライベートな方法を提供します。

English Demo @@ -144,7 +144,7 @@ Vless、Vmess、Reality、TUIC、Hysteria、SSHなど。 ## 👩‍🏫 コラボレーションおよび連絡先 -Hiddify Next はコミュニティドリブンのプロジェクトです。コントリビュートすることに興味がある方は、[コントリビューションガイドライン](./CONTRIBUTING.md)をお読みください。私たちは特に以下の分野において、どのような協力でもいただけるとありがたいです: **Flutter、Go、iOS開発(Swift)、Androi d開発(Kotlin)。** +Hiddify はコミュニティドリブンのプロジェクトです。コントリビュートすることに興味がある方は、[コントリビューションガイドライン](./CONTRIBUTING.md)をお読みください。私たちは特に以下の分野において、どのような協力でもいただけるとありがたいです: **Flutter、Go、iOS開発(Swift)、Androi d開発(Kotlin)。**
diff --git a/a.sh b/a.sh new file mode 100644 index 00000000..180258c1 --- /dev/null +++ b/a.sh @@ -0,0 +1,37 @@ + +TARGET_NAME_AppImage="Hiddify-Linux-x64" +TARGET_NAME_deb="Hiddify-Debian-x64" +TARGET_NAME_rpm="Hiddify-rpm-x64" +TARGET_NAME_apk="Hiddify-Android" +TARGET_NAME_aab="Hiddify-Android" +TARGET_NAME_exe="Hiddify-Windows-x64" +TARGET_NAME_dmg="Hiddify-MacOS" +TARGET_NAME_pkg="Hiddify-MacOS-Installer" +TARGET_NAME_ipa="Hiddify-iOS" + +ls -R dist/ + mkdir out + mkdir tmp_out + + for EXT in $(echo AppImage,deb,rpm | tr ',' '\n'); do + KEY=TARGET_NAME_${EXT} + FILENAME=${!KEY} + echo mv dist/*/*.$EXT tmp_out/${FILENAME}.$EXT +echo chmod +x tmp_out/${FILENAME}.$EXT + if [ "linux" == "linux" ];then +echo cp ./.github/help/linux/* tmp_out/ + else +echo cp ./.github/help/mac-windows/* tmp_out/ + fi + if [[ "linux" == 'ios' ]];then +echo mv tmp_out/${FILENAME}.$EXT bin/${FILENAME}.$EXT + else + cd tmp_out +echo 7z a ${FILENAME}.zip ./ +echo mv *.zip ../out/ + if [[ $EXT == 'AppImage' ]];then +echo mv ${FILENAME}.$EXT ../out/${FILENAME}.$EXT # added for appimage link + fi + cd .. + fi + done diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5e87f957..3283a99c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,7 +24,7 @@ android:name=".Application" android:banner="@mipmap/ic_launcher_banner" android:icon="@mipmap/ic_launcher" - android:label="Hiddify Next" + android:label="Hiddify" android:roundIcon="@mipmap/ic_launcher_round" tools:targetApi="31"> diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt index 5eb08620..3be3178a 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/ServiceNotification.kt @@ -51,7 +51,7 @@ class ServiceNotification(private val status: MutableLiveData, private v NotificationCompat.Builder(service, notificationChannel) .setShowWhen(false) .setOngoing(true) - .setContentTitle("Hiddify Next") + .setContentTitle("Hiddify") .setOnlyAlertOnce(true) .setSmallIcon(R.drawable.ic_stat_logo) .setCategory(NotificationCompat.CATEGORY_SERVICE) @@ -90,7 +90,7 @@ class ServiceNotification(private val status: MutableLiveData, private v } service.startForeground( notificationId, notificationBuilder - .setContentTitle(profileName.takeIf { it.isNotBlank() } ?: "Hiddify Next") + .setContentTitle(profileName.takeIf { it.isNotBlank() } ?: "Hiddify") .setContentText(service.getString(contentTextId)).build() ) } diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 1e7cb765..22a68525 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -1,6 +1,6 @@ { "general": { - "appTitle": "Hiddify Next", + "appTitle": "Hiddify", "reset": "Reset", "toggle": { "enabled": "Enabled", @@ -352,8 +352,8 @@ } }, "play": { - "title": "Hiddify Next (Preview)", + "title": "Hiddify (Preview)", "short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", - "full_description": "The key goal of HiddifyNext is to provide a secure, user-friendly and efficient tunneling client. It enables you to route all traffic or selected app traffic to a remote server of your choose, utilizing VPN-Service permission.\n\nNote: We do not provide any server; users are required to ensure their online activities stay private by using use their own self-hosted server or trusted servers. \n \nWe support servers with:\n- Normal V2ray/Xray Subscription Link\n- Clash Subscription Link\n- Sing-Box Subscription Link\n\nWhat is our unique features?\n - User Friendly\n - Optimized and Fast\n - Automatically select LowestPing \n - Show user usage information\n - Easily import sublink by one click using deeplinking \n - Free and No ADS\n - Easily switch user sublinks\n - more and more\n\nSupport:\n- All Protocols supported by Sing-Box \n- VLESS + xtls reality, vision\n- VMESS\n- Trojan\n- ShoadowSocks\n- Reality\n- V2ray\n- Hystria2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nThe source code exist in https://github.com/hiddify/Hiddify-Next\nThe application core is based on open-source sing-box.\n\nPermission Description:\n- VPN Service: As the goal of this application is to provide a secure, user-friendly and efficient tunneling client, we need this permission to be able to route the traffic via tunnel to the remote server. \n- QUERY ALL PACKAGES: This permission is used to allow users to include or exclude specific applications for tunneling.\n- RECEIVE BOOT COMPLETED: This permission can be enabled or disabled from app settings to activate this application upon device boot.\n- POST NOTIFICATIONS: This permission is essential as we employ a foreground service to ensure the continuous operation of the VPN service.\n- This application is free from advertisements. The analytics and crash data only occurs with the explicit consent of the user in the first use of application." + "full_description": "The key goal of Hiddify is to provide a secure, user-friendly and efficient tunneling client. It enables you to route all traffic or selected app traffic to a remote server of your choose, utilizing VPN-Service permission.\n\nNote: We do not provide any server; users are required to ensure their online activities stay private by using use their own self-hosted server or trusted servers. \n \nWe support servers with:\n- Normal V2ray/Xray Subscription Link\n- Clash Subscription Link\n- Sing-Box Subscription Link\n\nWhat is our unique features?\n - User Friendly\n - Optimized and Fast\n - Automatically select LowestPing \n - Show user usage information\n - Easily import sublink by one click using deeplinking \n - Free and No ADS\n - Easily switch user sublinks\n - more and more\n\nSupport:\n- All Protocols supported by Sing-Box \n- VLESS + xtls reality, vision\n- VMESS\n- Trojan\n- ShoadowSocks\n- Reality\n- V2ray\n- Hystria2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nThe source code exist in https://github.com/hiddify/Hiddify-Next\nThe application core is based on open-source sing-box.\n\nPermission Description:\n- VPN Service: As the goal of this application is to provide a secure, user-friendly and efficient tunneling client, we need this permission to be able to route the traffic via tunnel to the remote server. \n- QUERY ALL PACKAGES: This permission is used to allow users to include or exclude specific applications for tunneling.\n- RECEIVE BOOT COMPLETED: This permission can be enabled or disabled from app settings to activate this application upon device boot.\n- POST NOTIFICATIONS: This permission is essential as we employ a foreground service to ensure the continuous operation of the VPN service.\n- This application is free from advertisements. The analytics and crash data only occurs with the explicit consent of the user in the first use of application." } } \ No newline at end of file diff --git a/assets/translations/strings_es.i18n.json b/assets/translations/strings_es.i18n.json index e9fc16c1..81d6abb4 100644 --- a/assets/translations/strings_es.i18n.json +++ b/assets/translations/strings_es.i18n.json @@ -1,7 +1,7 @@ { "general": { "reset": "Renicio", - "appTitle": "Hiddify Next", + "appTitle": "Hiddify", "toggle": { "enabled": "Activado", "disabled": "Desactivado" @@ -340,8 +340,8 @@ }, "play": { "short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", - "full_description": "El objetivo clave de HiddifyNext es proporcionar un cliente de túnel seguro, fácil de usar y eficiente. Le permite enrutar todo el tráfico o el tráfico de aplicaciones seleccionadas a un servidor remoto de su elección, utilizando el permiso del servicio VPN.Nota: No proporcionamos ningún servidor; Los usuarios deben garantizar que sus actividades en línea permanezcan privadas mediante el uso de su propio servidor autohospedado o servidores confiables. Soportamos servidores con:- Enlace de suscripción normal a V2ray/Xray- Enlace de suscripción a Choque- Enlace de suscripción a Sing-Box¿Cuáles son nuestras características únicas? - Fácil de usar - Optimizado y Rápido - Seleccionar automáticamente LowestPing - Mostrar información de uso del usuario. - Importe fácilmente un subvínculo con un solo clic mediante enlaces profundos - Gratis y sin anuncios - Cambie fácilmente los subvínculos de usuario - más y másApoyo:- Todos los protocolos soportados por Sing-Box- VLESS + xtls realidad, visión- VMESS- troyano- Calcetines Shoadow- Realidad-V2ray-Histria2-TUIC-SSH- SombraTLSEl código fuente existe en https://github.com/hiddify/Hiddify-NextEl núcleo de la aplicación se basa en sing-box de código abierto.Descripción del permiso:- Servicio VPN: como el objetivo de esta aplicación es proporcionar un cliente de túnel seguro, fácil de usar y eficiente, necesitamos este permiso para poder enrutar el tráfico a través del túnel al servidor remoto.- CONSULTAR TODOS LOS PAQUETES: este permiso se utiliza para permitir a los usuarios incluir o excluir aplicaciones específicas para la tunelización.- RECIBIR ARRANQUE COMPLETADO: este permiso se puede habilitar o deshabilitar desde la configuración de la aplicación para activar esta aplicación al iniciar el dispositivo.- PUBLICAR NOTIFICACIONES: este permiso es esencial ya que empleamos un servicio en primer plano para garantizar el funcionamiento continuo del servicio VPN.- Esta aplicación está libre de publicidad. Los datos analíticos y de fallos solo se producen con el consentimiento explícito del usuario en el primer uso de la aplicación.", - "title": "Hiddify Next (vista previa)" + "full_description": "El objetivo clave de Hiddify es proporcionar un cliente de túnel seguro, fácil de usar y eficiente. Le permite enrutar todo el tráfico o el tráfico de aplicaciones seleccionadas a un servidor remoto de su elección, utilizando el permiso del servicio VPN.Nota: No proporcionamos ningún servidor; Los usuarios deben garantizar que sus actividades en línea permanezcan privadas mediante el uso de su propio servidor autohospedado o servidores confiables. Soportamos servidores con:- Enlace de suscripción normal a V2ray/Xray- Enlace de suscripción a Choque- Enlace de suscripción a Sing-Box¿Cuáles son nuestras características únicas? - Fácil de usar - Optimizado y Rápido - Seleccionar automáticamente LowestPing - Mostrar información de uso del usuario. - Importe fácilmente un subvínculo con un solo clic mediante enlaces profundos - Gratis y sin anuncios - Cambie fácilmente los subvínculos de usuario - más y másApoyo:- Todos los protocolos soportados por Sing-Box- VLESS + xtls realidad, visión- VMESS- troyano- Calcetines Shoadow- Realidad-V2ray-Histria2-TUIC-SSH- SombraTLSEl código fuente existe en https://github.com/hiddify/Hiddify-NextEl núcleo de la aplicación se basa en sing-box de código abierto.Descripción del permiso:- Servicio VPN: como el objetivo de esta aplicación es proporcionar un cliente de túnel seguro, fácil de usar y eficiente, necesitamos este permiso para poder enrutar el tráfico a través del túnel al servidor remoto.- CONSULTAR TODOS LOS PAQUETES: este permiso se utiliza para permitir a los usuarios incluir o excluir aplicaciones específicas para la tunelización.- RECIBIR ARRANQUE COMPLETADO: este permiso se puede habilitar o deshabilitar desde la configuración de la aplicación para activar esta aplicación al iniciar el dispositivo.- PUBLICAR NOTIFICACIONES: este permiso es esencial ya que empleamos un servicio en primer plano para garantizar el funcionamiento continuo del servicio VPN.- Esta aplicación está libre de publicidad. Los datos analíticos y de fallos solo se producen con el consentimiento explícito del usuario en el primer uso de la aplicación.", + "title": "Hiddify (vista previa)" }, "intro": { "termsAndPolicyCaution(rich)": "al continuar, aceptas ${tap(@:about.termsAndConditions)}", diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index b64e83d2..514c1a5a 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -1,6 +1,6 @@ { "general": { - "appTitle": "هیدیفای نکست", + "appTitle": "هیدیفای", "reset": "بازنشانی", "toggle": { "enabled": "فعال", @@ -352,8 +352,8 @@ } }, "play": { - "title": "هیدیفای نکست Hiddify Next", + "title": "هیدیفای نکست Hiddify", "short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", - "full_description": "هدف اصلی HiddifyNext ارائه یک کلاینت تونل زنی ایمن، کاربرپسند و کارآمد است. این به شما امکان می دهد تا با استفاده از مجوز VPN-Service، تمام ترافیک یا ترافیک برنامه انتخابی را به یک سرور راه دور مورد نظر خود هدایت کنید.\n\nتوجه: ما هیچ سروری ارائه نمی دهیم. کاربران موظفند با استفاده از سرورهای خود میزبان یا سرورهای مورد اعتماد، فعالیت‌های آنلاین خود را خصوصی نگه دارند.\n \nما از سرورهایی با موارد زیر پشتیبانی می کنیم:\n- لینک اشتراک V2ray/Xray معمولی\n- لینک اشتراک کلش\n- لینک اشتراک Sing-Box\n\nویژگی های منحصر به فرد ما چیست؟\n - کاربر پسند\n - بهینه و سریع\n - به طور خودکار LowestPing را انتخاب کنید\n - نمایش اطلاعات استفاده کاربر\n - به راحتی لینک فرعی را با یک کلیک با استفاده از دیپ لینک وارد کنید\n - رایگان و بدون تبلیغات\n - به راحتی پیوندهای فرعی کاربر را تغییر دهید\n - بیشتر و بیشتر\n\nحمایت کردن:\n- تمام پروتکل های پشتیبانی شده توسط Sing-Box\n- VLESS + xtls \n- VMESS\n- تروجان\n- ShoadowSocks\n- ریالیتی\n- V2ray\n- هیستریا 2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nکد منبع در https://github.com/hiddify/Hiddify-Next وجود دارد\nهسته برنامه بر اساس sing-box منبع باز است.\n\nتوضیحات مجوز:\n- سرویس VPN: از آنجا که هدف این برنامه ارائه یک کلاینت تونل زنی ایمن، کاربر پسند و کارآمد است، ما به این مجوز نیاز داریم تا بتوانیم ترافیک را از طریق تونل به سرور راه دور هدایت کنیم.\n- QUERY ALL PACKAGES: این مجوز برای اجازه دادن به کاربران برای گنجاندن یا حذف برنامه های کاربردی خاص برای تونل زدن استفاده می شود.\n- دریافت بوت تکمیل شد: این مجوز را می توان از تنظیمات برنامه فعال یا غیرفعال کرد تا این برنامه پس از بوت شدن دستگاه فعال شود.\n- اعلان های ارسالی: این مجوز ضروری است زیرا ما از یک سرویس پیش زمینه برای اطمینان از عملکرد مداوم سرویس VPN استفاده می کنیم.\n- این برنامه بدون تبلیغات است. تجزیه و تحلیل و داده های اشکال فقط با رضایت صریح کاربر در اولین استفاده از برنامه اتفاق می افتد." + "full_description": "هدف اصلی Hiddify ارائه یک کلاینت تونل زنی ایمن، کاربرپسند و کارآمد است. این به شما امکان می دهد تا با استفاده از مجوز VPN-Service، تمام ترافیک یا ترافیک برنامه انتخابی را به یک سرور راه دور مورد نظر خود هدایت کنید.\n\nتوجه: ما هیچ سروری ارائه نمی دهیم. کاربران موظفند با استفاده از سرورهای خود میزبان یا سرورهای مورد اعتماد، فعالیت‌های آنلاین خود را خصوصی نگه دارند.\n \nما از سرورهایی با موارد زیر پشتیبانی می کنیم:\n- لینک اشتراک V2ray/Xray معمولی\n- لینک اشتراک کلش\n- لینک اشتراک Sing-Box\n\nویژگی های منحصر به فرد ما چیست؟\n - کاربر پسند\n - بهینه و سریع\n - به طور خودکار LowestPing را انتخاب کنید\n - نمایش اطلاعات استفاده کاربر\n - به راحتی لینک فرعی را با یک کلیک با استفاده از دیپ لینک وارد کنید\n - رایگان و بدون تبلیغات\n - به راحتی پیوندهای فرعی کاربر را تغییر دهید\n - بیشتر و بیشتر\n\nحمایت کردن:\n- تمام پروتکل های پشتیبانی شده توسط Sing-Box\n- VLESS + xtls \n- VMESS\n- تروجان\n- ShoadowSocks\n- ریالیتی\n- V2ray\n- هیستریا 2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nکد منبع در https://github.com/hiddify/Hiddify-Next وجود دارد\nهسته برنامه بر اساس sing-box منبع باز است.\n\nتوضیحات مجوز:\n- سرویس VPN: از آنجا که هدف این برنامه ارائه یک کلاینت تونل زنی ایمن، کاربر پسند و کارآمد است، ما به این مجوز نیاز داریم تا بتوانیم ترافیک را از طریق تونل به سرور راه دور هدایت کنیم.\n- QUERY ALL PACKAGES: این مجوز برای اجازه دادن به کاربران برای گنجاندن یا حذف برنامه های کاربردی خاص برای تونل زدن استفاده می شود.\n- دریافت بوت تکمیل شد: این مجوز را می توان از تنظیمات برنامه فعال یا غیرفعال کرد تا این برنامه پس از بوت شدن دستگاه فعال شود.\n- اعلان های ارسالی: این مجوز ضروری است زیرا ما از یک سرویس پیش زمینه برای اطمینان از عملکرد مداوم سرویس VPN استفاده می کنیم.\n- این برنامه بدون تبلیغات است. تجزیه و تحلیل و داده های اشکال فقط با رضایت صریح کاربر در اولین استفاده از برنامه اتفاق می افتد." } } \ No newline at end of file diff --git a/assets/translations/strings_ru.i18n.json b/assets/translations/strings_ru.i18n.json index 707eac4a..8479023f 100644 --- a/assets/translations/strings_ru.i18n.json +++ b/assets/translations/strings_ru.i18n.json @@ -1,6 +1,6 @@ { "general": { - "appTitle": "Hiddify Next", + "appTitle": "Hiddify", "reset": "Сброс", "toggle": { "enabled": "Включено", @@ -352,8 +352,8 @@ } }, "play": { - "title": "Hiddify Next (Preview)", + "title": "Hiddify (Preview)", "short_description": "Автовыбор, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", - "full_description": "Основная цель HiddifyNext — предоставить безопасный, удобный и эффективный клиент туннелирования. Он позволяет направлять весь трафик или трафик выбранного приложения на указанный Вами удалённый сервер.\nПримечание: мы не предоставляем серверы, пользователи должны сами обеспечивать конфиденциальность своих действий в Интернете, используя собственный сервер или доверенные серверы. Поддерживаются сервера с:— Обычной ссылка на подписку V2ray/Xray— Ссылкой на подписку Clash— Ссылко на подписку на Sing–Box\nВ чём уникальные особенности? — Удобство — Оптимизация и скорость — Автоматический выбор минимальной задержки — Отображение информации об использовании — Простой импорт ссылок одним щелчком мыши — Бесплатно и без рекламы — Простое переключение ссылок — …и много больше\nПоддерживаются:• Все протоколы, поддерживаемые Sing-Box• VLESS + xtls reality, vision• VMESS• Trojan• ShoadowSocks• Reality• V2ray• Hystria2• TUIC• SSH• ShadowTLS\nИсходный код доступен по адресу https://github.com/hiddify/Hiddify-Next.Ядро приложения основано на открытом исходном коде Sing–Box.\nОписание разрешений:— СЛУЖБА VPN: поскольку целью данного приложения является предоставление безопасного, удобного и эффективного клиента туннелирования, это разрешение необходимо, чтобы иметь возможность направлять трафик через туннель на удалённый сервер.— ЗАПРОС ВСЕХ ПАКЕТОВ: это разрешение позволяет добавлять или удалять определённые приложения из списка для туннелирования.— ИНФОРМИРОВАНИЕ О ЗАВЕРШЕНИИ ЗАГРУЗКИ: это разрешение можно включить или отключить в настройках приложения, чтобы (де)активировать запуск приложения при загрузке устройства.— ПОСТОЯННОЕ УВЕДОМЛЕНИЕ: это разрешение необходимо, так как используется приоритетная служба для обеспечения непрерывной работы VPN.— Приложение не содержит рекламы. Сбор аналитики и данных о сбоях происходят только с явного согласия пользователя при первом использовании приложения." + "full_description": "Основная цель Hiddify — предоставить безопасный, удобный и эффективный клиент туннелирования. Он позволяет направлять весь трафик или трафик выбранного приложения на указанный Вами удалённый сервер.\nПримечание: мы не предоставляем серверы, пользователи должны сами обеспечивать конфиденциальность своих действий в Интернете, используя собственный сервер или доверенные серверы. Поддерживаются сервера с:— Обычной ссылка на подписку V2ray/Xray— Ссылкой на подписку Clash— Ссылко на подписку на Sing–Box\nВ чём уникальные особенности? — Удобство — Оптимизация и скорость — Автоматический выбор минимальной задержки — Отображение информации об использовании — Простой импорт ссылок одним щелчком мыши — Бесплатно и без рекламы — Простое переключение ссылок — …и много больше\nПоддерживаются:• Все протоколы, поддерживаемые Sing-Box• VLESS + xtls reality, vision• VMESS• Trojan• ShoadowSocks• Reality• V2ray• Hystria2• TUIC• SSH• ShadowTLS\nИсходный код доступен по адресу https://github.com/hiddify/Hiddify-Next.Ядро приложения основано на открытом исходном коде Sing–Box.\nОписание разрешений:— СЛУЖБА VPN: поскольку целью данного приложения является предоставление безопасного, удобного и эффективного клиента туннелирования, это разрешение необходимо, чтобы иметь возможность направлять трафик через туннель на удалённый сервер.— ЗАПРОС ВСЕХ ПАКЕТОВ: это разрешение позволяет добавлять или удалять определённые приложения из списка для туннелирования.— ИНФОРМИРОВАНИЕ О ЗАВЕРШЕНИИ ЗАГРУЗКИ: это разрешение можно включить или отключить в настройках приложения, чтобы (де)активировать запуск приложения при загрузке устройства.— ПОСТОЯННОЕ УВЕДОМЛЕНИЕ: это разрешение необходимо, так как используется приоритетная служба для обеспечения непрерывной работы VPN.— Приложение не содержит рекламы. Сбор аналитики и данных о сбоях происходят только с явного согласия пользователя при первом использовании приложения." } } \ No newline at end of file diff --git a/assets/translations/strings_tr.i18n.json b/assets/translations/strings_tr.i18n.json index 428e1a8c..bc196c12 100644 --- a/assets/translations/strings_tr.i18n.json +++ b/assets/translations/strings_tr.i18n.json @@ -1,6 +1,6 @@ { "general": { - "appTitle": "Hiddify Next", + "appTitle": "Hiddify", "reset": "Sıfırla", "toggle": { "enabled": "Etkin", @@ -352,8 +352,8 @@ } }, "play": { - "title": "Hiddify Next (Önizleme)", + "title": "Hiddify (Önizleme)", "short_description": "Otomatik, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", - "full_description": "HiddifyNext'in temel hedefi güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamaktır. VPN Hizmeti iznini kullanarak tüm trafiği veya seçilen uygulama trafiğini seçtiğiniz uzak bir sunucuya yönlendirmenizi sağlar. Not: Herhangi bir sunucu sağlamıyoruz; kullanıcıların kendi barındırılan sunucularını veya güvenilir sunucularını kullanarak çevrimiçi etkinliklerinin gizli kalmasını sağlamaları gerekir. Sunucuları aşağıdakilerle destekliyoruz: - Normal V2ray/Xray Abonelik Bağlantısı - Clash Abonelik Bağlantısı - Sing-Box Abonelik Bağlantısı Benzersiz özelliklerimiz nelerdir? - Kullanıcı Dostu - Optimize Edilmiş ve Hızlı - En Düşük Ping'i otomatik olarak seçin - Kullanıcı kullanım bilgilerini gösterin - Derin bağlantı kullanarak tek tıklamayla alt bağlantıyı kolayca içe aktarın - Ücretsiz ve ADS Yok - Kullanıcı alt bağlantılarını kolayca değiştirin - giderek daha fazla Destek: - Sing-Box tarafından desteklenen tüm Protokoller - VLESS + xtls gerçeklik, vizyon - VMESS - Trojan - ShoadowSocks - Reality - V2ray - Hystria2 - TUIC - SSH - ShadowTLS Kaynak kodu https://github.com/hiddify/Hiddify-Next adresinde mevcuttur. Uygulama çekirdeği açık tabanlıdır. kaynak şarkı kutusu. İzin Açıklaması: - VPN Hizmeti: Bu uygulamanın amacı güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamak olduğundan, trafiği tünel aracılığıyla uzak sunucuya yönlendirebilmek için bu izne ihtiyacımız var. - TÜM PAKETLERİ SORGULAYIN: Bu izin, kullanıcıların tünelleme için belirli uygulamaları dahil etmesine veya hariç tutmasına izin vermek için kullanılır. - ALMA ÖNYÜKLEME TAMAMLANDI: Bu izin, cihaz önyüklemesi sırasında bu uygulamayı etkinleştirmek için uygulama ayarlarından etkinleştirilebilir veya devre dışı bırakılabilir. - BİLDİRİMLER SONRASI: VPN hizmetinin sürekli çalışmasını sağlamak için bir ön plan hizmeti kullandığımız için bu izin önemlidir. - Bu uygulama reklam içermez. Analitik ve kilitlenme verileri yalnızca uygulamanın ilk kullanımında kullanıcının açık rızası ile gerçekleşir." + "full_description": "Hiddify'in temel hedefi güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamaktır. VPN Hizmeti iznini kullanarak tüm trafiği veya seçilen uygulama trafiğini seçtiğiniz uzak bir sunucuya yönlendirmenizi sağlar. Not: Herhangi bir sunucu sağlamıyoruz; kullanıcıların kendi barındırılan sunucularını veya güvenilir sunucularını kullanarak çevrimiçi etkinliklerinin gizli kalmasını sağlamaları gerekir. Sunucuları aşağıdakilerle destekliyoruz: - Normal V2ray/Xray Abonelik Bağlantısı - Clash Abonelik Bağlantısı - Sing-Box Abonelik Bağlantısı Benzersiz özelliklerimiz nelerdir? - Kullanıcı Dostu - Optimize Edilmiş ve Hızlı - En Düşük Ping'i otomatik olarak seçin - Kullanıcı kullanım bilgilerini gösterin - Derin bağlantı kullanarak tek tıklamayla alt bağlantıyı kolayca içe aktarın - Ücretsiz ve ADS Yok - Kullanıcı alt bağlantılarını kolayca değiştirin - giderek daha fazla Destek: - Sing-Box tarafından desteklenen tüm Protokoller - VLESS + xtls gerçeklik, vizyon - VMESS - Trojan - ShoadowSocks - Reality - V2ray - Hystria2 - TUIC - SSH - ShadowTLS Kaynak kodu https://github.com/hiddify/Hiddify-Next adresinde mevcuttur. Uygulama çekirdeği açık tabanlıdır. kaynak şarkı kutusu. İzin Açıklaması: - VPN Hizmeti: Bu uygulamanın amacı güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamak olduğundan, trafiği tünel aracılığıyla uzak sunucuya yönlendirebilmek için bu izne ihtiyacımız var. - TÜM PAKETLERİ SORGULAYIN: Bu izin, kullanıcıların tünelleme için belirli uygulamaları dahil etmesine veya hariç tutmasına izin vermek için kullanılır. - ALMA ÖNYÜKLEME TAMAMLANDI: Bu izin, cihaz önyüklemesi sırasında bu uygulamayı etkinleştirmek için uygulama ayarlarından etkinleştirilebilir veya devre dışı bırakılabilir. - BİLDİRİMLER SONRASI: VPN hizmetinin sürekli çalışmasını sağlamak için bir ön plan hizmeti kullandığımız için bu izin önemlidir. - Bu uygulama reklam içermez. Analitik ve kilitlenme verileri yalnızca uygulamanın ilk kullanımında kullanıcının açık rızası ile gerçekleşir." } } \ No newline at end of file diff --git a/assets/translations/strings_zh-CN.i18n.json b/assets/translations/strings_zh-CN.i18n.json index 9679ac95..8e2843d7 100644 --- a/assets/translations/strings_zh-CN.i18n.json +++ b/assets/translations/strings_zh-CN.i18n.json @@ -1,6 +1,6 @@ { "general": { - "appTitle": "Hiddify Next", + "appTitle": "Hiddify", "reset": "重置", "toggle": { "enabled": "启用", @@ -352,8 +352,8 @@ } }, "play": { - "title": "Hiddify Next(预览)", + "title": "Hiddify(预览)", "short_description": "自动,SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", - "full_description": "HiddifyNext 的主要目标是提供安全、用户友好且高效的隧道客户端。它使您能够利用 VPN 服务权限将所有流量或选定的应用程序流量路由到您选择的远程服务器。\n\n注:我们不提供任何服务器;用户需要使用自己托管的服务器或可信的服务器来确保您在线活动的私密性。\n \n我们支持以下类型的服务器:\n- 普通 V2ray/Xray 订阅链接\n- Clash 订阅链接\n- Sing-Box 订阅链接\n\n我们的特色是什么?\n\n- 用户友好\n- 优化和高速\n- 自动选择最低延迟\n- 显示用户使用信息\n- 通过一键链接轻松导入\n- 免费且无广告\n- 轻松切换线路\n- 等等\n\n支持:\n- Sing-Box 支持的所有协议\n- VLESS + XTLS Reality、Vision 协议\n- VMESS\n- Trojan\n- Shoadowsocks\n- Reality\n- V2ray\n- Hystria2\n- TUIC\n- SSH\n- ShadowTLS\n\n\n源代码位于 https://github.com/hiddify/Hiddify-Next\n应用程序核心基于开源的 Sing-Box。\n\n权限说明:\n\n- VPN 服务:由于此应用程序的目标是提供安全、用户友好和高效的隧道客户端,我们需要此权限以能够通过隧道将流量路由到远程服务器。\n获取应用程序列表:此权限用于允许用户包括或排除特定应用程序以进行隧道传输。\n- 接收开机广播:可以从应用程序设置中启用或禁用此权限,以便在设备启动时激活此应用程序。\n- 发送通知:此权限是必需的,因为我们使用前台服务来确保 VPN 服务的持续运行。\n- 本应用程序没有广告。分析和崩溃数据仅在首次使用应用程序时经用户明确同意的情况下发生。" + "full_description": "Hiddify 的主要目标是提供安全、用户友好且高效的隧道客户端。它使您能够利用 VPN 服务权限将所有流量或选定的应用程序流量路由到您选择的远程服务器。\n\n注:我们不提供任何服务器;用户需要使用自己托管的服务器或可信的服务器来确保您在线活动的私密性。\n \n我们支持以下类型的服务器:\n- 普通 V2ray/Xray 订阅链接\n- Clash 订阅链接\n- Sing-Box 订阅链接\n\n我们的特色是什么?\n\n- 用户友好\n- 优化和高速\n- 自动选择最低延迟\n- 显示用户使用信息\n- 通过一键链接轻松导入\n- 免费且无广告\n- 轻松切换线路\n- 等等\n\n支持:\n- Sing-Box 支持的所有协议\n- VLESS + XTLS Reality、Vision 协议\n- VMESS\n- Trojan\n- Shoadowsocks\n- Reality\n- V2ray\n- Hystria2\n- TUIC\n- SSH\n- ShadowTLS\n\n\n源代码位于 https://github.com/hiddify/Hiddify-Next\n应用程序核心基于开源的 Sing-Box。\n\n权限说明:\n\n- VPN 服务:由于此应用程序的目标是提供安全、用户友好和高效的隧道客户端,我们需要此权限以能够通过隧道将流量路由到远程服务器。\n获取应用程序列表:此权限用于允许用户包括或排除特定应用程序以进行隧道传输。\n- 接收开机广播:可以从应用程序设置中启用或禁用此权限,以便在设备启动时激活此应用程序。\n- 发送通知:此权限是必需的,因为我们使用前台服务来确保 VPN 服务的持续运行。\n- 本应用程序没有广告。分析和崩溃数据仅在首次使用应用程序时经用户明确同意的情况下发生。" } } \ No newline at end of file diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 00000000..7e7e7f67 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index f4918fc6..7418fefa 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -9,7 +9,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Hiddify Next + Hiddify CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/lib/core/model/constants.dart b/lib/core/model/constants.dart index fcb7bddf..060c9865 100644 --- a/lib/core/model/constants.dart +++ b/lib/core/model/constants.dart @@ -1,5 +1,5 @@ abstract class Constants { - static const appName = "Hiddify Next"; + static const appName = "Hiddify"; static const githubUrl = "https://github.com/hiddify/hiddify-next"; static const githubReleasesApiUrl = "https://api.github.com/repos/hiddify/hiddify-next/releases"; diff --git a/lib/features/proxy/widget/proxy_tile.dart b/lib/features/proxy/widget/proxy_tile.dart index b8474295..7e305d61 100644 --- a/lib/features/proxy/widget/proxy_tile.dart +++ b/lib/features/proxy/widget/proxy_tile.dart @@ -51,7 +51,7 @@ class ProxyTile extends HookConsumerWidget with PresLogger { ), trailing: proxy.urlTestDelay != 0 ? Text( - proxy.urlTestDelay > 65000 ? "x" : proxy.urlTestDelay.toString(), + proxy.urlTestDelay > 65000 ? "×" : proxy.urlTestDelay.toString(), style: TextStyle(color: delayColor(context, proxy.urlTestDelay)), ) : null, diff --git a/lib/features/window/notifier/window_notifier.dart b/lib/features/window/notifier/window_notifier.dart index e7fbbda7..05996432 100644 --- a/lib/features/window/notifier/window_notifier.dart +++ b/lib/features/window/notifier/window_notifier.dart @@ -19,7 +19,7 @@ class WindowNotifier extends _$WindowNotifier with AppLogger { // if (Platform.isWindows) { // loggy.debug("ensuring single instance"); - // await WindowsSingleInstance.ensureSingleInstance([], "HiddifyNext"); + // await WindowsSingleInstance.ensureSingleInstance([], "Hiddify"); // } await windowManager.ensureInitialized(); diff --git a/libcore b/libcore index 66e8beac..790fd73d 160000 --- a/libcore +++ b/libcore @@ -1 +1 @@ -Subproject commit 66e8beac53efce8ca73180bc0e23e0a81bd5045c +Subproject commit 790fd73d5378f9a110ff272445685de495065a91 diff --git a/linux/my_application.cc b/linux/my_application.cc index a4d15de0..65326859 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, "Hiddify Next"); + gtk_header_bar_set_title(header_bar, "Hiddify"); 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, "Hiddify Next"); + gtk_window_set_title(window, "Hiddify"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/linux/packaging/appimage/make_config.yaml b/linux/packaging/appimage/make_config.yaml index 684704e8..3d167cfe 100644 --- a/linux/packaging/appimage/make_config.yaml +++ b/linux/packaging/appimage/make_config.yaml @@ -1,4 +1,4 @@ -display_name: HiddifyNext +display_name: Hiddify icon: ./assets/images/source/ic_launcher_border.png diff --git a/linux/packaging/deb/make_config.yaml b/linux/packaging/deb/make_config.yaml index f20201df..a7f6a47a 100644 --- a/linux/packaging/deb/make_config.yaml +++ b/linux/packaging/deb/make_config.yaml @@ -1,5 +1,5 @@ -display_name: HiddifyNext -package_name: hiddify-next +display_name: Hiddify +package_name: hiddify maintainer: name: hiddify email: linux@hiddify.com @@ -11,11 +11,10 @@ essential: false icon: ./assets/images/source/ic_launcher_border.png postinstall_scripts: - - echo "Installed Hiddify Next" + - echo "Installed Hiddify" postuninstall_scripts: - echo "Surprised Why?" - keywords: - Hiddify - Proxy @@ -26,10 +25,9 @@ keywords: - Psiphon - OpenVPN - generic_name: Hiddify categories: - Network -startup_notify: true \ No newline at end of file +startup_notify: true diff --git a/linux/packaging/rpm/make_config.yaml b/linux/packaging/rpm/make_config.yaml index 1e474649..376386bc 100644 --- a/linux/packaging/rpm/make_config.yaml +++ b/linux/packaging/rpm/make_config.yaml @@ -1,8 +1,7 @@ -display_name: HiddifyNext +display_name: Hiddify url: https://github.com/hiddify/hiddify-next/ license: Other - packager: hiddify packagerEmail: linux@hiddify.com @@ -22,9 +21,8 @@ keywords: - Psiphon - OpenVPN - generic_name: Hiddify group: Applications/Internet -startup_notify: true \ No newline at end of file +startup_notify: true diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 853a59de..b5bef7a0 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -71,7 +71,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 /* Hiddify Next.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Hiddify Next.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* Hiddify.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Hiddify.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 = ""; }; @@ -161,7 +161,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* Hiddify Next.app */, + 33CC10ED2044A3C60003C045 /* Hiddify.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -252,7 +252,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* Hiddify Next.app */; + productReference = 33CC10ED2044A3C60003C045 /* Hiddify.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -574,7 +574,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Hiddify Next"; + INFOPLIST_KEY_CFBundleDisplayName = "Hiddify"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -702,7 +702,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Hiddify Next"; + INFOPLIST_KEY_CFBundleDisplayName = "Hiddify"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -724,7 +724,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Hiddify Next"; + INFOPLIST_KEY_CFBundleDisplayName = "Hiddify"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 4a5f8690..b322df55 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/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 92a1cc71..7860ed54 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,7 +5,7 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = Hiddify Next +PRODUCT_NAME = Hiddify // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = app.hiddify.com diff --git a/macos/packaging/dmg/make_config.yaml b/macos/packaging/dmg/make_config.yaml index 09fa419b..4c545c51 100644 --- a/macos/packaging/dmg/make_config.yaml +++ b/macos/packaging/dmg/make_config.yaml @@ -7,4 +7,4 @@ contents: - x: 192 y: 344 type: file - path: Hiddify Next.app + path: Hiddify.app diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 01966e1b..f2e97534 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -4,7 +4,7 @@ project(hiddify LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "HiddifyNext") +set(BINARY_NAME "Hiddify") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/windows/packaging/exe/make_config.yaml b/windows/packaging/exe/make_config.yaml index abb3c636..7f20b076 100644 --- a/windows/packaging/exe/make_config.yaml +++ b/windows/packaging/exe/make_config.yaml @@ -1,9 +1,9 @@ app_id: 6L903538-42B1-4596-G479-BJ779F21A65D publisher: Hiddify publisher_url: https://github.com/hiddify/hiddify-next -display_name: Hiddify Next -executable_name: HiddifyNext.exe -output_base_file_name: HiddifyNext.exe +display_name: Hiddify +executable_name: Hiddify.exe +output_base_file_name: Hiddify.exe create_desktop_icon: true install_dir_name: "{autopf64}\\hiddify" setup_icon_file: ..\..\windows\runner\resources\app_icon.ico diff --git a/windows/packaging/msix/make_config.yaml b/windows/packaging/msix/make_config.yaml index 05d75687..e24f7556 100644 --- a/windows/packaging/msix/make_config.yaml +++ b/windows/packaging/msix/make_config.yaml @@ -1,6 +1,6 @@ -display_name: Hiddify Next +display_name: Hiddify publisher_display_name: Hiddify identity_name: app.hiddify.com msix_version: 1.0.0.0 -logo_path: windows\runner\resources\app_icon.ico -capabilities: internetClient, privateNetworkClientServer \ No newline at end of file +logo_path: windows\runner\resources\app_icon.ico +capabilities: internetClient, privateNetworkClientServer diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 511b6b8f..30ae4ef8 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -94,7 +94,7 @@ BEGIN VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "hiddify" "\0" VALUE "LegalCopyright", "Copyright (C) 2023 Hiddify.com. All rights reserved." "\0" - VALUE "OriginalFilename", "HiddifyNext.exe" "\0" + VALUE "OriginalFilename", "Hiddify.exe" "\0" VALUE "ProductName", "hiddify" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 9681dfea..63ed8bfe 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -10,14 +10,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, _In_ wchar_t *command_line, _In_ int show_command) { HANDLE hMutexInstance = CreateMutex(NULL, TRUE, L"HiddifyMutex"); - HWND handle = FindWindowA(NULL, "Hiddify Next"); + HWND handle = FindWindowA(NULL, "Hiddify"); if (GetLastError() == ERROR_ALREADY_EXISTS) { flutter::DartProject project(L"data"); std::vector command_line_arguments = GetCommandLineArguments(); project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); FlutterWindow window(project); - if (window.SendAppLinkToInstance(L"Hiddify Next")) { + if (window.SendAppLinkToInstance(L"Hiddify")) { return false; } @@ -47,7 +47,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.Create(L"Hiddify Next", origin, size)) { + if (!window.Create(L"Hiddify", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); From 139e19118906ed860339998ee1cc59514e729fe2 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Sat, 10 Feb 2024 13:08:18 +0100 Subject: [PATCH 36/83] new: change app icon to stable --- .../AppIcon.appiconset/Contents.json | 38 +++++++++--------- .../Icon-App-1024x1024@1x.png | Bin 11676 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 314 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 524 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 728 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 416 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 993 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 524 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 924 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 1301 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 1301 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1979 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 886 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1659 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1790 -> 0 bytes .../AppIcon.appiconset/ipad/app-icon-1024.png | Bin 0 -> 16404 bytes .../AppIcon.appiconset/ipad/app-icon-20.png | Bin 0 -> 358 bytes .../ipad/app-icon-20@2x.png | Bin 0 -> 597 bytes .../AppIcon.appiconset/ipad/app-icon-29.png | Bin 0 -> 461 bytes .../ipad/app-icon-29@2x.png | Bin 0 -> 803 bytes .../AppIcon.appiconset/ipad/app-icon-40.png | Bin 0 -> 597 bytes .../ipad/app-icon-40@2x.png | Bin 0 -> 1047 bytes .../AppIcon.appiconset/ipad/app-icon-76.png | Bin 0 -> 982 bytes .../ipad/app-icon-76@2x.png | Bin 0 -> 1799 bytes .../ipad/app-icon-83.5@2x.png | Bin 0 -> 1783 bytes .../iphone/app-icon-1024.png | Bin 0 -> 16404 bytes .../iphone/app-icon-20@2x.png | Bin 0 -> 597 bytes .../iphone/app-icon-20@3x.png | Bin 0 -> 772 bytes .../AppIcon.appiconset/iphone/app-icon-29.png | Bin 0 -> 461 bytes .../iphone/app-icon-29@2x.png | Bin 0 -> 803 bytes .../iphone/app-icon-29@3x.png | Bin 0 -> 1074 bytes .../iphone/app-icon-40@2x.png | Bin 0 -> 1047 bytes .../iphone/app-icon-40@3x.png | Bin 0 -> 1456 bytes .../iphone/app-icon-60@2x.png | Bin 0 -> 1456 bytes .../iphone/app-icon-60@3x.png | Bin 0 -> 2179 bytes .../tvOS/app-icon-back-1280x768.png | Bin 0 -> 5609 bytes .../tvOS/app-icon-back-400.png | Bin 0 -> 948 bytes .../tvOS/app-icon-back-400@2x.png | Bin 0 -> 2596 bytes .../tvOS/app-icon-front-1280x768.png | Bin 0 -> 10478 bytes .../tvOS/app-icon-front-400.png | Bin 0 -> 2680 bytes .../tvOS/app-icon-front-400@2x.png | Bin 0 -> 5746 bytes .../tvOS/app-icon-middle-1280x768.png | Bin 0 -> 10477 bytes .../tvOS/app-icon-middle-400.png | Bin 0 -> 2738 bytes .../tvOS/app-icon-middle-400@2x.png | Bin 0 -> 5774 bytes .../Assets.xcassets/LaunchImage.imageset.zip | Bin 0 -> 18560 bytes .../AppIcon.appiconset/app-icon-1024.png | Bin 0 -> 16404 bytes .../AppIcon.appiconset/app-icon-128.png | Bin 0 -> 4773 bytes .../AppIcon.appiconset/app-icon-128@2x.png | Bin 0 -> 12888 bytes .../AppIcon.appiconset/app-icon-16.png | Bin 0 -> 412 bytes .../AppIcon.appiconset/app-icon-16@2x.png | Bin 0 -> 845 bytes .../AppIcon.appiconset/app-icon-256.png | Bin 0 -> 12888 bytes .../AppIcon.appiconset/app-icon-256@2x.png | Bin 0 -> 37227 bytes .../AppIcon.appiconset/app-icon-32.png | Bin 0 -> 845 bytes .../AppIcon.appiconset/app-icon-32@2x.png | Bin 0 -> 1842 bytes .../AppIcon.appiconset/app-icon-512.png | Bin 0 -> 37227 bytes .../AppIcon.appiconset/app-icon-512@2x.png | Bin 0 -> 123954 bytes .../AppIcon.appiconset/app_icon_1024.png | Bin 77508 -> 0 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 5035 -> 0 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 341 -> 0 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 11480 -> 0 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 677 -> 0 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 28718 -> 0 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 1518 -> 0 bytes 64 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-1024.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-20.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-29.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-40.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-76.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-1024.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-29.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-1280x768.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-400.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-400@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-1280x768.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-400.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-400@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-1280x768.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-400.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-400@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset.zip create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-128.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-128@2x.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-16.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-16@2x.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-256.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-256@2x.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-32.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-32@2x.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-512.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-512@2x.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index eabd8512..2efa0ba0 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,115 +1,115 @@ { "images": [ { - "filename": "Icon-App-20x20@2x.png", + "filename": "iphone/app-icon-20@2x.png", "idiom": "iphone", "scale": "2x", "size": "20x20" }, { - "filename": "Icon-App-20x20@3x.png", + "filename": "iphone/app-icon-20@3x.png", "idiom": "iphone", "scale": "3x", "size": "20x20" }, { - "filename": "Icon-App-29x29@1x.png", + "filename": "iphone/app-icon-29.png", "idiom": "iphone", "scale": "1x", "size": "29x29" }, { - "filename": "Icon-App-29x29@2x.png", + "filename": "iphone/app-icon-29@2x.png", "idiom": "iphone", "scale": "2x", "size": "29x29" }, { - "filename": "Icon-App-29x29@3x.png", + "filename": "iphone/app-icon-29@3x.png", "idiom": "iphone", "scale": "3x", "size": "29x29" }, { - "filename": "Icon-App-40x40@2x.png", + "filename": "iphone/app-icon-40@2x.png", "idiom": "iphone", "scale": "2x", "size": "40x40" }, { - "filename": "Icon-App-40x40@3x.png", + "filename": "iphone/app-icon-40@3x.png", "idiom": "iphone", "scale": "3x", "size": "40x40" }, { - "filename": "Icon-App-60x60@2x.png", + "filename": "iphone/app-icon-60@2x.png", "idiom": "iphone", "scale": "2x", "size": "60x60" }, { - "filename": "Icon-App-60x60@3x.png", + "filename": "iphone/app-icon-60@3x.png", "idiom": "iphone", "scale": "3x", "size": "60x60" }, { - "filename": "Icon-App-20x20@1x.png", + "filename": "ipad/app-icon-20.png", "idiom": "ipad", "scale": "1x", "size": "20x20" }, { - "filename": "Icon-App-20x20@2x.png", + "filename": "ipad/app-icon-20@2x.png", "idiom": "ipad", "scale": "2x", "size": "20x20" }, { - "filename": "Icon-App-29x29@1x.png", + "filename": "ipad/app-icon-29.png", "idiom": "ipad", "scale": "1x", "size": "29x29" }, { - "filename": "Icon-App-29x29@2x.png", + "filename": "ipad/app-icon-29@2x.png", "idiom": "ipad", "scale": "2x", "size": "29x29" }, { - "filename": "Icon-App-40x40@1x.png", + "filename": "ipad/app-icon-40.png", "idiom": "ipad", "scale": "1x", "size": "40x40" }, { - "filename": "Icon-App-40x40@2x.png", + "filename": "ipad/app-icon-40@2x.png", "idiom": "ipad", "scale": "2x", "size": "40x40" }, { - "filename": "Icon-App-76x76@1x.png", + "filename": "ipad/app-icon-76.png", "idiom": "ipad", "scale": "1x", "size": "76x76" }, { - "filename": "Icon-App-76x76@2x.png", + "filename": "ipad/app-icon-76@2x.png", "idiom": "ipad", "scale": "2x", "size": "76x76" }, { - "filename": "Icon-App-83.5x83.5@2x.png", + "filename": "ipad/app-icon-83.5@2x.png", "idiom": "ipad", "scale": "2x", "size": "83.5x83.5" }, { - "filename": "Icon-App-1024x1024@1x.png", + "filename": "iphone/app-icon-1024.png", "idiom": "ios-marketing", "scale": "1x", "size": "1024x1024" diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index a428e753a32110b3adfbc98908db179cbf954a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11676 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

j2Z2nwC@e>fmUqSV=;$J0CqqP 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 M07*qoM6N<$g7S-zOaK4? diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 091debe06d5cb3fc548821632e398643677b971f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)vLL5| zH4qVL0?8Kt|Nrmpo~G~j4`WLG`}yV9o7>1KnN>iJnOlTP7XSW^)m9+*a&6Pc({qtU zxKv$)9V;oa`2WAZ42(>SjEwly{Qrlk4VPlV76Th)-ya+VT(VWm;p>Iw6KzZ#sB{N zpq;JwEXD-D((%vdmw&#zq_@T2ZtVghs@O`J#UQ}Q49=QV==G3bF|Tf@fMv#?FRz|2 zi=?Z?jBH#$l8KF*a$E6P%%kqb!Xt((!lh^nvYwTT-#q>QZ$x1N6k%fL1u{70EnzJl zDBzGbBH3bgNnIeq6bBa9eEMNnwXg{*0}(C*iM5#4VASGKi$^V{8UO$qsH+A{8K_MF O00006h$vmgdV&If{1wWHwYfRc=0SE2)*P`{R;*!ZBL>t z)(vXe%=;3Z5E9yN=s^p3 zK}pL(Ny|b>%R))ZLP^U)Nz0;Nq^)A6v6?=7`ToGrdFtfgrQLR|wv=k+W}!cj9O-vy zg575Jjq&*f2HkmuDUR7msS$vcZMb({P~IyXIQ_aU9)a{nt>bb z_pgmO=JrtH;!UK5d#pj>*tu&g!Np6%d1&S4;Jv_Rt>=XJg(+w}TL_l6%irPlwM!YX zVgEs-bTcIJi~yz@JP<1u<&i^QoLiIlcCvs7cCx;Sm-KlB_rYSjlP z?olHIa8DDrv+EFcSR!yq6UPpPb%ZpYARh224GCH!^V<0GDmF5CZ0eC%Cn{c~t&OkU z1g-J|`fj}_T8Ylyq}^7fo3O9V`((oit2Dv5kxj!RN9?ArLM$*zJ6jv&`6u2Ic0XW} zZvR~DAL9`7@#wGrWrDB9J-{p7G4fV%1wq2#I#8<$aiYR2joY=&^g|&k>>SAB(FJl3 zs6-&Y!>)j64Dd?pM}|+`O(8u>2rkb)HuFnDv?!Z$t`EnOU>xeE@S2`DDME=3_wnGZ zti8Y_9X)#`dgfBk3_U(}W4jM&YNxVJcDzI=grJW4dm1*49@}W)=;;Yz(vjroiCfR8 z(+&+^g+`q=IDQ)%%f7pDV6QysC}~+JX;~;~Stw~)C}~;jOX*+Q9OmG7QjQ7$0000< KMNUMnLSTYVN>{=F diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 29c188ce0b74b88b31d473c7f47c64f51aa26e58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmV;R0bl-!P)`IhD46^I&o4$6Hfoyt@7LFlXBU0DvsXHH4Ry=~ruuJp_kB1q^WV3( zjI3Ok3dl6~%awH>j!(m*fHZS|e|Y@+-90WPdteCQS4ph7|9*e}bZ*J#%WK#r^?~Mc z%3CoqL*t5xorg?wzdt(h{&4@_uWu0A_+>a*IUsCC7Iret{c>dkvY|i#boi$;^P%Rl z@yH}>B*EMtPtF3}!Y-kMMehGU>}>qz{`va)!}00g?;YebiotF!A%Ml)&zIMJJU##a zpYLQChtJ$k=N40FD0Xv^!S4@Ge!jT!_uE@4oBRFV0U#pPP{QVNDp+%C`T)y;Kkpw< zY%U`coXIMz!YOO^DoOCxp$!DF`Hm9V`F+`T`YU1Lay? z-C!;y2dJ?`<~L?8K{OFy34m4zFtKtn3CLjT#b+*6z^J*jH5UNWVuT6Cf6#9L0000< KMNUMnLSTXk0mWkg diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index 7070ec53a018a3a4f94bcd5ae41e1d42f512dc85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmV;-0yF)IP)C%Mh(uC>Kgz3_R>H5dgwqt=DcQa(PF%99YSSN}w;fMF+e2dU zh|&DoA0iGP!pTftS6^E|Z&STdaU2~weJxCKlDcRwZNHt8D^Jj7MKJB(5YyFHzpTt$ z+PM2J7_CLK)9CL{4vv61sc3UE{5(3$32~ zX}y#VR!k8AS9ksH&y5>v3sh}9!P1ppO?2iT(pJF%OIQ6?qV0jnmiQ-(PiWmgpEjcS z#t~Mx_2N3%y&p*{wdX{H+zG3z)SeOXz~nz$yXn!RU|=6wxa#6uPhKYCY#QQ#=veY{0ILwi(#@T^YD(Yx z`-SX~T|H(FoB%tE&@wlB@Ioqo&~E0>jGLV$2amx~V!B{Q4jt}uIGz^^hdomz_l%(f y=cLXifg@vq>C%Mh(uC>Kgz3_R>C$AI>HY$F+zI zO%9h-in!f0t5eM_|M}r&Z{JkIGh)YAiFK@7rY^Vqn7qK&4gWHxZE=|H@W{Dd^WWJO z4Pu)YEK}~h82xko`ySqGN$xKq9{x67z4j_m7e73>wqe1tXGzTAFEkHm?laYSlE(g1 zb3^1&CPk_1Kdx;!F#Fi11)@PSPcEO7zgxy4_WYjSq(*^BbEQ1$_AC|;-tzKRnZu`T z*LAC%BLb3wKTfn$m5TY-GNnk{+M_61w@_tf;GC0UUy`gozRWZG(G*wFnm6xU-ocl# zzh?g7b`-d~yKj^4VH56_7dJ0BeEMv=cfyKWGvgMfe>bd~YgMz8(rr`wHfMn@g{%1bJ_6lb*H*- zxhleR29}WWm~1~SkIwqbkh3huY#P^|T{+X*UblDWF;ivf8eNO1Z#vowEN*`*^gYh=4wM=tbZ_jH-6l0}tJjv> zTnWpk%<7o6-o|T#_0eU|HkG_PYkKz7-lfy>Rwr)R@b$;jJ^N2D3;%U_>Wh0%?o}>% zBfNb1OvtE2Um3g@Yo7JqpU$$Ng sEa{$Vy<76qRSvMt#N~qvOdq6A&$IG5BET~fm~|OEUHx3vIVCg!0DdXX(f|Me diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 091debe06d5cb3fc548821632e398643677b971f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)vLL5| zH4qVL0?8Kt|Nrmpo~G~j4`WLG`}yV9o7>1KnN>iJnOlTP7XSW^)m9+*a&6Pc({qtU zxKv$)9V;oa`2WAZ42(>SjEwly{Qrlk4VPlV76Th)-ya+VT(VWm;p>Iw6KzZ#sB{N zpq;JwEXD-D((%vdmw&#zq_@T2ZtVghs@O`J#UQ}Q49=QV==G3bF|Tf@fMv#?FRz|2 zi=?Z?jBH#$l8KF*a$E6P%%kqb!Xt((!lh^nvYwTT-#q>QZ$x1N6k%fL1u{70EnzJl zDBzGbBH3bgNnIeq6bBa9eEMNnwXg{*0}(C*iM5#4VASGKi$^V{8UO$qsH+A{8K_MF O0000G9FAc@dJ=(j0X>X029xC0izea5u-^7MiLU@LGfaY ziDD!Mu&DwGMhOav0`ekFw=L~%+wG21iAWKaPCK*R4)df*yW5@Lf1Y%9J3FlmAry8K za=AO;G+dZt5mT%j^2g5b;>|3LEpIG-BN=ObJ&A zqbURsWgvSTs8wcRn9an;AH~LcMem;dm%2s8PrG6{g^juQk-rRja<{6S$?F7KWA?AAcMh z?SW>>{z(6!Gw4CQ1C9zCb0d-AyQcQT$)cNZNZ5=oXm11h%%C&nY;Z!@GL5AtSJA8( ztCg`ZZp?;+?f;P>)u=UX=Kv6~VjU4S;<&bmaQ}_GJHf3`YFm6QC$VB(G4a?EXc`3^ zv%{6|f7~lf3G%{LIss%K5GCTtL?9__W%SrcPy9olx2a7%-$5{$AY_Cgg!JV*;6h>n>IsG~s?93)t z$aaV}#RzA#*~kzY!&H`FXoD?m#(pmLT@kWr8ohCVB7_$z*H+*&E%u=!408Yg{%(@_ zm4pbCK4BOe?eR6Q-MGQTmwq}`ihB}bgIm|lP!b-ytse0eqQqFex4xZY$ zDOJ@g4M#KKDZAME!*Y$fagRrBvtLC4N|jvKT0occz!sMLbq6j#w7u{GAm#nE4MeHw zVgP3C){ueZ{Wlf;Lu30bOV@1viUpKvQSlYn?RAP7(g27+#;b&6@SBKeXkaxd1bz;) y4i{z}F3dVyn02@?>u_P#;lixLg;{6U3I7K5>MeE&baMLu0000!P?B89qIo9}j)WH@N8ipHaBl;L<$_ldV#|z4uGX{eAzNFqxmB1=LqUNz9;teS7qCA^^Aj?)|~ni z@$b-tz^WAXoo66KAgE) z7}o0fo)kV_`qS#YYNoZx=3C=| z7w<28Tl)Cb(f-w^r?X!FztY>Qq|CO|V&7vyHD-=|t!CP**GzdkqSq!@%XoV za+>SC4YBJFrah40*fs6<-*-`kti@LH*NQSWhsEtpSuc9uV9zD)B;A&{XzgcipC*6J zcD2YB-Lh?yLcjdVwu-eYx^2JQ3N{a3UU66U_3a3!{BKuyRX4QirL=L|&rhm2P}Zed zQu$5h@ZznJKG$D-byr+@?8WwScpCq+@av;VhmWPbOXP9+vvBIpK+T(b%h-?pdV3G*VX5Pmo5;Rk!+!gctoNV)hi;p^=;W7u*EwbtE_(6dzL0C@|Ad_E z?dy+k2bw4EU~RYJ?O(&3Y5WDoJ*p*(z85aN^5y>i$9wxt^Lm#2UfTCA?fo9X$8$I4 zR!eQS&fAl}F?YA^o2`*L3wO`2w%+$R(7ANIvf8h2mUg%GT!pRU?N*)XjcB_at>CIT z?bh$6DKB#V1QeY&zRkZcdavc%DudtE+m6;fef;n9dui_s&1)0unr;?sTo)V5elMv= xBT!^JkKCsFGi1(2+eIusEJ#6V01xPTM(?ZzKMjA__5h1J22WQ%mvv4FO#nlZc(4Ef diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index cef2708159d407e49e51327e7c38b6d6e91bdce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1SGeyEo^0AV7cSz;uuoF`1a0if0!P?B89qIo9}j)WH@N8ipHaBl;L<$_ldV#|z4uGX{eAzNFqxmB1=LqUNz9;teS7qCA^^Aj?)|~ni z@$b-tz^WAXoo66KAgE) z7}o0fo)kV_`qS#YYNoZx=3C=| z7w<28Tl)Cb(f-w^r?X!FztY>Qq|CO|V&7vyHD-=|t!CP**GzdkqSq!@%XoV za+>SC4YBJFrah40*fs6<-*-`kti@LH*NQSWhsEtpSuc9uV9zD)B;A&{XzgcipC*6J zcD2YB-Lh?yLcjdVwu-eYx^2JQ3N{a3UU66U_3a3!{BKuyRX4QirL=L|&rhm2P}Zed zQu$5h@ZznJKG$D-byr+@?8WwScpCq+@av;VhmWPbOXP9+vvBIpK+T(b%h-?pdV3G*VX5Pmo5;Rk!+!gctoNV)hi;p^=;W7u*EwbtE_(6dzL0C@|Ad_E z?dy+k2bw4EU~RYJ?O(&3Y5WDoJ*p*(z85aN^5y>i$9wxt^Lm#2UfTCA?fo9X$8$I4 zR!eQS&fAl}F?YA^o2`*L3wO`2w%+$R(7ANIvf8h2mUg%GT!pRU?N*)XjcB_at>CIT z?bh$6DKB#V1QeY&zRkZcdavc%DudtE+m6;fef;n9dui_s&1)0unr;?sTo)V5elMv= xBT!^JkKCsFGi1(2+eIusEJ#6V01xPTM(?ZzKMjA__5h1J22WQ%mvv4FO#nlZc(4Ef diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 51aefbfc43c4c70b04f50ea7e3298e19b778b2db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1979 zcmc(gSu`667so?u)DopBsuEQ?swEXvV<|}_6{e`M)HW*Rn2tTssV(RXMXDqdG$^K@ z8Prw@MeGK##a2sOrf4OhYKz#nFy_q5H+}!kch2wLd+x*U<^CV;V>??cQ1YxK00015 zSz_#uX4T(yLiDIt(y2ZGfOxDG2IUwovNZWV__WWNEkYB*rz`2<-}x5&x@D3o+M;ATZZdg#5d z`o!^p=?Biz2{nV8j8|&|1N&yvqV?@2x7wK2FDA1D`kmJSBZ4&*z@iiZAo2fUESH)r z>6Q0!!?neqb=R|JTFV~&(l~TPS@UK1UF;Co9jXE#j8PRJkE z3|YQsR{W}8d^~(`6~Ss%^0ruK7h5i%3NJO@%aSInTqW=$i()d2BjdJIN6_G?Ie{H- zczW#li@*oqtm6b1Xf(KP*CBrc-~c)jL^zCey)l)bsTbr)o@sZPs?3vovbsHY3d0wh zit7{Mbk~g%E`%<9!uQ4$c7_k?!Aa`O^t=Ilui3_(lYG?dF#<11S1#?!GWo;xF5)jc zXmFig=rU*~REmG8GS)D}oRTt2R8nD4)f3KsGL4mx760X5bd|vZ&6kbknnIF3`w2ig z8NpH5mB)>VY$KNLu}+uY=w=i9)hbQIL-nCjL}Xln&qB=_q)(Kj4l>Zw^q9y6H(veB zWh13HcpYyw4No(br4sL5)~K_Cc!ttJGwwjl@2%&0f?**}dy0tioAAGoA3>k?WU!no zEh*$oI8D}Nzbc}%Uy>7UId6C>Xy3k0NTe;CxWjMDFgs(qmnU~J3r2I+{;*x+QpbK& zFe^&f@3I4hbX5q->qq(4t}w=SaRD7N!ZX>@@$E~X7qOK!b$v>VP+(s{b7XPeTM{L! zq3olUtk&&k4TVo9RIu~wSA~`5C@ePAaQsB5#+Th^5!E6}9z!i;VC$z!eKEE-el|MfVpMu@?5%?m}Cg>x0}~ z`;|4c4HU~s?U{_-rjOR|ItQWyY?ThLTx3Ed&FakO% zxv1?{owa2*kbaM#iO#hbUV*M|2@!fW5+2*ywPl^|cC0WMmYr>Qb;mY;1G!IMOEVi7 ztvx$0<>)S~iH3K_8D^IEWKen`SW{L3CfQY3CXvA)g4wvlQM=OkV1WuNWl=d%0U`nC z_tM=DjFTZ;O9Z=Qfw(hF?V(hP`j2bLbY|+k1_zB(xFpD!CV7;A@f(XSwgrleS4Fwqq|of?-VN;T754inqIT*P^%oxVHVA9UFLF zM)eDf&Xbk+I_25XrP3LAbMWd6s8v3@(F^~lGq z9yu=5&)@dP4(iZ!ZmE&$?wf;uy@X9Gc6ZTD;2NsQbOTu;7ye;^3p@00Fa9u=`%!PI&G$GvBAYopjmsPD>YT?JfI&gSGxH@HVk3 z{Gr#*>hQC`kUhEkG*FcMAb&;drhc$f{ic)8e`Z>j)?e|oTpeqIh_iu>VjVsP@6`gu zZN|O7L2bNhl~?X_3#1uF^?zFvLmZk{e6xbAk&>8-EipI{d!rwexqH1lW+t15XHqv_ zqK;Q+GI&OG1dK~7FrbUm%5BK|RAHK$@arcd!Ou6{gp`g?Qp2N%YqRG(^-e{3;ayXn w60Id15ox?RBaJv8} zV3M@JBx!+3(gKsD1tv)gOp+FuBrPyWTG&XE>cV7dC)kTlhdG<+lX z=?TZJJgm_(^ZszO^3%O82_clf^h?7rQ;|xJ;wAC4WMS#681E_knpkHZk4mEcOpV;i ze(d9*x&CaPlU(i3XVTDhGcT2ot_;sf<|dzt1Lw)+^qi!TTO^*-bCP!8rlcV+qf1Lo zTURi$$JT+|k%Xp^op_WQxeYa0`4QiCEQWVJzzcUlGC%uH8oZ<}PZxKgUMT%GfPPgp zWixfF(}hhfd|flvh>l9?*+uEiHD&6>8Zn`^z0vN+(E9cWcs~F>tZ^NZgoc)R{~$ej z7wY-4!7Ca>M|VOpKQk)EFX~dlfwBIH?UJdtH`8PHDvw8vs?Ll-U9}1j!Y%&B9auHk zE~zAju;S58MT+;V72y+Fj`#ARhRSm~(5`svB2y8|Md+rQ^_rynkd#CV2w2GZg7pM* z5`mbcCMLvJ7u31&ro*RecOD{@mIwqSO-(`9&&>G!;xwhO_?aq6)Sk-pfb{yRky{{D zkR4PnsYwZO@Ur@IgkUu`QH`Wokkg}gG9Mmtra`b6K?w;` zl;j^TYFxsWcGc6fcBHKu_MfB$@{<0hj?D*80igzM8`=4#{xg+4p|ch8k~OWJf##0l zw!a}Ngj==bH{zpU;Xu2ReTG^M>_7Pzd~IW3%PzF`w+aA4Fxc8zdL-1oZ?#>mX1pM@ z{Xpq{VC!xU@Eo*U#PRhJzOD(YY&=Qe6Cy{iV4V`~I*C4&$A{YYN4xu=^$Q<#NdrC} zs|GK&D{2S81qmkfq9k#cBrPyWT40j2z$9sbNzww7qy;8P3;%`WZ>6jzhtf|KlK=n! M07*qoM6N<$f=hj=MgRZ+ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index e6d0817c9cf0f8a0ed3fee63d556a13a8b2ca716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659 zcmcIl`#Tc~7+#KQk`{A`TpCl92%%zU8ReEsIMH#LhNpwENY-2<_s(3yXy%e!q7A9A zxg8mWFqgTFYS;j_sjdk_q^ZtCfHb+h#ZkQ0ssI+%uJ1K z_dDTl00s7IR{pyn0N@b9%-GQW;Q=lSg9bm4ZC`W^;nwe+yuU4%-2#Bn36De-jzbL< zNYy8W-ShgT`? zJ4jqj*G^21n6-86W6QB&UnvOpsSH)VZaeiXUcJ$b`TB+)KIOX&7|a+P8u{{scIc{U zd7vd8M8vO#6_l$cxt}UhF4GT7Jr_6F0puGVXH--e$kj0d_G+K%M?34XYcIaj;O^P> zKyf`w@Mve!0BhH@#NRnMZtWBZ(ec8T&F&)&O)d1$4&yFGtKDE$FGluPHKvCqTPz!O z{Gr$st_C8pVb=}-Zx7ES6K_SQk0cW>+yvL{KhyGC(IJh!pNYg7+MH>we%Us*7OQi zZh7Fu=BP)kCgNF;GwP4bux=V3k$(o?=%_))m?mbc06XhjS({KFZ#&V4De&x;V<-6 z2>vjtrd)ZEgWVsyRw2_iC+8CDUqTP{lriM)!`;!cyjy;_YZbqGZMg~8{aob#=wmQg zyD8Ld5e?cHiW#KHt!sDMv)5z)AJJPn^w@@!@Ls0#L*fg$o&$P*ogQb1e@-~ug>OIV~ic5ySKzQz#suPwHA4cPR(b+k(p)wrqn4aW|3zyPdB%=9H*Ng2z%u?9uh?N2Ff}eg_RIj9yl0+N&KKqTZUh zd%eYA7ta$K$D|Ti| ziJiNifXGQn^#R7~vOf7UNK!pvT$GVc?RBgzQs-4VlZAvfAW%`Dnc%sK&gxL97iYPd99L1D-YYrgi{~l+G08UToyli^2^jGIY{R%*hcSkl!Ka6 z-9ZSN<0F87wk%@v#vFfpCq@d3oauMEHCVaTV9F_|F!1yfLAfj^y6~s!icF?w zvKZ-iaDSRu>-u^dSD{+Tvn8(G%g9+QO_Sx{yv=kFM0O7~>~6MOPK0?8;3k=RaEFQQ z^VC&g*U7|OjP%~Huj24Z*J#7tYSnc3=dY^{!6V2t!Nd9%itENz)v0UZ8~e}ThsFHI b^nFuJwqh}UvgP7_r~u5aSs9ZNZc%>$aC-@} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index cf9bb8da52739fb5464924f24a2d1cb805dee5cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcmcJQ>s!(X6vuUKYMNNy^VZaod2Pov4^!8BN?l@{CrbJI8)`-U?FdgLHpY>_L&! zCI)#^-vZg^g}q>IrkQ@#`@UOlsWm2Ab*_eDSK&B!L+ac^if85pL^@U}b9s(Gh-FVW z0qGt0-}Qc1cFJix)u{qhcE!F9+*CIQ^;4m~Cg8D`#xMrrwP%es?4+|{pI12}JL zCm3M?MX0fFG^wvkEI=jToN1^(Q!kuJyuG&vA@E}5XQiaPY&~p9Jz;%LIJ>f)5?^Ly zDuM<;$Qip6vy)regSvQ6&_7SZ_@C8O?5Nv>WN+O|&k;M-v*5+4rg7&8BOe><{)_7< zk*Y)B$R_NN2QsXpU&D#CFQ&nA*{WK@zX2(LvZ z@<;=!3f*7~WuH~j{)y{ejMwS~l{mEw+ewHsz@3#TQ!r70fPNXu=cL_@z@hwU>=OKm zHpaqyhW01S=x69+4M$1Z3qawW}a{F>^@k#8Bw-sHo!B1AxZ=N7CVI70-5<&5pG*gY3SeCbo+1y zoi2%a(-Yiq4a3srpTXT-gq-~fEXO!Q9Y8rzMLYpIQ(I_f7~y=4dz66YrDTnTaXGFLou0j$zutj zVRVzNa!%bh(s|vV)TP!Y)z7<_@+WoZek%Di2y~a&Kx_G41iftO`oPW3@W06)mb{t) zmMZ*nLb6^Us1+c=L+)>`t}Uz?4LgkZ)=hwP34XHqSHH>rGECKI?vTC-yfZ;w(no{1 zXO%ZC{ISniP?Nk~CG#5<4gy4B9}kZY|GKuf!2}L92;jh*cIqV{2bDjbK9d+zMSI}s zaQ>pL9$OijK2l3O+*qj*>!wJLNQB$G^S7JEqu0GH)*g{rGcr7Mm4V9cSkp=BS}_vI zbMdMugQgwyDeXmQT=r2qMQ7U<72E=?zYUp2`juXT-@7{yyL{c@Acv?Z$f(Ni^Ii@`8`R03{Bo|GTG)++t{?AhnSd(|f$1r@+eptLnu!5>51PhP_lnzwxH zPtTn&|Kem~X$Zg9XznMm0;w41_Lq(@uu&OVyP5Bue%xiyBp5n%R6l$EnMqZ_KZO1V e>l4UL)$v2e@%hGYV?X>grDNVfUUbh>1%ClkMTl$w diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..21c1c5ada0dd3095b51ab7f5cb21f9e26fbd2877 GIT binary patch literal 16404 zcmeHudpwls`~QQ=c48$(Xxi*2Z4^<+$k-KXD>^WgV=M}pEEzeCwof@z+ZN?ispQ-w z$B9u+5lM13hM96^491K(ey_)VKd;~a-+z9;-}kk>UYqsY&vW1Rb-1tVdcUu`*i+V4 z8`o`HhakwtV@HpiL6BAOzpIe%*1!*vy4DT&vG&T*bAbr5UJ?CI3VE2W3=gFO&shC} z6n#{iK;QTN`Q*}P&jt_OU)^Y z_PKeZvd!LVHU;&HHit4#{CUhv@7~r2*YtHpamVgysbDkTCuu(r?3CU?mZ`Vggd9VD zTuSWip#)_GR)z5oSUfmWzq;1Bip5&Ut=ftFyfbz(kV2x59covpI&eBz8usJx>6Q%o zV-6JtIckRf9kuG8U;fd-KYsAfS@+b@qrD|r(9(grprqoWj*r*zv zXB3ck)lMStJbsIDRz9hbOD)-5!@o&(c=J99;ax?uhMUXls(3+4(QA)y{GIrqXbHb* zW~nq;^Y~Wzh7_FP7MxHJ&s5|lH@=iZs7KHfHtN)&ZtfCR64zvZqRCf~H~!kA(c}v2 zsBi#xZd+Eko3^E;H17~9Myh_{>^jK^bH<@GS3$MxUcj~A*Jw(zR40psr1|T2cv~gE zT?!w4ydNtyJhrkI>jMunLN1)u$NOtDdSmggu_cCaUlfMVVlaskX4c-RneSF|xZ9R4 zeeu^I%_a3b22LEZ$2zmRN=97NQPGI&;h?MnIH$v=GF`$jtduVMV^BcU?} z(PpH{CpT<0J-Fre162OjRIiTM!?JlH?iMA2o>$z3W!vcJyWRur`6o?VufkNhQULFW zk_g-c|K{3@O~}!c=y=h2%EFR|XtGlzneWI2bJ8gE8rLq#n=pA>_5hWa%O><(=7o z`-TL&hlt!xhap6GUbFqR$IN}Nf`Rk(&4GpE4rbBUccCNHr+LQYKpQ2}!gLU8_{}S| zK|9hg3pI?HO+GF5Zq5Lk*D~QyUU-04C#``#{+%O5%4sk47%1AA8Tweo`y=Jt_ANV6 z5jXjkYJf4^8~9$+hd#wwb|#8no>~h7w@*|vT=5x3VKwTwh_VjH=9^X?cW4{a-cn-@rlo<6_UtL=o9|h9eueL(m3hv&{&`AT z!0aCa;SU<<+FM=(Yck$71pARn6R4rT@7c9$h7;Y2>dhhQ`L>MSnv#Su!-MYJnml4Z z?sghHN7kRHZjcmHw8R6!cKZ*}g5P64p#s)Qf0`|t!(jX3t~$nt_&e)Af4+BFhI#^q zqNEIIF};=LG2Zru9_?a&5b3zMmUMh&BzX9!l9u6S)Wy;du__~L!%(BR)qauXJ6C;9 z+FSe=doj;4-MA+ycpwiqCq}oXydy<(D6)XQUNwz9I)b;o_ZGvuvNC`a;x*;e2@Pj; z4tNNBJx`oG^i{sX7?ppq^3`L+Es@Z-vQ-Giq{;ESO?SNfQ1)~tlrVoBgo3yepaBWwLu6q96II4&pjEC?mX z?8U~pe21iJq2je(*HWBusHstzD%%_&4Ehj<(_INXssG~KCV9S6EUrG+=4V?1M<3&bi{72=(1 z;HRD@oL{obIhaSTs9LThmd)&8kd+dRf(n#QMhm4Ptl?=?{;9uKJU+SDuYSq?Lq*Ut z+Q3@m6AQI3@Ak(aSxJ|UfyYeuPV3A|D#Gj6cf#{p*%#$pRuz@5wxOwth;`QW4(p1F3d+6ATU8zdo-($nbCI&ag14dZKW)bBQl=W5vA0 zpYpBWEcz(v`1#a-thOU;MQVT9fv(b?LHU$K74-!Xzflw7K_^?3!HiK~`e{E%gbl$a zE9z9c)X!hFU3TQ? z;9d$j?PXz_VwpK2YK}GM5Az6p=Nk3%9|jCxRGKLh2&E#`(NC`1!p4S=Y8m+HFqRYB zz)gp%QJZf_Z_c$gp*geZyfgaN>Hdx!S>E?6Q#IEArWri_6O(FUtnR(fh=v*VLC@4; zbslyKb7&~;p6WJoWSGj?PHUb_#d%c7h?$ln*!#tV#?h1yMnO+Zzv>_rYgPtwI%8+| zkTip5_cF=f5<{kfw4QI9U68HVzB2l3w}zbBUXQkTi-MsuN6u{%N_qVO)0xqYh-CHl zqDzfs85V>tswV|kn}9}vRH9wJBG#ptq1kTTG@`gSUyPKP!E?7E@E|K2Jo{^lrC)gE z0iH}N8qT8**<~^eF#trvjj& z-tpM7L=np4i>27=tmI_*hLeUH8s$wsxiuYhYut{iSShzzBh=y;pFK*pe&g2;8hlJW`3>i5@472EDO~!++ z#EJ`jr^2U3$h>G0Az<*TAVwLft%VE|wL14)ko#1T9-iRSm?>jN_#o*@O`Wb^pB5Lw zN!$}TmBwUK=;u}{{5oRzD*RJM^S)M*sijKjX1HK;75`QH* ze5M?9^J~RJn2CoaHoR$`jdG!nNrcb6{07d|`;7-VzH`iRWM?e+pR~Ovd?a^k>dU2hduuHL%%ym1M19jr$fK>3z zUJuUb&Ke2LB69;$YX-+9>iQ=ii*zGe+|_}H?01bj_qk+>X2dM-ypC8n-8_c3C2ie* z-kkfokT^T%TF<^)_~LvZbyAW)>5LGz=P{nyf8dFzhVEM-&Y?+(-(7DDHG~e6Kr{Lha)3PXZV>X%JxGg|6}{#+7HkZfC>BOm_N zvRn%JL;C9@cN)~=x6w!S6N;>1ZVD_Fw)y)v0_ z8i^u85U73gAl;`aZlkAPXl@5(jC$}e;rl+Fa=H_)$ zxu{bnP(pImRbBSDf4j9aDI@QRM+YwP&TP(yhWJ$ozthV96!IQbuh)q#=WnFtQYa{B z;~Dd==QuXr?2!6GL-~fA$E701%97V1U(rMnx|4MJM3Cj)K*S&gEdovZ{NN)QeNtgH@KSOw#X^$Et{F0R3nIjlVP{!*94q zoWC|Mz7vJk<--pz(@r-&ENts7ElcUBqa4>Ws8fu>|!vRz!r!{e9}| z-lN67>8aC}Z^T|uh;AW!daHD9G*@S_^s|(wA`|P&oL#h9i^;R~3zarW4NbUFF$p~| z+=Cs?Z$=TF6q6D5VfTk9Up+lF_Dpe-)j12{ID4YPTjQTQoGv#C2G(-q9l3wXiNy-O^6+2amJ+_g^ye@JdX!2xp~v1PBTZ>$4<5 z#&X*WpFGpqUw5l2P|O=Y70wXf;n5|(of{-2UzW_}qqF$^UZp6Ivty&NF!EUf{=;1R zbZ*v$Ig*4>M-B}v5!luDt)F?37d2(@IfH`}fL2E9m>^(c(`CbfC3$KRXyI5!QMmwT zsE*~@2J}l^ZoM<$uM&$BzWvObA8SI9^7Le6^|hBuohKcoD?%}q7mQ3rpN@u4bb7Go z#w?kcSWA!IBvObCsO87NrC+qlrgwWR^Sw|{3m*8|KA1;X%ljhZ!5*&8W{1(^EA;x3 zm^tSIrhmikbMd#zR+-D3>}j7V-_UTFn6y;3taHv}b9@!mz}RO#S{}~1*(OMZAxt+V z6bQ_U?#+l>DWPtvGm+bz%YuHKt%~@uM%(};4xHYXwOx(^x`}N=OClVLoXNw<>d1R2 z8lqPF*DdL7cQ#dTvMGD=YEmA#guaa^dFGV2QBA+HN+axo(u>z16DyOb8F$Bx85($W zYFRkF`3>U75I9S%bjQVD_pbOhhswt>*_!7&mYi_NurpXe`O4W&0${Y1Wb39oigv&j zpg?oO3p|!lpS#DvUk4Jyy9qH;D}Y+Z4e1&Xx%S%DKWs}h3V<!y(8JT8_&+)duK! zMJtl;r?I3~@T4#3JqDQ@0SDJb`ZHq8t@3+$zboJzJEv#h?TT%%#A4+K#S90^GZlze zjNuNzzato=A`~4V^8+GDOU!1YD^Hay`qtVk$sk22ri>V`&kZi1cPDsvAMkMh909xH zK(c?7{AEC7SUs4~rL%=BIjVHI1c&IFgKXn6oNjTQW*)CuzZ0Oj-R7Is@JTBw$aW>q z`kTiKLxL=bU8J-6dH3I9kW}<+wBB7v=_h*y>Kjx$)j#&wJ0OyZI`=Qopb1z}EA#w8 zbu2Mu|9;Odcs~Mt|4uORBktPsF6=O&Zpka%)E?K}J|~Z~ZiM1*w6-#SCSTwbfaJKx%=>T@g_PVb@gd%)(2>~QiVqO+7f1pWhH>TQOyL1{{-R3U127t8?WMeYw{Di(p1?k zvwQMdf=S3DD!A2^dmo)IHhE}0_Yf`V?b8yk08PGS(uLs*!lcaRpF;;QA| zaLemWz)K~IOLNhEXXq}0qrYfbr~5U4F9Vqy8+$3a^Q$N^NT#;UFsc4BoYM$ma$`oh zToa9$v>2%#LISacgUux~4%L+^`L2GAeG9j~Pu*)SiGH;{U2(Q{+>hMzfQYjq%?W915%H zs_uSB1}Fj~Zdeb-DL)=CPRrCx$W?-hWAGM;X9-P&2#?c)!SOT5+!UOdrw6;n>qnS{ zybk7B+P(LCqWaF_SB?tqT3KH_qI)-Q_PCE^1kd#~258Dm7QbacWc1i?Fqwda0J$0U zmz-Lmd)w#}!O!IJ!W~j2Ii`+GZ{LUP_wy4M56ry05Ug&DZ*UdP*lzyzC$A0SDKGUq zgat|L=rhwc67#r)@US=E{eAm1Br$jE6o2<3|FoGPy5s^cPkjL*}01_>nJ z(+T}+k;9+sp&Xt){m^TA@NBSs6iP+u5+|{KlQIVKYJu<9EELzQ_G2FR3}<&*2#NIbn^7*g z_K#OwGhio`$TisT6DN#mn9;gtS~Itix}i-^OSCcd03anRzwdv;Z#lcfi97Y0UC z;zPnM>O3+YwSU0|e#|6FaH5IA5|^~E25N||TiNVxhR*f}dO~x|9?C-3z2>Nzufh9Y zLBLhsy;Y~28M}4ce%jm*a{SZP<~cr@H*x10N;6VYxG(^|DQ*SiZez5{R?SQE3v=U z%qXHreM|>xO{52+q1%phb&xGpo3N+F+O~@>3im4z95mhx%FkK_R`}v$_2z1x5&&gJ>vC}V zp`JLeJ`o463FV)p&2VGWyW5QO-MM|p|!Z6H%j>~+6-Rv z9_x(DP2XbCE|V)i;_51gvY_4m6StxSv)dDsi5j)U8sjZQnknROUEpe>@@*%M08(5Kua)eCmG2P!HV%t6n_44@LcI^zaZ9@HhiFIGA4| zUee(da`ROL$z`E3LXHpd#ybG8>4yxJG_6Y+@{!&F3C7yr1I4uyLEa?iTIQ5bN_yig zr>Bd$dvGi#$+YD7WX39p_oUJFU#pg#1cn ztB$KESdxDlqsDu8%WE*O=_nv&=6=&%;Lf@wpaa*A@uGR^VyHsC!9A1;we!7|BBa-S zYqmC-FR?V?k?(}enbI?*kkoVAEjP~X^Zr=Q#0k4>g?*%q$&5LieVqhroq4%Iqy3=Q z*96!`h~e=QW}zGp(MMOmtM1$%RfjXx6eng zL}Sgba^-`iI zku9|y+4nx4;Cn3Pnh0E)^UuM^C)JB`<~JMF?pI zA!h41dHj3L)+}2|ll_6ve2J)lwpWQlf5C8c^=aB`IItRKgz7MAbCOyyqvKm*FS$G} zwt4yRS5}>I*kh&6jW*~^Uf)5Kw}W!1T%hA>Uw><+ZAe3GEOWpn3wkvZrp7=aM7@Oq zdi`hc%K}<|!d1r>qmY8h%ej~XiC#zYmB0=ftANAKl^qpX<;}*C6xs=XOI;IU`+Tu? zF{A{e~yf%-k*@B|X3aYd*z9MDqnf=ztCky!`KW z3-r_8ES^8~2?|lft!ypC&xh%=^=OMA{IdQ>=WPX@=zuB6QTrlVm^(Wx;n(Pi7c@Ep z<`Wd>q2Q|91gYlKUkb8G_sOFTJMn~{vb6`mdf_3`$S3ZuoPPFr+zJ^5JXD9CKnAI` z1GUv$z4Sz#LN5T8tu18XN|!T-m<`pw6SOnOv7BHD-&FDq_TXWo)b?&z9)dCid%k7F zd%C0dd7%DPd<_g4t=GcPy*&qO(Tzf$#!*9l+p~nZbdDnn)hsA=ArB~dsB=R6EHqp~ zORv;opqSkRzG}EtrVdF!7_tg049E6I{dJtBygvc1$qucwZ!cO zmm2>)BZj6MkUzr@55!yhg;vHK1Q;VQQ?UczGQ)r=@;}e+o2Nq6jFRY8g>9++y;HF6 z4OrLoF9=~@D)9vlJqhif^vCi^svdPSt zloQ)IReZe-yHSSnVvc^1xD)F82I%kj^_{MF^zQHQADBm%04gN1`KzsF85LjOsk1p? z&cSmIjJNt11PL{!9U`?~N9l*@HBov+Cwft3tdB(y^e)BSc0-TlDlexu?x@V#N2HM- z4fX@E&b3w%gsaGbrv&)H%rfM8@l^0cSe277(;^=EbHd0-oJE={1cz!`Z$7-UPf?t@If? z1%jHkN8A0Kz}W$EL27lrgZIBg3p1)eC2<_-+lBI3FCYdF(^etMZZosPbb!|bAN4Xr zB8{!neXP!*K8}bTr2$C?V;OU7yh+U~g)|o*WAv@C?3U`zWR8oLnHaDUC;&z zEF=3p;ud9FXzfQk*9aX*57zZOZXkppd2?t#pIYhgYuXsPk7a&F=Wzm0<~slY%LVuX zNE*m0cJ~9|nh~e#VB#@gfI zo~M|R1mGK~FqK9YV`m33Ko6lEezcVnpQ1hkOSP)Ogl7Nkpm%D)B*ei zdZP{{l`2^7{nPg$Ch1PCLQ*vVwJQQAzL@9b7oMx4cozk(NT3zuRD9MfX~Z3ir}ic^ z0Ya|20N#j67*Og!^ni;vBu28i)VzCk~D% zZWU5t4O@e&C9`=Xee{Nn{+J_d`V#?0EIHRBIX{rJdbX0EV1+$6|MC@mi;f{tzNh2` zI@S0_X!MiE+?3SIQE{M63{B!vW3soaR;Kenj5EP@|3Obc?#P-OD69rmZ#6jhALkzk z6v5`Cb^;Ca!duupVGSp!fh1(xrkhMf!RFj_*CKPdWBZ^{VIUmDHJVHvT08Y^!Kv!2FJiI+8gSmguj4YO7d07?%AkQ zI5@0ALQ)E`Ee_@q!gv1?sM}vJUR=oh@S>5mH_0}c9TXX z)J@JG;=xkrJ=)I$#0seUqi$Nms}WXcPIVhmM2@niuNg`}mFu$*v(Uun@EG~K1N~2( z532aThIJOnvCY?h&)oaJhl{IA+4KCTy5))EhU} zt<-U`N`m=&T*j^QgGIsMr-Ty^Ei|`ZD;hZsb({VXNRbFfR|q`~HRJmp%0-fhlw#jT ztzxWDexcQ95n!J-|iXGX10r`etQEP z=-spHSv9=l_Qq_xx(9 z6v}b-fm*z}FCw~EK4ub{&gRFVEmRhXcp4g@Y-Lr|xSxaIa#XkfK4_kMr5jJx;*h95 zP}znTxf2i?9Z7ZpJu{u`Xe!0XRM1SW_%=GCtRAbZlB7IoaQ(4q-&EHntJhVoc1ou= zXBb^AQXc?rYP#Qx^$E^5T4O=}lU*h5OU`kh`15gvWcH5#_sX$pgl%yR@weRH*wl2U z(B4YkeG7Jac(IABm|+y~T&WPHRo#k!(pvxi%i;j{bB`-@AN=K{;0*t-xDakB6SdmA znGs{bG_Njx{5X{eu+z?Bv!~{+9ODju2xfs$K{@R3ufAqv%5Cll8Nc39ATj7&?Txcav1z)lF=G_?crO$<=p_y}GupL*E5bS1@PXfvZRL?SMs7JMP5jM22dMnW0gXQ|76^vE42&OI|j@mCpfJ zm1NZv3tcZM|wwv&W{^+X=2TqoSeMBIkaNlYWm8>~ij&xXH} zRz@(A-iyM!bjQK4*RES!d5aFh5$@Ke@uQg}Z;&02)6-ImWHR4YSe#_x#n~6d`ca|}0;4ly1Ycyb0|u-D zi^SCIq1AI7okVbq9xLcicyQ^=fuNb9f#|b`rNCeYyx-P-YMP~Bxs%YBw~`tP%)zby zo8wv}C(~vWLRb|G23QCLMbQxQ%#>|-%247w015x6ln&VNKe=MnKiTtdElwmRtyz4Q zJZQ9;>G8IGucOK4PsRQYlNw#vMhYw6aBpDs=dAEq4J-@)l(=wmpA5hAPm8+!dJOYL ztbb)+>93NiO+gNjw%1m;+#oR^OzW6wl z*pg8mdbx(FL7Q598&+NZIm=Y?6SwC-XEpA#r2FnCYP{n5%1Qbv9g;>^8k7xo9%C zpH;Y+B1^d-%EZ#7&HSO5qluw;-7?nX{=UmBOL?MZ3r0NcFi1?1|A~c{RECSsX3x@} z7Mpx=o)AMDqx$<=dZi#~geNr5uAbV$fBOnH2~860s@scBQcn#BtJl>mbdhZ}#N%Wo|O*Wp6B(b>X$3X})^4mQ!0T z4o@XzNxoh*+!1Em6qZX(7S%xz)1^;3aIy4rUp7t;Va<@JBEIPqA^ehdjo>8aYpN^U z7&=hHQ7W$E1}>beV<$%v0|;2n)|7w6M>8~LpF&H^@6umf~7>)CoIv7}7)3z{0Tb(K4WbL~;r7TRhv7Xz<(QlOSxG9bHRa#p> ziGeRn2WLs*kxh;g+*9MvU5>>hN%_`>SI>r8Qn7|Xt_0Ge{1)!czjA`YjW{Z6B|?nO z#LSgHD$iidmcO+pHsAzS$KCHZnv86{weRF#8A#;g&gz{g*WjU*kWV}aPg%vOY$4A2G_72!L*ltyTx6Yy)){`LOwY1zOzO#x>RW;f z4GkclC%Yr=Pc1rTyw4 z+xSbz?3X?~dRcM6buaVXv*6kjd4z+@{aY==v?RnK1E16iIZoKrcyp~fInH=Lt z*q&r#s@ttDZej+?CpM19Tyo!qk~u)81Ws)OeiMJ<#A>IK(D%ji4~4uY%dqI^h%sM} z0H$7N{fWM?7ja|IU`w2JwaFq_QIxKwQpa?3H1U!RW*J^qvP!x4_`miSF2#Wi~$bxpeDTNn;2 zWu)%w-+z#^R9shl)-~mLRh@+4|1!T^p@(v{(JI=Hn!^0gpS_ChdZA%f z8Vt^s$OnL59+H3(Nxo^7BqsIA~-zA4oS;KO;Wf|N1?lb>>o1x{{M; zcIBMnH7v4zR#udA$ZlucLZw92l^yPtw$H@Z9NX0$dgIl*lAE@&Lc1q*d<@~0FWc$M zmr_)$H0dDM)Q1&SE-QCk-2GiMq;2xdG_SH}sl2C6Sr1QS5{uh6rQ{NqVGcWYNE>6L zv&}K-;`PTJTdI@w+VpR~|Nev3O8wn``B~3cRMY%*x6H6O4-5tdPgg&ebxsLQ0Ig7k A#sB~S literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46a3ea634f3d4038b2428ece61dda8607f7773d1 GIT binary patch literal 597 zcmV-b0;>IqP)TG0>NR#%PkvuSQB< z8y~e}Y{ag3FLw<3f-+N%LX$)ZxlHb;5=^D_`%9=wkhZ9uBZ7&!&~G2rgNkGD^eTzN zvjhmqi-{6F3ecLeg0z;=#$IiUsufJZt2+^!yK&SLW(-!k;?NSquc%cQ>YE1%&Mpg{ zy!`!^g=)e569PR@Ex57Vj$Wq~_m2|Rw`0%>)iKy&&(}bQUE45bKE1I)xeyD5OHGZ6 zL(p7UNm(pbs6}9HzeRIh^!8ZcXc5#28Ub@> jffrMd7gLZI!wdcZjDN6#>nTYB00000NkvXXu0mjfqjUlm literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d6fc271bf0346967fbc67d611bee299bcb75eb GIT binary patch literal 461 zcmV;;0W$uHP)PVVoV@1Fb#NM*f-4yyOsg=6WaCuWjN1%6k z152wVZ0yR&Js8BCAY4>JRB&`wX`AO-r}ud}pkrwIx{Bqsl6B6q^rrpE-dw@J_P&Bl zR!20_s5>^sVr6mAmdB4X?m)$370E-jDPDZjvAL(%VheL2%uMw;ho;UoV!SBnC_LJy z_4&ml=C<8avwq*fNd=1P-pA<2PBYnetnZYqiUmH1xZutcMqK4pGO?AEadoT13lZ%- zO>3S3TSC1S^(G}m8Id6dPc0_$H=^!za)QPDYzSe_xjED;#D!jKdI!RAETX-9jKTD` zH%WB3QQv3$tHu3Xz&ehOaP@1orgcaP_`je&v}>UsT{vy{>IZ-~00000NkvXXu0mjf DA~MM^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1627d152dede4bfbe995ebd1aab493547d095ab7 GIT binary patch literal 803 zcmV+;1Kj+HP)3z0{=ft3#*O=?(t(^;UQ;lGSgT{khiP{NbxTA(?8tQY4_2kXBFW$Uq= zyRIzLr51~>i+)P$crdPEZNq+MbAC9ANH~B($^L&1^-GBNGbpNP2I-~+%rBK3&kctp zjGPI_rh1vjwOsT|TtZOJb(@&vOP3_u%T~2x#$K^zLI7bBoTc_%~L1Ni92% z(F?;N937yGr=CaM?2Z8z5P7s6DmuH{IIf89&Q*iD24=k;EpZwdQqhMr^;g_7R zMbtkPMmAd@pFyxj+oJE*bc~Lx*!=453_R5>37&>orNzO^g29 zJEj)R{Ul2o6B_&qb<{QdF%)eP69%_1Og6@|>y!G_Yf@PZmiJa$HIh=(TWrjAT^HRT zdG*#k1+3w^s8#i!JrzPAP@5Vqko6#wfkt&*^wNloD;J~n<4kTBAJ<#k5b^@ogOS|Z zn1>=E`gI*I5$UBFStk8F;M_W~nA~t2jyPWvZffswV)t=Nw@ ziQKn&^)8b$@cwgUZ_~(*lS4ra#2X)aIqP)TG0>NR#%PkvuSQB< z8y~e}Y{ag3FLw<3f-+N%LX$)ZxlHb;5=^D_`%9=wkhZ9uBZ7&!&~G2rgNkGD^eTzN zvjhmqi-{6F3ecLeg0z;=#$IiUsufJZt2+^!yK&SLW(-!k;?NSquc%cQ>YE1%&Mpg{ zy!`!^g=)e569PR@Ex57Vj$Wq~_m2|Rw`0%>)iKy&&(}bQUE45bKE1I)xeyD5OHGZ6 zL(p7UNm(pbs6}9HzeRIh^!8ZcXc5#28Ub@> jffrMd7gLZI!wdcZjDN6#>nTYB00000NkvXXu0mjfqjUlm literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..19e7e26fa20d205aadb946bd7db2498bb37a32f5 GIT binary patch literal 1047 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49sghT^vIy7~jr5?JpcC(q6B7zG;g@$Rnnt z4sO$lM_ThrmUEl0i;?*LkMr1(-cIhtdOh6EkC>enbxH-+sCEd6_8wtV6<`$1+|sEb zc4~3Jvd+Z!JdtOA7`&w2QFO_is*gI z+E){HVb#}NCs)>s{gqUj@~ijhjTrqTtrQ!_f`oiljT>PJ8gmXjoz2vCT=a0R)~VPX zC8yXu&E)>S%+7(T$00G-z%ItvaQlJ>M}BIkoUAy%_WlF6(=YFQZrs+v zT>aN5a^5*7my=%e{4{)`cNQr4LZU%OSR=bSeAU)YA#a0Pv43+Pym>h}Aol5@*2#7u zm20{$pE(xNC~v2^qsZH1tyW1(gwW+g$!MvJ)9TiVT?aNy)7`nOQ(9u`WxL?eTW;I# zo>=WryZwLTG}D)L%1#1vHpb64Z+zeW^h&|i^51h=A|K3ATeH{sz->oKzZR7bapgKw zEibmO3syYZxc>ghzG=&yg;snBOpZGh2uUiZS^duMG>Xx_bG7rS=HKqOhHu_C#e*m%o2|XjYEa)sWo}%GQ5z*sJ2J^`PKHQKLJ5Wx0kFQ>b+;I>%Eez#p%c=&y?%m_V3^1^P9UoNB54^c~g$$E^YY}h2X@gav^+j?dPcc zs=$;~zM~Ft`Bl>M*9)!F$q(H=?^?S@`co%k&M)6ixB34!F`bs+UtD?X>kP3|d%k!_ z^hoW#Xq6kD|9>A>h1R9quly%}ByHH?F@10JZ(Cp9o#JU$pEe}gJxnJe55O`>9pmLk Wew&XuE@lVjV+K!GKbLh*2~7a@*Tj(k literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..1db04c16a7b29b8491fde6af6c9ea732792ef69a GIT binary patch literal 982 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ipad/app-icon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..88fa3ed987e9cb80e0a54262646df28f526a3a67 GIT binary patch literal 1783 zcmb_ddo&XY7$2fZa+lk~l4Zg~G>f*8$F4_PGmmy)*Zlae$khe$L4Kuh-vQ~){b?aHDG&Bq-BC>QBVmC3qLXAfrp zpejvkHAo!*&`8F*I1?|cOuxmRCr0Tv|1s7T`K*^f671QWuswa^M>hISgkRA>&#yHu zHRTtkr<>@a$C}2t(`%UP)Kb`0OpwYQD52Pu?UjW5c`FsOcOu~!U$d5}dlqCm_{|%o z&Q~2T8k()>1e?e9)b3DMj#GOy z0)$BE9#9dWWIwM~NfZRn21?en%XoY5JKAJcb<`y{ZYnZ{r#IfH zAkh;{Qy{8fbG}sVXt`L-Nx@1TgA((>nBubmk_3Rt)69 z5Ttjy=a7lGIVfT$hpX$~BZa@EBjSMr&TIqPT-lNi=&38)fF+!+%Raeg?Gj8mtbm5lZ z`!S!nQ!6zi`m2)2hcs~YIXW)WB2^HxH0Qetam)bQMOm7b9@zb!C!X7;K*t9_V6UjR z%*VYbqt+8;8PDA>R~+PNJsc6kW@_u|UdIhd{tPCYo5#v%h~S@ck8txT8TN0Hmfanc6FFTuAP|d5+ek$4+Ia=? zzW%H+kmPvr0#FA%!Tq7AXAC?pv5H4=J{(jMQUu;><#SZrRC%*_x%nCH;;=P-7bqCoSTlWkhDHR`*OKNCGVP?-mYs zn@R0XV4XXGV@ot&hrghPwHF0{;T12)@NCC+e<+{yBAhOKZ$W%l#wy2p2Ksz_QGKg_ z{z%(twto-FjptCWkRLUR3PRtUTxejx!ejyH35&^Pr>2@m#$8a6HPWe2?SEw<%qp_V zwF9TI1=yugve4U#UehO2>?_WjomdTfuxqM`fSU~}jm*A3`AYBb+@fZFXy)ePESZU@ zrt!w=3?n%*?6A;lV)01Y+lEQL6rPthUjb?g8R)3PZ*0#McA?jej!Tik6pD;tI;kI) z&;qgFQuGG2Deg0#o&5QoH^kJ)zJ9Q+6UY!C^~Nd1w^*RmxFaA_BYpAqv;mR>#bcY1 zejNf_#QD&>0@0Q)XOGv@+$toW9K%5-d#u4li2it7{bqx&=v-Ad6y}t6Z852tkGgX{ zvrxD`8|~S5H99^Kk)RgV2eMqMl*Vd6k-D^mys_{OS(-n?N mY1bt3M$zBikiTmBQ#x?^)s6$l+o{Sw1;DxzT*@&&UHco%9Zzfk literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..21c1c5ada0dd3095b51ab7f5cb21f9e26fbd2877 GIT binary patch literal 16404 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7a5a66f3201159dee5c9ec99f4e25ab9487f64 GIT binary patch literal 772 zcmV+f1N;1mP);CqbkK1usQJgrcpOgLHv#wulthzFsoy5RK~`*fb*x4@S1fK{#~f!_Lzdn>{3FC#e|0UJH#lW zQ31McUxLIKsPJ95X6y>ze_X}r1EZeGtILRnaNoHU@(cEHyrX*qXz*3|{fv&A!xFy# ztT*-fZCfMO;U>Na7s~_#!!n*_>FVj_{t7CR{gOU>P{i@09cUI`gnO@+G54dnfAv4* zii)Y%YyUtIV*$_z`%;#i^uB9BC`&b;hn=G7!M--NOH9VJ?TM~Xdtyyj1*Lmjyx!+I; zmnsA|hGa}+-5bdLhDx|^K*F0(8o~@!S*nxp-wwhX57zNScxHZiM$P5xC`-W!1y81> z{yUO&1QE~1!&Gu<@t94C7NC3IJP|&9GJzvKqV+hJCpdGlWQ>UJZ@IRDCo$ZeUhcrs zTOvpVsIBH%nsumRxM#nJe1X8O;o6)sb{f<1hSv@m8*Njs?ECM%yBfbrGSP{ByK7bs zu;aiUx-=y4+lLv43$qRvW*sifI$W4_xG?Lqo$xPVVoV@1Fb#NM*f-4yyOsg=6WaCuWjN1%6k z152wVZ0yR&Js8BCAY4>JRB&`wX`AO-r}ud}pkrwIx{Bqsl6B6q^rrpE-dw@J_P&Bl zR!20_s5>^sVr6mAmdB4X?m)$370E-jDPDZjvAL(%VheL2%uMw;ho;UoV!SBnC_LJy z_4&ml=C<8avwq*fNd=1P-pA<2PBYnetnZYqiUmH1xZutcMqK4pGO?AEadoT13lZ%- zO>3S3TSC1S^(G}m8Id6dPc0_$H=^!za)QPDYzSe_xjED;#D!jKdI!RAETX-9jKTD` zH%WB3QQv3$tHu3Xz&ehOaP@1orgcaP_`je&v}>UsT{vy{>IZ-~00000NkvXXu0mjf DA~MM^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1627d152dede4bfbe995ebd1aab493547d095ab7 GIT binary patch literal 803 zcmV+;1Kj+HP)3z0{=ft3#*O=?(t(^;UQ;lGSgT{khiP{NbxTA(?8tQY4_2kXBFW$Uq= zyRIzLr51~>i+)P$crdPEZNq+MbAC9ANH~B($^L&1^-GBNGbpNP2I-~+%rBK3&kctp zjGPI_rh1vjwOsT|TtZOJb(@&vOP3_u%T~2x#$K^zLI7bBoTc_%~L1Ni92% z(F?;N937yGr=CaM?2Z8z5P7s6DmuH{IIf89&Q*iD24=k;EpZwdQqhMr^;g_7R zMbtkPMmAd@pFyxj+oJE*bc~Lx*!=453_R5>37&>orNzO^g29 zJEj)R{Ul2o6B_&qb<{QdF%)eP69%_1Og6@|>y!G_Yf@PZmiJa$HIh=(TWrjAT^HRT zdG*#k1+3w^s8#i!JrzPAP@5Vqko6#wfkt&*^wNloD;J~n<4kTBAJ<#k5b^@ogOS|Z zn1>=E`gI*I5$UBFStk8F;M_W~nA~t2jyPWvZffswV)t=Nw@ ziQKn&^)8b$@cwgUZ_~(*lS4ra#2X)a``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49v$pT^vIy7~jr0?JpcC(q6C2wNxR)gF{<< zm!X=Pn@V73;lpFS>q;LVYPA+N-}Qk%KwK(zMuvb(EW^i%39sE8d!z(xFEmzncM#FUp`O5|+sFY>+Zv;1e#^E<`oZG*!NCV4a~9^`G~ndZ%LTD9e= z(4ivE#GNf0Vw@uM6m_Nx;1oU~W#HYSq@}mjW5yi6hfg+o<=jm1;Xf^Ujb^*4&iW5%shSAbU#;@)4QC2qfezLaWHa<2pvByD`@!j&Q*hy zr5}1-`{G@`@Sj}PakXGiOsMZcor<5{9dDoRllIhE5^B7;^(4cWgxj3Hrx~K&osg)I zj<2x&Xxl36uAQKoqi#Oa=kRr5=jV$vj=6|(rOWTU_i5`RL%zLJs$&eg);{^x9eC@b zL0A6d)$^C|z4@%9vs++V*nGnZug2!zwgz3gPuf&P&nmHe*>}yJ$vk9t;hznb4-Z`` zdb~*Fh44~`|G})2QugoW*3mAnFlk)I_j7&Fg1AYKKD@gpvB*kHC^Tt-`8%EFSiD zPoKDnKEJc`=;?S!6iqmEO7!8En+`J9Z>ji1Z@4fipKDrIudhns=Y2gFKOVh%t)*g9 z)I!z!6HZ@U6~0#Ke2wLlnQ@+it~Q(Q%<fXUFJrUr^IoYjZ*;DdJs-LaX+6)l2iVcPCk# ze_OL=!wpdb9rJT>;VskmLsQVS$+L?B)Y5Os-8!*D`f>c^6>BvktMauLB>hNEtj^Fh z^j#<7`}oUGfjKy{DHeX~e|J4S#=Umq zyECm5*2NiUCr3rxh-l~8C>7Vw9c^y?+>BQ^d7ZJ_^ZgGvdx43zBXQ@>Z;ZR{sNTG9 ze(%EE#_HD3fBGlg;X7?(&a)}IdgVK@@0*OoznN8RuG?1auBoN{<*!bzQqCIvv%hZ6 z`&ASY{__96w%qJQ5%K@&ma;O%#N`R(9Q21RY`1NLhaH<9FpD#Iy85}Sb4q9e09Gj8 ALjV8( literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..19e7e26fa20d205aadb946bd7db2498bb37a32f5 GIT binary patch literal 1047 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49sghT^vIy7~jr5?JpcC(q6B7zG;g@$Rnnt z4sO$lM_ThrmUEl0i;?*LkMr1(-cIhtdOh6EkC>enbxH-+sCEd6_8wtV6<`$1+|sEb zc4~3Jvd+Z!JdtOA7`&w2QFO_is*gI z+E){HVb#}NCs)>s{gqUj@~ijhjTrqTtrQ!_f`oiljT>PJ8gmXjoz2vCT=a0R)~VPX zC8yXu&E)>S%+7(T$00G-z%ItvaQlJ>M}BIkoUAy%_WlF6(=YFQZrs+v zT>aN5a^5*7my=%e{4{)`cNQr4LZU%OSR=bSeAU)YA#a0Pv43+Pym>h}Aol5@*2#7u zm20{$pE(xNC~v2^qsZH1tyW1(gwW+g$!MvJ)9TiVT?aNy)7`nOQ(9u`WxL?eTW;I# zo>=WryZwLTG}D)L%1#1vHpb64Z+zeW^h&|i^51h=A|K3ATeH{sz->oKzZR7bapgKw zEibmO3syYZxc>ghzG=&yg;snBOpZGh2uUiZS^duMG>Xx_bG7rS=HKqOhHu_C#e*m%o2|XjYEa)sWo}%GQ5z*sJ2J^`PKHQKLJ5Wx0kFQ>b+;I>%Eez#p%c=&y?%m_V3^1^P9UoNB54^c~g$$E^YY}h2X@gav^+j?dPcc zs=$;~zM~Ft`Bl>M*9)!F$q(H=?^?S@`co%k&M)6ixB34!F`bs+UtD?X>kP3|d%k!_ z^hoW#Xq6kD|9>A>h1R9quly%}ByHH?F@10JZ(Cp9o#JU$pEe}gJxnJe55O`>9pmLk Wew&XuE@lVjV+K!GKbLh*2~7a@*Tj(k literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2619b4efc9da5fd6053f02122f9ced3d83069e44 GIT binary patch literal 1456 zcmbVMSyU1T6h%tLNlYh~ zG_!Ka(F((jTq_e)M2TEbGMC&alXA(SkLk>JANSq&?m6#$y?YrRZq6F2FjW8mpyBG` z|PypoLg33h&ikI_YKs6UJBOeq)9C3~Sz&}}P z>!*|e041!eljDgvh4~R&g!UOkmvk(O^~O+}wpT6Z>{V2Dsv^zxN<1na)d^?lH^vRL zCreLXIjL@oJ8rFMGhU@x>1A@wsF7)+odFCD_OdQcOa=q52~E*;R_L_}do7h4Or_YV z*LhzS7bzgf)@C%1YtOTC51zS-2Qs!RGdek~s2Z|55&=@{`mr__AULUF7v0*~YXBL1 zWF&1B?K*!-3`3)tUGECON4eV@0}aqQNAS^_g^6D7ByhDR-{h2kE~8l?fm>A2;z0%- zQ3DTFzJ+wHWr?OSH#!_Pbv(n>EBk~b1vo3jBDVQbu|*AdrULt@p-sxUo=n3CS(F_@ z=Z+Fsrs*=`iA7A=N}H4h6&i;@NBcv?ylnf{%k&D;O(XM&&0o8klG>;~KoG%YL{G-f zvPZLVq*qIYNzXXjSEoPjP%qLLBHJ5qv4kL6f2I>Lg}&DVsVE~Ru%JG6V4Y0*Iq|{C zEohxgYTxF2htSgSmPxabj-^4knshoH?BXG#3tsV=Zu|lU`yyd|5&|-4X@PDVhzzpw zZ>1*GPOk}4&-Cc$n&Wa>j=AkxZ(;|d&f=+b!7P{K0hxCoWf$I$a5NPB+5Vx-m)J<$ zNIG1LO0|i+)>~E$%xX{r2HyMh`o(Nvut2t)O4SWsdW08Pm$9P>4t-bB4Ekk>fx2{o zTe`uBQDc*X|0tr?U?E^zR|e1K=ec&}1&6%0yNfvJYjP!TFki?iol+Ifjp`Nci1FaH zD{*gP&+FCn^1~g=Gw|3sO4>TjCLA)0jynSkCr|>H^=8mfrHL#w0v=ypsxH$E-!Kj( z(LN_YRzUB^qB{8%%fqf2c@Iw5dcs+7k;Ej|EF_VU(DVFqbD1-Wp7qnaLllO}+}o6@ zZJ#e!xPJdK-C0f;{!4v>1qXibWlD6(5z{S*n5pZm1W~oWzyqb?2CaO~Y)*H;8WOSEQ7FslCYr(EJ#D*}zNw%MCTl!0 z{w^kW`Mj$2QeI!9?BJSA@u6D)P{qE$Z2XPBmh;8#+gn=+W=8if1jQJ-PK{Q|3XZJ` zkToLedW>?K#E-A6+@2u=B=BaYpX}n-8U!2b&=pbKB9Le zZP8afn)oas$8*1SJ#o+fOhhCB|6ZvY8}qax5i~}h@Qf`Nci)%jc;A8bvLjZy`@>qi z7g6Zz{DD$KOZvm(y3%LmR%gS~dtkAuQ3P~Xh0J^Br`X%D^m7=Cl$R15lbp>?f)8g& zN>b_^{>sFExJc6IF}I}WvaH2z)covta%|A!&~vh9$OG}U#ZPxyIkkKZliaHRZFr+9 z#@u`f1F$BLfW{M(yeDC*n~bA$vHawJuE*{sBlQc7**^9MsBNG8`#beF!eP8x4teEMLY*a&ty?rYwzlkA=s)nSXD z2zp05LJkGi-PxaMJ2aB4ys&q(2xB)Fm-g`YkCM3wDO9BIE`Cf{Zjx2nSSV%L`hNe7 eA50+m+J-U)`<$US$mhue7T}6?bE-ZZl=LqtaIQxH literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2619b4efc9da5fd6053f02122f9ced3d83069e44 GIT binary patch literal 1456 zcmbVMSyU1T6h%tLNlYh~ zG_!Ka(F((jTq_e)M2TEbGMC&alXA(SkLk>JANSq&?m6#$y?YrRZq6F2FjW8mpyBG` z|PypoLg33h&ikI_YKs6UJBOeq)9C3~Sz&}}P z>!*|e041!eljDgvh4~R&g!UOkmvk(O^~O+}wpT6Z>{V2Dsv^zxN<1na)d^?lH^vRL zCreLXIjL@oJ8rFMGhU@x>1A@wsF7)+odFCD_OdQcOa=q52~E*;R_L_}do7h4Or_YV z*LhzS7bzgf)@C%1YtOTC51zS-2Qs!RGdek~s2Z|55&=@{`mr__AULUF7v0*~YXBL1 zWF&1B?K*!-3`3)tUGECON4eV@0}aqQNAS^_g^6D7ByhDR-{h2kE~8l?fm>A2;z0%- zQ3DTFzJ+wHWr?OSH#!_Pbv(n>EBk~b1vo3jBDVQbu|*AdrULt@p-sxUo=n3CS(F_@ z=Z+Fsrs*=`iA7A=N}H4h6&i;@NBcv?ylnf{%k&D;O(XM&&0o8klG>;~KoG%YL{G-f zvPZLVq*qIYNzXXjSEoPjP%qLLBHJ5qv4kL6f2I>Lg}&DVsVE~Ru%JG6V4Y0*Iq|{C zEohxgYTxF2htSgSmPxabj-^4knshoH?BXG#3tsV=Zu|lU`yyd|5&|-4X@PDVhzzpw zZ>1*GPOk}4&-Cc$n&Wa>j=AkxZ(;|d&f=+b!7P{K0hxCoWf$I$a5NPB+5Vx-m)J<$ zNIG1LO0|i+)>~E$%xX{r2HyMh`o(Nvut2t)O4SWsdW08Pm$9P>4t-bB4Ekk>fx2{o zTe`uBQDc*X|0tr?U?E^zR|e1K=ec&}1&6%0yNfvJYjP!TFki?iol+Ifjp`Nci1FaH zD{*gP&+FCn^1~g=Gw|3sO4>TjCLA)0jynSkCr|>H^=8mfrHL#w0v=ypsxH$E-!Kj( z(LN_YRzUB^qB{8%%fqf2c@Iw5dcs+7k;Ej|EF_VU(DVFqbD1-Wp7qnaLllO}+}o6@ zZJ#e!xPJdK-C0f;{!4v>1qXibWlD6(5z{S*n5pZm1W~oWzyqb?2CaO~Y)*H;8WOSEQ7FslCYr(EJ#D*}zNw%MCTl!0 z{w^kW`Mj$2QeI!9?BJSA@u6D)P{qE$Z2XPBmh;8#+gn=+W=8if1jQJ-PK{Q|3XZJ` zkToLedW>?K#E-A6+@2u=B=BaYpX}n-8U!2b&=pbKB9Le zZP8afn)oas$8*1SJ#o+fOhhCB|6ZvY8}qax5i~}h@Qf`Nci)%jc;A8bvLjZy`@>qi z7g6Zz{DD$KOZvm(y3%LmR%gS~dtkAuQ3P~Xh0J^Br`X%D^m7=Cl$R15lbp>?f)8g& zN>b_^{>sFExJc6IF}I}WvaH2z)covta%|A!&~vh9$OG}U#ZPxyIkkKZliaHRZFr+9 z#@u`f1F$BLfW{M(yeDC*n~bA$vHawJuE*{sBlQc7**^9MsBNG8`#beF!eP8x4teEMLY*a&ty?rYwzlkA=s)nSXD z2zp05LJkGi-PxaMJ2aB4ys&q(2xB)Fm-g`YkCM3wDO9BIE`Cf{Zjx2nSSV%L`hNe7 eA50+m+J-U)`<$US$mhue7T}6?bE-ZZl=LqtaIQxH literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/iphone/app-icon-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..526571076fd8fd8626de1504a67babd429a23719 GIT binary patch literal 2179 zcmcguX*3&%7LIAuR!gfZO--vQ+D1xS2E|0}Lt4?=MqswEnP z(vpN!rm-~5gu$qm5X2IDE3w8>K?q~cnLqEGH$UI|@!jv-d(XLl?z!K0A6-K65(J2ptT>J+DU*n zV6HF#fS#_h86Xb;C?0mQg3S$p)ewanHnKw^J~eRj=A_ak_9SmSZ+`^jn1$wqyXKhn+g;iC72x#(L(+-F^b z8?w~Z_=C@XMM%ACS4kUNmvofazk?yn4!n3QzFnB#7gc_BufJ_7;Ig7tsm2AD;~_aV z+;ho=0m`t({YgI?09D=pcMWHoZyhz=gFxm!-1S!(7~kjJkeQ5>rccR-h5G}GPWK=r zY!bit%8O_W`RFFGI~15G}A+ja>l|3&(!rOvuZ&pw+N$PlV)CB&jgs(b%tK6YH!_ zI#cV)j*Ap?sO_k*{@h*~`}1{4P(zKq;y{&e5t;vZvZ68dmv$1<^lgp`O#Aa!TSKK! ze}*4C00xG0NxRHs5zCbRh^2V1QS67Pa6YYrXY0K;9(BVlg# z|FOlnqS5IKOv6NdU#~?+6TeQ$J&M|~R)gVvJm$MDS|x$*3L(wLb?#9d(5&1uxw7zv z(e6s9njF6esZMEmvBG33sa)o&#^5N|R86Txnc2fe<1~rt+o!rB4aGWGFe1ou-Pfao zH7lvF+59nX$;K(*Lgcq~w$_ltOB6b$9x@d=jnr zJjO|=Yru*tkNM8rQv!}!uJd5|By@JSQB8j<$C|+$n!mW%$u?f&Bu)8U{R4&!?5mjQ z)hl(3;Ok^*gTYJRMriiK76!)kwRtl(3))AaH$PT85Vc*J9A0)Yd;S($y3Dd{Xjo7~ z>gtxI;$rdkE%3fRG1*(=%k|0L6RYeeJrlCrJc0m?0VW)n+s31aF(uK2j12AM!pbCi zB-nB-*2m%T`L`h#l2E|AupflOVO6a~*k(Ov+zo~=FM&7|vH#4*xX&cVUbqe8>Ld-q zXSn__VgVdqJJR ))!H&zDypC{bwbIrCCXnTcSm<#Sw;TIjfqnHN4{tso96rocaX zFcLfy0%HU;7Yv?0h{g0|v^PUlPKq?PR!~l>g1c^U>1Ffj1vwsuek0~LwmFSo|>rb^f*^p&L^Phr8hOCtT^>E3NQ}sCTt=V`dP4@#3akvtJLvjQn z_3O}D#sm0shbR^gn@V)zS(mM)F$#lWN6_XWcU8JMocO9W0&entTQ4R{kXe7eE+QIX zN)1YQ1`bZl6O#-=CyJ}Jj^*Oj_Z-?-a4gq~V){R*EgZtwcFcafx!P9i|I(-+&`Pf_ zP*3!Jdv>(7yyj2iy$o$s%}3v1oP|$W={Uj_^u>;OUpOCDwLo|Wy0jPMdW1oI5xb%z zR)^lC-`C6YQ`M=uZ}MGk+M&qrV_aOk?mj7$tt;`JEjE!He`LCXo2e z78~KDr460ptCu`o-u%Vpb_QkmsKK;w6<$Gwm`KiTC=L%keWCj4~Y+5*qcKRjlMIE*el}Cv`83*qMuB&+1Gs zwgSc6cj#xk{+nTRk{-Yr$+&om9FH5o4n8qV(_cOz>h+LMy+1uy7X&IgHZq9Z7SqMW zi?`FoGj7J-LQfRM$eLXnyNEo?DzzIK)G(wqN!MD&rCmaw%d+QU3YMQilUfF~PG?EP zi4ei^>pOP7Ou{Jv`xYIu5r*JHmvu#bQSS>Zto;&oEBV9vFRwNdD~24_Qf7P@V~=By z^(QwiaxGHg_}_UWb6(BydVBWr4q-xjR4W=Pbt0IVpl|Z|+*g6Oulzu*5iaoxoJDN~ tSa(4tr@|AqE4AsY!vEJ7|MA}K-Qj1dpXRXm*qxsN;A984rP=r={RI;mD#HK( literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-1280x768.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-1280x768.png new file mode 100644 index 0000000000000000000000000000000000000000..6cba9032476eb94b2ba269a40e2e0d422ac62e6b GIT binary patch literal 5609 zcmeAS@N?(olHy`uVBq!ia0y~yUVM%xNb!1@J*w6hZ5vX6Z&eO#)q=ND7jg7nq6a*MH`hSZT>+ECt zW^pt5NA&MIj6f|6lm3CJO)Lr^UJIuKh~f}#08s*J3?NAb9|k5M0q?(7_A>i8xO#YFxo&GZ9Ret#L))Q zXafn94n`YDqYWfbIv8yrjW&=*8%V&6Fxo&GX$>Ta7eWogzX+^8;>UTPk<%PBlFQ)f L>gTe~DWM4frjG;y literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-400.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-400.png new file mode 100644 index 0000000000000000000000000000000000000000..19795b6fc064f6dc57d039ff2b4dd9e653166df8 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCf8byPl6p2qNVM%xNb!1@J*w6hZk(Ggg+0)a-F{Fa=?Nvj;0}2cbhEf01b|xn? z@cx-I)yrA9+zG;J_= a=sjp+-M_TuL@qFsF?hQAxvXYPdd literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-400@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-back-400@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4d3e56a66368f7954dc6f6b19a7745afff6a12 GIT binary patch literal 2596 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-400.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-400.png new file mode 100644 index 0000000000000000000000000000000000000000..88a0eb5a1a10051c82b56788768e18701f731d05 GIT binary patch literal 2680 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-400@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-front-400@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbd7f0d69725a13eaa80fe8682e0974953ff66c GIT binary patch literal 5746 zcmeHK_g7PCw|-9uqJuQ4N+2pTAR-`&K#&qgVsJo^fYJ#wkuo%qBArBZ1PQ`KK2KbKO%)NiW{qDWrFW*@!E9>mD*Sq)oy!(CjvmabF!t;H1 z%&J zFw;2x^&zSwufZvYU#)0lGco=vm;FB2XQP~|MCSDUcJc1uTwIZ|x~uY50A^}(0K4-3 ztB&vcQm%|E2qa*eJ)4xvD2$9>`rISH-k2XV$xiI~aPvC+DWN{0w!oyno2pnFPVGZZg5ECvfI9l7yIFb56#=g@)&DqFka!_)ppQ~c_~WY!|uGQCCle4Lp{CNiPAR> z3n!5k32@E<%VAf7?u!d3mtnGh@z%2w1GYvKP^Z;5q*{E#*`zAFnN=@8D=edBB)Gr_ zpV3?*6~C3H{`+(eiuFG0JVjat3+&T|Jp0oe3I@W8BRK2wOnb0#6hZ)RH#fJJxA(TU z)Ju~X#WSndu`$9&!RhdUn;-nPcBU6g;z+*ViwA;gV>lqHY~s0gTQuhN=exK93B?yA zi$JjRHsl?YK_Jo3S<78|tQx+1YA|voe3~mGCV>L5I5ivAhO1S<-O@{)4?T&t8OAWG z2@c|RjAlmt#rhHIz*9-ntcnf5PK5Vq>Gknkz~_7OTSP)%}06}^34eBeBa0Q+!6|*s&$rrfMwGK3n!=a+z4-HwYykSV) zbUjD?lHHtJ{z9pa21DX0q68--5T#rulev9(67t-Diw5&H* z$eC_M<)R#hV*#uKyg0ae7mnbm3#0&io%%32zPB2<3)!O-_&$@=wv50G9@Ddp# zWQ>~HbtJGgpn%gwsz<)`^B8L{&1b6JGL6;0-ao1H9d(7ky3KVEA)y5YY`85hmPp>8MKN6wuaVECu=~}M6>fs1VAqjz~OR4-E ziH{~)plfuR`YKyHCeiDQbQJ4(JoO2A-daeV2iP_skrWKwo`#>;D3#Mg)n z_>NJct!o{|r_3ZdADEP#xrktba+G{zzEiExU1@D*DU-<8pOeNM@lr$+sVv|Q}1S!vMPm0E%YCS!-bC}H=&llw$HKAH) zx5r+2vl>)*2HZlH#@ZNCBV2jy$wM+tA6TN|8jWPFWp_;sSf`(x^qj%jY%+W>$n)Z{tQ)geaZx zfpYXoKEXe0E3?$|`z!v8igAE|lq?o#xQ&&xq*HB1B}`HlWgmccF$mE;ujX;y^ZG02 z(9@Aq9T0eBNC6x9=#OKcb{vA2PpFF{ff*JyrKYGwp@s-E0~Y1CE&=Rs$o*J!xz7@* zDCMWvQc;@vKF|)qtMTxsdt5tJ?r~DI*31Yi#tquxYu`Ps7G-2ZnBg$=f9ov(3El`~ z2EJhI&%N{`TSpQ=8VJ5}MOt}CK_3P0@I)j2DUk8kvHAFGe86_h8dvX>rK z)wT-VtaO@hN#~^;&f^B!PkWj-`JVA8VRC9VMliEqwgQ9OA1rPUX|syY=y*_f&r>JL zn6__|CoymDatEK;sn!@{c@X?c^w<>Gvq#^Ftsvlb43?c$WrO@ zd0j9(b3~A$G$0{Gv``k?bI}XMAC@)EK z`U?G_XK)G{Zi{b%KW}@n)FIC}xD!{jTPD|F;;3v}%sYHM!7!j{Z%;B}auPU)18Cul zGBKEWpXt244F1`6E3PQ*IsohwSW(!@;!}h`cQ$;UPg-a^T%aNjKmeSC`wF16!X*YW z&cH+t@}m9^&4${*-{fHr%#3D~77%{&EVxThzusPvaFPwSI>*7^B5v zL`?D0dL>OGHxTK!Z!0vBtt#Dru?7GS7dxk$t@u@}Xhf4$GKXDfpo+C;E!dBUzmrT( zGUcwZ4!qinLvKuF+87WYm~n1n)-1e4h*cRng6O}#XB1WMwzh~aU6Lis z;dcq;EYqI*URKQezUDd=#{mW1X8Q+4=bZND5ZTv5bWL8pGwSfkq>J;9snrmu`W`}T zq|&X?x^meMMp|1Ma6QK`^TJ$UyBN8@Tm48fI*4T-@;PMo)453zGms#RKrRG4yi_Pq zIJ{RFF~#=s4gkO#?wi^xQ?%;&e$v$R>?hayJ}xkq0-(V6+~zBmC0XSYIT4(#KZ>|0 z0rk`~-KO8f=0W~Jr8d(7Ynk%XC@?1prx8Ve7W*)6{h?3+6`tMJX#lGD_}{|P#OAt( z5+AVtc<3nh%aJy^Z>5}?y7ziXb8-8(V7d^(=V{9Inh9SN@QRk!~nPs{sW9!(h+UOEQB?xoCgW)&lF+4s#^vK8xHBxA$*?(k{75 zdzRC9dJ|C6WU!QgpV_O|4U%|0BAah2>ne&`|c4tb4bLLB|~FAfMvWY zglJEsTg!FIi=z!`%6u^@Jd~QFSW2t=Xz;|4<4!k^SL;m!%;SBaTOGOoYGQG5@$k;{ z$hekhM@)8J>h(q*(Cq|&xbqhXTms^ySt2jEz=AabnQ-lIZG9|qNJ#!ZY;=Wb7wj646tU_YEdSikwQ?KR0@rn=1gBroru0pR=&AkDeA3euQRe`o)onPAdTEda`O z5aKimE`vd1-OoAA1=elb8j1ke-2;&0jg_1=#Vhr~>5-@>@yT=m{15PpQA)1p4$3H6 zF(2qNir(%bfd+zKf>JV88}xOfZ(0!op7-E#ODnc9z;OseG4TC(bBC+@@xz$q^G|J3 z;9(sP>o)fmj9Ad07~uK(e?_wW>x)QTrK(DZUY6(M20rp|vpFDdCnV~>6Cc~8XOz3| zFB>G^FiRqlUey@es`dw8)U*4W^6*)`Xn+5veif>k`|w%RulD$IO~Jp|FgI%|hyLvA zF0MUnaj~_RdY}9Qp+*&CP!9-FIxW+@Rt#KAmV=zWHCmtMiZ-+@qi&l{)bC-(!yIca z05ngatzTpli)L}PHbxh9%oSY5f5qvDxJ&5&YT0?q2xG}gWOl7sbb~q@n1)}GaIK5t zUajsiN!~1(_ZwEKhvgx7JeS$Znc$tsRa4D-O$fDZ*>3!Ci(_?sBvxv$5AaxFo^{|M#cg zkJp5*trc#&v}Z0})_-BiF)9!28;k>W!SM8`nGwH^*5kgt^Rb24MMLv}1p+J;xV$=p zo*l|Rp}Y0>3Hy2}z@sNTSp9$WrvK`Dl*AKZ^)3MuAMy-c_J#K!H^$-KV|Q2+c$e_B z4p_`Wh}RC!okME1*#5E_r?ThjO=xjbjEO%`i#>VzXQkM>Z}!#)yGq5#uu^~-rDQZ{ zzBQMS6&^+i-DvYmBYgOBT)d-;CtOs1TuPMH`dpN3q9hweU=Q!4>#QyU=eqzJj`KSE z9^Y1)K^6>Anho~GJkDG8i3?h_VT8{Tw{$bRvLkM4G1_O)xND6BnrY3k69iRV5#SD! z^~mZ-z;oRYwedBa^mD`Px8_$3{yNa zJ)1LmF(w5boL^t2fV0fmRJrO`Hlrdteis5wYPf5?--OLIUre{LoaA00FBzOSW)WxA zIl11^_{^@Xlp5{$oR6R7{9ba#O^Pem>{!chxeGdI)XL298Rr}k^-$Kvc;H^4t;ap^ zTA3Tm<0cU>)sH(^RjH*PU>lI-_2Wh!YBAAFp~ggnCH!SI_(S1IKwP!abW2_d-t^LMsHKvTyTsj6qTupz{O+Q|(>1B6F z`(&=aCT`cNr@i#!*Pz^B1>gve%2I={V3W{x(Lrt3B&-*<+-*V)YYSF8e_5R?v=#5_ w^&9hciCVQ2ggy4sdEmkHKhM7lfebkg(S_d5^46b8{FcLIoRMDPkM?2z0GHs9@&Et; literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-1280x768.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-1280x768.png new file mode 100644 index 0000000000000000000000000000000000000000..6f06a7678ea9068ecf6aa5d77cdd10c014507b53 GIT binary patch literal 10477 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 L+@R!lms|e>pDV~d literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-400.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-400.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c6175700c12412fa7e10a21f4db55f7012c660 GIT binary patch literal 2738 zcmcJRXH*l&7RQr_hVnuYk%a(3gopGMl%ilF0zna2188W5Dn(e3L}^CiiXbhBvWT>x z;37421OmZ*KuD-cAV`%CBE5t_NFKg#?|s1?iU**L|9fB z002O)TAHB%0O0dOe@*b%;jC?}t8{3Df-N1f0Dy?(4}gG-te*~pKr9Mr3MlK5TRdC{ z_*}NW3;JS^Blxn%^B?6re1j& zIpY3es86@(t(L4+=8%^o`n9m66DzkgQ2l109nw((>M=Zg=ezk^%aO{nW}SmJ{^w6Y zqR$nYf<8eqnCsTQRr9Ea;eMK`$=DW7RK966#*op7n zgOK={nINCIZrpjW^)8S{Jm3gCb>7HzFU?3BO2JNsc+M%#-I`OKV zN$VkDXKxw1*;pv{Oa^-KdM2JT9Jq5c{If>k3x?#-8iAl{)!c^ujenE;wKe>*adk^=j!X z?ut#grBS*V2$V47&`7QI2*=K%GvY=Vk~2_j3s*uM9UT)3TXt?<+$hc{ow8-b6={G@ z5(q6ydW{bpPH&D5S!K++hdJSQA0d5Qe8DvDV)CzX zE?hqw_(PKDg2K(|r`q=UbC6k%=z4CkkRa~OOFN{&F`Nw`MKrS{D`^L7@4Tg`vrAqrDY|`6Hje9h=IUh{Qw# zo*!pB2`Z*Q`TCTgpscti95A-M#i?=PgR#VkxQ-|A-7#+2bg?tl_0k8uT(FR!eK|g| z3{L&tao_0Oz7p+^{^eUli$`h#(F!Vx!D+QC=^wT@&2-xtd#D;xCNTMp+#>hA;(&Yx z4o*fHUeOuL^epGI8Jb)RBk%KunXxvGm#QaUABFGdOur`RyR?g78Gc?5Ln1Lz6VoZ1 z;OTc^xWVgMuru)NXHQe7U`Gyn%GVQDQW5S|vRhkW+)ej#dj8uaH2 z{R`t^wmqCs?1@+4;F|)`Dt?_qSaK1M1>25OoJZGij9wz^T;mOCJD(ILF zRVXRqo+1Xt8{OQ=Db4!KCnlcfeQ&Lz@pj{$kgHz&T%e-3MfsF1nVGXY*Q$ytN=jQt zpCEIz8i~zn1%p0};F5&!G*s&8swv_dhhiV3NvJ?pOz7MG{@Nr1Mg?-uKY#ds#WS8; zQCpXej+yao?Sctwz49?UgIdxjV158b~=yC{tF%JW=L$!P#~rO|V5rn&OCGzG_w>rcOQ&+FrA5|Dca=sw=$IX_uf_jdJk%4Tnk z2#qaODs5e3dZ_fd?m-je;6TPY(ww;LZ5#taGX@RR;eAN4z8i_fP`o>n27q&|UQFM3PwUypSMys3wva7@(iI&-mCLBpcN7`IMr) ze&d6IjKZXgPI{%uX_;hUx2qE3>gleHMfa@F%7>aW{`DnX6#YUVx=PoW$K2yhbZM9xvAF02gL=|r<^$L8)brP(QBuS;IWKo#>neYDG+&vS{KqC$f#3(=CB z`5pDX?aW)S$l!jBEDQQ#_C;cVzjh~??rrU%Q0-(SroU;xpA9nL+EPrNAK>?=n$PVH zzn9v4fXXL3MD1C>Dm!TB9TW=wtsg4@q3tUlkldVdH*wuj|Hn~R&27xeOx=F_HxJ9n A!~g&Q literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-400@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/tvOS/app-icon-middle-400@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8e6a4fd1a0df58575a46d1d351b0b6cd9fe0d9 GIT binary patch literal 5774 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 L`d9NVTmSY~6Mw8N literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset.zip b/ios/Runner/Assets.xcassets/LaunchImage.imageset.zip new file mode 100644 index 0000000000000000000000000000000000000000..07571abdb86d5f0c2ab27e0a0139ef06263ed940 GIT binary patch literal 18560 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 b5Z{3Q6KKvz@%_8=#f9~EVQBW9+U@-puQ!rf literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..21c1c5ada0dd3095b51ab7f5cb21f9e26fbd2877 GIT binary patch literal 16404 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 literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-128@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8439b242c46c75d4ed1f0599b212befee56eaec GIT binary patch literal 12888 zcmbVTg;x~c`<`981OX{QK)RO}6j+c3>5!6^5@~5zIt7$2Dd|q7OG3IkrE}?K_q(4z z;rBad=FH4F_uiR%&KuAByw60asmKxFQsDvsK%gKmtpNZa)GY|W#zb8Vor^xAE;x?z zdM*HfNAlkZ0@5-l{u|<=Atwb?j8N~P9?-2M-$?>Mbu8Y4DFy)W9w|smYI%T;GVy$j zv=dKe8%JB>L+j`TO>!_4qb6s$+Z1=Bgt-WUxPnfAOCIKS#g9eTalHC3D{hjx|hthp}#`XD#>0Z{i zU);ZoMu*#FA4Sh9IwxYrN6oirD>IFeL+bv|AB6{+#W~>D)n_sFxIVKFs{%WsXK=X{ z5vYHxsjQU0TDdvri$)K4%ehK*QdHQ7LEjfgVyXc>>F!T-tsg8qv3h)5+BiL|nGfZPH`LKa?_MmuH$^`g$&g zd?42kWH`i|5Zs+DtUUj9dGKb&Z4gO$m3kpjS2Rl9y+if}>Er{?7*$`@_2+?q*t;Gt zok=4;?^4hI^vpwtSuFloNu%^Lz0k5`@YOm&gJaG+JPewJ#YHY3wG8-+sGc$lKAWSJ zRs(7VckjB%NZ-jq)n8s-UVr)o1O+|4yuIxkX&ohK%m?is--xUsL5M7`)feln8NSj8 z1Q=QH$6KmH*3G)=DjKS)x&<@Q1q^TZ&lKW z{Ksn!|Evu2O{>?l^p*BM&v)C)5uX3PZ1@?h&^|WRmY0{0&Cj!mqy6H_8nv1Xyw<0& z%Ing-9{(ZX-^P{oEN(PzpW3_ZBRSOsTw}se)^oti=S-st?XqxX#ncmC~F>l8y zTMCY(#_spUeDB})ZD&q)%{E;5H{2aQApaU4%;vYhI1;@$P$v~t&6)K?s?OT~9j(PP z!otb9dR_|uxB*wa?-BP@t#KtGP)2gjp^*AUmPC? zoz=hB3JNSO)4+`n_bF6HKwo0B99AMN!eY2WJk(gCCNut^j#@4=x{2*5X2Iz48$AXeoR`v5}2IGVrm6 z-Zx9&3X^ZXu2v$b&!RRpz?GR~;O7L|sRd_(;!muYmdR#+N5~ZN-U|5}iLe~RTq_z| zEV{7Qy3=bU9MkX5-ZCkjJ$ogm0IdkoYDki7WCtvBz3OIvHi{KBig}#B@i-68HZMKy z(J^8LK5@MnOs@19wJFT>ROwcj+`ji&(L_V6iE!3w#%u94irHCV5l3t`90wU45WZOY zg*+RSI4h~6t%)S8>?bEeF?Vfwzi)GB9%+k)yy~%kuJa zS7R7g3zh*sJWX)aaLjAJcxQHMCL@gNUW9XZ$eNM(^fG9@^D^`Ps?}pJ-@iSkiDWL$ zqKf`+U0t0;P^U>lNeO$idEb-1KvrEDwa>Uv_pxH})?{U$!^K;^)M)a1?-lY79(#e4 z+e3}$1`nz=9sC=htm4P&_pXoW4lULHY6it0tZML2^aitO>AyNy@t&=*f%dhyS*pX_Q;oGZ>OV~g0*}%7d~iNA#qNvp<#%9D%+*=_M!^)23+J^_l7T@6YL|zfAfi5E_a{mx2Vr9C^>h+qPU&#?JOIy=m{3t z-&Yjm6&??#g5<|Xhw~GB=SId>>sHLTm9yRhWs@q+zZ~e=ZtIVlD;1dIC8J-WZ`Kxn zkC7I3`}>`#Vno38AY@M>4NI^zS>Jc*Dkp5l|ENCe^`1og)ihjJch--BqTo+3mJ|oA z|3Bf?=Dj=QrI0?FO&uoRZu&sBgQ7Gsop8b~yJ0?1w<#v()JGm6?L#qI==i~8W6%J( zqvtZ(mTchD`)=)ge!kHkX|$8I*s!#7o_}|LKY4Rlz@`uJM?Bz%;O96#kyLQfB!{|R z6u+^TuvM1`y#wnSU8Zh}c@y%8d9OTR>D^HN3Xob=Tn@Cagn#h5oJR7Yxnu0k6NE^u z94-EOZ3Gr=7_%PHSZBsFncICG7v$h~)18%Z^|!QAPey_d5 zVyVbY8BN5hM2E-SNk9f8@)@2lr1k?vZ(z~-*0mm$*oi;l<4I_8kJaAo*;U?O4kVT? z>{7~NnO5cJ_k?w+j@HXPPsGjdMa^9~E2U5OdsqjLR(jv=i@1#Z#-b=to`0N4|HZ8j zaS-{;?4&T9F3iJ362`Y+$~1|dUk6Zk8l!TA^<{c`ddSHJv5(Cp@*a$O-|} zW&0%tMTz^G-1@bq7G5)2lWMjFfs=yx`>*q1ElITRm?W;Uz>E*&g&AHfkRiq#7i8P( zoh-5YzME*4z)q8r=H_&b2phIy)od-)-u$SB-p;}v8Q^s`lRgxpPd`fFN$}5STX{{+ z(CCiy$8^CN@!2S0#Dcv{>cG_9B)ME+cya~-KYK?NWJ+aaS^p; z|C=%!lW=yE;zFKDjhI;<^a@A(qQ~jo?ZXG>n`PhYYt{Cfi9vr{eEx{rKL6il7-9zr zQ=vS*bHH6bXSiqx2@Pe6+AstEV?yJGovrQJ_0<(-1!Bl5t-bvaA>mvUn~JOUqhnZj z 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 XGK~rA#GPz<00000NkvXXu0mjf!((}% literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-256.png new file mode 100644 index 0000000000000000000000000000000000000000..c8439b242c46c75d4ed1f0599b212befee56eaec GIT binary patch literal 12888 zcmbVTg;x~c`<`981OX{QK)RO}6j+c3>5!6^5@~5zIt7$2Dd|q7OG3IkrE}?K_q(4z z;rBad=FH4F_uiR%&KuAByw60asmKxFQsDvsK%gKmtpNZa)GY|W#zb8Vor^xAE;x?z zdM*HfNAlkZ0@5-l{u|<=Atwb?j8N~P9?-2M-$?>Mbu8Y4DFy)W9w|smYI%T;GVy$j zv=dKe8%JB>L+j`TO>!_4qb6s$+Z1=Bgt-WUxPnfAOCIKS#g9eTalHC3D{hjx|hthp}#`XD#>0Z{i zU);ZoMu*#FA4Sh9IwxYrN6oirD>IFeL+bv|AB6{+#W~>D)n_sFxIVKFs{%WsXK=X{ z5vYHxsjQU0TDdvri$)K4%ehK*QdHQ7LEjfgVyXc>>F!T-tsg8qv3h)5+BiL|nGfZPH`LKa?_MmuH$^`g$&g zd?42kWH`i|5Zs+DtUUj9dGKb&Z4gO$m3kpjS2Rl9y+if}>Er{?7*$`@_2+?q*t;Gt zok=4;?^4hI^vpwtSuFloNu%^Lz0k5`@YOm&gJaG+JPewJ#YHY3wG8-+sGc$lKAWSJ zRs(7VckjB%NZ-jq)n8s-UVr)o1O+|4yuIxkX&ohK%m?is--xUsL5M7`)feln8NSj8 z1Q=QH$6KmH*3G)=DjKS)x&<@Q1q^TZ&lKW z{Ksn!|Evu2O{>?l^p*BM&v)C)5uX3PZ1@?h&^|WRmY0{0&Cj!mqy6H_8nv1Xyw<0& z%Ing-9{(ZX-^P{oEN(PzpW3_ZBRSOsTw}se)^oti=S-st?XqxX#ncmC~F>l8y zTMCY(#_spUeDB})ZD&q)%{E;5H{2aQApaU4%;vYhI1;@$P$v~t&6)K?s?OT~9j(PP z!otb9dR_|uxB*wa?-BP@t#KtGP)2gjp^*AUmPC? zoz=hB3JNSO)4+`n_bF6HKwo0B99AMN!eY2WJk(gCCNut^j#@4=x{2*5X2Iz48$AXeoR`v5}2IGVrm6 z-Zx9&3X^ZXu2v$b&!RRpz?GR~;O7L|sRd_(;!muYmdR#+N5~ZN-U|5}iLe~RTq_z| zEV{7Qy3=bU9MkX5-ZCkjJ$ogm0IdkoYDki7WCtvBz3OIvHi{KBig}#B@i-68HZMKy z(J^8LK5@MnOs@19wJFT>ROwcj+`ji&(L_V6iE!3w#%u94irHCV5l3t`90wU45WZOY zg*+RSI4h~6t%)S8>?bEeF?Vfwzi)GB9%+k)yy~%kuJa zS7R7g3zh*sJWX)aaLjAJcxQHMCL@gNUW9XZ$eNM(^fG9@^D^`Ps?}pJ-@iSkiDWL$ zqKf`+U0t0;P^U>lNeO$idEb-1KvrEDwa>Uv_pxH})?{U$!^K;^)M)a1?-lY79(#e4 z+e3}$1`nz=9sC=htm4P&_pXoW4lULHY6it0tZML2^aitO>AyNy@t&=*f%dhyS*pX_Q;oGZ>OV~g0*}%7d~iNA#qNvp<#%9D%+*=_M!^)23+J^_l7T@6YL|zfAfi5E_a{mx2Vr9C^>h+qPU&#?JOIy=m{3t z-&Yjm6&??#g5<|Xhw~GB=SId>>sHLTm9yRhWs@q+zZ~e=ZtIVlD;1dIC8J-WZ`Kxn zkC7I3`}>`#Vno38AY@M>4NI^zS>Jc*Dkp5l|ENCe^`1og)ihjJch--BqTo+3mJ|oA z|3Bf?=Dj=QrI0?FO&uoRZu&sBgQ7Gsop8b~yJ0?1w<#v()JGm6?L#qI==i~8W6%J( zqvtZ(mTchD`)=)ge!kHkX|$8I*s!#7o_}|LKY4Rlz@`uJM?Bz%;O96#kyLQfB!{|R z6u+^TuvM1`y#wnSU8Zh}c@y%8d9OTR>D^HN3Xob=Tn@Cagn#h5oJR7Yxnu0k6NE^u z94-EOZ3Gr=7_%PHSZBsFncICG7v$h~)18%Z^|!QAPey_d5 zVyVbY8BN5hM2E-SNk9f8@)@2lr1k?vZ(z~-*0mm$*oi;l<4I_8kJaAo*;U?O4kVT? z>{7~NnO5cJ_k?w+j@HXPPsGjdMa^9~E2U5OdsqjLR(jv=i@1#Z#-b=to`0N4|HZ8j zaS-{;?4&T9F3iJ362`Y+$~1|dUk6Zk8l!TA^<{c`ddSHJv5(Cp@*a$O-|} zW&0%tMTz^G-1@bq7G5)2lWMjFfs=yx`>*q1ElITRm?W;Uz>E*&g&AHfkRiq#7i8P( zoh-5YzME*4z)q8r=H_&b2phIy)od-)-u$SB-p;}v8Q^s`lRgxpPd`fFN$}5STX{{+ z(CCiy$8^CN@!2S0#Dcv{>cG_9B)ME+cya~-KYK?NWJ+aaS^p; z|C=%!lW=yE;zFKDjhI;<^a@A(qQ~jo?ZXG>n`PhYYt{Cfi9vr{eEx{rKL6il7-9zr zQ=vS*bHH6bXSiqx2@Pe6+AstEV?yJGovrQJ_0<(-1!Bl5t-bvaA>mvUn~JOUqhnZj z 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 Nir4jv1kb3P{{nPr3TXfU literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..cda1f470b902e72c7879c0835ab2f971a95eeb4c GIT binary patch literal 845 zcmV-T1G4;yP)PFthKOmDnGsE$zCqyR)%Hh@J;PP}RB z?(X`Lw2}G^GhgQ~*yUVvMv%4p4>tGd{ptlcs$5k)U^C8A=TYp-OaM&)xd)2K_Z8V- zqa6-hTa1|il3|$|C;}V20)s<5^xX==x~#+(y{={grh24><=39j8o8iHIQbzbFEwxmWk~0GJqZDC^E}ft^xPQ7@WKE z8&=jtC?+{;U};r``=b$<@y4~aC`!OG1s@*5On@N*IM5|SOB~h0 z-!|KEn9a+cL=;6|)sE6eG}StmJ_52VOG^Oh0uJqSfEio0ClQ3G4_#u(wY~-61lbbKG@Jgf8Xh>;_}43(nA_i4|2h5u XGK~rA#GPz<00000NkvXXu0mjf!((}% literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-32@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..620bdaa0b92b47355c7e371d4f30d15ccbfa8240 GIT binary patch literal 1842 zcmV-22hI42P)|ClMT!)$g@PC&fzZH>maJR1PHHe1WGJsdNr_WYQBfK?s&aF4HR!1E9lc3A z=^Q6@fOB6`p_HcA>-qmFEiJ|WDaUQ7t*s5UA3;kWmzTYF;IrIk*Q|U|p;S~zrF4l@ zA}#TFJQOXXi{L)MIl0>uMR{Cq*G;>_-s*HXoB!$TXsW7Ob`{@7$s_i+#0mhHqZ=9; zA6l?z@j+T9TMBUq%UF)KwO)S5D+s5UI+VyV^6TBbn=>*qw@D3sL*8|xr#jI(kIBr= z+H$Sy_GXlo`77s70Q8X~$I3IavfqFNB|9f~>!+v>;HRIIpX;jbTm6U8ynhZ77`xqe zF)v&D6w0!s`$CeT_SYXSOZ3iT6bj{%O`En9psbX1Uq}G-Lc{zgAxYTq>MJjlmzM`6 z0J&PDt$-v!qgGWIjYgs}Bnbe|e`$tJR|ZLfOeQaeF>5eI=Lt>$RO!CBwV~2>m4h$7 zWr4K@_Ii;Xn2ruK5ClMzDrhtsDe|a7USLEM3+sWezGvagc{_i;ph6C1vuH6@i8_E- zlVKPNEp!SX&N$gay0Mu$V#1qDAXt%lzX3tW($XLr*zF$Jae%ou+yl|t!9ndllixCX-qgX2!q7(nQQ6@T zH$;K%9+&9OV;I&NxQr#d*-8|E&1Q?b4u}^7BSH`XoLv0NQAhw`wS3gb^!2@t&a78d&@KU|2VNe!>ckzsC1a7gFqDIYRw|F4(fuBs6T*eNhD z;W38mW(+Cg+dF*!kzYqYa2pdAv*hleU^0#VQCyg_5@m;Al71r&IJ4R8wz1YbkR+H! zOzkkXgLH~=7gB=G;gKODBnbm|`;Gbe`9x<#NafhK*VP?|B;j1+PZ#?7`iOxFq3915 zOx~@YyC)M}5A@u*^TV9k`j=7mE)X0%p%H-Rih1vzT{RrXF_55ePL8Sn_|RUIHG_b2 z=P&+;?MwFA^S^DK_o$&75|EbWzjm*Bdc`h=VFp1!0RG$#m%(5dUjD@5ea5!dk08Og z(r&C@wshe>)cFzcr z`uf_p*S-B+Q&ZzjbQ#ZgthhyeIuqiXmfIMv=fh$Qu>6vX5u|>dEb|0s!9LBe>LW91AZ`Z gv9m2jiWG^(fApGIv*48ztpET307*qoM6N<$g6Pk3-v9sr literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d79199e9165e3e43f8ffdd60531197b919e0ac8f GIT binary patch literal 37227 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 Nir4jv1kb3P{{nPr3TXfU literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-512@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..453bdad7be0fc057e6df7cbd9313ee3043987b04 GIT binary patch literal 123954 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 w$>dxl_Q-#wm~otfT~@-*^btrN{p3Op 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 literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index 2d85b159af02df3e80280095efccc2e4578ee597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77508 zcmeFZ`CrW4|37}7(^OL_(@sf42yOOOHI|ACl`9mj64}~!s(FS~A`x0t6ValTXx9u% zC0ev;pVGds+NODa&s?tyxo)4o;Cp-jV7Xb&obx!3<$k|E9%lj#^mO@oC3pb<{09&0 z{~G{2{4E|3xZp1oDY@$akifzHdyaXS54G}yuR8vAW;{|Mw9LAl0DlPYC9Om8ID%67 z@uMQvq9Moeg2(V-Ml$K#S#?aMm5jTd)hibO(o{XuP ziZDq!rf)<|8%XO`udJy&yuqyQI2GID?Bn_fcU=ijBm-pWPlUJRJ$<7glKcPsWB9MG z15^hEI09+OPh>ov0M;5<+X?=$2>jPL(Da{w3vhx&5(psQ%hg``f$YyGfb$%GtPB6^ zeliM3IPD%W!T;=#1Y-G@?t%R=L_U2mp%T>z5kb||EOI5zjTjPd}Fl0;3N+jc3Iu%n?*KL5D$WN(_(I9&tS2KY6=Zct$8b!0?Zi)wKHF<|M!9yU5gpc&6TSxiJ=V6*?7GqRv=zQl zykmE1QBISm3A2Bb`Y?6k)Zon7IL6a|g7a@){M%5eslkK`Yf-Woj`=~APeVYPM8f$j zjJDV}2#0LTbBmbG*C`7m67B%0_sp=b`a8#J-gMEnnIgC~!VKwaYveX&3t#Xx#b%-g zD>LQNq|?@Xy%YRc7Xp&Cn;HIkPHE|D8mQvc@x`_>j8uSm{HPDhlwtUx4Or_HPambq z)Jwx9m%hFg58lTHO9zw~CBZ3S4PD*2&$AkO^(~IJ`2t)p=d6GFnaynhWOIDMtbJ{& zbDryJxfG*b*ErOtaF_DPU1v6!*&{mUEL)p=$$7BAF1n<}tw6=bpm{^X9W)(3TauFg z>0L3&GH0&+*+{O-UBmA3AG5bPd`;|fpU>Wuv|I5^V5lY6x&8kA`)PqCLbkS@ccYi9 zcRl0ejOOFx8}_jrR{-Q<-wPf$M4hhSIMZqNm6_L;=>?4bx}dBL`9VbEj!Uzzzr{i z@Cpq>_Q&_?jkES!K4s~7r3|J|6kk+hV?mA&3xZ$#%PrB`e3kPpVt~E^* z^4<4+cKmyGQ|({bA5xr6<4dgPee&b`KB``8Dav)jPi%-?xI159wnh3jna=rY(Oxn1 zdvsw#|ALUWeJ1wlp&YmCV7)EcS2Xibzp+@$<;o`k?}@T2Hq|esH&f~56$P`cd-OjT zx(2Hc>=<-ObPeY5kW}xQ*h(LAu8rG~HpR`lme7ZLAXdwCB)Wd`RP5oD+3-!%)HjJ((mRd~q zgbE(ex*;lqCzk$23axlEeLZURV3+sGw>IBD-jV4Rp8xvw>yyr>^SAW8?HdEbq^``_ z%>DhLH#PcDenot9^!$FId#jpaj=QR?_#d`Ef<(uXstrdhulTjLpQPB#PmXjQ<5CrR z@)xtf?6%@JIZdmp@?y=W%*@PON8iq*(FW7< zJtuuk(JarUyjOEZ^^MM6-RKb)sR0Rb#?ME;rqf}#*x_q+!glGrta5&K z=n(J*q|keKw|C?Tcc+1OSGGD?zVYy0_ulvT!jEASh4>XIyY4+3KobVTZ5C$SjvsWd z04MGr(jjHz^wdbXZ`W$_`!Wc9%$c~FCt+))+R{Maa9n)}3PYyQl> znrnV)PsqDumJvA4R}ga6#n$*b_Q$F6<9tO*r)Uu_qxuUX?az)m6pI>(v^thZ=>{as z3l|G7%IxQ61#}sDt9ogT*I%X%alhJZy5rwZw3e@WH;)^B=c~Gc_=GODk~g4TLHHg0 zRb*sjx7K|1-AB8ps`fc?!@-+E7Mdvw&FwMrYRr;AzuEYJ3f9)nGS+@)Sz4Uzy!?YOvuag|e|*t*Bkwal zF8L>D)ZVc|0=`XnkhcKq3{onj)Ezh4nYV&q{WZ6;>+Ml_g_+wRA5?J>`^fZiJ({gQ z<=r*TMcvygw!SGS@OshLr!O4MN^+ttbQR779(r^2y*+EUsP<3lTR`lyRPZed@a?*E zmw*=wtj6&T4h)Fde#x>J2TWc8T7OU)2{9h3z}XZGo&6t8~u34N#G}Xq4W73i^Ct=Na8>Q zxil;3f`xMTgTRW;<);1?}FWiuQ|>UvPR@5P ze0!wydN@e(A0z;C(-Gfer_u1W2C~;sqoN(Yxy{-36wmiJc$zQ22iL$6cY&aIv_|jf z4%eK)41&sq-hMTf|FZEg6_aec-P)HM-Q)Xashh+m)%UuMY4>V%Ji5qFo$9_VHu`=1qLM*7*JSi#3^K4b@9{X_3hE?F%{K>biWuZQ@qmBz%s?s=BVTZ3< zKQ$JQ?IGmIGoE=j3w&2L^S3RbEY45s2FkLsgAx{d0|Y3JdA19tg-Uw&J-3Ds=UGlXT z!<$E~L{&xqU6*7j6LRqixYFfVxi@(?Y~V?@i7 z@?(KbO-&_5@4uu6BJV)l4>|vwF|syZ+|p(QWuA80zFxsN!X@~zFKu13E!#OZ&XD72VL;QF<(@bV8F+D zs~XssP9sHoeed4#!*$Pt`Xr=3i}&zMkydN_0{P~lfLG+a;NuT$bKEI}XP4siV&=2m zncWJut$EW!Bdz%s>(p4{iL$I7Z5Gq9*_88_O;AbPW`e;Ql&N?Pl}%1gmX_XezUoj} zW#2}^0dZbqrBEXM&U;4zeRzU2jX49oTPTOGi*3!p5(}ThS9>YlpB|P3Xj>`{wB$~% zx5}Z|53Z#Mqy=XG7CQ0A=mnZ&r&IK{j~_qk7O$%uXFaJvs9-~oBW)6KIfiVHbc`%8KJD3WL|IHlH>H#3rUhl zJ~T>}uXNxAgrYH8Fv*(wC~5z?36DtGN{0V)tC_h{!P=xVzAjR!xAjXAg7v1VqmMr) zepgE0r!h_4eACVB_^DG@)_+*cOj+hH!_FP-y{{3>cq~>`TRRmSzIh&9!Jo0w^Re9# zJ`$dAFrVjxEfL&!a;qc9-^F(8@!obf6RkaeXTY?bTx5tP7aL-6D@UY*b>5r(vVtA2 zaRO&RHIRlsCnUS zvE=*bHkW-ddZP4M+Ak}lt)`V|8qj{h(q8hw@Y(Rip ze0tmWZJ^6=WxpZzV~&;YHk|kLP?(}q8n#tqdimvi#`~WVwQm&Px7%DEw8BExU6@&~ z9x%PF3NlQD(Q2TYzCt=tCM1m`-dQhr4?Pe~)?W-$Fxi#+^l9hCm+!ITR({ypxo6bW z#i$3qGrtZ@*oX`^0mt$6ZoD3rCBae@33a!j`&|nw_{pI>DF7i`9un{4Yv^a1^v-8% zO^biXR2-~Nee5-$bti%4YbS21@zX;Ye8}T!z<255Mb^gn2u*p#sxQ?*p4b<3OSg9| z0X#LlL~BW^si3?lUhMK-#~P_nAC=D^$s0U(%a3IzB86Es&h;kIEIxg9{k6GwVi_y> zEd$;ltj&dXx#J%tFWqCwJG{3z%V=p2ue)n7{Me|dc z&Dx)rT`iQM$8-L|g_9;`W{W0U*E3kw1k#?r?{Jk``;v7y_9tKHX4>%pC%x6V%Uzo0 z^p(44mLn~>-tmVcCceN#>$A^=S-xUIIyb9`|Cf(@3UATpIS|a1n4X&Y)@Ho3*q!S5 zapl$f2r$G=oLHmzEf656@cOnmxsVs$&zsuxeS+u8C<~S4VME=uMS;TIiijH@e&8^VxAb;0L)&F5Bg$~T@&bt_gy8Z6u!AF`*cPQjYObIxgkVPIp3kw` zBt!enN=jjqi-#gc^_zdMGWHn#k_V2sy1LTLUZ1ZX+Fq&QoRHIYI37>L&8E`V6s*Rf zM6sRv*$*!CYISeM_E># zP1f(LxVF~POguI>*E4f=-pR?4TsL0nmQ3D@#_k|c&1Df(pHDcp+$nj|f^(ifv1E~BI)VyhvnHv z0K`tIbpEZ?;prmkJ#f_ieB_Kih~+6c9ei_9eSjG>ceG)quloD0@h)tO*h1Xd zf58r15zk)C^3b7jfvrN8kBoZ)9NwJKFF43 zC#=uPub!(kQk^sXSx^9y&3Sn*D)I6NBL(5$Vs2iEE4};LPV~IbE9!vFIz#DG?Pk z|GLiFpJ))^3dJ&Rf;)Ha=%+%8Q4fRAD10yQTrQQ$AIoYRF+aJYszHH76W0YH78DvK zPc9mBu24Uq5okh4?-u<>cjQo5W(4@z~v)zn3ANg(oA4ad}VS8qR6j&$MtV zTOaMSIA~Eh)b@5k;bH|%Vt%>uFJFbbTqRH1heEBi=+I42S6AomJ!sM%IoB6=_agy0 zuVBYZ1UX47hn#c2&WYnW)!j#!dpZiae$4`8+qL?Td$qptUrT0d(*H|ErP0vxDh>=f zWjSP_3Gsl=tc4+-D|aMOGZ2uDb=MZIY*51>-^3nyOkiiW_R{uiPWP74+>WRae=b5M zS>bw!c{|!LffDbUpi)D#N<6_p~ zORsw3yb(O`RkS!EZf|sTa0?`|S>d6`Sz} z>Kp+(k%6M?*_pv=1Bo+cyvVoJTdob?2Bd4+;@K%Rb76l^t zokP?L$__~p_a#1B$PShB=fjouqRsI~9%p?M!aZverMHx24~_}rax8XP!26>&bdPs+ ze&t`x4#uf;CDE24MKRA7E7b;5PD1@Mm+Z#+vJcyxdr|M!FXuhM78*RY23`2UA{DXhIVzB6P8{SIKcO!y5TZxqZ8P83!g0fWbuI`R)dEw8u(Xfq))%cD(DU z=^)d-tzfRH(0ie6lN$EC=Lr^Lx>NS|Qe@y;6ba&|L8RMgoA*N1lYOJI_*h5lwPX+y zcp{@cdHX09tBQ60;5(6eYC6J~gS)LU$uL3i^TKks>x_Y4Xb^u*#?ov#Ni4{gUCf7} zfW2UIi%6==0~7Hlmy=YUyHEec15CT8hRa}J(iTSYLrZS2bWSjyvgeAXwAV-S{l*!D zB=pNubh19>r1JvQI+Ehd}r$e0Fii_R35`Tbi?t#VITI!efR4q9zG0tUju zqhn~ad%pS(rI7@+xq<6Y>{vOaPEQM0TIGy zEXH~HTds5O%uUG8bsd{~WU>BhAgQPVtg)BtX_f&5`7Db?a7{DIlm!JpJva&CFu7`u$oQ=JJW@~u(;K2$%KfgfnXiCFiG0$%w zAy$cPN$0L=X}MfmTgyC6N0Igs60qD2Y=;@r2LO>NacYzlnt;9du2lKNNAZDHx&@6T z$9D0{<6X4=qjVxmT0Xc zi3B{sX#KF<)LotvkNNm6`d0-b+%Tc%?X+}tou(EYLmwOBftw8YtUte!hxoN;FCYfL z&)YRh8E$%Gw903;!#&6ov#Q3{_AL6xc{_;zJT7}iYl}Vq#(Itb3Uj=qebw$OQ~M;= z027Xzuiru@9G4NHv8b;)N@*+b)IAcpkmk?+FxEzDvf^28=zQqXlR!FsFyXVb0leuQKh;iB)R+=rmYcb&LS6nOSE;S4%U= z9{ForYZ*;&AI7(0UV2F9UEMFDM%Zsc-zFM+M58a?6SmEk^NQw!*tlsB&P#k1zaQe; zYigeJ_GWYK^HVfS7IUuTaQK!E_P#crSo}{uB4$MJj&(pWxKP!5erhIE21&`sJ(J)k zZH?e1KHUJJU5k|(%q01lk0+HVVJm(p-KVeJIzw^0yLz{xxIQKv#3~D0#j5-xD)5H% z0y)%}SjDdI7DcCka^OAMxOGCCngrSP2VD5`ef7MHS3HBmz2@SBVOBPzI1?O7Td?WD z28&imB=W6$+nH1CVeX%`eqCbO(;!58DSQ?>hYN8XoYEIS>ryP%a7P*=+JMVF3 zgp&ZA>_It$ zD|5`EZJ><%_w|q%5$M@Ha22+nkYQbR ze>-HYZWP!UyOKFZ6?SX;9aboL44)DQplr|vS+JS9=R}v${Watl{b1r;>L9X(m*jDT z5i7R=5KbV`(3_Q~Xk$gf`tqJV5jG>EO>YK0<(c9sT=cqMssZd;C!wx;=uk;jwV3}J zmgWt4;^X4ns1$DcG4yb?_q-1dP{ls>yn=+S`}75WR=WAy`B&^}mVA>{-hrjeOGn+L zKm2pSWk~0^N9THRd;k+UI4&>nVfS~il zC59#as+*cqckPa(vQNGR%}4882hCC>CV9!sBwYa+yoN%BYrbr(;{)a424EnA?>f6h zl%8tU)vtjEp4TeJ&O~c2W)NmMvmGN&*>@h$TPA=derJhNw~Y2hZ&yBv49}Uv8gWU&`!tkz*xq ziFJS~jLq#;suRntnrWIEiA*fP+Sg<9o}HOL+gA3N~sI@N9+RI)QzDdd$rj1TeJfbrq! zI;FDy8p_}f^oK0gso}R=V~kF(^d51h5Sv-iDJNJ;8#glgX_Uc=hfA^oBNz2FA+H1h zwn)2Iho5*_{=kdmtia{U+@Obg+=hA-#2A%6UQPmIA9prq!o<*C&7_FpMAA;Z8Mws3 zEfBT7hb5`4t$ovLqOu0NT>fGFcM&1rEy#CpFk|b;i*1MA?be**_}#~z7yNw(pTUI; zRGtvgL1t4TpqW!hW#wgE{WRA)?1vxb!I+Hm{~5DJ;=<~ zS`>H2(nXxHQL7OecI&g~QcG|nP@WJ3@o#{g;3Y)kJTLfq2S>t>?OP*d&Viu&5?2*| zxd1{Y%4o~D>~gywjbyjFHCyDn4!XTCoz*W4U!Z>2JaKgC@yT>G-dG5rr%z^{^X^W| zA9*1brbK1fydsg}fS0*54p2l(FZ5cNzu5`SQzn!!y~`brWg%LzJ$+DnC&3nx}j{DC_DoQ6?)r z0wKc5iz76+zu^CP7I6z-=~1u^A7Y4f1+!_Xl7+)N&ak)B^(J>7K}>xGOt|zUVD;(+!Cv~`QxW}6u$B!Rh&X%NBP1aLf zSc`_|(|(JU0HN`O>msEW0BjaYuX6i#I^h%!4X)?N;KLDs*NO8ufQb~H;+wW%3qTj! zXiV=;o2`d?yJUh@I{W_~U*F3T7ZrUuOQl@={BWsR4f96M{()clvT*iBbyiOWZO&#>tQg^#)?=F78ZnN~ z&L(R>sWVbklK*4M;_{+tY1(gC27F08 z;Ry(ICT@XM9#3E+W1ArexhO(@u@e~c(RKNu{7Wl#fTp{Y{&ts{T}?HlB8uC9kJ;ChO|Sy1)uo3T>%N^B}YYj?W{&R86G>;o2km?K2~FlVXZcbMmey(Z4I zddyQ-2xhnqH%U*Awqs(svsBM%jM=uD`b!dJU-BN|kTqnD)ylP2C`{f3m!|rv-NSJ} zHV%A__JZl>nII8#WfS$pvCz@X!X|%KIbe5KM&0_qo_&34k=lXHDabEfl5D_Py92;f z(F%$-q8wosK65$Z7G5vcXcH`@5c(rjQ$Z6Uvv}hsr`k0zt*xULZmjmJqi>Z0_K#G) znyehdn4%B#b$%O=v*kp7VmTQ*cVB_(P0)aB6XYz;Rg&Q$_Xz_N5t13Z}X8k~`QEuHVZuC7Pw| zb?^VN?roe~4LFf*?%h3JBAp(Oe7l1)pczV0;$b~-Wbcxc2bYooLP6kG2bQ^lMWwEt zNLu2=a#%KQ<|;%sAJn`(aIjzI&b|nmb9o zr~t2^D??NebP?6(j;bN_H9=UQvuGM*pW=`_a!s66iAU z0}k}iOYg}T4s*q3t{@?(q@RA*HYA4ce~(6VH1Vs}q8V`UYTJ;-|3 zq!UqGzd?m>DPQ6RprD|@uF4V;5(9eb!>{j^KT-(di8?k2!moo1r8@xi^|~uTxe7Nb zYOsALSYgpvnE93dqBD1Q|4`k@vCi&>jMMzbK`x7>pmY0-Ozf52dMEP&qB?JvCMF;khn+tL5R%x@vV9{ zvE-R>>b&%;S?V&d%dTbCa8`F3}!}J7nl&|rtjbc z7rDV?6=gazchY{O&qRIk22ee3fCs8%Js)TaN^=L+zR)%^-|kX#1cU9XbW0Xxgtt_7 z>4vqDNj2akL54Z|Q9f)rEPE-%sMxUv)Bvw~OX#3RA#BbTN||$hAqbq*$Q^^}G@tr= zx~u01lbExShURZ|3BXzEZ>bz()wxvvCh7yWCk3Tp=YN zq4^}4mv3UyuLumNPR0y1X7(n0K>*y5;Q>v~CEl}<*SG=smTljD>BCL_e9}s|4#(@8 zP-Q@lZM5vMmI8Mr#SyfGURGlx0bsdacXKhh0lI>EXTfB})#oWGDdOx!HU3yMkuSUf z2`IMGfulNw>_X?sE_4|;fEyno1ZJNhFlyq7{XLkv`63o58>7-QRijUN4r#2;!GnQM zvamCFvK?<(!jh^^)J8->=`iTti^6`#$BFLpbl6x3r3$Zh9RF)4e{5VU_{KvjxdTPa zt7C_$EE91E`S7Um@HU<}8YIbd+lMXh2f=>icku?^<`Oj!R;80KvCywDnu z5)ii0{qD)=nxEwXDT9cyIyR65yAF9S^~hL803NLF+@K$AH%s#}(KW%|jN(aRjT^NU@G#k5@kfd7 zeCcgs(pd)wkqe0oI6ZBz(f=$o<`oa9HN=jY;QsnM9_h+CEeJgLVlDtnp9wY@Gqr-Z z^y+N6j|LP;BtP?kZCHCV&dF^FcOuSOAcIhC&$7**36Ke%4Lky3<8k3M6MvR4=*n^Y zXTf16cHIrYQO*x%-d>qjJHiR%L7(lo%Fpq%f6ly0-qMWV022wedaG4Y@h$}Q+{|uP z$nH>DmdLuyBE=&fwPOUJaqUPBqmEkDV@_1Munx8uU zvBM1U3`M-Lkx}-vdiz{O63njOG!GF%zPO?Aws(?o;I3uyh3!(T^qWlSZBrIe$zwf_ z?MD_CM=2D)C@dWZ#K2UVN7TyS@rmFCM7Jp6H)i85U%tG<{Oa(V?Mek>@0ZIXXlOC$ z=H9|j^5?$;=;}j?vyAUu4xtk!gq*2IW94a7=35OZyKwW0^__1RxDQ+MH0qXECHU9Sk zpSvxKmQ(Z;!Wh;QIKn^; zL&%PfjtkJo6{*{os6}v5f8NAs(B+0Y;puQViz*4_O4rV4$3q0V8qmB%#)CGIqPjV( zQ-}}F#rDD;#Nq)}PBJHO!UK!nkqCcBR^)`(<`am`%bSl|v+riq>3(MNPB5f{Ji7uV zLFV0JV5TU)`#{*9(1h|GpwEGqu8`fbjgi%C_t@gZiTWcI7;N{SX3>;gzo#r+IYftE zK#W}mV7FfG5L91HrnN@ z^AKPhd8s0|1m6)<#50*BBph6{o+ zuMU=L@RC_AEFo;GnYa2btKUb7^N6Hmc#Mf)#5fU(>Oxx zc+p4!k`gKiD#~N0_1Ha!*W73GfaRwO+A>^`0B9Fi2QAhD;2T1+<@exNx=RldBrk({ z0CKuaS^XGhd*}Dh&RC`yH@Xv;ror4=9^2^>QGprl!wmHhH9Vk@)-nPW)-YtVigrEh?@Rh7w0{_Tx_7bWqhd9}+@+vpK#Ezq@Qe)rlurqmxT(V){g;tFPub54&hU|E zf{OoG8$N9qJb|tSiGulIN8l3>*_p?C(PM_-Gn^1~s7Fc*@TYW%;QUKh4}&~F3grYr ztl1JRJ&oQdXO@CHFhEeRd8LN`GWSw{)K!lD@uSXnsL*N+M_x)hshC!x#t+p7vg>SW z`|%Z)h3o4PhnMuJwPr9v0&u4-|wqt4PqStXp&%T8^QX)9nO z5l|ShKBG5;^*jzlz5C(^Rw9g)b-`_Lt$?!e$FEL;syqR*l^}h&7ITc-ijOXN7LeS* zMny%vWtc2*Fcoh5J@Wu#Tahm@6_}hlCB%+P@?}ns%A>kc)7!_7MkwOXn}MpPep$Rj zk`Epz?%ALp3X`wbrhfYdqgAmd7HQWiXtegS{TmW|1nEBsuW5&=o6QI;FB6d4-3Fbr5 z7?c-uZA9baH?U>vQGRJnCSMs`QvyA;Yzvf-FLNdu@s{Wc0+o2DDV_W|Y=WF0O!Hia zHVGK`=r3C|Qrdd^+)+=@IdU!s8ij)f2~jHiAMUtOuX^w2_X7M|+I_uvp;5X;K&}9r zxa`{M?Rjw<*rLy|WfTYNqrEsj(PZ251sh)UklzO2z_ZO$LRlQhM?qv&mF_)!X*4n$ zJdgq5*r;8#isaImwN{M9ft@&V8pjx%=3uE*-)+3igM2nbU|lCEy|)vABW69_FLz%9 z^!26k5XaVFY_-u#`>qyiHbHZ-UmrU%3}STvoM|xGQE_u=^hWT7L&#|etif2*rF8G{ zr$LJIcU4UCHnG7Y0c=y+rvrn*x~Q(>ab_bzcjKkQ4aZl)Fb{^tl>kn&S_pbo`}^Vl z+@k=fJ%Pe0I$C$Fp}zOtsA^`d#Z9E=0!V^s8vr_*{AX755y$f>S!{^tXfECoQ98sO*W|Jd~A5;i*3Un5Plc_WF$ z?nT^iRW_9a2iU1WKuyIA#InqH4=Zyc^%WGWHT2>j@pes*F~;Ls0(ip#WI&6Ygv}EA z0g&AgqZWN1FItN_@siJ;?QShu<@{ORQKzv{UzwkL2OlDCX-+g)Z1g&v!Vzl}FQA^P z7`5$Hf`bq+cISZ7xhU7F*L-v~3{thEqd_o|da?3N;MF8-LN@M#@4J3hTmp$9i9qKK zGsPP~@`lh$q$$ikDB0T`;R5wUNLfjB|A3C;5rSakU0xmsnv?SMc=Cze-(Y)mI}Cd_ z_|+5+>F1-CuoDD7g+B&hI!*+ZkXxtUmQ)`3%kiU&A^6*t`}_zqQ#986!r!Z5Sm!-FOl|5f1!fu;F$y9N`B-2|*ypP3K^3xvvmt}%9!zf~Nu1h$h&SJ`X; zsw^NeDXDP>oFVOp;i-tJ)HQ`Xoq-|3IN^Jp4N@3vg z5hH+P@gL~!Lxe(~SJ@`^s_E(JstZGzvJ^O{&L2;t7p#xouKKyJo4|s(? zygJ4XAv zIRj;tip`EcTp(B16Gp<>esOFhMU+8$h_I19A+vR4fsF0j`k`@|hzDv`h=H1AJy>p*qvzj72X4 z-*~rNJ=ah{1`L6-yP*0pi50IGy#*LM1YuK8kNqE_aPTknUjApNGB6`Sv~~xu1(g|g z^T_`&M2iw2$qljOMb)3b+zr)l^_++y5F0aVVuZo?)1K_Dq`5(Yc;Rz*I0sa==9 zec22QOu#lylC8p@IH&6X8%nMr@8q+#yuus;(iMxsjAU7bwK$8NlTa>41>+u__v^ICMg|RuR<3Yc*go~v2U=5b34&Ks&hN-6>- zkAcCB=#L5-QSL=bifIcQ?>OPnC=4dudAB0|CGAS$0e0GPWmm5^Z{Fm?iMDOpEw?@S z!DQtNC<%w|GUUTUH>${N<#^-afL)BSAPc5dlbL(#n-D|6a6S5Ww4fw8?Q7bgrXcZl>XZdy8X9>7}&X zb8yu4M{&opC7F!GNJV!-@ei=ME}vrIY-ctPD0ovjHG~Hdx1{D-Fb7YLQP?-84SGLE zOj7hT#*6&BaIoaUlKe_Z$Y!Zvg4p9fBV>88&`V$ipO}13Cp>>A?LJI68`;a`Lk?Zs zq<}9KLFGRk03n>_69%mSa<5gdIq0xlcvL*tWauNS3tR?j;T-0I#D7eCfUXFP3p~af zut6GY&~yAA1R`D3)O?7SJdQ~YUVvr7zhVQFOF3iv*g4tZ>$8Kj9d{u)0~uWK=$(Ha zJ&jFW6v0J)m?16U@NBy(v?VnI%17$BXQv1T=IbEnP!NUj)E{BT4Lq;BA;ezkq+Uem z&=|#TD~;|*ssE6L^BV9PPu%+O2Q3nYVG$b-Qs4|jiPhCf?jmlt*M!))GT3*jo6F_{ zpWmUfGr~Qg+i;}(fh$7bGgS+Vua48Dz>#zVLzs16$%*JL0U#)3+=F#(k~gUMjBg)%9E{%{3iil!dTa8Qu82NpJ0l~qe~frfYnAJ}Ez z=2iLnLe0owE;i6J_Q#Ts!egvHen${AzWZMe@W&Eb5VEP>6XPx4gKyosCD$#2!mmew zaO*ZGO*2^adpr~3q&7k#AVHnkiI-g&&XzyoE`HymB}P4Oj<3oi#hL-j5$1MIdiQ-n zV9h-MlldhO-hhLBXqEHg==wvCm`)73uXv&$fZcGIhUx<2{xGKuk`FAQ7NxHT9~P)T z0(1=_dY&-K%xpcxiR($Wkt2UOB?QjDU%$MZeg6pQC6NI|%hBO>8m0=@6ZQXdy{qi? zAb(Lh9HlZo2=xR~i+F27dgsVDAfYsTGjWIsFh8cDgGUK`e z>~%9pJDJ%7XVI=oLkwc(sPezJ+5g^G0sE?cK!Lpi!uX0xNK)KcUp}xRaIq&(;J}fb zuG8nVoJ%ZNuJH(YK@AKxq+>R4HY#|BK4OU{yZLpV|06T$z)E{jkp3^tlD-2+JGPg> z;jN>f-VeYQ0_2ZR;A?`$HP9bZ;0%~OtSFK3Iv`OSWab|WUMguJ_yWQ6wzfO1*-j28 z1&{Gd?i#|6U%1#!8597pTf=rstE(qq4$5FxDOVuS^iP2wbsMZ7c7T6;>qGU@JQN~{ zJO+$2f?$;m?>~wWlxWNgT2G*dkt%sP*q=9@$bh-XxuiW$fW8MoziprV0O$PMU>6C3 zsg+2G*}ebRPIL=5fV==U658Hf=ay!x!fVjEep>5Z6w=+WJAkBapbUjYHLTN#7mie& zfIZ9S@Wn%Zr^C|Pq&rRk8sXedG#L&(719$*c zEQy(i>0aH(abWSi!@8xQyXyqJ2Z#n%dv@Kcv4fKqbr*2xF(|v~6+$?R2a(nV<2!~ON#Vsr44IW2%Fal&b|+a4M*#vE`gdVM|c zfa7bL&fo7SD;|V-F&=?+<>ZR;-2USOXW)=U$_H#X9(m0TDDYP9st=}Q#vGLa5Z>Xz zykF`)p5hNxsZ87dBx8-y}`X4EqR#dw1XnoM5qd z`Jen+{I?M3JHtj=*U*9d$Wi;%oDK$HESt7Cd|Tgpz;HS7|8+UAu%sawmhY}57tR(d zRSc7Wft1hW0K0)Qm(Pp;tX!-IB-U>LRpdjfJ9XHpyxbwSPa2yoQH5mYtx+mM7Xgbn z$3O2&hh44VBQ$>YvtnvC9`w9{bhVPjpBlwZR*p?ukrO87P_cDoPOF*#s4N1Cflg5jE+#2 zA)bP<{rVPm?w_tOCs`4<5r?W53D{7e>aE`hUF6c~EJHZN(mV|L{2~^ci*;@jqQofM zw@t%o$i+fWK{7nb+TT~hFpd3k{!-vdh3Wh|H}BZ5ykjD^Qh_^5BK6LKHj${zTYg0{ zdj77m+VV)N2geU@HgwG;iNW_UXH)0X?-tq3i6-OMj%Lqm z$Gu6)`d}#HDrxB=b@fs8*{-CU%v>@afggL8U9aKW6tdW*zn?93`-W};wvYsZR|*x1rOQ^(uYt`nR( zy&pE*;*UPGO1fN9knk8)1qS)x^0$nRG$a8yHNDuG9Uw5ss;{<`j*!}dUethCS?1?c8 z!yq6gE}lt<^||x=pep-g-{iIh7*XVJ&eN=F)20Igc^k z8U1-)MBO*b!`Ui;66eumkwvhxuA9eZQ*gBYoWNd^$xH_vo8VK+L%~{5Es({3fzHNU7oKkC0y+ z1rzm+ob=~hWDvW&|9^QaB=&sS{q^pv;rPDze+t$5DzW74R#%lbWKAbqV3C69?KT64 zaz<m$`~TQ`^JpsDE`Izv$5BU;BSi@vG@8qlN=_+C#>`}B5SfQiD(83_C`5x) zGL)1dq>PDkN~K81m?4xYbLQzdzkN6NzR&x<-+z8+J83xhW^wasWf&Pob)QPD5?4vn`-3PaY#CSa_Ef^HD{4xlJHyIn0AjSnR!*S((PimazcX+F(usKpX@3$BhMUuPPz^C<*5U`U@9q z>fM{miJ{I@QQ8#yPsJGXmwk! z+$5PWL$={UZK5=+<%&0WQOy|~$dC*Njy`?lL0zZpcu|58tF)QdpGHLe%VcdBc5Ou9 ze9VtOZT5EESflylt{?JW+Sff{*wsJ(sm&PBbsl6vsUf*T(Pi672V zHb5kl6j~HwDtTxH8;uHat*J#gT4f4aNpeIvRa&6yA}So{ITQk7{Zlq8u*W7O1UjQp z$Dd{by4Naa(0APLYR+l5jPv`{pzc)Wo8EI&QpU$h&(vu|d6;$X3<@nR=^VaAY}*aC z2|FgY2?NRXI7&g1M^`6^dF`{y$Yye=o!SqM!{I*+NZ@%&WQ94s)}AyxvrMs6>BjR1 zteTf>llhZ>;o}CbtI8Fh6^v-^X{qFSl@3ymof4qxf_IS&L{VCO?s5$jYt5;|MjIPN z#;JQJBQSqL6Mnbk2Pg3#WlNv!V9E1al! z94lG=0^qClhd5J+K%s)OOhfc#&Q7iFm<+ndI<~yuwMYw*p1mxRQs%)NnBMnt)W#fl zep?bsu*9|b3_qhv;=Aq;7kp4dEokivizo9?^dcPN9%lD{G9HpNz|5nr!8Fe=Pki4W+B!=>tq%5$+Q#^`cp3}z0uKoUdrOsTh!Rs7gktT%DCv%Z)3o6aC^@Yb ztNrG)Yf6J{Rf?a!Q{Q-M#S{8Fd&e&oZcvNmCNJOrY_b2MJoF^8k)0epA6MnmGee!U z8?C|^up%5K^2&EGq)F5+55ElSYgFHTNN7x^EJ==?G6$6fA{%iW&1&CLo2^mYa}J*=RId#AN-l!-M%&UaM8TD zjyPp?r&>)htLz4PA+zuNRzy0ps#v9-h}FoLo0|uNddVv&EQQiq%gu-0T=Uchkc>i* zR*t#=`H6D-b0gvk<FXY0%$~ z83$3W%dp||3iZEJT+(L$teQgrijL}~L!H4B0FnyE{7)jui0D$9<6%PR#nYf>UQ!6o zkJ-UNMG^1z6)>z|7_JO(5&Rz;@YhOGLvC?`)zE34hJrVNO8xwWOtyklela+4hjPtp zv6nHY$J3T5I8;FdE_I#VNl_TxwtE1k<1)4(Ab`%6VrA?tytQ+8|bl7*B+0Pu?2l0lD{NT0J`f zM-KD5efhq!i)t*S3Vd2(zQ*@ND2>kE_GI>K$ne6T8HIsn$*j?!m8_Ek13lg+yda{U zc=SLHHe@)Rk_lDO8=^4fg%>2Bv4C=#xk!0iEVxf;uxo@rmSIMM)R143Fgv&|&b>r5 zE+toFuMid3d`t73SK-Gn)vqJtX$CLmLge410bksl46vTeDv4>2@SRHQm}AySWIypX z?B2?B6=fVP`q*PcVV;DX<6LLl8tHhb?Hk^XWUnAfnylatX`JP?ciwDMm3nmRlW5)f zT>mJ#L+s8fgUM!;d>_D;rO_)0cvAbaW7wU@N0tYQJxOHXL_dAw1YpOVb&M5sH zb{H|^MI^7<%(5&=`EKLcLi-QaOD}CI8B)YjYi)zEa8{oX2W3OPUPF?o4#JOlmU-T` z1e%rQPvCsQXYaV%shyuUd8+pO1!`s1i~a7@+;}Bx4(Nt2ux&e*+5xA%56UMG5NM&$ zT#072?#X=gffvWv2eG2xG|C5`lI|OKY`}M26-#?v8_Ou=lu!MSS^$8SPfY>rqi+ak zYl>iPR6GSxHh_pOEWW46JsF{ztQr}>dPKCjs^I1Ute7`mt@*Mxlv>~)9A8-j#pa0b zJc@<<#&4M4$RDOVVey>AdYLk?EHl|k-h9m2o2B;5Lmf|hV0dZzl^%HqdH`oiEB6qP zI8m0GZNao=>R4Tzc|T*z^gL@Kl%EZhw7L;$=r5WQ9#|hfyfz4RSD%gho*-iE@ITrl zou0&64k{;CAFXz&&h`GUqmi0k{xkv;vh zI(*laQ4{s)hYO&kLuy@zYueE+8I6vi@N}rkczIBeB>baRI^Fb5m?Hv#p9aDiM?^CQ z2Y#TH0@||35z-A^)n|Ubo6Y~Z8%w1p_-rYQC(Y-%CMz-+{G&N`Ehzy|Hc`GtR1&x} z0QVTz()FhiL&NzmnBo$!TDxJomwCXjw*D}zZmY`o<;q0GL1>Q;ql)+FFcP|8`v*rBDfSRRYQ0;j)#g%?%= zA#rFmLu7BsiwUCCfl zFMB*|A)2y5j%`ld?c4hk3K3-sGeQiv2afoVYW8W)wqD` zg0+CKe8{Cs3o)vLjeX${6UkVO|MIwLe+~=(rHUmLcWm4ol(@u=nkFz8M>BbNQwc$a zB(|WS;1Kw%Pzy70?vrKI@rE$D6c7bCo>w>p8V6;1k3}*Euh^HA>id`weE(u zq@4MS?pco&$XXb%>S$m|B2yahe|+A_cWc`vJaNEX;PhBK{AUTF-DCP2ew^6e!eh^C zG4X=iaA{_;wW2_K_pCz0(*Bs_ms?So#NjPP0eD46RCONGRZz?_VXYB_rNZYbK*UmQ zY&|j+fqdHUnyJqZd~uzC;*-Nw=kLvyPK$>q8jqJbUxvdwDM~RN60l3LIt0WEQg5*8 zt86Yti_Y;tDMi<|-_(%&5T7EY?$oIn=lfYuEbC-0kLzYe_w1zod^q8!*C}^W)P@&T z0cim4q&shg^eI>zzG!x|pNqD5KNdL3fBb{@@GP>I`#5?$xIUgL*IkqElA+koTgZ$Q z>uR}d0a21&B00e)h;{dIdNO=CNS|n|+jC;ocW5>~KTBOI_8ZgNu1VQEng%YmdrRT! z;GCPC&Cjy@j-^4@n-9Ag>}|S?RmdJh`zS;T(pJ^zex*4PI7X8090VaWtHa-og}*&f ze&D@LFLfYPy|QTex%SNc=gzPuhWx<|=RVI^2~Hlo2<+qrJne*0TREI(1il0>a^OK% zz}Nc;55zo*KBn27 zH}ih#QsMQsfi|DKh$km{!d9Q9*qR#RY4e|6avcY00z3q!{fo1<^4QCnM|KB4UR<_p z?iSx-d&eY>vXnEEIz;qruVuef2u&N6OX6u2a0>D8#_tv*At}k+#Msza>vwq)#P4^c z*GIi9U^Uvw8y83bOFi=`>$V#|0qG~KAHN1YEs?yue1;*UN<;xcE<>O<`OG)vt_gzV z9=!Y~+C3wei*961ce0G{aQ|Cd8z)1X(u!j^2&$#sQzUC!d z%RU_ZK-J^ig-BJ!?oHCfIs$SQMN5E_<5PFvgQ=Ywkwghl8li7x_2CSR_y@J7gt716 zWU_Snc_XVX)o5!$h`seDtWnhRFL{u(pU;El%dsONXZE@ZMcSULJV-i22H4s5GCTr1 zdwB`Y=3hqCl*Av>%`L28?vOQiQt|f5J_4#pr9K}3O38v_hm4MrBeE{)z?NF8e0_hFxc)h-M9VI^bP{7-WB zD|DOC?K942qKSD4V09^+MYee&3?foml&=CH9xVeu%YNWJMFUE@-m5nyMVKPlS1G3v z`Bn9&`bUdiZAIj?@+U*8P|Ra0_f71T@~)e(BB)WHr4f+8WZVzo*yzuM`e8V`?`;Xa z04!Bgw@83w+@J99kj2r2<^K5GTxiuNVlNE;tP#zQm4Kk3L`2>v;1u`44mSQ|sGu}W zFx_XC*8Qn!KuTFkBv3YiKkxv$eB^Oq{}eO|;V6s-P-ZLKe|ih}-Yw49decBVTz=Xn z2y?iw!9S@oJ{pKLs0iaR0Z9Huw_ze~+1Nj|5qSVqN0(vNlKlIWV2N|!+mxK1k|wB9 zcmhM}S`41cuWf-WNF#ik+&J3a4*|RnFtL$&J5g-s%O5tLf=K=FZBqY~hYtbaTwzGQ z>?=^Y=cgZ}1^ja#_%_k!WbP(BjRr$P`FOzBU-0LQt(mcmbjGotw$z;f^QG`so(oh82m9> zE%;LOsgT>!C%NJttXZUqDXJKbLOlOUsted!S8;nkg#1(-f720iCMEKyham)Q>vP{t zuzK@3ZVDMi(N8{hO?%IVG8Mm62>kr<0;d5M%ix@efv*L zRYvJBlinUHP`KpVE%{zMsJiaujwIQf9rWRKGH1tTk7!ZDyRWm%t33yoCfR*>os{Bv zepn1oLL3uR5`lu>c87BhoX20ATT?B94&Db!=VG`O;UQf~a9FseQ^U|@dY;16M=^&Z zO@(QjC+5x^d2=oK?(%URh4#QX{%cF=i#6v1y33zUTd8_Q@}Ol%;I%8Sjr|&KM?QNYHhzn@A&u;g}ypf zlgbM$&hW&YNJ$ld+Or|9nn)v@-pPN5Ktg*wQj*osD^oFaurc8;L?9y^@yRxd%%Dlt z@Jx}S)Sd%VA*{NNl}T5GoX+c5*oEG3e|Nkp_;T~7-W!NWyX%76be;!!w^1baLmVuS z{kR(c4kUltar`L}EmcawUI%0JT}QuPT#%8mzKZHp_$f*DfwH{#p?QpgPO8qRpqqz% zr&Iem5=yxvRFO$SJpSz&(%|;h#Vo{AuJYh1FGIw?PIRXnF8^ALSq1e-(OL+pJQKwB)MVUsPW64c*@zo{@2nL(&zk~MO}F75zfGjM9rIAUM{_KKihItK|o3|{hU4_2I} zn5njPW=WY8mbmJ_m(orC`0DLd=^+#DxMaLdZDF%vVOjIt;xk7z^r}9UH0x@`TDq#` z4!o#Mie|IsTt&PC2Ra$EQ2g*PnDkTODR|K6}zr#V=^0og%!^oSlqvtSWy*Pn8@pk#CqXn`#+o z^)f;Sv!#trhR$RcJ6pH5L~Xmw<$qX%zC+u3a7*>NlhPD&*hWCRX)%pI73>1fnhRsF z{5}b{+UW-It$kCu^sepPdl#ca8(+MgW~qgw9%CdaEWSx>`b#}4(g_ic zhndCA&x~~%SD3KVK3BZzp1xwn87uqX_1X@3Z3p zdT6S{c+#rGInAYVJWjyOD?(iPu|R$aK6Y<$a=~2st+UoS0ZmAf#p0(9*B?KW^xic` zU0bjFu*6Tw=yEGn&npC zUJ-GpIwLbPIV<(BLw!2+F8#x;^#{H75m3hniJA?znM@fU_Yk((q35zvq|qvPR|p`MA6#T;+|JMg>fs~z1eyk)OB{d8?UWU3 z)T$`57SD)VpY>&z!jq5Q;nZW9;_VvNX3JuGYn}zSt`aPKKcYsz-q2iA5x?GGOkZX0 z&D(c{kKMY8=6-G-*6m)hu=Nt(LJBfnqG@z_!dl|@50Z88Q~v22YSQLys!i~>b1^)y zOgQwB!bPi1hw+S4MuH#if=VTCWBE$qJT9(pYpZ5CxR@->FSjo0J!RC{t2VNi^_dK^ zmxRGMeInK zU42>ZL>kdmUWW^8s|_B516Qs;^?<|ny4sbwynL9+pS;Ig_Pm6$rw)N8 zr(dB*q>#6Q#*YPni2pv^ZL9Q(LlR~#ggcD92pFvu3ukA&d+^FyC74L_Jw0(81OHZD z3OZdT-zx`eyZx6CQ+5)H4|%a>LmZAU<1o4<&Kh#amzgo$Y3IX|C!%q=J9A-ek7Hl8 zJNxHXZ>+R29$(&+_|W$nE6{JS%=x4`D>v=^qgAQGxUig^pGmNvaH59B6!{lJyoz{D zX(rdXESX2H%vxr|M6mI;#x#HAh65hEdC=?9tI@y($3Q;oB13A||G7wHvW@T%R0nt6 zIOF?@B_=-p(5fk>b@uY5?T|l}*TgnOeiy=(uVC<90d)=gZKi#W!H zYT41I%4&a;M#+Rbgs*n%@2RH$F5F~5^y%1(qM6KbEq`p#GU zMQsv9^@R()}FFq>$KwBeRZed6C_bB9gI$r$-rAEdh3KihMs~Q{6R8rQ1;bstfo)g zb8s5oZzQ}-&-UzefS)xPZPO^`5P{vST1i6*L2Jg?07)Rx@ZC|^seqGfq)y~oRFw}| z7`h+1C(b{d*ui7l$%FLYwKslsBtYQnsCIwoW|$_v-NP&dxB-{sZKDJbf?H zJ;cp2k}8Qb;!CcYw`&>x7m zlf(aE(){sSiD~XF(~d@hjW;g&HB@R7Xewsq3t?4MzUo!T?|MbK&0)wlEU~z%?y6l? zc_l0Ep+&S&`@-RwPedUcX|7i)2ab3r3Zqh+U5)NX&P77c|q9bk=$z zPCR6Ebw--Y5l&o-x=zMIJZUE%rjEz{fY-1M_>QM^`K;uJubNvPMvjV7dluGe@NYVe z+}0`7&&LsSbTGU0*B^FiMF35>-?d}XE?YINd5UEf;(YXDcr|m%lK0gZ@gOyxf? zqeb4|BRzJWnuU?~uz^F{WWz`UYq8Gw>enG~&|ledY7UNAhnY{u^;8G`KRhCrg=-?6 znR5(X8ipP0+l71!SaC^vUp;;waV0|l7j`N3^D1BY$i2#G{vVI_^OSoshd0$G zUCiXH9z4Iv(EVuM@sm6EL5O$l{3vNPgii+<1KQj)hm5*KlO%LDpPe1(uw$7_PsEgt zcc%pp_*{n;nyEc~eMTxODoKwX8Q890TK&OAa{_ZpX_OL?a(1_23Y~cg^xY1X6Y5R_zUQP;QKoesgA8Nd6wSuc*y&%{2>c64mcUOgmo z9QE6L4&!8>oC;voxy&fqs^bpc?Mr*yA$ZHTBP!u>N7Vg|cEYg%QP;epCMo15OierC zh}AEnOXDSYe_$=nZ*N|H(_SJ(D;2Hb_jEWonjfClxVyw?tolMZzI zB{}wUICNL=C%Z7A50|a>usxCRkqps*Q@#gkVa;EbYy#@~9ZgpgpNvE%8@Uv5>STng zuQEhkN-Q<=ZCujK5b-hBD%Y9o1Fk*!F2YlJox*8{ZVm}EncMSQI~FW6XNEO31@ zF047%d{kw~Ss|-^X}oDy*>#J?`&_c43a$onI=&IbU5U68%+G4>o1kjuPKP~D_*ef^DyW8i{E>@2x&aS2=bk4dSQ9XTSEY@!J zwL?u0OWmvA(^QkAyiXo8JTY7TfD#>uv25Tm5M^gDF2y8?JQ`xz$4rad$(Vb6t!EX4 zc+9=ZHm!{(ba~&vye{44zXLmNH9)}4z_l0gu>%#XxK0+!DxC8`e?Ztf;S8@M5dUBX zbt?~MTv-^~aCjBwU!DAeGW{C4CAa0hvnGwH?35ZN>0Lcr{sP9$AbNr?_eQZ4LYL2Z z?9<$T_h}AXi=Wo(-mMmqe28@(?L72&BncYY(wN!AznLX3p256!={*~PvfeY^#2*Ha z-*F1KdbbQg#4o&|NkNbV=F#>Ca^d^V{iL(P4dUV1xC`rNn;n* zCiNH+34w$?fdTBp&GYe67OLd6wm0kNHjOBk4hSkm8%-zm9Adj zvLV1X0PWN=7{MpJhhx5OT| z111gwdMd;G2`Ar91r}??Bs(@Sb?4(_)4QBE3*c-Hh_5}&izlz#T3Kq2k)me){@ET$ zt1Kez=%l9?cr=oDTV{*3c*4h)s}R+tyM>B}jJ+;%S;4@qPCWT`b|Qxm79;*vlR&vS zQkVA*1(Dcyq2!_~>TVAysD~ z72l1F$f{mB)%$O%5I>}C_zfB!m0}@_BUy8a$Sy9fwG>RTe3@*w9C(4Je}n?~NV43M z?Trs0SbOViMDuNRr7ejjg3CEGZH44IlCR&hOuQ@TXO+

Tn?tD-_pUL;hJ-u}i5 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 G?*9Q+3_b1u diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 5e2f25c742b44b2c7729eb5894ad147c0a086b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5035 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 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index d8ebe1890f73a2c317d764a4253465564532388a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)pcY>(zAznZzv&jI5l*8Sv-h6NYz( z`xr#sTNyrI+r;qi*H;F9<5&hpCRXAMc(y#6;s5V%43d${7~bw~Wcd621B1B#Lt2z? diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index 631816adbf962b7e0ea21d718b27b5b502bf9307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11480 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 Hr-=UnTTN*n diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100644 index 7aabdcd6ea75f75321341465e9cc3635e87504ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 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 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 12a8c4626248ec8a3aa988ab3161b8124de646fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1518 zcmYL}e>~H99LK-&Yrkk{NJ{Hlglyj_oUJWn#cIVLW*`D^=HBOqM{av>0*FLGT(-Yw$uw6ExRRL}*4bhScXi`8}w zeQR4Ad^3(G(7Gkk+5!@;yZ`_LUpmb@NE-g8n8{e~jg_l!$~71i=(z(qV{hA$ne*LD zl&iPj$DH0wm)?%kvY8FGavEfdC9HHS&6!afm}Ppx9AjzR{ExJYh#b@SpT7T$z9bG+ zht*#intBq*7gSA74Vq+zx>b$0yzBn8%PN4cKeK z4~$~HkT3_I=Z-H&0`4K@hHjTVN__db`d;YsT|Ex94KZOC;$eX|)UjpnI$<59hJNSh zE2d+QUKmHS&y~Oiw^V}eSCzFuPa-tuNkaaeU63ISohgFb{0S#gNqRoh)vXKlvXeB4 zyq%$cvfRFP@V#D9i@~X<6@z^Y{oe*w!v{`aTzQY(lFMNs!gzQRIJdvR8Yt~Q5}xi@ z9jLnYC`q5Kc}`j}9WPf^MXz;?E9iN47EYXhWtM+qNIyxDjMe~mX9M3F zr@WqDDpRHTK@`idJLg^T?T@^yjGJ#ErkZcc?^VKR*Fu$sOS^Ec3lkKNE$2q0TP=c^ z<*;n-!IwX#VJRZ)Wqd3k_+VxFYm2yKH{%CGWCe+HQ}UJ@P$#E{ZJ8U$`utb95xeOY z8s;Ikz?zS@<$g*r*3W+IAz!R_bz4?G*4g|dr%Nwl86cC^f7)o=Sgqi`n_L}yM5Q>I z3Y@xYSh(1)nc$zXaJRd>?ZH$Sdnbcq1K?Tt>D9-24;sgOq_|rF_EmU~y-m)=P5YE^ zVm=zXu1X?4jvI%~g+qM@$~5ip4w$M>&t5j1G5V_FWIz~eeax7LMri5v0SXiij3z4Q zqgPDE-A$DjZ2)R9z1FqBFbrWI^1BTE@T!U7u8Rrp-cRUFc(gwLU^|(zVPOWQf^YMz z#BdPLE<7zo=3P&64|!f}A~U+(Hm?B=kD1nWvw!}>>1xN`ku-Js(>G0;082(4>a0~{ z>pxUU^mM$!JUQH~ba$`}R4z~2sWg?^w7l*uy;81J;gqNKgv`-~jF-rnWofqE+nth) zOkd>{1Qr4hhX?C+RIn7U&D85H)OMC?2S>UBL$d}cxs7|zT=!WRa%SEyG+h`X)Bp}0 zn_G~}Q3i+iL}7t3wDT&1?NwK}99Ew~Z!M+=YyBYYAvZ35#f}t|YyWto%;{F<7&a7r zqT+d;kG=n*_xUMS7JMULTvWC@q@wn-WldRsZ(&x*eTT}nhF}#rb>GmNB6d#J&XmQ* kfCl8*dUE=(x&PuvVdv@hvn_|Z@w#uCzTKZzy^WpmFEFisfB*mh From f58b34df2b85d4b066e6cc3e23250cfea143f674 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Sat, 10 Feb 2024 14:55:20 +0100 Subject: [PATCH 37/83] fix: appimage tunnel service bug --- .github/workflows/dev-i copy.yml | 2 +- .github/workflows/dev-i.yml | 2 +- .vscode/extensions.json | 10 +++++ 1distribute_options.yaml | 45 ----------------------- a.sh | 37 ------------------- linux/packaging/appimage/make_config.yaml | 5 +-- 6 files changed, 14 insertions(+), 87 deletions(-) create mode 100644 .vscode/extensions.json delete mode 100644 1distribute_options.yaml delete mode 100644 a.sh diff --git a/.github/workflows/dev-i copy.yml b/.github/workflows/dev-i copy.yml index f11f97e2..db8d6551 100644 --- a/.github/workflows/dev-i copy.yml +++ b/.github/workflows/dev-i copy.yml @@ -2,7 +2,7 @@ name: dev i new on: push: branches: - - main + - ios paths-ignore: - '**.md' - 'docs/**' diff --git a/.github/workflows/dev-i.yml b/.github/workflows/dev-i.yml index 95f01b16..4643c4ec 100644 --- a/.github/workflows/dev-i.yml +++ b/.github/workflows/dev-i.yml @@ -2,7 +2,7 @@ name: dev i on: push: branches: - - main + - ios paths-ignore: - '**.md' - 'docs/**' diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..890a31e1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + "recommendations": [ + "dart-code.dart-code", + "dart-code.flutter", + "github.vscode-github-actions", + "golang.go", + "redhat.vscode-yaml", + "codeium.codeium" + ] +} \ No newline at end of file diff --git a/1distribute_options.yaml b/1distribute_options.yaml deleted file mode 100644 index 1e08a464..00000000 --- a/1distribute_options.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# output: dist/ -# releases: -# - name: prod -# jobs: -# - name: release-windows-exe -# package: -# platform: windows -# target: exe - -# - name: release-android-apk -# package: -# platform: android -# target: apk -# build_args: -# target-platform: android-arm,android-arm64,android-x64 - -# - name: release-android-bundle -# package: -# platform: android -# target: aab -# build_args: -# target-platform: android-arm,android-arm64,android-x64 - - - -# variables: -# APPSTORE_USERNAME: "xxx" -# APPSTORE_PASSWORD: "xxx" -# # or -# # APPSTORE_APIKEY: "xxx" -# # APPSTORE_APIISSUER: "xxx" -# output: dist/ -# releases: -# - name: dev -# jobs: -# - name: release-dev-ios -# package: -# platform: ios -# target: ipa -# build_args: -# target: lib/main.dart -# export-options-plist: ios/ExportOptions.plist -# # Publish to appstore -# publish: -# target: appstore \ No newline at end of file diff --git a/a.sh b/a.sh deleted file mode 100644 index 180258c1..00000000 --- a/a.sh +++ /dev/null @@ -1,37 +0,0 @@ - -TARGET_NAME_AppImage="Hiddify-Linux-x64" -TARGET_NAME_deb="Hiddify-Debian-x64" -TARGET_NAME_rpm="Hiddify-rpm-x64" -TARGET_NAME_apk="Hiddify-Android" -TARGET_NAME_aab="Hiddify-Android" -TARGET_NAME_exe="Hiddify-Windows-x64" -TARGET_NAME_dmg="Hiddify-MacOS" -TARGET_NAME_pkg="Hiddify-MacOS-Installer" -TARGET_NAME_ipa="Hiddify-iOS" - -ls -R dist/ - mkdir out - mkdir tmp_out - - for EXT in $(echo AppImage,deb,rpm | tr ',' '\n'); do - KEY=TARGET_NAME_${EXT} - FILENAME=${!KEY} - echo mv dist/*/*.$EXT tmp_out/${FILENAME}.$EXT -echo chmod +x tmp_out/${FILENAME}.$EXT - if [ "linux" == "linux" ];then -echo cp ./.github/help/linux/* tmp_out/ - else -echo cp ./.github/help/mac-windows/* tmp_out/ - fi - if [[ "linux" == 'ios' ]];then -echo mv tmp_out/${FILENAME}.$EXT bin/${FILENAME}.$EXT - else - cd tmp_out -echo 7z a ${FILENAME}.zip ./ -echo mv *.zip ../out/ - if [[ $EXT == 'AppImage' ]];then -echo mv ${FILENAME}.$EXT ../out/${FILENAME}.$EXT # added for appimage link - fi - cd .. - fi - done diff --git a/linux/packaging/appimage/make_config.yaml b/linux/packaging/appimage/make_config.yaml index 3d167cfe..949a5230 100644 --- a/linux/packaging/appimage/make_config.yaml +++ b/linux/packaging/appimage/make_config.yaml @@ -29,9 +29,8 @@ categories: startup_notify: true -app_run_content: " -Hi -" +app_run_file: AppRun + # You can specify the shared libraries that you want to bundle with your app # # flutter_distributor automatically detects the shared libraries that your app From 8f4d40026b535083b9d5864b29568977e6dbf0bc Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 10 Feb 2024 17:32:45 +0330 Subject: [PATCH 38/83] Add desktop active proxy info --- assets/translations/strings_en.i18n.json | 3 +- lib/features/home/widget/home_page.dart | 9 +- .../active/active_proxy_sidebar_card.dart | 109 ++++++++++++++++++ .../stats/widget/side_bar_stats_overview.dart | 3 + lib/singbox/service/ffi_singbox_service.dart | 38 +++++- 5 files changed, 154 insertions(+), 8 deletions(-) create mode 100644 lib/features/proxy/active/active_proxy_sidebar_card.dart diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 22a68525..291896e0 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -38,7 +38,8 @@ "traffic": "Live Traffic", "trafficTotal": "Total Traffic", "uplink": "Uplink", - "downlink": "Downlink" + "downlink": "Downlink", + "connection": "Connection" } }, "profile": { diff --git a/lib/features/home/widget/home_page.dart b/lib/features/home/widget/home_page.dart index 9b43ba45..66025e0e 100644 --- a/lib/features/home/widget/home_page.dart +++ b/lib/features/home/widget/home_page.dart @@ -62,18 +62,17 @@ class HomePage extends HookConsumerWidget { child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( + const Expanded( child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - const ConnectionButton(), - if (Platform.isAndroid || Platform.isIOS) - const ActiveProxyDelayIndicator(), + ConnectionButton(), + ActiveProxyDelayIndicator(), ], ), ), - if (Platform.isAndroid || Platform.isIOS) + if (MediaQuery.sizeOf(context).width < 840) const ActiveProxyFooter(), ], ), diff --git a/lib/features/proxy/active/active_proxy_sidebar_card.dart b/lib/features/proxy/active/active_proxy_sidebar_card.dart new file mode 100644 index 00000000..a3302e42 --- /dev/null +++ b/lib/features/proxy/active/active_proxy_sidebar_card.dart @@ -0,0 +1,109 @@ +import 'package:circle_flags/circle_flags.dart'; +import 'package:dartx/dartx.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:gap/gap.dart'; +import 'package:hiddify/core/localization/translations.dart'; +import 'package:hiddify/core/widget/skeleton_widget.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +class ActiveProxySideBarCard extends HookConsumerWidget { + const ActiveProxySideBarCard({super.key}); + + Widget buildProp(Widget icon, Widget child) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + icon, + const Gap(4), + Flexible(child: child), + ], + ); + } + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final t = ref.watch(translationsProvider); + final asyncState = ref.watch(activeProxyNotifierProvider); + + Widget propText(String txt) { + return Text( + txt, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall, + ); + } + + return Theme( + data: theme.copyWith( + iconTheme: theme.iconTheme.copyWith(size: 14), + ), + child: Card( + margin: EdgeInsets.zero, + shadowColor: Colors.transparent, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.home.stats.connection), + const Gap(4), + switch (asyncState) { + AsyncData(:final value) => buildProp( + const Icon(FluentIcons.arrow_routing_20_regular), + propText( + value.proxy.selectedName.isNotNullOrBlank + ? value.proxy.selectedName! + : value.proxy.name, + ), + ), + _ => buildProp( + const Icon(FluentIcons.arrow_routing_20_regular), + propText("..."), + ), + }, + const Gap(4), + () { + if (asyncState case AsyncData(:final value)) { + switch (value.ipInfo) { + case AsyncData(value: final ipInfo?): + return buildProp( + CircleFlag(ipInfo.countryCode, size: 12), + propText(ipInfo.ip), + ); + case AsyncError(): + return buildProp( + const Icon(FluentIcons.error_circle_20_regular), + propText(t.general.unknown), + ); + case AsyncLoading(): + return buildProp( + const Icon(FluentIcons.question_circle_20_regular), + const Skeleton(height: 14, widthFactor: .85) + .animate( + onPlay: (controller) => controller.loop(), + ) + .shimmer( + duration: 1000.ms, + angle: 45, + color: Theme.of(context).colorScheme.secondary, + ), + ); + } + } + + return buildProp( + const Icon(FluentIcons.question_circle_20_regular), + propText(t.general.unknown), + ); + }(), + ], + ), + ), + ), + ); + } +} diff --git a/lib/features/stats/widget/side_bar_stats_overview.dart b/lib/features/stats/widget/side_bar_stats_overview.dart index a1b6ff6b..d0783fe4 100644 --- a/lib/features/stats/widget/side_bar_stats_overview.dart +++ b/lib/features/stats/widget/side_bar_stats_overview.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_sidebar_card.dart'; import 'package:hiddify/features/stats/model/stats_entity.dart'; import 'package:hiddify/features/stats/notifier/stats_notifier.dart'; import 'package:hiddify/utils/number_formatters.dart'; @@ -21,6 +22,8 @@ class SideBarStatsOverview extends HookConsumerWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ + const ActiveProxySideBarCard(), + const Gap(8), _StatCard( title: t.home.stats.traffic, firstStat: ( diff --git a/lib/singbox/service/ffi_singbox_service.dart b/lib/singbox/service/ffi_singbox_service.dart index c065fd62..b07a575c 100644 --- a/lib/singbox/service/ffi_singbox_service.dart +++ b/lib/singbox/service/ffi_singbox_service.dart @@ -320,8 +320,42 @@ class FFISingboxService with InfraLogger implements SingboxService { @override Stream> watchActiveOutbounds() { - // TODO: implement watchActiveOutbounds - throw UnimplementedError(); + final logger = newLoggy("[ActiveGroupsClient]"); + final receiver = ReceivePort('active groups receiver'); + final outboundsStream = receiver.asBroadcastStream( + onCancel: (_) { + logger.debug("stopping"); + final err = _box.stopCommandClient(12).cast().toDartString(); + if (err.isNotEmpty) { + logger.error("failed stopping: $err"); + } + receiver.close(); + }, + ).map( + (event) { + if (event case String _) { + if (event.startsWith('error:')) { + logger.error(event); + throw event.replaceFirst('error:', ""); + } + return (jsonDecode(event) as List).map((e) { + return SingboxOutboundGroup.fromJson(e as Map); + }).toList(); + } + logger.error("unexpected type, msg: $event"); + throw "invalid type"; + }, + ); + + final err = _box + .startCommandClient(12, receiver.sendPort.nativePort) + .cast() + .toDartString(); + if (err.isNotEmpty) { + logger.error("error starting: $err"); + throw err; + } + return outboundsStream; } @override From ea1349778cfaab43e332c446b21f30df06f4c979 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 10 Feb 2024 17:32:58 +0330 Subject: [PATCH 39/83] Add syncthing ignore files --- .gitignore | 2 -- .stignore | 31 +++++++++++++++++++++++++++++++ android/.stignore | 11 +++++++++++ ios/.stignore | 33 +++++++++++++++++++++++++++++++++ linux/.stignore | 1 + macos/.stignore | 5 +++++ windows/.stignore | 9 +++++++++ 7 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 .stignore create mode 100644 android/.stignore create mode 100644 ios/.stignore create mode 100644 linux/.stignore create mode 100644 macos/.stignore create mode 100644 windows/.stignore diff --git a/.gitignore b/.gitignore index ccae89b2..758f1ce0 100644 --- a/.gitignore +++ b/.gitignore @@ -37,8 +37,6 @@ migrate_working_dir/ **/*.freezed.dart **/*.mapper.dart **/*.gen.dart -**/libclash.so -**/libclash.h **/*.dll **/*.dylib **/*.xcframework diff --git a/.stignore b/.stignore new file mode 100644 index 00000000..7d6411b7 --- /dev/null +++ b/.stignore @@ -0,0 +1,31 @@ +#include /.stignore +#include /android/.stignore +#include /ios/.stignore +#include /linux/.stignore +#include /windows/.stignore +#include /macos/.stignore + +.git + +.DS_Store +.idea +.dart_tool + +.flutter-plugins +.flutter-plugins-dependencies + +.packages +.pub-cache +.pub +build + +*.log +*.iml +*.ipr +*.iws + +**/ios/Flutter/.last_build_id + +/android/app/debug +/android/app/profile +/android/app/release diff --git a/android/.stignore b/android/.stignore new file mode 100644 index 00000000..03bc1f9a --- /dev/null +++ b/android/.stignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +.gradle +captures/ +gradlew +gradlew.bat +local.properties +GeneratedPluginRegistrant.java + +key.properties +**.keystore +**.jks \ No newline at end of file diff --git a/ios/.stignore b/ios/.stignore new file mode 100644 index 00000000..c11a43c6 --- /dev/null +++ b/ios/.stignore @@ -0,0 +1,33 @@ +/**/dgph +/*.mode1v3 +/*.mode2v3 +/*.moved-aside +/*.pbxuser +/*.perspectivev3 +/**/*sync/ +/.sconsign.dblite +/.tags* +/**/.vagrant/ +/**/DerivedData/ +/Icon? +/**/Pods/ +/**/.symlinks/ +/profile +/xcuserdata +/**/.generated/ +/Flutter/App.framework +/Flutter/Flutter.framework +/Flutter/Flutter.podspec +/Flutter/Generated.xcconfig +/Flutter/ephemeral/ +/Flutter/app.flx +/Flutter/app.zip +/Flutter/flutter_assets/ +/Flutter/flutter_export_environment.sh +/ServiceDefinitions.json +/Runner/GeneratedPluginRegistrant.* + +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/linux/.stignore b/linux/.stignore new file mode 100644 index 00000000..7d115384 --- /dev/null +++ b/linux/.stignore @@ -0,0 +1 @@ +/flutter/ephemeral diff --git a/macos/.stignore b/macos/.stignore new file mode 100644 index 00000000..bf9897d0 --- /dev/null +++ b/macos/.stignore @@ -0,0 +1,5 @@ +**/Flutter/ephemeral/ +**/Pods/ + +**/dgph +**/xcuserdata/ diff --git a/windows/.stignore b/windows/.stignore new file mode 100644 index 00000000..8c17aca5 --- /dev/null +++ b/windows/.stignore @@ -0,0 +1,9 @@ +/flutter/ephemeral/ + +*.suo +*.user +*.userosscache +*.sln.docstates + +/x64/ +/x86/ From 1f40c30778ea30adfcb5251a032e49d015d22624 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Sat, 10 Feb 2024 18:28:40 +0100 Subject: [PATCH 40/83] make ip anonymous --- .../proxy/active/active_proxy_footer.dart | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index 55102a11..ef175940 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -92,10 +92,7 @@ class _InfoProp extends StatelessWidget { required IconData icon, required String text, }) : icon = Icon(icon), - child = Text( - text, - overflow: TextOverflow.ellipsis, - ), + child = IPWidget(text), isLoading = false; _InfoProp.flag({ @@ -107,10 +104,7 @@ class _InfoProp extends StatelessWidget { padding: const EdgeInsets.all(2), child: CircleFlag(countryCode), ), - child = Text( - text, - overflow: TextOverflow.ellipsis, - ), + child = IPWidget(text), isLoading = false; _InfoProp.loading({ @@ -147,3 +141,47 @@ class _InfoProp extends StatelessWidget { ); } } + +class IPWidget extends StatefulWidget { + final String text1; + final String text2; + + IPWidget(String text) + : text1 = _replaceMiddlePart(text), + text2 = text, + super(key: UniqueKey()); + static String _replaceMiddlePart(String ip) { + RegExp regex = RegExp( + r'^([\da-f]+([:.]))([\da-f:.]*)([:.][\da-f]+)$', + caseSensitive: false, + ); + + return ip.replaceAllMapped(regex, (match) { + return '${match[1]} ░ ${match[2]} ░ ${match[4]}'; + }); + } + + @override + _IPWidgetState createState() => _IPWidgetState(); +} + +class _IPWidgetState extends State { + bool isText1Visible = true; + + void toggleVisibility() { + setState(() { + isText1Visible = !isText1Visible; + }); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: toggleVisibility, + child: Text( + isText1Visible ? widget.text1 : widget.text2, + overflow: TextOverflow.ellipsis, + ), + ); + } +} From 804d2ab19f08e2deb2dd1bc6e5dbbb43339a31d0 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Sat, 10 Feb 2024 18:39:04 +0100 Subject: [PATCH 41/83] make ip private for both footer and sidebar --- .../proxy/active/active_proxy_footer.dart | 37 +++++++++---------- .../active/active_proxy_sidebar_card.dart | 7 +--- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index ef175940..1714360a 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -143,34 +143,30 @@ class _InfoProp extends StatelessWidget { } class IPWidget extends StatefulWidget { - final String text1; - final String text2; - - IPWidget(String text) - : text1 = _replaceMiddlePart(text), - text2 = text, - super(key: UniqueKey()); - static String _replaceMiddlePart(String ip) { - RegExp regex = RegExp( - r'^([\da-f]+([:.]))([\da-f:.]*)([:.][\da-f]+)$', - caseSensitive: false, - ); - - return ip.replaceAllMapped(regex, (match) { - return '${match[1]} ░ ${match[2]} ░ ${match[4]}'; - }); - } + final String text; + final TextStyle? style; + IPWidget(this.text, {this.style}) : super(key: UniqueKey()); @override _IPWidgetState createState() => _IPWidgetState(); } class _IPWidgetState extends State { - bool isText1Visible = true; + bool isFullIPVisible = true; void toggleVisibility() { setState(() { - isText1Visible = !isText1Visible; + isFullIPVisible = !isFullIPVisible; + }); + } + + static String _replaceMiddlePart(String ip) { + RegExp regex = RegExp( + r'^([\da-f]+([:.]))([\da-f:.]*)([:.][\da-f]+)$', + caseSensitive: false, + ); + return ip.replaceAllMapped(regex, (match) { + return '${match[1]} ░ ${match[2]} ░ ${match[4]}'; }); } @@ -179,8 +175,9 @@ class _IPWidgetState extends State { return GestureDetector( onTap: toggleVisibility, child: Text( - isText1Visible ? widget.text1 : widget.text2, + isFullIPVisible ? _replaceMiddlePart(widget.text) : widget.text, overflow: TextOverflow.ellipsis, + style: widget.style, ), ); } diff --git a/lib/features/proxy/active/active_proxy_sidebar_card.dart b/lib/features/proxy/active/active_proxy_sidebar_card.dart index a3302e42..a5ffd4c2 100644 --- a/lib/features/proxy/active/active_proxy_sidebar_card.dart +++ b/lib/features/proxy/active/active_proxy_sidebar_card.dart @@ -6,6 +6,7 @@ import 'package:flutter_animate/flutter_animate.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/widget/skeleton_widget.dart'; +import 'package:hiddify/features/proxy/active/active_proxy_footer.dart'; import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -30,11 +31,7 @@ class ActiveProxySideBarCard extends HookConsumerWidget { final asyncState = ref.watch(activeProxyNotifierProvider); Widget propText(String txt) { - return Text( - txt, - overflow: TextOverflow.ellipsis, - style: theme.textTheme.bodySmall, - ); + return IPWidget(txt, style: theme.textTheme.bodySmall); } return Theme( From 0da4eced0a0e2a5a48c75ba66569c9b430c55fef Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sun, 11 Feb 2024 00:29:09 +0330 Subject: [PATCH 42/83] Fix connection info ui --- lib/core/widget/shimmer_skeleton.dart | 40 +++++ .../active/active_proxy_delay_indicator.dart | 16 +- .../proxy/active/active_proxy_footer.dart | 139 ++++++------------ .../active/active_proxy_sidebar_card.dart | 37 +++-- lib/features/proxy/active/ip_widget.dart | 94 ++++++++++++ 5 files changed, 202 insertions(+), 124 deletions(-) create mode 100644 lib/core/widget/shimmer_skeleton.dart create mode 100644 lib/features/proxy/active/ip_widget.dart diff --git a/lib/core/widget/shimmer_skeleton.dart b/lib/core/widget/shimmer_skeleton.dart new file mode 100644 index 00000000..09d06abb --- /dev/null +++ b/lib/core/widget/shimmer_skeleton.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:hiddify/core/widget/skeleton_widget.dart'; + +class ShimmerSkeleton extends StatelessWidget { + const ShimmerSkeleton({ + this.width, + this.height, + this.widthFactor, + this.heightFactor, + this.color, + this.duration = const Duration(seconds: 1), + super.key, + }); + + final double? width; + final double? height; + final double? widthFactor; + final double? heightFactor; + final Color? color; + final Duration duration; + + @override + Widget build(BuildContext context) { + return Skeleton( + width: width, + height: height, + widthFactor: widthFactor, + heightFactor: heightFactor, + ) + .animate( + onPlay: (controller) => controller.loop(), + ) + .shimmer( + duration: duration, + angle: 45, + color: color ?? Theme.of(context).colorScheme.secondary, + ); + } +} diff --git a/lib/features/proxy/active/active_proxy_delay_indicator.dart b/lib/features/proxy/active/active_proxy_delay_indicator.dart index 605d8188..66d4ec9d 100644 --- a/lib/features/proxy/active/active_proxy_delay_indicator.dart +++ b/lib/features/proxy/active/active_proxy_delay_indicator.dart @@ -1,9 +1,8 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_animate/flutter_animate.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/widget/animated_visibility.dart'; -import 'package:hiddify/core/widget/skeleton_widget.dart'; +import 'package:hiddify/core/widget/shimmer_skeleton.dart'; import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -52,18 +51,7 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { ), ) else - const Skeleton( - height: 18, - width: 48, - ) - .animate( - onPlay: (controller) => controller.loop(), - ) - .shimmer( - duration: 1000.ms, - angle: 45, - color: Theme.of(context).colorScheme.secondary, - ), + const ShimmerSkeleton(width: 48, height: 18), ], ), ), diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index 1714360a..cdcf407e 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -1,13 +1,12 @@ -import 'package:circle_flags/circle_flags.dart'; import 'package:dartx/dartx.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_animate/flutter_animate.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/widget/animated_visibility.dart'; -import 'package:hiddify/core/widget/skeleton_widget.dart'; +import 'package:hiddify/core/widget/shimmer_skeleton.dart'; import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; +import 'package:hiddify/features/proxy/active/ip_widget.dart'; import 'package:hiddify/features/stats/notifier/stats_notifier.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -35,23 +34,44 @@ class ActiveProxyFooter extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _InfoProp( - icon: FluentIcons.arrow_routing_24_regular, + icon: FluentIcons.arrow_routing_20_regular, text: info.proxy.selectedName.isNotNullOrBlank ? info.proxy.selectedName! : info.proxy.name, ), const Gap(8), switch (info.ipInfo) { - AsyncData(value: final ip?) => _InfoProp.flag( - countryCode: ip.countryCode, - text: ip.ip, + AsyncData(value: final ipInfo?) => Row( + children: [ + IPCountryFlag(countryCode: ipInfo.countryCode), + const Gap(8), + IPText( + ip: ipInfo.ip, + onLongPress: () async { + ref + .read( + activeProxyNotifierProvider.notifier, + ) + .refreshIpInfo(); + }, + ), + ], ), AsyncError() => _InfoProp( icon: FluentIcons.error_circle_20_regular, text: t.general.unknown, ), - _ => _InfoProp.loading( - icon: FluentIcons.question_circle_24_regular, + _ => const Row( + children: [ + Icon(FluentIcons.question_circle_20_regular), + Gap(8), + Flexible( + child: ShimmerSkeleton( + height: 16, + widthFactor: 1, + ), + ), + ], ), }, ], @@ -66,12 +86,12 @@ class ActiveProxyFooter extends HookConsumerWidget { children: [ _InfoProp( icon: FluentIcons - .arrow_bidirectional_up_down_24_regular, + .arrow_bidirectional_up_down_20_regular, text: (stats?.downlinkTotal ?? 0).size(), ), const Gap(8), _InfoProp( - icon: FluentIcons.arrow_download_24_regular, + icon: FluentIcons.arrow_download_20_regular, text: (stats?.downlink ?? 0).speed(), ), ], @@ -88,97 +108,28 @@ class ActiveProxyFooter extends HookConsumerWidget { } class _InfoProp extends StatelessWidget { - _InfoProp({ - required IconData icon, - required String text, - }) : icon = Icon(icon), - child = IPWidget(text), - isLoading = false; + const _InfoProp({ + required this.icon, + required this.text, + }); - _InfoProp.flag({ - required String countryCode, - required String text, - }) : icon = Container( - width: 24, - height: 24, - padding: const EdgeInsets.all(2), - child: CircleFlag(countryCode), - ), - child = IPWidget(text), - isLoading = false; - - _InfoProp.loading({ - required IconData icon, - }) : icon = Icon(icon), - child = const SizedBox(), - isLoading = true; - - final Widget icon; - final Widget child; - final bool isLoading; + final IconData icon; + final String text; @override Widget build(BuildContext context) { return Row( children: [ - icon, + Icon(icon), const Gap(8), - if (isLoading) - Flexible( - child: const Skeleton(height: 16, widthFactor: 1) - .animate( - onPlay: (controller) => controller.loop(), - ) - .shimmer( - duration: 1000.ms, - angle: 45, - color: Theme.of(context).colorScheme.secondary, - ), - ) - else - Flexible(child: child), + Flexible( + child: Text( + text, + style: Theme.of(context).textTheme.labelMedium, + overflow: TextOverflow.ellipsis, + ), + ), ], ); } } - -class IPWidget extends StatefulWidget { - final String text; - final TextStyle? style; - IPWidget(this.text, {this.style}) : super(key: UniqueKey()); - - @override - _IPWidgetState createState() => _IPWidgetState(); -} - -class _IPWidgetState extends State { - bool isFullIPVisible = true; - - void toggleVisibility() { - setState(() { - isFullIPVisible = !isFullIPVisible; - }); - } - - static String _replaceMiddlePart(String ip) { - RegExp regex = RegExp( - r'^([\da-f]+([:.]))([\da-f:.]*)([:.][\da-f]+)$', - caseSensitive: false, - ); - return ip.replaceAllMapped(regex, (match) { - return '${match[1]} ░ ${match[2]} ░ ${match[4]}'; - }); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: toggleVisibility, - child: Text( - isFullIPVisible ? _replaceMiddlePart(widget.text) : widget.text, - overflow: TextOverflow.ellipsis, - style: widget.style, - ), - ); - } -} diff --git a/lib/features/proxy/active/active_proxy_sidebar_card.dart b/lib/features/proxy/active/active_proxy_sidebar_card.dart index a5ffd4c2..d1082aba 100644 --- a/lib/features/proxy/active/active_proxy_sidebar_card.dart +++ b/lib/features/proxy/active/active_proxy_sidebar_card.dart @@ -1,13 +1,11 @@ -import 'package:circle_flags/circle_flags.dart'; import 'package:dartx/dartx.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_animate/flutter_animate.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; -import 'package:hiddify/core/widget/skeleton_widget.dart'; -import 'package:hiddify/features/proxy/active/active_proxy_footer.dart'; +import 'package:hiddify/core/widget/shimmer_skeleton.dart'; import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; +import 'package:hiddify/features/proxy/active/ip_widget.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; class ActiveProxySideBarCard extends HookConsumerWidget { @@ -31,7 +29,11 @@ class ActiveProxySideBarCard extends HookConsumerWidget { final asyncState = ref.watch(activeProxyNotifierProvider); Widget propText(String txt) { - return IPWidget(txt, style: theme.textTheme.bodySmall); + return Text( + txt, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall, + ); } return Theme( @@ -68,8 +70,19 @@ class ActiveProxySideBarCard extends HookConsumerWidget { switch (value.ipInfo) { case AsyncData(value: final ipInfo?): return buildProp( - CircleFlag(ipInfo.countryCode, size: 12), - propText(ipInfo.ip), + IPCountryFlag( + countryCode: ipInfo.countryCode, size: 16), + IPText( + ip: ipInfo.ip, + onLongPress: () async { + ref + .read( + activeProxyNotifierProvider.notifier, + ) + .refreshIpInfo(); + }, + constrained: true, + ), ); case AsyncError(): return buildProp( @@ -79,15 +92,7 @@ class ActiveProxySideBarCard extends HookConsumerWidget { case AsyncLoading(): return buildProp( const Icon(FluentIcons.question_circle_20_regular), - const Skeleton(height: 14, widthFactor: .85) - .animate( - onPlay: (controller) => controller.loop(), - ) - .shimmer( - duration: 1000.ms, - angle: 45, - color: Theme.of(context).colorScheme.secondary, - ), + const ShimmerSkeleton(widthFactor: .85, height: 14), ); } } diff --git a/lib/features/proxy/active/ip_widget.dart b/lib/features/proxy/active/ip_widget.dart new file mode 100644 index 00000000..16b4d2d6 --- /dev/null +++ b/lib/features/proxy/active/ip_widget.dart @@ -0,0 +1,94 @@ +import 'package:circle_flags/circle_flags.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:hiddify/utils/riverpod_utils.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +final _showIp = StateProvider.autoDispose((ref) { + ref.disposeDelay(const Duration(seconds: 20)); + return false; +}); + +class IPText extends HookConsumerWidget { + const IPText({ + required this.ip, + required this.onLongPress, + this.constrained = false, + super.key, + }); + + final String ip; + final VoidCallback onLongPress; + final bool constrained; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isVisible = ref.watch(_showIp); + final textTheme = Theme.of(context).textTheme; + + return InkWell( + onTap: () { + ref.read(_showIp.notifier).state = !isVisible; + }, + onLongPress: onLongPress, + borderRadius: BorderRadius.circular(12), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 2), + child: AnimatedCrossFade( + firstChild: Text( + ip, + style: textTheme.labelMedium, + overflow: TextOverflow.ellipsis, + ), + secondChild: Padding( + padding: constrained + ? EdgeInsets.zero + : const EdgeInsetsDirectional.only(end: 48), + child: Text( + "*.*.*.*", + style: constrained ? textTheme.labelMedium : textTheme.labelLarge, + overflow: TextOverflow.ellipsis, + ), + ), + crossFadeState: + isVisible ? CrossFadeState.showFirst : CrossFadeState.showSecond, + duration: const Duration(milliseconds: 200), + ), + ), + ); + } +} + +class IPCountryFlag extends HookConsumerWidget { + const IPCountryFlag({required this.countryCode, this.size = 24, super.key}); + + final String countryCode; + final double size; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isVisible = ref.watch(_showIp); + + return InkWell( + onTap: () { + ref.read(_showIp.notifier).state = !isVisible; + }, + borderRadius: BorderRadius.circular(12), + child: Container( + width: size, + height: size, + padding: const EdgeInsets.all(2), + child: Center( + child: AnimatedCrossFade( + firstChild: CircleFlag(countryCode), + secondChild: Icon(FluentIcons.eye_off_24_regular, size: size * .8), + crossFadeState: isVisible + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + duration: const Duration(milliseconds: 200), + ), + ), + ), + ); + } +} From 6a6e824ba28fd8eea2510ce3becb6e986bbd94b9 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sun, 11 Feb 2024 13:47:08 +0330 Subject: [PATCH 43/83] Change routing setup --- lib/core/router/app_router.dart | 33 +- lib/core/router/routes.dart | 34 +- .../common/adaptive_root_scaffold.dart | 17 +- .../overview/config_options_page.dart | 886 +++++++++--------- .../home/widget/connection_button.dart | 2 +- .../widgets/advanced_setting_tiles.dart | 7 - 6 files changed, 499 insertions(+), 480 deletions(-) diff --git a/lib/core/router/app_router.dart b/lib/core/router/app_router.dart index b9dbee2f..6207e66a 100644 --- a/lib/core/router/app_router.dart +++ b/lib/core/router/app_router.dart @@ -50,29 +50,30 @@ GoRouter router(RouterRef ref) { ); } +final tabLocations = [ + const HomeRoute().location, + const ProxiesRoute().location, + const ConfigOptionsRoute().location, + const SettingsRoute().location, + const LogsOverviewRoute().location, + const AboutRoute().location, +]; + int getCurrentIndex(BuildContext context) { final String location = GoRouterState.of(context).uri.path; if (location == const HomeRoute().location) return 0; - if (location.startsWith(const ProxiesRoute().location)) return 1; - if (location.startsWith(const LogsOverviewRoute().location)) return 2; - if (location.startsWith(const SettingsRoute().location)) return 3; - if (location.startsWith(const AboutRoute().location)) return 4; + var index = 0; + for (final tab in tabLocations.sublist(1)) { + index++; + if (location.startsWith(tab)) return index; + } return 0; } void switchTab(int index, BuildContext context) { - switch (index) { - case 0: - const HomeRoute().go(context); - case 1: - const ProxiesRoute().go(context); - case 2: - const LogsOverviewRoute().go(context); - case 3: - const SettingsRoute().go(context); - case 4: - const AboutRoute().go(context); - } + assert(index >= 0 && index < tabLocations.length); + final location = tabLocations[index]; + return context.go(location); } @riverpod diff --git a/lib/core/router/routes.dart b/lib/core/router/routes.dart index ced9f8fc..5e2423c4 100644 --- a/lib/core/router/routes.dart +++ b/lib/core/router/routes.dart @@ -43,18 +43,14 @@ GlobalKey? _dynamicRootKey = path: "profiles/:id", name: ProfileDetailsRoute.name, ), - TypedGoRoute( - path: "logs", - name: LogsOverviewRoute.name, + TypedGoRoute( + path: "config-options", + name: ConfigOptionsRoute.name, ), TypedGoRoute( path: "settings", name: SettingsRoute.name, routes: [ - TypedGoRoute( - path: "config-options", - name: ConfigOptionsRoute.name, - ), TypedGoRoute( path: "per-app-proxy", name: PerAppProxyRoute.name, @@ -65,6 +61,10 @@ GlobalKey? _dynamicRootKey = ), ], ), + TypedGoRoute( + path: "logs", + name: LogsOverviewRoute.name, + ), TypedGoRoute( path: "about", name: AboutRoute.name, @@ -114,24 +114,24 @@ class MobileWrapperRoute extends ShellRouteData { path: "/proxies", name: ProxiesRoute.name, ), - TypedGoRoute( - path: "/logs", - name: LogsOverviewRoute.name, + TypedGoRoute( + path: "/config-options", + name: ConfigOptionsRoute.name, ), TypedGoRoute( path: "/settings", name: SettingsRoute.name, routes: [ - TypedGoRoute( - path: "config-options", - name: ConfigOptionsRoute.name, - ), TypedGoRoute( path: "routing-assets", name: GeoAssetsRoute.name, ), ], ), + TypedGoRoute( + path: "/logs", + name: LogsOverviewRoute.name, + ), TypedGoRoute( path: "/about", name: AboutRoute.name, @@ -309,11 +309,7 @@ class ConfigOptionsRoute extends GoRouteData { child: ConfigOptionsPage(), ); } - return const MaterialPage( - fullscreenDialog: true, - name: name, - child: ConfigOptionsPage(), - ); + return const NoTransitionPage(name: name, child: ConfigOptionsPage()); } } diff --git a/lib/features/common/adaptive_root_scaffold.dart b/lib/features/common/adaptive_root_scaffold.dart index 99c1d2bb..6f235c65 100644 --- a/lib/features/common/adaptive_root_scaffold.dart +++ b/lib/features/common/adaptive_root_scaffold.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; import 'package:hiddify/core/localization/translations.dart'; @@ -25,23 +26,27 @@ class AdaptiveRootScaffold extends HookConsumerWidget { final destinations = [ NavigationDestination( - icon: const Icon(Icons.power_settings_new), + icon: const Icon(FluentIcons.power_20_filled), label: t.home.pageTitle, ), NavigationDestination( - icon: const Icon(Icons.filter_list), + icon: const Icon(FluentIcons.filter_20_filled), label: t.proxies.pageTitle, ), NavigationDestination( - icon: const Icon(Icons.article), - label: t.logs.pageTitle, + icon: const Icon(FluentIcons.box_edit_20_filled), + label: t.settings.config.pageTitle, ), NavigationDestination( - icon: const Icon(Icons.settings), + icon: const Icon(FluentIcons.settings_20_filled), label: t.settings.pageTitle, ), NavigationDestination( - icon: const Icon(Icons.info), + icon: const Icon(FluentIcons.document_text_20_filled), + label: t.logs.pageTitle, + ), + NavigationDestination( + icon: const Icon(FluentIcons.info_20_filled), label: t.about.pageTitle, ), ]; diff --git a/lib/features/config_option/overview/config_options_page.dart b/lib/features/config_option/overview/config_options_page.dart index c2df00cd..2ed1f8f2 100644 --- a/lib/features/config_option/overview/config_options_page.dart +++ b/lib/features/config_option/overview/config_options_page.dart @@ -6,6 +6,7 @@ import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; import 'package:hiddify/core/model/range.dart'; import 'package:hiddify/core/widget/tip_card.dart'; +import 'package:hiddify/features/common/nested_app_bar.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart'; @@ -37,447 +38,470 @@ class ConfigOptionsPage extends HookConsumerWidget { } return Scaffold( - appBar: AppBar( - title: Text(t.settings.config.pageTitle), - actions: [ - if (asyncOptions case AsyncData(value: final options)) - PopupMenuButton( - itemBuilder: (context) { - return [ - PopupMenuItem( - child: Text(t.general.addToClipboard), - onTap: () { - Clipboard.setData( - ClipboardData(text: options.format()), + body: CustomScrollView( + slivers: [ + NestedAppBar( + title: Text(t.settings.config.pageTitle), + actions: [ + if (asyncOptions case AsyncData(value: final options)) + PopupMenuButton( + itemBuilder: (context) { + return [ + PopupMenuItem( + child: Text(t.general.addToClipboard), + onTap: () { + Clipboard.setData( + ClipboardData(text: options.format()), + ); + }, + ), + PopupMenuItem( + child: Text(t.settings.config.resetBtn), + onTap: () async { + await ref + .read(configOptionNotifierProvider.notifier) + .resetOption(); + }, + ), + ]; + }, + ), + ], + ), + switch (asyncOptions) { + AsyncData(value: final options) => SliverList.list( + children: [ + TipCard(message: t.settings.experimentalMsg), + ListTile( + title: Text(t.settings.config.logLevel), + subtitle: Text(options.logLevel.name.toUpperCase()), + onTap: () async { + final logLevel = await SettingsPickerDialog( + title: t.settings.config.logLevel, + selected: options.logLevel, + options: LogLevel.choices, + getTitle: (e) => e.name.toUpperCase(), + resetValue: defaultOptions.logLevel, + ).show(context); + if (logLevel == null) return; + await changeOption(ConfigOptionPatch(logLevel: logLevel)); + }, + ), + const SettingsDivider(), + SettingsSection(t.settings.config.section.route), + SwitchListTile( + title: Text(experimental(t.settings.config.bypassLan)), + value: options.bypassLan, + onChanged: (value) async => + changeOption(ConfigOptionPatch(bypassLan: value)), + ), + SwitchListTile( + title: Text(t.settings.config.resolveDestination), + value: options.resolveDestination, + onChanged: (value) async => changeOption( + ConfigOptionPatch(resolveDestination: value), + ), + ), + ListTile( + title: Text(t.settings.config.ipv6Mode), + subtitle: Text(options.ipv6Mode.present(t)), + onTap: () async { + final ipv6Mode = await SettingsPickerDialog( + title: t.settings.config.ipv6Mode, + selected: options.ipv6Mode, + options: IPv6Mode.values, + getTitle: (e) => e.present(t), + resetValue: defaultOptions.ipv6Mode, + ).show(context); + if (ipv6Mode == null) return; + await changeOption(ConfigOptionPatch(ipv6Mode: ipv6Mode)); + }, + ), + const SettingsDivider(), + SettingsSection(t.settings.config.section.dns), + ListTile( + title: Text(t.settings.config.remoteDnsAddress), + subtitle: Text(options.remoteDnsAddress), + onTap: () async { + final url = await SettingsInputDialog( + title: t.settings.config.remoteDnsAddress, + initialValue: options.remoteDnsAddress, + resetValue: defaultOptions.remoteDnsAddress, + ).show(context); + if (url == null || url.isEmpty) return; + await changeOption( + ConfigOptionPatch(remoteDnsAddress: url), ); }, ), - PopupMenuItem( - child: Text(t.settings.config.resetBtn), + ListTile( + title: Text(t.settings.config.remoteDnsDomainStrategy), + subtitle: Text(options.remoteDnsDomainStrategy.displayName), onTap: () async { - await ref - .read(configOptionNotifierProvider.notifier) - .resetOption(); + final domainStrategy = await SettingsPickerDialog( + title: t.settings.config.remoteDnsDomainStrategy, + selected: options.remoteDnsDomainStrategy, + options: DomainStrategy.values, + getTitle: (e) => e.displayName, + resetValue: defaultOptions.remoteDnsDomainStrategy, + ).show(context); + if (domainStrategy == null) return; + await changeOption( + ConfigOptionPatch( + remoteDnsDomainStrategy: domainStrategy, + ), + ); }, ), - ]; - }, - ), - ], - ), - body: switch (asyncOptions) { - AsyncData(value: final options) => ListView( - children: [ - TipCard(message: t.settings.experimentalMsg), - ListTile( - title: Text(t.settings.config.logLevel), - subtitle: Text(options.logLevel.name.toUpperCase()), - onTap: () async { - final logLevel = await SettingsPickerDialog( - title: t.settings.config.logLevel, - selected: options.logLevel, - options: LogLevel.choices, - getTitle: (e) => e.name.toUpperCase(), - resetValue: defaultOptions.logLevel, - ).show(context); - if (logLevel == null) return; - await changeOption(ConfigOptionPatch(logLevel: logLevel)); - }, - ), - const SettingsDivider(), - SettingsSection(t.settings.config.section.route), - SwitchListTile( - title: Text(experimental(t.settings.config.bypassLan)), - value: options.bypassLan, - onChanged: (value) async => - changeOption(ConfigOptionPatch(bypassLan: value)), - ), - SwitchListTile( - title: Text(t.settings.config.resolveDestination), - value: options.resolveDestination, - onChanged: (value) async => - changeOption(ConfigOptionPatch(resolveDestination: value)), - ), - ListTile( - title: Text(t.settings.config.ipv6Mode), - subtitle: Text(options.ipv6Mode.present(t)), - onTap: () async { - final ipv6Mode = await SettingsPickerDialog( - title: t.settings.config.ipv6Mode, - selected: options.ipv6Mode, - options: IPv6Mode.values, - getTitle: (e) => e.present(t), - resetValue: defaultOptions.ipv6Mode, - ).show(context); - if (ipv6Mode == null) return; - await changeOption(ConfigOptionPatch(ipv6Mode: ipv6Mode)); - }, - ), - const SettingsDivider(), - SettingsSection(t.settings.config.section.dns), - ListTile( - title: Text(t.settings.config.remoteDnsAddress), - subtitle: Text(options.remoteDnsAddress), - onTap: () async { - final url = await SettingsInputDialog( - title: t.settings.config.remoteDnsAddress, - initialValue: options.remoteDnsAddress, - resetValue: defaultOptions.remoteDnsAddress, - ).show(context); - if (url == null || url.isEmpty) return; - await changeOption(ConfigOptionPatch(remoteDnsAddress: url)); - }, - ), - ListTile( - title: Text(t.settings.config.remoteDnsDomainStrategy), - subtitle: Text(options.remoteDnsDomainStrategy.displayName), - onTap: () async { - final domainStrategy = await SettingsPickerDialog( - title: t.settings.config.remoteDnsDomainStrategy, - selected: options.remoteDnsDomainStrategy, - options: DomainStrategy.values, - getTitle: (e) => e.displayName, - resetValue: defaultOptions.remoteDnsDomainStrategy, - ).show(context); - if (domainStrategy == null) return; - await changeOption( - ConfigOptionPatch(remoteDnsDomainStrategy: domainStrategy), - ); - }, - ), - ListTile( - title: Text(t.settings.config.directDnsAddress), - subtitle: Text(options.directDnsAddress), - onTap: () async { - final url = await SettingsInputDialog( - title: t.settings.config.directDnsAddress, - initialValue: options.directDnsAddress, - resetValue: defaultOptions.directDnsAddress, - ).show(context); - if (url == null || url.isEmpty) return; - await changeOption(ConfigOptionPatch(directDnsAddress: url)); - }, - ), - ListTile( - title: Text(t.settings.config.directDnsDomainStrategy), - subtitle: Text(options.directDnsDomainStrategy.displayName), - onTap: () async { - final domainStrategy = await SettingsPickerDialog( - title: t.settings.config.directDnsDomainStrategy, - selected: options.directDnsDomainStrategy, - options: DomainStrategy.values, - getTitle: (e) => e.displayName, - resetValue: defaultOptions.directDnsDomainStrategy, - ).show(context); - if (domainStrategy == null) return; - await changeOption( - ConfigOptionPatch(directDnsDomainStrategy: domainStrategy), - ); - }, - ), - SwitchListTile( - title: Text(t.settings.config.enableDnsRouting), - value: options.enableDnsRouting, - onChanged: (value) => changeOption( - ConfigOptionPatch(enableDnsRouting: value), - ), - ), - const SettingsDivider(), - SettingsSection(experimental(t.settings.config.section.mux)), - SwitchListTile( - title: Text(t.settings.config.enableMux), - value: options.enableMux, - onChanged: (value) => changeOption( - ConfigOptionPatch(enableMux: value), - ), - ), - ListTile( - title: Text(t.settings.config.muxProtocol), - subtitle: Text(options.muxProtocol.name), - onTap: () async { - final pickedProtocol = await SettingsPickerDialog( - title: t.settings.config.muxProtocol, - selected: options.muxProtocol, - options: MuxProtocol.values, - getTitle: (e) => e.name, - resetValue: defaultOptions.muxProtocol, - ).show(context); - if (pickedProtocol == null) return; - await changeOption( - ConfigOptionPatch(muxProtocol: pickedProtocol), - ); - }, - ), - ListTile( - title: Text(t.settings.config.muxMaxStreams), - subtitle: Text(options.muxMaxStreams.toString()), - onTap: () async { - final maxStreams = await SettingsInputDialog( - title: t.settings.config.muxMaxStreams, - initialValue: options.muxMaxStreams, - resetValue: defaultOptions.muxMaxStreams, - mapTo: int.tryParse, - digitsOnly: true, - ).show(context); - if (maxStreams == null || maxStreams < 1) return; - await changeOption( - ConfigOptionPatch(muxMaxStreams: maxStreams), - ); - }, - ), - const SettingsDivider(), - SettingsSection(t.settings.config.section.inbound), - ListTile( - title: Text(t.settings.config.serviceMode), - subtitle: Text(options.serviceMode.present(t)), - onTap: () async { - final pickedMode = await SettingsPickerDialog( - title: t.settings.config.serviceMode, - selected: options.serviceMode, - options: ServiceMode.choices, - getTitle: (e) => e.present(t), - resetValue: ServiceMode.defaultMode, - ).show(context); - if (pickedMode == null) return; - await changeOption( - ConfigOptionPatch(serviceMode: pickedMode), - ); - }, - ), - SwitchListTile( - title: Text(t.settings.config.strictRoute), - value: options.strictRoute, - onChanged: (value) async => - changeOption(ConfigOptionPatch(strictRoute: value)), - ), - ListTile( - title: Text(t.settings.config.tunImplementation), - subtitle: Text(options.tunImplementation.name), - onTap: () async { - final tunImplementation = await SettingsPickerDialog( - title: t.settings.config.tunImplementation, - selected: options.tunImplementation, - options: TunImplementation.values, - getTitle: (e) => e.name, - resetValue: defaultOptions.tunImplementation, - ).show(context); - if (tunImplementation == null) return; - await changeOption( - ConfigOptionPatch(tunImplementation: tunImplementation), - ); - }, - ), - ListTile( - title: Text(t.settings.config.mixedPort), - subtitle: Text(options.mixedPort.toString()), - onTap: () async { - final mixedPort = await SettingsInputDialog( - title: t.settings.config.mixedPort, - initialValue: options.mixedPort, - resetValue: defaultOptions.mixedPort, - validator: isPort, - mapTo: int.tryParse, - digitsOnly: true, - ).show(context); - if (mixedPort == null) return; - await changeOption(ConfigOptionPatch(mixedPort: mixedPort)); - }, - ), - ListTile( - title: Text(t.settings.config.localDnsPort), - subtitle: Text(options.localDnsPort.toString()), - onTap: () async { - final localDnsPort = await SettingsInputDialog( - title: t.settings.config.localDnsPort, - initialValue: options.localDnsPort, - resetValue: defaultOptions.localDnsPort, - validator: isPort, - mapTo: int.tryParse, - digitsOnly: true, - ).show(context); - if (localDnsPort == null) return; - await changeOption( - ConfigOptionPatch(localDnsPort: localDnsPort), - ); - }, - ), - SwitchListTile( - title: Text( - experimental(t.settings.config.allowConnectionFromLan), - ), - value: options.allowConnectionFromLan, - onChanged: (value) => changeOption( - ConfigOptionPatch(allowConnectionFromLan: value), - ), - ), - const SettingsDivider(), - SettingsSection(t.settings.config.section.tlsTricks), - SwitchListTile( - title: Text(experimental(t.settings.config.enableTlsFragment)), - value: options.enableTlsFragment, - onChanged: (value) async => - changeOption(ConfigOptionPatch(enableTlsFragment: value)), - ), - ListTile( - title: Text(t.settings.config.tlsFragmentSize), - subtitle: Text(options.tlsFragmentSize.present(t)), - onTap: () async { - final range = await SettingsInputDialog( - title: t.settings.config.tlsFragmentSize, - initialValue: options.tlsFragmentSize.format(), - resetValue: defaultOptions.tlsFragmentSize.format(), - ).show(context); - if (range == null) return; - await changeOption( - ConfigOptionPatch( - tlsFragmentSize: RangeWithOptionalCeil.tryParse(range), - ), - ); - }, - ), - ListTile( - title: Text(t.settings.config.tlsFragmentSleep), - subtitle: Text(options.tlsFragmentSleep.present(t)), - onTap: () async { - final range = await SettingsInputDialog( - title: t.settings.config.tlsFragmentSleep, - initialValue: options.tlsFragmentSleep.format(), - resetValue: defaultOptions.tlsFragmentSleep.format(), - ).show(context); - if (range == null) return; - await changeOption( - ConfigOptionPatch( - tlsFragmentSleep: RangeWithOptionalCeil.tryParse(range), - ), - ); - }, - ), - SwitchListTile( - title: - Text(experimental(t.settings.config.enableTlsMixedSniCase)), - value: options.enableTlsMixedSniCase, - onChanged: (value) async => changeOption( - ConfigOptionPatch(enableTlsMixedSniCase: value), - ), - ), - SwitchListTile( - title: Text(experimental(t.settings.config.enableTlsPadding)), - value: options.enableTlsPadding, - onChanged: (value) async => changeOption( - ConfigOptionPatch(enableTlsPadding: value), - ), - ), - ListTile( - title: Text(t.settings.config.tlsPaddingSize), - subtitle: Text(options.tlsPaddingSize.present(t)), - onTap: () async { - final range = await SettingsInputDialog( - title: t.settings.config.tlsPaddingSize, - initialValue: options.tlsPaddingSize.format(), - resetValue: defaultOptions.tlsPaddingSize.format(), - ).show(context); - if (range == null) return; - await changeOption( - ConfigOptionPatch( - tlsPaddingSize: RangeWithOptionalCeil.tryParse(range), - ), - ); - }, - ), - const SettingsDivider(), - SettingsSection(experimental(t.settings.config.section.warp)), - WarpOptionsTiles( - options: options, - defaultOptions: defaultOptions, - onChange: changeOption, - ), - const SettingsDivider(), - SettingsSection(t.settings.config.section.misc), - ListTile( - title: Text(t.settings.config.connectionTestUrl), - subtitle: Text(options.connectionTestUrl), - onTap: () async { - final url = await SettingsInputDialog( - title: t.settings.config.connectionTestUrl, - initialValue: options.connectionTestUrl, - resetValue: defaultOptions.connectionTestUrl, - ).show(context); - if (url == null || url.isEmpty || !isUrl(url)) return; - await changeOption(ConfigOptionPatch(connectionTestUrl: url)); - }, - ), - ListTile( - title: Text(t.settings.config.urlTestInterval), - subtitle: Text( - options.urlTestInterval - .toApproximateTime(isRelativeToNow: false), - ), - onTap: () async { - final urlTestInterval = await SettingsSliderDialog( - title: t.settings.config.urlTestInterval, - initialValue: options.urlTestInterval.inMinutes - .coerceIn(0, 60) - .toDouble(), - resetValue: - defaultOptions.urlTestInterval.inMinutes.toDouble(), - min: 1, - max: 60, - divisions: 60, - labelGen: (value) => Duration(minutes: value.toInt()) - .toApproximateTime(isRelativeToNow: false), - ).show(context); - if (urlTestInterval == null) return; - await changeOption( - ConfigOptionPatch( - urlTestInterval: - Duration(minutes: urlTestInterval.toInt()), - ), - ); - }, - ), - ListTile( - title: Text(t.settings.config.clashApiPort), - subtitle: Text(options.clashApiPort.toString()), - onTap: () async { - final clashApiPort = await SettingsInputDialog( - title: t.settings.config.clashApiPort, - initialValue: options.clashApiPort, - resetValue: defaultOptions.clashApiPort, - validator: isPort, - mapTo: int.tryParse, - digitsOnly: true, - ).show(context); - if (clashApiPort == null) return; - await changeOption( - ConfigOptionPatch(clashApiPort: clashApiPort), - ); - }, - ), - const Gap(24), - ], - ), - AsyncError(:final error) => Center( - child: SingleChildScrollView( - child: Column( - children: [ - const Icon(Icons.error), - const Gap(2), - Text(t.presentShortError(error)), - const Gap(2), - TextButton( - onPressed: () async { - await ref - .read(configOptionNotifierProvider.notifier) - .resetOption(); + ListTile( + title: Text(t.settings.config.directDnsAddress), + subtitle: Text(options.directDnsAddress), + onTap: () async { + final url = await SettingsInputDialog( + title: t.settings.config.directDnsAddress, + initialValue: options.directDnsAddress, + resetValue: defaultOptions.directDnsAddress, + ).show(context); + if (url == null || url.isEmpty) return; + await changeOption( + ConfigOptionPatch(directDnsAddress: url), + ); }, - child: Text(t.settings.config.resetBtn), ), + ListTile( + title: Text(t.settings.config.directDnsDomainStrategy), + subtitle: Text(options.directDnsDomainStrategy.displayName), + onTap: () async { + final domainStrategy = await SettingsPickerDialog( + title: t.settings.config.directDnsDomainStrategy, + selected: options.directDnsDomainStrategy, + options: DomainStrategy.values, + getTitle: (e) => e.displayName, + resetValue: defaultOptions.directDnsDomainStrategy, + ).show(context); + if (domainStrategy == null) return; + await changeOption( + ConfigOptionPatch( + directDnsDomainStrategy: domainStrategy, + ), + ); + }, + ), + SwitchListTile( + title: Text(t.settings.config.enableDnsRouting), + value: options.enableDnsRouting, + onChanged: (value) => changeOption( + ConfigOptionPatch(enableDnsRouting: value), + ), + ), + const SettingsDivider(), + SettingsSection(experimental(t.settings.config.section.mux)), + SwitchListTile( + title: Text(t.settings.config.enableMux), + value: options.enableMux, + onChanged: (value) => changeOption( + ConfigOptionPatch(enableMux: value), + ), + ), + ListTile( + title: Text(t.settings.config.muxProtocol), + subtitle: Text(options.muxProtocol.name), + onTap: () async { + final pickedProtocol = await SettingsPickerDialog( + title: t.settings.config.muxProtocol, + selected: options.muxProtocol, + options: MuxProtocol.values, + getTitle: (e) => e.name, + resetValue: defaultOptions.muxProtocol, + ).show(context); + if (pickedProtocol == null) return; + await changeOption( + ConfigOptionPatch(muxProtocol: pickedProtocol), + ); + }, + ), + ListTile( + title: Text(t.settings.config.muxMaxStreams), + subtitle: Text(options.muxMaxStreams.toString()), + onTap: () async { + final maxStreams = await SettingsInputDialog( + title: t.settings.config.muxMaxStreams, + initialValue: options.muxMaxStreams, + resetValue: defaultOptions.muxMaxStreams, + mapTo: int.tryParse, + digitsOnly: true, + ).show(context); + if (maxStreams == null || maxStreams < 1) return; + await changeOption( + ConfigOptionPatch(muxMaxStreams: maxStreams), + ); + }, + ), + const SettingsDivider(), + SettingsSection(t.settings.config.section.inbound), + ListTile( + title: Text(t.settings.config.serviceMode), + subtitle: Text(options.serviceMode.present(t)), + onTap: () async { + final pickedMode = await SettingsPickerDialog( + title: t.settings.config.serviceMode, + selected: options.serviceMode, + options: ServiceMode.choices, + getTitle: (e) => e.present(t), + resetValue: ServiceMode.defaultMode, + ).show(context); + if (pickedMode == null) return; + await changeOption( + ConfigOptionPatch(serviceMode: pickedMode), + ); + }, + ), + SwitchListTile( + title: Text(t.settings.config.strictRoute), + value: options.strictRoute, + onChanged: (value) async => + changeOption(ConfigOptionPatch(strictRoute: value)), + ), + ListTile( + title: Text(t.settings.config.tunImplementation), + subtitle: Text(options.tunImplementation.name), + onTap: () async { + final tunImplementation = await SettingsPickerDialog( + title: t.settings.config.tunImplementation, + selected: options.tunImplementation, + options: TunImplementation.values, + getTitle: (e) => e.name, + resetValue: defaultOptions.tunImplementation, + ).show(context); + if (tunImplementation == null) return; + await changeOption( + ConfigOptionPatch(tunImplementation: tunImplementation), + ); + }, + ), + ListTile( + title: Text(t.settings.config.mixedPort), + subtitle: Text(options.mixedPort.toString()), + onTap: () async { + final mixedPort = await SettingsInputDialog( + title: t.settings.config.mixedPort, + initialValue: options.mixedPort, + resetValue: defaultOptions.mixedPort, + validator: isPort, + mapTo: int.tryParse, + digitsOnly: true, + ).show(context); + if (mixedPort == null) return; + await changeOption( + ConfigOptionPatch(mixedPort: mixedPort), + ); + }, + ), + ListTile( + title: Text(t.settings.config.localDnsPort), + subtitle: Text(options.localDnsPort.toString()), + onTap: () async { + final localDnsPort = await SettingsInputDialog( + title: t.settings.config.localDnsPort, + initialValue: options.localDnsPort, + resetValue: defaultOptions.localDnsPort, + validator: isPort, + mapTo: int.tryParse, + digitsOnly: true, + ).show(context); + if (localDnsPort == null) return; + await changeOption( + ConfigOptionPatch(localDnsPort: localDnsPort), + ); + }, + ), + SwitchListTile( + title: Text( + experimental(t.settings.config.allowConnectionFromLan), + ), + value: options.allowConnectionFromLan, + onChanged: (value) => changeOption( + ConfigOptionPatch(allowConnectionFromLan: value), + ), + ), + const SettingsDivider(), + SettingsSection(t.settings.config.section.tlsTricks), + SwitchListTile( + title: + Text(experimental(t.settings.config.enableTlsFragment)), + value: options.enableTlsFragment, + onChanged: (value) async => changeOption( + ConfigOptionPatch(enableTlsFragment: value), + ), + ), + ListTile( + title: Text(t.settings.config.tlsFragmentSize), + subtitle: Text(options.tlsFragmentSize.present(t)), + onTap: () async { + final range = await SettingsInputDialog( + title: t.settings.config.tlsFragmentSize, + initialValue: options.tlsFragmentSize.format(), + resetValue: defaultOptions.tlsFragmentSize.format(), + ).show(context); + if (range == null) return; + await changeOption( + ConfigOptionPatch( + tlsFragmentSize: + RangeWithOptionalCeil.tryParse(range), + ), + ); + }, + ), + ListTile( + title: Text(t.settings.config.tlsFragmentSleep), + subtitle: Text(options.tlsFragmentSleep.present(t)), + onTap: () async { + final range = await SettingsInputDialog( + title: t.settings.config.tlsFragmentSleep, + initialValue: options.tlsFragmentSleep.format(), + resetValue: defaultOptions.tlsFragmentSleep.format(), + ).show(context); + if (range == null) return; + await changeOption( + ConfigOptionPatch( + tlsFragmentSleep: + RangeWithOptionalCeil.tryParse(range), + ), + ); + }, + ), + SwitchListTile( + title: Text( + experimental(t.settings.config.enableTlsMixedSniCase), + ), + value: options.enableTlsMixedSniCase, + onChanged: (value) async => changeOption( + ConfigOptionPatch(enableTlsMixedSniCase: value), + ), + ), + SwitchListTile( + title: + Text(experimental(t.settings.config.enableTlsPadding)), + value: options.enableTlsPadding, + onChanged: (value) async => changeOption( + ConfigOptionPatch(enableTlsPadding: value), + ), + ), + ListTile( + title: Text(t.settings.config.tlsPaddingSize), + subtitle: Text(options.tlsPaddingSize.present(t)), + onTap: () async { + final range = await SettingsInputDialog( + title: t.settings.config.tlsPaddingSize, + initialValue: options.tlsPaddingSize.format(), + resetValue: defaultOptions.tlsPaddingSize.format(), + ).show(context); + if (range == null) return; + await changeOption( + ConfigOptionPatch( + tlsPaddingSize: RangeWithOptionalCeil.tryParse(range), + ), + ); + }, + ), + const SettingsDivider(), + SettingsSection(experimental(t.settings.config.section.warp)), + WarpOptionsTiles( + options: options, + defaultOptions: defaultOptions, + onChange: changeOption, + ), + const SettingsDivider(), + SettingsSection(t.settings.config.section.misc), + ListTile( + title: Text(t.settings.config.connectionTestUrl), + subtitle: Text(options.connectionTestUrl), + onTap: () async { + final url = await SettingsInputDialog( + title: t.settings.config.connectionTestUrl, + initialValue: options.connectionTestUrl, + resetValue: defaultOptions.connectionTestUrl, + ).show(context); + if (url == null || url.isEmpty || !isUrl(url)) return; + await changeOption( + ConfigOptionPatch(connectionTestUrl: url), + ); + }, + ), + ListTile( + title: Text(t.settings.config.urlTestInterval), + subtitle: Text( + options.urlTestInterval + .toApproximateTime(isRelativeToNow: false), + ), + onTap: () async { + final urlTestInterval = await SettingsSliderDialog( + title: t.settings.config.urlTestInterval, + initialValue: options.urlTestInterval.inMinutes + .coerceIn(0, 60) + .toDouble(), + resetValue: + defaultOptions.urlTestInterval.inMinutes.toDouble(), + min: 1, + max: 60, + divisions: 60, + labelGen: (value) => Duration(minutes: value.toInt()) + .toApproximateTime(isRelativeToNow: false), + ).show(context); + if (urlTestInterval == null) return; + await changeOption( + ConfigOptionPatch( + urlTestInterval: + Duration(minutes: urlTestInterval.toInt()), + ), + ); + }, + ), + ListTile( + title: Text(t.settings.config.clashApiPort), + subtitle: Text(options.clashApiPort.toString()), + onTap: () async { + final clashApiPort = await SettingsInputDialog( + title: t.settings.config.clashApiPort, + initialValue: options.clashApiPort, + resetValue: defaultOptions.clashApiPort, + validator: isPort, + mapTo: int.tryParse, + digitsOnly: true, + ).show(context); + if (clashApiPort == null) return; + await changeOption( + ConfigOptionPatch(clashApiPort: clashApiPort), + ); + }, + ), + const Gap(24), ], ), - ), - ), - _ => const SizedBox(), - }, + AsyncError(:final error) => SliverFillRemaining( + hasScrollBody: false, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.error), + const Gap(2), + Text(t.presentShortError(error)), + const Gap(2), + TextButton( + onPressed: () async { + await ref + .read(configOptionNotifierProvider.notifier) + .resetOption(); + }, + child: Text(t.settings.config.resetBtn), + ), + ], + ), + ), + _ => const SliverToBoxAdapter(), + }, + ], + ), ); } } diff --git a/lib/features/home/widget/connection_button.dart b/lib/features/home/widget/connection_button.dart index 3fcbad18..485bccae 100644 --- a/lib/features/home/widget/connection_button.dart +++ b/lib/features/home/widget/connection_button.dart @@ -151,7 +151,7 @@ class _ConnectionButton extends StatelessWidget { const Gap(16), Text( label, - style: Theme.of(context).textTheme.bodyLarge, + style: Theme.of(context).textTheme.titleMedium, ), ], ); diff --git a/lib/features/settings/widgets/advanced_setting_tiles.dart b/lib/features/settings/widgets/advanced_setting_tiles.dart index 097aabcd..8a4de050 100644 --- a/lib/features/settings/widgets/advanced_setting_tiles.dart +++ b/lib/features/settings/widgets/advanced_setting_tiles.dart @@ -23,13 +23,6 @@ class AdvancedSettingTiles extends HookConsumerWidget { return Column( children: [ const RegionPrefTile(), - ListTile( - title: Text(t.settings.config.pageTitle), - leading: const Icon(Icons.edit_document), - onTap: () async { - await const ConfigOptionsRoute().push(context); - }, - ), ListTile( title: Text(t.settings.geoAssets.pageTitle), leading: const Icon(Icons.folder), From c85ecc59841cdedc0d6c9cd1f0f329f6ee0d5f44 Mon Sep 17 00:00:00 2001 From: realWLF Date: Sun, 11 Feb 2024 15:17:00 +0330 Subject: [PATCH 44/83] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a6267325..eacce6f7 100644 --- a/Makefile +++ b/Makefile @@ -217,7 +217,7 @@ release: # Create a new tag for release. ios-temp-prepare: - make prepare platform=ios + make ios-prepare flutter build ios-framework cd ios pod install From 6a81a2ab625ddae87f1b926a9fd0decca96203be Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sun, 11 Feb 2024 14:17:53 +0330 Subject: [PATCH 45/83] Fix android service mode --- android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt index 49b1feab..580e09c8 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt @@ -92,7 +92,7 @@ object Settings { } } - private var currentServiceMode = ServiceMode.NORMAL; + private var currentServiceMode : String? = null suspend fun rebuildServiceMode(): Boolean { var newMode = ServiceMode.NORMAL From 7e1989d0bc92f53a80c26188394d03b179d5de1d Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sun, 11 Feb 2024 16:45:22 +0330 Subject: [PATCH 46/83] Add proxy http adapter --- lib/core/http_client/dio_http_client.dart | 15 ++ .../http_client/http_client_provider.dart | 14 +- .../data/config_option_data_providers.dart | 10 + .../data/config_option_repository.dart | 178 ++++++++++-------- .../notifier/config_option_notifier.dart | 4 +- .../data/connection_data_providers.dart | 3 +- .../data/connection_repository.dart | 13 +- 7 files changed, 142 insertions(+), 95 deletions(-) diff --git a/lib/core/http_client/dio_http_client.dart b/lib/core/http_client/dio_http_client.dart index a19c3f6b..533ec17b 100644 --- a/lib/core/http_client/dio_http_client.dart +++ b/lib/core/http_client/dio_http_client.dart @@ -1,6 +1,8 @@ import 'dart:convert'; +import 'dart:io'; import 'package:dio/dio.dart'; +import 'package:dio/io.dart'; import 'package:dio_smart_retry/dio_smart_retry.dart'; import 'package:flutter_loggy_dio/flutter_loggy_dio.dart'; import 'package:hiddify/utils/custom_loggers.dart'; @@ -38,6 +40,19 @@ class DioHttpClient with InfraLogger { late final Dio _dio; + void setProxyPort(int port) { + loggy.debug("setting proxy port: [$port]"); + _dio.httpClientAdapter = IOHttpClientAdapter( + createHttpClient: () { + final client = HttpClient(); + client.findProxy = (url) { + return "PROXY localhost:$port; DIRECT"; + }; + return client; + }, + ); + } + Future> get( String url, { CancelToken? cancelToken, diff --git a/lib/core/http_client/http_client_provider.dart b/lib/core/http_client/http_client_provider.dart index a70df92d..8335ec9b 100644 --- a/lib/core/http_client/http_client_provider.dart +++ b/lib/core/http_client/http_client_provider.dart @@ -1,15 +1,27 @@ import 'package:flutter/foundation.dart'; import 'package:hiddify/core/app_info/app_info_provider.dart'; import 'package:hiddify/core/http_client/dio_http_client.dart'; +import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'http_client_provider.g.dart'; @Riverpod(keepAlive: true) DioHttpClient httpClient(HttpClientRef ref) { - return DioHttpClient( + final client = DioHttpClient( timeout: const Duration(seconds: 15), userAgent: ref.watch(appInfoProvider).requireValue.userAgent, debug: kDebugMode, ); + + ref.listen( + configOptionNotifierProvider, + (_, next) { + if (next case AsyncData(value: final options)) { + client.setProxyPort(options.mixedPort); + } + }, + fireImmediately: true, + ); + return client; } diff --git a/lib/features/config_option/data/config_option_data_providers.dart b/lib/features/config_option/data/config_option_data_providers.dart index c9b5f9b4..cf8fc061 100644 --- a/lib/features/config_option/data/config_option_data_providers.dart +++ b/lib/features/config_option/data/config_option_data_providers.dart @@ -11,6 +11,16 @@ ConfigOptionRepository configOptionRepository( ) { return ConfigOptionRepositoryImpl( preferences: ref.watch(sharedPreferencesProvider).requireValue, + ); +} + +@Riverpod(keepAlive: true) +SingBoxConfigOptionRepository singBoxConfigOptionRepository( + SingBoxConfigOptionRepositoryRef ref, +) { + return SingBoxConfigOptionRepositoryImpl( + preferences: ref.watch(sharedPreferencesProvider).requireValue, + optionsRepository: ref.watch(configOptionRepositoryProvider), geoAssetRepository: ref.watch(geoAssetRepositoryProvider).requireValue, geoAssetPathResolver: ref.watch(geoAssetPathResolverProvider), ); diff --git a/lib/features/config_option/data/config_option_repository.dart b/lib/features/config_option/data/config_option_repository.dart index 82faa16f..dc5f05cf 100644 --- a/lib/features/config_option/data/config_option_repository.dart +++ b/lib/features/config_option/data/config_option_repository.dart @@ -14,25 +14,115 @@ import 'package:meta/meta.dart'; import 'package:shared_preferences/shared_preferences.dart'; abstract interface class ConfigOptionRepository { - TaskEither - getFullSingboxConfigOption(); - TaskEither getConfigOption(); + Either getConfigOption(); TaskEither updateConfigOption( ConfigOptionPatch patch, ); TaskEither resetConfigOption(); } +abstract interface class SingBoxConfigOptionRepository { + TaskEither + getFullSingboxConfigOption(); +} + class ConfigOptionRepositoryImpl with ExceptionHandler, InfraLogger implements ConfigOptionRepository { - ConfigOptionRepositoryImpl({ + ConfigOptionRepositoryImpl({required this.preferences}); + + final SharedPreferences preferences; + + @override + Either getConfigOption() { + try { + final map = ConfigOptionEntity.initial.toJson(); + for (final key in map.keys) { + final persisted = preferences.get(key); + if (persisted != null) { + final defaultValue = map[key]; + if (defaultValue != null && + persisted.runtimeType != defaultValue.runtimeType) { + loggy.warning( + "error getting preference[$key], expected type: [${defaultValue.runtimeType}] - received value: [$persisted](${persisted.runtimeType})", + ); + continue; + } + map[key] = persisted; + } + } + final options = ConfigOptionEntity.fromJson(map); + return right(options); + } catch (error, stackTrace) { + return left(ConfigOptionUnexpectedFailure(error, stackTrace)); + } + } + + @override + TaskEither updateConfigOption( + ConfigOptionPatch patch, + ) { + return exceptionHandler( + () async { + final map = patch.toJson(); + await updateByJson(map); + return right(unit); + }, + ConfigOptionUnexpectedFailure.new, + ); + } + + @override + TaskEither resetConfigOption() { + return exceptionHandler( + () async { + final map = ConfigOptionEntity.initial.toJson(); + await updateByJson(map); + return right(unit); + }, + ConfigOptionUnexpectedFailure.new, + ); + } + + @visibleForTesting + Future updateByJson( + Map options, + ) async { + final map = ConfigOptionEntity.initial.toJson(); + for (final key in map.keys) { + final value = options[key]; + if (value != null) { + loggy.debug("updating [$key] to [$value]"); + + switch (value) { + case bool _: + await preferences.setBool(key, value); + case String _: + await preferences.setString(key, value); + case int _: + await preferences.setInt(key, value); + case double _: + await preferences.setDouble(key, value); + default: + loggy.warning("unexpected type"); + } + } + } + } +} + +class SingBoxConfigOptionRepositoryImpl + with ExceptionHandler, InfraLogger + implements SingBoxConfigOptionRepository { + SingBoxConfigOptionRepositoryImpl({ required this.preferences, + required this.optionsRepository, required this.geoAssetRepository, required this.geoAssetPathResolver, }); final SharedPreferences preferences; + final ConfigOptionRepository optionsRepository; final GeoAssetRepository geoAssetRepository; final GeoAssetPathResolver geoAssetPathResolver; @@ -81,7 +171,7 @@ class ConfigOptionRepositoryImpl .run(); final persisted = - await getConfigOption().getOrElse((l) => throw l).run(); + optionsRepository.getConfigOption().getOrElse((l) => throw l); final singboxConfigOption = SingboxConfigOption( executeConfigAsIs: false, logLevel: persisted.logLevel, @@ -138,82 +228,4 @@ class ConfigOptionRepositoryImpl ConfigOptionUnexpectedFailure.new, ); } - - @override - TaskEither getConfigOption() { - return exceptionHandler( - () async { - final map = ConfigOptionEntity.initial.toJson(); - for (final key in map.keys) { - final persisted = preferences.get(key); - if (persisted != null) { - final defaultValue = map[key]; - if (defaultValue != null && - persisted.runtimeType != defaultValue.runtimeType) { - loggy.warning( - "error getting preference[$key], expected type: [${defaultValue.runtimeType}] - received value: [$persisted](${persisted.runtimeType})", - ); - continue; - } - map[key] = persisted; - } - } - final options = ConfigOptionEntity.fromJson(map); - return right(options); - }, - ConfigOptionUnexpectedFailure.new, - ); - } - - @override - TaskEither updateConfigOption( - ConfigOptionPatch patch, - ) { - return exceptionHandler( - () async { - final map = patch.toJson(); - await updateByJson(map); - return right(unit); - }, - ConfigOptionUnexpectedFailure.new, - ); - } - - @override - TaskEither resetConfigOption() { - return exceptionHandler( - () async { - final map = ConfigOptionEntity.initial.toJson(); - await updateByJson(map); - return right(unit); - }, - ConfigOptionUnexpectedFailure.new, - ); - } - - @visibleForTesting - Future updateByJson( - Map options, - ) async { - final map = ConfigOptionEntity.initial.toJson(); - for (final key in map.keys) { - final value = options[key]; - if (value != null) { - loggy.debug("updating [$key] to [$value]"); - - switch (value) { - case bool _: - await preferences.setBool(key, value); - case String _: - await preferences.setString(key, value); - case int _: - await preferences.setInt(key, value); - case double _: - await preferences.setDouble(key, value); - default: - loggy.warning("unexpected type"); - } - } - } - } } diff --git a/lib/features/config_option/notifier/config_option_notifier.dart b/lib/features/config_option/notifier/config_option_notifier.dart index 40fb1490..77a67763 100644 --- a/lib/features/config_option/notifier/config_option_notifier.dart +++ b/lib/features/config_option/notifier/config_option_notifier.dart @@ -9,14 +9,14 @@ part 'config_option_notifier.g.dart'; @Riverpod(keepAlive: true) class ConfigOptionNotifier extends _$ConfigOptionNotifier with AppLogger { @override - Future build() { + Future build() async { return ref .watch(configOptionRepositoryProvider) .getConfigOption() .getOrElse((l) { loggy.error("error getting persisted options $l", l); throw l; - }).run(); + }); } Future updateOption(ConfigOptionPatch patch) async { diff --git a/lib/features/connection/data/connection_data_providers.dart b/lib/features/connection/data/connection_data_providers.dart index 96de56d9..6287964b 100644 --- a/lib/features/connection/data/connection_data_providers.dart +++ b/lib/features/connection/data/connection_data_providers.dart @@ -15,7 +15,8 @@ ConnectionRepository connectionRepository( ) { return ConnectionRepositoryImpl( directories: ref.watch(appDirectoriesProvider).requireValue, - configOptionRepository: ref.watch(configOptionRepositoryProvider), + singBoxConfigOptionRepository: + ref.watch(singBoxConfigOptionRepositoryProvider), singbox: ref.watch(singboxServiceProvider), platformSource: ConnectionPlatformSourceImpl(), profilePathResolver: ref.watch(profilePathResolverProvider), diff --git a/lib/features/connection/data/connection_repository.dart b/lib/features/connection/data/connection_repository.dart index e4d55c9b..9e53b74c 100644 --- a/lib/features/connection/data/connection_repository.dart +++ b/lib/features/connection/data/connection_repository.dart @@ -38,7 +38,7 @@ class ConnectionRepositoryImpl required this.directories, required this.singbox, required this.platformSource, - required this.configOptionRepository, + required this.singBoxConfigOptionRepository, required this.profilePathResolver, required this.geoAssetPathResolver, }); @@ -46,7 +46,7 @@ class ConnectionRepositoryImpl final Directories directories; final SingboxService singbox; final ConnectionPlatformSource platformSource; - final ConfigOptionRepository configOptionRepository; + final SingBoxConfigOptionRepository singBoxConfigOptionRepository; final ProfilePathResolver profilePathResolver; final GeoAssetPathResolver geoAssetPathResolver; @@ -83,7 +83,7 @@ class ConnectionRepositoryImpl return TaskEither.Do( ($) async { final options = await $( - configOptionRepository + singBoxConfigOptionRepository .getFullSingboxConfigOption() .mapLeft((l) => const InvalidConfigOption()), ); @@ -189,7 +189,7 @@ class ConnectionRepositoryImpl ($) async { final options = await $(getConfigOption()); - await $( + await $( TaskEither(() async { if (options.enableTun) { // final hasPrivilege = await platformSource.checkPrivilege(); @@ -202,13 +202,10 @@ class ConnectionRepositoryImpl }), ); return await $( - singbox.stop() - .mapLeft(UnexpectedConnectionFailure.new), + singbox.stop().mapLeft(UnexpectedConnectionFailure.new), ); }, ).handleExceptions(UnexpectedConnectionFailure.new); - - } @override From 5d02220bcb56848582971a1f9c12a159be8f06fd Mon Sep 17 00:00:00 2001 From: realWLF Date: Sun, 11 Feb 2024 16:51:09 +0330 Subject: [PATCH 47/83] Update iOS Icons --- .../AppIcon.appiconset/Contents.json | 120 +----------------- .../AppIcon.appiconset/Icon-1024x1024.png | Bin 0 -> 18281 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 2280 -> 1997 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 5601 -> 4186 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 14395 -> 6931 bytes 5 files changed, 6 insertions(+), 114 deletions(-) create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-1024x1024.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index 2efa0ba0..b2fe2f9d 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,14 @@ { - "images": [ + "images" : [ { - "filename": "iphone/app-icon-20@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "20x20" - }, - { - "filename": "iphone/app-icon-20@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "20x20" - }, - { - "filename": "iphone/app-icon-29.png", - "idiom": "iphone", - "scale": "1x", - "size": "29x29" - }, - { - "filename": "iphone/app-icon-29@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "29x29" - }, - { - "filename": "iphone/app-icon-29@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "29x29" - }, - { - "filename": "iphone/app-icon-40@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "40x40" - }, - { - "filename": "iphone/app-icon-40@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "40x40" - }, - { - "filename": "iphone/app-icon-60@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "60x60" - }, - { - "filename": "iphone/app-icon-60@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "60x60" - }, - { - "filename": "ipad/app-icon-20.png", - "idiom": "ipad", - "scale": "1x", - "size": "20x20" - }, - { - "filename": "ipad/app-icon-20@2x.png", - "idiom": "ipad", - "scale": "2x", - "size": "20x20" - }, - { - "filename": "ipad/app-icon-29.png", - "idiom": "ipad", - "scale": "1x", - "size": "29x29" - }, - { - "filename": "ipad/app-icon-29@2x.png", - "idiom": "ipad", - "scale": "2x", - "size": "29x29" - }, - { - "filename": "ipad/app-icon-40.png", - "idiom": "ipad", - "scale": "1x", - "size": "40x40" - }, - { - "filename": "ipad/app-icon-40@2x.png", - "idiom": "ipad", - "scale": "2x", - "size": "40x40" - }, - { - "filename": "ipad/app-icon-76.png", - "idiom": "ipad", - "scale": "1x", - "size": "76x76" - }, - { - "filename": "ipad/app-icon-76@2x.png", - "idiom": "ipad", - "scale": "2x", - "size": "76x76" - }, - { - "filename": "ipad/app-icon-83.5@2x.png", - "idiom": "ipad", - "scale": "2x", - "size": "83.5x83.5" - }, - { - "filename": "iphone/app-icon-1024.png", - "idiom": "ios-marketing", - "scale": "1x", - "size": "1024x1024" + "filename" : "Icon-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" } ], "info": { "author": "icons_launcher", "version": 1 } -} \ No newline at end of file +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-1024x1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..56c429effbed59c330efaa5ee931a0910ad654f9 GIT binary patch literal 18281 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 O7#=Y>oPY4#FaHD0>W(1* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png index 2867a2db982075b164e505cf3bb27136873a7f5c..52b839d96a056c2b4d70b3346f7beb5d38697590 100644 GIT binary patch literal 1997 zcmbW2k2f307RM)%pow2SsI67$FD-&MTrp0MpR2EL0^ax;l&@Y=e)i-XXZ2a-0wXz_s*GfZwBDK z^%3R>0DwO33^oV=h-M1`y4o6i6~~IuU|Z~&FcJVrHB_I$ujmPoIp z=~DM0HV-;_C_j;4a6IoH$T@KC96{b@?i3)$i^2jQxK9>Nczth0Gr`F$AITtkt64{r z_LSUTXcDQf!ZgSJA7gzk2n4GJ`C7{Dz}NGmI4F3aPh+iLG6Ip3kV2$v$wji z<@fu<_}MfH+8tL$x61G^Zo_gG*41x(=6T$2KRjKlZd!3dJchKH_P$RYu%Fw&GV}2p zi^RoMPZNR_75R1G%8_FhO6M*V3=~w=sLB`%d1jkm+Brgitffxnc3N$&bwyXAA!5B6Yil&esV`8@x?<#bAgfHmY#ZoNJzWi87cARgqX8kJc+ywvuXSWUYE zLOdm{#eh&*sX|2{+k`=a zZwV8nPbIQcii2Rfg)>jN8{^({XF-Q#r7;ugn1kw!SOY3PI=Yp&F`)~%H8%x>i!e}9 zbYNGfpivjFiUBoe+uwoq(=$%PD^ju{>BVW4?7)9ET7}c?Ta~p=({2-uydphK7(@H< zroO|D`Q8zagumVWtnndTJlc#IL*(oR#V_{{B*lI6!$>B!?*|U>{q|*~d$eG2fCJY{ z!yAK?K5|x!bNAU4D>i&QC^N<$qfgx&D1SqDt4J>(9z+P2CL9oZz{foM-jVQ`$;%xK zkSeeEK?j30O-o)Nret9fx-@sPTv#HDWUVm@7`yoM(+Y zHopKNZ6)zdw+^@64PIF_(kI|5RlZ)pZYP-;ISjSiu0bUD!b2kC!aUles#G$59$9{H z2kDo$*A~$ya2@>e+y88UTZj0ODXLz2md1UG&p27p()^Hq{z5ZFlAU%1WK`D7$IM$U zlXATSGaLV?mfpgoZqMigh~IgNgoU|6hnyb^A9TKSD0C(~2@gUVfs89=l-v}I?Y$s- z`?<`HM}UxukB-ftF*}U`+?uT&tP2T96A3(b75D>>P8bOB{oim4Mo&-h6}$Slj7nX~ z`r8$)DN4Ii03~S4OLGVRN**z&PT5Rs62BPgrFYzO;)adf2z|c~)c(ASukM~czY=G8 zGAhd}oM53>(V)uNX@DzXXcY^Ua#T#sRQU6km0z!;MAGN#uKlRvepsy#c5CSkF$M3@>rZW=9+E8D;p>290X{-zNzu2gGN3ywYz+YPlX!+TBA}{x0!&6U@tHC&$~jM zwRU&_yI~eCS*-ulKr+gS$D_i-)<)A4JwJzDI1w{no}F%S&AnT83)SqF`Y%k=+wI8x z0R1TS5wWWNyVraI@^7xBAORFE_X#R;>HC}%_x4L-p>+&4DgnCV46qB$akVJ#mn`Va zsvOIYB<5M(j#C_MK71TWM6$2UNYZERHii<@mpcyJzN&4P4MIyzX2w^?8!kJhJHxu@ zY3i*+kOlitFD%|MD7vAVUh_$1p%o}FM9a8`(+R}*4xc)ksoAr>fU%TGYI>q9i<%<2 z#V*BN!UWS_sT1xRuJvi148?DS96C^vl*(lMu@#9sg~!%<5z_t(O&ehU literal 2280 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 literal 5601 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 Jyrl2f)i5pozM``W3Bt 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 WRjC5qG6ul~8Qi#az4Wg~Fa8%{#s|p& From 0d2b56b1f0eb4ce494f04d10d96196a2c6f0bafc Mon Sep 17 00:00:00 2001 From: realWLF Date: Sun, 11 Feb 2024 17:27:24 +0330 Subject: [PATCH 48/83] AppIcon Update --- .../AppIcon.appiconset/Contents.json | 8 ++++---- .../AppIcon.appiconset/Icon-1024x1024.png | Bin 18281 -> 0 bytes .../AppIcon.appiconset/app-icon-1024.png | Bin 0 -> 16404 bytes 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-1024x1024.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index b2fe2f9d..8edf56e7 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,14 +1,14 @@ { "images" : [ { - "filename" : "Icon-1024x1024.png", + "filename" : "app-icon-1024.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" } ], - "info": { - "author": "icons_launcher", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-1024x1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-1024x1024.png deleted file mode 100644 index 56c429effbed59c330efaa5ee931a0910ad654f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18281 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 O7#=Y>oPY4#FaHD0>W(1* diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..21c1c5ada0dd3095b51ab7f5cb21f9e26fbd2877 GIT binary patch literal 16404 zcmeHudpwls`~QQ=c48$(Xxi*2Z4^<+$k-KXD>^WgV=M}pEEzeCwof@z+ZN?ispQ-w z$B9u+5lM13hM96^491K(ey_)VKd;~a-+z9;-}kk>UYqsY&vW1Rb-1tVdcUu`*i+V4 z8`o`HhakwtV@HpiL6BAOzpIe%*1!*vy4DT&vG&T*bAbr5UJ?CI3VE2W3=gFO&shC} z6n#{iK;QTN`Q*}P&jt_OU)^Y z_PKeZvd!LVHU;&HHit4#{CUhv@7~r2*YtHpamVgysbDkTCuu(r?3CU?mZ`Vggd9VD zTuSWip#)_GR)z5oSUfmWzq;1Bip5&Ut=ftFyfbz(kV2x59covpI&eBz8usJx>6Q%o zV-6JtIckRf9kuG8U;fd-KYsAfS@+b@qrD|r(9(grprqoWj*r*zv zXB3ck)lMStJbsIDRz9hbOD)-5!@o&(c=J99;ax?uhMUXls(3+4(QA)y{GIrqXbHb* zW~nq;^Y~Wzh7_FP7MxHJ&s5|lH@=iZs7KHfHtN)&ZtfCR64zvZqRCf~H~!kA(c}v2 zsBi#xZd+Eko3^E;H17~9Myh_{>^jK^bH<@GS3$MxUcj~A*Jw(zR40psr1|T2cv~gE zT?!w4ydNtyJhrkI>jMunLN1)u$NOtDdSmggu_cCaUlfMVVlaskX4c-RneSF|xZ9R4 zeeu^I%_a3b22LEZ$2zmRN=97NQPGI&;h?MnIH$v=GF`$jtduVMV^BcU?} z(PpH{CpT<0J-Fre162OjRIiTM!?JlH?iMA2o>$z3W!vcJyWRur`6o?VufkNhQULFW zk_g-c|K{3@O~}!c=y=h2%EFR|XtGlzneWI2bJ8gE8rLq#n=pA>_5hWa%O><(=7o z`-TL&hlt!xhap6GUbFqR$IN}Nf`Rk(&4GpE4rbBUccCNHr+LQYKpQ2}!gLU8_{}S| zK|9hg3pI?HO+GF5Zq5Lk*D~QyUU-04C#``#{+%O5%4sk47%1AA8Tweo`y=Jt_ANV6 z5jXjkYJf4^8~9$+hd#wwb|#8no>~h7w@*|vT=5x3VKwTwh_VjH=9^X?cW4{a-cn-@rlo<6_UtL=o9|h9eueL(m3hv&{&`AT z!0aCa;SU<<+FM=(Yck$71pARn6R4rT@7c9$h7;Y2>dhhQ`L>MSnv#Su!-MYJnml4Z z?sghHN7kRHZjcmHw8R6!cKZ*}g5P64p#s)Qf0`|t!(jX3t~$nt_&e)Af4+BFhI#^q zqNEIIF};=LG2Zru9_?a&5b3zMmUMh&BzX9!l9u6S)Wy;du__~L!%(BR)qauXJ6C;9 z+FSe=doj;4-MA+ycpwiqCq}oXydy<(D6)XQUNwz9I)b;o_ZGvuvNC`a;x*;e2@Pj; z4tNNBJx`oG^i{sX7?ppq^3`L+Es@Z-vQ-Giq{;ESO?SNfQ1)~tlrVoBgo3yepaBWwLu6q96II4&pjEC?mX z?8U~pe21iJq2je(*HWBusHstzD%%_&4Ehj<(_INXssG~KCV9S6EUrG+=4V?1M<3&bi{72=(1 z;HRD@oL{obIhaSTs9LThmd)&8kd+dRf(n#QMhm4Ptl?=?{;9uKJU+SDuYSq?Lq*Ut z+Q3@m6AQI3@Ak(aSxJ|UfyYeuPV3A|D#Gj6cf#{p*%#$pRuz@5wxOwth;`QW4(p1F3d+6ATU8zdo-($nbCI&ag14dZKW)bBQl=W5vA0 zpYpBWEcz(v`1#a-thOU;MQVT9fv(b?LHU$K74-!Xzflw7K_^?3!HiK~`e{E%gbl$a zE9z9c)X!hFU3TQ? z;9d$j?PXz_VwpK2YK}GM5Az6p=Nk3%9|jCxRGKLh2&E#`(NC`1!p4S=Y8m+HFqRYB zz)gp%QJZf_Z_c$gp*geZyfgaN>Hdx!S>E?6Q#IEArWri_6O(FUtnR(fh=v*VLC@4; zbslyKb7&~;p6WJoWSGj?PHUb_#d%c7h?$ln*!#tV#?h1yMnO+Zzv>_rYgPtwI%8+| zkTip5_cF=f5<{kfw4QI9U68HVzB2l3w}zbBUXQkTi-MsuN6u{%N_qVO)0xqYh-CHl zqDzfs85V>tswV|kn}9}vRH9wJBG#ptq1kTTG@`gSUyPKP!E?7E@E|K2Jo{^lrC)gE z0iH}N8qT8**<~^eF#trvjj& z-tpM7L=np4i>27=tmI_*hLeUH8s$wsxiuYhYut{iSShzzBh=y;pFK*pe&g2;8hlJW`3>i5@472EDO~!++ z#EJ`jr^2U3$h>G0Az<*TAVwLft%VE|wL14)ko#1T9-iRSm?>jN_#o*@O`Wb^pB5Lw zN!$}TmBwUK=;u}{{5oRzD*RJM^S)M*sijKjX1HK;75`QH* ze5M?9^J~RJn2CoaHoR$`jdG!nNrcb6{07d|`;7-VzH`iRWM?e+pR~Ovd?a^k>dU2hduuHL%%ym1M19jr$fK>3z zUJuUb&Ke2LB69;$YX-+9>iQ=ii*zGe+|_}H?01bj_qk+>X2dM-ypC8n-8_c3C2ie* z-kkfokT^T%TF<^)_~LvZbyAW)>5LGz=P{nyf8dFzhVEM-&Y?+(-(7DDHG~e6Kr{Lha)3PXZV>X%JxGg|6}{#+7HkZfC>BOm_N zvRn%JL;C9@cN)~=x6w!S6N;>1ZVD_Fw)y)v0_ z8i^u85U73gAl;`aZlkAPXl@5(jC$}e;rl+Fa=H_)$ zxu{bnP(pImRbBSDf4j9aDI@QRM+YwP&TP(yhWJ$ozthV96!IQbuh)q#=WnFtQYa{B z;~Dd==QuXr?2!6GL-~fA$E701%97V1U(rMnx|4MJM3Cj)K*S&gEdovZ{NN)QeNtgH@KSOw#X^$Et{F0R3nIjlVP{!*94q zoWC|Mz7vJk<--pz(@r-&ENts7ElcUBqa4>Ws8fu>|!vRz!r!{e9}| z-lN67>8aC}Z^T|uh;AW!daHD9G*@S_^s|(wA`|P&oL#h9i^;R~3zarW4NbUFF$p~| z+=Cs?Z$=TF6q6D5VfTk9Up+lF_Dpe-)j12{ID4YPTjQTQoGv#C2G(-q9l3wXiNy-O^6+2amJ+_g^ye@JdX!2xp~v1PBTZ>$4<5 z#&X*WpFGpqUw5l2P|O=Y70wXf;n5|(of{-2UzW_}qqF$^UZp6Ivty&NF!EUf{=;1R zbZ*v$Ig*4>M-B}v5!luDt)F?37d2(@IfH`}fL2E9m>^(c(`CbfC3$KRXyI5!QMmwT zsE*~@2J}l^ZoM<$uM&$BzWvObA8SI9^7Le6^|hBuohKcoD?%}q7mQ3rpN@u4bb7Go z#w?kcSWA!IBvObCsO87NrC+qlrgwWR^Sw|{3m*8|KA1;X%ljhZ!5*&8W{1(^EA;x3 zm^tSIrhmikbMd#zR+-D3>}j7V-_UTFn6y;3taHv}b9@!mz}RO#S{}~1*(OMZAxt+V z6bQ_U?#+l>DWPtvGm+bz%YuHKt%~@uM%(};4xHYXwOx(^x`}N=OClVLoXNw<>d1R2 z8lqPF*DdL7cQ#dTvMGD=YEmA#guaa^dFGV2QBA+HN+axo(u>z16DyOb8F$Bx85($W zYFRkF`3>U75I9S%bjQVD_pbOhhswt>*_!7&mYi_NurpXe`O4W&0${Y1Wb39oigv&j zpg?oO3p|!lpS#DvUk4Jyy9qH;D}Y+Z4e1&Xx%S%DKWs}h3V<!y(8JT8_&+)duK! zMJtl;r?I3~@T4#3JqDQ@0SDJb`ZHq8t@3+$zboJzJEv#h?TT%%#A4+K#S90^GZlze zjNuNzzato=A`~4V^8+GDOU!1YD^Hay`qtVk$sk22ri>V`&kZi1cPDsvAMkMh909xH zK(c?7{AEC7SUs4~rL%=BIjVHI1c&IFgKXn6oNjTQW*)CuzZ0Oj-R7Is@JTBw$aW>q z`kTiKLxL=bU8J-6dH3I9kW}<+wBB7v=_h*y>Kjx$)j#&wJ0OyZI`=Qopb1z}EA#w8 zbu2Mu|9;Odcs~Mt|4uORBktPsF6=O&Zpka%)E?K}J|~Z~ZiM1*w6-#SCSTwbfaJKx%=>T@g_PVb@gd%)(2>~QiVqO+7f1pWhH>TQOyL1{{-R3U127t8?WMeYw{Di(p1?k zvwQMdf=S3DD!A2^dmo)IHhE}0_Yf`V?b8yk08PGS(uLs*!lcaRpF;;QA| zaLemWz)K~IOLNhEXXq}0qrYfbr~5U4F9Vqy8+$3a^Q$N^NT#;UFsc4BoYM$ma$`oh zToa9$v>2%#LISacgUux~4%L+^`L2GAeG9j~Pu*)SiGH;{U2(Q{+>hMzfQYjq%?W915%H zs_uSB1}Fj~Zdeb-DL)=CPRrCx$W?-hWAGM;X9-P&2#?c)!SOT5+!UOdrw6;n>qnS{ zybk7B+P(LCqWaF_SB?tqT3KH_qI)-Q_PCE^1kd#~258Dm7QbacWc1i?Fqwda0J$0U zmz-Lmd)w#}!O!IJ!W~j2Ii`+GZ{LUP_wy4M56ry05Ug&DZ*UdP*lzyzC$A0SDKGUq zgat|L=rhwc67#r)@US=E{eAm1Br$jE6o2<3|FoGPy5s^cPkjL*}01_>nJ z(+T}+k;9+sp&Xt){m^TA@NBSs6iP+u5+|{KlQIVKYJu<9EELzQ_G2FR3}<&*2#NIbn^7*g z_K#OwGhio`$TisT6DN#mn9;gtS~Itix}i-^OSCcd03anRzwdv;Z#lcfi97Y0UC z;zPnM>O3+YwSU0|e#|6FaH5IA5|^~E25N||TiNVxhR*f}dO~x|9?C-3z2>Nzufh9Y zLBLhsy;Y~28M}4ce%jm*a{SZP<~cr@H*x10N;6VYxG(^|DQ*SiZez5{R?SQE3v=U z%qXHreM|>xO{52+q1%phb&xGpo3N+F+O~@>3im4z95mhx%FkK_R`}v$_2z1x5&&gJ>vC}V zp`JLeJ`o463FV)p&2VGWyW5QO-MM|p|!Z6H%j>~+6-Rv z9_x(DP2XbCE|V)i;_51gvY_4m6StxSv)dDsi5j)U8sjZQnknROUEpe>@@*%M08(5Kua)eCmG2P!HV%t6n_44@LcI^zaZ9@HhiFIGA4| zUee(da`ROL$z`E3LXHpd#ybG8>4yxJG_6Y+@{!&F3C7yr1I4uyLEa?iTIQ5bN_yig zr>Bd$dvGi#$+YD7WX39p_oUJFU#pg#1cn ztB$KESdxDlqsDu8%WE*O=_nv&=6=&%;Lf@wpaa*A@uGR^VyHsC!9A1;we!7|BBa-S zYqmC-FR?V?k?(}enbI?*kkoVAEjP~X^Zr=Q#0k4>g?*%q$&5LieVqhroq4%Iqy3=Q z*96!`h~e=QW}zGp(MMOmtM1$%RfjXx6eng zL}Sgba^-`iI zku9|y+4nx4;Cn3Pnh0E)^UuM^C)JB`<~JMF?pI zA!h41dHj3L)+}2|ll_6ve2J)lwpWQlf5C8c^=aB`IItRKgz7MAbCOyyqvKm*FS$G} zwt4yRS5}>I*kh&6jW*~^Uf)5Kw}W!1T%hA>Uw><+ZAe3GEOWpn3wkvZrp7=aM7@Oq zdi`hc%K}<|!d1r>qmY8h%ej~XiC#zYmB0=ftANAKl^qpX<;}*C6xs=XOI;IU`+Tu? zF{A{e~yf%-k*@B|X3aYd*z9MDqnf=ztCky!`KW z3-r_8ES^8~2?|lft!ypC&xh%=^=OMA{IdQ>=WPX@=zuB6QTrlVm^(Wx;n(Pi7c@Ep z<`Wd>q2Q|91gYlKUkb8G_sOFTJMn~{vb6`mdf_3`$S3ZuoPPFr+zJ^5JXD9CKnAI` z1GUv$z4Sz#LN5T8tu18XN|!T-m<`pw6SOnOv7BHD-&FDq_TXWo)b?&z9)dCid%k7F zd%C0dd7%DPd<_g4t=GcPy*&qO(Tzf$#!*9l+p~nZbdDnn)hsA=ArB~dsB=R6EHqp~ zORv;opqSkRzG}EtrVdF!7_tg049E6I{dJtBygvc1$qucwZ!cO zmm2>)BZj6MkUzr@55!yhg;vHK1Q;VQQ?UczGQ)r=@;}e+o2Nq6jFRY8g>9++y;HF6 z4OrLoF9=~@D)9vlJqhif^vCi^svdPSt zloQ)IReZe-yHSSnVvc^1xD)F82I%kj^_{MF^zQHQADBm%04gN1`KzsF85LjOsk1p? z&cSmIjJNt11PL{!9U`?~N9l*@HBov+Cwft3tdB(y^e)BSc0-TlDlexu?x@V#N2HM- z4fX@E&b3w%gsaGbrv&)H%rfM8@l^0cSe277(;^=EbHd0-oJE={1cz!`Z$7-UPf?t@If? z1%jHkN8A0Kz}W$EL27lrgZIBg3p1)eC2<_-+lBI3FCYdF(^etMZZosPbb!|bAN4Xr zB8{!neXP!*K8}bTr2$C?V;OU7yh+U~g)|o*WAv@C?3U`zWR8oLnHaDUC;&z zEF=3p;ud9FXzfQk*9aX*57zZOZXkppd2?t#pIYhgYuXsPk7a&F=Wzm0<~slY%LVuX zNE*m0cJ~9|nh~e#VB#@gfI zo~M|R1mGK~FqK9YV`m33Ko6lEezcVnpQ1hkOSP)Ogl7Nkpm%D)B*ei zdZP{{l`2^7{nPg$Ch1PCLQ*vVwJQQAzL@9b7oMx4cozk(NT3zuRD9MfX~Z3ir}ic^ z0Ya|20N#j67*Og!^ni;vBu28i)VzCk~D% zZWU5t4O@e&C9`=Xee{Nn{+J_d`V#?0EIHRBIX{rJdbX0EV1+$6|MC@mi;f{tzNh2` zI@S0_X!MiE+?3SIQE{M63{B!vW3soaR;Kenj5EP@|3Obc?#P-OD69rmZ#6jhALkzk z6v5`Cb^;Ca!duupVGSp!fh1(xrkhMf!RFj_*CKPdWBZ^{VIUmDHJVHvT08Y^!Kv!2FJiI+8gSmguj4YO7d07?%AkQ zI5@0ALQ)E`Ee_@q!gv1?sM}vJUR=oh@S>5mH_0}c9TXX z)J@JG;=xkrJ=)I$#0seUqi$Nms}WXcPIVhmM2@niuNg`}mFu$*v(Uun@EG~K1N~2( z532aThIJOnvCY?h&)oaJhl{IA+4KCTy5))EhU} zt<-U`N`m=&T*j^QgGIsMr-Ty^Ei|`ZD;hZsb({VXNRbFfR|q`~HRJmp%0-fhlw#jT ztzxWDexcQ95n!J-|iXGX10r`etQEP z=-spHSv9=l_Qq_xx(9 z6v}b-fm*z}FCw~EK4ub{&gRFVEmRhXcp4g@Y-Lr|xSxaIa#XkfK4_kMr5jJx;*h95 zP}znTxf2i?9Z7ZpJu{u`Xe!0XRM1SW_%=GCtRAbZlB7IoaQ(4q-&EHntJhVoc1ou= zXBb^AQXc?rYP#Qx^$E^5T4O=}lU*h5OU`kh`15gvWcH5#_sX$pgl%yR@weRH*wl2U z(B4YkeG7Jac(IABm|+y~T&WPHRo#k!(pvxi%i;j{bB`-@AN=K{;0*t-xDakB6SdmA znGs{bG_Njx{5X{eu+z?Bv!~{+9ODju2xfs$K{@R3ufAqv%5Cll8Nc39ATj7&?Txcav1z)lF=G_?crO$<=p_y}GupL*E5bS1@PXfvZRL?SMs7JMP5jM22dMnW0gXQ|76^vE42&OI|j@mCpfJ zm1NZv3tcZM|wwv&W{^+X=2TqoSeMBIkaNlYWm8>~ij&xXH} zRz@(A-iyM!bjQK4*RES!d5aFh5$@Ke@uQg}Z;&02)6-ImWHR4YSe#_x#n~6d`ca|}0;4ly1Ycyb0|u-D zi^SCIq1AI7okVbq9xLcicyQ^=fuNb9f#|b`rNCeYyx-P-YMP~Bxs%YBw~`tP%)zby zo8wv}C(~vWLRb|G23QCLMbQxQ%#>|-%247w015x6ln&VNKe=MnKiTtdElwmRtyz4Q zJZQ9;>G8IGucOK4PsRQYlNw#vMhYw6aBpDs=dAEq4J-@)l(=wmpA5hAPm8+!dJOYL ztbb)+>93NiO+gNjw%1m;+#oR^OzW6wl z*pg8mdbx(FL7Q598&+NZIm=Y?6SwC-XEpA#r2FnCYP{n5%1Qbv9g;>^8k7xo9%C zpH;Y+B1^d-%EZ#7&HSO5qluw;-7?nX{=UmBOL?MZ3r0NcFi1?1|A~c{RECSsX3x@} z7Mpx=o)AMDqx$<=dZi#~geNr5uAbV$fBOnH2~860s@scBQcn#BtJl>mbdhZ}#N%Wo|O*Wp6B(b>X$3X})^4mQ!0T z4o@XzNxoh*+!1Em6qZX(7S%xz)1^;3aIy4rUp7t;Va<@JBEIPqA^ehdjo>8aYpN^U z7&=hHQ7W$E1}>beV<$%v0|;2n)|7w6M>8~LpF&H^@6umf~7>)CoIv7}7)3z{0Tb(K4WbL~;r7TRhv7Xz<(QlOSxG9bHRa#p> ziGeRn2WLs*kxh;g+*9MvU5>>hN%_`>SI>r8Qn7|Xt_0Ge{1)!czjA`YjW{Z6B|?nO z#LSgHD$iidmcO+pHsAzS$KCHZnv86{weRF#8A#;g&gz{g*WjU*kWV}aPg%vOY$4A2G_72!L*ltyTx6Yy)){`LOwY1zOzO#x>RW;f z4GkclC%Yr=Pc1rTyw4 z+xSbz?3X?~dRcM6buaVXv*6kjd4z+@{aY==v?RnK1E16iIZoKrcyp~fInH=Lt z*q&r#s@ttDZej+?CpM19Tyo!qk~u)81Ws)OeiMJ<#A>IK(D%ji4~4uY%dqI^h%sM} z0H$7N{fWM?7ja|IU`w2JwaFq_QIxKwQpa?3H1U!RW*J^qvP!x4_`miSF2#Wi~$bxpeDTNn;2 zWu)%w-+z#^R9shl)-~mLRh@+4|1!T^p@(v{(JI=Hn!^0gpS_ChdZA%f z8 Date: Mon, 12 Feb 2024 22:50:10 +0330 Subject: [PATCH 49/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d035df7..e9f20889 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
-

+

From 8c2d49751f50cbd2d2b92c5e18ee5fdced8f99d7 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:51:29 +0330 Subject: [PATCH 50/83] Update README_fa.md --- README_fa.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_fa.md b/README_fa.md index 2d752ee5..50ce55d9 100644 --- a/README_fa.md +++ b/README_fa.md @@ -1,10 +1,10 @@
-[**🇺🇸 English**](README.md)          [**🇨🇳 简体中文**](README_cn.md)          [**🇷🇺 Русский**](README_ru.md)          [**日本語 🇯🇵**](README_ja.md) +[**🇺🇸 English**](README.md)          [**🇨🇳 简体中文**](README_cn.md)          [**🇷🇺 Русский**](README_ru.md)          [**🇯🇵 日本語**](README_ja.md)
-

+

From 482147d6baf7efef7d94e4d3f73d4a9f80df02e2 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:52:46 +0330 Subject: [PATCH 51/83] Update README_ja.md --- README_ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_ja.md b/README_ja.md index dc0e2f88..0664847c 100644 --- a/README_ja.md +++ b/README_ja.md @@ -4,7 +4,7 @@
-

+

From db85d0dd774ab01695c7f890af9006dc15b6cc53 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:53:33 +0330 Subject: [PATCH 52/83] Update README_cn.md --- README_cn.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_cn.md b/README_cn.md index 3c6459ef..c1c12daf 100644 --- a/README_cn.md +++ b/README_cn.md @@ -1,10 +1,10 @@
-[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**English 🇺🇸**](README.md)          [**日本語 🇯🇵**](README_ja.md) +[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**English 🇺🇸**](README.md)          [**🇯🇵 日本語**](README_ja.md)
-

+

From 3d28d7e09ac155768da2d59836449314c1091166 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:54:17 +0330 Subject: [PATCH 53/83] Update README_cn.md --- README_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_cn.md b/README_cn.md index c1c12daf..3f669304 100644 --- a/README_cn.md +++ b/README_cn.md @@ -1,6 +1,6 @@
-[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**English 🇺🇸**](README.md)          [**🇯🇵 日本語**](README_ja.md) +[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**English 🇺🇸**](README.md)          [**日本語 🇯🇵**](README_ja.md)
From b818479d383e9a4650aa3c3bfd973afae61e3965 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:55:00 +0330 Subject: [PATCH 54/83] Update README_ru.md --- README_ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_ru.md b/README_ru.md index 83ae0079..0c3a6a4d 100644 --- a/README_ru.md +++ b/README_ru.md @@ -6,7 +6,7 @@
-

+

From 08e372f6195a03d1a150641781b6e5c0b889dace Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:57:24 +0330 Subject: [PATCH 55/83] Update README_ru.md --- README_ru.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README_ru.md b/README_ru.md index 0c3a6a4d..a7d4a870 100644 --- a/README_ru.md +++ b/README_ru.md @@ -5,8 +5,10 @@ [**日本語 🇯🇵**](README_ja.md)          
+

+
From d4a29aa405a1dc578914d448d46409abffaa8e10 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:57:55 +0330 Subject: [PATCH 56/83] Update README_fa.md --- README_fa.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README_fa.md b/README_fa.md index 50ce55d9..f0634ee2 100644 --- a/README_fa.md +++ b/README_fa.md @@ -3,8 +3,10 @@ [**🇺🇸 English**](README.md)          [**🇨🇳 简体中文**](README_cn.md)          [**🇷🇺 Русский**](README_ru.md)          [**🇯🇵 日本語**](README_ja.md)
+

+
From 6537c8cb19b03d10f03d4e1709065e98c3a0d6c2 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:58:14 +0330 Subject: [PATCH 57/83] Update README_ja.md --- README_ja.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README_ja.md b/README_ja.md index 0664847c..23bb4fc4 100644 --- a/README_ja.md +++ b/README_ja.md @@ -3,9 +3,10 @@ [**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**简体中文 🇨🇳**](README_cn.md)          [**English 🇺🇸**](README.md)
+

- +
From 8a4a7ed4cb5d70b64a303dc6156240bbbfb8cfc8 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:58:45 +0330 Subject: [PATCH 58/83] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e9f20889..1c505dcc 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,10 @@ [**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**简体中文 🇨🇳**](README_cn.md)          [**日本語 🇯🇵**](README_ja.md)
+

- +
From 7f47e670dcfbff54c52470881241a1acfdc82528 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:59:07 +0330 Subject: [PATCH 59/83] Update README.md From 467a757de250da25ba182d80384a11d2795d8de7 Mon Sep 17 00:00:00 2001 From: lymanjre <125398461+lymanjre@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:59:23 +0330 Subject: [PATCH 60/83] Update README_cn.md --- README_cn.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README_cn.md b/README_cn.md index 3f669304..d238df87 100644 --- a/README_cn.md +++ b/README_cn.md @@ -3,8 +3,10 @@ [**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)          [**Русский 🇷🇺**](README_ru.md)          [**English 🇺🇸**](README.md)          [**日本語 🇯🇵**](README_ja.md)
+

+
From 07e345c7d20d59ba25857f6047d5167dcfbc666a Mon Sep 17 00:00:00 2001 From: Hiddify Date: Tue, 13 Feb 2024 03:55:28 +0100 Subject: [PATCH 61/83] new: update active profile and its ping, --- assets/translations/strings_fa.i18n.json | 4 ++-- .../active/active_proxy_delay_indicator.dart | 5 +++-- .../proxy/active/active_proxy_notifier.dart | 20 ++++++++++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index 514c1a5a..1b6876ce 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -13,8 +13,8 @@ "sortBy": "مرتب‌سازی براساس", "addToClipboard": "به کلیپ بورد اضافه کنید", "notSet": "تنظیم نشده", - "agree": "موافق", - "decline": "کاهش می یابد", + "agree": "موافقم", + "decline": "رد", "unknown": "ناشناخته" }, "intro": { diff --git a/lib/features/proxy/active/active_proxy_delay_indicator.dart b/lib/features/proxy/active/active_proxy_delay_indicator.dart index 66d4ec9d..e1cd3f2b 100644 --- a/lib/features/proxy/active/active_proxy_delay_indicator.dart +++ b/lib/features/proxy/active/active_proxy_delay_indicator.dart @@ -26,7 +26,8 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { onTap: () async { await ref .read(activeProxyNotifierProvider.notifier) - .urlTest(value.proxy.tag); + // .urlTest(value.proxy.tag); + .urlTest("auto"); }, borderRadius: BorderRadius.circular(24), child: Padding( @@ -42,7 +43,7 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { TextSpan( children: [ TextSpan( - text: delay.toString(), + text: delay > 65000 ? "×" : delay.toString(), style: theme.textTheme.titleMedium ?.copyWith(fontWeight: FontWeight.bold), ), diff --git a/lib/features/proxy/active/active_proxy_notifier.dart b/lib/features/proxy/active/active_proxy_notifier.dart index 4dd32eee..6cd06a97 100644 --- a/lib/features/proxy/active/active_proxy_notifier.dart +++ b/lib/features/proxy/active/active_proxy_notifier.dart @@ -26,7 +26,25 @@ Stream activeProxyGroup(ActiveProxyGroupRef ref) async* { .watch(proxyRepositoryProvider) .watchActiveProxies() .map((event) => event.getOrElse((l) => throw l)) - .map((event) => event.firstOrNull?.items.firstOrNull); + .map((event) { + final Map itemMap = + event.fold({}, (Map map, item) { + map[item.tag] = item; + return map; + }); + + // Start from the item with the tag "Select" + var current = itemMap["select"]; + ProxyItemEntity? selected; + + // Traverse through the map based on the selected tag until reaching the end + while (current != null) { + selected = current.items.firstOrNull; + current = itemMap[selected?.tag]; + } + + return selected; + }); } @riverpod From a771acbec669c477010d0fdfcb90f73a80170691 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Tue, 13 Feb 2024 03:56:26 +0100 Subject: [PATCH 62/83] revert build image for appimage to 22.04 --- .github/workflows/build.yml | 2 +- libcore | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a7a31f1f..2034f049 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,7 +48,7 @@ jobs: targets: exe - platform: linux - os: ubuntu-20.04 + os: ubuntu-22.04 aarch: amd64 targets: AppImage,deb,rpm diff --git a/libcore b/libcore index 790fd73d..a1314d84 160000 --- a/libcore +++ b/libcore @@ -1 +1 @@ -Subproject commit 790fd73d5378f9a110ff272445685de495065a91 +Subproject commit a1314d84a9f3ded7ee4ad7afc0e771574c8ce352 From eee31da912c6000d5da27e0c4739d5608eb02cb3 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Mon, 12 Feb 2024 18:39:51 +0330 Subject: [PATCH 63/83] Fix widget build conflict --- .../proxy/active/active_proxy_footer.dart | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index cdcf407e..eb896337 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -18,7 +18,6 @@ class ActiveProxyFooter extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final t = ref.watch(translationsProvider); final asyncState = ref.watch(activeProxyNotifierProvider); - final stats = ref.watch(statsNotifierProvider).value; return AnimatedVisibility( axis: Axis.vertical, @@ -77,27 +76,7 @@ class ActiveProxyFooter extends HookConsumerWidget { ], ), ), - Directionality( - textDirection: TextDirection.values[ - (Directionality.of(context).index + 1) % - TextDirection.values.length], - child: Flexible( - child: Column( - children: [ - _InfoProp( - icon: FluentIcons - .arrow_bidirectional_up_down_20_regular, - text: (stats?.downlinkTotal ?? 0).size(), - ), - const Gap(8), - _InfoProp( - icon: FluentIcons.arrow_download_20_regular, - text: (stats?.downlink ?? 0).speed(), - ), - ], - ), - ), - ), + const _StatsColumn(), ], ), ), @@ -107,6 +86,35 @@ class ActiveProxyFooter extends HookConsumerWidget { } } +class _StatsColumn extends HookConsumerWidget { + const _StatsColumn(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final stats = ref.watch(statsNotifierProvider).value; + + return Directionality( + textDirection: TextDirection.values[ + (Directionality.of(context).index + 1) % TextDirection.values.length], + child: Flexible( + child: Column( + children: [ + _InfoProp( + icon: FluentIcons.arrow_bidirectional_up_down_20_regular, + text: (stats?.downlinkTotal ?? 0).size(), + ), + const Gap(8), + _InfoProp( + icon: FluentIcons.arrow_download_20_regular, + text: (stats?.downlink ?? 0).speed(), + ), + ], + ), + ), + ); + } +} + class _InfoProp extends StatelessWidget { const _InfoProp({ required this.icon, From 28ece8fb2e4e80a644aceab0629bcfe44b8c91e7 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Tue, 13 Feb 2024 16:59:35 +0330 Subject: [PATCH 64/83] Fix connection info --- lib/core/utils/throttler.dart | 16 +++ .../active/active_proxy_delay_indicator.dart | 13 +-- .../proxy/active/active_proxy_footer.dart | 29 +++-- .../proxy/active/active_proxy_notifier.dart | 110 +++++++----------- .../active/active_proxy_sidebar_card.dart | 73 +++++------- 5 files changed, 105 insertions(+), 136 deletions(-) create mode 100644 lib/core/utils/throttler.dart diff --git a/lib/core/utils/throttler.dart b/lib/core/utils/throttler.dart new file mode 100644 index 00000000..d85d31c0 --- /dev/null +++ b/lib/core/utils/throttler.dart @@ -0,0 +1,16 @@ +import 'package:flutter/foundation.dart'; + +class Throttler { + Throttler(this.throttleFor); + + final Duration throttleFor; + DateTime? _lastCall; + + void call(VoidCallback callback) { + if (_lastCall == null || + DateTime.now().difference(_lastCall!) > throttleFor) { + callback(); + _lastCall = DateTime.now(); + } + } +} diff --git a/lib/features/proxy/active/active_proxy_delay_indicator.dart b/lib/features/proxy/active/active_proxy_delay_indicator.dart index e1cd3f2b..b89bca9a 100644 --- a/lib/features/proxy/active/active_proxy_delay_indicator.dart +++ b/lib/features/proxy/active/active_proxy_delay_indicator.dart @@ -12,22 +12,21 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - final asyncState = ref.watch(activeProxyNotifierProvider); + final activeProxy = ref.watch(activeProxyNotifierProvider); return AnimatedVisibility( axis: Axis.vertical, - visible: asyncState is AsyncData, + visible: activeProxy is AsyncData, child: () { - switch (asyncState) { - case AsyncData(:final value): - final delay = value.proxy.urlTestDelay; + switch (activeProxy) { + case AsyncData(value: final proxy): + final delay = proxy.urlTestDelay; return Center( child: InkWell( onTap: () async { await ref .read(activeProxyNotifierProvider.notifier) - // .urlTest(value.proxy.tag); - .urlTest("auto"); + .urlTest(proxy.tag); }, borderRadius: BorderRadius.circular(24), child: Padding( diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index eb896337..241302fe 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -17,13 +17,14 @@ class ActiveProxyFooter extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final t = ref.watch(translationsProvider); - final asyncState = ref.watch(activeProxyNotifierProvider); + final activeProxy = ref.watch(activeProxyNotifierProvider); + final ipInfo = ref.watch(ipInfoNotifierProvider); return AnimatedVisibility( axis: Axis.vertical, - visible: asyncState is AsyncData, - child: switch (asyncState) { - AsyncData(value: final info) => Padding( + visible: activeProxy is AsyncData, + child: switch (activeProxy) { + AsyncData(value: final proxy) => Padding( padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -34,24 +35,22 @@ class ActiveProxyFooter extends HookConsumerWidget { children: [ _InfoProp( icon: FluentIcons.arrow_routing_20_regular, - text: info.proxy.selectedName.isNotNullOrBlank - ? info.proxy.selectedName! - : info.proxy.name, + text: proxy.selectedName.isNotNullOrBlank + ? proxy.selectedName! + : proxy.name, ), const Gap(8), - switch (info.ipInfo) { - AsyncData(value: final ipInfo?) => Row( + switch (ipInfo) { + AsyncData(value: final info) => Row( children: [ - IPCountryFlag(countryCode: ipInfo.countryCode), + IPCountryFlag(countryCode: info.countryCode), const Gap(8), IPText( - ip: ipInfo.ip, + ip: info.ip, onLongPress: () async { ref - .read( - activeProxyNotifierProvider.notifier, - ) - .refreshIpInfo(); + .read(ipInfoNotifierProvider.notifier) + .refresh(); }, ), ], diff --git a/lib/features/proxy/active/active_proxy_notifier.dart b/lib/features/proxy/active/active_proxy_notifier.dart index 6cd06a97..5d5351eb 100644 --- a/lib/features/proxy/active/active_proxy_notifier.dart +++ b/lib/features/proxy/active/active_proxy_notifier.dart @@ -1,4 +1,5 @@ import 'package:dio/dio.dart'; +import 'package:hiddify/core/utils/throttler.dart'; import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; import 'package:hiddify/features/proxy/data/proxy_data_providers.dart'; import 'package:hiddify/features/proxy/model/ip_info_entity.dart'; @@ -6,98 +7,65 @@ import 'package:hiddify/features/proxy/model/proxy_entity.dart'; import 'package:hiddify/features/proxy/model/proxy_failure.dart'; import 'package:hiddify/utils/riverpod_utils.dart'; import 'package:hiddify/utils/utils.dart'; -import 'package:loggy/loggy.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'active_proxy_notifier.g.dart'; -typedef ActiveProxyInfo = ({ - ProxyItemEntity proxy, - AsyncValue ipInfo, -}); - @riverpod -Stream activeProxyGroup(ActiveProxyGroupRef ref) async* { - final serviceRunning = await ref.watch(serviceRunningProvider.future); - if (!serviceRunning) { - throw const ServiceNotRunning(); - } - yield* ref - .watch(proxyRepositoryProvider) - .watchActiveProxies() - .map((event) => event.getOrElse((l) => throw l)) - .map((event) { - final Map itemMap = - event.fold({}, (Map map, item) { - map[item.tag] = item; - return map; +class IpInfoNotifier extends _$IpInfoNotifier with AppLogger { + @override + Future build() async { + ref.disposeDelay(const Duration(seconds: 20)); + final cancelToken = CancelToken(); + ref.onDispose(() { + loggy.debug("disposing"); + cancelToken.cancel(); }); - // Start from the item with the tag "Select" - var current = itemMap["select"]; - ProxyItemEntity? selected; - - // Traverse through the map based on the selected tag until reaching the end - while (current != null) { - selected = current.items.firstOrNull; - current = itemMap[selected?.tag]; + final serviceRunning = await ref.watch(serviceRunningProvider.future); + if (!serviceRunning) { + throw const ServiceNotRunning(); } - return selected; - }); -} - -@riverpod -Future proxyIpInfo(ProxyIpInfoRef ref) async { - final serviceRunning = await ref.watch(serviceRunningProvider.future); - if (!serviceRunning) { - return null; + return ref + .watch(proxyRepositoryProvider) + .getCurrentIpInfo(cancelToken) + .getOrElse( + (err) { + loggy.error("error getting proxy ip info", err); + throw err; + }, + ).run(); + } + + Future refresh() async { + loggy.debug("refreshing"); + ref.invalidateSelf(); } - final cancelToken = CancelToken(); - ref.onDispose(() { - Loggy("ProxyIpInfo").debug("canceling"); - cancelToken.cancel(); - }); - return ref - .watch(proxyRepositoryProvider) - .getCurrentIpInfo(cancelToken) - .getOrElse( - (err) { - Loggy("ProxyIpInfo").error("error getting proxy ip info", err); - throw err; - }, - ).run(); } @riverpod class ActiveProxyNotifier extends _$ActiveProxyNotifier with AppLogger { @override - AsyncValue build() { + Stream build() async* { ref.disposeDelay(const Duration(seconds: 20)); - ref.onDispose(() { - _urlTestDebouncer.dispose(); - }); - final ipInfo = ref.watch(proxyIpInfoProvider); - final activeProxies = ref.watch(activeProxyGroupProvider); - return switch (activeProxies) { - AsyncData(value: final activeGroup?) => - AsyncData((proxy: activeGroup, ipInfo: ipInfo)), - AsyncError(:final error, :final stackTrace) => - AsyncError(error, stackTrace), - _ => const AsyncLoading(), - }; - } - final _urlTestDebouncer = CallbackDebouncer(const Duration(seconds: 1)); - - Future refreshIpInfo() async { - if (state case AsyncData(:final value) when !value.ipInfo.isLoading) { - ref.invalidate(proxyIpInfoProvider); + final serviceRunning = await ref.watch(serviceRunningProvider.future); + if (!serviceRunning) { + throw const ServiceNotRunning(); } + + yield* ref + .watch(proxyRepositoryProvider) + .watchActiveProxies() + .map((event) => event.getOrElse((l) => throw l)) + .map((event) => event.firstOrNull!.items.first); } + final _urlTestThrottler = Throttler(const Duration(seconds: 2)); + Future urlTest(String groupTag) async { - _urlTestDebouncer( + _urlTestThrottler( () async { loggy.debug("testing group: [$groupTag]"); if (state case AsyncData()) { diff --git a/lib/features/proxy/active/active_proxy_sidebar_card.dart b/lib/features/proxy/active/active_proxy_sidebar_card.dart index d1082aba..f0dc6bd3 100644 --- a/lib/features/proxy/active/active_proxy_sidebar_card.dart +++ b/lib/features/proxy/active/active_proxy_sidebar_card.dart @@ -26,7 +26,8 @@ class ActiveProxySideBarCard extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); final t = ref.watch(translationsProvider); - final asyncState = ref.watch(activeProxyNotifierProvider); + final activeProxy = ref.watch(activeProxyNotifierProvider); + final ipInfo = ref.watch(ipInfoNotifierProvider); Widget propText(String txt) { return Text( @@ -50,13 +51,13 @@ class ActiveProxySideBarCard extends HookConsumerWidget { children: [ Text(t.home.stats.connection), const Gap(4), - switch (asyncState) { - AsyncData(:final value) => buildProp( + switch (activeProxy) { + AsyncData(value: final proxy) => buildProp( const Icon(FluentIcons.arrow_routing_20_regular), propText( - value.proxy.selectedName.isNotNullOrBlank - ? value.proxy.selectedName! - : value.proxy.name, + proxy.selectedName.isNotNullOrBlank + ? proxy.selectedName! + : proxy.name, ), ), _ => buildProp( @@ -65,43 +66,29 @@ class ActiveProxySideBarCard extends HookConsumerWidget { ), }, const Gap(4), - () { - if (asyncState case AsyncData(:final value)) { - switch (value.ipInfo) { - case AsyncData(value: final ipInfo?): - return buildProp( - IPCountryFlag( - countryCode: ipInfo.countryCode, size: 16), - IPText( - ip: ipInfo.ip, - onLongPress: () async { - ref - .read( - activeProxyNotifierProvider.notifier, - ) - .refreshIpInfo(); - }, - constrained: true, - ), - ); - case AsyncError(): - return buildProp( - const Icon(FluentIcons.error_circle_20_regular), - propText(t.general.unknown), - ); - case AsyncLoading(): - return buildProp( - const Icon(FluentIcons.question_circle_20_regular), - const ShimmerSkeleton(widthFactor: .85, height: 14), - ); - } - } - - return buildProp( - const Icon(FluentIcons.question_circle_20_regular), - propText(t.general.unknown), - ); - }(), + switch (ipInfo) { + AsyncData(value: final info) => buildProp( + IPCountryFlag( + countryCode: info.countryCode, + size: 16, + ), + IPText( + ip: info.ip, + onLongPress: () async { + ref.read(ipInfoNotifierProvider.notifier).refresh(); + }, + constrained: true, + ), + ), + AsyncLoading() => buildProp( + const Icon(FluentIcons.question_circle_20_regular), + const ShimmerSkeleton(widthFactor: .85, height: 14), + ), + _ => buildProp( + const Icon(FluentIcons.error_circle_20_regular), + propText(t.general.unknown), + ), + }, ], ), ), From 2293a390e57806ac80c24290a21ab9b317965eeb Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Tue, 13 Feb 2024 17:02:10 +0330 Subject: [PATCH 65/83] Change service error handling --- lib/features/proxy/data/proxy_repository.dart | 4 +- lib/singbox/service/ffi_singbox_service.dart | 122 ++++++++++-------- .../service/platform_singbox_service.dart | 75 +++++------ lib/singbox/service/singbox_service.dart | 26 +++- 4 files changed, 129 insertions(+), 98 deletions(-) diff --git a/lib/features/proxy/data/proxy_repository.dart b/lib/features/proxy/data/proxy_repository.dart index 640558f4..8d931d50 100644 --- a/lib/features/proxy/data/proxy_repository.dart +++ b/lib/features/proxy/data/proxy_repository.dart @@ -32,7 +32,7 @@ class ProxyRepositoryImpl @override Stream>> watchProxies() { - return singbox.watchOutbounds().map((event) { + return singbox.watchGroups().map((event) { final groupWithSelected = { for (final group in event) group.tag: group.selected, }; @@ -66,7 +66,7 @@ class ProxyRepositoryImpl @override Stream>> watchActiveProxies() { - return singbox.watchActiveOutbounds().map((event) { + return singbox.watchActiveGroups().map((event) { final groupWithSelected = { for (final group in event) group.tag: group.selected, }; diff --git a/lib/singbox/service/ffi_singbox_service.dart b/lib/singbox/service/ffi_singbox_service.dart index b07a575c..3626c5b9 100644 --- a/lib/singbox/service/ffi_singbox_service.dart +++ b/lib/singbox/service/ffi_singbox_service.dart @@ -237,7 +237,7 @@ class FFISingboxService with InfraLogger implements SingboxService { @override Stream watchStats() { if (_serviceStatsStream != null) return _serviceStatsStream!; - final receiver = ReceivePort('service stats receiver'); + final receiver = ReceivePort('stats'); final statusStream = receiver.asBroadcastStream( onCancel: (_) { _logger.debug("stopping stats command client"); @@ -277,67 +277,28 @@ class FFISingboxService with InfraLogger implements SingboxService { } @override - Stream> watchOutbounds() { + Stream> watchGroups() { + final logger = newLoggy("watchGroups"); if (_outboundsStream != null) return _outboundsStream!; - final receiver = ReceivePort('outbounds receiver'); + final receiver = ReceivePort('groups'); final outboundsStream = receiver.asBroadcastStream( onCancel: (_) { - _logger.debug("stopping group command client"); + logger.debug("stopping"); + receiver.close(); + _outboundsStream = null; final err = _box.stopCommandClient(4).cast().toDartString(); if (err.isNotEmpty) { _logger.error("error stopping group client"); } - receiver.close(); - _outboundsStream = null; }, ).map( (event) { if (event case String _) { if (event.startsWith('error:')) { - loggy.error("[group client] error received: $event"); + logger.error("error received: $event"); throw event.replaceFirst('error:', ""); } - return (jsonDecode(event) as List).map((e) { - return SingboxOutboundGroup.fromJson(e as Map); - }).toList(); - } - loggy.error("[group client] unexpected type, msg: $event"); - throw "invalid type"; - }, - ); - final err = _box - .startCommandClient(4, receiver.sendPort.nativePort) - .cast() - .toDartString(); - if (err.isNotEmpty) { - loggy.error("error starting group command: $err"); - throw err; - } - - return _outboundsStream = outboundsStream; - } - - @override - Stream> watchActiveOutbounds() { - final logger = newLoggy("[ActiveGroupsClient]"); - final receiver = ReceivePort('active groups receiver'); - final outboundsStream = receiver.asBroadcastStream( - onCancel: (_) { - logger.debug("stopping"); - final err = _box.stopCommandClient(12).cast().toDartString(); - if (err.isNotEmpty) { - logger.error("failed stopping: $err"); - } - receiver.close(); - }, - ).map( - (event) { - if (event case String _) { - if (event.startsWith('error:')) { - logger.error(event); - throw event.replaceFirst('error:', ""); - } return (jsonDecode(event) as List).map((e) { return SingboxOutboundGroup.fromJson(e as Map); }).toList(); @@ -347,14 +308,67 @@ class FFISingboxService with InfraLogger implements SingboxService { }, ); - final err = _box - .startCommandClient(12, receiver.sendPort.nativePort) - .cast() - .toDartString(); - if (err.isNotEmpty) { - logger.error("error starting: $err"); - throw err; + try { + final err = _box + .startCommandClient(4, receiver.sendPort.nativePort) + .cast() + .toDartString(); + if (err.isNotEmpty) { + logger.error("error starting group command: $err"); + throw err; + } + } catch (e) { + receiver.close(); + rethrow; } + + return _outboundsStream = outboundsStream; + } + + @override + Stream> watchActiveGroups() { + final logger = newLoggy("[ActiveGroupsClient]"); + final receiver = ReceivePort('active groups'); + final outboundsStream = receiver.asBroadcastStream( + onCancel: (_) { + logger.debug("stopping"); + receiver.close(); + final err = _box.stopCommandClient(12).cast().toDartString(); + if (err.isNotEmpty) { + logger.error("failed stopping: $err"); + } + }, + ).map( + (event) { + if (event case String _) { + if (event.startsWith('error:')) { + logger.error(event); + throw event.replaceFirst('error:', ""); + } + + return (jsonDecode(event) as List).map((e) { + return SingboxOutboundGroup.fromJson(e as Map); + }).toList(); + } + logger.error("unexpected type, msg: $event"); + throw "invalid type"; + }, + ); + + try { + final err = _box + .startCommandClient(12, receiver.sendPort.nativePort) + .cast() + .toDartString(); + if (err.isNotEmpty) { + logger.error("error starting: $err"); + throw err; + } + } catch (e) { + receiver.close(); + rethrow; + } + return outboundsStream; } diff --git a/lib/singbox/service/platform_singbox_service.dart b/lib/singbox/service/platform_singbox_service.dart index d0a3ad94..2aadacf5 100644 --- a/lib/singbox/service/platform_singbox_service.dart +++ b/lib/singbox/service/platform_singbox_service.dart @@ -13,12 +13,19 @@ import 'package:hiddify/utils/custom_loggers.dart'; import 'package:rxdart/rxdart.dart'; class PlatformSingboxService with InfraLogger implements SingboxService { - late final _methodChannel = const MethodChannel("com.hiddify.app/method"); - late final _statusChannel = - const EventChannel("com.hiddify.app/service.status", JSONMethodCodec()); - late final _alertsChannel = - const EventChannel("com.hiddify.app/service.alerts", JSONMethodCodec()); - late final _logsChannel = const EventChannel("com.hiddify.app/service.logs"); + static const channelPrefix = "com.hiddify.app"; + + static const methodChannel = MethodChannel("$channelPrefix/method"); + static const statusChannel = + EventChannel("$channelPrefix/service.status", JSONMethodCodec()); + static const alertsChannel = + EventChannel("$channelPrefix/service.alerts", JSONMethodCodec()); + static const statsChannel = + EventChannel("$channelPrefix/stats", JSONMethodCodec()); + static const groupsChannel = EventChannel("$channelPrefix/groups"); + static const activeGroupsChannel = + EventChannel("$channelPrefix/active-groups"); + static const logsChannel = EventChannel("$channelPrefix/service.logs"); late final ValueStream _status; @@ -26,26 +33,23 @@ class PlatformSingboxService with InfraLogger implements SingboxService { Future init() async { loggy.debug("initializing"); final status = - _statusChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); + statusChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); final alerts = - _alertsChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); + alertsChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); _status = ValueConnectableStream(Rx.merge([status, alerts])).autoConnect(); await _status.first; } @override - TaskEither setup( - Directories directories, - bool debug, - ) { + TaskEither setup(Directories directories, bool debug) { return TaskEither( () async { if (!Platform.isIOS) { return right(unit); } - await _methodChannel.invokeMethod("setup"); + await methodChannel.invokeMethod("setup"); return right(unit); }, ); @@ -59,7 +63,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { ) { return TaskEither( () async { - final message = await _methodChannel.invokeMethod( + final message = await methodChannel.invokeMethod( "parse_config", {"path": path, "tempPath": tempPath, "debug": debug}, ); @@ -73,7 +77,8 @@ class PlatformSingboxService with InfraLogger implements SingboxService { TaskEither changeOptions(SingboxConfigOption options) { return TaskEither( () async { - await _methodChannel.invokeMethod( + loggy.debug("changing options"); + await methodChannel.invokeMethod( "change_config_options", jsonEncode(options.toJson()), ); @@ -83,12 +88,11 @@ class PlatformSingboxService with InfraLogger implements SingboxService { } @override - TaskEither generateFullConfigByPath( - String path, - ) { + TaskEither generateFullConfigByPath(String path) { return TaskEither( () async { - final configJson = await _methodChannel.invokeMethod( + loggy.debug("generating full config by path"); + final configJson = await methodChannel.invokeMethod( "generate_config", {"path": path}, ); @@ -109,7 +113,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { return TaskEither( () async { loggy.debug("starting"); - await _methodChannel.invokeMethod( + await methodChannel.invokeMethod( "start", {"path": path, "name": name}, ); @@ -123,7 +127,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { return TaskEither( () async { loggy.debug("stopping"); - await _methodChannel.invokeMethod("stop"); + await methodChannel.invokeMethod("stop"); return right(unit); }, ); @@ -138,7 +142,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { return TaskEither( () async { loggy.debug("restarting"); - await _methodChannel.invokeMethod( + await methodChannel.invokeMethod( "restart", {"path": path, "name": name}, ); @@ -159,17 +163,16 @@ class PlatformSingboxService with InfraLogger implements SingboxService { } loggy.debug("resetting tunnel"); - await _methodChannel.invokeMethod("reset"); + await methodChannel.invokeMethod("reset"); return right(unit); }, ); } @override - Stream> watchOutbounds() { - const channel = EventChannel("com.hiddify.app/groups"); - loggy.debug("watching outbounds"); - return channel.receiveBroadcastStream().map( + Stream> watchGroups() { + loggy.debug("watching groups"); + return groupsChannel.receiveBroadcastStream().map( (event) { if (event case String _) { return (jsonDecode(event) as List).map((e) { @@ -183,10 +186,9 @@ class PlatformSingboxService with InfraLogger implements SingboxService { } @override - Stream> watchActiveOutbounds() { - const channel = EventChannel("com.hiddify.app/active-groups"); - loggy.debug("watching active outbounds"); - return channel.receiveBroadcastStream().map( + Stream> watchActiveGroups() { + loggy.debug("watching active groups"); + return activeGroupsChannel.receiveBroadcastStream().map( (event) { if (event case String _) { return (jsonDecode(event) as List).map((e) { @@ -204,9 +206,8 @@ class PlatformSingboxService with InfraLogger implements SingboxService { @override Stream watchStats() { - const channel = EventChannel("com.hiddify.app/stats", JSONMethodCodec()); loggy.debug("watching stats"); - return channel.receiveBroadcastStream().map( + return statsChannel.receiveBroadcastStream().map( (event) { if (event case Map _) { return SingboxStats.fromJson(event); @@ -224,7 +225,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { return TaskEither( () async { loggy.debug("selecting outbound"); - await _methodChannel.invokeMethod( + await methodChannel.invokeMethod( "select_outbound", {"groupTag": groupTag, "outboundTag": outboundTag}, ); @@ -237,7 +238,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { TaskEither urlTest(String groupTag) { return TaskEither( () async { - await _methodChannel.invokeMethod( + await methodChannel.invokeMethod( "url_test", {"groupTag": groupTag}, ); @@ -248,7 +249,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { @override Stream> watchLogs(String path) async* { - yield* _logsChannel + yield* logsChannel .receiveBroadcastStream() .map((event) => (event as List).map((e) => e as String).toList()); } @@ -257,7 +258,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { TaskEither clearLogs() { return TaskEither( () async { - await _methodChannel.invokeMethod("clear_logs"); + await methodChannel.invokeMethod("clear_logs"); return right(unit); }, ); diff --git a/lib/singbox/service/singbox_service.dart b/lib/singbox/service/singbox_service.dart index bf3f7f6c..895b74f7 100644 --- a/lib/singbox/service/singbox_service.dart +++ b/lib/singbox/service/singbox_service.dart @@ -21,11 +21,17 @@ abstract interface class SingboxService { Future init(); + /// setup directories and other initial platform services TaskEither setup( Directories directories, bool debug, ); + /// validates config by path and save it + /// + /// [path] is used to save validated config + /// [tempPath] includes base config, possibly invalid + /// [debug] indicates if debug mode (avoid in prod) TaskEither validateConfigByPath( String path, String tempPath, @@ -34,10 +40,17 @@ abstract interface class SingboxService { TaskEither changeOptions(SingboxConfigOption options); - TaskEither generateFullConfigByPath( - String path, - ); + /// generates full sing-box configuration + /// + /// [path] is the path to the base config file + /// returns full patched json config file as string + TaskEither generateFullConfigByPath(String path); + /// start sing-box service + /// + /// [path] is the path to the base config file (to be patched by previously set [SingboxConfigOption]) + /// [name] is the name of the active profile (not unique, used for presentation in platform specific ui) + /// [disableMemoryLimit] is used to disable service memory limit (mostly used in mobile platforms i.e. iOS) TaskEither start( String path, String name, @@ -46,6 +59,7 @@ abstract interface class SingboxService { TaskEither stop(); + /// similar to [start], but uses platform dependent behavior to restart the service TaskEither restart( String path, String name, @@ -54,16 +68,18 @@ abstract interface class SingboxService { TaskEither resetTunnel(); - Stream> watchOutbounds(); + Stream> watchGroups(); - Stream> watchActiveOutbounds(); + Stream> watchActiveGroups(); TaskEither selectOutbound(String groupTag, String outboundTag); TaskEither urlTest(String groupTag); + /// watch status of sing-box service (started, starting, etc.) Stream watchStatus(); + /// watch stats of sing-box service (uplink, downlink, etc.) Stream watchStats(); Stream> watchLogs(String path); From 437a7ea594d7d9231cfc93d02c0907575fee9584 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Tue, 13 Feb 2024 18:49:58 +0330 Subject: [PATCH 66/83] Improve accessibility --- assets/translations/strings_en.i18n.json | 16 +++- .../home/widget/connection_button.dart | 8 +- .../active/active_proxy_delay_indicator.dart | 9 +- .../proxy/active/active_proxy_footer.dart | 32 ++++--- lib/features/proxy/active/ip_widget.dart | 95 +++++++++++-------- 5 files changed, 103 insertions(+), 57 deletions(-) diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 291896e0..cf340c63 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -15,7 +15,8 @@ "notSet": "Not Set", "agree": "Agree", "decline": "Decline", - "unknown": "Unknown" + "unknown": "Unknown", + "hidden": "Hidden" }, "intro": { "termsAndPolicyCaution(rich)": "by continuing you agree with ${tap(@:about.termsAndConditions)}", @@ -127,6 +128,19 @@ "unsorted": "Default", "name": "Alphabetically", "delay": "By Delay" + }, + "activeProxySemanticLabel": "Active proxy", + "delaySemantics": { + "result": "delay: ${delay}ms", + "testing": "delay: testing..." + }, + "ipInfoSemantics": { + "address": "IP address", + "country": "Country" + }, + "statsSemantics": { + "speed": "Speed", + "totalTransferred": "Total transferred" } }, "logs": { diff --git a/lib/features/home/widget/connection_button.dart b/lib/features/home/widget/connection_button.dart index 485bccae..eb1c3efe 100644 --- a/lib/features/home/widget/connection_button.dart +++ b/lib/features/home/widget/connection_button.dart @@ -149,9 +149,11 @@ class _ConnectionButton extends StatelessWidget { .scaleXY(end: .88, curve: Curves.easeIn), ), const Gap(16), - Text( - label, - style: Theme.of(context).textTheme.titleMedium, + ExcludeSemantics( + child: Text( + label, + style: Theme.of(context).textTheme.titleMedium, + ), ), ], ); diff --git a/lib/features/proxy/active/active_proxy_delay_indicator.dart b/lib/features/proxy/active/active_proxy_delay_indicator.dart index b89bca9a..43828eeb 100644 --- a/lib/features/proxy/active/active_proxy_delay_indicator.dart +++ b/lib/features/proxy/active/active_proxy_delay_indicator.dart @@ -1,6 +1,7 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/widget/animated_visibility.dart'; import 'package:hiddify/core/widget/shimmer_skeleton.dart'; import 'package:hiddify/features/proxy/active/active_proxy_notifier.dart'; @@ -11,6 +12,7 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final t = ref.watch(translationsProvider); final theme = Theme.of(context); final activeProxy = ref.watch(activeProxyNotifierProvider); @@ -39,6 +41,8 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { const Gap(8), if (delay > 0) Text.rich( + semanticsLabel: + t.proxies.delaySemantics.result(delay: delay), TextSpan( children: [ TextSpan( @@ -51,7 +55,10 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { ), ) else - const ShimmerSkeleton(width: 48, height: 18), + Semantics( + label: t.proxies.delaySemantics.testing, + child: const ShimmerSkeleton(width: 48, height: 18), + ), ], ), ), diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index 241302fe..a33250f9 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -1,6 +1,7 @@ import 'package:dartx/dartx.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/semantics.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/widget/animated_visibility.dart'; @@ -38,6 +39,7 @@ class ActiveProxyFooter extends HookConsumerWidget { text: proxy.selectedName.isNotNullOrBlank ? proxy.selectedName! : proxy.name, + semanticLabel: t.proxies.activeProxySemanticLabel, ), const Gap(8), switch (ipInfo) { @@ -90,6 +92,7 @@ class _StatsColumn extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final t = ref.watch(translationsProvider); final stats = ref.watch(statsNotifierProvider).value; return Directionality( @@ -101,11 +104,13 @@ class _StatsColumn extends HookConsumerWidget { _InfoProp( icon: FluentIcons.arrow_bidirectional_up_down_20_regular, text: (stats?.downlinkTotal ?? 0).size(), + semanticLabel: t.proxies.statsSemantics.totalTransferred, ), const Gap(8), _InfoProp( icon: FluentIcons.arrow_download_20_regular, text: (stats?.downlink ?? 0).speed(), + semanticLabel: t.proxies.statsSemantics.speed, ), ], ), @@ -118,25 +123,30 @@ class _InfoProp extends StatelessWidget { const _InfoProp({ required this.icon, required this.text, + this.semanticLabel, }); final IconData icon; final String text; + final String? semanticLabel; @override Widget build(BuildContext context) { - return Row( - children: [ - Icon(icon), - const Gap(8), - Flexible( - child: Text( - text, - style: Theme.of(context).textTheme.labelMedium, - overflow: TextOverflow.ellipsis, + return Semantics( + label: semanticLabel, + child: Row( + children: [ + Icon(icon), + const Gap(8), + Flexible( + child: Text( + text, + style: Theme.of(context).textTheme.labelMedium, + overflow: TextOverflow.ellipsis, + ), ), - ), - ], + ], + ), ); } } diff --git a/lib/features/proxy/active/ip_widget.dart b/lib/features/proxy/active/ip_widget.dart index 16b4d2d6..a1e88ee1 100644 --- a/lib/features/proxy/active/ip_widget.dart +++ b/lib/features/proxy/active/ip_widget.dart @@ -1,6 +1,7 @@ import 'package:circle_flags/circle_flags.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; +import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/utils/riverpod_utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -23,36 +24,43 @@ class IPText extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final t = ref.watch(translationsProvider); final isVisible = ref.watch(_showIp); final textTheme = Theme.of(context).textTheme; - return InkWell( - onTap: () { - ref.read(_showIp.notifier).state = !isVisible; - }, - onLongPress: onLongPress, - borderRadius: BorderRadius.circular(12), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 2), - child: AnimatedCrossFade( - firstChild: Text( - ip, - style: textTheme.labelMedium, - overflow: TextOverflow.ellipsis, - ), - secondChild: Padding( - padding: constrained - ? EdgeInsets.zero - : const EdgeInsetsDirectional.only(end: 48), - child: Text( - "*.*.*.*", - style: constrained ? textTheme.labelMedium : textTheme.labelLarge, + return Semantics( + label: t.proxies.ipInfoSemantics.address, + child: InkWell( + onTap: () { + ref.read(_showIp.notifier).state = !isVisible; + }, + onLongPress: onLongPress, + borderRadius: BorderRadius.circular(12), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 2), + child: AnimatedCrossFade( + firstChild: Text( + ip, + style: textTheme.labelMedium, overflow: TextOverflow.ellipsis, ), + secondChild: Padding( + padding: constrained + ? EdgeInsets.zero + : const EdgeInsetsDirectional.only(end: 48), + child: Text( + "*.*.*.*", + semanticsLabel: t.general.hidden, + style: + constrained ? textTheme.labelMedium : textTheme.labelLarge, + overflow: TextOverflow.ellipsis, + ), + ), + crossFadeState: isVisible + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + duration: const Duration(milliseconds: 200), ), - crossFadeState: - isVisible ? CrossFadeState.showFirst : CrossFadeState.showSecond, - duration: const Duration(milliseconds: 200), ), ), ); @@ -67,25 +75,30 @@ class IPCountryFlag extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final t = ref.watch(translationsProvider); final isVisible = ref.watch(_showIp); - return InkWell( - onTap: () { - ref.read(_showIp.notifier).state = !isVisible; - }, - borderRadius: BorderRadius.circular(12), - child: Container( - width: size, - height: size, - padding: const EdgeInsets.all(2), - child: Center( - child: AnimatedCrossFade( - firstChild: CircleFlag(countryCode), - secondChild: Icon(FluentIcons.eye_off_24_regular, size: size * .8), - crossFadeState: isVisible - ? CrossFadeState.showFirst - : CrossFadeState.showSecond, - duration: const Duration(milliseconds: 200), + return Semantics( + label: t.proxies.ipInfoSemantics.country, + child: InkWell( + onTap: () { + ref.read(_showIp.notifier).state = !isVisible; + }, + borderRadius: BorderRadius.circular(12), + child: Container( + width: size, + height: size, + padding: const EdgeInsets.all(2), + child: Center( + child: AnimatedCrossFade( + firstChild: CircleFlag(countryCode), + secondChild: + Icon(FluentIcons.eye_off_24_regular, size: size * .8), + crossFadeState: isVisible + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + duration: const Duration(milliseconds: 200), + ), ), ), ), From d643c52e1930fef75fc7cde383cc96889cb2b5fc Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Tue, 13 Feb 2024 19:54:07 +0330 Subject: [PATCH 67/83] Change ip obscure --- lib/core/utils/ip_utils.dart | 18 ++++++++++++ lib/features/proxy/active/ip_widget.dart | 31 +++++--------------- test/core/utils/ip_utils_test.dart | 36 ++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 lib/core/utils/ip_utils.dart create mode 100644 test/core/utils/ip_utils_test.dart diff --git a/lib/core/utils/ip_utils.dart b/lib/core/utils/ip_utils.dart new file mode 100644 index 00000000..d7c9e1f5 --- /dev/null +++ b/lib/core/utils/ip_utils.dart @@ -0,0 +1,18 @@ +const String fallbackObscuredAddress = "*.*.*.*"; + +String obscureIp(String ip) { + try { + if (ip.contains(".")) { + final splits = ip.split("."); + return "${splits.first}.*.*.${splits.last}"; + } else if (ip.contains(":")) { + final splits = ip.split(":"); + return [ + splits.first, + ...splits.sublist(1).map((part) => "*" * part.length), + ].join(":"); + } + // ignore: empty_catches + } catch (e) {} + return fallbackObscuredAddress; +} diff --git a/lib/features/proxy/active/ip_widget.dart b/lib/features/proxy/active/ip_widget.dart index a1e88ee1..07f6fb17 100644 --- a/lib/features/proxy/active/ip_widget.dart +++ b/lib/features/proxy/active/ip_widget.dart @@ -1,7 +1,7 @@ import 'package:circle_flags/circle_flags.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; +import 'package:hiddify/core/utils/ip_utils.dart'; import 'package:hiddify/utils/riverpod_utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -49,7 +49,7 @@ class IPText extends HookConsumerWidget { ? EdgeInsets.zero : const EdgeInsetsDirectional.only(end: 48), child: Text( - "*.*.*.*", + obscureIp(ip), semanticsLabel: t.general.hidden, style: constrained ? textTheme.labelMedium : textTheme.labelLarge, @@ -76,31 +76,14 @@ class IPCountryFlag extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final t = ref.watch(translationsProvider); - final isVisible = ref.watch(_showIp); return Semantics( label: t.proxies.ipInfoSemantics.country, - child: InkWell( - onTap: () { - ref.read(_showIp.notifier).state = !isVisible; - }, - borderRadius: BorderRadius.circular(12), - child: Container( - width: size, - height: size, - padding: const EdgeInsets.all(2), - child: Center( - child: AnimatedCrossFade( - firstChild: CircleFlag(countryCode), - secondChild: - Icon(FluentIcons.eye_off_24_regular, size: size * .8), - crossFadeState: isVisible - ? CrossFadeState.showFirst - : CrossFadeState.showSecond, - duration: const Duration(milliseconds: 200), - ), - ), - ), + child: Container( + width: size, + height: size, + padding: const EdgeInsets.all(2), + child: Center(child: CircleFlag(countryCode)), ), ); } diff --git a/test/core/utils/ip_utils_test.dart b/test/core/utils/ip_utils_test.dart new file mode 100644 index 00000000..d0211d5f --- /dev/null +++ b/test/core/utils/ip_utils_test.dart @@ -0,0 +1,36 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:hiddify/core/utils/ip_utils.dart'; + +void main() { + group( + "obscureIp", + () { + test( + "Should pass given valid IPV4", + () { + const ipv4 = "1.1.1.1"; + final obscured = obscureIp(ipv4); + expect(obscured, "1.*.*.1"); + }, + ); + + test( + "Should pass given valid full IPV6", + () { + const ipv6 = "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210"; + final obscured = obscureIp(ipv6); + expect(obscured, "FEDC:****:****:****:****:****:****:****"); + }, + ); + + test( + "Should pass given valid IPV6", + () { + const ipv6 = "::1"; + final obscured = obscureIp(ipv6); + expect(obscured, "::*"); + }, + ); + }, + ); +} From 930959baf73911989747d0f8f699018d1708412f Mon Sep 17 00:00:00 2001 From: Hiddify Date: Tue, 13 Feb 2024 18:15:04 +0100 Subject: [PATCH 68/83] new: add some example of new warp configs --- test.configs/warp | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test.configs/warp diff --git a/test.configs/warp b/test.configs/warp new file mode 100644 index 00000000..f9bff8ab --- /dev/null +++ b/test.configs/warp @@ -0,0 +1,8 @@ +warp://auto?ifp=10-20&ifps=40-100&ifpd=10-20#Warp_10-20_40-100_10-20 +warp://auto?ifp=10-20&ifps=40-100&ifpd=30-50#Warp_10-20_40-100_30-50 +warp://auto?ifp=10-20&ifps=40-100&ifpd=300-500#Warp_10-20_40-100_300-500 + + +warp://auto?ifp=5-10&ifps=40-100&ifpd=10-20#Warp_5-10_40-100_10-20 +warp://auto?ifp=5-10&ifps=40-100&ifpd=30-50#Warp_5-10_40-100_30-50 +warp://auto?ifp=5-10&ifps=40-100&ifpd=300-500#Warp_5-10_40-100_300-500 From 382f4c7d5e081c0a783e9cea77588528d49462c8 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Wed, 14 Feb 2024 15:51:58 +0100 Subject: [PATCH 69/83] new: add seperated VPN service mode --- assets/translations/strings_en.i18n.json | 3 ++- .../data/config_option_repository.dart | 1 + .../data/connection_repository.dart | 20 +++++++++---------- lib/singbox/model/singbox_config_enum.dart | 5 ++++- lib/singbox/model/singbox_config_option.dart | 1 + linux/packaging/appimage/AppRun | 2 +- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index cf340c63..3f4e2d8a 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -214,7 +214,8 @@ "serviceModes": { "proxy": "Proxy Service Only", "systemProxy": "Set System Proxy", - "tun": "VPN" + "tun": "VPN", + "tunService": "VPN Service" }, "section": { "route": "Route Options", diff --git a/lib/features/config_option/data/config_option_repository.dart b/lib/features/config_option/data/config_option_repository.dart index dc5f05cf..79519308 100644 --- a/lib/features/config_option/data/config_option_repository.dart +++ b/lib/features/config_option/data/config_option_repository.dart @@ -191,6 +191,7 @@ class SingBoxConfigOptionRepositoryImpl enableClashApi: persisted.enableClashApi, clashApiPort: persisted.clashApiPort, enableTun: persisted.serviceMode == ServiceMode.tun, + enableTunService: persisted.serviceMode == ServiceMode.tunService, setSystemProxy: persisted.serviceMode == ServiceMode.systemProxy, bypassLan: persisted.bypassLan, allowConnectionFromLan: persisted.allowConnectionFromLan, diff --git a/lib/features/connection/data/connection_repository.dart b/lib/features/connection/data/connection_repository.dart index 9e53b74c..9d3aeb5b 100644 --- a/lib/features/connection/data/connection_repository.dart +++ b/lib/features/connection/data/connection_repository.dart @@ -159,11 +159,11 @@ class ConnectionRepositoryImpl await $( TaskEither(() async { if (options.enableTun) { - // final hasPrivilege = await platformSource.checkPrivilege(); - // if (!hasPrivilege) { - // loggy.warning("missing privileges for tun mode"); - // return left(const MissingPrivilege()); - // } + final hasPrivilege = await platformSource.checkPrivilege(); + if (!hasPrivilege) { + loggy.warning("missing privileges for tun mode"); + return left(const MissingPrivilege()); + } } return right(unit); }), @@ -192,11 +192,11 @@ class ConnectionRepositoryImpl await $( TaskEither(() async { if (options.enableTun) { - // final hasPrivilege = await platformSource.checkPrivilege(); - // if (!hasPrivilege) { - // loggy.warning("missing privileges for tun mode"); - // return left(const MissingPrivilege()); - // } + final hasPrivilege = await platformSource.checkPrivilege(); + if (!hasPrivilege) { + loggy.warning("missing privileges for tun mode"); + return left(const MissingPrivilege()); + } } return right(unit); }), diff --git a/lib/singbox/model/singbox_config_enum.dart b/lib/singbox/model/singbox_config_enum.dart index 30aaac78..cea3730f 100644 --- a/lib/singbox/model/singbox_config_enum.dart +++ b/lib/singbox/model/singbox_config_enum.dart @@ -6,7 +6,8 @@ import 'package:json_annotation/json_annotation.dart'; enum ServiceMode { proxy("proxy"), systemProxy("system-proxy"), - tun("vpn"); + tun("vpn"), + tunService("vpnService"); const ServiceMode(this.key); @@ -27,6 +28,8 @@ enum ServiceMode { systemProxy => t.settings.config.serviceModes.systemProxy, tun => "${t.settings.config.serviceModes.tun}${PlatformUtils.isDesktop ? " (${t.settings.experimental})" : ""}", + tunService => + "${t.settings.config.serviceModes.tunService}${PlatformUtils.isDesktop ? " (${t.settings.experimental})" : ""}", }; } diff --git a/lib/singbox/model/singbox_config_option.dart b/lib/singbox/model/singbox_config_option.dart index 5cbf4614..1dd9dbd8 100644 --- a/lib/singbox/model/singbox_config_option.dart +++ b/lib/singbox/model/singbox_config_option.dart @@ -33,6 +33,7 @@ class SingboxConfigOption with _$SingboxConfigOption { required bool enableClashApi, required int clashApiPort, required bool enableTun, + required bool enableTunService, required bool setSystemProxy, required bool bypassLan, required bool allowConnectionFromLan, diff --git a/linux/packaging/appimage/AppRun b/linux/packaging/appimage/AppRun index 0133767f..51d29413 100644 --- a/linux/packaging/appimage/AppRun +++ b/linux/packaging/appimage/AppRun @@ -2,7 +2,7 @@ cd "\$(dirname "\$0")" export LD_LIBRARY_PATH=usr/lib -if [ $1 == "HiddifyService" ];then +if [ "$1" == "HiddifyService" ];then exec ./$@ else exec ./$appName $@ From 1de7759849f292deb24d13ed2856606fa19ee458 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Wed, 14 Feb 2024 19:11:01 +0100 Subject: [PATCH 70/83] new: update icon --- android/app/src/main/AndroidManifest.xml | 2 +- .../app/src/main/ic_launcher-playstore.png | Bin 10539 -> 7484 bytes .../res/drawable-hdpi/android12splash.png | Bin 8271 -> 0 bytes .../app/src/main/res/drawable-hdpi/splash.png | Bin 5050 -> 0 bytes .../res/drawable-mdpi/android12splash.png | Bin 3630 -> 0 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 2280 -> 0 bytes .../drawable-night-hdpi/android12splash.png | Bin 8271 -> 0 bytes .../drawable-night-mdpi/android12splash.png | Bin 3630 -> 0 bytes .../drawable-night-xhdpi/android12splash.png | Bin 10156 -> 0 bytes .../res/drawable-night-xhdpi/ic_stat_logo.png | Bin 815 -> 0 bytes .../drawable-night-xxhdpi/android12splash.png | Bin 25230 -> 0 bytes .../drawable-night-xxhdpi/ic_stat_logo.png | Bin 1106 -> 0 bytes .../android12splash.png | Bin 30863 -> 0 bytes .../drawable-night-xxxhdpi/ic_stat_logo.png | Bin 1705 -> 0 bytes .../res/drawable-xhdpi/android12splash.png | Bin 10156 -> 0 bytes .../src/main/res/drawable-xhdpi/splash.png | Bin 5601 -> 0 bytes .../res/drawable-xxhdpi/android12splash.png | Bin 25230 -> 0 bytes .../src/main/res/drawable-xxhdpi/splash.png | Bin 14395 -> 0 bytes .../res/drawable-xxxhdpi/android12splash.png | Bin 30863 -> 0 bytes .../src/main/res/drawable-xxxhdpi/splash.png | Bin 15523 -> 2563 bytes .../src/main/res/drawable/android12splash.xml | 29 ++++++++++ .../res/drawable/ic_banner_foreground.xml | 53 ++++++++++++++++++ .../res/drawable/ic_launcher_background.xml | 12 ++++ .../res/drawable/ic_launcher_foreground.xml | 29 ++++++++++ .../main/res/mipmap-anydpi-v26/ic_banner.xml | 5 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 7 +-- .../mipmap-anydpi-v26/ic_launcher_round.xml | 7 +-- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 1530 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 824 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 512 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 1798 -> 0 bytes .../mipmap-hdpi/ic_launcher_monochrome.png | Bin 1711 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 2639 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2256 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1018 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 646 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 331 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 1207 -> 0 bytes .../mipmap-mdpi/ic_launcher_monochrome.png | Bin 1131 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 1762 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1470 bytes .../src/main/res/mipmap-xhdpi/ic_banner.png | Bin 0 -> 3164 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 2001 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1072 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 682 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 2299 -> 0 bytes .../mipmap-xhdpi/ic_launcher_monochrome.png | Bin 2212 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 3569 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3278 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 3101 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 1610 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 1019 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 3387 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_monochrome.png | Bin 3258 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 5540 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5084 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 4102 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 2168 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 1708 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_banner.png | Bin 5172 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 4738 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_monochrome.png | Bin 4582 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 7570 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7238 bytes .../src/main/res/values-night-v31/styles.xml | 2 +- android/app/src/main/res/values/colors.xml | 2 +- .../main/res/values/ic_banner_background.xml | 4 ++ .../res/values/ic_launcher_background.xml | 4 ++ assets/images/source/hiddify.ico | Bin 0 -> 3359 bytes .../images/source/ic_launcher_background.png | Bin 21241 -> 0 bytes assets/images/source/ic_launcher_border.png | Bin 45332 -> 123954 bytes .../images/source/ic_launcher_foreground.png | Bin 27001 -> 0 bytes .../images/source/ic_launcher_monochrome.png | Bin 27497 -> 0 bytes .../images/source/ic_launcher_rectangle.png | Bin 33148 -> 0 bytes assets/images/source/ic_launcher_round.png | Bin 66640 -> 0 bytes assets/images/source/ic_launcher_splash.png | Bin 13889 -> 0 bytes .../images/source/ic_launcher_transparent.png | Bin 40812 -> 0 bytes libcore | 2 +- windows/runner/resources/app_icon.ico | Bin 12103 -> 3359 bytes 79 files changed, 146 insertions(+), 12 deletions(-) delete mode 100644 android/app/src/main/res/drawable-hdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-hdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-mdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-mdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-night-hdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-night-mdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-night-xhdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-night-xhdpi/ic_stat_logo.png delete mode 100644 android/app/src/main/res/drawable-night-xxhdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-night-xxhdpi/ic_stat_logo.png delete mode 100644 android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-night-xxxhdpi/ic_stat_logo.png delete mode 100644 android/app/src/main/res/drawable-xhdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-xhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-xxhdpi/android12splash.png delete mode 100644 android/app/src/main/res/drawable-xxhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-xxxhdpi/android12splash.png create mode 100644 android/app/src/main/res/drawable/android12splash.xml create mode 100644 android/app/src/main/res/drawable/ic_banner_foreground.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_banner.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_banner.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/values/ic_banner_background.xml create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 assets/images/source/hiddify.ico delete mode 100644 assets/images/source/ic_launcher_background.png delete mode 100644 assets/images/source/ic_launcher_foreground.png delete mode 100644 assets/images/source/ic_launcher_monochrome.png delete mode 100644 assets/images/source/ic_launcher_rectangle.png delete mode 100644 assets/images/source/ic_launcher_round.png delete mode 100644 assets/images/source/ic_launcher_splash.png delete mode 100644 assets/images/source/ic_launcher_transparent.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3283a99c..03b2c845 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -22,7 +22,7 @@ g@b+>eBS>z+S%t-H=y_pa4nWby59zr%jt=Xu`! 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 literal 10539 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 BLH7Uv diff --git a/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/app/src/main/res/drawable-hdpi/android12splash.png deleted file mode 100644 index 02dfcf50a9510ba2bac7d4bca9a76ab20124751e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8271 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 Uy4NQlu>hv0&!5Ww#qrMn01AuD=Kufz diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png deleted file mode 100644 index 7cb46df468e8053c2c740fa1e8b172dbc0d1c900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5050 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 diff --git a/android/app/src/main/res/drawable-mdpi/android12splash.png b/android/app/src/main/res/drawable-mdpi/android12splash.png deleted file mode 100644 index d7c34860d88427082f6ca7234e01d946460e8935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3630 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 Uy4NQlu>hv0&!5Ww#qrMn01AuD=Kufz diff --git a/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/android/app/src/main/res/drawable-night-mdpi/android12splash.png deleted file mode 100644 index d7c34860d88427082f6ca7234e01d946460e8935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3630 zcmeHKYgAKL7T!rvh>ih8tvEoUz#s*b5l5jA5~&sC>7bMd1fwmIqF6)&fk2WLl|dA( z3Sxl(%Oz-S&P zb9cxsew3Fqe(17o&4aSCl-7tHR$KnOcm?x$@Np(_`>IcD<_{eIn{B;S!_~EtlN5_@ zncrKu5KmogD5_q*>Zeb0Zzf8bTiFLRqc3N?1)>R`QU&(ovntPKW3p}A#B8SBu&oQw ziyg$~0K;JbbP5jOD>DGIB>-02-VeOb$8V<`JOVBcKD`z`Y95);I5g}dm_3T6{p^Ga zo3+9A=#3fO@v7+w{ZycPn=1XFQLDQ1ZEg%6SSQxf^y?J)4q>Osqs8~Xx<~|}&5A^l z#-5B>zQjIj`R1mi$q8TRiUW^0o>C`UZ3VFN7j`g`Z5sBYh1W<6FedIO$ z+K{H_2%T&JESI}jcGhB`-|*HCCYeEdG)ds)`<4#cgZgB(6XJNGpEc0eb%&q1Ey5Xs z|5tX9?mD$m(OM97qfU=qHyQgmUmC`(O$pxCH+^sr{5kK)tBbWgQ+sBo+Zty_1$ig3 zZb_OVq94tRxr9lvZp(IK#@*jCF7yDi?1-&KbakPn%F`Uj6e9I)hu``K;%&=ht_V52X4s1X3dyn zBuE@9Q=gq_A;j$K%1t>VfcYo)ljeVomLpR9OLtV=&;ReaZp~6s1#&m zVz+xd>7^E6(WT(fJeYX!caurTh4whWp#_$~p&(sStuaq=02Yxt-JWxx)o!_Y@)93Cgm!7G*gHy5B*y`C=UosL8_} z){0VUb8>~wmTn@#i<}aU>B)q+5(7h1{aXOk-Nz`AxS)S#EfEaiy!s*{^14rQpf0jfR3A&$9sljq>jN(*LWl z-sw~?Wo)mzZ^R?@njgAPpD#_^K$8As1~K<0lU`-G>t0-+-7HQ$by=M^7eC8Qm_r2a zqRWr1OWim_**t!KQhN@Rok1@QM__!RlOw1FDa@&{!6(_F{jZ1Dl^FWm_Tvke;phz= z4$giNl6hsP%sku74;yaHkW8!cj_qrAcrfV^azAkN%B-2>$LaYN?a0EaZ z0wEpgAUyG(2MTw%4}I6;3APtNNMx=V%6*n?j(9G~3J-tS6_m!qY=9I9(xnG275wB3 zbiFDLi#w9kBf|twXJ9QzxJI@|=Z;nOruR824(kbsJy}r+Y1m&088a7YJ)PA0(lAV7 zsET@6TWv>DBf{LTzB0D(>a<}%s2#NQKuq~BUk@@Jj%6V6H^=yUTbh*JsOx+uKOLBqt5al zGxm<(!p4Pdywr~w9(Z9LCKd7U!@+jCHsGk2p*KK+_Y+7iR7YKdXJZvZorpPBI)R<)aH>Me)%m&dVd-#{!Sh8hZS|e+0#yj4gdf516!Zm(aI}+06D?&l*4^+04%kz1u8*Rib zl=D#Lol1+Gyx&%0Xwlz0a&%tP3AOsYTz#+B-)RBArN0-$xA6Z?A{(hf6<12pRAE(w&6RY`C3`=IFx@&D<&lp*7Jv-M9Yz6k%8tdNJSUYw^42 zV4u~q56tQ59ZEa9GUeX=hePvF=?wZN4^g@XJ|-h|NdfdsrjPAy`Hx3^?x(j zclgW?o2^S9JgK>Nao6QtJ-?m4yd|3yS-*(<;oKF6sH>LLtu~yO7Ve}d@JKIRRW^K> zr;br6)JZvU`PW90UC)#9;%2Jnk6t-)6}M8H3@=HTl*H+-cdybjHt zhp)@&_=*U4Q)td|e4SyzUYPM1IAJDXzzH+;g6m-hF2D&hXo*u{rdfa!{vY*9qa&e> zmA4r3m+Z_VZKUcOnWMz@t<2o&x3^4_cuG6^emp!Zd^qk@Ej1L~@d(TEwNwkLi^-a% z$sa}Rgr|{>HcTs7U|?rO)zdHOXYuNO@j%VA4e#2Crj*h586^x$izJO{+lk>$6ISwj zuQjeFlpT0tsb}?2`qp?Jq}B~ib+OH+E?p5fRgXQivbU?@8&MV-;w9JoN&+2aqbZ)W zdy?9Ak+tRLefckpQN0TcKJ38>n_P1GwRpv<++MLL#bZbIqf3b< zbRphGuuxp7&JODPd98D+{Nw9-d24k%zjE%&H*wZ$LZs#>%^lWJf{&9stMmLmx95ln zrQhjTA4WD--m&WQ^Od0kf5#Kqo-pG{qMzqPme2_;yaoif1R>4;?%9!hA`e#_1zgIc=xN}xoNrsW-3YsB2Lv3qRgJhV3ri!}^m zsfY<=Yp-xv*NlhLNPoYSX&WIa`G(R2je7y5JJdO{s~VnaJn++}<@$VWG`Ywt1X$i- zGb<#Kjp{zqkQBT|*$955N5b|FVbjileAhTK%M07_bOBIi8MmoRY&ccrAg}-noU_qv ztom@wy*rqI_074nWk4%w>WhRxm3<0?brn5%sv6QzD9F#VhP_j^I*ytOQgEgj9gR^` zZ{e-uiV1>Yta0I!NWLn|5 zx2~ZK_!BXIfBo~evGrodeZ*F(0a9!SQqIapTO$$*Ta5f*f77@GqA8(`3EtMqLcHT- zY{#bhC>pBKt^Nw~caIatzY+M;wqpJbkQVmYzJVf4(XIIi9Avu_A|;r+*ksaPmU$u> zcDrspY%cExYpeDjoJ?{kxa=_w$!73SrEnQ~f}OFsyWf(2412Pm{y7m@V{^PW`^z-R zQe$)ohohiKxQKHdxqXH`wQF4bu3D*&PGBRwoB2hV9n{(A2HyMHBIflbsvf!r4}U`F ztj`~Lu)5*%O3ybI)V?29vbadF0s=(89I4pCPm5zbv&{CjtW-6K#Hmcu*_3HL@(Fd& zsN-aQG;OMv9K!hs_2YWm9NXD>J#M^dlcnPEwFR`n1>^U_9R@TL@}d4sYpUm>g}4qj z|H=`o2bz3yX(7a7*C2<1xVqwHu^WpKWdrz4&=O|6Klv91GfwtqgFDpQ76_c}7Ol2I zJ95*@^nC9-P@lW5Bs{Ux!NTYdnArVTn5VsSlbNW>u^c~`OKTt|*2iaS9yDzru1D+4 zAT&9@u$1D%9HHc=mR^Y>D~Pt4=Nv@JFhyzGz@pE->8jOa6bj|6ONoi-z{gnQ$pwEK zHATa4xJBom=Vz!bRq-Y94|+|tPdsEfxiXEiF>3=blFAkJ<&z0V))q8z>7v`(=S4~mv02h*$g{6<({tg+7;J3a8j|B<@0u5 zD!b!-3CkYs{s}ZW|0aypWVf-a3YF>GIaR!gmYzHbNBkfqrm`W-g+N&fS=gOSb{Um8 zjuMX@S>LJ{Z69%!Pz`P-Xi3R~Z##Y<0!HbU38J)X)dg0>F(1D+<@JM=lSf$GRmDto zc3trmSr{zx1zB_YD`-xsB^^_WCZqezF7%3|k*Y5!gV4@<5~Xe5 z!22jkD2`QkOlMVk9%eD*!@?^IeN@xGnuyhRBdT5p#gzxnYCHp*_}WaByC*g9-n;as zK63z((h97pr-FzMK}Av?04$+l2m<9azH@d1zkl#MynP!9@mn_!yS*2`-s%9a6J3B< ze{V#Yl^q*9I0@KIZ-!w%P^*uClvS}zN;_S*LZcsN5r3ex2TzbHo3#n4ed+E*teJ_SnH`(uE1jSwDy8lfK$|c2x1=jJt(;F zGAj@e7Zq*;>E5MK{!HJlDLtgXwqJ^=qx8wltdws6@sWc$=)0O9Bzj4XFCijIAeJ$o z_aOSktM!MAlqL(C$MdvS0c(k!RF5-kscYn^Fhv3|9^HyXm5Qz`nHSTM%cwV zDODcXh2>(xAH6Dbm@&DZ_9}6IYhhU+vONZV5oEUb+Jy57bbomG>m5jK?fxTsZ(Dg5 zHJEF9l?T*o^3tqgbCn6S?fbt=YUU7T!w4pcaiql=E3_>Q<2BQJgk%3yzL7r+| zN!awhlz4=ouINdxmX4AAJtw@@C?9hI?aan({Cqn!Y@-rqdG%+`#)zH@e(pyjV1q8+D5q7Z*2p7N+W2hEImS%egRs%Z(t-d!xTh+jEDszDP~YWO5~m%GI*! zZVzIWOTj@%NjkWH=Mr{FRelRoYs;?fbUYP#U|bA!KraHwf6p6FS6fb=$ za0B@##1c)@%G_L`0(=6AQXx4d7HL~V(L0i+2jt{}sWOD3X2bCJNV%csP7oSmW^f7x1O4)~O34%9|*l(tejmZ8=|jp=~M`AXeBJWmFX6Jb8Za)Wu9Wg?p!Y|m^63}8Jn{|ZX^MJf)_Zh&$mErdb;@-VDJz0d8 zAJ~nT|I3W08}jmQG+og8?a0o>;HVq&Hg{tingRcJU&f-!AP&2qM)I}&q`G3fljQ&q zwqIlOY>mKX!xI4I^n;(mDmq?YzZ48Tuk+J>z^5R{97&mX-3L(fNU#!|IezTFMpi^G z0hn{xqm$+Z(wcSJ6+3|VfsR-L#7ln=_W}{O7<6DZY$fWrF;&ZEOg8HT<5pv;^IqDQ z0L&MA^0<8Op>K8XD!`1#*zpT<5ps{l=E4*+uMU%boP*r1j%?M|@<_>inA1@X^p@{n z%+^9k2U=bswy)zxVOv>Xm`>#BU~xaDGm5DSd_pZucg=Eph7 zT4Sp<8J%>UMPC4Z|KI#R<>t-F)PtstRzdk64dKSr{pZ8&WXZrIFD^K$bO37qr&~;C zzVhsXd&eS=MQ~$SN1&s^AnX?XFYO?`w|(TKgd7s)qK7DC%p^U@aP=M~&b3V_XWtup z$~>6?(-xvs!@J;z!aSA4q$E61?NK-qPyw8#D0Z!r85W7NX=6{3{BJ#xy%9%*F;E^|Eqr~Q0!v+R&vZLUpIE75;w65yLfCZ9RF3j zr4um2?F6S4#011kdN>yraZimt@(J@N^89J)?r$^HC)zdJ(x7TCtpLE;#9%yQE(*MN zr-@p-U_bHw<0fXf@g(^drZZb%sSq#4&s&NF)(tm@_)qCPrjMty9|H8s!(HvyJG)bom%Bv&yUU)^SbzycoWBpgG~m&NsK>a1k+4_fjpWX^c z3M$e8>qW?p73ag}u}hd$RZ0_!A|4+{rH*3+gToPtn;z&@2?)|<6N+ZN+wVi zjxg%{ymUvv?`(NnD~^x-oDd#9f7_Hy;X{0vC0x1pv3#iJ@lDxEnH|wjET#(9N_i41 zPBKlp#JNRoWiJ*{^#u8b$n89wxT41cYF|u|q~=|+fq~#jC%+5_bAyw-!V$Ayazpqj zE}|pZKK9yJ=_iFD@nH&sf9AK7GQ`RO@L|DLguY4a{lv0TG5)})VFD+z)ViH_WruxO zs&9!yz@n)q{p8~%!9-s)VNL_cN|HQyU&ipLu4t*(Gz8 z=c78*7QDly^0J`AgO^xb_rYhPx%=}AOERA@u(n9Hk8VHn1Lk87cb7+_!`6n_9Sx7@`Ux#f~hB2f~OflNpUBV}NK zVq#laU;kSMT!KE&Hr})_2-_Ti>ev&UWkj&Uv2idGDg;rkdlYN1$p2 zYo&mh%?EA(&m>*+$EyVaGn)tW14n_$z>uVg$rCWMF#-5#U@qXlGn14(ev%59**IV+ za0*yo6lcj2Ftgdf1z-a(y;YJ(j)0lDZ}$P`fjMQ_Eky!nfV05ZGVn>pfSC;d+hf4@ z2*kcp{+yY4#+wN&1Kvpb*z`SJ1ww!x0`>z700+BA(vQC+%N*p6C23_7fu}$==0#ZL3VZ;3;rc0n^)c|;NUOjmQk4^M zJU*NL48S}FVl$Xushohv%NO8lATSk}6yZ95k5o?JZ5aPP2Sl^NuE%%yF;+Q&my%Z1 zIf!eYMh7KrYEobjXw-%hKkAALjiwj6Eopa-fbWDJ02^Zh0C2K>O{+zpI~qe$$=~@U zDa(3|#g>`*i0J))nRy24m*gNa3$3{CgpNh*HvRr3;7WeBHZxcBX4yXv-ycfywPkmg tyOChpI@Yn(Vp}NMxZESq#^ZJ5>Tg54!9Ya~NbLXs002ovPDHLkV1k)%aP0s9 diff --git a/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png deleted file mode 100644 index a27a1e9f37b8bce7dd824cadc0a1de92c5aa34a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25230 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 diff --git a/android/app/src/main/res/drawable-night-xxhdpi/ic_stat_logo.png b/android/app/src/main/res/drawable-night-xxhdpi/ic_stat_logo.png deleted file mode 100644 index 31264850d0a4260659529fe32e1566664d50819e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmV-Y1g-mtP)Px(3`s;mRCr$Pn@h+RRT#&A|FXMfS#|*z710e6v_&BnL<=F1h>AjkNFhl}+^7pd z?LvXJD3U0C1M_~oe$LE0m+#~KX6BsrIWu#9 z^M9V_oaa18q*h8miBCC!1ZaXn5}*XAofAn4N(!o`AluIacLG}^9UF}ryn<}61r7o? zWl(;Uv|{jpY+ng{1l$jtJFYWHGr}31f^5f}Uk0`V7v>q@AOU4y9s*tmmX~>^!2z-z z{w2UXP{m~r29WK`fE~bYpt3vZJs{iRbRPuX2Ck~2n!z|}+qVI40r%DgGZWhT8pUj1 z5Bv-)Y6>UD_145}Zv@_J1E=qRHUaM@Km`PBCqQND7%U*$OMvfzpMZ6eoCj)ffNV!J zdIJdOdwvGxkfhCn2W0yZ;7wrJEEq>5#aidAX8SSVla@~Ul%z`+Y`VktEx?Ca@+xnx zMR`=Kb6TJe3~N?J25K+k6Dnu_0=+wHKV z+$h!g&8qFgKyHYxL99$c-QLaHJ__7i14i9-Py$pI#rj}kNkL`iGguSL!uNT=X-WST zK^i0=+lztkfC#<6NV;*J0d*(L+kPK-0toet+6GBc6mV9XBLyw|FmLhVTfO8t`oB9jL_QSv-U}*y|qahn5eK3zvYBPH!bWM}S_Cw6_4zKVxU?H7$3hdjd3p zT;~D3C@D@!^ERtVL2;}jY1?c%*_rw2rgk+puJa1|7x*kIL>SF04hf@_r7)RR16=0; z)tGCet_e`zopd8v)ELxx1^o`J2Ywx!bd=ddLBKmTKooWDJfQuOcI8B|fD}=zNeX5B zah(U0R?-v9Bmqi*+IiCFB*iuBysgIZN%uu7yt?x~sMiUz-+=2X{Kc{^YbAYIprB8I zIF)VFK9&^Ah&+X^1HNeUaNvZbYevsFqYT(~T$|q4FlQ509p4n)qlg#Uju0P(4sqGG zN&5>}J)wdm_I&r%xx_p6A+ZeED(UN7Kux~5?_;J~NZtjw3DAVUlmI0_?F>07Xac|g Y0U+vRXOzBWV*mgE07*qoM6N<$g4!na8~^|S diff --git a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png deleted file mode 100644 index fdf397f21548660ab23b4855b242c6e11ec1a4fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30863 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 diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png deleted file mode 100644 index 254a0e3aa145b2cdfa08b933a6432765324ac91c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14395 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 WRjC5qG6ul~8Qi#az4Wg~Fa8%{#s|p& diff --git a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxxhdpi/android12splash.png deleted file mode 100644 index fdf397f21548660ab23b4855b242c6e11ec1a4fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30863 zcmeHuXIN8NwCJ&n%#0#q1qKC2tb-KA5d-IlJoXHC(ga^_x?|qN_IGnT3+H0@A*IN4!a>UF; z_Q#)pL=Z&w!2W$l5#)Pt`#tjgBJd|CwNVQ}{HzY_`~8^Tyy1@RvWV6aR`%MyaQ}4y zheFRTocH%`00w_7VZSeahalN*-|lG0f^WAA6~5iAV|}|r=D}64-}hi4{AWa)_w9E6 zl5clE5x?Edp+t~5St4^rgv@yl2vl=nV=i7I$lOMO%cMo(|zkbwu;eph*x7L0Cs4Vpv(M8B9K7LleHt&*N zqG6bSY>w$6r_M7YJ4beE4@NKs{y4VdplT?u(V#TR=al>rq6&{bK(6DLIK1ZgSg)=V z%3Y6R3JB@%w@Sp5Y-|mbSEc|xcfc)DGodcbdz?=l;Brqp|ISKstNUDswb&uWOWxZ{~w zd$fja=OGG&`Pfw2_6GY{s=3W=TameWctpSedcb-1OWB?&_3F?Gm5u_ZdXpQI=HDU2 zLqFh4{d%(fH+@^Z#J7@0`LhkC3DL_`Y#b6w^H$v8zVxk#K|2>QmLf>hH|Xio&@9Od zvxM=qu+)I861SHe=ur z^!gzjFuP2-$n#RQ?N} zQMkv!*e?vC+oeZSnNy=;-AR zGB`vwlfhDu9{%F8-lM97FF+Rt`63s z=-XD0?2d@Q`S!oBgRCyqCU;gB0sZQ@xsLc4uQxrP5d;p%horvamr%y0Ru%15HOmUB z-V(LVt%W%cp-nBr(Z5mkK^YDvIEFS{pYF?L315qhpHQGtY5NK22sxx0kPiS_$J9HC;7 z#~X37ulE2|Yr&CKQrY_2INTRs`|Qixwv1X14end`H+u)Hl>XC3$KD`7@l$ggK|*%l z+ZkIqW4fVgt#|>#ij}TcanApgL|(NzQE{wf^aW&54L64F*gJJ%w~}%t6bL&>D(uFS z4zZ%{vM}L&Nb}ex9Cy+&U=veM-mF!eDd{K#V-??Cbbkik)T#i1tA4?OTLMRT?Urs! z`)}V^Ps$8hj35_!q}F>;zCSo^%}xFF6IU=ao26cDISkNXD;~gYgtpZg>a+uQ5Zcy8 z`-GsqyZ=t!1qE~tcUD&9XN@`n;UHaYy<>y`DCEIzoH2KH2OGUyClZ;He&o+CK#X$n zFCu&{q;_^(1>ZbanaKj8Jyyk3bupqYxd)!fAEW^4=SUtGnLHbLct%B$Bkm= zX_qsS+l;GYgAz;V9a`6L#9ALgPj;xMv6#Jlkq*z# z*j6L<-W?0Gp}!ydpm7t>=8*DGT$-C$keOK{bWj!|p>39mWP4%GPGO3- z7GV`;{eB)e?+TVC1Cmf^$=}>i%T?kx)|a|g!;P~N!?0od2Ll7c? znzU@B>@2!dBNl#uoL}(9hmO1_@~FQh`TB(TB}3#y1L=5`G{zy;IyetuZDRcajXmrT z%tvUa@F2;$xujnr7v&a2{H-^@35brBEfvPXX!!wZ--SqXmvVoMacTIZ$zF8k5mftC z1EC?b>Ei6QAwV-;{p#s=`BMdeKCK_6Z0GdZ`;d088LJAzyecdVm)><}En#U#)sxDi ze+24a)k&%8=o#nr3Omv&uiFI3h@GtA7No=k1co#7l_tztJMPz?doGf z?cP_IYc7evDM@>8A6v}W$NAev1XM};h=;a@lJU3lBwjG3nh+Z1_!L?X%NR%1P{J#$ zpQ){h%?biCVj1HG(2!R)Omz;J0J?O?vjv)K#rMj~{P**^Z+EmsxbngC9O(Zu61ela zm4JR3SYsGzyWXwtR`Wf^;hBa4H9>H`z#eGw!e5wryAOa(lB;Y{VDib_xLj@N+JH&T zNJ+Svv0zcD>v>0KiNijAQrzcZ12V|I?Iv8oBx#W9wh;0YibpSO&aA#!2om-8=y=`^ zQRyZJrT6|L9_RtGm!wmCqu87L+9($7ewMMO;T{x2`XVRZP6xfT3WdEQg zf;80Abw}17;X4CIMIJ#J%n1G)To5GopxWZx7=CEoNSv3ToN-X{#v_Ew*Qg2lGMg@N zDD=t#eu7}8Pki@$m?QbX@gTWX1vdXpm_nO&pdhBP7Z=*+3kOW5?g7X{D$s8btyN&V zigBRpX}cMVzlvJ}?a5v|$Ft(E9G(7*_exVk0BeIG2HH^4_qLtPQ%ejd4YSd)%2sZn z3oqp+qp+C)fM|H0M|1Th*E0WccH62Nyvevgh)y2tmnk--N_6T=$H^#`03+`B_UvAF zmyTAJ=&2eT3aN)&`hEIBOUH8ps|ofQLGW|m5j+VyY-1D4nEhB2?)oXbh1qvz)>&9a zvhSppJcb1&lD8M~f$TixA{4|30$fgn6cq{7D^yL{leej(@?;WylB|sFRLD6T;fj$; zHgzz{Ggq*E^ZMR)876u9RyLFz>u)SH&_eP{w8(?ZnsB!_yFq!lbt4v!mfXe`iq!?F z$A_V=Rd)%tqUfp0FnMmN5AT&v7Dr@)?NG#V+$KWCis)#%s&|UO;B`ZMRcQlO%OTn4 zaV4#PzOBZAsi{}!R^ATE!j$D>&m^ziuo%nwgvV2-b6P^~P!uQ#d!7f?EZVYB<2kIx zzVYF7MoWlx)uwW-0{TdK)8**0xUnl(cx+gNEB8{ge7{Cl%*+wr(4+Tu&i#kwH^CJJjjc{|btG8nG5ndk@*+YTSV z(c_k(nzNZ0H4%6Yee5?EnARcLr!Z+5tpdpgBS%eD1DAcC5hlH`rWO4X)s*uvFF|(Q z!p0O7ebBRcVL5u!Kn;z!vKc??>;U(W+ zdhQmw!{@=8JBPT!D=UOI@X;gy;FZSH@rm(A|espS@z^w57M-`&pV)2faJ4-9+q#Kt3P z|B`s&6(GN^z`?7YYVQz>zOM1}8nGoFb?*NIegXj#rSK`Gltv?TWXjXds4 zr+PwG&>~Qq3REe@2qUQycri2R-!Y+zE~-t2oq$Z1Twk zVD*Z!;8?)E!F3Z1?JNx>-f!82h;yESZYDZOQAC`7x+n{wwVtx1|q7)f|u;#nhZ zeCCr`G!S2{Ur5qS9Ov)o9qtes1@-OiyfnDOJqRK@ZVX($gThFsm8I z#N{MI*#0{L^S51haP)rz^vyQSo!M{qd%;lXx!MU~yu3QnhI zGUy|fWB$cjxm_q1-X_RoI1Up6y2wH>r z<{n&7fx2V!stL%#LQeh#ULxe%ef#GJ5Uiw~M@7;Zc-r4hJI2xdjJax8tP4Q_zKpk0?f zZN#1yVNVD)S*r|7!4VUjkv}qO#lm+L+D@jhd_-tpaiCL4TEb)-(HbyBJS2t0ktE^L z-b91N1JZ4c!=x-)@W<#+^8}F)U+)tZ#2?JZVw$wzBK`%Mn}RTL zyq?Of50pX-kQf{I7%YYugJKC~fO7Cn^!{X6;2_s=8kK4=8l}Zn+d7;!i}6|r(}qYN zaXa}5>o6f6Sc1;_2^WONge;`RdNWRnE^fC6cED;L30nadM-tXaUydJ!JE!hE9IY3w zmR=$jZWYKF?|whyFAscFk_WJ(D{+xV?1P99F4mqyv_deEjy}!mGN61(xteGj@V;0> z)jTZ-uF49*h%n;5>tQ=;$n-qk=;V35UaWmGKEMXXMnt-UX*Gk|UJ-7|Z$y$N?;^|D zPQW$mB_`Y0gP>ZWluHi#+eUKo?+ywp;KVl*vY+>b~J;OaQf_7B>g~ezHz-ux-^iPm)~M#DoGSs$xdv-T~5|C!!sM zq-6t5uml7zFe2PPyyJ~%j!eDF41;L{cp)vO9&82Md{Df(=)z!BdLypFKQRh+K8&o4 zx;8`RRZm;HCfJK$jz+V<6sR=@_*DyaAz$oSWg~+BPeeP2Q~g|qpCtZxV`)F=cR$;Y zE9)XY$E&4ZLaw(LG?Y!d?=wsl7(gO=jo_8Fk52WHJc@eTwn{MzD-;oyE@m8B%fKwT zi-tKTd)`%kmhy^M*b1J2a#3`@CiOFMX20{S`v?W%!V7NNi{D~Je2urfu%a#NJ(FQJ zq1A$s7?xPZM#)S2E38asr?5T%a={LN14RycShsF0{WKCcc2?ypl&o$rW=-XFTC{vN+@0+*8xcyTIol)9hr2UEsXhJ{0CfGo=?nl_%1E!5<8LEXj zo|08vPuijs<*_<_8XfMU{=NBP5O+){5-}$JPB1z)N)tU?{rFA!rc)goqU^}R{fC=2 zY5%gYM)$yxrFZ`Rev?)0PSw<^yi1Wg<2BxL4-wa$PAoaDOnb#p(A55AC(75e0gU zd2wRi*xsLiS$0?SLL{CnUemK|>F!IV#mRi(M9?1BB7RJ75yfkPPK8j!7S3n&e$0Cs&4FAYsgVyx-@?9E){^y4Jl6s7lbDJUSC(->$017v(m?tblD;|FRe3; z0obRFZH55Et|`}4{>^**=P+eP9=Kp4Y^i-MlTu*#B5gwEYHDLXY!M=PX7I{-xn-lb zSLTF?;)`MdXmKF41MA>8(SEW&Md*fg1Q6n5%)}L5Ub|`;<5DHp#DVhGI)Eu-N%I09 zOHIdLXF@vk;ml1~5=(n{^49Fg%|QPV*gZfZjNz5lu*a{nNi964 zG6fqD!iv{t(C?$t7G7K*y5#Ds0^mjlg-=i58Or$c&|$-CLibcC&lIW&8#Jhqap zH(fYYdv!C3Cns^?)tV6$7hZf6c)Ef)6W*F61GZD#_E(0E-79qdWa`03bk{o4gX-1p zOjRG=_)c_!Gat4%ef(U=v>fg z%YlOBV}cG_;$xR`^C?lH%24g$u9Due8R}ipV@C?`?AN%)Yu~Xq#><;B%fO-DF@u1C zrrqIdYf-IfmoGBFLT)itA5FY}JK^SFV>pu&Kb}g+x1#`|y~YAJu~vCFDd_iYCaHp@ zG)w=_1*KGuQ-xmgoiLpy&V1D#c{##(bCeEBdIma*w2xS#l+(KL%LS8r)K!N3@T`bf_UogQLTfNx|hJ4?fKz>TbMgG}p0c>O(94 z>$Q4=lN1mQJTdk`Te&ad#6?QDq^}~-d-=3r$N22$^UQOjlg}Ux*7_I?NUcrar*w+; zgl|5XWxd5~rf03C{78|jq}~%A+MUBJ8QJ+HvXWEg7ZWbI(HKcjD~)VjlEf$#tON&G znEfI~mP_joGq!4LWHJ_%A8@6YL{2xCQT3ld&#}UE4?qs4)VnOzw05{S-95<-EgD!1 z*~<>V*hB6gJvd8ziOOkOhfLqN3LDET1uRG-4PmcUIwx|1BU^!cIiDku8bm)cB|8 zryuD_=m2Z{J6;*A^U4jOHE&V0^&kOPmvRqOHTS92oCN+W5(rDkl2ohc4uz=OY7SP6 z3*82Xx7ZX!Egx_-);XxG6d0j-@llNm_o!t0_=$RzGzQEL5#!77s_=uHN^D2KKb`bP z`}_xb<49p!u4awwtBNYUe|M%yXV2KQs<_f|NV(cNHlDuuF&bBfve`jpz7vj_J5?Zp zXP6ru59$*bWa)Nj@(IhmM!L=GYbpoC6ti8^Ese_(2cO*Jey%k`m8pO91FAk0j)4=}$eh7xkkv4NOM}uCM?)Gx4>0 zO|9LFm1DMXUS)cLLO0h-h9z1$;)yOZdVq*CQ=j!Z9P>m~EWV$O6_FByN4z)7EluJ% z@Kw}Q9b5SW0|B|(6f#f$;y?iE2XP;XhgWN|d6FnRSD^VPJ91gP&gc!EaXBCC$aQT0 zuG!17vtAG}@ij~^X}-kH1MXr1FvC*Rm;)i`V9n%-gj0b+bt1=U+ zpUMkpZk{laqQcLf(hIzKs9%Ebg!dL;@k6<#% zMhlPk#QXtCMU0$a)MhOnXR(`x?wAa;lr;`^*jlM+J1}&0#0&H@i$UncQXN({jH0y0 z@g_Pdu24Py?q+Si@cHo&zv}MaAtuB~8$&g564+LcUnIA#a>A3O7`>eCHVVGP(1##I ztUP4-yhK|DTQ$hz-Q9z{o6im0iVoTxrC_lgKa%l_j`BfG`-bH-T<9;Z`Jk!y6m69a zwem+wl=@YkF<@bUT*p@3vzK(~%eyBZ=o@!v)U+6WK}ouTM}B?ZNLqoB6alrSHXzx& zcdP#?81=zUxeYECdjazoXG=HK`%P98C+Gb^LVX6z1Ofg(;dRAx@`W$YRKa9bji-z! zcRr*s;PAJ%p9g(V7wMJ{Z z;1KN>=xRp230P`Pt6B%gjCW(zA`*eEE$fZdgUF_E@DBO82di$7LmH60oh+=ZMU3Dp zr#k$Bcnv<4M`Cpg!m7gPaRv00rsY!UkxHuKBv=I@x@DmNQp*^)4N3pr*!!}^#p@F> zIuItdvQszUYY<=W0(O$5a0+Jt(~US_A5VlS3}Dp*tr=#LteY2b!mSr; z{tCJ)-+y~lgOnfpgyY3E@KnkNv8|*5*q2g`loJDJY{aYEYIrleFz>*DGSTL3B9BO?`>*Lv_ov;16JSE8OX>oBtRd2Y=& zcL)Wq5HoKyqcO{#_o=M1&7QJY>A}hhtRQf|4&N?$U;?W3LQ2|6xHz##N?BfIXd*atSSh8<3dY9R@1>%` zKKW?aDSda~<9A08R~3y+CNllX79g2uW(=aH7OT+utR*+!T+#u)*!aZQRUd;Pc=`x1u{}!@WWc< zVPP;9y_K$s8TgSz=^|M6{NO$SsOWtzHeIG8_22AW(0rav_tVjuqHL@r1Sc=hq}z^2 z$#^aYZ9wUj6z>$UB~W*Mn=gS&Ix zaLy7CEx{iI@r6Lv5vg@zZpq5A^HNM-pp|BONNEVeG@}_So$?rNv8*%SmbnNq=&FB% z-3968w!EXGPt4f&O(0mWYZmt){Uug*89Luu!!^Vg4u<0cNwJwYk?pQ(2|T^9}L+Oc%lD#?=qFToBXE? ze1R!gPP-qQ`9v;#s#7?^tMT*1cTwayZ1WpkRgNnj9)4>gO0EklwZ(U8L}@RW)DRn$ zi!!cOlU@GNL7}*iO*g^i!S+xeZFGaSMmp9`kbacoUipgM^u(g)YCai4BH3e5khlFN z>(YFfmv$0XDJH_&3;f#rpd5_%Tzc-~<9hZR5(3%cQ4EX6j@TY+` ze4ZIR+864{#|9t3BGO1HGZS|^yl?Ep1H~bC(8S>w1!EjHnQ}YAX>)v!M4C2(*$O@z zdqlYcXuQ(=FpM$F?7$Kf{KG7*{vFl+S2aEBF^~s4z*?-f>X=ps?Aa&?DjNI!e|^wT z^md8vSaH(gYp}*C^<6V0AW+&bFz{f%xqsF9ACveIWYXu zLYl+dPEz)&>Df3OwYmqJ_Q*4=yS3tZNuJ<})ueu+Pi~U~bat(F=#i{9@0L^31=n3C ztN*;K0pXFR4e+|js;Z<2j60Vw1rU&ie+Ib8%GhqUn?E~BA1Lk3MY9CaV=*z!nCoZ_ zVhH!?Un&trT)jc>&@XTQNH=H{Z*gnoU@PJPe+}6w&Zqrmb7x%Jh61M`I0G(kCjX;D zLsB#e=j`^ab26zueiv&&(K;~nZ`7)1Jg?qJ&SE&N2^w){>T4IaVAyF86LB4tC%LLE zqgf(oNN#f2VYd2w*Tk1f2?dWV-3uWdEY{JjD%5FKlM<{4hw=-^d#hGWDcfIAyB{A~_(OwPl@sh5x*TQCOEmk2GUy|!^;)?AKSr zlXdnY9=$*iY4IUGk?ArzT8)QWJgcQyR@N{;2QAG^M{tfy`Fv!=;5T*lE^+ziPa{`T z7;q6Osb})xTxQnK+VIm12e2M-F?x8nHK5S z2 zpE@Zw(njW@nFekKdjg3boh#z?3HQX_{?3wpc)gQghf(bTj5sf=k#o>t0=h`z3)V ztIV0GWV@6~tZgLwU3nP{Y|9#eB`=~IwVdCU&u>V~cMH1`;~-2%14b{5yedm0+`O0k zu2S0rCf7(ewr3&rlef(_OWq3@HP{#kWfy2s#s|JiJmWn1dOV~1!yan%er>t`tTWOhTv}t zav4X&%+oETm=ksdwP3-D_WlC z<1=epxf70_^$I8C9jIJ+ice#5Xr(FMDu}&^>GY9Hq`n79f$TEs6AK3r+84++YhUNf zjl4|8DYoxR6Eu5UX^{YaS4aziDKfIjdM26cKQ-&v?6948$!@|?*(NrA=BTlq9abK& zHefr*iu8TKF9g@EoZnEf;tw%8jxBlGB~r7Q({L+n+B?kv8+nE29#MB4(-{v}iH}Ow zYvb8{y6o|Cm^l)e6ioCvA^%^^b^kM)2m@0ATy9`xuymzt(z3E6R6ak88ZC09~8+ zPG!9wRO?i80d@wvS9=HZXTyi{pC63YJxKuxg=cS{B0}4KVtr}CGHNk6tu%=*DEVCP zL2`fVuTw*1=;#FLt}g^RR&UC_8SfEU^{U|6DDwmJ(<5j0kNhx874QiA#wQ;1PEXW~ zZ1isWsv5bA(r&+P{mtWP1vl4CUGh16T9TcA^Fi#v!``_E&i!-pY1yM+(5Cg)Y1_MY zpGi-$dO=KYIa$x@dqz6XdvQ!=OAec|_kK%xdj3)eE=A_7PR6c* z_bxk=JkXtf1qm5Xg7@;(v%8v(N|-{B#qBZyle24Umz=nhb-O?L=@T$#@!8E+cT6AQ z%bvMpE^Fv5`D3P*qfadMe^1v|;W2)xDrB6Q8V-3sJ66>Qp1&)Iw|Y0mQ39=lHNX~( zXuqdDwt5%DAhULjUsJknVigd+UpuH`yd&hvOnA&m(jb@-S|t*y*pchUvILxEsm(VI zu0mK(It-473;tzjzMb|{(}D64CRkdeP?{>da_s6!Wrdja2uuD*6viDJ1n)m0~ zYnRXo!u0$Sqmj>(Yt=j%CjdY2|CVToCS#&9!t?R9z4?)y0i??rnfZdKuBj%O0RDd8 z*BAOU&BInRwfw)XWfZbnTJO}c>9cZ-6B}OoncRE*Bs!i#x_r*bj#?-LR=ErI_kKD} z-YvW{(RXql61X-$l6**xFmZ^#w(6uBDLsGIpT9P{FJDl=S@B5rU9ss3kREUM=Sw~e z`?jwA0$MS&S{Ro9id8lYJbfzVl z+g0wl1lSgW*eOE+YEe>>f?mfBWX?FJO|62|dIz*lzpBk8i$_*4ZVa#F>IHr#l+Jd~ z9v&b^m8L%l_Td|3`{rpbt&?M~?ftdAXzz!w?vgsIFDe4gd|M08zTB&BbY8A2m+M&g;Pg0BqnTG3hlR{dH|@d?9H!~3N!>~|ke zR)ZMX zza9LyT$&MP5SvXz)X`&#)S~DeT#DReqjJ{NtBhQkJ7OpPM*ZfR3w_gHKX^L)cHUAY zE5D>fsQmd!{&*#?BlzN1o+`?rRGaP8w_}pU-Ls*lY2+!u*B@%;=1WtqF-V35911Af zV`6}!*EN-o6mE{WHue6MzU|i1CW@RLsCT=31+v=YJ>EIOdx_^=$J(6CO9x~e{J-8e zpdR&L(7|Hem+5c&3MZ9cL^Pk=q;kWGXSluN^ZGxL;jijlxQPkH5J~!8X$y#LTMh!T*?g!*2c+{G` zpr$K-eDu@!t*IwLg@t-W)bYTV!c9fY5qpmUvM@ws$o*;O8=TZBP(JxTdr;<37?q7G? zn9ei@URA7|3%(tL`Fe!#uFZ&@x!k4C_&us>7~L)o)tHk zeTUQ0_Y^rtZZ*emdh*k_n&S+M$(`W4x;kyvuz?KK0oaEA{tnILh=;w zOqHkpIyiv3RH2#A2M&Yw3w#J3^m2ch_@|ASas_F5p9=&+vqT3{Up^P z`R|!3&w9%WV@{rTZywlN!2I2__rsSJ`30IIX~oKn>5WS}8{QIo3wJ34TPqzrW`KUF z@)V8#p4J*({pr{h^~~ropNzc8Xlg`GDzJ(gP~D;M2%ni;7WX>3%4a|85<_UAgFlP*N+XS$I zIY*dtggHl;a|GxG;5U~ZU}BhyigU&=7ZrgG%sIlGBg{F%|1n4CF73!)pa_1Xk1NTVK^@w1X7i)yA-UU4xr=RaDH)6$-pz>@xFB&sVe7OO8$1i-aCxPh=aT1 zmbD{Nr#xzJC3c{K3R`%njR5Y=>+zakcl<}X1N!# zr@}=!H&K#ii|U_#H)n35mcWAp-38*xed z=^S%&nm1Gy=K@0>;{t_NxFmxe*{k;;?);NG+<|mEtu2d_!jSn)kQ}cDI!J!1hHD_% zUJW#mT%(30kUR@R^5|eApavS)NLE84*vNz-2{~Y+Kn*{Ef)!M_Zm4l>D!P?Q=SVit zti#07m$Xf}{Oc91!t=7aTk%k?7piSM1J|>k3MV~Q@`an*AN9eI;*tV;sz1t&ezV%3 z`Ubjn2_Eu7+jRGO8YCILY!wym4gcSy5S?G%NRbOm0 z87#*lpsvxuQ=#++oY@<(3RRTdoIQ4a>_m}5kueyk8wb74@ITA5s;{e}*v;GwD|cD4 zF2h^>*yOmN^lj0Fn^rziN|j}n@+S?LX|a!xjnUaTqyfu$8!nbEbSfnt@?+`13ld_* z_N%ig(9|ds(@N=l+^eOJZ?9Xn4zK%+!9D1Zg^6Eb_%8Av?0V8C+()J#V<}>mlW-pL-<%{FsQ4_Xn=eHBYo)DXZLge&@4| z3r;saartOC!n7})Ygk@fLi}aGLu(MYstV{|%f5hh+Ks@Vo?zpbPPuR#PwV4EetkQ$ z?`NZlXO>3JU7&7{84*jO!DA(2U7NPkXBP z6X@G*u$-{?@Q`VK_@Cd!znpQr5ZSd;tBqx}6p|Z1E)h$Bu0fZHQA6ipQUi2ru4TK~ z^w*&Ia6J}b(8x|@$6|?v0~sc&NBS+U+P{Ba7X?PvHCIubeVg-5Rg?9bFkUrQ5lc~a ziOI-z+c(_d48z4Ehg8yMU)lM^(D0usTOCx>FRe`hi{J%Ln5bFocz5xVdis5gUXM_Fgz*-nkq6WhGOBf^4= z_YAD=b!)v*)EvmFn{Qeov5QpGLGIdvTPM zE`iW}F5tKopd}>hPHPu41sbK-r@>dGv_v14-_~h~{*x~9mnZk{m}yUf4SdWRcdqDJ zRLn&it?&|IKXlzD+P3N)@{v&Php1`?4`jhICr`xj%_Z|Om%k3k>391CY~!A2>U+Z3 zoFkDeO0`2e>dZsEcMh|W2S4MCG-Cw&d;HJxKmB-Ou&y@Gbbv0pLg8HXonRZ*YX`5` zjW}!lJjdaX6R)Eg(JJ!{O>{*-b#SoFFyw87+kcW)w%>hD1b1WQUQq{-xu!Z7U2`<6 z8Z|!DT`8@<<(M*hhGyoJ(5)Lo{#y zFUp~QB{rjag8#4m{O`8zx4PXZJowe-CcRRV!HB4HmI|S1q{-pI*aGjY|;?A5DUp`^$%busJx2LIyNKqMIN=lYej<9i42VoYgG#gqOPLi zz+s}nj4LqF6kjP${`pdN&0S)jMinM!dl^2@2k_7;+BR+YRQhOcA~gMdX7^5$LzHK= z8Dg#dHxe?7T`?VbH-{Z6ut^WPwGNm12(os{f60%W6bCJYiv|}*=LL=i59Fl@*8;(^ zLd%YE{o~z5SPyLTuVW^gGH>>>d}L3`M{3@YjkfGsXseVO_Vb}zENWdoVzFreU3jtD zV4H24P;q7aa-ehBm&_$n%H4*umeL9Nc;+d@wyz@D+%S(fUunyzI^QhW#b=X9OHc2H gL;uDfPS9G#>iJbktX;t>=C`!?y#%+1u0hm40Hf({W&i*H literal 15523 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 diff --git a/android/app/src/main/res/drawable/android12splash.xml b/android/app/src/main/res/drawable/android12splash.xml new file mode 100644 index 00000000..50314d13 --- /dev/null +++ b/android/app/src/main/res/drawable/android12splash.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_banner_foreground.xml b/android/app/src/main/res/drawable/ic_banner_foreground.xml new file mode 100644 index 00000000..61267503 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_banner_foreground.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..9f79c323 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..50314d13 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml new file mode 100644 index 00000000..a0a0dece --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index e7b046de..7353dbd1 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - - + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index e7b046de..7353dbd1 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - - + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 7f088461034dfeb725ebcf2d89a96de14ffcf3b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530 zcmVGE5OmT9T?z5K6d|1W2;Gp0k$7J!zKRvm5fwER$^Z?D^-LJ?H$p z%ls7V0Yy>D!otE=N=iyze+h965g8fzH2NuMuXYlKvD@uSFMbw@TSpd-kF@7{IjmE?gPDE zf01Drc58!ef)WxERPF8Ut+~0mr^JbwEOBvhNzKj8pQ8)nY*|@Zg~ej|d*kn$1f`~? z9`8fM#>OU!8zy0qSFX#|BcWYU31 zl?()xl9F+1u<)nU}5kxG@K0h5)z~j*$T4V?SqA%KSjf7LC}6=DTr~d zg7v#b;5)x~gDeFB;{q|{VB{%CL?kPSw$H)BfF4#XKfvKr@4=y@Y$9<;P7uq`u>AWs zC=0#-tkcfzTbmx)EGQ@#KoNuv-t~>K8%1y!uXrRS2#c8i@gs0r&3hiFq(b4@!t>yG zc+cZGLyx}5D<(+@qU~0c&*;H!>IH8n->~?T+$J}D|Z+Xa}VfxETPO>LLVqSnFXFm3+9}Kx6 z#xlM)b*^|N2jiUEd&2jGBqnJoBe)>eNv7S)@V zkfdOtx)TgR1Uao1u%d*|F@4*;4?nvJ3Xc||J3-l3L3r6+ymbkdN51yzHb4&Siy&?| z-R(ugsRfvo`TaPhWZ*5xfpVGon@yXBlRv>r(BiFDSo-ZUubf8e@Dj8<@|9o9!SEbn z;ym^wNg$KrizWVpn1i;;6%k&74kfF-TDpUuIS$IOs7?Fud}OkFUSD$wveaz^J<+b2aHLyRB+K^_PQ z@&FcupLoe*%@rSp!nG`LxdzgaND=IYG9%K`()g`~e#(6W)!*Mg5D>I8g9yrCFkIDW zG+NTZND-sac#XpKb0#Jx?#IW+KSw$sDKRrMGu74Ab)CY+h3f0;Kg1V1_;l^|Z2;)7PJ2aS!5=bM_E zn$fV@_BM0Jn^l^o8C+ZlPu|7F#RWx0MW@jfbrP2ed|b*xuGJd2GJ)tKu>6AP?(R0C grMw%jR=YL$7gm!pKw?<>TL1t607*qoM6N<$g5|Q`W&i*H diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..753e2691e555d35d0a13f7340de78a4f4c8a8498 GIT binary patch literal 824 zcmV-81IPSQNk&F60{{S5MM6+kP&iB^0{{RoN5ByfN97=rWLKG&NCGIF;9m<8ej?t~ z{X&G}Mv@dMhmPN;^W^-uiD#kGZ6w)F)M$-|MHobL`Dbt*a^cptt*V*_cc%&>A|eJA z&<%qkD1nd;Xu+N6cj4}0Hf*WgD3 zq!bA7qe*FKn2Lf35s=>wLm!8M|%Y)o&o}cgK z3h)i8pY=|F*V|+7wO0S$pU3)gTF2M>c7M5b(@}@nIJTKW8B{7l^LIH9_Ytest5L1x z|7Z=13#EvHhb!i&Bd`6j4g?M-c_ld-K~$*`er1J{ooO z?Ot;|T1VdD=ylIh^j{`3>=YOuO2Pq>rSI+=1-6oYQYnkxOR|^zB0xkUca!a7Zu8F15anUd6Oc z3OZ<7u}A4)vNF}c6tgXjfsTFT4g=WU9Oyitg@X&{E>T*rO>B2}`M@D9Y-8mmSft{k1%!iTEGJ+hrmYq^$hsV>-Tz?abcs~02>glwzhW#U1`J)pT&s_j;9uNTp z0*C+t00M{r0s%w-fn4$@M)R|d8V-|=W#r`Mc|KRtPq7o`<0B_ddY(so!__2$#@|$o Ca*O@| literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png deleted file mode 100644 index 767e978efb36f91705b3aab0e05ffa63c0579928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iuz4M-mPBqq(kza3J#_KdB~7$&(`Xg S*ewQ(Sq4v6KbLh*2~7Z@0g-9| diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index d353ce33c45d5e480e1c52ecd0e814641382b440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 zcmd6o`#Tc~7{^znr87-YN|{YW(`6Ng9L%z4Cgl<$Y|>bX`(VR~$H5#Q4P*McF^eBaBE`z0@J^5xM>shr zSzzd5C`$KN5D@4JtHOL0etp6Q1Ez;ESZ^^jr!Z2OJivmJdx{;mrYpPc39@VvK@(?} zD7SG5x(7s{3qc|M)7lu*up(wioc&OB&#^=fA|WKMtIO9{9%$_nw(z9eb~U<0MA*~O zyHV&k^NhUiytuRxt8*T_WFL=(DcI89H8n60&Z%p%agiQ{p|i@dPOssXG5Anh9JTwF z+!O91-EWQ#KfB4Qt!oZD*?WUR=Dyw$y3`0>daX8Pg4}d>#@gZgK^N2@nbc3~e zMq{-iEZ|}Qb*QmIywh81wH9h{aopz0Vc*R74}^E#yVc)ROO%Dyq9(cBmJJ%Vy_aTkDW|CUYiHRu)iF{GhCFmt;qQrXsf`y6NHgWek08`*2OVXk$OaNa%=o0Tg+P zS!6=)IabC*ZSGZ~4SO0xuS+Zk25LU#Nx|5<06lFb`Pxo^SUlXyAAb%l2ZHv;&blTnqyZ4;U zI#$GU?S~YVWyRp~pm5{9ylle?XC^@;7X*DO$xVrUisymr?g7WuqU@_YOX9rgjxui< zRE!?J?jq=Q2$W)b$~E!%i*pKz9uqw|Nw%%KP2v$&aF^xNm5;&d_c{EYme%_P(XfZ0 z)A}-+iD`x4#FlpJj9P1DKwLu^#u#dK2vmDa_*p91!!q+rS*`1748?WOi#=&&KE}|L zPY#i&Yayu1IAh_hrK_L@%h+{Or@!N2a>sDZ$9bfg;~PHB0yR<-6FzN*VUX}1EdC?) zAyn?O`s04$bjv~gHMD==uC0NyTGGL@1#FAMhCfkek{C_yn(mV*Ac@XLMyZnWTqjkY z1XIoP96k+q#3RicLlyAN@-*tV4u=(Ht~05xpZ}#2XWVYY_R_$qG69lE-Efzb=nwj0 z+e`l+TQxK!SW%tE?VSWB_NH?GmG5^Bpi#7eGsy%7r@d4@J)2=Q7eh?ysj7|>_Nls> zs%qhEjjT4>tu2V7h*MVyi*@G`+j!t_apBpbv3Hc%Defo?EdAG>~>bssvx80PQq3Pc76BALzOD> zbi;=<;{2l+{-%v>aw6IS~#PKpRT9!`1kz6-TR&BnUV+hyB}M zK07o+jFr@IY8(t!h&#*Bc2L-ZpH2KVQ2nDoKCM}WjAEM{Yxv%D0IxkbG#7O=`#*=J B9k~Di diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png deleted file mode 100644 index 358913b8beb249a41e7a0651546e0f8da9c746ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1711 zcmd6o`BxGM5Xb4^nrC5|x~LeQg;%LrmTroum=>+&?X%Rh)x=vN&&?wwO>)coT6>zd zna6sN_m+mD#BO=u0VtB13aBZd;<5C0|A^lE%*-$I!@T*v?+pI>H3xYaunYhIkat8P zT*USHw~&$)=XYO~Q~?0VI7fudP3$2q!wIQ|0SrVk#*)6&pH|UegMS7;&MiC)vqx8< zk&P~z=qpRm>r&j-mg=MMsFmuBO*_ZvFV+9}ezNwh#=)o3?7U9tD9V`Y;xcZ!w-k@o zs!~FBG(wEx-gD|M_Ll7>Tc?^9tygTlKiH*38o&S&itSc_zw9%gSbvXLz`&2kb)S;) zH({-_0*`SZbfFNb?XP|zVs->Q-PU~@-WAJwmyy%n-Y!iX$TNgf6q0){H)2+qG$Cg) z`j6V$Qz7B9xW3pX56;@);2oJZMA!r^%k!p*tFIZIn2IwuqFzq3C*{&lk(~QbaTrX6p}zjT zxCDa|JjiZhq)~dUMS5MQ0oAtzdOrLpE6Y|8@}{+wpI-FaFdahhmilNXQ0~!k$l3Mq z^<~ZrJm~hBMkcfeN(%cp5Mv&b0Dws;9Q#HjFdbfLh(@FJh~YEI2D!-H2>$X|L4h1` zpgJ2w^9%@JTf4i{7IjHr(caF^PC$NO*^lb#d+)hTr?vWH{oQ&mb#!)KuB)%--P%r# zISI~@3w@w8{R(9Duawo{P^15e2f{47Zut1~uL+^yYs;&KU z&W3l!=18YiPhy@s)M!Q@OX^qgZZ|IRZhF$)CAH4#PR$SGD@OoRwNW?~IY}pOFm{nz z79JGeaMHZsu5D;YNPO7A{$53O$-~NlXlQZpn@Q(B4Oe$};XK>)PE_7qxYSL`1I1nJ+ZZ0k^s{)VNY(02gT^$Gdj=q2g$zmTmQ#Y<;4o0R+Nq^%F zWmSlCn}jeqO`o;kKI7x#0_NP@T&Ix75G}IWA};tanauqMCF~((aqpjXwm={dM~67{ zXd;j&#q@t*;cL!@YQyOgbcq&oxKEJVaKQO+=B`QJl@C^QHyFd?)#>MB z?`v}{#@RN7PEJl;iOrIzbgW3gy_c1h)hzZoch%H0tJ}Z4yu2qjY-V(HRK7W7bO{Ay z_NJu7`}@xcV?><8p~ca9ly*bC#Wsyx6I0U-+|z(DtR`ZEytT5sz41CfFjnc#K5+9W ziA0jTdWIZxiOW?s_T|*Re7O{hNrl#E%HzXm<@!55JxIFUr6nEC2ui diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index ebc6c93d9205afa7c97bbc0d67fabd232424ba7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2639 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index d58ea11306c87acc6c3eb33b367df9521b3de533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 458efdab966d603bafe2487f100b529cbda73a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1762 zcmV<81|9i{P)RJSwhk5kNszaCDVy?kj#WFF58fY7{FPeymZC6 zEz|N63A+8Uzs!;imKaR|A3#~jUI7A?DNJ7WZQFg{-P&2&OK)#)(O+`=xc8iMf8ROZ zJ>Tn6ga?R3qAl6k+0tDAiA0i|n3$Ll8ymYNGBQ#a0x%d1`ul)!z%PJ-fr0+s-rhc) zPWM-!_oldZjERZal$V$H?mK|=^z>c8GnA<<2ojx;kbuXFQmJ$=o^v=H_S?5_4_*Rv zbaZsi&CSiPi2(8O@!QJE%1UK2Ss~6amzyF`;Iy=~U3i>2b*i?#y9z!^5ePl9Eq=d<77X@}Dv@1Oh?ikt0VwfEAS~6bgA=U0tKaVzIL6%SwP9J9fO> z1xQUzO$&_b>cADPuCA`h$;o;90AO@4*~FjMV)^V zYQqHNqEe~awOZ|%Mx)U_e$7n)+$v$Sxww`OEL-3Xg+>pIW~SL}wm8qb2>|>2r?6F~ zuRXp0VV)TwmcRcb(UN^0*T79lDJ?B6hOJiaJm(SsEUXBO)bTaq=>eNzo-Fi#MGU|H z2s%S~6##MU*s-z;7cQv4V$a}zmjLDEuU{`XeE4u)eSLj1EdaX2ys~2fyWv4V{gE>*0GR5n85tR`^2Ez4>{cUL z9_}I3GcOR~_H16pOi4*e6N|<16a*O3U|C!UT8MGt8d?NX(uJB1m|hXL{^F8335K@uw47(S;i=$qX(L6_^`PAcSI_4yCNm)<0y;odb- zkht6Rd)+n(iQK-2!JXd9C_qC)g95m^h`43uYHMp7_V3@Hi}`s^0S+(@>PAxh8h!Xe z_{Mk=lU>egOee<1#zui-{p07{1i-QmRz|S65U88YH&Atuo5^G{KYrdLJB?)>tc+lB z;b};(Bhb(SC)v=@kY?pIuk``U!;3_sqs`6DN{s%4PmvjDaf^$KKZXgt;_W(Ph33qe zGiU7pEG|5$S^>^HRz{nenm%W0vuceD%Q{#Y!Qw(7HDNA5oi8jbl!3+dI`dBWtWu&n z!P7t1)zx(g^Yi>sWCrdwm^vID9v=18mQ|g2WMo8(l@Tm1V17PWtAVrL*x0B5qguam zw_yV7NNHzDT%m4rY07*qoM6N<$ Ef*PA)E&u=k diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..3a4ac0865e834fdd7276edf91791cd4194941df8 GIT binary patch literal 1470 zcmV;v1wr~!Nk&Gt1pok7MM6+kP&iDg1pojqFTe{B_0X38&$Q+AON^eu#yiaIT-vs6 zT~2JC)jmovAUGNLJYdY?r8x_Q4OxI5}x!2-vb@}|uGwVuzoclUoWd*?6*?Nv9d%Aqr z1x>K?yVOHjl&b=)V5_-FaAQ)ggmJEMrco5I{3p7Ey@I zh7n3(g&-N*AO8VdD?VtYPDBwRSJFkQ2x+Aed`qkVZ8z^{F+@&7 zAr;~JJ@~^4>m)UPhV)$W>S0Fgf*=VLn)_ra6H&lVutXNFDb?Vc%J?W1HQb^q0>}O- z#$2{EGV8X(Y5xJxutcQmcSqi&VH7@O>p6mF4N_8edaTiXdZX>|&u)(;%)78e5-zJ1 zfp4r_itllZ%SkxqGr^G4HNXFE#lxFphp&U1gd1>sRlZ}y%-O$gx{ROvZbuXovgG^G zxGN-AKzgl6ur71`T8V4|p70%|)9{TgsEhdC`B){;hdx6l8L#<`TLrs5SLii9bJA}Z zd}+{pL!bEx>XDymEV~k_!sU(Ten`R(+4?gkq@zaRUV0Hq{cytHt^ zza6S%iWR&*yd+5Oj@c)jrIsuAEL^?TGV{6%J$%Y#OB0hWdyF|BLp}T7jTLcod7So? zHo%!Arb_$`3x~evDKz8IO-YZx-HONx;EYAKivG!wHHZhl7xT3 zom1}ZNZX6p^|=DQF}S!%du)RY00>e{)1TXM>~{ise!0La%Nao`;Fn%spS9!Y?-j2F(FO9P2S}TCm}f(2vWOAj?r`Au+JQ~?4|7ST7(S`FFbfckS4fv;21;A>L8c{ z-KdHf6ERoVXU{a1`o?>pDKbyf@36$onM*I@&PR+rA49!rtpiX0_cQ)-h_Qi7mKN}< zN#{L`4V>~D1Px2XRpq_`vVuYY@Ci~nI-yw+{;(8l44F277|dO|PeaH5K7dgWWPEM8 znltaQ3y$c9AT!t($pRQfVusoHEcq)`5qLupVco6rcdXfz#Q8|x`W_}o>wsF{6LUFV ztl`}3!tS-9jlLzoZH;6JGCA3>ED14@hFtOZ6GtAlmVdWv1qxFHS)Zn_Ke6ry_V{7l z6UQIENsvv7PO>qMWD^A09&1?1DXjBeV5`00t$X^2hBboh5|vuU+*wo0b34pWv*! zFH#^#n;_?%8oDn(xO*Dct&2j7(Ykf`^us$g^bq9o!8{k3d^tgoQ8nbYd9C@(^5kay z%ZG}9VjWdr$jfeVHI-f(!|AY^|cUX=ppnuy#ShS=CMQ`c~~j z*}vDw{YA;1y>@>oK~5C~FONqO;IPn75u{P^<%6}5M@yoRR)o-ne)Qm%6;Gw;Ukj&h Yk literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_banner.png b/android/app/src/main/res/mipmap-xhdpi/ic_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..f97689acc3e456cb98621ece1dc6536cbfdcb2ae GIT binary patch literal 3164 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 I!N4u?f5B3@tpET3 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 787d2dde8570b243e566ff7763b2265de5ccdfb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2001 zcmV;?2QK)DP)n>v2+BhcG76GFeJm3wRNB(l-8t7;#TMG)ZO`q!=a)3l`#Ak` ze&v78J@;`a;08;UED1?TNqH|ZF)<-BGBPR@5*Qd51XoGjDThZ`^m_g1z`%gIv$M0K zzP|oSZEfw@zP`RYt`$@9g`DM-mbeHnJBpzky#^v0N_SP+eWU zp|P>?&m2foQ`60TQ`4IV!L?ZDkEG+yQwx3~{nVC5ji-mrAy`6xHii(n~tSnObEVFax z&RsB@NYm5PvuOH>gGmBV+98$iIks=#o~cr)dSGfVeZ0&jAUZmFIm-EXLK6=A_wO&P ztE;=v+S=NM-rEGg)Kg9xT+f5*`1tYT-^RzsCt9smnh^jGt~R2s6Yk)ILTqfTJT*0S zb5&K<8Ad>EZtfSjgAy93&KUt{cwybTb?@R1NNB{x#U(^UM1)cAL&)#~7DUO($te`f z{Ry}u5h`mTR8&+{B-9f(j_1fgUy*^9UX5h}3mgHSir={W&{$Dl~% zV}=O83=x1CA^DBX0QwWS+xA!q?iy6L+J8`)#_>BdV4RsibVjKFkbyx)N}4nYbS|NA@` zzWkNf(~Tp9DM0l*Cn_HyNC8}_e1tFsa0uQBKs}oY*s!8;8^7SixWjP@uLKx}Za*5g zx!VeWNDSt0sQ`ZS!f}T+ExZt5HR{0VjUT|n&eKowJN#)H>31wZJi|ZR1D8+vv;dTD z^nI6rrtuiC=!P6@;CR2Fh%LZ0+y`jWgzFzB7K0aKKAu^i)8MlLOvC-mfz-s^Hn;Z; zcV4w^^-xgyw1)81Hd< z6T2Pb-M@kbso$|03+DxR0<-qMSNEF^K?>j!L;z;63!tqQV4WBPl7N?Shk^yH0u1UK zVC3o%U>;S2+3}ykL;a6%hJytx0?gz8!hZcxpzptITc+=?CjvYTZ7~9E$0;z@`V*jG zUwqO!9tvW&m~;aV_fhYLFg>gb&@_Dyv~87a7t32%7cky)p6w!e4f`p`1J}^=8SFz5 zLWc;zj1LIlcS_@o0Q2Y|bHalPT3}m-PQ)7qn=wY^c{n2gjSb!VISoi;b0;mc8Z;QA z@;saozyOb)E!umyqwp%+5+Fc`0L%~pnBk59kpu*<-wXU+S&rT?i)fP$j3_Ix-^u7n zI3qwBych(&Za+~+P{d|1L|q&2wm;=<>~$*(Qd`y3akqdi7DVe z|4mlQl*oda7h8zL5-@8~ENkUG51eTOgbERW86p5PL;z-x05c#WaABr&I-OP~lL_9UUsB`>9YUN~)`?i2yHB zTwKgd9n1)*sj0buCZI=ipks|nAi!^bC5+zN1T;4{-^|a?--{-o#}^*|IdI^>KA3H6&sm!^1W{B}bT|yMW5QOvf`3Q%jplHK_f`Za>=g$3xCZJ!rawRvO@#tf;x3^!* z%*@P!IlpzPZKfTDZfR+`6&DxBOhBIpS+#1F9QeYu9(bW)#W%rYD+SE?ryuurro!oY z09XL1s;a6+uN5m+gl*ciDH$FwtVNR%hlYkOLQ}HB&7`b_?^{?527`8BU|_JjySq!N jR5rk@QHPFjT`k~0G5^m5OwCPI00000NkvXXu0mjfrs$+c diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..ebb8bb0ac42682023d8cee178bbedfae3ce46421 GIT binary patch literal 1072 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index b9c7dcb0bcbbb9a47d81bcc1c6c68cde98a0cfc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3569 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 r9v$BojO>W_& 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 MZEj~)dBQW{KNcF!5C8xG diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf57ad3175be8381cece4fe1b609d4353116efaf GIT binary patch literal 1610 zcmV-Q2DSN8Nk&FO1^@t8MM6+kP&iCB1^@srkH8}k_0XF3&$J!=Z(`fdH^^1)@(G+= z+O}<*W81cE+laL_HMhZDXYJj)*1yLyJ+^1p!PwrbPQ@78vD3p2{^MP%4sRT|ZR1G# z|3hbc-@Vxq>3@IN6CiG*b|R!rgxEv~3_mK=he9Vp7$s1Qni}dOQ-u%{A@ll5 zogFpVNN6N_B2Nnxg zBrLepTbH7gQ^8QFmu-=-C>AqYEF9WNrJO46P;rM!I#de5;PmOrp$yZX5sMj3gizQb zVNofkIyTXCsADxIS6a=J@oNzoWir%z zQO_Rz(B=x;`_`dSxGYc?hu`lF1JC~Dy(1xvI|%EUkBwcW)Ws^^6F(8RF+>aiqFu1Q z|M9s{)O5ob(@B%OvU zH&(oQ`CDjIq~nWWUzVM>N%guf){Tu69P#9_zh*7^XGGrHh;NY{H-XpGd z_nGL}Bf+t?S-tKH(hk9A4eNrt+&zyHPYjDJJ8UzmwZD@FfY=;*->m%POWFWV|N|ByQ`{J!@wq)zt@ zY4gE&lbup)v>$Fo5l>wH7TRdpRHgZgbaKEW2cEs^wBL|!4mh?ptI&iHXY6+lpc`5C zKl*9(m`~wXrbOL%vdy}{?U6q?qGAadFz?xZoAu#`y{97;n-Grh?u`o%Y`U!3>lhXl z)ptI07e{QpEiz5hbcD1U?r_9MZf1}9)Qt~14>x;u|ouKe<8T=0}@Kiqmm_mE}F z1e3U#N7gpY`d3Z+H@bJ&XV^?+R0e$e*S5e9J5?N^=D0Z)?I5%^dKqwq?csBN`27aK zv{eNn@0EhUDh$;V)Q@k2xCFmFN&lxHv|5EA^d3O0AY=iQ3`^~NYgY+eoGLL^IY9p$ zp!B;B7?g&byN^tF+om{F0u{RwxG-fPcJJ;|kjp^khYWzC?9g^$>Raq|M4p*HUO6cJ z?<~;uWp2on3;?16Pzq4jOMmf#lxLbC$CJ2mx}lK`lW0(7(HL zhGtAkAP}5^U@#CEryQH6N5(z6KP%J$JPcvHct-|oJ z^ELbF{xnW^>*v{bTOSC9a``_1mFb`ppf4j#^^V~29tLj?Py2t0c5s$ToS7Ck_%l`F zH0|JswEw%Mf7319lZ-I^+$XF50f;0E@qr(p5TGUtbOH1xfWZVXoDY_Z%0?-I6U7Nm z7QA9R#!Eyo^`4FJ@lj!yS4+K*Q5LoL0suMwLCg@ED{Q&(5U=YFhSKhoge7*Io zWFzFW7C=5g89*&SQzGa{4qa)W*YN*H1nq&PAHQooD+O!$EI>Ly_PYQj0OhLzs^)|n z`kXndU%VTjAadrjQm~iu+2wwKtVn>I$Nw?(#~+Ve=wJSrY5&312Z*)r>mdKI;Vst0PoY{$N&HU diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 48afe2e6d259cd5494526cbb523f1cfb8a2c6d6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3387 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png deleted file mode 100644 index 42cf3b85f72b3a5f9636099aea02a9e2c00aed0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3258 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 05fec506017cd2c3d0a43425a6b13fc5bf84b737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4102 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 uIqTO9P7FH{SB)>%Tz3Bz{BDbP0l+XkK9Kog! diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_banner.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_banner.png deleted file mode 100644 index f63fa5b9f48e7bb7bdf9cb4a55e8531a7ed5a49b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5172 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 ZBg^L*qYqEq83n+{+Wdf7)?WO{{{l;xV(b6_ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index ca4fdde1ce94c9d64d5411343655ce9c4397ba9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4738 zcmeHL>pPU|+eQ|NQmvyX`$bt4qq50vkR?ra3)y6dQcbpl?8j_c7Of&OLiYV6Bl{S8 z!z`BFL@}}(%}gbY-53Ug+5Vp15Mr zitkg``WOFl@Xu<1J@EBh^E@b@)_9w|DAbO*b3O)CGsmAHSn&l^f5G@NdKQ1j-iyK; z0!c`f*EQk|+V95BVeiu{w<=bv`>Ak;#?1f3+!;JuIDs13&0T(zhup{yA^SnPj~J+X zG@X_+X&{rcrn;)P@1D=Jm6zcgjG30o-axJ+vN*%hy|J3C)||ZKha3>H(x=7uMOD47tKr;N zNayi)b5TtbwB83!L`>1oAf2CYm{o5lr&Y*xnq_MVCV=cNM2sMIAnTy^4U<+u9c3At zJVCoe*9ahj3sK&Jn|USY`GG2WlM~q0ATJ7H5h^J+6Cxm`9SAQnS=Pk4+-n2R>G|7V zNs+e*s6Sgoj;0*D0L}BtIrapCkVO_^#1UVIS_-nL)B2%mzNVT?y)ocR{DMPj6r(5e zHR}r!uL!<4p4M?e$aewfEcUTzUV0XCx0Rj;!E*7f#5ozo^+PJ7lTOp`!a5^wAw)av zu^M|~K2RSdvxu`&p$1-W)XIKVPLPhZBVruy1l_zVeB=c4k0q_UJOfC9AmmqN z#FN2mm99p8R*|&lAo*$#I*tMjfbUn_x;dDsVju*#65X^5y6N{lDxSx51x6^<%E5l9E^>cQG|7hlGD)wj17H(6?dcnBYqhBx3E#w1?dkJ zoqH2W+3J%jF^Rn9G^jQec7r!YvO=*g(9y!pVx^XFM}*qfed5U$6K0i3M4ZAC0r~q4 z(&C}KPi2wJt$sT__NI}Kw4Dn#8Abk-Hlp?1bP*pGtN7C$yD^c#u|{5q^+b#YR^LGC zGF84Rh$pKW!rbP|mENgtzall3C6j6F)}+nx=1hLje9L@zJgc(s;Z&Z}yVRPqOeZ*p zvNBg9{41`+kKHfg_w5UUYlwh~!2pD$E-=!&V|pva8F&AuOPkKf*ZJ-=Nqd1UED;sn z2KW|3_`AbRu{BAkKVS z?|p4~!d=+3zGPws5PlxF`ZPPYgq8^Niy2XwFcPkOFPY!=w2i61dU!q)w#xb)J1i*|%NTjNLT`?~%$?Rxl4YRO0~#)9 zE4xi}fBnEwGArPX4ohinhbTzEPX(+SdwArJG@6DnN-cwCRH$+KK*z1O$|!aXFWFD4 zM9mI|y`7Wxat7{FKW5L?;IP4N8bbfX{dxSxK`($lHkXou{wA$%LwqsUtK)=oQliJl zP|V40*L|MjjjyE-bzf9x>cJbsVi+qus{mp5DYio{5>nS;PNC0BIjMMGaNzDL`uTVw zj8k5Bj;Y5Qn`{=Y$ctFDYN9E4`1MU36FO01i#lR3w0v)Anx-JSw$yh4DqO?vq_B2SQibb z+{AaL+J+_E6jskV0pI%6iu+MpZ(Vd+uHMo@sh*3ETYa6iJ*j;ceZ)X`mG~l47o=C? zjOe>j<%kg5vm=V_hx{Y#zj-e#Xc7>CNA@TSwOR|q|x*VmJ{Co8*#VwX)D!|AzSEY$5JF4GEtX8a6H(VouNbxGto(X8uB z>9gF`FOhR}G(+V3e85;832a-sS9h`v5Ss15%v%4hY9&2qRcPl$URz-QL~+mJDAF2r z*nmwkf<5t#5Dt%)UOhh?4&TnYtpYBiM@mQ`voTo;6|oBXYQZ!smFAdBS4jV{)$suy9CD;&Nue|MmuVsRNKXGED+d&~(-D`mV~|k~Fim zi^11KvYnz{PYMFFFB6mHzR>?eev13UV&ukFZebPa@nt|_E=I^GnqEk7WIhjJw9qHP zZS3Fitzyz(@xY!KLoXA(LTW7aFIT~P2Y$51n1f`xAZqV*AHx?#`2%qt;+D-h{sMl) zfHPd~YNVMr8s3xO>#)7L_I9~~Aiao?Oec`1yuqI+rc4tRs}>>O@yopQl}wQJYSx;$ zroROtLD;J^`u5CKS!rOuHF2i)wMz4RxWBui5vM^I!*{_;@W;iIK%$y17JvCp8j9_v<%q#a+klY z>p$u)Do8Ialb&fo^fM&4j*DyJGjf-0IXjABPmaapYfTiTSz5D>7+g}KyIBU(B5f;B z%t4SvTm7InU|qOc*}J}&fF$x!UpG9zD7m}PGR-G;y2mOmj*(icw6m3O-!hrree3Q@ zjQtbUh*%e3ET&?P_+xea44e0+?A%lR1gmL9TtvaO$=A4nT=Ufrt`Q=%R4drRad$7^Rtv9M)zNDFc|jAJLBY%Q6-$QP5^a+Q#> zzVf#imX_t`8HQsIoSSC#&}^F^VLHcMfjUU z>PjY#a1&k=U$vR#tIQbpsJB4zXF6=7B5O)GY;LX9b!vNpOZbT~-+3GfI5(3<#)&3xE&H|N(7+Xa~*_-t`=eW-9Y6a8kb=YC`jPnFvTYZ8Y( zMZQs27+itGS*?F8Zol{run}H&L`q=VSkLN^uW~&sCT#D|?3L~k&H=zgY#dVSX5}%c z-2tm{fH)pIbNGKQ-u&T zS@5LT1Qj?r8pOg7P6deluJtee<=`LGz!uu@Lw`#4#j4N1za=q9bI*P5{Vexr~KgtBBs9orCt9p1GlIeH}g)n5i zbhA*hcX+DmR5@bsYSGodQtiSqwI`>p%yo-3b}zeWT2VGQt=wfp?^b6{lJwLA$vci3 z3+@TFv!i>ffUu)_NYEb!|Hi*P_(vG9>-zHL3*@k-W>YbdxSGyeio3t>h=>z1*}$wv z^<*XI7ZnxtVRUkSZpRM7Jw1)J&fIxD`@6E4;1&d<*~`>@aGjJGC=^S*Id+qTM-hy6xKJELpYt~D7O8NmvR zZb+spLko&>=ma0Ch#1rkBk!O5&$)K&uKK%+BO+er^1Y~KhD5kRr%aQYnlNyUK-I@s zuyPrR#7XCJx#n~RBl=l4Gw*4_{$fSQ)o5WtYpIuMQcGRkMm}%pCvVQ|iZ0S_;sc$2 zIx{P)mDJeCm!(`^n|rY$otA_f{dOKO-?Ck8sg4s$xMrAM!+wuJvgTY8#EX_*_7k*`Dd!ti?`=MT)A15aj zeECgdHjj&<3iCD({b>$P{rUE{-`@81^(B92{gA~}zex8`Ur zmoM8CY{Dw!WaJM90Obh>%$ip?%4u&ncmWvzoRqg(3$OB!%u@N&&D{0bw={o>s!0m= zTv{(X0xpqA&^nr$B0o$V`xw&*PkWU0@S$X)u}!i%sgBWc*9503y&oHk5%%`><^uDW zbz??vF44!7AiE)cFH1{HQ8#aX%CawBZ=g(<@4yjbE;a>E^3U` z%gV|ka0Ws7w8YU#V|pFwqBlIM3|#QjTe118Tk%Ivf>U=fn9Rgq$zCm0z>xlAXH`~K z;{Ao(h2VgI`Eqac^V;1I)5p0V#>dC+pFMlF+QsGXTt8|cXPRnzHsW({wMZl?A~X(m zaBnn6OPm?{6{a%s{vHSfBCjZ%IX*cVkJ7BZN8mq$+Snv+#k0iIr?a!O`K6wD{?rBf z$~bv$ULxkB2QUf%xu0iZFqn&HLZ<}mQ#U2v=s3eg@1YnK9au~FXxU|a@SQs?B`@Fj zlnN;eMe%o+8AOXalMSo3wbS-&Rp<|?2{0D!-tye)>gt#~-0M4^+pN~aM+vLJzRjxg?QK5y4`0BU*u^5x4y0DR_$l+qgg zsJjjw0H=<+dwP1-B}qgvL`37-{B^UjqD^hDJ92xjoCj!f5QReFiGXwrV3bWgWaKw$ z?o8B*E*G3(k|Wst%Oh3N@0Cs%AfXC$I=%1x`}fUau^3IPtPC2!sOTcYoS01Ji>{m8 zcir9HTtXvg+ogTR;2HuEKN`mTI5H9eHw4(Wep5!CgiJ`-`qPl7>-U@0Z)- z^Sr7mI8l@IF7*YuSecIe=~q8#w0IP9OJ7v;WPtJys8ph?h-GO?u0FH@*uo_c!`S#l0rO;Ot9Y&1EF;A3n_Oo4 z=*Wnx1FZ=*H9X9n<`IJX`a;JhCgMUc1+*1rb4-u@nyg7G_Sav#dwN(D09dp#b*+W4 z4Zp7Rg9l{fGqSP2ssayWlyX0gOigWd3#UlM#l@x93$TFE`I+Ep+lj5-N2O#X? zAVwwZn;O(9fc_Gmx&wChK%NW0E=#c@B#=NPhQKweRq!#>aU2I+C+8^goZ#kL4GnGW zBr%|w3!`B}Y>G12>0-O(kBi=8!kwLgT3X5;3ToNX-;3-}glvp__;7cvOWk*i{O;X5 zeu<}x$kiCcHbM?Mn&nvqN<^C+O$g+*4Ru9hCS_0&QVv)*y)9_8j0Ak_4W#axkps__ z+va}RD zNJ&X4*r#p%dUGNWFX^gW!xd4Y=pQ~1T+H!x`?XR=4nW^&2KDBToFos7G!n`|%69Fb z-H!ivSRxLO*9VWO?>lU{F5!LU9S&uE7#-cnO@M7TFS1JpC$T4Xih2>1ymVwyj2~J^ zQnBH^w#_5=HHBV3}Nx zmqSmTwjCgoKA!=Rwe7{cO#pO&-{E>Va9b*|{j#!h-8UVTGxTlBl zJl=0@yfM*mGp9Aa2EhMPLqo&FNph2`_V%75F5AgEOaNSY{MAW*ECW?x zox@9epmf5-s@&HDf7|~35F@~Ey;&C`2!z#C z^*+YHAG(uG@-U_A>MPOIs!5tTMjxHmqtYcfcpmx+;lCJqpHzUKm^445u&^j&H8q?i zEdOCf(T}Lb*f9HW1ulL82GSgsj{LSpq5eyU+WkGk?IYRhugz8!Bqlk_j|bK=_6Ecc zSP>jOgs!fxNOSX<9A95wiL|sdqlt+LBYS&$I=R5Z+b^vKV>yKA`g=M$I!x5n)#-CO z!Xu#32q6NK(@GRrQJna7`TOMfxCavx6PvMtfo$1-{{{Nf6STJK>*+mhDl6N*mEP~# zb+%_n%TQ0q$6TC$vNLnSN<{QBWZzl-*|WbV3lWFAb2D_8nLMj@j90WRZgY(pd6c+N zY3WNwRA)J}q+3ec)0X1mbyA_{ifTD>&mP2ZLcc(=A-Rj)Hq-oh6VU5w+ z{=B^J+aG_8V9%v0eK&Yytw#7I-;ca+;c&HVktY zM)*S?L0*-V@RJ!Gi_-9F9b&Z&C>cJOFHUgtqOAG8%iq3Dl`4{znfXL3_g?V!V*87i zVq#)iZ6ObCxP{j1n!^~Fm^L*s#O%t_)6?s+va*Phdu^8|?%%1TnJ3H)x+y>qihXvx zJ-yuIw|D7tb$P+aLb1l^7A&PB10!d+jq_7cQQ5C?8ndsSb`hTq^vEkJDw4Dxc*9@( zrMvqnj>K09T%DJSByO(W`E&@ZXUn^~x|4ds1e?ytU~>7n%xAC7!Y2D;DAuguKpF_E=kA4nhU=~9D?u@RluiM_s zjWegeyJ;ZXOX(Sy9O?E`H!Qn^}n2Ah&jM znzoy3^eMH`m!&_KDM-R5-V6RiKG@UKbJu_0x{ux}h&p8L8*9-fJ6|dk9FJ&7f0}Sq zWMt%jVul#Q;kROTeJsYtll+w;wHyKho5r(YUzGUCu{nQ8NJtWQcXvN8E}R{}3GZ83 zE!ZCX9BjI&^;W8DVL={Viy*zaL@y!1(yFSeC;=2kbJf$+^H-zqPNurQzdzshdwy?c zTqOdlP2+kxzOcT$Tuqhm{_|-2qbiMpf&#z0GBWXp2M1)Xj*gDqQN~bLG<~$^Rsd~;c-!`LwVXAtz;s(1+STF7e@wNt zwG?aLvir@O{i~h_1)W>Y23p>?A;*=JkXRFKZVe9)??Ffc3@B>Mgm2w)JHcUIAi~4L z%N*U@=zdIu>kz}*-naOIT1qR?e~(z4P{3V}1zlI+;^H!Yv68H95A;Z4i7tE&((>$N zH!U&IldAiI{Rdb_L{CpYG&}oni-hK;hJdheOT0dr5v=)S{+SV|z~0S?@|hVaAFB1Q z-@dus-oC!p(A3oQb9L2bi{-I+8xecZK3mXlc5z8bUNXb+>yIBVv%S~K?mOP!XUIxU z*2gNs=wLDI^7Edc{WeGwtX^Unr>?dFe|(7&|NQy0zD>52=E;SVB(}Qx;Pxq{-0KH~ z>z^etqM<(R9-wwJs_h4VpC3(HiElJZmLt%q@^W$)3?=8`#v?#|v{Y49ODigJ6EZRa zB0u~cwTCbqOSSVpzX=u`TZ?4`@}VM^hHV==IL*kh(#`wq-fs*-6dc;5^C>&?yieO$ zkbe;k1`F{|VYoak6kbuf8SaTuZ31_uXsWN5`nk5YQ25(2g$dHKqOg2!Tb#_n@90f@ zOc<9}Hfv{RM_JrRX@?k|oOH;SY+m7^$Cxd?sFn=E<}ira_9)-Eb4RKcgOT}z*7y4flM3@NBjG8 z?JN@e^WgdA*_!i8utiwli;rWp*RQYea&xn!tof`yfz%`k3J3_0B%GbY&k7h>S+mVd zO#Jn81p8O)A>$iL{R}pHEz!*%R5_Yo#l^)zwKVoDg;KtLA`bud2DD?dJ~&ksEiJ9|BQr5(2v7Oz z=xBAg?IbNhuw#c2#~l$7cQk071|j;SX^45POB6~>Z1d)p4>4R7&78}9^XAPM2GNf4 zPlkUcVPcGsNI5ntE7K1c4we3w>>=yY&o9pz_c_m_YbF!$5Wd5x`1l2APXaIW2D60A ztAT+5S$Lukh2jK0X7L66DT@VF)r)6gW>Nw`eym$$Y)e^bBq$`w-cH_+O8 z@zF*hbqb?RDFk($J#tA)jOusQTJ;W94WqKHt?l9WQe(j{cP(9DZ9nZqqr1dXESWHj zm?f>by%FryDV-btqtM@E!55$dHM1mKKTCa$wu77=N@mFT?Q%_n8%L!@3g|rdBywzw z=wOXdSrw76w6ydBA~;D)Pw$5(ePxGD6*RszGFD)NPRFv2tZR8n7Z1(M@27Exw7e-5ZC@HTg+KdVVK3Q@Oz>*8EZlcT19D-&xI5J(1DfeebSS@X>d_lf8wC zt@U~>WToRset@*J^vXs>2QicL<+BW>XHV_>&?J6&(9b57*6ot4tdn`rnopnZzz7Jw zY-&)YPPJ=PU=-hwtQXKyXW72q$!ZKx3_a9CML?@%~4|?pns0G z9OPW4Dn(QHZwzZKmka6mg;aO64kYnPNJzlmzI}_Zb8xsidbd#L40chus+G>JkGN*^ zp%>YBjzzrX7PzBKE{0nSk~KJS{OebSX1NeSwuj)QL4RNT{_o$JY``8KA8w5OG=6^a z0H%>6I~`kgtS1~EHhFpc1ZH+eBKXf?6qtH{EidMnk^8;8x&Hbh(P&&eXy(%>JBXs9 zqJ^YnUDRO@7u9x^ou+B_i6iDi@6*DbRj`!72SC^SSo>oUN$cLQ6 z|JYGWhZ+08Jf7BJfA(E1&=3ggRlWI0csn+Vgxd}bes-{Ll$7zm4%NAuNucRBGK;4D zm-+mCl;|@1_7C?i+Qt)wM$)b`{AfkBtTjLb57%v;I6KR{3Q-NG2SvSnL_TsJWaITW z3rEaUs1{Lje7O0&v=xY-sghFH~wpY|QSbjO_xx;6r+j?gxGSze()dmT?)5^vD zpPr>tn9~Myf;Tm#6g-H18ZZdyd`ZdvT01E)%*Zy6f!)r^aaH#t^&c+=7cc93p4EJz z!mYa$II%I<6W6KZWXRtO)s#6!I#4>7lgBMR5XX&zmX-^2P||q(&&_K(ew<7wV~h7Y zIrw)HZ9%fVE>7Tbx3RI&F*Q9iu*F_p{GCaR*gM32x@<*OH-^-~SzB-f!^L04;t^_e;mQAotA2Yxydt7>QQ zyHte*<=^TU7lWIh8qkdNmz~=V`^(YrnFnGFiH-x5d@OAtAP4#V>eCgzFH-GhOQ2;* zP~I5_{}r&7?RVcNC-43H_ajYy?##1c281K)6q!wm?fpVw=hjsw|4d4EjAcupX-Dpn z2brGlx_^dJf*_NTk&y(sjEs!=tXc|ddv%~r!0k5!L%L$X+ysgW2@ChWHDe4gtI_5c zkncktu2kegbG;~a{@yfUublUVZlCbNkjSoV%L!Nq){{yU8&l))1s_W!=m^{T?@+0R zr(Mat-aH_-&2eADY?l|w1@qp)e?Lo$= z6Q3}&bIx&h?DbMk5(GI+_zA)dW5EcEii>Y`+?JG->=q73w?R=@>KDDXN!%vzPvPy> zm5jjV>i76K!wJ5(H4Z)S3hgns4r|PhCdb8^6NX|*Tx}s;!G_8-j&iqJKd?Af4JtW1 zkUV+u&P1lGR3P6~p@J20lz#1snRgNr`N9Eu!-RMfDu#s=+X(J&+fXl_R}t>BF9a^> zbNcHgka{o3@lVdivkH8KJFnyPD1ICI8+(VX7#JFQ zGRm^;k+^XhaFY6sJAxN&Yiep_Z48WzCXTkJY3k@2xLjzlk&jS~$z?`O`83?H2lCns zK0ZG2o@9x<&3(?e-II0W2Y$rilO+`u6-vTwin9tU7GpBL~wQ|2-}y{PkMCV*>K9M^Kq|!w*q z7)~lmI@Z}RAVa1?nN4F4gJIxpuXQXfL$caepPJh+9L58=kaNShEATD8z#k;yNL=|a z96cl^d+eRN?&XfsDDoF>0{=mCET`24ANP2Mk_zk z&^j2MY-KAY1fPIFW0Ku=LCLeA z5Srv(gEJo}oZ!Cy+3!__!`L1O@E~D7e*7RHA|m=|E{j_!P?N({PBes>|wnJrzFVL@mvI<4?b2`d*MGncf$gG@!D4x)afLrhJVUGTIo$5 z66cbYL$_E(oMFpp@NL(;^|qNl<^;oc)0e zab;eux9iHKVuUNbt5)d88>(%$Kf0_Db1qJ%g&N&@X=DN4=p7mw`cPgT%&*zw-0L|8 zj6F5%oDBchnDO|E=M_=e43Xu<_8nMT+`g)qa2PJE#@^PJCE%!Yk{p})s@h?Q4HWB9 zzA}9%T8@yAa9YxRK1i5wnE8b06sbUt*5T39)4R5Cc*czMSRc+CI6Xa;wy?0Ed16OR zJl?tdYtwHBe`IzZ?_U6wVxge)WeCZ*>t)aPX_Oegsj98LU~FuB(v9NUaZ9`osuhN$ zBIudr2urGF9i899-+^qSQu59I+t&vzgSn&B@Ww(0s?E(c}z~?oeNOk+yKFcIKb(yat7H{LG@$h~;o! zc_%Jmn6dbv$#tf7JT7iy_+J?bM@2==07Ny>W1RV@pyV;}0B;vWSZA9$`2NjdAv;?0sYdjXj zJszRlXQR_Ad(A=ODAD;27)d|hhwl;f!GC>ez4cts=r*x475yO8o5pLb6(t1{Lx>`q zz4?|XKx49ZgE=R(egPbDHZn9M0b%a zetsu1Q!!N?TfmBv6LND!j_L9qF++ZJQp)2#w>_kbw!7JYA_z6Bf9N&`2v}?C3QH8Z z2MDxgQ_bP-QQnvPIy}STAfH(@J0i@?P_0YKNB-^7LT0vBN#^< z%iX6GOp6ZEbVK4x>`hI6VnH33Q25YhNfR~sr#F#u*bm=tpVo~fts7{%23w2XrF+uM zfv?I@t2u0fv{|8u`V!(^s$s_fS-T%d@`5Sn_b(Iu?- z0Y~C~o11divD-me#T5(Uhe71amm*Wm0S6+ZmM_o=se7$gA!qVe=Lh&lex8YV$gASw zVvFVO*etktn6_;LMJNXnwD8@n$%^>&RVI)@sjpwJS;T*GE-)2JD=C}gqWYr5L4_hj zo0*w~e|)HH4{OsYCXH0c12(zIwuLT~<5qvVh?R+n3Ex3w)&K$xa^m^s_O|Tk*jTcQ zs3PudOiWC!q}%Lix2${;7d?#Q{QO+uANZNZsdcz~5fE%oN6-_TfCt}$=B@dvFByLGq6jM$W za<-Zt3c_xG>Y5V30QUhcng=)t8P4i0=9AO42NXy7LZ4*i4l+XmF;^gG)cLf{> z1a#f<$vC(W4(xf?z64tqdie;7Yz2@zn185nZXM(HeTQaXUTO6Al9$BuKx5<{m2+=h%I&Pbro7)*L z(Vs>j5Kmfuv0=pgW#{#^wTGg3cz9B@EQ-b<#0&`9Xa4^6xl*1#VgQ?<{(f?UPafdf zt>tBL9zj9D+|6gYZjk$0THmYyCb9$+w|5wDnY`s3`07e)RY(Plh{ATnQyzewsn+LL z8yjQqwWk5&47r(HqC6Q)(g!O$7luNipDW{7inelU7$J#iX})D8B~An=MQQSvD)%rQ zUOM-30anWZz*Db$JBiK=iR}TX0oIw32{E_tj*LiGWUGLdm+mg#-SsH z3OPR=sZ^5Ec<^$ZnJs>Df7&5ea}Gc?RhE;lk04*7Xn3DmJbd`pI@)6#P_>UN?C{jZ z-elg?`T6-|YYRs|vK#-k+e7Y$gj~j6VgBv>EFRy;t|bf)1d|&RCAb1=a#hO5`VJ(& zrsl9cfm88b*wV0;gTq>H{Sj618X&!E!-tVz!mFip#gbMsLv;1^#}VKg!ySzrJUsTrYC_<34B-k4kdfKhStd~R%{Ux~Jjl)wg*L{*!zx2bJn97b z`T5rcV&gg(aIpX@!T?g1Jld;?eoI8Uz}r0d=1IFqfH-Q0dhfi7W;BK$k@8Fdk;) zvNK)nFat)5@d7AjQ8&4N(A}{B;GvO)h36aHvCIX=6_yvY?k`=_ zH8Aids$&Z%&;uV)Uw_KxLfv8X;o;fEN4tKyp$u_e0|3h5b+_yYkWSz~aGR-d(zkVT z+PE!dD_r#Pqn?}T z8(LcM1caG|;w3XRb>b_DGeD@BPC>^EMqY$(tVG~j+uqBq4d*HTy+%V*=U``NVbHy# z;iO9js|mfVoSvRe*CjzBFGgo(W;%z4+|vpQmQ8T>S0WtcK+7F`x2F;hXWUy^iz_PD z0NaN7{4J1Q15zMc(;y}QT_UNV)5J0X*evW`@6fK}7j3JvFt& z#YN=S6K5=asHeLjuoBk+FOCLbmNifCB5t*W9j^&+IUveKF|>|Y$;0%gz&sOwZK8R!+hR%%ya z!u0;~&_=h8rv;Uj`)aznBMS*!Q<=JHY7c2S5eW%>eSMJt6=o~0b`9C|Tf;kfm`}fx zj?#qeI6ZpwXdWoztxE5RZVXxA6v&{8%*6S1;~M+!>R}o;utkJ)Zia@2W5DljZf$N# zRgN11XWCv_L>ehZ2>|nM2f>#A+0MU6Q8MO;G(2agDZTX!elZgWp0z?$m9*}EP_PdB E9}PceQ~&?~ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1834695636faca6b9636827520f0c342e96ab653 GIT binary patch literal 7238 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 Unf|de-K;YmZKo5pFV=zq%wg3PC literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml index ba4b2aee..0e45e48d 100644 --- a/android/app/src/main/res/values-night-v31/styles.xml +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -6,7 +6,7 @@ false false shortEdges - #ffffff + #F0F3FA @drawable/android12splash RZ(PrP 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 sQsMuUH~+B8{$o^9aM=H+InYh)FZJ;M1& diff --git a/assets/images/source/ic_launcher_round.png b/assets/images/source/ic_launcher_round.png deleted file mode 100644 index 698bc269b6423d0c8197e447f42552db837a539d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66640 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 diff --git a/assets/images/source/ic_launcher_splash.png b/assets/images/source/ic_launcher_splash.png deleted file mode 100644 index dbab6cf8b7391be19cb8117d3ca4e56918fbf4d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13889 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
    nKncn0L;YE*JIR|+;*NLBzD!~jn{ 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

    L1!S#tuTB_CKJqjRpPNAmFb1W-%N%a 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 diff --git a/libcore b/libcore index a1314d84..5b3fc37a 160000 --- a/libcore +++ b/libcore @@ -1 +1 @@ -Subproject commit a1314d84a9f3ded7ee4ad7afc0e771574c8ce352 +Subproject commit 5b3fc37aedc6d0883f807df97f5f368a4be77195 diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index 99af9fd13ab91044c7062487d5b5965bc1dcfb29..b9f7cdafee0f07f227f6904c52ebf87497f62b31 100644 GIT binary patch literal 3359 zcmcIndo8?z#WmvsP=}b-%NIYw!Kt-~E04KHvTQ4FDMU zLkRHM88j{DJF^ii7whhyO-e&~uAzSk4OqLFR`pwYC` zajR!^&sSbh>M>s(?C8CF0nZ#8z#@&5<`RNZ(XJT~*&*7y7NeD_?owy_A$R6)QjEY&4&LENeS0ej%M$UuTI+CSQe3rE>M4agm> zQOPB;hdu&S*`*e^5?cqY_S=zsF!ReuY)GJcVQG`v{UJ9m`o|xCvpm7 z6u1|RxJ+B%!OBQb@%kL&k5OfZcPfN;jaX{YyoOa+L!bmysSu3D08rHcFj4{_>93dO zipTm@P*OwKNUwfWAF)IHE1Ts^Op4ngofPGjxmrS$mx>$nvPrVx;o4ZA>-IY2@}Q2d z$@bbvu(+n3MQ5B@4nXR zoTHSxOBow$Wg9F%y0TZmtx}gWSOW=j5${QoYc`Tw`9YDp3OcP7LsGc6APEy!CO1J3 zTs~{crLI>EBul?&;%c8OMwH>v@NAu&;K^{VPss<`Yq(y!vt6gI+-E=@A7cwu_{Na% z_$guWZH9s5>YVoTj!XfAF!Rnyt$?9@@D%p14j)P#P59+Wha zi9a$HP=pDGt$N^F?+&Ao$uSED;!c26*ES`Rm-yuiOteu{JYb1c29*6pXHGJ z^dmtdmJ^b_cA&;*F0k>U3`LX^H*u~Y4Q^GYrKz%RW&2J8NzfrXkK!<9@%Ox#z-oEc#hV|4Nlj{)iUb}WUOAZY2(5kq=W#L{}M@1H<{8>ri zhZ89^C^Yq?HGQouh<=l~C~FSY6F=v9=r^y#vNoMEe&Tr(v2Xr)-2IzFq%}6aF0tX_ zY-3`ZNi$MG){kDP@Z+wgRSyNt{4;%$EkM|GUmw+a!uSHU%y0dlMnqkfR#(n*aT-*M z#jGepc}F4M?KJsQZ*t&n@fwhMf}6J|l#6T9irNb6*fh}xVt?Rrwz8R?k0d8JC z;rrfl7PpM%y#(6+3g8Xldn3SyE!kac!jO=k<_#-0;?J1&mEAzptT^E zYfWp>Uh1ILj7;WT)sgfGd>eK^2KZ%n$f?S%0r@r_>KS1QUd+JZwT469>_p8WDOS%&`-pZmxM#gSQ@qaE8JKSjwq_SrOxk(55{)5U7yU(`4v?b^FD#S-aP=m4_s9M@sApcaO{@YsbF*Y@WGOa>`Og}#(m zp%DMQQ{l)O(R+V{LDCJsaI#jHTF!yZW{p2Z-_Dv+UO$+n9JESeJLQEN9foPltRp%0 zS=cK^*VlI;wz7y2F^;noic=JN4EvZU`=9RAwBFVB)<+Ij1$sjt&P1+~28cg8i8BO? z*@`31Fn3xoR#gBzVS*39C5oBvMGSc$AB}Dae5kOc&ZY!SalXPwMH(WOu}9X?`mV`0 zNeSn&CLoF*uz74lC;aB#`nbORk5tb(iZ2OTXp*Bx;Snx*t@PR0Ob^vgRLTzFEQ3~v zOdaoD>#C>8JLq(5wzttBMhM?+CcXQmZLeK#;_d|2EtN+}q9?u3t!L7Np3{X-_wArZ z7fW={o@8bzrFjvd-eWv-`)u8W(<8Xx>hFRvA+kt{A*OY`#c`rv4vzt^C91hnKR+Kj z{=blCahHY)Rl4W5?vcme4b_$^ayEeMU`+oz0;(9z(|;obOQ2uQ{`#I^c|v%b%6!~g z$+L6-#SbOH62E!hE?y3p=oH*j?z!Yee8R6}_&#SHIwd+H+dbaWQ`^$b(jK&*$Nq9% za0}_ZR3>zbwEUx!bK$q{BdMu-?d;S*dz)d9(7>O$aS7*jVbyj NcRKBLe6)>l@n2Zciv9oq literal 12103 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 Date: Wed, 14 Feb 2024 19:43:31 +0100 Subject: [PATCH 71/83] release: version 0.15.8 --- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4e6cb41c..440f3b03 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -751,7 +751,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1506; + CURRENT_PROJECT_VERSION = 1508; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -770,7 +770,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.6; + MARKETING_VERSION = 0.15.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-lresolv"; @@ -802,7 +802,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1506; + CURRENT_PROJECT_VERSION = 1508; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -821,7 +821,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.6; + MARKETING_VERSION = 0.15.8; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; @@ -851,7 +851,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1506; + CURRENT_PROJECT_VERSION = 1508; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -870,7 +870,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.6; + MARKETING_VERSION = 0.15.8; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; diff --git a/pubspec.yaml b/pubspec.yaml index a0a51ed1..1c965f95 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: hiddify description: Cross Platform Multi Protocol Proxy Frontend. publish_to: "none" -version: 0.15.6+1506 +version: 0.15.8+1508 environment: sdk: ">=3.2.0 <4.0.0" From d785de5f62e5438e07fe79b9ca50b5f65f96ee54 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Wed, 14 Feb 2024 19:44:21 +0100 Subject: [PATCH 72/83] release: version 0.15.9 --- dependencies.properties | 2 +- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dependencies.properties b/dependencies.properties index 623f42e1..f29145a6 100644 --- a/dependencies.properties +++ b/dependencies.properties @@ -1 +1 @@ -core.version=0.14.2 \ No newline at end of file +core.version=0.15.0 \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 440f3b03..03ed460b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -751,7 +751,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1508; + CURRENT_PROJECT_VERSION = 1509; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -770,7 +770,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.8; + MARKETING_VERSION = 0.15.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-lresolv"; @@ -802,7 +802,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1508; + CURRENT_PROJECT_VERSION = 1509; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -821,7 +821,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.8; + MARKETING_VERSION = 0.15.9; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; @@ -851,7 +851,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1508; + CURRENT_PROJECT_VERSION = 1509; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -870,7 +870,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.8; + MARKETING_VERSION = 0.15.9; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; diff --git a/pubspec.yaml b/pubspec.yaml index 1c965f95..5d170b05 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: hiddify description: Cross Platform Multi Protocol Proxy Frontend. publish_to: "none" -version: 0.15.8+1508 +version: 0.15.9+1509 environment: sdk: ">=3.2.0 <4.0.0" From 4c24c0b4193e0f08314eb0f5834b68bed97fd9f2 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 12:24:18 +0330 Subject: [PATCH 73/83] Fix ip widget directionality --- lib/features/proxy/active/ip_widget.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/features/proxy/active/ip_widget.dart b/lib/features/proxy/active/ip_widget.dart index 07f6fb17..eeb1fe70 100644 --- a/lib/features/proxy/active/ip_widget.dart +++ b/lib/features/proxy/active/ip_widget.dart @@ -27,6 +27,7 @@ class IPText extends HookConsumerWidget { final t = ref.watch(translationsProvider); final isVisible = ref.watch(_showIp); final textTheme = Theme.of(context).textTheme; + final ipStyle = constrained ? textTheme.labelMedium : textTheme.labelLarge; return Semantics( label: t.proxies.ipInfoSemantics.address, @@ -41,7 +42,8 @@ class IPText extends HookConsumerWidget { child: AnimatedCrossFade( firstChild: Text( ip, - style: textTheme.labelMedium, + style: ipStyle, + textDirection: TextDirection.ltr, overflow: TextOverflow.ellipsis, ), secondChild: Padding( @@ -51,8 +53,8 @@ class IPText extends HookConsumerWidget { child: Text( obscureIp(ip), semanticsLabel: t.general.hidden, - style: - constrained ? textTheme.labelMedium : textTheme.labelLarge, + style: ipStyle, + textDirection: TextDirection.ltr, overflow: TextOverflow.ellipsis, ), ), From 19f6ac8ab0e5441d017e51c543ad5e9a91d2dc08 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 12:24:42 +0330 Subject: [PATCH 74/83] Change service mode choices --- lib/singbox/model/singbox_config_enum.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/singbox/model/singbox_config_enum.dart b/lib/singbox/model/singbox_config_enum.dart index cea3730f..9bcdde20 100644 --- a/lib/singbox/model/singbox_config_enum.dart +++ b/lib/singbox/model/singbox_config_enum.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/utils/platform_utils.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -7,7 +9,7 @@ enum ServiceMode { proxy("proxy"), systemProxy("system-proxy"), tun("vpn"), - tunService("vpnService"); + tunService("vpn-service"); const ServiceMode(this.key); @@ -16,10 +18,14 @@ enum ServiceMode { static ServiceMode get defaultMode => PlatformUtils.isDesktop ? systemProxy : tun; + /// supported service mode based on platform, use this instead of [values] in UI static List get choices { - if (PlatformUtils.isDesktop) { + if (Platform.isWindows || Platform.isLinux) { return values; + } else if (Platform.isMacOS) { + return [proxy, systemProxy, tun]; } + // mobile return [proxy, tun]; } From 97a308a351316be63e2a6c5bfb41814d0efe047c Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 12:25:04 +0330 Subject: [PATCH 75/83] Improve ping indicator --- assets/translations/strings_en.i18n.json | 4 ++- lib/core/localization/locale_extensions.dart | 1 + .../active/active_proxy_delay_indicator.dart | 28 +++++++++++++------ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 3f4e2d8a..09077e53 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -16,7 +16,8 @@ "agree": "Agree", "decline": "Decline", "unknown": "Unknown", - "hidden": "Hidden" + "hidden": "Hidden", + "timeout": "timeout" }, "intro": { "termsAndPolicyCaution(rich)": "by continuing you agree with ${tap(@:about.termsAndConditions)}", @@ -132,6 +133,7 @@ "activeProxySemanticLabel": "Active proxy", "delaySemantics": { "result": "delay: ${delay}ms", + "timeout": "delay test timeout", "testing": "delay: testing..." }, "ipInfoSemantics": { diff --git a/lib/core/localization/locale_extensions.dart b/lib/core/localization/locale_extensions.dart index f581c3b1..96de1686 100644 --- a/lib/core/localization/locale_extensions.dart +++ b/lib/core/localization/locale_extensions.dart @@ -11,6 +11,7 @@ extension AppLocaleX on AppLocale { "ru" => "Русский", "zh" || "zh_CN" => "中文", "tr" => "Türkçe", + "es" => "Spanish", _ => "Unknown", }; } diff --git a/lib/features/proxy/active/active_proxy_delay_indicator.dart b/lib/features/proxy/active/active_proxy_delay_indicator.dart index 43828eeb..ff8cde35 100644 --- a/lib/features/proxy/active/active_proxy_delay_indicator.dart +++ b/lib/features/proxy/active/active_proxy_delay_indicator.dart @@ -23,6 +23,7 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { switch (activeProxy) { case AsyncData(value: final proxy): final delay = proxy.urlTestDelay; + final timeout = delay > 65000; return Center( child: InkWell( onTap: () async { @@ -41,16 +42,27 @@ class ActiveProxyDelayIndicator extends HookConsumerWidget { const Gap(8), if (delay > 0) Text.rich( - semanticsLabel: - t.proxies.delaySemantics.result(delay: delay), + semanticsLabel: timeout + ? t.proxies.delaySemantics.timeout + : t.proxies.delaySemantics.result(delay: delay), TextSpan( children: [ - TextSpan( - text: delay > 65000 ? "×" : delay.toString(), - style: theme.textTheme.titleMedium - ?.copyWith(fontWeight: FontWeight.bold), - ), - const TextSpan(text: " ms"), + if (timeout) + TextSpan( + text: t.general.timeout, + style: theme.textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.bold, + color: theme.colorScheme.error, + ), + ) + else ...[ + TextSpan( + text: delay.toString(), + style: theme.textTheme.titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + ), + const TextSpan(text: " ms"), + ], ], ), ) From 7e3442a310999101a8a2db0daacb86ab51c0fcfa Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 15:23:02 +0330 Subject: [PATCH 76/83] Change icons --- lib/core/widget/adaptive_icon.dart | 23 ++++++++ lib/core/widget/adaptive_menu.dart | 4 +- lib/core/widget/tip_card.dart | 3 +- lib/features/common/confirmation_dialogs.dart | 3 +- lib/features/common/general_pref_tiles.dart | 7 +-- .../common/qr_code_scanner_screen.dart | 28 +++++----- .../overview/config_options_page.dart | 5 +- .../overview/geo_assets_overview_page.dart | 54 ++++--------------- .../geo_asset/widget/geo_asset_tile.dart | 2 + .../home/widget/empty_profiles_home_body.dart | 3 +- lib/features/home/widget/home_page.dart | 5 +- .../log/overview/logs_overview_page.dart | 12 +++-- .../overview/per_app_proxy_page.dart | 8 ++- .../profile/add/add_profile_modal.dart | 9 ++-- .../profile/details/profile_details_page.dart | 9 +++- .../profile/model/profile_sort_enum.dart | 5 +- .../overview/profiles_overview_page.dart | 9 ++-- lib/features/profile/widget/profile_tile.dart | 19 ++++--- .../proxy/overview/proxies_overview_page.dart | 5 +- lib/features/settings/about/about_page.dart | 15 +++--- .../widgets/advanced_setting_tiles.dart | 13 +++-- .../widgets/general_setting_tiles.dart | 5 +- .../widgets/platform_settings_tiles.dart | 3 +- lib/utils/alerts.dart | 5 +- lib/utils/placeholders.dart | 3 +- 25 files changed, 146 insertions(+), 111 deletions(-) create mode 100644 lib/core/widget/adaptive_icon.dart diff --git a/lib/core/widget/adaptive_icon.dart b/lib/core/widget/adaptive_icon.dart new file mode 100644 index 00000000..6d526ebb --- /dev/null +++ b/lib/core/widget/adaptive_icon.dart @@ -0,0 +1,23 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; +import 'package:flutter/material.dart'; + +class AdaptiveIcon { + AdaptiveIcon(BuildContext context) : platform = Theme.of(context).platform; + + final TargetPlatform platform; + + IconData get more => switch (platform) { + TargetPlatform.iOS || + TargetPlatform.macOS => + FluentIcons.more_horizontal_24_regular, + _ => FluentIcons.more_vertical_24_regular, + }; + + IconData get share => switch (platform) { + TargetPlatform.android => FluentIcons.share_android_24_regular, + TargetPlatform.iOS || + TargetPlatform.macOS => + FluentIcons.share_ios_24_regular, + _ => FluentIcons.share_24_regular, + }; +} diff --git a/lib/core/widget/adaptive_menu.dart b/lib/core/widget/adaptive_menu.dart index b67435c9..e26e873b 100644 --- a/lib/core/widget/adaptive_menu.dart +++ b/lib/core/widget/adaptive_menu.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hiddify/utils/platform_utils.dart'; @@ -120,7 +121,8 @@ class AdaptiveMenu extends HookConsumerWidget { ListTile( title: Text(item.title), leading: item.icon != null ? Icon(item.icon) : null, - trailing: const Icon(Icons.chevron_right), + trailing: + const Icon(FluentIcons.chevron_right_20_regular, size: 20), onTap: () { pageIndexNotifier.value = subSheetIndex; }, diff --git a/lib/core/widget/tip_card.dart b/lib/core/widget/tip_card.dart index 59cabf22..10e5813e 100644 --- a/lib/core/widget/tip_card.dart +++ b/lib/core/widget/tip_card.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; class TipCard extends StatelessWidget { @@ -16,7 +17,7 @@ class TipCard extends StatelessWidget { children: [ const Padding( padding: EdgeInsets.all(8.0), - child: Icon(Icons.lightbulb), + child: Icon(FluentIcons.lightbulb_24_regular), ), Expanded( child: Column( diff --git a/lib/features/common/confirmation_dialogs.dart b/lib/features/common/confirmation_dialogs.dart index 2f9f4b11..51085309 100644 --- a/lib/features/common/confirmation_dialogs.dart +++ b/lib/features/common/confirmation_dialogs.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -12,7 +13,7 @@ Future showConfirmationDialog( builder: (context) { final localizations = MaterialLocalizations.of(context); return AlertDialog( - icon: const Icon(Icons.delete_forever), + icon: const Icon(FluentIcons.delete_24_regular), title: Text(title), content: Text(message), actions: [ diff --git a/lib/features/common/general_pref_tiles.dart b/lib/features/common/general_pref_tiles.dart index 904b7bc9..69f18d57 100644 --- a/lib/features/common/general_pref_tiles.dart +++ b/lib/features/common/general_pref_tiles.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/analytics/analytics_controller.dart'; import 'package:hiddify/core/localization/locale_extensions.dart'; @@ -19,7 +20,7 @@ class LocalePrefTile extends HookConsumerWidget { return ListTile( title: Text(t.settings.general.locale), subtitle: Text(locale.localeName), - leading: const Icon(Icons.language), + leading: const Icon(FluentIcons.local_language_24_regular), onTap: () async { final selectedLocale = await showDialog( context: context, @@ -61,7 +62,7 @@ class RegionPrefTile extends HookConsumerWidget { return ListTile( title: Text(t.settings.general.region), subtitle: Text(region.present(t)), - leading: const Icon(Icons.my_location), + leading: const Icon(FluentIcons.globe_location_24_regular), onTap: () async { final selectedRegion = await showDialog( context: context, @@ -111,7 +112,7 @@ class EnableAnalyticsPrefTile extends HookConsumerWidget { t.settings.general.enableAnalyticsMsg, style: Theme.of(context).textTheme.bodySmall, ), - secondary: const Icon(Icons.bug_report), + secondary: const Icon(FluentIcons.bug_24_regular), value: enabled, onChanged: (value) async { if (onChanged != null) { diff --git a/lib/features/common/qr_code_scanner_screen.dart b/lib/features/common/qr_code_scanner_screen.dart index 4199bb04..dc46364b 100644 --- a/lib/features/common/qr_code_scanner_screen.dart +++ b/lib/features/common/qr_code_scanner_screen.dart @@ -1,4 +1,5 @@ import 'package:dartx/dartx.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hiddify/core/localization/translations.dart'; @@ -46,9 +47,15 @@ class QRCodeScannerScreen extends HookConsumerWidget with PresLogger { builder: (context, state, child) { switch (state) { case TorchState.off: - return const Icon(Icons.flash_off, color: Colors.grey); + return const Icon( + FluentIcons.flash_off_24_regular, + color: Colors.grey, + ); case TorchState.on: - return const Icon(Icons.flash_on, color: Colors.yellow); + return const Icon( + FluentIcons.flash_24_regular, + color: Colors.yellow, + ); } }, ), @@ -56,17 +63,7 @@ class QRCodeScannerScreen extends HookConsumerWidget with PresLogger { onPressed: () => controller.toggleTorch(), ), IconButton( - icon: ValueListenableBuilder( - valueListenable: controller.cameraFacingState, - builder: (context, state, child) { - switch (state) { - case CameraFacing.front: - return const Icon(Icons.camera_front); - case CameraFacing.back: - return const Icon(Icons.camera_rear); - } - }, - ), + icon: const Icon(FluentIcons.camera_switch_24_regular), tooltip: t.profile.add.qrScanner.facingSemanticLabel, onPressed: () => controller.switchCamera(), ), @@ -103,7 +100,10 @@ class QRCodeScannerScreen extends HookConsumerWidget with PresLogger { children: [ const Padding( padding: EdgeInsets.only(bottom: 8), - child: Icon(Icons.error, color: Colors.white), + child: Icon( + FluentIcons.error_circle_24_regular, + color: Colors.white, + ), ), Text(message), Text(error.errorDetails?.message ?? ''), diff --git a/lib/features/config_option/overview/config_options_page.dart b/lib/features/config_option/overview/config_options_page.dart index 2ed1f8f2..46df415c 100644 --- a/lib/features/config_option/overview/config_options_page.dart +++ b/lib/features/config_option/overview/config_options_page.dart @@ -1,10 +1,12 @@ import 'package:dartx/dartx.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; import 'package:hiddify/core/model/range.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/core/widget/tip_card.dart'; import 'package:hiddify/features/common/nested_app_bar.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; @@ -45,6 +47,7 @@ class ConfigOptionsPage extends HookConsumerWidget { actions: [ if (asyncOptions case AsyncData(value: final options)) PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return [ PopupMenuItem( @@ -483,7 +486,7 @@ class ConfigOptionsPage extends HookConsumerWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.error), + const Icon(FluentIcons.error_circle_24_regular), const Gap(2), Text(t.presentShortError(error)), const Gap(2), diff --git a/lib/features/geo_asset/overview/geo_assets_overview_page.dart b/lib/features/geo_asset/overview/geo_assets_overview_page.dart index 57f9667a..2af65703 100644 --- a/lib/features/geo_asset/overview/geo_assets_overview_page.dart +++ b/lib/features/geo_asset/overview/geo_assets_overview_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; +import 'package:hiddify/core/widget/animated_visibility.dart'; +import 'package:hiddify/core/widget/tip_card.dart'; import 'package:hiddify/features/geo_asset/overview/geo_assets_overview_notifier.dart'; import 'package:hiddify/features/geo_asset/widget/geo_asset_tile.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -22,6 +25,7 @@ class GeoAssetsOverviewPage extends HookConsumerWidget { pinned: true, actions: [ PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return [ PopupMenuItem( @@ -39,13 +43,13 @@ class GeoAssetsOverviewPage extends HookConsumerWidget { ), if (state case AsyncData(value: (:final geoip, :final geosite))) SliverPinnedHeader( - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 200), - child: (geoip + geosite) - .where((e) => e.$1.active && e.$2 == null) - .isNotEmpty - ? const MissingRoutingAssetsCard() - : const SizedBox(), + child: AnimatedVisibility( + visible: (geoip + geosite) + .where((e) => e.$1.active && e.$2 == null) + .isNotEmpty, + axis: Axis.vertical, + child: + TipCard(message: t.settings.geoAssets.missingGeoAssetsMsg), ), ), switch (state) { @@ -96,39 +100,3 @@ class GeoAssetsOverviewPage extends HookConsumerWidget { ); } } - -class MissingRoutingAssetsCard extends HookConsumerWidget { - const MissingRoutingAssetsCard({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final t = ref.watch(translationsProvider); - - return Card( - margin: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 4, - ), - child: Row( - children: [ - const Padding( - padding: EdgeInsets.all(8.0), - child: Icon(Icons.lightbulb), - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: - const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - child: Text(t.settings.geoAssets.missingGeoAssetsMsg), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/lib/features/geo_asset/widget/geo_asset_tile.dart b/lib/features/geo_asset/widget/geo_asset_tile.dart index 61fbbee6..9180a6ff 100644 --- a/lib/features/geo_asset/widget/geo_asset_tile.dart +++ b/lib/features/geo_asset/widget/geo_asset_tile.dart @@ -2,6 +2,7 @@ import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/features/geo_asset/model/geo_asset_entity.dart'; import 'package:hiddify/features/geo_asset/model/geo_asset_failure.dart'; import 'package:hiddify/features/geo_asset/notifier/geo_asset_notifier.dart'; @@ -95,6 +96,7 @@ class GeoAssetTile extends HookConsumerWidget { selected: geoAsset.active, onTap: onMarkAsActive, trailing: PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return [ PopupMenuItem( diff --git a/lib/features/home/widget/empty_profiles_home_body.dart b/lib/features/home/widget/empty_profiles_home_body.dart index eed2b370..b6b9506f 100644 --- a/lib/features/home/widget/empty_profiles_home_body.dart +++ b/lib/features/home/widget/empty_profiles_home_body.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; @@ -20,7 +21,7 @@ class EmptyProfilesHomeBody extends HookConsumerWidget { const Gap(16), OutlinedButton.icon( onPressed: () => const AddProfileRoute().push(context), - icon: const Icon(Icons.add), + icon: const Icon(FluentIcons.add_24_regular), label: Text(t.profile.add.buttonText), ), ], diff --git a/lib/features/home/widget/home_page.dart b/lib/features/home/widget/home_page.dart index 66025e0e..13b20d30 100644 --- a/lib/features/home/widget/home_page.dart +++ b/lib/features/home/widget/home_page.dart @@ -1,6 +1,5 @@ -import 'dart:io'; - import 'package:dartx/dartx.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/app_info/app_info_provider.dart'; import 'package:hiddify/core/localization/translations.dart'; @@ -48,7 +47,7 @@ class HomePage extends HookConsumerWidget { actions: [ IconButton( onPressed: () => const AddProfileRoute().push(context), - icon: const Icon(Icons.add_circle), + icon: const Icon(FluentIcons.add_circle_24_filled), tooltip: t.profile.add.buttonText, ), ], diff --git a/lib/features/log/overview/logs_overview_page.dart b/lib/features/log/overview/logs_overview_page.dart index 17b1b8c9..33d3c817 100644 --- a/lib/features/log/overview/logs_overview_page.dart +++ b/lib/features/log/overview/logs_overview_page.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fpdart/fpdart.dart'; @@ -5,6 +6,7 @@ import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; import 'package:hiddify/core/preferences/general_preferences.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/features/common/nested_app_bar.dart'; import 'package:hiddify/features/log/data/log_data_providers.dart'; import 'package:hiddify/features/log/model/log_level.dart'; @@ -65,22 +67,26 @@ class LogsOverviewPage extends HookConsumerWidget with PresLogger { if (state.paused) IconButton( onPressed: notifier.resume, - icon: const Icon(Icons.play_arrow), + icon: const Icon(FluentIcons.play_20_regular), tooltip: t.logs.resumeTooltip, + iconSize: 20, ) else IconButton( onPressed: notifier.pause, - icon: const Icon(Icons.pause), + icon: const Icon(FluentIcons.pause_20_regular), tooltip: t.logs.pauseTooltip, + iconSize: 20, ), IconButton( onPressed: notifier.clear, - icon: const Icon(Icons.clear_all), + icon: const Icon(FluentIcons.delete_lines_20_regular), tooltip: t.logs.clearTooltip, + iconSize: 20, ), if (popupButtons.isNotEmpty) PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return popupButtons; }, diff --git a/lib/features/per_app_proxy/overview/per_app_proxy_page.dart b/lib/features/per_app_proxy/overview/per_app_proxy_page.dart index 651fa6ff..c500e15f 100644 --- a/lib/features/per_app_proxy/overview/per_app_proxy_page.dart +++ b/lib/features/per_app_proxy/overview/per_app_proxy_page.dart @@ -1,9 +1,11 @@ import 'package:dartx/dartx.dart'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/preferences/general_preferences.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/features/per_app_proxy/model/installed_package_info.dart'; import 'package:hiddify/features/per_app_proxy/model/per_app_proxy_mode.dart'; import 'package:hiddify/features/per_app_proxy/overview/per_app_proxy_notifier.dart'; @@ -83,11 +85,12 @@ class PerAppProxyPage extends HookConsumerWidget with PresLogger { title: Text(t.settings.network.perAppProxyPageTitle), actions: [ IconButton( - icon: const Icon(Icons.search), + icon: const Icon(FluentIcons.search_24_regular), onPressed: () => isSearching.value = true, tooltip: localizations.searchFieldLabel, ), PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return [ PopupMenuItem( @@ -179,7 +182,8 @@ class PerAppProxyPage extends HookConsumerWidget with PresLogger { .watch(packageIconProvider(package.packageName)) .when( data: (data) => Image(image: data), - error: (error, _) => const Icon(Icons.error), + error: (error, _) => + const Icon(FluentIcons.error_circle_24_regular), loading: () => const Center( child: CircularProgressIndicator(), ), diff --git a/lib/features/profile/add/add_profile_modal.dart b/lib/features/profile/add/add_profile_modal.dart index d68831f3..7fb3c365 100644 --- a/lib/features/profile/add/add_profile_modal.dart +++ b/lib/features/profile/add/add_profile_modal.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -99,7 +100,7 @@ class AddProfileModal extends HookConsumerWidget { _Button( key: const ValueKey("add_from_clipboard_button"), label: t.profile.add.fromClipboard, - icon: Icons.content_paste, + icon: FluentIcons.clipboard_paste_24_regular, size: buttonWidth, onTap: () async { final captureResult = @@ -116,7 +117,7 @@ class AddProfileModal extends HookConsumerWidget { _Button( key: const ValueKey("add_by_qr_code_button"), label: t.profile.add.scanQr, - icon: Icons.qr_code_scanner, + icon: FluentIcons.qr_code_24_regular, size: buttonWidth, onTap: () async { final captureResult = @@ -133,7 +134,7 @@ class AddProfileModal extends HookConsumerWidget { _Button( key: const ValueKey("add_manually_button"), label: t.profile.add.manually, - icon: Icons.add, + icon: FluentIcons.add_24_regular, size: buttonWidth, onTap: () async { context.pop(); @@ -170,7 +171,7 @@ class AddProfileModal extends HookConsumerWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( - Icons.add, + FluentIcons.add_24_regular, color: theme.colorScheme.primary, ), const Gap(8), diff --git a/lib/features/profile/details/profile_details_page.dart b/lib/features/profile/details/profile_details_page.dart index 642b24cc..af940db5 100644 --- a/lib/features/profile/details/profile_details_page.dart +++ b/lib/features/profile/details/profile_details_page.dart @@ -1,8 +1,10 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:fpdart/fpdart.dart'; import 'package:go_router/go_router.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/features/common/confirmation_dialogs.dart'; import 'package:hiddify/features/profile/details/profile_details_notifier.dart'; import 'package:hiddify/features/profile/model/profile_entity.dart'; @@ -95,6 +97,7 @@ class ProfileDetailsPage extends HookConsumerWidget with PresLogger { actions: [ if (state.isEditing) PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return [ if (state.profile case RemoteProfileEntity()) @@ -175,7 +178,8 @@ class ProfileDetailsPage extends HookConsumerWidget with PresLogger { ) ?? t.general.toggle.disabled, ), - leading: const Icon(Icons.update), + leading: + const Icon(FluentIcons.arrow_sync_24_regular), onTap: () async { final intervalInHours = await SettingsInputDialog( @@ -185,7 +189,8 @@ class ProfileDetailsPage extends HookConsumerWidget with PresLogger { optionalAction: ( t.general.state.disable, () => notifier.setField( - updateInterval: none()), + updateInterval: none(), + ), ), validator: isPort, mapTo: int.tryParse, diff --git a/lib/features/profile/model/profile_sort_enum.dart b/lib/features/profile/model/profile_sort_enum.dart index 5852a515..78b65be5 100644 --- a/lib/features/profile/model/profile_sort_enum.dart +++ b/lib/features/profile/model/profile_sort_enum.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; @@ -13,8 +14,8 @@ enum ProfilesSort { } IconData get icon => switch (this) { - lastUpdate => Icons.update, - name => Icons.sort_by_alpha, + lastUpdate => FluentIcons.history_24_regular, + name => FluentIcons.text_sort_ascending_24_regular, }; } diff --git a/lib/features/profile/overview/profiles_overview_page.dart b/lib/features/profile/overview/profiles_overview_page.dart index 1d0dac0d..ef542626 100644 --- a/lib/features/profile/overview/profiles_overview_page.dart +++ b/lib/features/profile/overview/profiles_overview_page.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; @@ -79,7 +80,7 @@ class ProfilesOverviewModal extends HookConsumerWidget { onPressed: () { const AddProfileRoute().push(context); }, - icon: const Icon(Icons.add), + icon: const Icon(FluentIcons.add_24_filled), label: Text(t.profile.add.shortBtnTxt), ), FilledButton.icon( @@ -91,7 +92,7 @@ class ProfilesOverviewModal extends HookConsumerWidget { }, ); }, - icon: const Icon(Icons.sort), + icon: const Icon(FluentIcons.arrow_sort_24_filled), label: Text(t.general.sort), ), FilledButton.icon( @@ -102,7 +103,7 @@ class ProfilesOverviewModal extends HookConsumerWidget { ) .trigger(); }, - icon: const Icon(Icons.update), + icon: const Icon(FluentIcons.arrow_sync_24_filled), label: Text(t.profile.update.updateSubscriptions), ), ], @@ -159,7 +160,7 @@ class ProfilesSortModal extends HookConsumerWidget { turns: arrowTurn, duration: const Duration(milliseconds: 100), child: Icon( - Icons.arrow_upward, + FluentIcons.arrow_sort_up_24_regular, semanticLabel: sort.mode.name, ), ), diff --git a/lib/features/profile/widget/profile_tile.dart b/lib/features/profile/widget/profile_tile.dart index 50215660..e2cb7288 100644 --- a/lib/features/profile/widget/profile_tile.dart +++ b/lib/features/profile/widget/profile_tile.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; @@ -6,6 +7,7 @@ import 'package:go_router/go_router.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; import 'package:hiddify/core/router/router.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/core/widget/adaptive_menu.dart'; import 'package:hiddify/features/common/confirmation_dialogs.dart'; import 'package:hiddify/features/common/qr_code_dialog.dart'; @@ -132,7 +134,10 @@ class ProfileTile extends HookConsumerWidget { ), ), ), - const Icon(Icons.arrow_drop_down), + const Icon( + FluentIcons.caret_down_16_filled, + size: 16, + ), ], ), ), @@ -196,7 +201,7 @@ class ProfileActionButton extends HookConsumerWidget { .read(updateProfileProvider(profile.id).notifier) .updateProfile(profile as RemoteProfileEntity); }, - child: const Icon(Icons.update), + child: const Icon(FluentIcons.arrow_sync_24_filled), ), ), ); @@ -210,7 +215,7 @@ class ProfileActionButton extends HookConsumerWidget { message: MaterialLocalizations.of(context).showMenuTooltip, child: InkWell( onTap: toggleVisibility, - child: const Icon(Icons.more_vert), + child: Icon(AdaptiveIcon(context).more), ), ), ); @@ -248,7 +253,7 @@ class ProfileActionsMenu extends HookConsumerWidget { if (profile case RemoteProfileEntity()) AdaptiveMenuItem( title: t.profile.update.buttonTxt, - icon: Icons.update, + icon: FluentIcons.arrow_sync_24_regular, onTap: () { if (ref.read(updateProfileProvider(profile.id)).isLoading) { return; @@ -260,7 +265,7 @@ class ProfileActionsMenu extends HookConsumerWidget { ), AdaptiveMenuItem( title: t.profile.share.buttonText, - icon: Icons.share, + icon: AdaptiveIcon(context).share, subItems: [ if (profile case RemoteProfileEntity(:final url, :final name)) ...[ AdaptiveMenuItem( @@ -305,14 +310,14 @@ class ProfileActionsMenu extends HookConsumerWidget { ], ), AdaptiveMenuItem( - icon: Icons.edit, + icon: FluentIcons.edit_24_regular, title: t.profile.edit.buttonTxt, onTap: () async { await ProfileDetailsRoute(profile.id).push(context); }, ), AdaptiveMenuItem( - icon: Icons.delete, + icon: FluentIcons.delete_24_regular, title: t.profile.delete.buttonTxt, onTap: () async { if (deleteProfileMutation.state.isInProgress) { diff --git a/lib/features/proxy/overview/proxies_overview_page.dart b/lib/features/proxy/overview/proxies_overview_page.dart index 389946e9..dd2a20d6 100644 --- a/lib/features/proxy/overview/proxies_overview_page.dart +++ b/lib/features/proxy/overview/proxies_overview_page.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; @@ -29,7 +30,7 @@ class ProxiesOverviewPage extends HookConsumerWidget with PresLogger { PopupMenuButton( initialValue: sortBy, onSelected: ref.read(proxiesSortNotifierProvider.notifier).update, - icon: const Icon(Icons.sort), + icon: const Icon(FluentIcons.arrow_sort_24_regular), tooltip: t.proxies.sortTooltip, itemBuilder: (context) { return [ @@ -131,7 +132,7 @@ class ProxiesOverviewPage extends HookConsumerWidget with PresLogger { floatingActionButton: FloatingActionButton( onPressed: () async => notifier.urlTest(group.tag), tooltip: t.proxies.delayTestTooltip, - child: const Icon(Icons.bolt), + child: const Icon(FluentIcons.flash_24_filled), ), ); diff --git a/lib/features/settings/about/about_page.dart b/lib/features/settings/about/about_page.dart index c437a86a..144896a4 100644 --- a/lib/features/settings/about/about_page.dart +++ b/lib/features/settings/about/about_page.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gap/gap.dart'; @@ -6,6 +7,7 @@ import 'package:hiddify/core/directories/directories_provider.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/constants.dart'; import 'package:hiddify/core/model/failures.dart'; +import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/features/app_update/notifier/app_update_notifier.dart'; import 'package:hiddify/features/app_update/notifier/app_update_state.dart'; import 'package:hiddify/features/app_update/widget/new_version_dialog.dart'; @@ -54,7 +56,7 @@ class AboutPage extends HookConsumerWidget { height: 24, child: CircularProgressIndicator(), ), - _ => const Icon(Icons.update), + _ => const Icon(FluentIcons.arrow_sync_24_regular), }, onTap: () async { await ref.read(appUpdateNotifierProvider.notifier).check(); @@ -63,7 +65,7 @@ class AboutPage extends HookConsumerWidget { if (PlatformUtils.isDesktop) ListTile( title: Text(t.settings.general.openWorkingDir), - trailing: const Icon(Icons.arrow_outward_outlined), + trailing: const Icon(FluentIcons.open_folder_24_regular), onTap: () async { final path = ref.watch(appDirectoriesProvider).requireValue.workingDir.uri; @@ -79,6 +81,7 @@ class AboutPage extends HookConsumerWidget { title: Text(t.about.pageTitle), actions: [ PopupMenuButton( + icon: Icon(AdaptiveIcon(context).more), itemBuilder: (context) { return [ PopupMenuItem( @@ -126,7 +129,7 @@ class AboutPage extends HookConsumerWidget { if (conditionalTiles.isNotEmpty) const Divider(), ListTile( title: Text(t.about.sourceCode), - trailing: const Icon(Icons.open_in_new), + trailing: const Icon(FluentIcons.open_24_regular), onTap: () async { await UriUtils.tryLaunch( Uri.parse(Constants.githubUrl), @@ -135,7 +138,7 @@ class AboutPage extends HookConsumerWidget { ), ListTile( title: Text(t.about.telegramChannel), - trailing: const Icon(Icons.open_in_new), + trailing: const Icon(FluentIcons.open_24_regular), onTap: () async { await UriUtils.tryLaunch( Uri.parse(Constants.telegramChannelUrl), @@ -144,7 +147,7 @@ class AboutPage extends HookConsumerWidget { ), ListTile( title: Text(t.about.termsAndConditions), - trailing: const Icon(Icons.open_in_new), + trailing: const Icon(FluentIcons.open_24_regular), onTap: () async { await UriUtils.tryLaunch( Uri.parse(Constants.termsAndConditionsUrl), @@ -153,7 +156,7 @@ class AboutPage extends HookConsumerWidget { ), ListTile( title: Text(t.about.privacyPolicy), - trailing: const Icon(Icons.open_in_new), + trailing: const Icon(FluentIcons.open_24_regular), onTap: () async { await UriUtils.tryLaunch( Uri.parse(Constants.privacyPolicyUrl), diff --git a/lib/features/settings/widgets/advanced_setting_tiles.dart b/lib/features/settings/widgets/advanced_setting_tiles.dart index 8a4de050..26b980e2 100644 --- a/lib/features/settings/widgets/advanced_setting_tiles.dart +++ b/lib/features/settings/widgets/advanced_setting_tiles.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/preferences/general_preferences.dart'; @@ -25,7 +26,9 @@ class AdvancedSettingTiles extends HookConsumerWidget { const RegionPrefTile(), ListTile( title: Text(t.settings.geoAssets.pageTitle), - leading: const Icon(Icons.folder), + leading: const Icon( + FluentIcons.arrow_routing_rectangle_multiple_24_regular, + ), onTap: () async { await const GeoAssetsRoute().push(context); }, @@ -33,7 +36,7 @@ class AdvancedSettingTiles extends HookConsumerWidget { if (Platform.isAndroid) ...[ ListTile( title: Text(t.settings.network.perAppProxyPageTitle), - leading: const Icon(Icons.apps), + leading: const Icon(FluentIcons.apps_list_detail_24_regular), trailing: Switch( value: perAppProxy, onChanged: (value) async { @@ -61,7 +64,7 @@ class AdvancedSettingTiles extends HookConsumerWidget { title: Text(t.settings.advanced.memoryLimit), subtitle: Text(t.settings.advanced.memoryLimitMsg), value: !disableMemoryLimit, - secondary: const Icon(Icons.memory), + secondary: const Icon(FluentIcons.developer_board_24_regular), onChanged: (value) async { await ref.read(disableMemoryLimitProvider.notifier).update(!value); }, @@ -69,7 +72,7 @@ class AdvancedSettingTiles extends HookConsumerWidget { if (Platform.isIOS) ListTile( title: Text(t.settings.advanced.resetTunnel), - leading: const Icon(Icons.restart_alt), + leading: const Icon(FluentIcons.arrow_reset_24_regular), onTap: () async { await ref.read(resetTunnelProvider.notifier).run(); }, @@ -77,7 +80,7 @@ class AdvancedSettingTiles extends HookConsumerWidget { SwitchListTile( title: Text(t.settings.advanced.debugMode), value: debug, - secondary: const Icon(Icons.bug_report), + secondary: const Icon(FluentIcons.window_dev_tools_24_regular), onChanged: (value) async { if (value) { await showDialog( diff --git a/lib/features/settings/widgets/general_setting_tiles.dart b/lib/features/settings/widgets/general_setting_tiles.dart index 29fd1ab6..8cd2fd79 100644 --- a/lib/features/settings/widgets/general_setting_tiles.dart +++ b/lib/features/settings/widgets/general_setting_tiles.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/preferences/general_preferences.dart'; @@ -25,7 +26,7 @@ class GeneralSettingTiles extends HookConsumerWidget { ListTile( title: Text(t.settings.general.themeMode), subtitle: Text(themeMode.present(t)), - leading: const Icon(Icons.light_mode), + leading: const Icon(FluentIcons.weather_moon_20_regular), onTap: () async { final selectedThemeMode = await showDialog( context: context, @@ -56,7 +57,7 @@ class GeneralSettingTiles extends HookConsumerWidget { if (Platform.isAndroid) SwitchListTile( title: Text(t.settings.general.dynamicNotification), - secondary: const Icon(Icons.speed), + secondary: const Icon(FluentIcons.top_speed_24_regular), value: ref.watch(dynamicNotificationProvider), onChanged: (value) async { await ref diff --git a/lib/features/settings/widgets/platform_settings_tiles.dart b/lib/features/settings/widgets/platform_settings_tiles.dart index cdeb18e4..7dbbca36 100644 --- a/lib/features/settings/widgets/platform_settings_tiles.dart +++ b/lib/features/settings/widgets/platform_settings_tiles.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/features/settings/notifier/platform_settings_notifier.dart'; @@ -18,7 +19,7 @@ class PlatformSettingsTiles extends HookConsumerWidget { ListTile buildIgnoreTile(bool enabled) => ListTile( title: Text(t.settings.general.ignoreBatteryOptimizations), subtitle: Text(t.settings.general.ignoreBatteryOptimizationsMsg), - leading: const Icon(Icons.running_with_errors), + leading: const Icon(FluentIcons.battery_saver_24_regular), enabled: enabled, onTap: () async { await ref diff --git a/lib/utils/alerts.dart b/lib/utils/alerts.dart index 71cc073f..9c47a844 100644 --- a/lib/utils/alerts.dart +++ b/lib/utils/alerts.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:toastification/toastification.dart'; @@ -73,13 +74,13 @@ class CustomToast extends StatelessWidget { this.message, { this.duration = const Duration(seconds: 5), }) : type = AlertType.error, - icon = Icons.error; + icon = FluentIcons.error_circle_24_regular; const CustomToast.success( this.message, { this.duration = const Duration(seconds: 3), }) : type = AlertType.success, - icon = Icons.check; + icon = FluentIcons.checkmark_24_regular; final String message; final AlertType type; diff --git a/lib/utils/placeholders.dart b/lib/utils/placeholders.dart index f56183b6..b3b59981 100644 --- a/lib/utils/placeholders.dart +++ b/lib/utils/placeholders.dart @@ -1,3 +1,4 @@ +import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -39,7 +40,7 @@ class SliverErrorBodyPlaceholder extends HookConsumerWidget { const SliverErrorBodyPlaceholder( this.msg, { super.key, - this.icon = Icons.error, + this.icon = FluentIcons.error_circle_24_regular, }); final String msg; From bd4c5eed7e5aad2d4fa307fd8722ce44f293335a Mon Sep 17 00:00:00 2001 From: Hiddify Date: Thu, 15 Feb 2024 14:49:35 +0100 Subject: [PATCH 77/83] fix: logo, add name for hiddify warp sub --- assets/images/logo.svg | 10 ++++------ test.configs/warp | 8 ++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/assets/images/logo.svg b/assets/images/logo.svg index 831b40c2..37718223 100644 --- a/assets/images/logo.svg +++ b/assets/images/logo.svg @@ -1,12 +1,10 @@ - - - + + + - - - + diff --git a/test.configs/warp b/test.configs/warp index f9bff8ab..9be0ea6a 100644 --- a/test.configs/warp +++ b/test.configs/warp @@ -1,3 +1,9 @@ +//profile-title: base64:8J+UpSBXQVJQIPCflKU= +//profile-update-interval: 1 +//subscription-userinfo: upload=0; download=0; total=10737418240000000; expire=2546249531 +//support-url: https://t.me/hiddify +//profile-web-page-url: https://hiddify.com + warp://auto?ifp=10-20&ifps=40-100&ifpd=10-20#Warp_10-20_40-100_10-20 warp://auto?ifp=10-20&ifps=40-100&ifpd=30-50#Warp_10-20_40-100_30-50 warp://auto?ifp=10-20&ifps=40-100&ifpd=300-500#Warp_10-20_40-100_300-500 @@ -6,3 +12,5 @@ warp://auto?ifp=10-20&ifps=40-100&ifpd=300-500#Warp_10-20_40-100_300-500 warp://auto?ifp=5-10&ifps=40-100&ifpd=10-20#Warp_5-10_40-100_10-20 warp://auto?ifp=5-10&ifps=40-100&ifpd=30-50#Warp_5-10_40-100_30-50 warp://auto?ifp=5-10&ifps=40-100&ifpd=300-500#Warp_5-10_40-100_300-500 + +warp://auto#WarpInWarp&&detour=warp://auto?ifp=10-20&ifps=40-100&ifpd=10-200#Warp_10-20_40-100_10-200 \ No newline at end of file From 702c59c3bc34755c171c36b2b739087288ed0419 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 19:39:35 +0330 Subject: [PATCH 78/83] Change mapping and bug fixes --- .../http_client/http_client_provider.dart | 8 +- lib/core/model/optional_range.dart | 54 +++ lib/core/model/range.dart | 57 --- lib/core/utils/json_converters.dart | 10 +- .../data/config_option_repository.dart | 55 +-- .../model/config_option_entity.dart | 351 ++++++++++++------ .../model/config_option_patch.dart | 60 --- .../notifier/config_option_notifier.dart | 1 - .../overview/config_options_page.dart | 13 +- .../overview/warp_options_widgets.dart | 8 +- .../data/connection_platform_source.dart | 2 - lib/features/log/model/log_level.dart | 4 + .../proxy/active/active_proxy_footer.dart | 1 - .../overview/proxies_overview_notifier.dart | 13 +- .../notifier/system_tray_notifier.dart | 2 +- lib/singbox/model/singbox_config_enum.dart | 52 ++- lib/singbox/model/singbox_config_option.dart | 175 +++++---- lib/singbox/model/singbox_rule.dart | 50 +-- lib/singbox/service/ffi_singbox_service.dart | 2 +- .../service/platform_singbox_service.dart | 2 +- lib/utils/link_parsers.dart | 3 +- 21 files changed, 501 insertions(+), 422 deletions(-) create mode 100644 lib/core/model/optional_range.dart delete mode 100644 lib/core/model/range.dart delete mode 100644 lib/features/config_option/model/config_option_patch.dart diff --git a/lib/core/http_client/http_client_provider.dart b/lib/core/http_client/http_client_provider.dart index 8335ec9b..8b73ca7c 100644 --- a/lib/core/http_client/http_client_provider.dart +++ b/lib/core/http_client/http_client_provider.dart @@ -15,11 +15,9 @@ DioHttpClient httpClient(HttpClientRef ref) { ); ref.listen( - configOptionNotifierProvider, - (_, next) { - if (next case AsyncData(value: final options)) { - client.setProxyPort(options.mixedPort); - } + configOptionNotifierProvider.selectAsync((data) => data.mixedPort), + (_, next) async { + client.setProxyPort(await next); }, fireImmediately: true, ); diff --git a/lib/core/model/optional_range.dart b/lib/core/model/optional_range.dart new file mode 100644 index 00000000..ae9fa649 --- /dev/null +++ b/lib/core/model/optional_range.dart @@ -0,0 +1,54 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:dartx/dartx.dart'; +import 'package:hiddify/core/localization/translations.dart'; + +part 'optional_range.mapper.dart'; + +@MappableClass() +class OptionalRange with OptionalRangeMappable { + const OptionalRange({this.min, this.max}); + + final int? min; + final int? max; + + String format() => [min, max].whereNotNull().join("-"); + String present(TranslationsEn t) => + format().isEmpty ? t.general.notSet : format(); + + factory OptionalRange._fromString( + String input, { + bool allowEmpty = true, + }) => + switch (input.split("-")) { + [final String val] when val.isEmpty && allowEmpty => + const OptionalRange(), + [final String min] => OptionalRange(min: int.parse(min)), + [final String min, final String max] => OptionalRange( + min: int.parse(min), + max: int.parse(max), + ), + _ => throw Exception("Invalid range: $input"), + }; + + static OptionalRange? tryParse( + String input, { + bool allowEmpty = false, + }) { + try { + return OptionalRange._fromString(input); + } catch (_) { + return null; + } + } +} + +class OptionalRangeJsonMapper extends SimpleMapper { + const OptionalRangeJsonMapper(); + + @override + OptionalRange decode(dynamic value) => + OptionalRange._fromString(value as String); + + @override + dynamic encode(OptionalRange self) => self.format(); +} diff --git a/lib/core/model/range.dart b/lib/core/model/range.dart deleted file mode 100644 index d644da6f..00000000 --- a/lib/core/model/range.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:dartx/dartx.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:hiddify/core/localization/translations.dart'; - -part 'range.freezed.dart'; - -@freezed -class RangeWithOptionalCeil with _$RangeWithOptionalCeil { - const RangeWithOptionalCeil._(); - - const factory RangeWithOptionalCeil({ - int? min, - int? max, - }) = _RangeWithOptionalCeil; - - String format() => [min, max].whereNotNull().join("-"); - String present(TranslationsEn t) => - format().isEmpty ? t.general.notSet : format(); - - factory RangeWithOptionalCeil._fromString( - String input, { - bool allowEmpty = true, - }) => - switch (input.split("-")) { - [final String val] when val.isEmpty && allowEmpty => - const RangeWithOptionalCeil(), - [final String min] => RangeWithOptionalCeil(min: int.parse(min)), - [final String min, final String max] => RangeWithOptionalCeil( - min: int.parse(min), - max: int.parse(max), - ), - _ => throw Exception("Invalid range: $input"), - }; - - static RangeWithOptionalCeil? tryParse( - String input, { - bool allowEmpty = false, - }) { - try { - return RangeWithOptionalCeil._fromString(input); - } catch (_) { - return null; - } - } -} - -class RangeWithOptionalCeilJsonConverter - implements JsonConverter { - const RangeWithOptionalCeilJsonConverter(); - - @override - RangeWithOptionalCeil fromJson(String json) => - RangeWithOptionalCeil._fromString(json); - - @override - String toJson(RangeWithOptionalCeil object) => object.format(); -} diff --git a/lib/core/utils/json_converters.dart b/lib/core/utils/json_converters.dart index 290f6da8..14585a76 100644 --- a/lib/core/utils/json_converters.dart +++ b/lib/core/utils/json_converters.dart @@ -1,11 +1,11 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:dart_mappable/dart_mappable.dart'; -class IntervalInSecondsConverter implements JsonConverter { - const IntervalInSecondsConverter(); +class IntervalInSecondsMapper extends SimpleMapper { + const IntervalInSecondsMapper(); @override - Duration fromJson(int json) => Duration(seconds: json); + Duration decode(dynamic value) => Duration(seconds: value as int); @override - int toJson(Duration object) => object.inSeconds; + dynamic encode(Duration self) => self.inSeconds; } diff --git a/lib/features/config_option/data/config_option_repository.dart b/lib/features/config_option/data/config_option_repository.dart index 79519308..9370b598 100644 --- a/lib/features/config_option/data/config_option_repository.dart +++ b/lib/features/config_option/data/config_option_repository.dart @@ -3,10 +3,8 @@ import 'package:hiddify/core/model/region.dart'; import 'package:hiddify/core/utils/exception_handler.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; import 'package:hiddify/features/config_option/model/config_option_failure.dart'; -import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/geo_asset/data/geo_asset_path_resolver.dart'; import 'package:hiddify/features/geo_asset/data/geo_asset_repository.dart'; -import 'package:hiddify/singbox/model/singbox_config_enum.dart'; import 'package:hiddify/singbox/model/singbox_config_option.dart'; import 'package:hiddify/singbox/model/singbox_rule.dart'; import 'package:hiddify/utils/utils.dart'; @@ -36,7 +34,7 @@ class ConfigOptionRepositoryImpl @override Either getConfigOption() { try { - final map = ConfigOptionEntity.initial.toJson(); + final map = ConfigOptionEntity.initial().toMap(); for (final key in map.keys) { final persisted = preferences.get(key); if (persisted != null) { @@ -51,7 +49,7 @@ class ConfigOptionRepositoryImpl map[key] = persisted; } } - final options = ConfigOptionEntity.fromJson(map); + final options = ConfigOptionEntityMapper.fromMap(map); return right(options); } catch (error, stackTrace) { return left(ConfigOptionUnexpectedFailure(error, stackTrace)); @@ -64,7 +62,7 @@ class ConfigOptionRepositoryImpl ) { return exceptionHandler( () async { - final map = patch.toJson(); + final map = patch.toMap(); await updateByJson(map); return right(unit); }, @@ -76,7 +74,7 @@ class ConfigOptionRepositoryImpl TaskEither resetConfigOption() { return exceptionHandler( () async { - final map = ConfigOptionEntity.initial.toJson(); + final map = ConfigOptionEntity.initial().toMap(); await updateByJson(map); return right(unit); }, @@ -88,7 +86,7 @@ class ConfigOptionRepositoryImpl Future updateByJson( Map options, ) async { - final map = ConfigOptionEntity.initial.toJson(); + final map = ConfigOptionEntity.initial().toMap(); for (final key in map.keys) { final value = options[key]; if (value != null) { @@ -172,48 +170,7 @@ class SingBoxConfigOptionRepositoryImpl final persisted = optionsRepository.getConfigOption().getOrElse((l) => throw l); - final singboxConfigOption = SingboxConfigOption( - executeConfigAsIs: false, - logLevel: persisted.logLevel, - resolveDestination: persisted.resolveDestination, - ipv6Mode: persisted.ipv6Mode, - remoteDnsAddress: persisted.remoteDnsAddress, - remoteDnsDomainStrategy: persisted.remoteDnsDomainStrategy, - directDnsAddress: persisted.directDnsAddress, - directDnsDomainStrategy: persisted.directDnsDomainStrategy, - mixedPort: persisted.mixedPort, - localDnsPort: persisted.localDnsPort, - tunImplementation: persisted.tunImplementation, - mtu: persisted.mtu, - strictRoute: persisted.strictRoute, - connectionTestUrl: persisted.connectionTestUrl, - urlTestInterval: persisted.urlTestInterval, - enableClashApi: persisted.enableClashApi, - clashApiPort: persisted.clashApiPort, - enableTun: persisted.serviceMode == ServiceMode.tun, - enableTunService: persisted.serviceMode == ServiceMode.tunService, - setSystemProxy: persisted.serviceMode == ServiceMode.systemProxy, - bypassLan: persisted.bypassLan, - allowConnectionFromLan: persisted.allowConnectionFromLan, - enableFakeDns: persisted.enableFakeDns, - enableDnsRouting: persisted.enableDnsRouting, - independentDnsCache: persisted.independentDnsCache, - enableTlsFragment: persisted.enableTlsFragment, - tlsFragmentSize: persisted.tlsFragmentSize, - tlsFragmentSleep: persisted.tlsFragmentSleep, - enableTlsMixedSniCase: persisted.enableTlsMixedSniCase, - enableTlsPadding: persisted.enableTlsPadding, - tlsPaddingSize: persisted.tlsPaddingSize, - enableMux: persisted.enableMux, - muxPadding: persisted.muxPadding, - muxMaxStreams: persisted.muxMaxStreams, - muxProtocol: persisted.muxProtocol, - enableWarp: persisted.enableWarp, - warpDetourMode: persisted.warpDetourMode, - warpLicenseKey: persisted.warpLicenseKey, - warpCleanIp: persisted.warpCleanIp, - warpPort: persisted.warpPort, - warpNoise: persisted.warpNoise, + final singboxConfigOption = persisted.toSingbox( geoipPath: geoAssetPathResolver.relativePath( geoAssets.geoip.providerName, geoAssets.geoip.fileName, diff --git a/lib/features/config_option/model/config_option_entity.dart b/lib/features/config_option/model/config_option_entity.dart index 676f575a..1c99e0f2 100644 --- a/lib/features/config_option/model/config_option_entity.dart +++ b/lib/features/config_option/model/config_option_entity.dart @@ -1,75 +1,107 @@ import 'dart:convert'; -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:hiddify/core/model/range.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:hiddify/core/model/optional_range.dart'; import 'package:hiddify/core/utils/json_converters.dart'; -import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/log/model/log_level.dart'; import 'package:hiddify/singbox/model/singbox_config_enum.dart'; +import 'package:hiddify/singbox/model/singbox_config_option.dart'; +import 'package:hiddify/singbox/model/singbox_rule.dart'; import 'package:hiddify/utils/platform_utils.dart'; -part 'config_option_entity.freezed.dart'; -part 'config_option_entity.g.dart'; +part 'config_option_entity.mapper.dart'; -@freezed -class ConfigOptionEntity with _$ConfigOptionEntity { - const ConfigOptionEntity._(); +@MappableClass( + caseStyle: CaseStyle.paramCase, + includeCustomMappers: [ + OptionalRangeJsonMapper(), + IntervalInSecondsMapper(), + ], +) +class ConfigOptionEntity with ConfigOptionEntityMappable { + const ConfigOptionEntity({ + required this.serviceMode, + this.logLevel = LogLevel.warn, + this.resolveDestination = false, + this.ipv6Mode = IPv6Mode.disable, + this.remoteDnsAddress = "http://1.1.1.1", + this.remoteDnsDomainStrategy = DomainStrategy.auto, + this.directDnsAddress = "1.1.1.1", + this.directDnsDomainStrategy = DomainStrategy.auto, + this.mixedPort = 2334, + this.localDnsPort = 6450, + this.tunImplementation = TunImplementation.mixed, + this.mtu = 9000, + this.strictRoute = true, + this.connectionTestUrl = "http://cp.cloudflare.com/", + this.urlTestInterval = const Duration(minutes: 10), + this.enableClashApi = true, + this.clashApiPort = 6756, + this.bypassLan = false, + this.allowConnectionFromLan = false, + this.enableFakeDns = false, + this.enableDnsRouting = true, + this.independentDnsCache = true, + this.enableTlsFragment = false, + this.tlsFragmentSize = const OptionalRange(min: 10, max: 100), + this.tlsFragmentSleep = const OptionalRange(min: 50, max: 200), + this.enableTlsMixedSniCase = false, + this.enableTlsPadding = false, + this.tlsPaddingSize = const OptionalRange(min: 100, max: 200), + this.enableMux = false, + this.muxPadding = false, + this.muxMaxStreams = 8, + this.muxProtocol = MuxProtocol.h2mux, + this.enableWarp = false, + this.warpDetourMode = WarpDetourMode.outbound, + this.warpLicenseKey = "", + this.warpCleanIp = "auto", + this.warpPort = 0, + this.warpNoise = const OptionalRange(), + }); - @JsonSerializable(fieldRename: FieldRename.kebab) - const factory ConfigOptionEntity({ - required ServiceMode serviceMode, - @Default(LogLevel.warn) LogLevel logLevel, - @Default(false) bool resolveDestination, - @Default(IPv6Mode.disable) IPv6Mode ipv6Mode, - @Default("udp://1.1.1.1") String remoteDnsAddress, - @Default(DomainStrategy.auto) DomainStrategy remoteDnsDomainStrategy, - @Default("1.1.1.1") String directDnsAddress, - @Default(DomainStrategy.auto) DomainStrategy directDnsDomainStrategy, - @Default(2334) int mixedPort, - @Default(6450) int localDnsPort, - @Default(TunImplementation.mixed) TunImplementation tunImplementation, - @Default(9000) int mtu, - @Default(true) bool strictRoute, - @Default("http://cp.cloudflare.com/") String connectionTestUrl, - @IntervalInSecondsConverter() - @Default(Duration(minutes: 10)) - Duration urlTestInterval, - @Default(true) bool enableClashApi, - @Default(6756) int clashApiPort, - @Default(false) bool bypassLan, - @Default(false) bool allowConnectionFromLan, - @Default(false) bool enableFakeDns, - @Default(true) bool enableDnsRouting, - @Default(true) bool independentDnsCache, - @Default(false) bool enableTlsFragment, - @RangeWithOptionalCeilJsonConverter() - @Default(RangeWithOptionalCeil(min: 10, max: 100)) - RangeWithOptionalCeil tlsFragmentSize, - @RangeWithOptionalCeilJsonConverter() - @Default(RangeWithOptionalCeil(min: 50, max: 200)) - RangeWithOptionalCeil tlsFragmentSleep, - @Default(false) bool enableTlsMixedSniCase, - @Default(false) bool enableTlsPadding, - @RangeWithOptionalCeilJsonConverter() - @Default(RangeWithOptionalCeil(min: 100, max: 200)) - RangeWithOptionalCeil tlsPaddingSize, - @Default(false) bool enableMux, - @Default(false) bool muxPadding, - @Default(8) int muxMaxStreams, - @Default(MuxProtocol.h2mux) MuxProtocol muxProtocol, - @Default(false) bool enableWarp, - @Default(WarpDetourMode.outbound) WarpDetourMode warpDetourMode, - @Default("") String warpLicenseKey, - @Default("auto") String warpCleanIp, - @Default(0) int warpPort, - @RangeWithOptionalCeilJsonConverter() - @Default(RangeWithOptionalCeil()) - RangeWithOptionalCeil warpNoise, - }) = _ConfigOptionEntity; + final ServiceMode serviceMode; + final LogLevel logLevel; + final bool resolveDestination; + @MappableField(key: "ipv6-mode") + final IPv6Mode ipv6Mode; + final String remoteDnsAddress; + final DomainStrategy remoteDnsDomainStrategy; + final String directDnsAddress; + final DomainStrategy directDnsDomainStrategy; + final int mixedPort; + final int localDnsPort; + final TunImplementation tunImplementation; + final int mtu; + final bool strictRoute; + final String connectionTestUrl; + final Duration urlTestInterval; + final bool enableClashApi; + final int clashApiPort; + final bool bypassLan; + final bool allowConnectionFromLan; + final bool enableFakeDns; + final bool enableDnsRouting; + final bool independentDnsCache; + final bool enableTlsFragment; + final OptionalRange tlsFragmentSize; + final OptionalRange tlsFragmentSleep; + final bool enableTlsMixedSniCase; + final bool enableTlsPadding; + final OptionalRange tlsPaddingSize; + final bool enableMux; + final bool muxPadding; + final int muxMaxStreams; + final MuxProtocol muxProtocol; + final bool enableWarp; + final WarpDetourMode warpDetourMode; + final String warpLicenseKey; + final String warpCleanIp; + final int warpPort; + final OptionalRange warpNoise; - static ConfigOptionEntity initial = ConfigOptionEntity( - serviceMode: ServiceMode.defaultMode, - ); + factory ConfigOptionEntity.initial() => + ConfigOptionEntity(serviceMode: ServiceMode.defaultMode); bool hasExperimentalOptions() { if (PlatformUtils.isDesktop && serviceMode == ServiceMode.tun) { @@ -88,56 +120,157 @@ class ConfigOptionEntity with _$ConfigOptionEntity { String format() { const encoder = JsonEncoder.withIndent(' '); - return encoder.convert(toJson()); + return encoder.convert(toMap()); } ConfigOptionEntity patch(ConfigOptionPatch patch) { - return copyWith( - serviceMode: patch.serviceMode ?? serviceMode, - logLevel: patch.logLevel ?? logLevel, - resolveDestination: patch.resolveDestination ?? resolveDestination, - ipv6Mode: patch.ipv6Mode ?? ipv6Mode, - remoteDnsAddress: patch.remoteDnsAddress ?? remoteDnsAddress, - remoteDnsDomainStrategy: - patch.remoteDnsDomainStrategy ?? remoteDnsDomainStrategy, - directDnsAddress: patch.directDnsAddress ?? directDnsAddress, - directDnsDomainStrategy: - patch.directDnsDomainStrategy ?? directDnsDomainStrategy, - mixedPort: patch.mixedPort ?? mixedPort, - localDnsPort: patch.localDnsPort ?? localDnsPort, - tunImplementation: patch.tunImplementation ?? tunImplementation, - mtu: patch.mtu ?? mtu, - strictRoute: patch.strictRoute ?? strictRoute, - connectionTestUrl: patch.connectionTestUrl ?? connectionTestUrl, - urlTestInterval: patch.urlTestInterval ?? urlTestInterval, - enableClashApi: patch.enableClashApi ?? enableClashApi, - clashApiPort: patch.clashApiPort ?? clashApiPort, - bypassLan: patch.bypassLan ?? bypassLan, - allowConnectionFromLan: - patch.allowConnectionFromLan ?? allowConnectionFromLan, - enableFakeDns: patch.enableFakeDns ?? enableFakeDns, - enableDnsRouting: patch.enableDnsRouting ?? enableDnsRouting, - independentDnsCache: patch.independentDnsCache ?? independentDnsCache, - enableTlsFragment: patch.enableTlsFragment ?? enableTlsFragment, - tlsFragmentSize: patch.tlsFragmentSize ?? tlsFragmentSize, - tlsFragmentSleep: patch.tlsFragmentSleep ?? tlsFragmentSleep, - enableTlsMixedSniCase: - patch.enableTlsMixedSniCase ?? enableTlsMixedSniCase, - enableTlsPadding: patch.enableTlsPadding ?? enableTlsPadding, - tlsPaddingSize: patch.tlsPaddingSize ?? tlsPaddingSize, - enableMux: patch.enableMux ?? enableMux, - muxPadding: patch.muxPadding ?? muxPadding, - muxMaxStreams: patch.muxMaxStreams ?? muxMaxStreams, - muxProtocol: patch.muxProtocol ?? muxProtocol, - enableWarp: patch.enableWarp ?? enableWarp, - warpDetourMode: patch.warpDetourMode ?? warpDetourMode, - warpLicenseKey: patch.warpLicenseKey ?? warpLicenseKey, - warpCleanIp: patch.warpCleanIp ?? warpCleanIp, - warpPort: patch.warpPort ?? warpPort, - warpNoise: patch.warpNoise ?? warpNoise, - ); + return copyWith.$delta(patch.delta()); } - factory ConfigOptionEntity.fromJson(Map json) => - _$ConfigOptionEntityFromJson(json); + SingboxConfigOption toSingbox({ + required String geoipPath, + required String geositePath, + required List rules, + }) { + return SingboxConfigOption( + executeConfigAsIs: false, + logLevel: logLevel, + resolveDestination: resolveDestination, + ipv6Mode: ipv6Mode, + remoteDnsAddress: remoteDnsAddress, + remoteDnsDomainStrategy: remoteDnsDomainStrategy, + directDnsAddress: directDnsAddress, + directDnsDomainStrategy: directDnsDomainStrategy, + mixedPort: mixedPort, + localDnsPort: localDnsPort, + tunImplementation: tunImplementation, + mtu: mtu, + strictRoute: strictRoute, + connectionTestUrl: connectionTestUrl, + urlTestInterval: urlTestInterval, + enableClashApi: enableClashApi, + clashApiPort: clashApiPort, + enableTun: serviceMode == ServiceMode.tun, + enableTunService: serviceMode == ServiceMode.tunService, + setSystemProxy: serviceMode == ServiceMode.systemProxy, + bypassLan: bypassLan, + allowConnectionFromLan: allowConnectionFromLan, + enableFakeDns: enableFakeDns, + enableDnsRouting: enableDnsRouting, + independentDnsCache: independentDnsCache, + enableTlsFragment: enableTlsFragment, + tlsFragmentSize: tlsFragmentSize, + tlsFragmentSleep: tlsFragmentSleep, + enableTlsMixedSniCase: enableTlsMixedSniCase, + enableTlsPadding: enableTlsPadding, + tlsPaddingSize: tlsPaddingSize, + enableMux: enableMux, + muxPadding: muxPadding, + muxMaxStreams: muxMaxStreams, + muxProtocol: muxProtocol, + enableWarp: enableWarp, + warpDetourMode: warpDetourMode, + warpLicenseKey: warpLicenseKey, + warpCleanIp: warpCleanIp, + warpPort: warpPort, + warpNoise: warpNoise, + geoipPath: geoipPath, + geositePath: geositePath, + rules: rules, + ); + } +} + +@MappableClass( + caseStyle: CaseStyle.paramCase, + ignoreNull: true, + includeCustomMappers: [ + OptionalRangeJsonMapper(), + IntervalInSecondsMapper(), + ], +) +class ConfigOptionPatch with ConfigOptionPatchMappable { + const ConfigOptionPatch({ + this.serviceMode, + this.logLevel, + this.resolveDestination, + this.ipv6Mode, + this.remoteDnsAddress, + this.remoteDnsDomainStrategy, + this.directDnsAddress, + this.directDnsDomainStrategy, + this.mixedPort, + this.localDnsPort, + this.tunImplementation, + this.mtu, + this.strictRoute, + this.connectionTestUrl, + this.urlTestInterval, + this.enableClashApi, + this.clashApiPort, + this.bypassLan, + this.allowConnectionFromLan, + this.enableFakeDns, + this.enableDnsRouting, + this.independentDnsCache, + this.enableTlsFragment, + this.tlsFragmentSize, + this.tlsFragmentSleep, + this.enableTlsMixedSniCase, + this.enableTlsPadding, + this.tlsPaddingSize, + this.enableMux, + this.muxPadding, + this.muxMaxStreams, + this.muxProtocol, + this.enableWarp, + this.warpDetourMode, + this.warpLicenseKey, + this.warpCleanIp, + this.warpPort, + this.warpNoise, + }); + + final ServiceMode? serviceMode; + final LogLevel? logLevel; + final bool? resolveDestination; + @MappableField(key: "ipv6-mode") + final IPv6Mode? ipv6Mode; + final String? remoteDnsAddress; + final DomainStrategy? remoteDnsDomainStrategy; + final String? directDnsAddress; + final DomainStrategy? directDnsDomainStrategy; + final int? mixedPort; + final int? localDnsPort; + final TunImplementation? tunImplementation; + final int? mtu; + final bool? strictRoute; + final String? connectionTestUrl; + final Duration? urlTestInterval; + final bool? enableClashApi; + final int? clashApiPort; + final bool? bypassLan; + final bool? allowConnectionFromLan; + final bool? enableFakeDns; + final bool? enableDnsRouting; + final bool? independentDnsCache; + final bool? enableTlsFragment; + final OptionalRange? tlsFragmentSize; + final OptionalRange? tlsFragmentSleep; + final bool? enableTlsMixedSniCase; + final bool? enableTlsPadding; + final OptionalRange? tlsPaddingSize; + final bool? enableMux; + final bool? muxPadding; + final int? muxMaxStreams; + final MuxProtocol? muxProtocol; + final bool? enableWarp; + final WarpDetourMode? warpDetourMode; + final String? warpLicenseKey; + final String? warpCleanIp; + final int? warpPort; + final OptionalRange? warpNoise; + + Map delta() => + toMap()..removeWhere((key, value) => value == null); } diff --git a/lib/features/config_option/model/config_option_patch.dart b/lib/features/config_option/model/config_option_patch.dart deleted file mode 100644 index b9558a3f..00000000 --- a/lib/features/config_option/model/config_option_patch.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:hiddify/core/model/range.dart'; -import 'package:hiddify/core/utils/json_converters.dart'; -import 'package:hiddify/features/log/model/log_level.dart'; -import 'package:hiddify/singbox/model/singbox_config_enum.dart'; - -part 'config_option_patch.freezed.dart'; -part 'config_option_patch.g.dart'; - -@freezed -class ConfigOptionPatch with _$ConfigOptionPatch { - const ConfigOptionPatch._(); - - @JsonSerializable(fieldRename: FieldRename.kebab) - const factory ConfigOptionPatch({ - ServiceMode? serviceMode, - LogLevel? logLevel, - bool? resolveDestination, - IPv6Mode? ipv6Mode, - String? remoteDnsAddress, - DomainStrategy? remoteDnsDomainStrategy, - String? directDnsAddress, - DomainStrategy? directDnsDomainStrategy, - int? mixedPort, - int? localDnsPort, - TunImplementation? tunImplementation, - int? mtu, - bool? strictRoute, - String? connectionTestUrl, - @IntervalInSecondsConverter() Duration? urlTestInterval, - bool? enableClashApi, - int? clashApiPort, - bool? bypassLan, - bool? allowConnectionFromLan, - bool? enableFakeDns, - bool? enableDnsRouting, - bool? independentDnsCache, - bool? enableTlsFragment, - @RangeWithOptionalCeilJsonConverter() - RangeWithOptionalCeil? tlsFragmentSize, - @RangeWithOptionalCeilJsonConverter() - RangeWithOptionalCeil? tlsFragmentSleep, - bool? enableTlsMixedSniCase, - bool? enableTlsPadding, - @RangeWithOptionalCeilJsonConverter() RangeWithOptionalCeil? tlsPaddingSize, - bool? enableMux, - bool? muxPadding, - int? muxMaxStreams, - MuxProtocol? muxProtocol, - bool? enableWarp, - WarpDetourMode? warpDetourMode, - String? warpLicenseKey, - String? warpCleanIp, - int? warpPort, - @RangeWithOptionalCeilJsonConverter() RangeWithOptionalCeil? warpNoise, - }) = _ConfigOptionPatch; - - factory ConfigOptionPatch.fromJson(Map json) => - _$ConfigOptionPatchFromJson(json); -} diff --git a/lib/features/config_option/notifier/config_option_notifier.dart b/lib/features/config_option/notifier/config_option_notifier.dart index 77a67763..d826b5f0 100644 --- a/lib/features/config_option/notifier/config_option_notifier.dart +++ b/lib/features/config_option/notifier/config_option_notifier.dart @@ -1,6 +1,5 @@ import 'package:hiddify/features/config_option/data/config_option_data_providers.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; -import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/utils/custom_loggers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; diff --git a/lib/features/config_option/overview/config_options_page.dart b/lib/features/config_option/overview/config_options_page.dart index 46df415c..29fee700 100644 --- a/lib/features/config_option/overview/config_options_page.dart +++ b/lib/features/config_option/overview/config_options_page.dart @@ -5,12 +5,11 @@ import 'package:flutter/services.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/failures.dart'; -import 'package:hiddify/core/model/range.dart'; +import 'package:hiddify/core/model/optional_range.dart'; import 'package:hiddify/core/widget/adaptive_icon.dart'; import 'package:hiddify/core/widget/tip_card.dart'; import 'package:hiddify/features/common/nested_app_bar.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; -import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart'; import 'package:hiddify/features/config_option/overview/warp_options_widgets.dart'; import 'package:hiddify/features/log/model/log_level.dart'; @@ -28,7 +27,7 @@ class ConfigOptionsPage extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final t = ref.watch(translationsProvider); - final defaultOptions = ConfigOptionEntity.initial; + final defaultOptions = ConfigOptionEntity.initial(); final asyncOptions = ref.watch(configOptionNotifierProvider); Future changeOption(ConfigOptionPatch patch) async { @@ -349,8 +348,7 @@ class ConfigOptionsPage extends HookConsumerWidget { if (range == null) return; await changeOption( ConfigOptionPatch( - tlsFragmentSize: - RangeWithOptionalCeil.tryParse(range), + tlsFragmentSize: OptionalRange.tryParse(range), ), ); }, @@ -367,8 +365,7 @@ class ConfigOptionsPage extends HookConsumerWidget { if (range == null) return; await changeOption( ConfigOptionPatch( - tlsFragmentSleep: - RangeWithOptionalCeil.tryParse(range), + tlsFragmentSleep: OptionalRange.tryParse(range), ), ); }, @@ -402,7 +399,7 @@ class ConfigOptionsPage extends HookConsumerWidget { if (range == null) return; await changeOption( ConfigOptionPatch( - tlsPaddingSize: RangeWithOptionalCeil.tryParse(range), + tlsPaddingSize: OptionalRange.tryParse(range), ), ); }, diff --git a/lib/features/config_option/overview/warp_options_widgets.dart b/lib/features/config_option/overview/warp_options_widgets.dart index 951bae41..f88888a2 100644 --- a/lib/features/config_option/overview/warp_options_widgets.dart +++ b/lib/features/config_option/overview/warp_options_widgets.dart @@ -3,9 +3,8 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/constants.dart'; -import 'package:hiddify/core/model/range.dart'; +import 'package:hiddify/core/model/optional_range.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart'; -import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/config_option/notifier/warp_option_notifier.dart'; import 'package:hiddify/features/settings/widgets/settings_input_dialog.dart'; import 'package:hiddify/singbox/model/singbox_config_enum.dart'; @@ -134,10 +133,7 @@ class WarpOptionsTiles extends HookConsumerWidget { if (warpNoise == null) return; await onChange( ConfigOptionPatch( - warpNoise: RangeWithOptionalCeil.tryParse( - warpNoise, - allowEmpty: true, - ), + warpNoise: OptionalRange.tryParse(warpNoise, allowEmpty: true), ), ); }, diff --git a/lib/features/connection/data/connection_platform_source.dart b/lib/features/connection/data/connection_platform_source.dart index e0e88a7c..a2c6093e 100644 --- a/lib/features/connection/data/connection_platform_source.dart +++ b/lib/features/connection/data/connection_platform_source.dart @@ -1,12 +1,10 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; import 'package:hiddify/core/utils/ffi_utils.dart'; import 'package:hiddify/utils/custom_loggers.dart'; import 'package:hiddify/utils/utils.dart'; -import 'package:path/path.dart' as p; import 'package:posix/posix.dart'; import 'package:win32/win32.dart'; diff --git a/lib/features/log/model/log_level.dart b/lib/features/log/model/log_level.dart index a81cf47c..714e7d38 100644 --- a/lib/features/log/model/log_level.dart +++ b/lib/features/log/model/log_level.dart @@ -1,6 +1,10 @@ +import 'package:dart_mappable/dart_mappable.dart'; import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; +part 'log_level.mapper.dart'; + +@MappableEnum() enum LogLevel { trace, debug, diff --git a/lib/features/proxy/active/active_proxy_footer.dart b/lib/features/proxy/active/active_proxy_footer.dart index a33250f9..2cd90270 100644 --- a/lib/features/proxy/active/active_proxy_footer.dart +++ b/lib/features/proxy/active/active_proxy_footer.dart @@ -1,7 +1,6 @@ import 'package:dartx/dartx.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/semantics.dart'; import 'package:gap/gap.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/widget/animated_visibility.dart'; diff --git a/lib/features/proxy/overview/proxies_overview_notifier.dart b/lib/features/proxy/overview/proxies_overview_notifier.dart index 292094a4..029631c4 100644 --- a/lib/features/proxy/overview/proxies_overview_notifier.dart +++ b/lib/features/proxy/overview/proxies_overview_notifier.dart @@ -8,7 +8,6 @@ import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; import 'package:hiddify/features/proxy/data/proxy_data_providers.dart'; import 'package:hiddify/features/proxy/model/proxy_entity.dart'; import 'package:hiddify/features/proxy/model/proxy_failure.dart'; -import 'package:hiddify/singbox/model/singbox_proxy_type.dart'; import 'package:hiddify/utils/pref_notifier.dart'; import 'package:hiddify/utils/riverpod_utils.dart'; import 'package:hiddify/utils/utils.dart'; @@ -94,14 +93,14 @@ class ProxiesOverviewNotifier extends _$ProxiesOverviewNotifier with AppLogger { for (final group in proxies) { final sortedItems = switch (sortBy) { ProxiesSort.name => group.items.sortedWith((a, b) { - if(a.type.isGroup && !b.type.isGroup) return -1; - if(!a.type.isGroup && b.type.isGroup) return 1; + if (a.type.isGroup && !b.type.isGroup) return -1; + if (!a.type.isGroup && b.type.isGroup) return 1; return a.tag.compareTo(b.tag); - }), + }), ProxiesSort.delay => group.items.sortedWith((a, b) { - if(a.type.isGroup && !b.type.isGroup) return -1; - if(!a.type.isGroup && b.type.isGroup) return 1; - + if (a.type.isGroup && !b.type.isGroup) return -1; + if (!a.type.isGroup && b.type.isGroup) return 1; + final ai = a.urlTestDelay; final bi = b.urlTestDelay; if (ai == 0 && bi == 0) return -1; diff --git a/lib/features/system_tray/notifier/system_tray_notifier.dart b/lib/features/system_tray/notifier/system_tray_notifier.dart index 37a9cbdb..8ed0f646 100644 --- a/lib/features/system_tray/notifier/system_tray_notifier.dart +++ b/lib/features/system_tray/notifier/system_tray_notifier.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/model/constants.dart'; import 'package:hiddify/core/router/router.dart'; -import 'package:hiddify/features/config_option/model/config_option_patch.dart'; +import 'package:hiddify/features/config_option/model/config_option_entity.dart'; import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart'; import 'package:hiddify/features/connection/model/connection_status.dart'; import 'package:hiddify/features/connection/notifier/connection_notifier.dart'; diff --git a/lib/singbox/model/singbox_config_enum.dart b/lib/singbox/model/singbox_config_enum.dart index 9bcdde20..10d616a3 100644 --- a/lib/singbox/model/singbox_config_enum.dart +++ b/lib/singbox/model/singbox_config_enum.dart @@ -1,19 +1,24 @@ import 'dart:io'; +import 'package:dart_mappable/dart_mappable.dart'; import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/utils/platform_utils.dart'; -import 'package:json_annotation/json_annotation.dart'; -@JsonEnum(valueField: 'key') +part 'singbox_config_enum.mapper.dart'; + +@MappableEnum() enum ServiceMode { - proxy("proxy"), - systemProxy("system-proxy"), - tun("vpn"), - tunService("vpn-service"); + @MappableValue("proxy") + proxy, - const ServiceMode(this.key); + @MappableValue("system-proxy") + systemProxy, - final String key; + @MappableValue("vpn") + tun, + + @MappableValue("vpn-service") + tunService; static ServiceMode get defaultMode => PlatformUtils.isDesktop ? systemProxy : tun; @@ -39,16 +44,19 @@ enum ServiceMode { }; } -@JsonEnum(valueField: 'key') +@MappableEnum() enum IPv6Mode { - disable("ipv4_only"), - enable("prefer_ipv4"), - prefer("prefer_ipv6"), - only("ipv6_only"); + @MappableValue("ipv4_only") + disable, - const IPv6Mode(this.key); + @MappableValue("prefer_ipv4") + enable, - final String key; + @MappableValue("prefer_ipv6") + prefer, + + @MappableValue("ipv6_only") + only; String present(TranslationsEn t) => switch (this) { disable => t.settings.config.ipv6Modes.disable, @@ -58,12 +66,21 @@ enum IPv6Mode { }; } -@JsonEnum(valueField: 'key') +@MappableEnum() enum DomainStrategy { + @MappableValue("") auto(""), + + @MappableValue("prefer_ipv6") preferIpv6("prefer_ipv6"), + + @MappableValue("prefer_ipv4") preferIpv4("prefer_ipv4"), + + @MappableValue("ipv4_only") ipv4Only("ipv4_only"), + + @MappableValue("ipv6_only") ipv6Only("ipv6_only"); const DomainStrategy(this.key); @@ -76,18 +93,21 @@ enum DomainStrategy { }; } +@MappableEnum() enum TunImplementation { mixed, system, gVisor; } +@MappableEnum() enum MuxProtocol { h2mux, smux, yamux; } +@MappableEnum() enum WarpDetourMode { outbound, inbound; diff --git a/lib/singbox/model/singbox_config_option.dart b/lib/singbox/model/singbox_config_option.dart index 1dd9dbd8..511838fa 100644 --- a/lib/singbox/model/singbox_config_option.dart +++ b/lib/singbox/model/singbox_config_option.dart @@ -1,86 +1,127 @@ import 'dart:convert'; -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:hiddify/core/model/range.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:hiddify/core/model/optional_range.dart'; import 'package:hiddify/features/log/model/log_level.dart'; import 'package:hiddify/singbox/model/singbox_config_enum.dart'; import 'package:hiddify/singbox/model/singbox_rule.dart'; -part 'singbox_config_option.freezed.dart'; -part 'singbox_config_option.g.dart'; +part 'singbox_config_option.mapper.dart'; -@freezed -class SingboxConfigOption with _$SingboxConfigOption { - const SingboxConfigOption._(); +@MappableClass( + caseStyle: CaseStyle.paramCase, + includeCustomMappers: [ + OptionalRangeJsonMapper(), + IntervalMapper(), + ], +) +class SingboxConfigOption with SingboxConfigOptionMappable { + const SingboxConfigOption({ + required this.executeConfigAsIs, + required this.logLevel, + required this.resolveDestination, + required this.ipv6Mode, + required this.remoteDnsAddress, + required this.remoteDnsDomainStrategy, + required this.directDnsAddress, + required this.directDnsDomainStrategy, + required this.mixedPort, + required this.localDnsPort, + required this.tunImplementation, + required this.mtu, + required this.strictRoute, + required this.connectionTestUrl, + required this.urlTestInterval, + required this.enableClashApi, + required this.clashApiPort, + required this.enableTun, + required this.enableTunService, + required this.setSystemProxy, + required this.bypassLan, + required this.allowConnectionFromLan, + required this.enableFakeDns, + required this.enableDnsRouting, + required this.independentDnsCache, + required this.enableTlsFragment, + required this.tlsFragmentSize, + required this.tlsFragmentSleep, + required this.enableTlsMixedSniCase, + required this.enableTlsPadding, + required this.tlsPaddingSize, + required this.enableMux, + required this.muxPadding, + required this.muxMaxStreams, + required this.muxProtocol, + required this.enableWarp, + required this.warpDetourMode, + required this.warpLicenseKey, + required this.warpCleanIp, + required this.warpPort, + required this.warpNoise, + required this.geoipPath, + required this.geositePath, + required this.rules, + }); - @JsonSerializable(fieldRename: FieldRename.kebab) - const factory SingboxConfigOption({ - required bool executeConfigAsIs, - required LogLevel logLevel, - required bool resolveDestination, - required IPv6Mode ipv6Mode, - required String remoteDnsAddress, - required DomainStrategy remoteDnsDomainStrategy, - required String directDnsAddress, - required DomainStrategy directDnsDomainStrategy, - required int mixedPort, - required int localDnsPort, - required TunImplementation tunImplementation, - required int mtu, - required bool strictRoute, - required String connectionTestUrl, - @IntervalConverter() required Duration urlTestInterval, - required bool enableClashApi, - required int clashApiPort, - required bool enableTun, - required bool enableTunService, - required bool setSystemProxy, - required bool bypassLan, - required bool allowConnectionFromLan, - required bool enableFakeDns, - required bool enableDnsRouting, - required bool independentDnsCache, - required bool enableTlsFragment, - @RangeWithOptionalCeilJsonConverter() - required RangeWithOptionalCeil tlsFragmentSize, - @RangeWithOptionalCeilJsonConverter() - required RangeWithOptionalCeil tlsFragmentSleep, - required bool enableTlsMixedSniCase, - required bool enableTlsPadding, - @RangeWithOptionalCeilJsonConverter() - required RangeWithOptionalCeil tlsPaddingSize, - required bool enableMux, - required bool muxPadding, - required int muxMaxStreams, - required MuxProtocol muxProtocol, - required bool enableWarp, - required WarpDetourMode warpDetourMode, - required String warpLicenseKey, - required String warpCleanIp, - required int warpPort, - @RangeWithOptionalCeilJsonConverter() - required RangeWithOptionalCeil warpNoise, - required String geoipPath, - required String geositePath, - required List rules, - }) = _SingboxConfigOption; + final bool executeConfigAsIs; + final LogLevel logLevel; + final bool resolveDestination; + @MappableField(key: "ipv6-mode") + final IPv6Mode ipv6Mode; + final String remoteDnsAddress; + final DomainStrategy remoteDnsDomainStrategy; + final String directDnsAddress; + final DomainStrategy directDnsDomainStrategy; + final int mixedPort; + final int localDnsPort; + final TunImplementation tunImplementation; + final int mtu; + final bool strictRoute; + final String connectionTestUrl; + final Duration urlTestInterval; + final bool enableClashApi; + final int clashApiPort; + final bool enableTun; + final bool enableTunService; + final bool setSystemProxy; + final bool bypassLan; + final bool allowConnectionFromLan; + final bool enableFakeDns; + final bool enableDnsRouting; + final bool independentDnsCache; + final bool enableTlsFragment; + final OptionalRange tlsFragmentSize; + final OptionalRange tlsFragmentSleep; + final bool enableTlsMixedSniCase; + final bool enableTlsPadding; + final OptionalRange tlsPaddingSize; + final bool enableMux; + final bool muxPadding; + final int muxMaxStreams; + final MuxProtocol muxProtocol; + final bool enableWarp; + final WarpDetourMode warpDetourMode; + final String warpLicenseKey; + final String warpCleanIp; + final int warpPort; + final OptionalRange warpNoise; + final String geoipPath; + final String geositePath; + final List rules; String format() { const encoder = JsonEncoder.withIndent(' '); - return encoder.convert(toJson()); + return encoder.convert(toMap()); } - - factory SingboxConfigOption.fromJson(Map json) => - _$SingboxConfigOptionFromJson(json); } -class IntervalConverter implements JsonConverter { - const IntervalConverter(); +class IntervalMapper extends SimpleMapper { + const IntervalMapper(); @override - Duration fromJson(String json) => - Duration(minutes: int.parse(json.replaceAll("m", ""))); + Duration decode(dynamic value) => + Duration(minutes: int.parse((value as String).replaceAll("m", ""))); @override - String toJson(Duration object) => "${object.inMinutes}m"; + String encode(Duration self) => "${self.inMinutes}m"; } diff --git a/lib/singbox/model/singbox_rule.dart b/lib/singbox/model/singbox_rule.dart index b927ffee..d93b2562 100644 --- a/lib/singbox/model/singbox_rule.dart +++ b/lib/singbox/model/singbox_rule.dart @@ -1,35 +1,37 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:dart_mappable/dart_mappable.dart'; -part 'singbox_rule.freezed.dart'; -part 'singbox_rule.g.dart'; +part 'singbox_rule.mapper.dart'; -@freezed -class SingboxRule with _$SingboxRule { - const SingboxRule._(); +@MappableClass() +class SingboxRule with SingboxRuleMappable { + const SingboxRule({ + this.domains, + this.ip, + this.port, + this.protocol, + this.network = RuleNetwork.tcpAndUdp, + this.outbound = RuleOutbound.proxy, + }); - @JsonSerializable(fieldRename: FieldRename.kebab) - const factory SingboxRule({ - String? domains, - String? ip, - String? port, - String? protocol, - @Default(RuleNetwork.tcpAndUdp) RuleNetwork network, - @Default(RuleOutbound.proxy) RuleOutbound outbound, - }) = _SingboxRule; - - factory SingboxRule.fromJson(Map json) => - _$SingboxRuleFromJson(json); + final String? domains; + final String? ip; + final String? port; + final String? protocol; + final RuleNetwork network; + final RuleOutbound outbound; } +@MappableEnum() enum RuleOutbound { proxy, bypass, block } -@JsonEnum(valueField: 'key') +@MappableEnum() enum RuleNetwork { - tcpAndUdp(""), - tcp("tcp"), - udp("udp"); + @MappableValue("") + tcpAndUdp, - const RuleNetwork(this.key); + @MappableValue("tcp") + tcp, - final String? key; + @MappableValue("udp") + udp; } diff --git a/lib/singbox/service/ffi_singbox_service.dart b/lib/singbox/service/ffi_singbox_service.dart index 3626c5b9..ee60a00c 100644 --- a/lib/singbox/service/ffi_singbox_service.dart +++ b/lib/singbox/service/ffi_singbox_service.dart @@ -121,7 +121,7 @@ class FFISingboxService with InfraLogger implements SingboxService { return TaskEither( () => CombineWorker().execute( () { - final json = jsonEncode(options.toJson()); + final json = options.toJson(); final err = _box .changeConfigOptions(json.toNativeUtf8().cast()) .cast() diff --git a/lib/singbox/service/platform_singbox_service.dart b/lib/singbox/service/platform_singbox_service.dart index 2aadacf5..bdf96804 100644 --- a/lib/singbox/service/platform_singbox_service.dart +++ b/lib/singbox/service/platform_singbox_service.dart @@ -80,7 +80,7 @@ class PlatformSingboxService with InfraLogger implements SingboxService { loggy.debug("changing options"); await methodChannel.invokeMethod( "change_config_options", - jsonEncode(options.toJson()), + options.toJson(), ); return right(unit); }, diff --git a/lib/utils/link_parsers.dart b/lib/utils/link_parsers.dart index 23dee9c1..74b1463f 100644 --- a/lib/utils/link_parsers.dart +++ b/lib/utils/link_parsers.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:dartx/dartx.dart'; -import 'package:fpdart/fpdart.dart'; import 'package:hiddify/features/profile/data/profile_parser.dart'; import 'package:hiddify/features/profile/data/profile_repository.dart'; import 'package:hiddify/singbox/model/singbox_proxy_type.dart'; @@ -71,7 +70,7 @@ abstract class LinkParser { if (subinfo.name.isNotNullOrEmpty && subinfo.name != "Remote Profile") { name = subinfo.name; } - + return (content: normalContent, name: name ?? ProxyType.unknown.label); } From d9ca446e1efb335fe58b86dc1e6d2b812d077a05 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 22:37:09 +0330 Subject: [PATCH 79/83] release: version 0.15.10-dev --- dependencies.properties | 2 +- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ libcore | 2 +- pubspec.yaml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dependencies.properties b/dependencies.properties index f29145a6..6b4f141e 100644 --- a/dependencies.properties +++ b/dependencies.properties @@ -1 +1 @@ -core.version=0.15.0 \ No newline at end of file +core.version=0.15.12 \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 03ed460b..ea34ec95 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -751,7 +751,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1509; + CURRENT_PROJECT_VERSION = 1510; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -770,7 +770,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.9; + MARKETING_VERSION = 0.15.10; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-lresolv"; @@ -802,7 +802,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1509; + CURRENT_PROJECT_VERSION = 1510; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -821,7 +821,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.9; + MARKETING_VERSION = 0.15.10; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; @@ -851,7 +851,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1509; + CURRENT_PROJECT_VERSION = 1510; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -870,7 +870,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.9; + MARKETING_VERSION = 0.15.10; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; diff --git a/libcore b/libcore index 5b3fc37a..a006c94c 160000 --- a/libcore +++ b/libcore @@ -1 +1 @@ -Subproject commit 5b3fc37aedc6d0883f807df97f5f368a4be77195 +Subproject commit a006c94cdf5c6db5a569303357818143671c229c diff --git a/pubspec.yaml b/pubspec.yaml index 5d170b05..8bd1b4ba 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: hiddify description: Cross Platform Multi Protocol Proxy Frontend. publish_to: "none" -version: 0.15.9+1509 +version: 0.15.10+1510 environment: sdk: ">=3.2.0 <4.0.0" From f3e9db9b551a4dc9b9b796920019eab3b82b2e59 Mon Sep 17 00:00:00 2001 From: Amir Date: Thu, 15 Feb 2024 23:05:00 +0330 Subject: [PATCH 80/83] Bugs in config_option_entity.dart --- .../config_option/model/config_option_entity.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/features/config_option/model/config_option_entity.dart b/lib/features/config_option/model/config_option_entity.dart index 1c99e0f2..bfa82697 100644 --- a/lib/features/config_option/model/config_option_entity.dart +++ b/lib/features/config_option/model/config_option_entity.dart @@ -24,7 +24,7 @@ class ConfigOptionEntity with ConfigOptionEntityMappable { this.logLevel = LogLevel.warn, this.resolveDestination = false, this.ipv6Mode = IPv6Mode.disable, - this.remoteDnsAddress = "http://1.1.1.1", + this.remoteDnsAddress = "udp://1.1.1.1", this.remoteDnsDomainStrategy = DomainStrategy.auto, this.directDnsAddress = "1.1.1.1", this.directDnsDomainStrategy = DomainStrategy.auto, @@ -43,11 +43,11 @@ class ConfigOptionEntity with ConfigOptionEntityMappable { this.enableDnsRouting = true, this.independentDnsCache = true, this.enableTlsFragment = false, - this.tlsFragmentSize = const OptionalRange(min: 10, max: 100), - this.tlsFragmentSleep = const OptionalRange(min: 50, max: 200), + this.tlsFragmentSize = const OptionalRange(min: 1, max: 500), + this.tlsFragmentSleep = const OptionalRange(min: 1, max: 500), this.enableTlsMixedSniCase = false, this.enableTlsPadding = false, - this.tlsPaddingSize = const OptionalRange(min: 100, max: 200), + this.tlsPaddingSize = const OptionalRange(min: 1, max: 1500), this.enableMux = false, this.muxPadding = false, this.muxMaxStreams = 8, From c6fba45c8d90520dcc856180a0d7eae9b67aa6eb Mon Sep 17 00:00:00 2001 From: Amir Date: Thu, 15 Feb 2024 23:07:52 +0330 Subject: [PATCH 81/83] Update config_option_entity.dart --- lib/features/config_option/model/config_option_entity.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/features/config_option/model/config_option_entity.dart b/lib/features/config_option/model/config_option_entity.dart index bfa82697..b2a4bf99 100644 --- a/lib/features/config_option/model/config_option_entity.dart +++ b/lib/features/config_option/model/config_option_entity.dart @@ -44,7 +44,7 @@ class ConfigOptionEntity with ConfigOptionEntityMappable { this.independentDnsCache = true, this.enableTlsFragment = false, this.tlsFragmentSize = const OptionalRange(min: 1, max: 500), - this.tlsFragmentSleep = const OptionalRange(min: 1, max: 500), + this.tlsFragmentSleep = const OptionalRange(min: 0, max: 500), this.enableTlsMixedSniCase = false, this.enableTlsPadding = false, this.tlsPaddingSize = const OptionalRange(min: 1, max: 1500), From 2eba5e296f4f53272766bedf851f4e7f8f78ad19 Mon Sep 17 00:00:00 2001 From: Ali Afsharzadeh Date: Thu, 15 Feb 2024 23:24:42 +0330 Subject: [PATCH 82/83] fix: update download paths in release page --- .github/release_message.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/release_message.md b/.github/release_message.md index 6aa515a6..83f4ef86 100644 --- a/.github/release_message.md +++ b/.github/release_message.md @@ -33,27 +33,27 @@ Android -
    -
    -
    - +
    +
    +
    + Windows -
    - +
    + macOS (v10.15+) - + Linux -
    -
    - +
    +
    + From 3bd4a206bc6523c04d2a99749c574ca939b0c24b Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 15 Feb 2024 23:24:46 +0330 Subject: [PATCH 83/83] release: version 0.15.11-dev --- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index ea34ec95..8fd9f6a5 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -751,7 +751,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1510; + CURRENT_PROJECT_VERSION = 1511; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -770,7 +770,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.10; + MARKETING_VERSION = 0.15.11; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = "-lresolv"; @@ -802,7 +802,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1510; + CURRENT_PROJECT_VERSION = 1511; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -821,7 +821,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.10; + MARKETING_VERSION = 0.15.11; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; @@ -851,7 +851,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1510; + CURRENT_PROJECT_VERSION = 1511; ENABLE_USER_SCRIPT_SANDBOXING = YES; EXCLUDED_ARCHS = armv7; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -870,7 +870,7 @@ "@executable_path/libcore/", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.15.10; + MARKETING_VERSION = 0.15.11; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-lresolv"; diff --git a/pubspec.yaml b/pubspec.yaml index 8bd1b4ba..c4e80b5e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: hiddify description: Cross Platform Multi Protocol Proxy Frontend. publish_to: "none" -version: 0.15.10+1510 +version: 0.15.11+1511 environment: sdk: ">=3.2.0 <4.0.0"