From ae8e307ccaedff6b74c80e65f2b28d2b3d9228b2 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 5 Nov 2025 10:21:47 +0800 Subject: [PATCH 001/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98vip?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/network/api.dart | 9 ++ .../goods/bindings/goodsai_binding.dart | 9 ++ .../goods/bindings/goodsmeet_binding.dart | 9 ++ .../goods/bindings/goodstrade_binding.dart | 9 ++ .../goods/bindings/goodsvip_binding.dart | 9 ++ .../goods/controllers/goodsai_controller.dart | 65 +++++++++ .../controllers/goodsmeet_controller.dart | 65 +++++++++ .../controllers/goodstrade_controller.dart | 65 +++++++++ .../controllers/goodsvip_controller.dart | 66 +++++++++ lib/modules/goods/views/goodsai_view.dart | 131 +++++++++++++++++ lib/modules/goods/views/goodsmeet_view.dart | 132 +++++++++++++++++ lib/modules/goods/views/goodstrade_view.dart | 132 +++++++++++++++++ lib/modules/goods/views/goodsvip_view.dart | 137 ++++++++++++++++++ lib/modules/settings/views/settings_view.dart | 117 +++++++++++++++ lib/routes/app_pages.dart | 37 ++++- lib/routes/app_routes.dart | 6 + 16 files changed, 997 insertions(+), 1 deletion(-) create mode 100644 lib/modules/goods/bindings/goodsai_binding.dart create mode 100644 lib/modules/goods/bindings/goodsmeet_binding.dart create mode 100644 lib/modules/goods/bindings/goodstrade_binding.dart create mode 100644 lib/modules/goods/bindings/goodsvip_binding.dart create mode 100644 lib/modules/goods/controllers/goodsai_controller.dart create mode 100644 lib/modules/goods/controllers/goodsmeet_controller.dart create mode 100644 lib/modules/goods/controllers/goodstrade_controller.dart create mode 100644 lib/modules/goods/controllers/goodsvip_controller.dart create mode 100644 lib/modules/goods/views/goodsai_view.dart create mode 100644 lib/modules/goods/views/goodsmeet_view.dart create mode 100644 lib/modules/goods/views/goodstrade_view.dart create mode 100644 lib/modules/goods/views/goodsvip_view.dart diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index ced2a2c6f..b5acf4c34 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -216,4 +216,13 @@ class Api { params: params, ); } + + //获取商品列表 + static getGoods([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/pay_getgoods', + params: params, + ); + } } diff --git a/lib/modules/goods/bindings/goodsai_binding.dart b/lib/modules/goods/bindings/goodsai_binding.dart new file mode 100644 index 000000000..4c21e4920 --- /dev/null +++ b/lib/modules/goods/bindings/goodsai_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import '../controllers/goodsai_controller.dart'; + +class GoodsaiBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => GoodsaiController()); + } +} \ No newline at end of file diff --git a/lib/modules/goods/bindings/goodsmeet_binding.dart b/lib/modules/goods/bindings/goodsmeet_binding.dart new file mode 100644 index 000000000..f8c1b3308 --- /dev/null +++ b/lib/modules/goods/bindings/goodsmeet_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import '../controllers/goodsmeet_controller.dart'; + +class GoodsmeetBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => GoodsmeetController()); + } +} \ No newline at end of file diff --git a/lib/modules/goods/bindings/goodstrade_binding.dart b/lib/modules/goods/bindings/goodstrade_binding.dart new file mode 100644 index 000000000..70f119608 --- /dev/null +++ b/lib/modules/goods/bindings/goodstrade_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import '../controllers/goodstrade_controller.dart'; + +class GoodstradeBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => GoodstradeController()); + } +} \ No newline at end of file diff --git a/lib/modules/goods/bindings/goodsvip_binding.dart b/lib/modules/goods/bindings/goodsvip_binding.dart new file mode 100644 index 000000000..50e957d57 --- /dev/null +++ b/lib/modules/goods/bindings/goodsvip_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import '../controllers/goodsvip_controller.dart'; + +class GoodsvipBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => GoodsvipController()); + } +} \ No newline at end of file diff --git a/lib/modules/goods/controllers/goodsai_controller.dart b/lib/modules/goods/controllers/goodsai_controller.dart new file mode 100644 index 000000000..c51ba35d5 --- /dev/null +++ b/lib/modules/goods/controllers/goodsai_controller.dart @@ -0,0 +1,65 @@ +import 'package:get/get.dart'; +import '../../../routes/app_routes.dart'; + +class AIItem { + final String id; + final String title; + final String description; + final double price; + final String productId; + + AIItem({ + required this.id, + required this.title, + required this.description, + required this.price, + required this.productId, + }); +} + +class GoodsaiController extends GetxController { + final RxList items = [].obs; + final RxBool loading = false.obs; + final RxString error = ''.obs; + + @override + void onInit() { + super.onInit(); + _loadProducts(); + } + + Future _loadProducts() async { + loading.value = true; + error.value = ''; + try { + items.assignAll([ + AIItem( + id: 'ai_chat', + title: '通用AI聊天包', + description: '更长对话额度与工具调用', + price: 19.9, + productId: 'ai_chat_101', + ), + AIItem( + id: 'ai_tools', + title: 'AI工具扩展', + description: '额外工具能力与上下文长度', + price: 39.9, + productId: 'ai_tools_201', + ), + ]); + } catch (e) { + error.value = e.toString(); + } finally { + loading.value = false; + } + } + + void purchase(AIItem item) { + Get.toNamed(Routes.payment, arguments: { + 'productId': item.productId, + 'amount': item.price, + 'description': item.title, + }); + } +} \ No newline at end of file diff --git a/lib/modules/goods/controllers/goodsmeet_controller.dart b/lib/modules/goods/controllers/goodsmeet_controller.dart new file mode 100644 index 000000000..6b5c793a0 --- /dev/null +++ b/lib/modules/goods/controllers/goodsmeet_controller.dart @@ -0,0 +1,65 @@ +import 'package:get/get.dart'; +import '../../../routes/app_routes.dart'; + +class MeetItem { + final String id; + final String title; + final String description; + final double price; + final String productId; + + MeetItem({ + required this.id, + required this.title, + required this.description, + required this.price, + required this.productId, + }); +} + +class GoodsmeetController extends GetxController { + final RxList items = [].obs; + final RxBool loading = false.obs; + final RxString error = ''.obs; + + @override + void onInit() { + super.onInit(); + _loadProducts(); + } + + Future _loadProducts() async { + loading.value = true; + error.value = ''; + try { + items.assignAll([ + MeetItem( + id: 'meet_basic', + title: '会议助手基础版', + description: '会议纪要与基础翻译', + price: 29.9, + productId: 'meet_101', + ), + MeetItem( + id: 'meet_pro', + title: '会议助手高级版', + description: '纪要、翻译与AI总结增强', + price: 59.9, + productId: 'meet_201', + ), + ]); + } catch (e) { + error.value = e.toString(); + } finally { + loading.value = false; + } + } + + void purchase(MeetItem item) { + Get.toNamed(Routes.payment, arguments: { + 'productId': item.productId, + 'amount': item.price, + 'description': item.title, + }); + } +} \ No newline at end of file diff --git a/lib/modules/goods/controllers/goodstrade_controller.dart b/lib/modules/goods/controllers/goodstrade_controller.dart new file mode 100644 index 000000000..12cf8af16 --- /dev/null +++ b/lib/modules/goods/controllers/goodstrade_controller.dart @@ -0,0 +1,65 @@ +import 'package:get/get.dart'; +import '../../../routes/app_routes.dart'; + +class TradeItem { + final String id; + final String title; + final String description; + final double price; + final String productId; + + TradeItem({ + required this.id, + required this.title, + required this.description, + required this.price, + required this.productId, + }); +} + +class GoodstradeController extends GetxController { + final RxList items = [].obs; + final RxBool loading = false.obs; + final RxString error = ''.obs; + + @override + void onInit() { + super.onInit(); + _loadProducts(); + } + + Future _loadProducts() async { + loading.value = true; + error.value = ''; + try { + items.assignAll([ + TradeItem( + id: 'trans_100', + title: '翻译包 100 分钟', + description: '实时翻译服务时长包', + price: 19.9, + productId: 'trans_100', + ), + TradeItem( + id: 'trans_500', + title: '翻译包 500 分钟', + description: '更划算的翻译时长包', + price: 79.9, + productId: 'trans_500', + ), + ]); + } catch (e) { + error.value = e.toString(); + } finally { + loading.value = false; + } + } + + void purchase(TradeItem item) { + Get.toNamed(Routes.payment, arguments: { + 'productId': item.productId, + 'amount': item.price, + 'description': item.title, + }); + } +} \ No newline at end of file diff --git a/lib/modules/goods/controllers/goodsvip_controller.dart b/lib/modules/goods/controllers/goodsvip_controller.dart new file mode 100644 index 000000000..34d9dc98f --- /dev/null +++ b/lib/modules/goods/controllers/goodsvip_controller.dart @@ -0,0 +1,66 @@ +import 'package:get/get.dart'; +import '../../../routes/app_routes.dart'; + +class GoodsItem { + final String id; + final String title; + final String description; + final double price; + final String productId; + + GoodsItem({ + required this.id, + required this.title, + required this.description, + required this.price, + required this.productId, + }); +} + +class GoodsvipController extends GetxController { + final RxList items = [].obs; + final RxBool loading = false.obs; + final RxString error = ''.obs; + + @override + void onInit() { + super.onInit(); + _loadProducts(); + } + + Future _loadProducts() async { + loading.value = true; + error.value = ''; + try { + // 示例数据,可接后端商品接口替换 + items.assignAll([ + GoodsItem( + id: 'vip_month', + title: '月度会员', + description: '解锁高级功能,按月订阅', + price: 9.9, + productId: 'vip_101', + ), + GoodsItem( + id: 'vip_year', + title: '年度会员', + description: '解锁高级功能,按年订阅', + price: 99.0, + productId: 'vip_201', + ), + ]); + } catch (e) { + error.value = e.toString(); + } finally { + loading.value = false; + } + } + + void purchase(GoodsItem item) { + Get.toNamed(Routes.payment, arguments: { + 'productId': item.productId, + 'amount': item.price, + 'description': item.title, + }); + } +} \ No newline at end of file diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart new file mode 100644 index 000000000..d362fedd3 --- /dev/null +++ b/lib/modules/goods/views/goodsai_view.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../controllers/goodsai_controller.dart'; + +class GoodsaiView extends GetView { + const GoodsaiView({super.key}); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + title: Text( + 'aiFunction'.tr, + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ), + body: Obx(() { + if (controller.loading.value) { + return const Center(child: CircularProgressIndicator()); + } + if (controller.error.isNotEmpty) { + return Center(child: Text(controller.error.value)); + } + return ListView.separated( + padding: EdgeInsets.all(16.w), + itemCount: controller.items.length, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (_, index) { + final item = controller.items[index]; + return _buildCard(item, isDarkMode); + }, + ); + }), + ); + } + + Widget _buildCard(AIItem item, bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.teal[900]!.withOpacity(0.3) + : Colors.teal[100]!, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon(Icons.auto_awesome, + color: + isDarkMode ? Colors.teal[300]! : Colors.teal[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(item.title, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 4.h), + Text(item.description, + style: TextStyle( + fontSize: 12.sp, + color: + isDarkMode ? Colors.white70 : Colors.grey[600], + )), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text('¥${item.price.toStringAsFixed(2)}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 8.h), + GestureDetector( + onTap: () => controller.purchase(item), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.blue[600], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + '购买', + style: TextStyle(fontSize: 12.sp, color: Colors.white), + ), + ), + ), + ], + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart new file mode 100644 index 000000000..6eb214d58 --- /dev/null +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../controllers/goodsmeet_controller.dart'; + +class GoodsmeetView extends GetView { + const GoodsmeetView({super.key}); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + title: Text( + 'conferenceAssistant'.tr, + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ), + body: Obx(() { + if (controller.loading.value) { + return const Center(child: CircularProgressIndicator()); + } + if (controller.error.isNotEmpty) { + return Center(child: Text(controller.error.value)); + } + return ListView.separated( + padding: EdgeInsets.all(16.w), + itemCount: controller.items.length, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (_, index) { + final item = controller.items[index]; + return _buildCard(item, isDarkMode); + }, + ); + }), + ); + } + + Widget _buildCard(MeetItem item, bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.pink[900]!.withOpacity(0.3) + : Colors.pink[100]!, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon(Icons.people_alt, + color: isDarkMode + ? Colors.pink[300]! + : Colors.pink[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(item.title, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 4.h), + Text(item.description, + style: TextStyle( + fontSize: 12.sp, + color: + isDarkMode ? Colors.white70 : Colors.grey[600], + )), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text('¥${item.price.toStringAsFixed(2)}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 8.h), + GestureDetector( + onTap: () => controller.purchase(item), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.blue[600], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + '购买', + style: TextStyle(fontSize: 12.sp, color: Colors.white), + ), + ), + ), + ], + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart new file mode 100644 index 000000000..b410c03b6 --- /dev/null +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../controllers/goodstrade_controller.dart'; + +class GoodstradeView extends GetView { + const GoodstradeView({super.key}); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + title: Text( + 'simultaneousTranslation'.tr, + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ), + body: Obx(() { + if (controller.loading.value) { + return const Center(child: CircularProgressIndicator()); + } + if (controller.error.isNotEmpty) { + return Center(child: Text(controller.error.value)); + } + return ListView.separated( + padding: EdgeInsets.all(16.w), + itemCount: controller.items.length, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (_, index) { + final item = controller.items[index]; + return _buildCard(item, isDarkMode); + }, + ); + }), + ); + } + + Widget _buildCard(TradeItem item, bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon(Icons.translate, + color: isDarkMode + ? Colors.indigo[300]! + : Colors.indigo[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(item.title, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 4.h), + Text(item.description, + style: TextStyle( + fontSize: 12.sp, + color: + isDarkMode ? Colors.white70 : Colors.grey[600], + )), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text('¥${item.price.toStringAsFixed(2)}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 8.h), + GestureDetector( + onTap: () => controller.purchase(item), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.blue[600], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + '购买', + style: TextStyle(fontSize: 12.sp, color: Colors.white), + ), + ), + ), + ], + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart new file mode 100644 index 000000000..dc3067191 --- /dev/null +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../controllers/goodsvip_controller.dart'; + +class GoodsvipView extends GetView { + const GoodsvipView({super.key}); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + title: Text( + 'premiumMember'.tr, // 高级会员 + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ), + body: Obx(() { + if (controller.loading.value) { + return const Center(child: CircularProgressIndicator()); + } + if (controller.error.isNotEmpty) { + return Center(child: Text(controller.error.value)); + } + return ListView.separated( + padding: EdgeInsets.all(16.w), + itemCount: controller.items.length, + separatorBuilder: (_, __) => + SizedBox(height: 12.h), + itemBuilder: (_, index) { + final item = controller.items[index]; + return _buildGoodsCard(item, isDarkMode); + }, + ); + }), + ); + } + + Widget _buildGoodsCard(GoodsItem item, bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.amber[900]!.withOpacity(0.3) + : Colors.amber[100]!, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon(Icons.workspace_premium, + color: isDarkMode + ? Colors.amber[300]! + : Colors.amber[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(item.title, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 4.h), + Text(item.description, + style: TextStyle( + fontSize: 12.sp, + color: + isDarkMode ? Colors.white70 : Colors.grey[600], + )), + ], + ), + ), + SizedBox(width: 12.w), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text('¥${item.price.toStringAsFixed(2)}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 8.h), + GestureDetector( + onTap: () => controller.purchase(item), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.blue[600], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + '购买', + style: TextStyle( + fontSize: 12.sp, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index 81a017434..a94493ef4 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -40,6 +40,8 @@ class SettingsView extends GetView { padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), children: [ _buildUserInfoCard(isDarkMode), + SizedBox(height: 20.h), + _buildVipPurchaseCard(isDarkMode), // SizedBox(height: 20.h), // _buildAISettingsSection(isDarkMode), SizedBox(height: 20.h), @@ -215,6 +217,121 @@ class SettingsView extends GetView { ); } + // 构建Vip购买卡片 + Widget _buildVipPurchaseCard(bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: isDarkMode + ? [ + const Color(0xFF4A148C).withOpacity(0.7), + const Color(0xFFAD1457).withOpacity(0.7) + ] + : [const Color(0xFFF8BBD0), const Color(0xFFE1BEE7)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(16.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildCategoryItem( + icon: Icons.workspace_premium, + label: 'Vip', + iconBg: isDarkMode + ? Colors.amber[900]!.withOpacity(0.3) + : Colors.amber[100]!, + iconColor: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, + onTap: () => Get.toNamed(Routes.goodsvip), + ), + _buildCategoryItem( + icon: Icons.translate, + label: 'Translation', + iconBg: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, + onTap: () => Get.toNamed(Routes.goodstrade), + ), + _buildCategoryItem( + icon: Icons.people_alt, + label: "Meet", + iconBg: isDarkMode + ? Colors.pink[900]!.withOpacity(0.3) + : Colors.pink[100]!, + iconColor: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, + onTap: () => Get.toNamed(Routes.goodsmeet), + ), + _buildCategoryItem( + icon: Icons.auto_awesome, + label: "AI", + iconBg: isDarkMode + ? Colors.teal[900]!.withOpacity(0.3) + : Colors.teal[100]!, + iconColor: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, + onTap: () => Get.toNamed(Routes.goodsai), + ), + ], + ), + ); + } + + Widget _buildCategoryItem({ + required IconData icon, + required String label, + required Color iconBg, + required Color iconColor, + required VoidCallback onTap, + }) { + return InkWell( + onTap: onTap, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: iconBg, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon( + icon, + size: 20.w, + color: iconColor, + ), + ), + SizedBox(height: 8.h), + SizedBox( + width: 72.w, + child: Text( + label, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w500, + color: Colors.white, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ); + } + // AI设置 Widget _buildAISettingsSection(bool isDarkMode) { return Column( diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index f16b5c0a3..1738a207f 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -1,5 +1,4 @@ import 'package:get/get.dart'; -import 'package:qq_music/qq_music.dart'; import 'package:voitrans/modules/qqmusic/bindings/qqmusic_playlist_binding.dart'; import 'package:voitrans/modules/qqmusic/views/qqmusic_playlist_view.dart'; @@ -71,6 +70,14 @@ import '../modules/text_translation/bindings/text_translation_binding.dart'; import '../modules/text_translation/views/text_translation_view.dart'; import '../modules/picture_translation/views/picture_translation_view.dart'; import '../modules/picture_translation/bindings/picture_translation_binding.dart'; +import '../modules/goods/bindings/goodsvip_binding.dart'; +import '../modules/goods/views/goodsvip_view.dart'; +import '../modules/goods/bindings/goodstrade_binding.dart'; +import '../modules/goods/views/goodstrade_view.dart'; +import '../modules/goods/bindings/goodsmeet_binding.dart'; +import '../modules/goods/views/goodsmeet_view.dart'; +import '../modules/goods/bindings/goodsai_binding.dart'; +import '../modules/goods/views/goodsai_view.dart'; abstract class AppPages { static final pages = [ @@ -324,5 +331,33 @@ abstract class AppPages { transition: Transition.rightToLeft, transitionDuration: Duration(milliseconds: 250), ), + GetPage( + name: Routes.goodsvip, + page: () => const GoodsvipView(), + binding: GoodsvipBinding(), + transition: Transition.rightToLeft, + transitionDuration: Duration(milliseconds: 250), + ), + GetPage( + name: Routes.goodstrade, + page: () => const GoodstradeView(), + binding: GoodstradeBinding(), + transition: Transition.rightToLeft, + transitionDuration: Duration(milliseconds: 250), + ), + GetPage( + name: Routes.goodsmeet, + page: () => const GoodsmeetView(), + binding: GoodsmeetBinding(), + transition: Transition.rightToLeft, + transitionDuration: Duration(milliseconds: 250), + ), + GetPage( + name: Routes.goodsai, + page: () => const GoodsaiView(), + binding: GoodsaiBinding(), + transition: Transition.rightToLeft, + transitionDuration: Duration(milliseconds: 250), + ), ]; } diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index b513e0369..c964ffb57 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -69,4 +69,10 @@ abstract class Routes { // 支付相关 static const payment = '/payment'; // 支付测试页面 + + //商品购买页面 + static const goodsvip = '/goodsvip'; //vip商品页面 + static const goodstrade = '/goodstrade'; //翻译商品页面 + static const goodsmeet = '/goodsmeet'; //会议商品页面 + static const goodsai = '/goodsai'; //ai商品页面 } From 91fd4c7ce0cf0d8ea47e7ef2f9b02b93cea65a4c Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 6 Nov 2025 15:46:35 +0800 Subject: [PATCH 002/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=9F=B3=E4=B9=90?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/models/goods.dart | 206 +++++++++ lib/data/models/user_Info.dart | 17 +- lib/data/services/ble_manager.dart | 7 +- lib/data/services/network/api.dart | 2 +- lib/data/services/pay_service.dart | 110 +++++ .../controllers/devices_controller.dart | 2 +- .../controllers/goods_base_controller.dart | 281 ++++++++++++ .../goods/controllers/goodsai_controller.dart | 89 ++-- .../controllers/goodsmeet_controller.dart | 81 +--- .../controllers/goodstrade_controller.dart | 81 +--- .../controllers/goodsvip_controller.dart | 82 +--- lib/modules/goods/views/goodsai_view.dart | 410 +++++++++++++++++- lib/modules/goods/views/goodsmeet_view.dart | 193 ++++++++- lib/modules/goods/views/goodstrade_view.dart | 193 ++++++++- lib/modules/goods/views/goodsvip_view.dart | 196 ++++++++- .../music_service/lib/music_service.dart | 159 +------ .../lib/music_service_native.dart | 157 +++++++ .../music_service/lib/music_service_stub.dart | 38 ++ 18 files changed, 1849 insertions(+), 455 deletions(-) create mode 100644 lib/data/models/goods.dart create mode 100644 lib/modules/goods/controllers/goods_base_controller.dart create mode 100644 local_plugins/music_service/lib/music_service_native.dart create mode 100644 local_plugins/music_service/lib/music_service_stub.dart diff --git a/lib/data/models/goods.dart b/lib/data/models/goods.dart new file mode 100644 index 000000000..99485eafe --- /dev/null +++ b/lib/data/models/goods.dart @@ -0,0 +1,206 @@ +/// 商品类型 +/// 0: 普通产品 normal +/// 1: 会员产品 member +// 使用量类型(与后端/Proto枚举对应) +enum UsageType { + /// 未知使用量类型 + UsageNull, // 0 + /// 翻译 + Trade, // 1 + /// 会议 + Meet, // 2 + /// 智能体 + AI; // 3 + + // 解析支持 int 或 string(大小写不敏感) + static UsageType from(dynamic value) { + if (value is int) { + switch (value) { + case 0: + return UsageType.UsageNull; + case 1: + return UsageType.Trade; + case 2: + return UsageType.Meet; + case 3: + return UsageType.AI; + default: + return UsageType.UsageNull; + } + } + if (value is String) { + final v = int.tryParse(value.trim()); + if (v != null) return UsageType.from(v); + switch (value.trim().toLowerCase()) { + case 'usagenull': + case 'null': + case 'unknown': + return UsageType.UsageNull; + case 'trade': + return UsageType.Trade; + case 'meet': + case 'meeting': + return UsageType.Meet; + case 'ai': + return UsageType.AI; + default: + return UsageType.UsageNull; + } + } + return UsageType.UsageNull; + } + + int get toInt { + switch (this) { + case UsageType.UsageNull: + return 0; + case UsageType.Trade: + return 1; + case UsageType.Meet: + return 2; + case UsageType.AI: + return 3; + } + } + + String get name { + switch (this) { + case UsageType.UsageNull: + return 'UsageNull'; + case UsageType.Trade: + return 'Trade'; + case UsageType.Meet: + return 'Meet'; + case UsageType.AI: + return 'AI'; + } + } +} + +/// 支付商品模型,与后端 DBGoods 对应 +/// - id: 产品id +/// - enable: 是否启用 +/// - name: 产品名称 +/// - desc: 产品描述 +/// - price: 产品价格(建议单位:分) +/// - usagetype: 产品类型 0:普通产品 1:会员产品 +/// - usagenum: 使用量(时长/次数/额度等) +class DBGoods { + final String id; + final bool enable; + final String name; + final String desc; + final int price; // 建议单位:分 + final UsageType usagetype; + final int usagenum; + + const DBGoods({ + required this.id, + required this.enable, + required this.name, + required this.desc, + required this.price, + required this.usagetype, + required this.usagenum, + }); + + /// 解析后端 JSON + factory DBGoods.fromJson(Map json) { + String _asString(dynamic v) { + if (v == null) return ''; + return v is String ? v : v.toString(); + } + + bool _asBool(dynamic v) { + if (v is bool) return v; + if (v is num) return v != 0; + if (v is String) { + final s = v.trim().toLowerCase(); + return s == 'true' || s == '1'; + } + return false; + } + + int _asInt(dynamic v) { + if (v == null) return 0; + if (v is int) return v; + if (v is num) return v.toInt(); + if (v is String) return int.tryParse(v) ?? 0; + return 0; + } + + return DBGoods( + id: _asString(json['id']), + enable: _asBool(json['enable']), + name: _asString(json['name']), + desc: _asString(json['desc']), + price: _asInt(json['price']), + usagetype: UsageType.from(json['usagetype']), + usagenum: _asInt(json['usagenum']), + ); + } + + /// 编码为后端 JSON + Map toJson() { + return { + 'id': id, + 'enable': enable, + 'name': name, + 'desc': desc, + 'price': price, + 'usagetype': usagetype.toInt, + 'usagenum': usagenum, + }; + } + + /// 列表解析 + static List listFromJson(dynamic data) { + if (data == null) return const []; + if (data is List) { + return data + .map((e) => DBGoods.fromJson(e as Map)) + .toList(); + } + // 某些接口返回 { list: [...] } 或 { data: [...] } + if (data is Map) { + final list = data['list'] ?? data['data'] ?? data['items']; + if (list is List) { + return list + .map((e) => DBGoods.fromJson(e as Map)) + .toList(); + } + } + return const []; + } + + /// 价格换算:分 -> 元(仅当 price 单位为分时使用) + double get priceYuan => price / 100.0; + + /// 用于支付创建订单的金额(分) + int get payAmountCents => price; + + DBGoods copyWith({ + String? id, + bool? enable, + String? name, + String? desc, + int? price, + UsageType? usagetype, + int? usagenum, + }) { + return DBGoods( + id: id ?? this.id, + enable: enable ?? this.enable, + name: name ?? this.name, + desc: desc ?? this.desc, + price: price ?? this.price, + usagetype: usagetype ?? this.usagetype, + usagenum: usagenum ?? this.usagenum, + ); + } + + @override + String toString() { + return 'DBGoods(id: $id, enable: $enable, name: $name, price: $price, usagetype: ${usagetype.name}, usagenum: $usagenum)'; + } +} diff --git a/lib/data/models/user_Info.dart b/lib/data/models/user_Info.dart index d5d369ba6..662e48d3c 100644 --- a/lib/data/models/user_Info.dart +++ b/lib/data/models/user_Info.dart @@ -41,7 +41,14 @@ class User { String phonemac; String password; int viplv = 0; //添加会员等级字段,0表示普通用户 - + // 新增的会员与用量统计字段 + int viptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) + int tradetotaltime = 0; // 翻译总时长 + int meettotaltime = 0; // 会议总时长 + int aichattotaltimer = 0; // 智能体总次数(兼容 aichattotaltime/aichattotaltimer) + int tradetime = 0; // 翻译剩余时长 + int meettime = 0; // 会议剩余时长 + int aichattimer = 0; // 智能体剩余次数 List devices; // 私有构造函数 @@ -125,6 +132,14 @@ class User { 'phonemac': phonemac, 'password': password, 'viplv': viplv, + 'viptime': viptime, + 'tradetotaltime': tradetotaltime, + 'meettotaltime': meettotaltime, + // 序列化统一使用 aichattotaltime 键 + 'aichattotaltime': aichattotaltimer, + 'tradetime': tradetime, + 'meettime': meettime, + 'aichattimer': aichattimer, 'devices': devices.map((device) => device.toJson()).toList(), }, }; diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 5a5cc7d03..b53008c78 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get_storage/get_storage.dart'; @@ -692,7 +693,11 @@ class BleManager extends GetxService { final openaiagentid = AppConfig.env('OPENAI_AGENT_ID') ?? 'personal_assistant'; final systemPrompt = AppConfig.agentsystemPrompt(openaiagentid); - final musicServiceType = AppConfig.env('APP_MUSICSERVICE_TYPE') ?? 'AUTO'; + var musicServiceType = + AppConfig.env('APP_ANDROID_MUSICSERVICE_TYPE') ?? 'AUTO'; + if (Platform.isIOS) { + musicServiceType = AppConfig.env('APP_IOS_MUSICSERVICE_TYPE') ?? 'AUTO'; + } final navigationMode = AppConfig.env('APP_NAVIGATION_MODE') ?? 'external_auto'; // 从Flutter资源包中加载.mcp.json diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index b5acf4c34..19b706bed 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -221,7 +221,7 @@ class Api { static getGoods([params]) { return DioManager().request( NWMethod.post, - '/api/home/pay_getgoods', + '/api/home/pay_getgoodss', params: params, ); } diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index 261feabb0..4aa34a614 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -1,6 +1,7 @@ import 'package:get/get.dart'; import 'package:voitrans/data/services/network/api.dart'; import 'package:tobias/tobias.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../modules/login/controllers/weixinLogin.dart'; @@ -359,4 +360,113 @@ class PayService extends GetxService { return null; } } + + /// 创建 PayPal 支付订单 + /// 返回需要打开的支付授权链接(approval_url)或支付页面URL + Future createPaypalOrder({ + required String productId, + required String productName, + String? productDesc, + required int amount, + int paymentMethod = 5, // 约定:5 表示 PayPal + String? clientIp, + String? notifyUrl, + String? extraData, + }) async { + try { + final response = await Api.paycreateorder({ + 'product_id': productId, + 'product_name': productName, + 'product_desc': productDesc ?? '', + 'amount': amount, + 'payment_method': paymentMethod, + 'client_ip': clientIp ?? '', + 'notify_url': notifyUrl ?? '', + 'extra_data': extraData ?? '', + }); + + // 兼容不同字段命名,尽量从返回中提取可用的支付URL + if (response != null) { + final candidates = [ + 'paypal_pay_url', + 'approval_url', + 'paypalApprovalUrl', + 'pay_url', + 'payment_url', + 'url', + ]; + for (final key in candidates) { + final url = response[key]; + if (url is String && url.isNotEmpty) { + return url; + } + } + + final data = response['data']; + if (data is Map) { + for (final key in candidates) { + final url = data[key]; + if (url is String && url.isNotEmpty) { + return url; + } + } + } + } + print('创建 PayPal 订单失败或未返回有效URL: $response'); + return null; + } catch (e) { + print('创建 PayPal 订单异常: $e'); + return null; + } + } + + /// 拉起 PayPal 支付(打开授权链接)。 + /// 注意:该方法仅负责跳转至 PayPal 页面,结果需要后端回调通知。 + Future paypalPay({ + required String approvalUrl, + PaymentResultCallback? onResult, + }) async { + try { + final uri = Uri.parse(approvalUrl); + final ok = await launchUrl(uri, mode: LaunchMode.externalApplication); + if (ok) { + onResult?.call(true, '已打开 PayPal,请完成支付'); + } else { + onResult?.call(false, '无法打开 PayPal 支付页面'); + } + return ok; + } catch (e) { + onResult?.call(false, '打开 PayPal 异常: $e'); + return false; + } + } + + /// 一体化的 PayPal 支付流程:创建订单 -> 打开授权链接 + Future processPaypalPayment({ + required String productId, + required int amount, + required String description, + PaymentResultCallback? onResult, + }) async { + try { + final approvalUrl = await createPaypalOrder( + productId: productId, + productName: description, + productDesc: description, + amount: amount, + paymentMethod: 5, + notifyUrl: 'https://api.ideapsound.com/api/home/pay_paypalnotify', + ); + + if (approvalUrl == null) { + onResult?.call(false, '创建 PayPal 订单失败'); + return false; + } + + return await paypalPay(approvalUrl: approvalUrl, onResult: onResult); + } catch (e) { + onResult?.call(false, 'PayPal 支付流程异常: $e'); + return false; + } + } } diff --git a/lib/modules/devices/controllers/devices_controller.dart b/lib/modules/devices/controllers/devices_controller.dart index ad2a74a73..6718af00e 100644 --- a/lib/modules/devices/controllers/devices_controller.dart +++ b/lib/modules/devices/controllers/devices_controller.dart @@ -1,4 +1,4 @@ -import 'dart:ffi'; +// import 'dart:ffi'; // Not supported on web; not needed here import 'package:voitrans/data/models/appconfig_model.dart'; diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart new file mode 100644 index 000000000..243d49723 --- /dev/null +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -0,0 +1,281 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../routes/app_routes.dart'; +import '../../../data/services/pay_service.dart'; +import '../../../data/models/goods.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import '../../../data/services/network/dio_manager.dart'; + +/// goods 模块基础控制器,封装通用的商品加载与支付流程 +abstract class GoodsBaseController extends GetxController { + final RxList items = [].obs; + final RxBool loading = false.obs; + final RxString error = ''.obs; + + late final PayService _payService = Get.find(); + + @override + void onInit() { + super.onInit(); + _init(); + } + + Future _init() async { + loading.value = true; + error.value = ''; + try { + final list = await fetchProducts(); + items.assignAll(list); + } catch (e) { + error.value = e.toString(); + } finally { + loading.value = false; + } + } + + /// 子类实现:返回商品列表(统一使用 DBGoods) + Future> fetchProducts(); + + /// 统一入口:不指定支付方式时,跳转到支付页面交由用户选择 + Future purchase(DBGoods item) async { + final method = await _showPayMethodSheet(); + if (method == null) return; + + bool ok = false; + String failMsg = '支付失败,请重试'; + if (method == _PayMethod.wechat) { + ok = await payWechat(item, onResult: (success, msg) { + if (!success) failMsg = msg ?? failMsg; + }); + } else if (method == _PayMethod.alipay) { + ok = await payAlipay(item, onResult: (success, msg) { + if (!success) failMsg = msg ?? failMsg; + }); + } else if (method == _PayMethod.paypal) { + ok = await payPaypal(item, onResult: (success, msg) { + if (!success) failMsg = msg ?? failMsg; + }); + } + + if (!ok) { + Get.snackbar('提示', failMsg, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + } + } + + /// 底部弹窗:选择支付方式 + Future<_PayMethod?> _showPayMethodSheet() async { + final context = Get.context; + final isDark = + context != null && Theme.of(context).brightness == Brightness.dark; + return await Get.bottomSheet<_PayMethod>( + SafeArea( + child: Container( + decoration: BoxDecoration( + color: isDark ? Colors.grey[900] : Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: isDark ? Colors.white24 : Colors.black12, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + '选择支付方式', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: isDark ? Colors.white : Colors.black, + ), + ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + GestureDetector( + onTap: () => Get.back(result: _PayMethod.wechat), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + isDark ? Colors.white10 : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), + ), + child: Icon(Icons.wechat, + color: Colors.green[600]), + ), + const SizedBox(height: 8), + Text( + '微信支付', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), + ), + ], + ), + ), + GestureDetector( + onTap: () => Get.back(result: _PayMethod.alipay), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + isDark ? Colors.white10 : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), + ), + child: Icon(Icons.payment, + color: Colors.blue[600]), + ), + const SizedBox(height: 8), + Text( + '支付宝', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), + ), + ], + ), + ), + GestureDetector( + onTap: () => Get.back(result: _PayMethod.paypal), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + isDark ? Colors.white10 : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), + ), + child: Icon( + Icons.account_balance_wallet, + color: Colors.indigo[600], + ), + ), + const SizedBox(height: 8), + Text( + 'PayPal', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 12), + ], + ), + ), + ], + ), + ), + ), + isScrollControlled: false, + ignoreSafeArea: false, + backgroundColor: Colors.transparent, + ); + } + + /// 指定微信支付(直接下单并拉起微信) + Future payWechat(DBGoods item, + {PaymentResultCallback? onResult}) async { + final cents = item.price; // DBGoods.price 单位:分 + final serverUrl = dotenv.env['SERVER_URL'] ?? DioManager().baseUrl; + final paymentData = await _payService.createWechatPayOrder( + productId: item.id, + productName: item.name, + productDesc: item.desc, + amount: cents, + notifyUrl: '$serverUrl/api/home/pay_wechatnotify', + ); + if (paymentData == null) { + onResult?.call(false, '创建微信订单失败'); + return false; + } + return _payService.wechatPay(paymentData: paymentData, onResult: onResult); + } + + /// 指定支付宝支付(直接下单并拉起支付宝) + Future payAlipay(DBGoods item, + {PaymentResultCallback? onResult}) async { + final cents = item.price; // DBGoods.price 单位:分 + final orderInfo = await _payService.createAlipayOrder( + productId: item.id, + productName: item.name, + productDesc: item.desc, + amount: cents, + notifyUrl: 'https://api.ideapsound.com/api/home/pay_alipaynotify', + ); + if (orderInfo == null) { + onResult?.call(false, '创建支付宝订单失败'); + return false; + } + return _payService.alipay(orderInfo: orderInfo, onResult: onResult); + } + + /// 指定 PayPal 支付(创建订单并打开授权链接) + Future payPaypal(DBGoods item, + {PaymentResultCallback? onResult}) async { + final cents = item.price; // DBGoods.price 单位:分 + final approvalUrl = await _payService.createPaypalOrder( + productId: item.id, + productName: item.name, + productDesc: item.desc, + amount: cents, + notifyUrl: 'https://api.ideapsound.com/api/home/pay_paypalnotify', + ); + if (approvalUrl == null) { + onResult?.call(false, '创建 PayPal 订单失败'); + return false; + } + return _payService.paypalPay(approvalUrl: approvalUrl, onResult: onResult); + } +} + +enum _PayMethod { wechat, alipay, paypal } diff --git a/lib/modules/goods/controllers/goodsai_controller.dart b/lib/modules/goods/controllers/goodsai_controller.dart index c51ba35d5..fe04c175c 100644 --- a/lib/modules/goods/controllers/goodsai_controller.dart +++ b/lib/modules/goods/controllers/goodsai_controller.dart @@ -1,65 +1,40 @@ +import 'dart:convert'; +import 'dart:developer' as developer; + import 'package:get/get.dart'; import '../../../routes/app_routes.dart'; +import '../../../data/models/goods.dart'; +import '../../../data/services/network/api.dart'; +import 'goods_base_controller.dart'; +// ... existing code ... -class AIItem { - final String id; - final String title; - final String description; - final double price; - final String productId; - - AIItem({ - required this.id, - required this.title, - required this.description, - required this.price, - required this.productId, - }); -} - -class GoodsaiController extends GetxController { - final RxList items = [].obs; - final RxBool loading = false.obs; - final RxString error = ''.obs; - +class GoodsaiController extends GoodsBaseController { @override - void onInit() { - super.onInit(); - _loadProducts(); - } - - Future _loadProducts() async { - loading.value = true; - error.value = ''; + Future> fetchProducts() async { + final resp = await Api.getGoods({'usagetype': UsageType.AI.toInt}); + // 输出完整响应,便于调试接口结构 try { - items.assignAll([ - AIItem( - id: 'ai_chat', - title: '通用AI聊天包', - description: '更长对话额度与工具调用', - price: 19.9, - productId: 'ai_chat_101', - ), - AIItem( - id: 'ai_tools', - title: 'AI工具扩展', - description: '额外工具能力与上下文长度', - price: 39.9, - productId: 'ai_tools_201', - ), - ]); - } catch (e) { - error.value = e.toString(); - } finally { - loading.value = false; + developer.log('getGoods(AI) resp: ${jsonEncode(resp)}'); + } catch (_) { + developer.log('getGoods(AI) resp (raw): $resp'); + } + if (resp == null || resp is! Map) return []; + if (resp.containsKey('error') || resp.containsKey('msg')) { + final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; + throw Exception(msg); + } + final container = + (resp is Map && resp['data'] is Map) ? resp['data'] : resp; + final data = (container is Map) ? (container['goodss']) : null; + if (data is List) { + final list = + data.whereType>().map(DBGoods.fromJson).toList(); + // 兜底过滤确保展示 AI 类型 + return list.where((g) => g.usagetype == UsageType.AI).toList(); } + return []; } - void purchase(AIItem item) { - Get.toNamed(Routes.payment, arguments: { - 'productId': item.productId, - 'amount': item.price, - 'description': item.title, - }); - } -} \ No newline at end of file + // 如需自定义跳转逻辑,可保留重写调用父类 + // Future purchase(DBGoods item) async => super.purchase(item); +} diff --git a/lib/modules/goods/controllers/goodsmeet_controller.dart b/lib/modules/goods/controllers/goodsmeet_controller.dart index 6b5c793a0..ad171e3c5 100644 --- a/lib/modules/goods/controllers/goodsmeet_controller.dart +++ b/lib/modules/goods/controllers/goodsmeet_controller.dart @@ -1,65 +1,30 @@ import 'package:get/get.dart'; import '../../../routes/app_routes.dart'; +import '../../../data/models/goods.dart'; +import '../../../data/services/network/api.dart'; +import 'goods_base_controller.dart'; -class MeetItem { - final String id; - final String title; - final String description; - final double price; - final String productId; - - MeetItem({ - required this.id, - required this.title, - required this.description, - required this.price, - required this.productId, - }); -} - -class GoodsmeetController extends GetxController { - final RxList items = [].obs; - final RxBool loading = false.obs; - final RxString error = ''.obs; - +class GoodsmeetController extends GoodsBaseController { @override - void onInit() { - super.onInit(); - _loadProducts(); - } - - Future _loadProducts() async { - loading.value = true; - error.value = ''; - try { - items.assignAll([ - MeetItem( - id: 'meet_basic', - title: '会议助手基础版', - description: '会议纪要与基础翻译', - price: 29.9, - productId: 'meet_101', - ), - MeetItem( - id: 'meet_pro', - title: '会议助手高级版', - description: '纪要、翻译与AI总结增强', - price: 59.9, - productId: 'meet_201', - ), - ]); - } catch (e) { - error.value = e.toString(); - } finally { - loading.value = false; + Future> fetchProducts() async { + final resp = await Api.getGoods({'usagetype': UsageType.Meet.toInt}); + if (resp == null || resp is! Map) return []; + if (resp.containsKey('error') || resp.containsKey('msg')) { + final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; + throw Exception(msg); + } + final container = + (resp is Map && resp['data'] is Map) ? resp['data'] : resp; + final data = (container is Map) + ? (container['goodss'] ?? container['goodes'] ?? container['goods']) + : null; + if (data is List) { + final list = + data.whereType>().map(DBGoods.fromJson).toList(); + return list.where((g) => g.usagetype == UsageType.Meet).toList(); } + return []; } - void purchase(MeetItem item) { - Get.toNamed(Routes.payment, arguments: { - 'productId': item.productId, - 'amount': item.price, - 'description': item.title, - }); - } -} \ No newline at end of file + // Future purchase(DBGoods item) async => super.purchase(item); +} diff --git a/lib/modules/goods/controllers/goodstrade_controller.dart b/lib/modules/goods/controllers/goodstrade_controller.dart index 12cf8af16..871241f9c 100644 --- a/lib/modules/goods/controllers/goodstrade_controller.dart +++ b/lib/modules/goods/controllers/goodstrade_controller.dart @@ -1,65 +1,30 @@ import 'package:get/get.dart'; import '../../../routes/app_routes.dart'; +import '../../../data/models/goods.dart'; +import '../../../data/services/network/api.dart'; +import 'goods_base_controller.dart'; -class TradeItem { - final String id; - final String title; - final String description; - final double price; - final String productId; - - TradeItem({ - required this.id, - required this.title, - required this.description, - required this.price, - required this.productId, - }); -} - -class GoodstradeController extends GetxController { - final RxList items = [].obs; - final RxBool loading = false.obs; - final RxString error = ''.obs; - +class GoodstradeController extends GoodsBaseController { @override - void onInit() { - super.onInit(); - _loadProducts(); - } - - Future _loadProducts() async { - loading.value = true; - error.value = ''; - try { - items.assignAll([ - TradeItem( - id: 'trans_100', - title: '翻译包 100 分钟', - description: '实时翻译服务时长包', - price: 19.9, - productId: 'trans_100', - ), - TradeItem( - id: 'trans_500', - title: '翻译包 500 分钟', - description: '更划算的翻译时长包', - price: 79.9, - productId: 'trans_500', - ), - ]); - } catch (e) { - error.value = e.toString(); - } finally { - loading.value = false; + Future> fetchProducts() async { + final resp = await Api.getGoods({'usagetype': UsageType.Trade.toInt}); + if (resp == null || resp is! Map) return []; + if (resp.containsKey('error') || resp.containsKey('msg')) { + final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; + throw Exception(msg); + } + final container = + (resp is Map && resp['data'] is Map) ? resp['data'] : resp; + final data = (container is Map) + ? (container['goodss'] ?? container['goodes'] ?? container['goods']) + : null; + if (data is List) { + final list = + data.whereType>().map(DBGoods.fromJson).toList(); + return list.where((g) => g.usagetype == UsageType.Trade).toList(); } + return []; } - void purchase(TradeItem item) { - Get.toNamed(Routes.payment, arguments: { - 'productId': item.productId, - 'amount': item.price, - 'description': item.title, - }); - } -} \ No newline at end of file + // Future purchase(DBGoods item) async => super.purchase(item); +} diff --git a/lib/modules/goods/controllers/goodsvip_controller.dart b/lib/modules/goods/controllers/goodsvip_controller.dart index 34d9dc98f..00be5dba8 100644 --- a/lib/modules/goods/controllers/goodsvip_controller.dart +++ b/lib/modules/goods/controllers/goodsvip_controller.dart @@ -1,66 +1,30 @@ import 'package:get/get.dart'; import '../../../routes/app_routes.dart'; +import '../../../data/models/goods.dart'; +import '../../../data/services/network/api.dart'; +import 'goods_base_controller.dart'; -class GoodsItem { - final String id; - final String title; - final String description; - final double price; - final String productId; - - GoodsItem({ - required this.id, - required this.title, - required this.description, - required this.price, - required this.productId, - }); -} - -class GoodsvipController extends GetxController { - final RxList items = [].obs; - final RxBool loading = false.obs; - final RxString error = ''.obs; - +class GoodsvipController extends GoodsBaseController { @override - void onInit() { - super.onInit(); - _loadProducts(); - } - - Future _loadProducts() async { - loading.value = true; - error.value = ''; - try { - // 示例数据,可接后端商品接口替换 - items.assignAll([ - GoodsItem( - id: 'vip_month', - title: '月度会员', - description: '解锁高级功能,按月订阅', - price: 9.9, - productId: 'vip_101', - ), - GoodsItem( - id: 'vip_year', - title: '年度会员', - description: '解锁高级功能,按年订阅', - price: 99.0, - productId: 'vip_201', - ), - ]); - } catch (e) { - error.value = e.toString(); - } finally { - loading.value = false; + Future> fetchProducts() async { + final resp = await Api.getGoods({'usagetype': UsageType.UsageNull.toInt}); + if (resp == null || resp is! Map) return []; + if (resp.containsKey('error') || resp.containsKey('msg')) { + final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; + throw Exception(msg); + } + final container = + (resp is Map && resp['data'] is Map) ? resp['data'] : resp; + final data = (container is Map) + ? (container['goodss'] ?? container['goodes'] ?? container['goods']) + : null; + if (data is List) { + final list = + data.whereType>().map(DBGoods.fromJson).toList(); + return list.where((g) => g.usagetype == UsageType.UsageNull).toList(); } + return []; } - void purchase(GoodsItem item) { - Get.toNamed(Routes.payment, arguments: { - 'productId': item.productId, - 'amount': item.price, - 'description': item.title, - }); - } -} \ No newline at end of file + // Future purchase(DBGoods item) async => super.purchase(item); +} diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index d362fedd3..fb9dc428d 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../../../data/models/goods.dart'; +import '../../../data/models/user_Info.dart'; import '../controllers/goodsai_controller.dart'; class GoodsaiView extends GetView { @@ -32,20 +34,394 @@ class GoodsaiView extends GetView { if (controller.error.isNotEmpty) { return Center(child: Text(controller.error.value)); } - return ListView.separated( + + // 用户用量信息 + int totalAi = 0; + int remainAi = 0; + if (User.isLoggedIn()) { + final u = User.instance; + totalAi = u.aichattotaltimer; + remainAi = u.aichattimer; + } + final usedAi = + (totalAi > 0) ? (totalAi - remainAi).clamp(0, totalAi) : 0; + final progress = (totalAi > 0) ? usedAi / totalAi : 0.0; + + return ListView( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length, - separatorBuilder: (_, __) => SizedBox(height: 12.h), - itemBuilder: (_, index) { - final item = controller.items[index]; - return _buildCard(item, isDarkMode); - }, + children: [ + _buildHeader(isDarkMode), + SizedBox(height: 12.h), + _buildUsageCard(isDarkMode, + totalAi: totalAi, remainAi: remainAi, progress: progress), + SizedBox(height: 16.h), + Text( + '可购买套餐', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + SizedBox(height: 8.h), + ...controller.items.map((item) => Padding( + padding: EdgeInsets.only(bottom: 12.h), + child: _buildCard(item, isDarkMode), + )), + SizedBox(height: 16.h), + _buildFeaturesSection(isDarkMode), + SizedBox(height: 16.h), + _buildFooterSection(isDarkMode), + ], ); }), ); } - Widget _buildCard(AIItem item, bool isDarkMode) { + Widget _buildHeader(bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 44.w, + height: 44.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + borderRadius: BorderRadius.circular(22.r), + ), + child: Icon(Icons.smart_toy, + color: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'AI 功能', + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w700, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + SizedBox(height: 6.h), + Text( + '更长对话额度、更多工具调用、更强上下文长度支持。', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + SizedBox(height: 4.h), + Text( + '适用于智能体问答、总结分析、任务执行等场景。', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildUsageCard( + bool isDarkMode, { + required int totalAi, + required int remainAi, + required double progress, + }) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.timeline, + color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + SizedBox(width: 8.w), + Text( + '使用进度', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ], + ), + SizedBox(height: 12.h), + LinearProgressIndicator( + value: progress, + minHeight: 8.h, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[300], + valueColor: AlwaysStoppedAnimation( + isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '总次数:$totalAi', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + Text( + '剩余:$remainAi', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildFeaturesSection(bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '功能说明', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 10.h), + Wrap( + spacing: 12.w, + runSpacing: 12.h, + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + children: [ + _buildFeatureCard( + isDarkMode, + icon: Icons.music_note, + title: '听歌与推荐', + lines: [ + '检索曲库、播放控制', + '智能推荐歌单与相似歌曲', + ], + colorSeed: Colors.purple, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.navigation, + title: '导航与路线', + lines: [ + '路线规划与拥堵规避', + '语音播报与途径点设置', + ], + colorSeed: Colors.orange, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.wb_sunny, + title: '天气查询', + lines: [ + '实时天气与预报', + '穿衣建议与出行提醒', + ], + colorSeed: Colors.blue, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.place, + title: '附近搜索', + lines: [ + '餐饮/加油/停车等地点检索', + '评分、营业时间与路线直达', + ], + colorSeed: Colors.green, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.newspaper, + title: '新闻资讯', + lines: [ + '热点快讯与专题速览', + '长文总结与要点提炼', + ], + colorSeed: Colors.indigo, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.call, + title: '通讯助手', + lines: [ + '帮忙拨打电话与发短信', + '模板消息与日程提醒', + ], + colorSeed: Colors.teal, + ), + ], + ), + SizedBox(height: 12.h), + Text( + '以上功能受设备权限、服务可用性与网络状况影响,具体以实际表现为准。', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ); + } + + Widget _buildFooterSection(bool isDarkMode) { + final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; + return Padding( + padding: EdgeInsets.symmetric(vertical: 12.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: double.infinity, + child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), + ), + SizedBox(height: 8.h), + Text( + '应用名称:VoiTrans · 服务提供:VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '更多信息请前往 设置 > 关于 查看', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '© 2025 VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + ], + ), + ); + } + + Widget _buildFeatureCard( + bool isDarkMode, { + required IconData icon, + required String title, + required List lines, + required MaterialColor colorSeed, + }) { + final bgColor = isDarkMode ? Colors.grey[900] : Colors.white; + final mainColor = isDarkMode ? colorSeed[300]! : colorSeed[600]!; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + final width = (Get.width - 16.w * 2 - 12.w) / 2; + return Container( + width: width, + padding: EdgeInsets.all(12.w), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 36.w, + height: 36.w, + decoration: BoxDecoration( + color: isDarkMode + ? mainColor.withOpacity(0.25) + : mainColor.withOpacity(0.15), + borderRadius: BorderRadius.circular(18.r), + ), + child: Icon(icon, color: mainColor), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + title, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + SizedBox(height: 8.h), + ...lines.map((line) => Padding( + padding: EdgeInsets.only(bottom: 4.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.check_circle, color: mainColor, size: 14.sp), + SizedBox(width: 6.w), + Expanded( + child: Text( + line, + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ), + ], + ), + )), + ], + ), + ); + } + + Widget _buildCard(DBGoods item, bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( @@ -73,26 +449,24 @@ class GoodsaiView extends GetView { borderRadius: BorderRadius.circular(21.r), ), child: Icon(Icons.auto_awesome, - color: - isDarkMode ? Colors.teal[300]! : Colors.teal[600]!), + color: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!), ), SizedBox(width: 12.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.title, + Text(item.name, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.description, + Text(item.desc, style: TextStyle( fontSize: 12.sp, - color: - isDarkMode ? Colors.white70 : Colors.grey[600], + color: isDarkMode ? Colors.white70 : Colors.grey[600], )), ], ), @@ -100,7 +474,7 @@ class GoodsaiView extends GetView { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text('¥${item.price.toStringAsFixed(2)}', + Text('¥${item.priceYuan.toStringAsFixed(2)}', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -110,8 +484,8 @@ class GoodsaiView extends GetView { GestureDetector( onTap: () => controller.purchase(item), child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, vertical: 6.h), + padding: + EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), decoration: BoxDecoration( color: Colors.blue[600], borderRadius: BorderRadius.circular(20.r), @@ -128,4 +502,4 @@ class GoodsaiView extends GetView { ), ); } -} \ No newline at end of file +} diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index 6eb214d58..25cb5e2d5 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:voitrans/data/models/goods.dart'; import '../controllers/goodsmeet_controller.dart'; class GoodsmeetView extends GetView { @@ -34,18 +35,24 @@ class GoodsmeetView extends GetView { } return ListView.separated( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length, + itemCount: controller.items.length + 2, separatorBuilder: (_, __) => SizedBox(height: 12.h), itemBuilder: (_, index) { - final item = controller.items[index]; - return _buildCard(item, isDarkMode); + if (index < controller.items.length) { + final item = controller.items[index]; + return _buildCard(item, isDarkMode); + } + if (index == controller.items.length) { + return _buildFeaturesSection(isDarkMode); + } + return _buildFooterSection(isDarkMode); }, ); }), ); } - Widget _buildCard(MeetItem item, bool isDarkMode) { + Widget _buildCard(DBGoods item, bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( @@ -73,27 +80,24 @@ class GoodsmeetView extends GetView { borderRadius: BorderRadius.circular(21.r), ), child: Icon(Icons.people_alt, - color: isDarkMode - ? Colors.pink[300]! - : Colors.pink[600]!), + color: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!), ), SizedBox(width: 12.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.title, + Text(item.name, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.description, + Text(item.desc, style: TextStyle( fontSize: 12.sp, - color: - isDarkMode ? Colors.white70 : Colors.grey[600], + color: isDarkMode ? Colors.white70 : Colors.grey[600], )), ], ), @@ -111,8 +115,8 @@ class GoodsmeetView extends GetView { GestureDetector( onTap: () => controller.purchase(item), child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, vertical: 6.h), + padding: + EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), decoration: BoxDecoration( color: Colors.blue[600], borderRadius: BorderRadius.circular(20.r), @@ -129,4 +133,165 @@ class GoodsmeetView extends GetView { ), ); } -} \ No newline at end of file + + Widget _buildFeaturesSection(bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '功能说明', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 10.h), + Wrap( + spacing: 12.w, + runSpacing: 12.h, + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + children: [ + _buildFeatureCard( + isDarkMode, + icon: Icons.mic, + title: '会议记录', + lines: ['自动录音与分段', '讲话人标注'], + colorSeed: Colors.pink, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.summarize, + title: '转写与总结', + lines: ['长音频转写', '关键要点提炼'], + colorSeed: Colors.blue, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.search, + title: '关键词检索', + lines: ['按主题/人名检索', '时间线跳转'], + colorSeed: Colors.indigo, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.share, + title: '协同分享', + lines: ['导出纪要', '多平台分享'], + colorSeed: Colors.teal, + ), + ], + ), + SizedBox(height: 12.h), + Text( + '建议在安静环境使用,效果受麦克风与网络影响,具体以实际表现为准。', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ); + } + + Widget _buildFeatureCard( + bool isDarkMode, { + required IconData icon, + required String title, + required List lines, + required MaterialColor colorSeed, + }) { + final bgColor = isDarkMode ? Colors.grey[900] : Colors.white; + final mainColor = isDarkMode ? colorSeed[300]! : colorSeed[600]!; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + final width = (Get.width - 16.w * 2 - 12.w) / 2; + return Container( + width: width, + padding: EdgeInsets.all(12.w), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 36.w, + height: 36.w, + decoration: BoxDecoration( + color: isDarkMode + ? mainColor.withOpacity(0.25) + : mainColor.withOpacity(0.15), + borderRadius: BorderRadius.circular(18.r), + ), + child: Icon(icon, color: mainColor), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + title, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + ], + ), + SizedBox(height: 8.h), + ...lines.map((l) => Padding( + padding: EdgeInsets.only(bottom: 4.h), + child: + Text(l, style: TextStyle(fontSize: 12.sp, color: subColor)), + )), + ], + ), + ); + } + + Widget _buildFooterSection(bool isDarkMode) { + final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; + return Padding( + padding: EdgeInsets.symmetric(vertical: 12.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: double.infinity, + child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), + ), + SizedBox(height: 8.h), + Text( + '应用名称:VoiTrans · 服务提供:VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '更多信息请前往 设置 > 关于 查看', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '© 2025 VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + ], + ), + ); + } +} diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart index b410c03b6..8b2c619c4 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:voitrans/data/models/goods.dart'; import '../controllers/goodstrade_controller.dart'; class GoodstradeView extends GetView { @@ -34,18 +35,24 @@ class GoodstradeView extends GetView { } return ListView.separated( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length, + itemCount: controller.items.length + 2, separatorBuilder: (_, __) => SizedBox(height: 12.h), itemBuilder: (_, index) { - final item = controller.items[index]; - return _buildCard(item, isDarkMode); + if (index < controller.items.length) { + final item = controller.items[index]; + return _buildCard(item, isDarkMode); + } + if (index == controller.items.length) { + return _buildFeaturesSection(isDarkMode); + } + return _buildFooterSection(isDarkMode); }, ); }), ); } - Widget _buildCard(TradeItem item, bool isDarkMode) { + Widget _buildCard(DBGoods item, bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( @@ -73,27 +80,24 @@ class GoodstradeView extends GetView { borderRadius: BorderRadius.circular(21.r), ), child: Icon(Icons.translate, - color: isDarkMode - ? Colors.indigo[300]! - : Colors.indigo[600]!), + color: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!), ), SizedBox(width: 12.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.title, + Text(item.name, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.description, + Text(item.desc, style: TextStyle( fontSize: 12.sp, - color: - isDarkMode ? Colors.white70 : Colors.grey[600], + color: isDarkMode ? Colors.white70 : Colors.grey[600], )), ], ), @@ -111,8 +115,8 @@ class GoodstradeView extends GetView { GestureDetector( onTap: () => controller.purchase(item), child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, vertical: 6.h), + padding: + EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), decoration: BoxDecoration( color: Colors.blue[600], borderRadius: BorderRadius.circular(20.r), @@ -129,4 +133,165 @@ class GoodstradeView extends GetView { ), ); } -} \ No newline at end of file + + Widget _buildFeaturesSection(bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '功能说明', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 10.h), + Wrap( + spacing: 12.w, + runSpacing: 12.h, + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + children: [ + _buildFeatureCard( + isDarkMode, + icon: Icons.translate, + title: '实时同传', + lines: ['中英互译', '低延时语音播报'], + colorSeed: Colors.indigo, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.text_snippet, + title: '文本翻译', + lines: ['多语种文本翻译', '术语优化与语境保持'], + colorSeed: Colors.blue, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.library_books, + title: '场景词库', + lines: ['旅游/商务/生活词库', '专属词汇记忆'], + colorSeed: Colors.teal, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.subtitles, + title: '字幕显示', + lines: ['对话字幕/大字模式', '颜色高对比度'], + colorSeed: Colors.purple, + ), + ], + ), + SizedBox(height: 12.h), + Text( + '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ); + } + + Widget _buildFeatureCard( + bool isDarkMode, { + required IconData icon, + required String title, + required List lines, + required MaterialColor colorSeed, + }) { + final bgColor = isDarkMode ? Colors.grey[900] : Colors.white; + final mainColor = isDarkMode ? colorSeed[300]! : colorSeed[600]!; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + final width = (Get.width - 16.w * 2 - 12.w) / 2; + return Container( + width: width, + padding: EdgeInsets.all(12.w), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 36.w, + height: 36.w, + decoration: BoxDecoration( + color: isDarkMode + ? mainColor.withOpacity(0.25) + : mainColor.withOpacity(0.15), + borderRadius: BorderRadius.circular(18.r), + ), + child: Icon(icon, color: mainColor), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + title, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + ], + ), + SizedBox(height: 8.h), + ...lines.map((l) => Padding( + padding: EdgeInsets.only(bottom: 4.h), + child: + Text(l, style: TextStyle(fontSize: 12.sp, color: subColor)), + )), + ], + ), + ); + } + + Widget _buildFooterSection(bool isDarkMode) { + final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; + return Padding( + padding: EdgeInsets.symmetric(vertical: 12.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: double.infinity, + child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), + ), + SizedBox(height: 8.h), + Text( + '应用名称:VoiTrans · 服务提供:VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '更多信息请前往 设置 > 关于 查看', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '© 2025 VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + ], + ), + ); + } +} diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index dc3067191..5a5f55896 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:voitrans/data/models/goods.dart'; import '../controllers/goodsvip_controller.dart'; class GoodsvipView extends GetView { @@ -34,19 +35,24 @@ class GoodsvipView extends GetView { } return ListView.separated( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length, - separatorBuilder: (_, __) => - SizedBox(height: 12.h), + itemCount: controller.items.length + 2, + separatorBuilder: (_, __) => SizedBox(height: 12.h), itemBuilder: (_, index) { - final item = controller.items[index]; - return _buildGoodsCard(item, isDarkMode); + if (index < controller.items.length) { + final item = controller.items[index]; + return _buildGoodsCard(item, isDarkMode); + } + if (index == controller.items.length) { + return _buildFeaturesSection(isDarkMode); + } + return _buildFooterSection(isDarkMode); }, ); }), ); } - Widget _buildGoodsCard(GoodsItem item, bool isDarkMode) { + Widget _buildGoodsCard(DBGoods item, bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( @@ -74,27 +80,24 @@ class GoodsvipView extends GetView { borderRadius: BorderRadius.circular(21.r), ), child: Icon(Icons.workspace_premium, - color: isDarkMode - ? Colors.amber[300]! - : Colors.amber[600]!), + color: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!), ), SizedBox(width: 12.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.title, + Text(item.name, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.description, + Text(item.desc, style: TextStyle( fontSize: 12.sp, - color: - isDarkMode ? Colors.white70 : Colors.grey[600], + color: isDarkMode ? Colors.white70 : Colors.grey[600], )), ], ), @@ -113,8 +116,8 @@ class GoodsvipView extends GetView { GestureDetector( onTap: () => controller.purchase(item), child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, vertical: 6.h), + padding: + EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), decoration: BoxDecoration( color: Colors.blue[600], borderRadius: BorderRadius.circular(20.r), @@ -134,4 +137,165 @@ class GoodsvipView extends GetView { ), ); } -} \ No newline at end of file + + Widget _buildFeaturesSection(bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '功能说明', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 10.h), + Wrap( + spacing: 12.w, + runSpacing: 12.h, + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + children: [ + _buildFeatureCard( + isDarkMode, + icon: Icons.workspace_premium, + title: '权益总览', + lines: ['更高使用额度', '更低单价'], + colorSeed: Colors.amber, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.support_agent, + title: '优先服务', + lines: ['专属客服通道', '问题快速响应'], + colorSeed: Colors.purple, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.local_offer, + title: '活动与折扣', + lines: ['会员专属活动', '长期优惠计划'], + colorSeed: Colors.indigo, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.auto_awesome, + title: '通用特权', + lines: ['新功能优先体验', '跨设备同步'], + colorSeed: Colors.teal, + ), + ], + ), + SizedBox(height: 12.h), + Text( + '具体权益以实际套餐说明为准,可能随版本迭代调整。', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ); + } + + Widget _buildFeatureCard( + bool isDarkMode, { + required IconData icon, + required String title, + required List lines, + required MaterialColor colorSeed, + }) { + final bgColor = isDarkMode ? Colors.grey[900] : Colors.white; + final mainColor = isDarkMode ? colorSeed[300]! : colorSeed[600]!; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + final width = (Get.width - 16.w * 2 - 12.w) / 2; + return Container( + width: width, + padding: EdgeInsets.all(12.w), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 36.w, + height: 36.w, + decoration: BoxDecoration( + color: isDarkMode + ? mainColor.withOpacity(0.25) + : mainColor.withOpacity(0.15), + borderRadius: BorderRadius.circular(18.r), + ), + child: Icon(icon, color: mainColor), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + title, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + ], + ), + SizedBox(height: 8.h), + ...lines.map((l) => Padding( + padding: EdgeInsets.only(bottom: 4.h), + child: Text(l, style: TextStyle(fontSize: 12.sp, color: subColor)), + )), + ], + ), + ); + } + + Widget _buildFooterSection(bool isDarkMode) { + final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; + return Padding( + padding: EdgeInsets.symmetric(vertical: 12.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: double.infinity, + child: + Divider(color: isDarkMode ? Colors.white24 : Colors.black12), + ), + SizedBox(height: 8.h), + Text( + '应用名称:VoiTrans · 服务提供:VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '更多信息请前往 设置 > 关于 查看', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + Text( + '© 2025 VoiTrans', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + ], + ), + ); + } +} diff --git a/local_plugins/music_service/lib/music_service.dart b/local_plugins/music_service/lib/music_service.dart index b7007500c..61860bbf3 100644 --- a/local_plugins/music_service/lib/music_service.dart +++ b/local_plugins/music_service/lib/music_service.dart @@ -1,157 +1,2 @@ -import 'dart:ffi'; - -import 'package:flutter/services.dart'; - -class MusicService { - static final MusicService _instance = MusicService._internal(); - - /// 获取单例 - factory MusicService() => _instance; - - // 方法通道 - final MethodChannel _methodChannel = const MethodChannel( - 'com.yunqiinnovation.music_service', - ); - - // 事件通道 - 简化为只使用数据和状态通道 - late final EventChannel _dataEventChannel; - late final EventChannel _statusEventChannel; - - // 事件流 - late final Stream _dataStream; - late final Stream _statusStream; - - // 获取事件流 - Stream get onDataReceived => _dataStream; - - // 状态流直接传递原始数据 - Stream get onStatusUpdated => _statusStream; - - // 内部构造函数 - MusicService._internal() { - _dataEventChannel = const EventChannel( - 'com.yunqiinnovation.music_service/data_events', - ); - _statusEventChannel = const EventChannel( - 'com.yunqiinnovation.music_service/status_events', - ); - - // 初始化事件流 - _dataStream = _dataEventChannel.receiveBroadcastStream(); - _statusStream = _statusEventChannel.receiveBroadcastStream(); - } - - Future playMusic(Map song) async { - await _methodChannel.invokeMethod('play', {'song': song}); - } - - Future pauseMusic() async => _methodChannel.invokeMethod('pause'); - Future resumeMusic() async => _methodChannel.invokeMethod('resume'); - Future nextTrack() async => _methodChannel.invokeMethod('next'); - Future previousTrack() async => _methodChannel.invokeMethod('previous'); - Future stopMusic() async => _methodChannel.invokeMethod('stop'); - Future setVolume(double volume) async => _methodChannel.invokeMethod( - 'setVolume', - {'volume': volume}, - ); // volume: 0.0~1.0 - Future> getStatus() async { - final result = await _methodChannel.invokeMethod('getStatus'); - return { - 'isPlaying': result?['isPlaying'] ?? false, - 'id': result?['id'] ?? 0, - }; - } - - /// 获取播放进度信息 - Future> getProgress() async { - final result = await _methodChannel.invokeMethod('getProgress'); - return { - 'currentPosition': result?['currentPosition'] ?? 0, // 当前播放位置(毫秒) - 'duration': result?['duration'] ?? 0, // 总时长(毫秒) - 'progress': result?['progress'] ?? 0.0, // 播放进度(0.0-1.0) - }; - } - - /// 跳转到指定位置 - Future seekTo(int positionMs) async { - await _methodChannel.invokeMethod('seekTo', {'position': positionMs}); - } - - /// 播放音乐列表 - Future playMusicPlaylist(List> songs) async { - await _methodChannel.invokeMethod('playlist', {'songs': songs}); - } - - /// 更新媒体会话进度信息 - Future updateMediaSessionProgress( - int currentPosition, - int duration, - double progress, - ) async { - await _methodChannel.invokeMethod('updateMediaSessionProgress', { - 'currentPosition': currentPosition, - 'duration': duration, - 'progress': progress, - }); - } - - /// 设置媒体会话回调 - Future setMediaSessionCallbacks({ - required Function() onPlay, - required Function() onPause, - required Function() onNext, - required Function() onPrevious, - required Function(int) onSeekTo, - required Function() onStop, - required Function(int, int, int, double) onProgress, - }) async { - // 设置方法调用处理器来处理来自原生平台的回调 - _methodChannel.setMethodCallHandler((call) async { - switch (call.method) { - case 'onMediaSessionPlay': - onPlay(); - break; - case 'onMediaSessionPause': - onPause(); - break; - case 'onMediaSessionNext': - onNext(); - break; - case 'onMediaSessionPrevious': - onPrevious(); - break; - case 'onMediaSessionSeekTo': - final position = call.arguments['position'] as int; - onSeekTo(position); - break; - case 'onMediaSessionStop': - onStop(); - break; - case 'onMediaSessionProgress': - final currentIdInternal = call.arguments['currentIdInternal'] as int; - final currentPosition = call.arguments['currentPosition'] as int; - final duration = call.arguments['duration'] as int; - final progress = call.arguments['progress'] as double; - onProgress(currentIdInternal, currentPosition, duration, progress); - break; - } - }); - - // 通知原生平台启用媒体会话回调 - await _methodChannel.invokeMethod('enableMediaSessionCallbacks'); - } - - /// 更新媒体会话元数据 - Future updateMediaSessionMetadata(Map song) async { - await _methodChannel.invokeMethod('updateMediaSessionMetadata', { - 'song': song, - }); - } - - /// 更新媒体会话播放状态 - Future updateMediaSessionPlaybackState(bool isPlaying) async { - await _methodChannel.invokeMethod('updateMediaSessionPlaybackState', { - 'isPlaying': isPlaying, - }); - } -} +export 'music_service_native.dart' + if (dart.library.html) 'music_service_stub.dart'; diff --git a/local_plugins/music_service/lib/music_service_native.dart b/local_plugins/music_service/lib/music_service_native.dart new file mode 100644 index 000000000..b7007500c --- /dev/null +++ b/local_plugins/music_service/lib/music_service_native.dart @@ -0,0 +1,157 @@ +import 'dart:ffi'; + +import 'package:flutter/services.dart'; + +class MusicService { + static final MusicService _instance = MusicService._internal(); + + /// 获取单例 + factory MusicService() => _instance; + + // 方法通道 + final MethodChannel _methodChannel = const MethodChannel( + 'com.yunqiinnovation.music_service', + ); + + // 事件通道 - 简化为只使用数据和状态通道 + late final EventChannel _dataEventChannel; + late final EventChannel _statusEventChannel; + + // 事件流 + late final Stream _dataStream; + late final Stream _statusStream; + + // 获取事件流 + Stream get onDataReceived => _dataStream; + + // 状态流直接传递原始数据 + Stream get onStatusUpdated => _statusStream; + + // 内部构造函数 + MusicService._internal() { + _dataEventChannel = const EventChannel( + 'com.yunqiinnovation.music_service/data_events', + ); + _statusEventChannel = const EventChannel( + 'com.yunqiinnovation.music_service/status_events', + ); + + // 初始化事件流 + _dataStream = _dataEventChannel.receiveBroadcastStream(); + _statusStream = _statusEventChannel.receiveBroadcastStream(); + } + + Future playMusic(Map song) async { + await _methodChannel.invokeMethod('play', {'song': song}); + } + + Future pauseMusic() async => _methodChannel.invokeMethod('pause'); + Future resumeMusic() async => _methodChannel.invokeMethod('resume'); + Future nextTrack() async => _methodChannel.invokeMethod('next'); + Future previousTrack() async => _methodChannel.invokeMethod('previous'); + Future stopMusic() async => _methodChannel.invokeMethod('stop'); + Future setVolume(double volume) async => _methodChannel.invokeMethod( + 'setVolume', + {'volume': volume}, + ); // volume: 0.0~1.0 + Future> getStatus() async { + final result = await _methodChannel.invokeMethod('getStatus'); + return { + 'isPlaying': result?['isPlaying'] ?? false, + 'id': result?['id'] ?? 0, + }; + } + + /// 获取播放进度信息 + Future> getProgress() async { + final result = await _methodChannel.invokeMethod('getProgress'); + return { + 'currentPosition': result?['currentPosition'] ?? 0, // 当前播放位置(毫秒) + 'duration': result?['duration'] ?? 0, // 总时长(毫秒) + 'progress': result?['progress'] ?? 0.0, // 播放进度(0.0-1.0) + }; + } + + /// 跳转到指定位置 + Future seekTo(int positionMs) async { + await _methodChannel.invokeMethod('seekTo', {'position': positionMs}); + } + + /// 播放音乐列表 + Future playMusicPlaylist(List> songs) async { + await _methodChannel.invokeMethod('playlist', {'songs': songs}); + } + + /// 更新媒体会话进度信息 + Future updateMediaSessionProgress( + int currentPosition, + int duration, + double progress, + ) async { + await _methodChannel.invokeMethod('updateMediaSessionProgress', { + 'currentPosition': currentPosition, + 'duration': duration, + 'progress': progress, + }); + } + + /// 设置媒体会话回调 + Future setMediaSessionCallbacks({ + required Function() onPlay, + required Function() onPause, + required Function() onNext, + required Function() onPrevious, + required Function(int) onSeekTo, + required Function() onStop, + required Function(int, int, int, double) onProgress, + }) async { + // 设置方法调用处理器来处理来自原生平台的回调 + _methodChannel.setMethodCallHandler((call) async { + switch (call.method) { + case 'onMediaSessionPlay': + onPlay(); + break; + case 'onMediaSessionPause': + onPause(); + break; + case 'onMediaSessionNext': + onNext(); + break; + case 'onMediaSessionPrevious': + onPrevious(); + break; + case 'onMediaSessionSeekTo': + final position = call.arguments['position'] as int; + onSeekTo(position); + break; + case 'onMediaSessionStop': + onStop(); + break; + case 'onMediaSessionProgress': + final currentIdInternal = call.arguments['currentIdInternal'] as int; + final currentPosition = call.arguments['currentPosition'] as int; + final duration = call.arguments['duration'] as int; + final progress = call.arguments['progress'] as double; + onProgress(currentIdInternal, currentPosition, duration, progress); + break; + } + }); + + // 通知原生平台启用媒体会话回调 + await _methodChannel.invokeMethod('enableMediaSessionCallbacks'); + } + + /// 更新媒体会话元数据 + Future updateMediaSessionMetadata(Map song) async { + await _methodChannel.invokeMethod('updateMediaSessionMetadata', { + 'song': song, + }); + } + + /// 更新媒体会话播放状态 + Future updateMediaSessionPlaybackState(bool isPlaying) async { + await _methodChannel.invokeMethod('updateMediaSessionPlaybackState', { + 'isPlaying': isPlaying, + }); + } +} diff --git a/local_plugins/music_service/lib/music_service_stub.dart b/local_plugins/music_service/lib/music_service_stub.dart new file mode 100644 index 000000000..0393682dd --- /dev/null +++ b/local_plugins/music_service/lib/music_service_stub.dart @@ -0,0 +1,38 @@ +class MusicService { + static final MusicService _instance = MusicService._internal(); + factory MusicService() => _instance; + + MusicService._internal(); + + Future playMusic(Map song) async {} + Future playMusicPlaylist(List> playlist) async {} + Future pauseMusic() async {} + Future resumeMusic() async {} + Future stopMusic() async {} + Future setVolume(double volume) async {} + Future> getStatus() async => {}; + Future> getProgress() async => { + 'isPlaying': false, + 'currentPosition': 0, + 'duration': 0, + 'progress': 0.0, + }; + Future seekTo(int positionMs) async {} + + Future updateMediaSessionProgress( + int currentPosition, int duration, double progress) async {} + + Future setMediaSessionCallbacks({ + required Function() onPlay, + required Function() onPause, + required Function() onNext, + required Function() onPrevious, + required Function(int) onSeekTo, + required Function() onStop, + required Function(int, int, int, double) onProgress, + }) async {} + + Future updateMediaSessionMetadata(Map song) async {} + + Future updateMediaSessionPlaybackState(bool isPlaying) async {} +} From 27573463341d2d0c400bae3ec96062bea2916134 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Sat, 8 Nov 2025 17:58:55 +0800 Subject: [PATCH 003/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/models/user_Info.dart | 57 +++++- lib/data/services/network/api.dart | 9 + lib/data/services/pay_service.dart | 62 ++++++- .../controllers/goods_base_controller.dart | 155 ++++++++++++++++- lib/modules/goods/views/goodsai_view.dart | 37 ++-- lib/modules/goods/views/goodsmeet_view.dart | 162 +++++++++++++++++- lib/modules/goods/views/goodstrade_view.dart | 162 +++++++++++++++++- 7 files changed, 607 insertions(+), 37 deletions(-) diff --git a/lib/data/models/user_Info.dart b/lib/data/models/user_Info.dart index 662e48d3c..719bbfa07 100644 --- a/lib/data/models/user_Info.dart +++ b/lib/data/models/user_Info.dart @@ -1,10 +1,14 @@ import 'package:get_storage/get_storage.dart'; +import 'package:get/get.dart'; import '../../../core/utils/logger.dart'; class User { // 单例实例 static User? _instance; + /// 全局刷新信号(当用户信息更新时 +1,用于驱动UI重建) + static final RxInt refreshTick = 0.obs; + /// 安全地检查用户是否已经登录(即单例是否已初始化) static bool isLoggedIn() { return _instance != null; @@ -41,7 +45,6 @@ class User { String phonemac; String password; int viplv = 0; //添加会员等级字段,0表示普通用户 - // 新增的会员与用量统计字段 int viptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) int tradetotaltime = 0; // 翻译总时长 int meettotaltime = 0; // 会议总时长 @@ -63,6 +66,13 @@ class User { required this.phonemac, required this.password, required this.viplv, + required this.viptime, + required this.aichattotaltimer, + required this.meettotaltime, + required this.tradetotaltime, + required this.aichattimer, + required this.meettime, + required this.tradetime, required this.devices, }); @@ -79,20 +89,28 @@ class User { name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值 uid: (userData?['uid'] as String?) ?? '', avatar: (userData?['avatar'] as String?) ?? '', - language: (userData?['language'] as String?) ?? 'en', - mail: (userData?['mail'] as String?) ?? '', phone: (userData?['phone'] as String?) ?? '', phonemac: (userData?['phonemac'] as String?) ?? '', password: (userData?['password'] as String?) ?? '', viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 + viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 + + aichattotaltimer: (userData?['aichattotaltimer'] as int?) ?? 0, + meettotaltime: (userData?['meettotaltime'] as int?) ?? 0, + tradetotaltime: (userData?['tradetotaltime'] as int?) ?? 0, + aichattimer: (userData?['aichattimer'] as int?) ?? 0, + meettime: (userData?['meettime'] as int?) ?? 0, + tradetime: (userData?['tradetime'] as int?) ?? 0, + devices: devicesData ?.map((e) => UserDevice.fromJson(e as Map)) .toList() ?? [], // 处理设备列表 ); } + factory User.fronTokenJson(Map json) { // 修复1:安全获取嵌套的 user 字段 final userData = json['user'] as Map?; // 允许空值 @@ -111,6 +129,13 @@ class User { phonemac: (userData?['phonemac'] as String?) ?? '', password: (userData?['password'] as String?) ?? '', viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 + viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 + aichattotaltimer: (userData?['aichattotaltimer'] as int?) ?? 0, + meettotaltime: (userData?['meettotaltime'] as int?) ?? 0, + tradetotaltime: (userData?['tradetotaltime'] as int?) ?? 0, + aichattimer: (userData?['aichattimer'] as int?) ?? 0, + meettime: (userData?['meettime'] as int?) ?? 0, + tradetime: (userData?['tradetime'] as int?) ?? 0, devices: devicesData != null ? (devicesData) .map((e) => UserDevice.fromJson(e as Map)) @@ -119,6 +144,29 @@ class User { ); } + updateUserInfo(Map user) { + name = user['name'] as String? ?? name; + uid = user['uid'] as String? ?? uid; + avatar = user['avatar'] as String? ?? avatar; + language = user['language'] as String? ?? language; + token = user['token'] as String? ?? token; + mail = user['mail'] as String? ?? mail; + phone = user['phone'] as String? ?? phone; + phonemac = user['phonemac'] as String? ?? phonemac; + password = user['password'] as String? ?? password; + viplv = user['viplv'] as int? ?? viplv; + viptime = user['viptime'] as int? ?? viptime; + tradetotaltime = user['tradetotaltime'] as int? ?? tradetotaltime; + meettotaltime = user['meettotaltime'] as int? ?? meettotaltime; + aichattotaltimer = user['aichattotaltimer'] as int? ?? aichattotaltimer; + tradetime = user['tradetime'] as int? ?? tradetime; + meettime = user['meettime'] as int? ?? meettime; + aichattimer = user['aichattimer'] as int? ?? aichattimer; + + // 触发全局刷新信号,驱动依赖UI重建 + refreshTick.value++; + } + // 完整的JSON序列化 Map toJson() => { 'user': { @@ -135,8 +183,7 @@ class User { 'viptime': viptime, 'tradetotaltime': tradetotaltime, 'meettotaltime': meettotaltime, - // 序列化统一使用 aichattotaltime 键 - 'aichattotaltime': aichattotaltimer, + 'aichattotaltimer': aichattotaltimer, 'tradetime': tradetime, 'meettime': meettime, 'aichattimer': aichattimer, diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index 19b706bed..4f8b9a258 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -181,6 +181,15 @@ class Api { ); } + //询问订单 + static payaskorder([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/pay_askorder', + params: params, + ); + } + //获取模版数据 static getEchomeetTemplates([params]) { return DioManager().request( diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index 4aa34a614..ac34fbd39 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -11,6 +11,9 @@ typedef PaymentResultCallback = void Function(bool success, String message); class PayService extends GetxService { late FlWX _flwx; late Tobias _tobias; // 添加 Tobias 实例 + String? _lastOrderId; // 最近一次创建的订单号 + + String? get lastOrderId => _lastOrderId; @override void onInit() { @@ -151,9 +154,36 @@ class PayService extends GetxService { print('创建支付订单: $response'); // 检查响应是否成功 if (response != null) { + // 尝试提取订单号,兼容多种返回字段 + String? orderId; + final candidates = [ + 'order_id', + 'orderId', + 'out_trade_no', + 'outTradeNo', + ]; + for (final key in candidates) { + final v = response[key]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + if (orderId == null && response['data'] is Map) { + final data = response['data'] as Map; + for (final key in candidates) { + final v = data[key]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + } + _lastOrderId = orderId; + final pay_params = response["pay_params"] as Map; // 返回微信支付所需的参数 - return { + final result = { 'appId': pay_params['appid'], 'partnerId': pay_params['partnerid'], 'prepayId': pay_params['prepayid'], @@ -162,6 +192,10 @@ class PayService extends GetxService { 'timestamp': pay_params['timestamp'], 'sign': pay_params['sign'], }; + if (orderId != null) { + result['orderId'] = orderId; + } + return result; } else { print('创建支付订单失败: ${response?['message'] ?? '未知错误'}'); return null; @@ -349,6 +383,32 @@ class PayService extends GetxService { // 检查响应是否成功 if (response != null && response['alipay_pay_params'] != null) { + // 解析订单号并缓存 + String? orderId; + final candidates = [ + 'order_id', + 'orderId', + 'out_trade_no', + 'outTradeNo', + ]; + for (final key in candidates) { + final v = response[key]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + if (orderId == null && response['data'] is Map) { + final data = response['data'] as Map; + for (final key in candidates) { + final v = data[key]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + } + _lastOrderId = orderId; // 返回支付宝订单信息字符串 return response['alipay_pay_params'] as String?; } else { diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 243d49723..133b09ffd 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:voitrans/data/models/user_Info.dart'; import '../../../routes/app_routes.dart'; import '../../../data/services/pay_service.dart'; import '../../../data/models/goods.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../../../data/services/network/dio_manager.dart'; +import '../../../data/services/network/api.dart'; /// goods 模块基础控制器,封装通用的商品加载与支付流程 abstract class GoodsBaseController extends GetxController { @@ -238,7 +240,21 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(false, '创建微信订单失败'); return false; } - return _payService.wechatPay(paymentData: paymentData, onResult: onResult); + final orderId = + paymentData['orderId'] as String? ?? _payService.lastOrderId; + return _payService.wechatPay( + paymentData: paymentData, + onResult: (success, msg) async { + // 先透传给外部回调 + onResult?.call(success, msg); + if (success) { + await _confirmOrderAndShow(orderId, + channel: '微信', initialMessage: msg); + } else { + _showPayResultDialog(false, msg ?? '支付失败'); + } + }, + ); } /// 指定支付宝支付(直接下单并拉起支付宝) @@ -256,7 +272,142 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(false, '创建支付宝订单失败'); return false; } - return _payService.alipay(orderInfo: orderInfo, onResult: onResult); + final orderId = _payService.lastOrderId; // 创建订单时已缓存 + return _payService.alipay( + orderInfo: orderInfo, + onResult: (success, msg) async { + onResult?.call(success, msg); + if (success) { + await _confirmOrderAndShow(orderId, + channel: '支付宝', initialMessage: msg); + } else { + _showPayResultDialog(false, msg ?? '支付失败'); + } + }, + ); + } + + Future _confirmOrderAndShow(String? orderId, + {required String channel, String? initialMessage}) async { + // 若无法获取订单号,直接弹成功提示但提醒稍后刷新 + if (orderId == null || orderId.isEmpty) { + _showPayResultDialog(true, '${channel}支付成功,订单处理中,请稍后查看。'); + return; + } + + String message = initialMessage ?? '${channel}支付成功'; + bool success = false; + try { + // 简单轮询回查,避免回调延迟 + for (int i = 0; i < 5; i++) { + final resp = await Api.payaskorder({'order_id': orderId}); + print("查询订单 resp: $resp"); + final order = resp?['order'] as Map?; + final user = resp?['user'] as Map?; + if (order != null && user != null) { + final orderStatus = order["status"]; + if (orderStatus == 1) { + User.instance.updateUserInfo(user); + success = true; + break; + } + } + await Future.delayed(const Duration(milliseconds: 1500)); + } + + // 若标记成功但未拿到用户信息,使用token登录接口回拉用户资料,确保额度刷新 + if (success) { + try { + final response = await Api.tokenlogin(); + if (response is Map && response['user'] is Map) { + User.instance + .updateUserInfo(response['user'] as Map); + } + } catch (_) {} + } + } catch (e) { + message = '查询支付结果异常: $e'; + } + _showPayResultDialog(success, message); + } + + void _showPayResultDialog(bool success, String message) { + final context = Get.context; + final isDark = + context != null && Theme.of(context).brightness == Brightness.dark; + Get.dialog( + Dialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 24, vertical: 24), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + backgroundColor: isDark ? Colors.grey[900] : Colors.white, + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 48, + height: 48, + decoration: BoxDecoration( + color: success + ? (isDark ? Colors.green[800] : Colors.green[100]) + : (isDark ? Colors.red[800] : Colors.red[100]), + borderRadius: BorderRadius.circular(12), + ), + child: Icon( + success ? Icons.check_circle : Icons.error, + color: + success ? Colors.green[600] : Colors.redAccent[200], + size: 28, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + success ? '支付成功' : '支付失败', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w700, + color: isDark ? Colors.white : Colors.black, + ), + ), + const SizedBox(height: 6), + Text( + message, + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 16), + Divider(color: isDark ? Colors.white24 : Colors.black12), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Get.back(), + child: const Text('知道了'), + ), + ], + ), + ], + ), + ), + ), + barrierDismissible: true, + ); } /// 指定 PayPal 支付(创建订单并打开授权链接) diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index fb9dc428d..913efb2ae 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -28,6 +28,8 @@ class GoodsaiView extends GetView { centerTitle: true, ), body: Obx(() { + // 访问刷新信号以建立依赖关系:用户信息变化时触发重建 + final _ = User.refreshTick.value; if (controller.loading.value) { return const Center(child: CircularProgressIndicator()); } @@ -35,25 +37,12 @@ class GoodsaiView extends GetView { return Center(child: Text(controller.error.value)); } - // 用户用量信息 - int totalAi = 0; - int remainAi = 0; - if (User.isLoggedIn()) { - final u = User.instance; - totalAi = u.aichattotaltimer; - remainAi = u.aichattimer; - } - final usedAi = - (totalAi > 0) ? (totalAi - remainAi).clamp(0, totalAi) : 0; - final progress = (totalAi > 0) ? usedAi / totalAi : 0.0; - return ListView( padding: EdgeInsets.all(16.w), children: [ _buildHeader(isDarkMode), SizedBox(height: 12.h), - _buildUsageCard(isDarkMode, - totalAi: totalAi, remainAi: remainAi, progress: progress), + _buildUsageCard(isDarkMode), SizedBox(height: 16.h), Text( '可购买套餐', @@ -146,12 +135,18 @@ class GoodsaiView extends GetView { ); } - Widget _buildUsageCard( - bool isDarkMode, { - required int totalAi, - required int remainAi, - required double progress, - }) { + Widget _buildUsageCard(bool isDarkMode) { + // 从 User 属性计算 aitimer 数据 + int totalAi = 0; + int remainAi = 0; + if (User.isLoggedIn()) { + final u = User.instance; + totalAi = u.aichattotaltimer; + remainAi = u.aichattimer; + } + // 进度显示为“剩余额度比例”,remain/total: + final progress = (totalAi > 0) ? (remainAi / totalAi).clamp(0.0, 1.0) : 0.0; + return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( @@ -176,7 +171,7 @@ class GoodsaiView extends GetView { color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), SizedBox(width: 8.w), Text( - '使用进度', + '剩余额度', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index 25cb5e2d5..ff00908e0 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/user_Info.dart'; import '../controllers/goodsmeet_controller.dart'; class GoodsmeetView extends GetView { @@ -27,6 +28,8 @@ class GoodsmeetView extends GetView { centerTitle: true, ), body: Obx(() { + // 访问刷新信号以建立依赖关系:用户信息变化时触发重建 + final _ = User.refreshTick.value; if (controller.loading.value) { return const Center(child: CircularProgressIndicator()); } @@ -35,14 +38,21 @@ class GoodsmeetView extends GetView { } return ListView.separated( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length + 2, + itemCount: controller.items.length + 4, separatorBuilder: (_, __) => SizedBox(height: 12.h), itemBuilder: (_, index) { - if (index < controller.items.length) { - final item = controller.items[index]; + if (index == 0) { + return _buildHeader(isDarkMode); + } + if (index == 1) { + return _buildUsageCard(isDarkMode); + } + final itemIndex = index - 2; + if (itemIndex < controller.items.length) { + final item = controller.items[itemIndex]; return _buildCard(item, isDarkMode); } - if (index == controller.items.length) { + if (index == controller.items.length + 2) { return _buildFeaturesSection(isDarkMode); } return _buildFooterSection(isDarkMode); @@ -52,6 +62,150 @@ class GoodsmeetView extends GetView { ); } + Widget _buildHeader(bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 44.w, + height: 44.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.pink[900]!.withOpacity(0.3) + : Colors.pink[100]!, + borderRadius: BorderRadius.circular(22.r), + ), + child: Icon(Icons.people_alt, + color: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '会议助手', + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w700, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + SizedBox(height: 6.h), + Text( + '录音转写、关键词检索与自动总结,提升会议效率。', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + SizedBox(height: 4.h), + Text( + '适用于商务会议、课堂笔记、访谈纪要等场景。', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildUsageCard(bool isDarkMode) { + int totalAi = 0; + int remainAi = 0; + if (User.isLoggedIn()) { + final u = User.instance; + totalAi = u.meettotaltime; + remainAi = u.meettime; + } + final progress = (totalAi > 0) ? (remainAi / totalAi).clamp(0.0, 1.0) : 0.0; + + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.timeline, + color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + SizedBox(width: 8.w), + Text( + '剩余额度', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ], + ), + SizedBox(height: 12.h), + LinearProgressIndicator( + value: progress, + minHeight: 8.h, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[300], + valueColor: AlwaysStoppedAnimation( + isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '总次数:$totalAi', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + Text( + '剩余:$remainAi', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ], + ), + ); + } + Widget _buildCard(DBGoods item, bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart index 8b2c619c4..a2025f7be 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/user_Info.dart'; import '../controllers/goodstrade_controller.dart'; class GoodstradeView extends GetView { @@ -27,6 +28,8 @@ class GoodstradeView extends GetView { centerTitle: true, ), body: Obx(() { + // 访问刷新信号以建立依赖关系:用户信息变化时触发重建 + final _ = User.refreshTick.value; if (controller.loading.value) { return const Center(child: CircularProgressIndicator()); } @@ -35,14 +38,21 @@ class GoodstradeView extends GetView { } return ListView.separated( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length + 2, + itemCount: controller.items.length + 4, separatorBuilder: (_, __) => SizedBox(height: 12.h), itemBuilder: (_, index) { - if (index < controller.items.length) { - final item = controller.items[index]; + if (index == 0) { + return _buildHeader(isDarkMode); + } + if (index == 1) { + return _buildUsageCard(isDarkMode); + } + final itemIndex = index - 2; + if (itemIndex < controller.items.length) { + final item = controller.items[itemIndex]; return _buildCard(item, isDarkMode); } - if (index == controller.items.length) { + if (index == controller.items.length + 2) { return _buildFeaturesSection(isDarkMode); } return _buildFooterSection(isDarkMode); @@ -52,6 +62,150 @@ class GoodstradeView extends GetView { ); } + Widget _buildHeader(bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 44.w, + height: 44.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + borderRadius: BorderRadius.circular(22.r), + ), + child: Icon(Icons.translate, + color: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '翻译功能', + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w700, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + SizedBox(height: 6.h), + Text( + '多语种实时同传与文本翻译,低延时语音播报。', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + SizedBox(height: 4.h), + Text( + '适用于出行、商务、演讲与教学等场景。', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildUsageCard(bool isDarkMode) { + int totalAi = 0; + int remainAi = 0; + if (User.isLoggedIn()) { + final u = User.instance; + totalAi = u.tradetotaltime; + remainAi = u.tradetime; + } + final progress = (totalAi > 0) ? (remainAi / totalAi).clamp(0.0, 1.0) : 0.0; + + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.timeline, + color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + SizedBox(width: 8.w), + Text( + '剩余额度', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ], + ), + SizedBox(height: 12.h), + LinearProgressIndicator( + value: progress, + minHeight: 8.h, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[300], + valueColor: AlwaysStoppedAnimation( + isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '总次数:$totalAi', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + Text( + '剩余:$remainAi', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ], + ), + ], + ), + ); + } + Widget _buildCard(DBGoods item, bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), From 7b8f0318e285db99125004e418fe80efe35e6701 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 10 Nov 2025 16:00:18 +0800 Subject: [PATCH 004/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/pay_service.dart | 78 +++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index ac34fbd39..c58275c25 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'dart:convert'; import 'package:voitrans/data/services/network/api.dart'; import 'package:tobias/tobias.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -361,7 +362,7 @@ class PayService extends GetxService { required String productName, String? productDesc, required int amount, - int paymentMethod = 2, // 2表示支付宝 + int paymentMethod = 3, // 2表示支付宝 String? clientIp, String? notifyUrl, String? extraData, @@ -445,9 +446,73 @@ class PayService extends GetxService { 'extra_data': extraData ?? '', }); - // 兼容不同字段命名,尽量从返回中提取可用的支付URL if (response != null) { - final candidates = [ + // 1) 提取并缓存平台订单号(用于回查) + String? appOrderId; + const candidates = [ + 'order_id', + 'orderId', + 'out_trade_no', + 'outTradeNo', + ]; + for (final key in candidates) { + final v = response[key]; + if (v is String && v.isNotEmpty) { + appOrderId = v; + break; + } + } + final data = response['data']; + if (appOrderId == null && data is Map) { + for (final key in candidates) { + final v = data[key]; + if (v is String && v.isNotEmpty) { + appOrderId = v; + break; + } + } + } + _lastOrderId = appOrderId; // 记录APP侧订单号(如 APP2025...),用于 pay_askorder + + // 2) 优先解析 paypal_pay_params 字段(后端返回JSON字符串,含 links) + String? rawParams; + final topParams = response['paypal_pay_params']; + final dataParams = + (data is Map) ? data['paypal_pay_params'] : null; + if (topParams is String && topParams.isNotEmpty) { + rawParams = topParams; + } else if (dataParams is String && dataParams.isNotEmpty) { + rawParams = dataParams; + } + + if (rawParams != null) { + try { + final parsed = jsonDecode(rawParams); + if (parsed is Map) { + final links = parsed['links']; + if (links is List) { + for (final item in links) { + if (item is Map) { + final rel = item['rel']?.toString(); + final hrefRaw = item['href']?.toString(); + if (rel == 'approve' && + hrefRaw != null && + hrefRaw.isNotEmpty) { + // 清理日志中可能出现的反引号等噪音字符 + final href = hrefRaw.replaceAll('`', '').trim(); + return href; + } + } + } + } + } + } catch (e) { + print('解析 paypal_pay_params 失败: $e'); + } + } + + // 3) 回退:尝试从常见字段直接取URL + final urlKeys = [ 'paypal_pay_url', 'approval_url', 'paypalApprovalUrl', @@ -455,16 +520,14 @@ class PayService extends GetxService { 'payment_url', 'url', ]; - for (final key in candidates) { + for (final key in urlKeys) { final url = response[key]; if (url is String && url.isNotEmpty) { return url; } } - - final data = response['data']; if (data is Map) { - for (final key in candidates) { + for (final key in urlKeys) { final url = data[key]; if (url is String && url.isNotEmpty) { return url; @@ -472,6 +535,7 @@ class PayService extends GetxService { } } } + print('创建 PayPal 订单失败或未返回有效URL: $response'); return null; } catch (e) { From b8e5c957c4135a7255d02cd480492dcae75fb234 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 11 Nov 2025 17:42:35 +0800 Subject: [PATCH 005/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0google=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/network/api.dart | 9 + lib/data/services/pay_service.dart | 250 ++++++++++++++++++ .../controllers/goods_base_controller.dart | 154 ++++++++++- pubspec.yaml | 1 + 4 files changed, 413 insertions(+), 1 deletion(-) diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index 4f8b9a258..3c7ab245a 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -190,6 +190,15 @@ class Api { ); } + //内购收据验证 + static payiapverify([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/pay_iapverify', + params: params, + ); + } + //获取模版数据 static getEchomeetTemplates([params]) { return DioManager().request( diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index c58275c25..9a5c66419 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -1,8 +1,12 @@ import 'package:get/get.dart'; import 'dart:convert'; +import 'dart:async'; +import 'package:flutter/foundation.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; import 'package:voitrans/data/services/network/api.dart'; import 'package:tobias/tobias.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:voitrans/data/models/user_Info.dart'; import '../../modules/login/controllers/weixinLogin.dart'; @@ -13,6 +17,11 @@ class PayService extends GetxService { late FlWX _flwx; late Tobias _tobias; // 添加 Tobias 实例 String? _lastOrderId; // 最近一次创建的订单号 + // 内购 + final InAppPurchase _inAppPurchase = InAppPurchase.instance; + StreamSubscription>? _iapSubscription; + final RxBool iapAvailable = false.obs; + PaymentResultCallback? _iapOnResult; String? get lastOrderId => _lastOrderId; @@ -33,6 +42,7 @@ class PayService extends GetxService { // 初始化支付宝SDK _tobias = Tobias(); // 初始化 Tobias 实例 _initAlipay(); + _initIAP(); } /// 初始化支付宝SDK @@ -46,6 +56,246 @@ class PayService extends GetxService { } } + /// 初始化内购(Apple/Google) + Future _initIAP() async { + try { + // Web 环境不支持内购 + if (kIsWeb) { + iapAvailable.value = false; + return; + } + final available = await _inAppPurchase.isAvailable(); + iapAvailable.value = available; + if (!available) return; + + // 监听购买结果流 + _iapSubscription?.cancel(); + _iapSubscription = _inAppPurchase.purchaseStream.listen( + _handlePurchaseUpdates, + onDone: () => _iapSubscription?.cancel(), + onError: (e) { + _iapOnResult?.call(false, '内购异常: $e'); + }, + ); + } catch (e) { + print('初始化内购失败: $e'); + } + } + + /// 调试:批量查询并打印内购商品详情(用于确认商品ID是否存在) + Future debugQueryProducts(Set productIds) async { + try { + // 先原样打印传入的 productIds,便于核对入参 + print('[IAP] debugQueryProducts 输入 IDs(Set): $productIds'); + final idsList = productIds.toList(); + print('[IAP] debugQueryProducts 输入 IDs(List): ${idsList.join(', ')}'); + for (final id in productIds) { + print('[IAP] 待查询商品ID: $id'); + } + // 仅在非 Web 平台执行;平台信息用于日志 + await _initIAP(); + final platform = _platformString(); + if (!iapAvailable.value) { + print('[IAP-$platform] 当前平台内购不可用,无法查询商品。'); + return; + } + print('[IAP-$platform] 开始查询商品,IDs=${productIds.join(', ')}'); + final resp = await _inAppPurchase.queryProductDetails(productIds); + if (resp.error != null) { + print('[IAP-$platform] 查询错误: ${resp.error}'); + } + if (resp.productDetails.isEmpty) { + print('[IAP-$platform] 未返回任何商品。notFound=${resp.notFoundIDs}'); + } else { + for (final p in resp.productDetails) { + print( + '[IAP-$platform] 商品: id=${p.id}, title=${p.title}, price=${p.price}, currency=${p.currencyCode}'); + } + if (resp.notFoundIDs.isNotEmpty) { + print('[IAP-$platform] 未找到的IDs: ${resp.notFoundIDs}'); + } + } + } catch (e) { + print('[IAP] 调试查询异常: $e'); + } + } + + Future _queryIapProduct(String productId) async { + try { + final pid = productId.trim(); + print('[IAP] 开始查询单个商品: id="$pid"'); + final resp = await _inAppPurchase.queryProductDetails({pid}); + if (resp.error != null) { + print('[IAP] 查询商品失败: ${resp.error}'); + } + if (resp.productDetails.isEmpty) { + print('[IAP] 查询结果为空。notFound=${resp.notFoundIDs}'); + return null; + } + for (final p in resp.productDetails) { + print( + '[IAP] 命中商品: id=${p.id}, title=${p.title}, price=${p.price}, currency=${p.currencyCode}'); + } + // 避免 Dart 泛型推断在 Android 平台出现 orElse 类型不匹配(ProductDetails vs GooglePlayProductDetails) + ProductDetails? matched; + for (final p in resp.productDetails) { + if (p.id == pid) { + matched = p; + break; + } + } + return matched ?? resp.productDetails.first; + } catch (e) { + print('[IAP] 查询内购商品异常: $e'); + return null; + } + } + + /// Apple/Google 内购统一流程(消耗型) + Future _processIapPayment({ + required String productId, + PaymentResultCallback? onResult, + }) async { + _iapOnResult = onResult; + print( + '[IAP] 准备发起购买: id="${productId.trim()}" iapAvailable=${iapAvailable.value}'); + if (!iapAvailable.value) { + onResult?.call(false, '内购不可用'); + return false; + } + final product = await _queryIapProduct(productId); + if (product == null) { + onResult?.call(false, '未找到内购商品: $productId'); + return false; + } + try { + final purchaseParam = PurchaseParam(productDetails: product); + final ok = await _inAppPurchase.buyConsumable( + purchaseParam: purchaseParam, + autoConsume: true, + ); + if (!ok) { + onResult?.call(false, '无法发起内购'); + } else { + onResult?.call(true, '已发起内购,请完成支付'); + } + return ok; + } catch (e) { + onResult?.call(false, '发起内购失败: $e'); + return false; + } + } + + Future _handlePurchaseUpdates(List detailsList) async { + for (final details in detailsList) { + switch (details.status) { + case PurchaseStatus.pending: + _iapOnResult?.call(true, '支付处理中…'); + break; + case PurchaseStatus.error: + _iapOnResult?.call(false, details.error?.message ?? '支付错误'); + break; + case PurchaseStatus.purchased: + case PurchaseStatus.restored: + // 完成购买并进行服务端收据验证 + try { + await _verifyIapWithServer(details); + } catch (e) { + _iapOnResult?.call(false, '收据验证失败: $e'); + } + break; + case PurchaseStatus.canceled: + _iapOnResult?.call(false, '已取消支付'); + break; + } + if (details.pendingCompletePurchase) { + try { + await _inAppPurchase.completePurchase(details); + } catch (_) {} + } + } + } + + Future _verifyIapWithServer(PurchaseDetails details) async { + final platform = _platformString(); + final verificationData = + details.verificationData.serverVerificationData ?? ''; + final transactionId = details.purchaseID ?? ''; + final params = { + 'platform': platform, + 'product_id': details.productID, + 'transaction_id': transactionId, + 'server_verification_data': verificationData, + }; + try { + final resp = await Api.payiapverify(params); + // 兼容多种返回结构,优先拿到用户信息 + Map? user; + if (resp is Map) { + if (resp['user'] is Map) { + user = resp['user'] as Map; + } else if (resp['data'] is Map && + (resp['data']['user'] is Map)) { + user = resp['data']['user'] as Map; + } + } + if (user != null) { + User.instance.updateUserInfo(user); + _iapOnResult?.call(true, '支付成功'); + } else { + _iapOnResult?.call(true, '支付成功,额度将稍后刷新'); + } + } catch (e) { + _iapOnResult?.call(false, '服务器验证异常: $e'); + } + } + + String _platformString() { + if (kIsWeb) return 'web'; + switch (defaultTargetPlatform) { + case TargetPlatform.iOS: + return 'ios'; + case TargetPlatform.android: + return 'android'; + case TargetPlatform.macOS: + return 'macos'; + case TargetPlatform.windows: + return 'windows'; + case TargetPlatform.linux: + return 'linux'; + case TargetPlatform.fuchsia: + return 'fuchsia'; + } + } + + /// 发起 Apple 内购 + Future processApplePayment({ + required String productId, + PaymentResultCallback? onResult, + }) async { + if (kIsWeb || defaultTargetPlatform != TargetPlatform.iOS) { + onResult?.call(false, '当前平台不支持 Apple 内购'); + return false; + } + // 重新初始化内购,避免早期可用性判断为 false + await _initIAP(); + return _processIapPayment(productId: productId, onResult: onResult); + } + + /// 发起 Google Play 内购 + Future processGooglePayment({ + required String productId, + PaymentResultCallback? onResult, + }) async { + if (kIsWeb || defaultTargetPlatform != TargetPlatform.android) { + onResult?.call(false, '当前平台不支持 Google 内购'); + return false; + } + // 重新初始化内购,避免早期可用性判断为 false + await _initIAP(); + return _processIapPayment(productId: productId, onResult: onResult); + } + /// 查询支付结果 /// /// [orderId] 订单ID diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 133b09ffd..79370527a 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -7,6 +7,7 @@ import '../../../data/models/goods.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../../../data/services/network/dio_manager.dart'; import '../../../data/services/network/api.dart'; +import 'package:flutter/foundation.dart'; /// goods 模块基础控制器,封装通用的商品加载与支付流程 abstract class GoodsBaseController extends GetxController { @@ -57,6 +58,14 @@ abstract class GoodsBaseController extends GetxController { ok = await payPaypal(item, onResult: (success, msg) { if (!success) failMsg = msg ?? failMsg; }); + } else if (method == _PayMethod.apple) { + ok = await payAppleIAP(item, onResult: (success, msg) { + if (!success) failMsg = msg ?? failMsg; + }); + } else if (method == _PayMethod.google) { + ok = await payGoogleIAP(item, onResult: (success, msg) { + if (!success) failMsg = msg ?? failMsg; + }); } if (!ok) { @@ -71,6 +80,8 @@ abstract class GoodsBaseController extends GetxController { final context = Get.context; final isDark = context != null && Theme.of(context).brightness == Brightness.dark; + final isIOS = GetPlatform.isIOS && !kIsWeb; + final isAndroid = GetPlatform.isAndroid && !kIsWeb; return await Get.bottomSheet<_PayMethod>( SafeArea( child: Container( @@ -208,6 +219,78 @@ abstract class GoodsBaseController extends GetxController { ], ), ), + if (isIOS) + GestureDetector( + onTap: () => Get.back(result: _PayMethod.apple), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isDark + ? Colors.white10 + : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), + ), + child: Icon( + Icons.apple, + color: isDark ? Colors.white : Colors.black, + ), + ), + const SizedBox(height: 8), + Text( + 'Apple 内购', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), + ), + ], + ), + ), + if (isAndroid) + GestureDetector( + onTap: () => Get.back(result: _PayMethod.google), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isDark + ? Colors.white10 + : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), + ), + child: Icon( + Icons.shop, + color: Colors.green[700], + ), + ), + const SizedBox(height: 8), + Text( + 'Google 内购', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), + ), + ], + ), + ), ], ), const SizedBox(height: 12), @@ -287,6 +370,75 @@ abstract class GoodsBaseController extends GetxController { ); } + /// 指定 Apple 内购(App Store IAP) + Future payAppleIAP(DBGoods item, + {PaymentResultCallback? onResult}) async { + // 使用商品id作为内购的 productId(与后台保持一致) + final productId = item.id; + return _payService.processApplePayment( + productId: productId, + onResult: (success, msg) { + // 透传并根据阶段展示 + onResult?.call(success, msg); + if (!success) { + _showPayResultDialog(false, msg); + } else { + // 支付成功或额度待刷新时弹窗,其余阶段用轻提示 + final showDialog = msg.contains('支付成功'); + if (showDialog) { + _showPayResultDialog(true, msg); + } else { + Get.snackbar('提示', msg, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + } + } + }, + ); + } + + /// 指定 Google Play 内购(Play Billing IAP) + Future payGoogleIAP(DBGoods item, + {PaymentResultCallback? onResult}) async { + // 使用商品id作为内购的 productId(与后台保持一致) + final productId = item.id; + // 调试:查询并打印当前商品的内购详情,便于确认 ID + await _payService.debugQueryProducts({productId}); + return _payService.processGooglePayment( + productId: productId, + onResult: (success, msg) { + onResult?.call(success, msg); + if (!success) { + _showPayResultDialog(false, msg); + } else { + final showDialog = msg.contains('支付成功'); + if (showDialog) { + _showPayResultDialog(true, msg); + } else { + Get.snackbar('提示', msg, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + } + } + }, + ); + } + + /// 调试:打印当前页面所有商品的 Google IAP 查询结果 + Future debugPrintGoogleIapProducts() async { + if (!GetPlatform.isAndroid || kIsWeb) { + print('[IAP] 当前平台非 Android 或为 Web,跳过商品查询调试。'); + return; + } + try { + final products = await fetchProducts(); + final ids = products.map((e) => e.id).toSet(); + await _payService.debugQueryProducts(ids); + } catch (e) { + print('[IAP] 调试查询商品异常: $e'); + } + } + Future _confirmOrderAndShow(String? orderId, {required String channel, String? initialMessage}) async { // 若无法获取订单号,直接弹成功提示但提醒稍后刷新 @@ -429,4 +581,4 @@ abstract class GoodsBaseController extends GetxController { } } -enum _PayMethod { wechat, alipay, paypal } +enum _PayMethod { wechat, alipay, paypal, apple, google } diff --git a/pubspec.yaml b/pubspec.yaml index d569d1b46..7f00789b2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,6 +64,7 @@ dependencies: fluwx: ^5.7.1 tobias: ^5.2.0 # 支付宝SDK url_launcher: ^6.3.1 + in_app_purchase: ^3.1.11 firebase_core: ^4.0.0 firebase_auth: ^6.0.1 google_sign_in: ^6.2.2 From 3ccb434c50af1d3b22e736b86522c9ae55bf301f Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 12 Nov 2025 21:18:41 +0800 Subject: [PATCH 006/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0ai=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/ble_manager.dart | 2 ++ lib/data/services/network/api.dart | 9 +++++++++ .../com/yunqiinnovation/agent_service/AgentService.kt | 4 +++- .../com/yunqiinnovation/agent_service/BleMediaService.kt | 8 +++++++- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index b53008c78..9b4a2cd56 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get_storage/get_storage.dart'; import 'package:get/get.dart'; @@ -775,6 +776,7 @@ class BleManager extends GetxService { 'musicServiceType': musicServiceType, "navigationMode": navigationMode, "isttsinterrupt": isTtsInterruptEnabled ? "true" : "false", + "aiintegral": 100, //ai积分 "callingTool": "callingTool".tr }; diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index 3c7ab245a..e405bd87f 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -243,4 +243,13 @@ class Api { params: params, ); } + + //资源使用请求 + static usagesResPoints([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/user_usages', + params: params, + ); + } } diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 8599c5962..140a73b01 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -135,6 +135,8 @@ object AgentService : CoroutineScope { private var currentAiJob: Job? = null private var currsessionId: String = "" + private var aiintegral:Int = 0 + // 空闲检测相关 private var idleCheckJob: Job? = null private val maxIdleSeconds = 10 // 最大空闲秒数(默认值) @@ -203,7 +205,7 @@ object AgentService : CoroutineScope { serverurl = config["serverurl"]?.toString() ?: ""; usertoken = config["usertoken"]?.toString() ?: ""; callingTool = config["callingTool"]?.toString() ?: ""; - + aiintegral = (config["aiintegral"] as? Number)?.toInt() ?: 0 // 初始化上下文和服务 this.context = appContext.applicationContext diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index d1b8a1827..f8cea9728 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -69,6 +69,7 @@ class BleMediaService : Service(), CoroutineScope { private const val KEY_MUSICSERVICE_TYPE = "musicServiceType" private const val APP_NAVIGATION_MODE = "navigationMode" private const val APP_CALLING_TOOL = "callingTool" + private const val KEY_AI_INTAGRAL = "aiintegral" // 用于跟踪服务是否正在运行 private val isRunning = AtomicBoolean(false) @@ -578,6 +579,7 @@ private var companionManager: BleCompanionManager? = null it.getStringExtra(KEY_MUSICSERVICE_TYPE)?.let { value -> config[KEY_MUSICSERVICE_TYPE] = value } it.getStringExtra(APP_NAVIGATION_MODE)?.let { value -> config[APP_NAVIGATION_MODE] = value } it.getStringExtra(APP_CALLING_TOOL)?.let { value -> config[APP_CALLING_TOOL] = value } + it.getStringExtra(KEY_AI_INTAGRAL)?.let { value -> config[KEY_AI_INTAGRAL] = value } it.getStringExtra("isttsinterrupt")?.let { value -> config["isttsinterrupt"] = value } // 提取 supportedLanguages 参数 @@ -641,6 +643,7 @@ private var companionManager: BleCompanionManager? = null config[KEY_MUSICSERVICE_TYPE] = getConfigString(prefs, KEY_MUSICSERVICE_TYPE, "") config[APP_NAVIGATION_MODE] = getConfigString(prefs, APP_NAVIGATION_MODE, "") config[APP_CALLING_TOOL] = getConfigString(prefs, APP_CALLING_TOOL, "") + config[KEY_AI_INTAGRAL] = getConfigInt(prefs, KEY_AI_INTAGRAL, 0) // 添加 supportedLanguages 参数处理 val supportedLanguagesStr = getConfigString(prefs, KEY_SUPPORTED_LANGUAGES, "") @@ -651,7 +654,6 @@ private var companionManager: BleCompanionManager? = null config[KEY_SUPPORTED_LANGUAGES] = languageList } } - return config } @@ -662,6 +664,10 @@ private var companionManager: BleCompanionManager? = null return prefs.getString(key, defaultValue) ?: defaultValue } + private fun getConfigInt(prefs: SharedPreferences, key: String, defaultValue: Int): Int { + return prefs.getInt(key, defaultValue) + } + override fun onBind(intent: Intent?): IBinder? = null override fun onDestroy() { From d0b00c40ece22074b77e5627f589dcd736f25d62 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 13 Nov 2025 11:37:03 +0800 Subject: [PATCH 007/177] =?UTF-8?q?refactor(BleService):=20=E6=8F=90?= =?UTF-8?q?=E5=8F=96UUID=E8=A7=A3=E6=9E=90=E9=80=BB=E8=BE=91=E5=88=B0?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E6=96=B9=E6=B3=95=E5=B9=B6=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=EF=BC=88=E8=A7=A3=E5=86=B311=E6=9C=8812?= =?UTF-8?q?=E6=97=A5=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将UUID字符串解析逻辑提取到独立的parseCBUUID方法,增加对32位不带短横线UUID的支持,并优化输入校验。移除冗余的try-catch结构,简化主扫描逻辑。 --- .../Sources/ble_service/BleService.swift | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift b/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift index a6914b556..84c3a4a44 100644 --- a/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift +++ b/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift @@ -282,22 +282,11 @@ private var cmdReplyType: UInt8 = 0 // 处理传入的UUID参数 for uuidStr in uuids { - do { - let cbuuid: CBUUID - if uuidStr.count == 4 { - // 短UUID,直接使用 - cbuuid = CBUUID(string: uuidStr) - } else if uuidStr.count == 36 { - // 完整UUID - cbuuid = CBUUID(string: uuidStr) - } else { - os_log("⚠️ 无效的UUID格式: %{public}@", log: logger, type: .default, uuidStr) - continue - } + if let cbuuid = parseCBUUID(from: uuidStr) { serviceUUIDs.append(cbuuid) os_log("✅ 添加扫描过滤器UUID: %{public}@", log: logger, type: .info, uuidStr) - } catch { - os_log("❌ 构造UUID失败: %{public}@, 错误: %{public}@", log: logger, type: .error, uuidStr, error.localizedDescription) + } else { + os_log("⚠️ 无效的UUID格式或字符: %{public}@", log: logger, type: .error, uuidStr) } } @@ -319,6 +308,40 @@ private var cmdReplyType: UInt8 = 0 } return true } + + /// 验证并解析 UUID 字符串为 CBUUID + /// - Parameter uuidStr: UUID 字符串(支持 4 位短 UUID、36 位完整 UUID;扩展支持 32 位不带短横线 UUID) + /// - Returns: 解析成功返回 CBUUID,否则返回 nil + private func parseCBUUID(from uuidStr: String) -> CBUUID? { + let trimmed = uuidStr.trimmingCharacters(in: .whitespacesAndNewlines) + + // 4 位短 UUID:仅允许十六进制字符,通过正则校验 + if trimmed.count == 4 { + if trimmed.range(of: "^[0-9a-fA-F]{4}$", options: .regularExpression) != nil { + return CBUUID(string: trimmed.lowercased()) + } else { + return nil + } + } + + // 36 位完整 UUID:使用系统 UUID 进行格式校验 + if trimmed.count == 36, let nsuuid = UUID(uuidString: trimmed) { + return CBUUID(nsuuid: nsuuid) + } + + // 32 位完整 UUID(不带短横线):按 8-4-4-4-12 格式插入短横线后校验 + if trimmed.count == 32, + trimmed.range(of: "^[0-9a-fA-F]{32}$", options: .regularExpression) != nil { + let lower = trimmed.lowercased() + let formatted = "\(lower.prefix(8))-\(lower.dropFirst(8).prefix(4))-\(lower.dropFirst(12).prefix(4))-\(lower.dropFirst(16).prefix(4))-\(lower.dropFirst(20))" + if let nsuuid = UUID(uuidString: formatted) { + return CBUUID(nsuuid: nsuuid) + } + } + + // 其他长度不支持 + return nil + } /// 停止扫描 public func stopScan() { From 961f85c50b7654b358bf5f721043486d94ebaa42 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 13 Nov 2025 16:40:04 +0800 Subject: [PATCH 008/177] =?UTF-8?q?feat(translation):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=80=9A=E8=AF=9D=E6=A8=A1=E5=BC=8F=E4=B8=8B=E7=9A=84=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E9=A1=B9=E5=B8=83=E5=B1=80=E5=92=8C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整翻译项在通话模式下的对齐方式,新增通话模式标记控制显示 重构语音识别事件处理逻辑,优化语言代码确定方式 添加BLE服务音频数据接收日志,便于调试 --- .../controllers/translation_controller.dart | 112 ++++++++++-------- .../widgets/translation_item_widget.dart | 10 +- .../yunqiinnovation/ble_service/BleService.kt | 2 + 3 files changed, 72 insertions(+), 52 deletions(-) diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 037ea6aa2..30aef106f 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -847,53 +847,64 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// 处理语音识别事件 /// [event] 识别事件 void _handleRecognitionEvent(RecognitionEvent event) { - if (event.type == RecognitionEventType.finalResult && - event.text.isNotEmpty) { - detectedLanguageCode = event.detectedLanguage; - print("处理识别完成:${event.text}"); - if (currentMode.value != 'faceToFace') { - handleFinalResult(event.text); - } else { - faceToFaceRecognitionText.value += event.text; - // 添加日志打印 - Logger.info('lxm-面对面翻译识别文本更新: ${faceToFaceRecognitionText.value}'); - } - if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) { - handleFinalResult(faceToFaceRecognitionText.value); - faceToFaceRecognitionText.value = ''; - } - } else if (event.type == RecognitionEventType.finalResult1 && - event.text.isNotEmpty) { - // 通话模式下:己方(麦克风)识别完成事件 - // 若原生未返回检测语言,则兜底为源语言 - detectedLanguageCode = event.detectedLanguage.isNotEmpty - ? event.detectedLanguage - : sourceLanguageCode.value; - print("处理己方识别完成:${event.text}"); - if (currentMode.value != 'faceToFace') { + // Logger.info("处理识别事件:${event}"); + switch (event.type) { + case RecognitionEventType.finalResult: + if (event.text.isEmpty) break; + // 通话模式下:目标语言即为识别语言,无需判断 + detectedLanguageCode = currentMode.value == 'call' + ? targetLanguageCode.value + : event.detectedLanguage; + Logger.info("处理识别完成:${event.text}"); + if (currentMode.value != 'faceToFace') { + handleFinalResult(event.text); + } else { + faceToFaceRecognitionText.value += event.text; + Logger.info('lxm-面对面翻译识别文本更新: ${faceToFaceRecognitionText.value}'); + } + if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) { + handleFinalResult(faceToFaceRecognitionText.value); + faceToFaceRecognitionText.value = ''; + } + break; + + case RecognitionEventType.finalResult1: + // 通话模式下:己方(麦克风)识别完成事件(对应ast服务) + if (event.text.isEmpty) break; + //通话模式下:己方语言即为源语言,无需判断 + detectedLanguageCode = sourceLanguageCode.value; + Logger.info("处理己方识别完成:${event.text}"); handleFinalResult(event.text); - } else { - faceToFaceRecognitionText.value += event.text; - Logger.info('lxm-面对面翻译识别文本更新(己方): ${faceToFaceRecognitionText.value}'); - } - if (currentMode.value == 'faceToFace' && activeSpeaker.value == 0) { - handleFinalResult(faceToFaceRecognitionText.value); - faceToFaceRecognitionText.value = ''; - } - } else if (event.type == RecognitionEventType.intermediateResult && - event.text.isNotEmpty) { - if (event.detectedLanguage.isNotEmpty) { - detectedLanguageCode = event.detectedLanguage; - } - print("处理识别中事件:${event.text}"); - handleIntermediateResult(event.text); - } else if (event.type == RecognitionEventType.error) { - Get.snackbar('error'.tr, event.error); - isRecognizing.value = false; - Logger.error('语音识别错误: ${event.error}'); - } else if (event.type == RecognitionEventType.canceled) { - isRecognizing.value = false; - Logger.error('语音识别取消: ${event.error}'); + break; + + case RecognitionEventType.intermediateResult: + if (event.text.isEmpty) break; + // 通话模式下:目标语言即为识别语言,无需判断 + detectedLanguageCode = currentMode.value == 'call' + ? targetLanguageCode.value + : event.detectedLanguage; + Logger.info("处理识别中事件:${event.text}"); + handleIntermediateResult(event.text); + break; + + case RecognitionEventType.error: + Get.snackbar('error'.tr, event.error); + isRecognizing.value = false; + Logger.error('语音识别错误: ${event.error}'); + break; + + case RecognitionEventType.canceled: + isRecognizing.value = false; + Logger.error('语音识别取消: ${event.error}'); + break; + + case RecognitionEventType.sessionStarted: + // 可按需处理会话开始事件 + break; + + case RecognitionEventType.sessionStopped: + // 可按需处理会话结束事件 + break; } } @@ -919,18 +930,21 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// [text] 识别的文本 void handleIntermediateResult(String text) { if (text.isEmpty) return; - print( + Logger.info( "handleIntermediateResult:${translationHistory.isEmpty}${translationHistory.isNotEmpty ? translationHistory.last.isIntermediate : 'N/A'}"); if (translationHistory.isEmpty || (translationHistory.isNotEmpty && !translationHistory.last.isIntermediate)) { currentSessionId ??= DateTime.now().millisecondsSinceEpoch.toString(); + // 关键调整:使用与最终结果一致的语言方向,避免左右“跳变” + final languageCodes = _determineLanguageCodes(); + final newItem = TranslationItem( sourceText: text, translatedText: '', - sourceLanguageCode: sourceLanguageCode.value, - targetLanguageCode: targetLanguageCode.value, + sourceLanguageCode: languageCodes['source']!, + targetLanguageCode: languageCodes['target']!, timestamp: DateTime.now(), sessionId: currentSessionId!, isFirstInSession: translationHistory.isEmpty || diff --git a/lib/modules/translation/views/widgets/translation_item_widget.dart b/lib/modules/translation/views/widgets/translation_item_widget.dart index 49ce94472..56ae1b264 100644 --- a/lib/modules/translation/views/widgets/translation_item_widget.dart +++ b/lib/modules/translation/views/widgets/translation_item_widget.dart @@ -49,15 +49,19 @@ class TranslationItemWidget extends GetView { // 判断是否是己方的翻译项(依据控制器当前源语言) final bool isSelf = item.sourceLanguageCode == controller.sourceLanguageCode.value; + // 新增:通话模式标记,用于控制右侧显示与隐藏中间态 + final bool isCallMode = controller.currentMode.value == 'call'; return GestureDetector( onTap: () => onToggleActionItem(item), // 触碰气泡时切换按钮显隐 onLongPressStart: (details) => onLongPressStart(context, isDarkMode, details, item), child: Align( - alignment: item.isIntermediate - ? Alignment.center - : (isSelf ? Alignment.centerLeft : Alignment.centerRight), + alignment: isCallMode + ? (isSelf ? Alignment.centerLeft : Alignment.centerRight) + : item.isIntermediate + ? Alignment.center + : (isSelf ? Alignment.centerLeft : Alignment.centerRight), child: Container( margin: EdgeInsets.only(bottom: 8.h), padding: EdgeInsets.all(12.w), diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt index 71dea5336..02f2c6cc6 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt @@ -893,12 +893,14 @@ object BleService { // 统计接收到的字节数 bytesReceivedInCurrentSecond += data.size processAudioData(data) + Log.i(TAG, "lxm--收到音频特征数据, 字节数=${data.size}") } BleConst.CALL_RECEIVE_AUDIO_CHAR_UUID -> { // 统计接收到的字节数 bytesReceivedInCurrentSecond += data.size processAudioData(data) + Log.i(TAG, "lxm--收到通话音频特征数据, 字节数=${data.size}") } // 通知特征数据(命令和控制) BleConst.NOTIFY_CHAR_UUID -> { From 941c1d7c437700b0e2ddb8a64461f6f4da62b111 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 13 Nov 2025 17:24:32 +0800 Subject: [PATCH 009/177] =?UTF-8?q?feat(translation):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=8C=89=E7=BF=BB=E8=AF=91=E6=A8=A1=E5=BC=8F=E9=9A=94=E7=A6=BB?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加模式隔离机制,使不同翻译模式的历史记录独立存储和加载 初始化时直接设置模式并加载对应历史,优化切换模式时的历史管理 --- .../controllers/translation_controller.dart | 13 ++++--- .../translation_history_controller.dart | 34 +++++++++++-------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 30aef106f..79cac6ab1 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -234,6 +234,8 @@ class TranslationController extends GetxController with WidgetsBindingObserver { Future changeTranslationMode(String mode) async { currentMode.value = mode; currentModeTitle.value = _getModeTitle(mode); + _historyManager.setMode(mode); + loadTranslationHistory(); //stopAll(); // 检查悬浮窗支持情况 @@ -397,7 +399,11 @@ class TranslationController extends GetxController with WidgetsBindingObserver { targetLanguageCode.value = targetAsrCode; } - // 加载历史记录 + // 初始化翻译模式(用于历史隔离的初始加载) + final initMode = Get.arguments?['translationId'] ?? 'simultaneous'; + _historyManager.setMode(initMode); + + // 按初始模式加载历史 loadTranslationHistory(); // 初始化服务 @@ -406,9 +412,8 @@ class TranslationController extends GetxController with WidgetsBindingObserver { // 初始化历史管理器 _historyManager.initialize(); - // 初始化翻译模式,根据跳转参数 - final mode = Get.arguments?['translationId'] ?? 'simultaneous'; - changeTranslationMode(mode); + // 应用模式逻辑(含ASR/TTS配置等) + changeTranslationMode(initMode); // 监听应用生命周期:当应用切到后台/失焦时兜底重置 activeSpeaker WidgetsBinding.instance.addObserver(this); diff --git a/lib/modules/translation/controllers/translation_history_controller.dart b/lib/modules/translation/controllers/translation_history_controller.dart index b7e7d15b3..f94f1f7a6 100644 --- a/lib/modules/translation/controllers/translation_history_controller.dart +++ b/lib/modules/translation/controllers/translation_history_controller.dart @@ -15,6 +15,12 @@ class TranslationHistoryManager extends GetxController { static const int _maxStorageItems = 1000; // 存储限制 static const int _maxDisplayItems = 20; // 显示限制 + String _currentMode = 'simultaneous'; // 当前模式 + String _getHistoryKey() => '${_historyKey}_$_currentMode'; // 模式化存储键 + void setMode(String mode) { + _currentMode = mode; + } + final GetStorage _storage = GetStorage(); // 翻译历史数据 @@ -40,7 +46,7 @@ class TranslationHistoryManager extends GetxController { /// 加载翻译历史记录 /// 初始化时只加载最近的显示条数,提高性能 void loadTranslationHistory() { - final historyJson = _storage.read(_historyKey); + final historyJson = _storage.read(_getHistoryKey()); if (historyJson != null) { try { final List historyList = jsonDecode(historyJson); @@ -64,15 +70,15 @@ class TranslationHistoryManager extends GetxController { Logger.info('翻译历史加载成功: ${translationHistory.length}条记录'); } catch (e) { - _storage.remove(_historyKey); + _storage.remove(_getHistoryKey()); Logger.error('加载翻译历史失败: ${e.toString()}'); } } else { - // 没有历史数据时初始化分页状态 hasMoreHistory.value = false; currentPage.value = 1; isLoadingMore.value = false; isLoadingMoreError.value = false; + translationHistory.clear(); } } @@ -94,7 +100,7 @@ class TranslationHistoryManager extends GetxController { // 保存到本地存储 final List> historyJson = historyToSave.map((item) => item.toJson()).toList(); - _storage.write(_historyKey, jsonEncode(historyJson)); + _storage.write(_getHistoryKey(), jsonEncode(historyJson)); Logger.info('翻译历史保存成功: 存储${historyToSave.length}条记录'); } catch (e) { @@ -141,7 +147,7 @@ class TranslationHistoryManager extends GetxController { Logger.i(TAG, '正在加载第 $nextPage 页翻译历史...'); // 从存储中获取所有历史记录 - final historyJson = _storage.read(_historyKey); + final historyJson = _storage.read(_getHistoryKey()); if (historyJson != null) { final List historyList = jsonDecode(historyJson); final List allHistory = @@ -194,8 +200,8 @@ class TranslationHistoryManager extends GetxController { final List result = []; final Set existingIds = {}; - // 添加存储的历史记录 - final historyJson = _storage.read(_historyKey); + // 添加存储的历史记录(按当前模式) + final historyJson = _storage.read(_getHistoryKey()); if (historyJson != null) { final List historyList = jsonDecode(historyJson); final List storedHistory = @@ -235,7 +241,7 @@ class TranslationHistoryManager extends GetxController { /// 清除所有翻译历史 void clearTranslationHistory() { translationHistory.clear(); - _storage.remove(_historyKey); + _storage.remove(_getHistoryKey()); Logger.info('翻译历史已清除'); } @@ -247,8 +253,8 @@ class TranslationHistoryManager extends GetxController { translationHistory.removeWhere((item) => item.sessionId == sessionId); final removedFromMemory = originalCount - translationHistory.length; - // 从存储中删除 - final historyJson = _storage.read(_historyKey); + // 从存储中删除(按当前模式) + final historyJson = _storage.read(_getHistoryKey()); int removedFromStorage = 0; if (historyJson != null) { @@ -263,7 +269,7 @@ class TranslationHistoryManager extends GetxController { // 重新保存 final List> updatedHistoryJson = storedHistory.map((item) => item.toJson()).toList(); - _storage.write(_historyKey, jsonEncode(updatedHistoryJson)); + _storage.write(_getHistoryKey(), jsonEncode(updatedHistoryJson)); } translationHistory.refresh(); @@ -287,8 +293,8 @@ class TranslationHistoryManager extends GetxController { timestamp.millisecondsSinceEpoch); final removedFromMemory = originalCount - translationHistory.length; - // 从存储中删除 - final historyJson = _storage.read(_historyKey); + // 从存储中删除(按当前模式) + final historyJson = _storage.read(_getHistoryKey()); int removedFromStorage = 0; if (historyJson != null) { @@ -306,7 +312,7 @@ class TranslationHistoryManager extends GetxController { // 重新保存 final List> updatedHistoryJson = storedHistory.map((item) => item.toJson()).toList(); - _storage.write(_historyKey, jsonEncode(updatedHistoryJson)); + _storage.write(_getHistoryKey(), jsonEncode(updatedHistoryJson)); } translationHistory.refresh(); From fdd7c098a53478468af747a3a243ef63b6260a38 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 13 Nov 2025 17:59:44 +0800 Subject: [PATCH 010/177] =?UTF-8?q?refactor(translation):=20=E5=B0=86?= =?UTF-8?q?=E9=9D=A2=E5=AF=B9=E9=9D=A2=E5=B8=83=E5=B1=80=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=9C=89=E7=8A=B6=E6=80=81=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=BB=9A=E5=8A=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将StatelessWidget改为StatefulWidget以管理滚动控制器 添加自动滚动到底部功能,提升长文本浏览体验 优化布局内边距,防止底部内容被遮挡 --- .../views/widgets/face_to_face_layout.dart | 130 ++++++++++++------ 1 file changed, 87 insertions(+), 43 deletions(-) diff --git a/lib/modules/translation/views/widgets/face_to_face_layout.dart b/lib/modules/translation/views/widgets/face_to_face_layout.dart index 562a543b9..efc6140a3 100644 --- a/lib/modules/translation/views/widgets/face_to_face_layout.dart +++ b/lib/modules/translation/views/widgets/face_to_face_layout.dart @@ -7,7 +7,7 @@ import '../../../../core/theme/app_colors.dart'; import '../dialogs/language_selection_dialog.dart'; /// 面对面翻译布局组件 -class FaceToFaceLayout extends StatelessWidget { +class FaceToFaceLayout extends StatefulWidget { final bool isDarkMode; final TranslationController controller; @@ -17,13 +17,60 @@ class FaceToFaceLayout extends StatelessWidget { required this.controller, }) : super(key: key); + @override + State createState() => _FaceToFaceLayoutState(); +} + +class _FaceToFaceLayoutState extends State { + final ScrollController _topScrollController = ScrollController(); + final ScrollController _bottomScrollController = ScrollController(); + + @override + void dispose() { + _topScrollController.dispose(); + _bottomScrollController.dispose(); + super.dispose(); + } + + void _scrollToBottom({bool animate = false}) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_topScrollController.hasClients) { + final m = _topScrollController.position.maxScrollExtent; + if (animate) { + _topScrollController.animateTo( + m, + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + ); + } else { + _topScrollController.jumpTo(m); + } + } + if (_bottomScrollController.hasClients) { + final m2 = _bottomScrollController.position.maxScrollExtent; + if (animate) { + _bottomScrollController.animateTo( + m2, + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + ); + } else { + _bottomScrollController.jumpTo(m2); + } + } + }); + } + @override Widget build(BuildContext context) { + final isDarkMode = widget.isDarkMode; + final controller = widget.controller; return Obx(() { // 获取最新的翻译记录 final latestItem = controller.translationHistory.isNotEmpty ? controller.translationHistory.last : null; + _scrollToBottom(animate: false); return Column( children: [ @@ -33,7 +80,7 @@ class FaceToFaceLayout extends StatelessWidget { angle: 3.14159, // 180度 = π弧度 child: Container( width: double.infinity, - padding: EdgeInsets.all(24.w), + padding: EdgeInsets.fromLTRB(24.w, 24.w, 24.w, 24.w + 96.h), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground.withValues(alpha: 0.5) @@ -45,24 +92,22 @@ class FaceToFaceLayout extends StatelessWidget { ), ), ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // 上半部的文本 - Text( - latestItem?.targetLanguageCode == - controller.targetLanguageCode.value - ? latestItem?.translatedText ?? '' //如果为null则显示空字符 - : latestItem?.sourceText ?? '', - style: TextStyle( - fontSize: 20.sp, - fontWeight: FontWeight.w500, - color: isDarkMode ? Colors.white : Colors.black87, - height: 1.4, - ), - textAlign: TextAlign.center, + child: SingleChildScrollView( + controller: _topScrollController, + physics: const BouncingScrollPhysics(), + child: Text( + latestItem?.targetLanguageCode == + controller.targetLanguageCode.value + ? latestItem?.translatedText ?? '' + : latestItem?.sourceText ?? '', + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w500, + color: isDarkMode ? Colors.white : Colors.black87, + height: 1.4, ), - ], + textAlign: TextAlign.center, + ), ), ), ), @@ -75,33 +120,31 @@ class FaceToFaceLayout extends StatelessWidget { Expanded( child: Container( width: double.infinity, - padding: EdgeInsets.all(24.w), + padding: EdgeInsets.fromLTRB(24.w, 24.w, 24.w, 24.w + 96.h), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground.withValues(alpha: 0.5) : Colors.green[50]?.withValues(alpha: 0.3), ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // 下半部的文本 - Text( - latestItem?.sourceLanguageCode == - controller.sourceLanguageCode.value - ? latestItem?.sourceText ?? - (controller.faceToFaceRecognitionText.value.isEmpty - ? '' - : controller.faceToFaceRecognitionText.value) - : latestItem?.translatedText ?? '', - style: TextStyle( - fontSize: 20.sp, - fontWeight: FontWeight.w500, - color: isDarkMode ? Colors.white : Colors.black87, - height: 1.4, - ), - textAlign: TextAlign.center, + child: SingleChildScrollView( + controller: _bottomScrollController, + physics: const BouncingScrollPhysics(), + child: Text( + latestItem?.sourceLanguageCode == + controller.sourceLanguageCode.value + ? latestItem?.sourceText ?? + (controller.faceToFaceRecognitionText.value.isEmpty + ? '' + : controller.faceToFaceRecognitionText.value) + : latestItem?.translatedText ?? '', + style: TextStyle( + fontSize: 20.sp, + fontWeight: FontWeight.w500, + color: isDarkMode ? Colors.white : Colors.black87, + height: 1.4, ), - ], + textAlign: TextAlign.center, + ), ), ), ), @@ -146,7 +189,7 @@ class FaceToFaceLayout extends StatelessWidget { borderRadius: BorderRadius.circular(16.r), ), child: Text( - '${controller.sourceLanguage.value.split(' ')[0]}'.tr, + '${widget.controller.sourceLanguage.value.split(' ')[0]}'.tr, style: TextStyle( fontSize: 15.sp, fontWeight: FontWeight.w600, @@ -161,7 +204,7 @@ class FaceToFaceLayout extends StatelessWidget { // 语言互换按钮 GestureDetector( - onTap: controller.swapLanguages, + onTap: widget.controller.swapLanguages, child: Container( margin: EdgeInsets.symmetric(horizontal: 8.w), padding: EdgeInsets.all(4.r), @@ -194,7 +237,8 @@ class FaceToFaceLayout extends StatelessWidget { child: Transform.rotate( angle: 3.14159, // 旋转180度 child: Text( - '${controller.targetLanguage.value.split(' ')[0]}'.tr, + '${widget.controller.targetLanguage.value.split(' ')[0]}' + .tr, style: TextStyle( fontSize: 15.sp, fontWeight: FontWeight.w600, From c612065ad1e71876734c88221c00d35133be52a0 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 13 Nov 2025 19:41:04 +0800 Subject: [PATCH 011/177] =?UTF-8?q?refactor(pairing):=20=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E6=8E=89=E5=88=9D=E5=A7=8B=E6=A3=80=E6=9F=A5=E7=9A=84=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 直接调用状态检查而不需要中间状态转换,简化流程 --- lib/modules/pairing/controllers/pairing_controller.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 44200e5fb..19d7714d2 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -512,7 +512,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { /// 开始初始检查 void _startInitialCheck() { - _transition(PairingState.checking); + // _transition(PairingState.checking); _checkCurrentStatus(); } From f4969ed613b4a698e12f41f9111a14181b7bc938 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 13 Nov 2025 21:22:11 +0800 Subject: [PATCH 012/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/controllers/agent_controller.dart | 5 + .../agent_service/AgentService.kt | 89 ++++++++++------ .../agent_service/BleMediaService.kt | 7 +- .../agent_service/lib/agent_service.dart | 5 + .../chat_api/ChatApiService.kt | 100 +++++++++++++++--- .../com/yunqiinnovation/chat_api/Utils.kt | 48 +-------- 6 files changed, 159 insertions(+), 95 deletions(-) diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index e18abbbc7..959115f54 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -1019,6 +1019,11 @@ class AgentController extends GetxController with WidgetsBindingObserver { // } } break; + case AgentServiceEventType.assistantUsages: + final sessionid = event.data['sessionid'] ?? ''; + final integral = event.data['integral'] ?? 0; + User.instance.aiIntegral = integral; + break; default: break; } diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 140a73b01..abda6adc4 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -205,7 +205,8 @@ object AgentService : CoroutineScope { serverurl = config["serverurl"]?.toString() ?: ""; usertoken = config["usertoken"]?.toString() ?: ""; callingTool = config["callingTool"]?.toString() ?: ""; - aiintegral = (config["aiintegral"] as? Number)?.toInt() ?: 0 + aiintegral = config["aiintegral"]?.toString()?.toIntOrNull() ?: 0; + // 初始化上下文和服务 this.context = appContext.applicationContext @@ -1007,7 +1008,6 @@ object AgentService : CoroutineScope { // 兜底处理,直接添加原消息 addToHistoryMessages(userMessage) } -// Log.e("ChatApiService", "liwei---------sendMessageStream messages:${messagesWithSystemPrompt}") chatApiService.sendMessageStream( sessionid, messagesWithSystemPrompt, @@ -1017,16 +1017,19 @@ object AgentService : CoroutineScope { sessionid: String, prompt_tokens: Int?, completion_tokens: Int?, - total_tokens: Int? + callfunctions: List? ) { try { - sendStatisticsEvent( - mapOf( - "CHAT_PROMPT_TOKENS" to (prompt_tokens ?: 0), - "CHAT_COMPLETION_TOKENS" to (completion_tokens ?: 0), - "CHAT_TOTAL_TOKENS" to (total_tokens ?: 0) - ) - ) + // 显式构造 Map,避免 mapOf 推断为 Map + val actions = mutableMapOf() + actions["AICHAT_PROMPT_TOKENS"] = (prompt_tokens ?: 0) + actions["AICHAT_COMPLETION_TOKENS"] = (completion_tokens ?: 0) + // 累计函数调用次数:按函数名分别累加 value += 1 + callfunctions?.forEach { funcName -> + val key = "AICHAT_FUNCTION_" + funcName + actions[key] = (actions[key] ?: 0) + 1 + } + sendStatisticsEvent(actions) }catch (e: Exception) { Log.e(TAG, "liwei--------------- AI Call onUsage 异常", e) } @@ -1035,12 +1038,10 @@ object AgentService : CoroutineScope { override fun onToken(sessionid: String, token: String) { try { if (sessionid != currsessionId) { -// Log.d(TAG, "liwei--------------- AI Call onToken 会话过期 $sessionid-------$currsessionId") - return + return } responseBuilder.append(token) -// Log.d(TAG, "liwei--------------- AI Call onToken:$token speakResponse:$speakResponse reply:$reply broadcast:$broadcast") - if (speakResponse && reply && broadcast && token.isNotEmpty()) { + if (speakResponse && reply && broadcast && token.isNotEmpty()) { ttsService?.speakStream(token) } if (reply && token.isNotEmpty()) { @@ -1308,26 +1309,18 @@ object AgentService : CoroutineScope { } language = languages[0] return try { - Log.i(TAG, "设置支持的语言: ${languages.joinToString(", ")}") - - - - val asrSuccess = azureAsrHelper?.initialize( + Log.i(TAG, "设置支持的语言: ${languages.joinToString(", ")}") + val asrSuccess = azureAsrHelper?.initialize( subscriptionKey = this.azureSpeechKey, region = this.azureSpeechRegion, supportedLanguages = languages.toTypedArray(), audioSourceType = audioSourceType ) ?: false - if (asrSuccess) { - - recognizeCallback() - + recognizeCallback() } else { Log.w(TAG, "Azure ASR初始化失败") } - - // 同时更新TTS语言设置 val ttsSuccess = updateTtsLanguage(languages.first()) // 使用第一个语言作为TTS语言 @@ -2549,16 +2542,18 @@ object AgentService : CoroutineScope { for ((key, value) in actions) { actionsObject.put(key, value) } - - jsonObject.put("actions", actionsObject) + + jsonObject.put("usagetype", 3) // 3 表示AICHAT + jsonObject.put("usages", actionsObject) val json = jsonObject.toString() + Log.d(TAG, "统计事件发送成功,请求: $json") val mediaType = "application/json".toMediaType() val body = json.toRequestBody(mediaType) // 构建请求 val request = Request.Builder() - .url("$serverurl/api/home/user_pushaction") + .url("$serverurl/api/home/user_usages") .addHeader("Authorization", usertoken) .addHeader("Content-Type", "application/json") .post(body) @@ -2573,8 +2568,42 @@ object AgentService : CoroutineScope { override fun onResponse(call: Call, response: Response) { response.use { + // 仅读取一次响应体,避免重复读取导致异常,同时统一后续处理使用 + val bodyStr = response.body?.string() ?: "" if (response.isSuccessful) { - Log.d(TAG, "统计事件发送成功") + Log.d(TAG, "统计事件发送成功,响应: $bodyStr") + try { + val json = JSONObject(bodyStr) + val code = json.optInt("code", -1) + val msg = json.optString("msg", "") + val dataObj = json.optJSONObject("data") + + // 解析 data.usages 为 Map + val dataMap = mutableMapOf() + val usagesObj = dataObj?.optJSONObject("usages") + if (usagesObj != null) { + val keys = usagesObj.keys() + while (keys.hasNext()) { + val k = keys.next() + dataMap[k] = usagesObj.optInt(k, 0) + } + for ((k, v) in dataMap) { + Log.d(TAG, "统计事件发送成功,响应: $k -> $v") + if(k == "3"){ //AI积分更新 + aiintegral = v + // 广播一个细化事件,便于前端单独处理 AI 积分更新 + sendEvent( + "assistant_usages", + mapOf( + "integral" to aiintegral + ) + ) + } + } + } + } catch (e: Exception) { + Log.w(TAG, "解析统计响应失败: ${e.message}") + } } else { Log.w(TAG, "统计事件发送失败,HTTP状态码: ${response.code}") } @@ -2619,4 +2648,4 @@ object AgentService : CoroutineScope { Log.e(TAG, "保存 _isInterrupt 缓存状态时发生异常: ${e.message}", e) } } -} \ No newline at end of file +} diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index f8cea9728..db9462134 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -70,6 +70,7 @@ class BleMediaService : Service(), CoroutineScope { private const val APP_NAVIGATION_MODE = "navigationMode" private const val APP_CALLING_TOOL = "callingTool" private const val KEY_AI_INTAGRAL = "aiintegral" + // 用于跟踪服务是否正在运行 private val isRunning = AtomicBoolean(false) @@ -663,11 +664,13 @@ private var companionManager: BleCompanionManager? = null private fun getConfigString(prefs: SharedPreferences, key: String, defaultValue: String): String { return prefs.getString(key, defaultValue) ?: defaultValue } - + + /** + * 从SharedPreferences获取字符串配置 + */ private fun getConfigInt(prefs: SharedPreferences, key: String, defaultValue: Int): Int { return prefs.getInt(key, defaultValue) } - override fun onBind(intent: Intent?): IBinder? = null override fun onDestroy() { diff --git a/local_plugins/agent_service/lib/agent_service.dart b/local_plugins/agent_service/lib/agent_service.dart index 689a17c6c..bf54a27b7 100644 --- a/local_plugins/agent_service/lib/agent_service.dart +++ b/local_plugins/agent_service/lib/agent_service.dart @@ -59,6 +59,9 @@ enum AgentServiceEventType { /// 函数调用结果 functionCallResult, + /// AI助手使用统计 + assistantUsages, + /// 图片处理中 imageProcessing, @@ -167,6 +170,8 @@ class AgentService { return AgentServiceEventType.functionCall; case 'function_call_result': return AgentServiceEventType.functionCallResult; + case 'assistant_usages': + return AgentServiceEventType.assistantUsages; case 'image_processing': return AgentServiceEventType.imageProcessing; case 'image_ready': diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt index e0374ae37..5c0e12951 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt @@ -38,7 +38,7 @@ interface StreamCallback { /** * AI使用量 * */ - fun onUsage(sessionid: String,prompt_tokens: Int?,completion_tokens: Int?,total_tokens: Int?) + fun onUsage(sessionid: String,prompt_tokens: Int?,completion_tokens: Int?,callfunctions: List?) /** * 接收到新的token */ @@ -106,6 +106,13 @@ private data class ToolCallInfo( } } +// 会话统计信息结构 +private data class SessionStats( + var promptTokens: Int = 0, + var completionTokens: Int = 0, + val calledFunctions: MutableList = mutableListOf() +) + /** * ChatAPI服务的Android实现 * 基于 openai-kotlin 4.0.1,与 iOS 版本接口完全一致 @@ -113,7 +120,7 @@ private data class ToolCallInfo( class ChatApiService(private val context: android.content.Context? = null) : CoroutineScope { override val coroutineContext: CoroutineContext = Dispatchers.IO + SupervisorJob() - + companion object { private const val TAG = "ChatApiService" } @@ -133,7 +140,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor // MCP 客户端 private var _mcpClient: MCPClient? = null - + // 公开的MCP客户端访问器 val mcpClient: MCPClient? get() = _mcpClient @@ -147,6 +154,8 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor private var currSessionId = "" // 为每个会话维护独立的回调函数 private val sessionCallbacks: MutableMap = Collections.synchronizedMap(mutableMapOf()) + // 会话统计信息 + private val sessionStats: MutableMap = Collections.synchronizedMap(mutableMapOf()) @@ -165,8 +174,17 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor // 1. 取消当前的协程任务 currentStreamJob?.cancel(CancellationException("New session started")) currentStreamJob = null - - // 2. 通知旧会话被中止 + if (oldSessionId != ""){ + val stats = sessionStats[oldSessionId] + getSessionCallback(oldSessionId)?.onUsage( + oldSessionId, + stats?.promptTokens, + stats?.completionTokens, + stats?.calledFunctions?.toList() + ) + sessionStats.remove(oldSessionId) + } + getSessionCallback(oldSessionId)?.onComplete(oldSessionId) // 直接完成当前会话 // 3. 清理状态 @@ -174,6 +192,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor sessionCallbacks.remove(oldSessionId) toolCalls.clear() + Log.d(TAG, "会话 $oldSessionId 已被中止") } } @@ -187,6 +206,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor sessionCallbacks.remove(oldSessionId) currentStreamJob = null toolCalls.clear() + sessionStats.remove(oldSessionId) } /** @@ -335,6 +355,8 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor // val newSessionId = UUID.randomUUID().toString() currSessionId = sessionid sessionCallbacks[sessionid] = callback + // 初始化会话统计 + sessionStats[sessionid] = SessionStats() // 3. 转换消息并开始处理 val messageList = convertJsonArrayToList(messages) @@ -414,7 +436,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor throw IllegalStateException("OpenAI客户端未初始化") } // Log.e("ChatApiService", "liwei---------,发送AI请求 model:${currentModel} messages:${chatMessages}") - // 添加超时控制,10秒超时 + // 添加超时控制,10秒超时 val flow = withTimeout(10.seconds) { openAI!!.chatCompletions(chatCompletionRequest) } @@ -496,7 +518,6 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor } toolCall.function?.let { function -> - // 安全处理函数名称 - 使用 try-catch 避免 null 属性访问 try { val functionName = function.name if (!functionName.isNullOrEmpty()) { @@ -532,9 +553,22 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor } } } - val promptTokens = estimatePromptTokens(chatMessages); //计算上传token - val completionTokens = roughTokenCount(replyContext); //计算上传token - getSessionCallback(sessionid)?.onUsage(sessionid,promptTokens,completionTokens,promptTokens+completionTokens) + + // 仅统计数据字节数,服务端负责计算token + val promptBytes = try { + val jsonArray = org.json.JSONArray() + messages.forEach { msg -> + jsonArray.put(convertMapToJsonObject(msg)) + } + jsonArray.toString().toByteArray(Charsets.UTF_8).size + } catch (_: Exception) { 0 } + val completionBytes = replyContext.toByteArray(Charsets.UTF_8).size + // 累计到会话统计 + sessionStats.getOrPut(sessionid) { SessionStats() }.apply { + this.promptTokens += promptBytes + this.completionTokens += completionBytes + } + // Log.d(TAG, "liwei-------------------------开始AI 对话 8") // 完成处理 if (sessionid == currSessionId) { @@ -543,12 +577,33 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor val hasToolCalls = processToolCalls(sessionid) if (!hasToolCalls) { try { + val stats = sessionStats[sessionid] + getSessionCallback(sessionid)?.onUsage( + sessionid, + stats?.promptTokens, + stats?.completionTokens, + stats?.calledFunctions?.toList() + ) getSessionCallback(sessionid)?.onComplete(sessionid) } catch (e: Exception) { Log.e(TAG, "onComplete回调异常: ${e.message}", e) } clearCurrentSession() } + }else{ + // 会话结束,上报使用统计,再回调完成 + try { + val stats = sessionStats[sessionid] + getSessionCallback(sessionid)?.onUsage( + sessionid, + stats?.promptTokens, + stats?.completionTokens, + stats?.calledFunctions?.toList() + ) + getSessionCallback(sessionid)?.onComplete(sessionid) + } catch (e: Exception) { + Log.e(TAG, "onUsage回调异常: ${e.message}", e) + } } // Log.d(TAG, "liwei-------------------------开始AI 对话 10") } catch (e: CancellationException) { @@ -557,6 +612,13 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor } catch (e: Exception) { if (sessionid == currSessionId) { try { + val stats = sessionStats[sessionid] + getSessionCallback(sessionid)?.onUsage( + sessionid, + stats?.promptTokens, + stats?.completionTokens, + stats?.calledFunctions?.toList() + ) Log.d(TAG, "AI聊天异常 Session $sessionid 错误类型:${e::class.simpleName} 错误完整类型:${e::class.qualifiedName}") getSessionCallback(sessionid)?.onError(sessionid,1000,"流式请求失败: ${e.message}") } catch (ex: Exception) { @@ -586,7 +648,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor // 只处理有效的工具调用 val validToolCalls = toolCalls.values.filter { it.isValid() } - if (validToolCalls.isEmpty()) { + if (validToolCalls.isEmpty()) { Log.w("ChatApiService", "[Session: $sessionid] 没有有效的工具调用(参数可能不完整)") return false } @@ -601,6 +663,12 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor "id" to firstToolCall.id ) + // 记录方法名称以返回给调用方 + val functionName: String = firstToolCall.name + if (functionName.isNotEmpty()) { + sessionStats.getOrPut(sessionid) { SessionStats() }.calledFunctions.add(functionName) + } + // 通知上层工具调用事件 try { getSessionCallback(sessionid)?.onFunctionCall(sessionid,convertMapToJsonObject(functionCall)) @@ -609,7 +677,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor } // 在当前协程作用域内处理工具调用,使用async确保生命周期管理 - val toolCallDeferred = async { + val toolCallDeferred = async { try { // 检查会话是否仍然有效 if (sessionid != currSessionId) { @@ -750,7 +818,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor // 不重新抛出异常,让流程正常结束 } - return true + return true } /** @@ -983,7 +1051,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor * 关闭MCP客户端 */ fun closeMcpClient() { - runBlocking { + runBlocking { _mcpClient?.disconnectAll() _mcpClient = null } @@ -1230,7 +1298,7 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor ChatMessage.System(displayText) } Role.User -> ChatMessage.User(contentParts) - Role.Assistant -> { + Role.Assistant -> { // 将多模态内容转换为ListContent val listContent = ListContent(contentParts) // 提取文本内容作为Assistant消息的content @@ -1468,4 +1536,4 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor return "Function '$functionName' called with arguments: $arguments" } } -} \ No newline at end of file +} diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/Utils.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/Utils.kt index d303ae3b4..49e3b8408 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/Utils.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/Utils.kt @@ -8,9 +8,6 @@ import android.net.Uri import android.provider.Settings import android.util.Log import androidx.core.content.ContextCompat -import com.aallam.openai.api.chat.ChatMessage -import com.aallam.openai.api.chat.TextContent -import com.aallam.openai.api.chat.ListContent import io.ktor.client.* import io.ktor.client.engine.okhttp.* import io.ktor.client.plugins.sse.* @@ -166,47 +163,4 @@ fun roughTokenCount(text: String): Int { val englishCharCount = trimmed.length - chineseCharCount return chineseCharCount + (englishCharCount / 4) + 1 -} - - -/** - * 估算消息列表的总 token 数量(近似) - * @param messages List of message map: role: user/assistant, content: string or array - * @return 估算 token 数 - */ -fun estimatePromptTokens(messages: List): Int { - var totalText = "" - for (message in messages) { - when (val content = message.messageContent) { - is TextContent? -> { - totalText += content?.content + " " - } - is ListContent -> { - // 处理多模态内容数组 - content.content.forEach { item -> - if (item is Map<*, *>) { - val type = item["type"] as? String - if (type == "text") { - val text = item["text"] as? String ?: "" - totalText += text + " " - }else if(type == "image_url"){ - val text = item["image_url"] as? String ?: "" - totalText += text + " " - } - } - } - } - } - } - return roughTokenCount(totalText) -} -//fun estimatePromptTokens(messages: List): Int { -// var tokens = 0 -// for (msg in messages) { -// tokens += 4 // 每条消息结构开销 -// tokens += roughTokenCount(msg.role.role.lowercase()) // ChatRole 枚举转小写字符串 -// tokens += roughTokenCount(msg.content ?: "") -// } -// tokens += 2 // 结尾 assistant 回复结构开销 -// return tokens -//} \ No newline at end of file +} \ No newline at end of file From e4293cf8af1a8135972ad534643874eb19028264 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 13 Nov 2025 21:22:25 +0800 Subject: [PATCH 013/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=94=A8=E9=87=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/models/user_Info.dart | 75 ++++++++++--------- .../agent/controllers/agent_controller.dart | 6 +- lib/modules/agent/views/agent_view.dart | 17 +++-- lib/modules/goods/views/goodsai_view.dart | 4 +- lib/modules/goods/views/goodsmeet_view.dart | 4 +- lib/modules/goods/views/goodstrade_view.dart | 4 +- 6 files changed, 58 insertions(+), 52 deletions(-) diff --git a/lib/data/models/user_Info.dart b/lib/data/models/user_Info.dart index 719bbfa07..861d1604a 100644 --- a/lib/data/models/user_Info.dart +++ b/lib/data/models/user_Info.dart @@ -46,12 +46,13 @@ class User { String password; int viplv = 0; //添加会员等级字段,0表示普通用户 int viptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) - int tradetotaltime = 0; // 翻译总时长 - int meettotaltime = 0; // 会议总时长 - int aichattotaltimer = 0; // 智能体总次数(兼容 aichattotaltime/aichattotaltimer) - int tradetime = 0; // 翻译剩余时长 - int meettime = 0; // 会议剩余时长 - int aichattimer = 0; // 智能体剩余次数 + int aichatintegral = 0; // ai聊天积分 + int aichattotalintegral = 0; // ai聊天总积分 + int tradeintegral = 0; // 翻译积分 + int tradetotalintegral = 0; // 翻译总积分 + int meetintegral = 0; // 会议积分 + int meettotalintegral = 0; // 会议总积分 + List devices; // 私有构造函数 @@ -67,12 +68,12 @@ class User { required this.password, required this.viplv, required this.viptime, - required this.aichattotaltimer, - required this.meettotaltime, - required this.tradetotaltime, - required this.aichattimer, - required this.meettime, - required this.tradetime, + required this.aichatintegral, + required this.aichattotalintegral, + required this.tradeintegral, + required this.tradetotalintegral, + required this.meetintegral, + required this.meettotalintegral, required this.devices, }); @@ -97,12 +98,12 @@ class User { viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 - aichattotaltimer: (userData?['aichattotaltimer'] as int?) ?? 0, - meettotaltime: (userData?['meettotaltime'] as int?) ?? 0, - tradetotaltime: (userData?['tradetotaltime'] as int?) ?? 0, - aichattimer: (userData?['aichattimer'] as int?) ?? 0, - meettime: (userData?['meettime'] as int?) ?? 0, - tradetime: (userData?['tradetime'] as int?) ?? 0, + aichatintegral: (userData?['aichatintegral'] as int?) ?? 0, + aichattotalintegral: (userData?['aichattotalintegral'] as int?) ?? 0, + tradeintegral: (userData?['tradeintegral'] as int?) ?? 0, + tradetotalintegral: (userData?['tradetotalintegral'] as int?) ?? 0, + meetintegral: (userData?['meetintegral'] as int?) ?? 0, + meettotalintegral: (userData?['meettotalintegral'] as int?) ?? 0, devices: devicesData ?.map((e) => UserDevice.fromJson(e as Map)) @@ -130,12 +131,12 @@ class User { password: (userData?['password'] as String?) ?? '', viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 - aichattotaltimer: (userData?['aichattotaltimer'] as int?) ?? 0, - meettotaltime: (userData?['meettotaltime'] as int?) ?? 0, - tradetotaltime: (userData?['tradetotaltime'] as int?) ?? 0, - aichattimer: (userData?['aichattimer'] as int?) ?? 0, - meettime: (userData?['meettime'] as int?) ?? 0, - tradetime: (userData?['tradetime'] as int?) ?? 0, + aichatintegral: (userData?['aichatintegral'] as int?) ?? 0, + aichattotalintegral: (userData?['aichattotalintegral'] as int?) ?? 0, + tradeintegral: (userData?['tradeintegral'] as int?) ?? 0, + tradetotalintegral: (userData?['tradetotalintegral'] as int?) ?? 0, + meetintegral: (userData?['meetintegral'] as int?) ?? 0, + meettotalintegral: (userData?['meettotalintegral'] as int?) ?? 0, devices: devicesData != null ? (devicesData) .map((e) => UserDevice.fromJson(e as Map)) @@ -156,12 +157,14 @@ class User { password = user['password'] as String? ?? password; viplv = user['viplv'] as int? ?? viplv; viptime = user['viptime'] as int? ?? viptime; - tradetotaltime = user['tradetotaltime'] as int? ?? tradetotaltime; - meettotaltime = user['meettotaltime'] as int? ?? meettotaltime; - aichattotaltimer = user['aichattotaltimer'] as int? ?? aichattotaltimer; - tradetime = user['tradetime'] as int? ?? tradetime; - meettime = user['meettime'] as int? ?? meettime; - aichattimer = user['aichattimer'] as int? ?? aichattimer; + aichatintegral = user['aichatintegral'] as int? ?? aichatintegral; + aichattotalintegral = + user['aichattotalintegral'] as int? ?? aichattotalintegral; + tradeintegral = user['tradeintegral'] as int? ?? tradeintegral; + tradetotalintegral = + user['tradetotalintegral'] as int? ?? tradetotalintegral; + meetintegral = user['meetintegral'] as int? ?? meetintegral; + meettotalintegral = user['meettotalintegral'] as int? ?? meettotalintegral; // 触发全局刷新信号,驱动依赖UI重建 refreshTick.value++; @@ -181,12 +184,12 @@ class User { 'password': password, 'viplv': viplv, 'viptime': viptime, - 'tradetotaltime': tradetotaltime, - 'meettotaltime': meettotaltime, - 'aichattotaltimer': aichattotaltimer, - 'tradetime': tradetime, - 'meettime': meettime, - 'aichattimer': aichattimer, + 'aichatintegral': aichatintegral, + 'aichattotalintegral': aichattotalintegral, + 'tradeintegral': tradeintegral, + 'tradetotalintegral': tradetotalintegral, + 'meetintegral': meetintegral, + 'meettotalintegral': meettotalintegral, 'devices': devices.map((device) => device.toJson()).toList(), }, }; diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 959115f54..a1fe419fd 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -45,7 +45,7 @@ class AgentController extends GetxController with WidgetsBindingObserver { // 聊天消息列表 final messages = [].obs; final currsessionid = ''.obs; - + final aichatintegral = 0.obs; // UI控制器 final TextEditingController textController = TextEditingController(); final ScrollController scrollController = ScrollController(); @@ -165,6 +165,7 @@ class AgentController extends GetxController with WidgetsBindingObserver { @override void onInit() { super.onInit(); + aichatintegral.value = User.isLoggedIn() ? User.instance.aichatintegral : 0; _initAppDir(); _loadTtsPreference(); //加载TTS偏好设置 _loadTtsInterrupe(); //加载TTS播报打断偏好设置 @@ -1022,7 +1023,8 @@ class AgentController extends GetxController with WidgetsBindingObserver { case AgentServiceEventType.assistantUsages: final sessionid = event.data['sessionid'] ?? ''; final integral = event.data['integral'] ?? 0; - User.instance.aiIntegral = integral; + User.instance.aichatintegral = integral; + aichatintegral.value = integral; break; default: break; diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index 5aabbb9b1..b7484a4bc 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -6,6 +6,7 @@ import 'package:flutter_intro/flutter_intro.dart'; import 'package:get/get.dart'; import 'package:haptic_feedback/haptic_feedback.dart'; import '../../../core/widgets/intro_overlay_builder.dart'; +import '../../../data/models/user_Info.dart'; import '../controllers/agent_controller.dart'; import '../controllers/message_action_controller.dart'; import 'message_bubble.dart'; @@ -118,14 +119,14 @@ class _AgentViewState extends State with WidgetsBindingObserver { ), ), SizedBox(width: 4.w), - Text( - 'online'.tr, - style: TextStyle( - fontSize: 12.sp, - color: Colors.green, - fontWeight: FontWeight.w500, - ), - ), + Obx(() => Text( + '剩余积分: ${controller.aichatintegral.value}', + style: TextStyle( + fontSize: 12.sp, + color: Colors.green, + fontWeight: FontWeight.w500, + ), + )), ], ), ], diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index 913efb2ae..c53c9442c 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -141,8 +141,8 @@ class GoodsaiView extends GetView { int remainAi = 0; if (User.isLoggedIn()) { final u = User.instance; - totalAi = u.aichattotaltimer; - remainAi = u.aichattimer; + totalAi = u.aichattotalintegral; + remainAi = u.aichatintegral; } // 进度显示为“剩余额度比例”,remain/total: final progress = (totalAi > 0) ? (remainAi / totalAi).clamp(0.0, 1.0) : 0.0; diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index ff00908e0..2bedfd040 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -135,8 +135,8 @@ class GoodsmeetView extends GetView { int remainAi = 0; if (User.isLoggedIn()) { final u = User.instance; - totalAi = u.meettotaltime; - remainAi = u.meettime; + totalAi = u.meettotalintegral; + remainAi = u.meetintegral; } final progress = (totalAi > 0) ? (remainAi / totalAi).clamp(0.0, 1.0) : 0.0; diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart index a2025f7be..e501aecaa 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -135,8 +135,8 @@ class GoodstradeView extends GetView { int remainAi = 0; if (User.isLoggedIn()) { final u = User.instance; - totalAi = u.tradetotaltime; - remainAi = u.tradetime; + totalAi = u.tradetotalintegral; + remainAi = u.tradeintegral; } final progress = (totalAi > 0) ? (remainAi / totalAi).clamp(0.0, 1.0) : 0.0; From 594f657b9f5234dba858e83e8305d7c34864b546 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Fri, 14 Nov 2025 14:24:03 +0800 Subject: [PATCH 014/177] =?UTF-8?q?=E7=A7=AF=E5=88=86=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/en_us.dart | 2 + lib/core/translations/language/zh_cn.dart | 3 + lib/data/services/ble_manager.dart | 3 +- .../agent/controllers/agent_controller.dart | 64 ++++++++++++++++++- .../agent_service/AgentService.kt | 16 +++-- .../agent_service/AgentServicePlugin.kt | 4 +- .../agent_service/BleMediaService.kt | 15 +++-- .../agent_service/AgentServiceImpl.swift | 16 +++-- .../chat_api/ChatApiService.kt | 9 +-- 9 files changed, 109 insertions(+), 23 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index d01651e54..a19fc113a 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -1216,4 +1216,6 @@ const Map enUS = { "justNow": "Just now", "minutesAgo": "@minutes minutes ago", "yesterday": "Yesterday", + //补充 + "insufficientIntegral": "Insufficient integral", }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 74d2c9999..5fb101114 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -1115,4 +1115,7 @@ const Map zhCN = { "justNow": "刚刚", "minutesAgo": "@minutes分钟前", "yesterday": "昨天", + + //补充 + "insufficientIntegral": "积分不足", }; diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 9b4a2cd56..aecf624c9 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -777,7 +777,8 @@ class BleManager extends GetxService { "navigationMode": navigationMode, "isttsinterrupt": isTtsInterruptEnabled ? "true" : "false", "aiintegral": 100, //ai积分 - "callingTool": "callingTool".tr + "callingToolText": "callingTool".tr, + "insufficientIntegralText": "insufficientIntegral".tr, }; // 记录日志(不记录敏感信息) diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index a1fe419fd..39662c1b5 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -13,6 +13,7 @@ import 'package:voitrans/data/services/bluetooth_manager.dart'; import 'package:voitrans/data/services/qq_music.dart'; import 'package:flutter_intro/flutter_intro.dart'; import '../../../data/services/novice_guide_service.dart'; +import '../../../routes/app_routes.dart'; import '/core/utils/upload_oss.dart'; import '/data/models/user_Info.dart'; import '/data/services/music_manager.dart'; @@ -782,9 +783,9 @@ class AgentController extends GetxController with WidgetsBindingObserver { case AgentServiceEventType.error: final sessionid = event.data['sessionid'] ?? ''; final message = event.data['message'] ?? ''; - + final code = event.data['code'] ?? 0; // //验证错误码 - if (event.data['code'] == 1000) { + if (code == 1000) { isListening.value = false; isSpeaking.value = false; isProcessing.value = false; @@ -798,6 +799,65 @@ class AgentController extends GetxController with WidgetsBindingObserver { } } Get.snackbar('error'.tr, '${event.data['message']}'); + } else if (code == 2001) { + // 余额不足或需要充值,给出弹窗确认是否跳转充值界面 + final msg = '${event.data['message'] ?? '余额不足,请前往充值'}'; + Get.snackbar('error'.tr, msg); + Get.dialog( + Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(16, 20, 16, 16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + '提示', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + '$msg\n是否前往充值界面?', + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.orangeAccent, + foregroundColor: Colors.white, + ), + onPressed: () { + Get.back(); + Get.toNamed(Routes.goodsai); + }, + child: const Text('去充值'), + ), + ), + ], + ), + ), + Positioned( + right: 8, + top: 8, + child: IconButton( + icon: const Icon(Icons.close), + onPressed: () => Get.back(), + ), + ), + ], + ), + ), + barrierDismissible: true, + ); } Logger.e(TAG, '代理服务错误: ${event.data['message']}'); break; diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index abda6adc4..709208fb7 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -97,7 +97,8 @@ object AgentService : CoroutineScope { // 会话ID,用于区分不同聊天上下文 private val agentId = "default_agent" //工具调用提示 - private var callingTool = "" + private var callingToolText = "" + private var insufficientIntegralText = "" // 积分不足提示 // 服务端连接 private var serverurl = "" private var usertoken = "" @@ -204,7 +205,8 @@ object AgentService : CoroutineScope { try { serverurl = config["serverurl"]?.toString() ?: ""; usertoken = config["usertoken"]?.toString() ?: ""; - callingTool = config["callingTool"]?.toString() ?: ""; + callingToolText = config["callingToolText"]?.toString() ?: ""; + insufficientIntegralText = config["insufficientIntegralText"]?.toString() ?: ""; aiintegral = config["aiintegral"]?.toString()?.toIntOrNull() ?: 0; // 初始化上下文和服务 @@ -932,6 +934,7 @@ object AgentService : CoroutineScope { hasImage: Boolean = false, imagePath: String? = null ) { + // 如果有正在进行的AI流式输出,先停止它 audioPlayer?.stopAudio() stopAiStream() @@ -1010,6 +1013,7 @@ object AgentService : CoroutineScope { } chatApiService.sendMessageStream( sessionid, + aiintegral, messagesWithSystemPrompt, object : StreamCallback { @@ -1110,6 +1114,10 @@ object AgentService : CoroutineScope { "message" to message ) ) + if(code == 2001){ + ttsService?.speakStream(insufficientIntegralText); + } + //育婴提示 // 标记AI流式输出已完成 _isAiStreaming.set(false) currentAiJob = null @@ -1137,9 +1145,9 @@ object AgentService : CoroutineScope { }else if (name == "qqmusic_pause" || name == "music_pause"){ isplaymusic = false } - Log.d(TAG, "liwei--------------- AI Call onFunctionCall iscallingTool:$iscallingTool callingTool:$callingTool") + Log.d(TAG, "liwei--------------- AI Call onFunctionCall iscallingTool:$iscallingTool callingToolText:$callingToolText") if (iscallingTool) { - ttsService?.speakStream(callingTool) + ttsService?.speakStream(callingToolText) iscallingTool = false } } catch (e: Exception) { diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index 39edf4c8d..5c0457fdc 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -78,7 +78,9 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream config["musicServiceType"]?.toString()?.let { intent.putExtra("musicServiceType", it) } config["navigationMode"]?.toString()?.let { intent.putExtra("navigationMode", it) } config["isttsinterrupt"]?.toString()?.let { intent.putExtra("isttsinterrupt", it) } - config["callingTool"]?.toString()?.let { intent.putExtra("callingTool", it) } + config["callingToolText"]?.toString()?.let { intent.putExtra("callingToolText", it) } + config["insufficientIntegralText"]?.toString()?.let { intent.putExtra("insufficientIntegralText", it) } + config["aiintegral"]?.toString()?.let { intent.putExtra("aiintegral", it) } // 添加 supportedLanguages 参数处理 diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index db9462134..219ba870b 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -68,8 +68,9 @@ class BleMediaService : Service(), CoroutineScope { private const val KEY_SUPPORTED_LANGUAGES = "supportedLanguages" private const val KEY_MUSICSERVICE_TYPE = "musicServiceType" private const val APP_NAVIGATION_MODE = "navigationMode" - private const val APP_CALLING_TOOL = "callingTool" - private const val KEY_AI_INTAGRAL = "aiintegral" + private const val APP_CALLING_TOOL_TEXT = "callingToolText" // 工具调用提示 + private const val APP_INSUFFICIENT_INTEGRAL_TEXT = "insufficientIntegralText" // 积分不足提示 + private const val KEY_AI_INTEGRAL = "aiIntegral" // 积分不足提示 // 用于跟踪服务是否正在运行 private val isRunning = AtomicBoolean(false) @@ -579,8 +580,9 @@ private var companionManager: BleCompanionManager? = null it.getStringExtra(KEY_USER_TOKEN)?.let { value -> config[KEY_USER_TOKEN] = value } it.getStringExtra(KEY_MUSICSERVICE_TYPE)?.let { value -> config[KEY_MUSICSERVICE_TYPE] = value } it.getStringExtra(APP_NAVIGATION_MODE)?.let { value -> config[APP_NAVIGATION_MODE] = value } - it.getStringExtra(APP_CALLING_TOOL)?.let { value -> config[APP_CALLING_TOOL] = value } - it.getStringExtra(KEY_AI_INTAGRAL)?.let { value -> config[KEY_AI_INTAGRAL] = value } + it.getStringExtra(APP_CALLING_TOOL_TEXT)?.let { value -> config[APP_CALLING_TOOL_TEXT] = value } + it.getStringExtra(APP_INSUFFICIENT_INTEGRAL_TEXT)?.let { value -> config[APP_INSUFFICIENT_INTEGRAL_TEXT] = value } + it.getIntExtra(KEY_AI_INTEGRAL, config[KEY_AI_INTEGRAL] as? Int ?: 0) it.getStringExtra("isttsinterrupt")?.let { value -> config["isttsinterrupt"] = value } // 提取 supportedLanguages 参数 @@ -643,8 +645,9 @@ private var companionManager: BleCompanionManager? = null config[KEY_USER_TOKEN] = getConfigString(prefs, KEY_USER_TOKEN, "") config[KEY_MUSICSERVICE_TYPE] = getConfigString(prefs, KEY_MUSICSERVICE_TYPE, "") config[APP_NAVIGATION_MODE] = getConfigString(prefs, APP_NAVIGATION_MODE, "") - config[APP_CALLING_TOOL] = getConfigString(prefs, APP_CALLING_TOOL, "") - config[KEY_AI_INTAGRAL] = getConfigInt(prefs, KEY_AI_INTAGRAL, 0) + config[APP_CALLING_TOOL_TEXT] = getConfigString(prefs, APP_CALLING_TOOL_TEXT, "") + config[APP_INSUFFICIENT_INTEGRAL_TEXT] = getConfigString(prefs, APP_INSUFFICIENT_INTEGRAL_TEXT, "") + config[KEY_AI_INTEGRAL] = getConfigInt(prefs, KEY_AI_INTEGRAL, 0) // 添加 supportedLanguages 参数处理 val supportedLanguagesStr = getConfigString(prefs, KEY_SUPPORTED_LANGUAGES, "") diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index d07c9b2b0..30308b0c3 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -65,7 +65,9 @@ class AgentServiceImpl: NSObject { // 会话ID,用于区分不同聊天上下文 private let agentId = "default_agent" //工具调用提示 - public var callingTool = "" + public var callingToolText = "" // 工具调用提示 + public var insufficientIntegralText = "" // 积分不足提示 + private var navigationMode = "" private var isInitialized: Bool = false @@ -178,8 +180,12 @@ class AgentServiceImpl: NSObject { self.navigationMode = navigationMode } - if let callingTool = config["callingTool"] as? String { - self.callingTool = callingTool + if let callingToolText = config["callingToolText"] as? String { + self.callingToolText = callingToolText + } + + if let insufficientIntegralText = config["insufficientIntegralText"] as? String { + self.insufficientIntegralText = insufficientIntegralText } //加载 isInterrupt 状态 @@ -1807,8 +1813,8 @@ class ChatApiStreamCallback: StreamCallback { ]) if (iscallingTool) { - os_log("收到函数调用: callingTool:%{public}@", log: agentService.logger, type: .info, agentService.callingTool) - agentService.azureTtsHelper?.speakStream(sessionid: sessionid,agentService.callingTool) + os_log("收到函数调用: callingToolText:%{public}@", log: agentService.logger, type: .info, agentService.callingToolText) + agentService.azureTtsHelper?.speakStream(sessionid: sessionid,agentService.callingToolText) iscallingTool = false } diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt index 5c0e12951..bced9835b 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt @@ -347,12 +347,13 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor /** * 发送消息(流式输出)- 兼容JSONArray格式 */ - fun sendMessageStream(sessionid: String,messages: org.json.JSONArray, callback: StreamCallback) { + fun sendMessageStream(sessionid: String,integral: Int, messages: org.json.JSONArray, callback: StreamCallback) { // 1. 立即中止旧会话 abortCurrentSession() - - // 2. 创建新会话 -// val newSessionId = UUID.randomUUID().toString() + if (integral <= 0) { + callback.onError(sessionid,2001,"积分不足") + return + } currSessionId = sessionid sessionCallbacks[sessionid] = callback // 初始化会话统计 From 2cfed2716660afb801664740d2c3deed73daa5ff Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Fri, 14 Nov 2025 16:38:36 +0800 Subject: [PATCH 015/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/models/channel_app_model.dart | 5 + lib/data/models/channel_app_model.g.dart | 2 + .../controllers/goods_base_controller.dart | 256 ++++++++++++------ 3 files changed, 176 insertions(+), 87 deletions(-) diff --git a/lib/data/models/channel_app_model.dart b/lib/data/models/channel_app_model.dart index dac792f28..269dd9f5b 100644 --- a/lib/data/models/channel_app_model.dart +++ b/lib/data/models/channel_app_model.dart @@ -69,12 +69,17 @@ class AppInfo { @JsonKey(name: 'tourists') final bool tourists; + /// 支付渠道列表 + @JsonKey(name: 'Paychannels') + final String? paychannels; + const AppInfo({ this.address, required this.channel, required this.description, required this.version, this.tourists = false, + required this.paychannels, }); factory AppInfo.fromJson(Map json) => diff --git a/lib/data/models/channel_app_model.g.dart b/lib/data/models/channel_app_model.g.dart index 952f3fc41..fa2bd07e5 100644 --- a/lib/data/models/channel_app_model.g.dart +++ b/lib/data/models/channel_app_model.g.dart @@ -38,6 +38,7 @@ AppInfo _$AppInfoFromJson(Map json) => AppInfo( description: json['description'] as String, version: json['version'] as String, tourists: json['tourists'] as bool? ?? false, + paychannels: json['paychannels'] as String?, ); Map _$AppInfoToJson(AppInfo instance) => { @@ -46,4 +47,5 @@ Map _$AppInfoToJson(AppInfo instance) => { 'description': instance.description, 'version': instance.version, 'tourists': instance.tourists, + 'paychannels': instance.paychannels, }; diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 79370527a..f2a0aec77 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:voitrans/data/models/user_Info.dart'; import '../../../routes/app_routes.dart'; import '../../../data/services/pay_service.dart'; +import '../../../data/services/version_update_service.dart'; import '../../../data/models/goods.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../../../data/services/network/dio_manager.dart'; @@ -39,10 +40,20 @@ abstract class GoodsBaseController extends GetxController { /// 子类实现:返回商品列表(统一使用 DBGoods) Future> fetchProducts(); - /// 统一入口:不指定支付方式时,跳转到支付页面交由用户选择 + /// 统一入口:根据后端配置决定是否弹出支付方式选择面板 Future purchase(DBGoods item) async { - final method = await _showPayMethodSheet(); - if (method == null) return; + // 读取渠道配置 + final enabled = _getEnabledPayMethods(); + + // 无配置或多个渠道:弹出选择面板 + _PayMethod? method; + if (enabled.length != 1) { + method = await _showPayMethodSheet(enabled); + if (method == null) return; + } else { + // 仅一个渠道:直接走对应支付 + method = enabled.first; + } bool ok = false; String failMsg = '支付失败,请重试'; @@ -75,8 +86,73 @@ abstract class GoodsBaseController extends GetxController { } } - /// 底部弹窗:选择支付方式 - Future<_PayMethod?> _showPayMethodSheet() async { + /// 解析后端 paychannels 并结合平台过滤可用支付方式 + List<_PayMethod> _getEnabledPayMethods() { + try { + final paychannels = + VersionUpdateService.to.cachedAppInfo?.paychannels ?? ''; + final raw = paychannels + .split(',') + .map((e) => e.trim().toLowerCase()) + .where((e) => e.isNotEmpty) + .toList(); + + final bool isIOS = GetPlatform.isIOS && !kIsWeb; + final bool isAndroid = GetPlatform.isAndroid && !kIsWeb; + + final List<_PayMethod> methods = []; + for (final ch in raw) { + switch (ch) { + case 'wxpay': + case 'wechat': + methods.add(_PayMethod.wechat); + break; + case 'alipay': + methods.add(_PayMethod.alipay); + break; + case 'paypal': + methods.add(_PayMethod.paypal); + break; + case 'apple': + if (isIOS) methods.add(_PayMethod.apple); + break; + case 'google': + if (isAndroid) methods.add(_PayMethod.google); + break; + default: + break; + } + } + + // 若后端未下发或全部被平台过滤,则回退为展示所有平台支持的方式 + if (methods.isEmpty) { + final fallback = <_PayMethod>[ + _PayMethod.wechat, + _PayMethod.alipay, + _PayMethod.paypal + ]; + if (isIOS) fallback.add(_PayMethod.apple); + if (isAndroid) fallback.add(_PayMethod.google); + return fallback; + } + return methods; + } catch (_) { + // 任意异常则回退为旧逻辑:展示所有 + final bool isIOS = GetPlatform.isIOS && !kIsWeb; + final bool isAndroid = GetPlatform.isAndroid && !kIsWeb; + final fallback = <_PayMethod>[ + _PayMethod.wechat, + _PayMethod.alipay, + _PayMethod.paypal + ]; + if (isIOS) fallback.add(_PayMethod.apple); + if (isAndroid) fallback.add(_PayMethod.google); + return fallback; + } + } + + /// 底部弹窗:选择支付方式(仅展示后端允许的渠道) + Future<_PayMethod?> _showPayMethodSheet(List<_PayMethod> allowed) async { final context = Get.context; final isDark = context != null && Theme.of(context).brightness == Brightness.dark; @@ -121,105 +197,111 @@ abstract class GoodsBaseController extends GetxController { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - GestureDetector( - onTap: () => Get.back(result: _PayMethod.wechat), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 56, - height: 56, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: - isDark ? Colors.white10 : Colors.black12, - border: Border.all( + if (allowed.contains(_PayMethod.wechat)) + GestureDetector( + onTap: () => Get.back(result: _PayMethod.wechat), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, color: isDark - ? Colors.white24 + ? Colors.white10 : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), ), + child: Icon(Icons.wechat, + color: Colors.green[600]), ), - child: Icon(Icons.wechat, - color: Colors.green[600]), - ), - const SizedBox(height: 8), - Text( - '微信支付', - style: TextStyle( - fontSize: 13, - color: isDark ? Colors.white : Colors.black, + const SizedBox(height: 8), + Text( + '微信支付', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), ), - ), - ], + ], + ), ), - ), - GestureDetector( - onTap: () => Get.back(result: _PayMethod.alipay), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 56, - height: 56, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: - isDark ? Colors.white10 : Colors.black12, - border: Border.all( + if (allowed.contains(_PayMethod.alipay)) + GestureDetector( + onTap: () => Get.back(result: _PayMethod.alipay), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, color: isDark - ? Colors.white24 + ? Colors.white10 : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), ), + child: Icon(Icons.payment, + color: Colors.blue[600]), ), - child: Icon(Icons.payment, - color: Colors.blue[600]), - ), - const SizedBox(height: 8), - Text( - '支付宝', - style: TextStyle( - fontSize: 13, - color: isDark ? Colors.white : Colors.black, + const SizedBox(height: 8), + Text( + '支付宝', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), ), - ), - ], + ], + ), ), - ), - GestureDetector( - onTap: () => Get.back(result: _PayMethod.paypal), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 56, - height: 56, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: - isDark ? Colors.white10 : Colors.black12, - border: Border.all( + if (allowed.contains(_PayMethod.paypal)) + GestureDetector( + onTap: () => Get.back(result: _PayMethod.paypal), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, color: isDark - ? Colors.white24 + ? Colors.white10 : Colors.black12, + border: Border.all( + color: isDark + ? Colors.white24 + : Colors.black12, + ), + ), + child: Icon( + Icons.account_balance_wallet, + color: Colors.indigo[600], ), ), - child: Icon( - Icons.account_balance_wallet, - color: Colors.indigo[600], - ), - ), - const SizedBox(height: 8), - Text( - 'PayPal', - style: TextStyle( - fontSize: 13, - color: isDark ? Colors.white : Colors.black, + const SizedBox(height: 8), + Text( + 'PayPal', + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white : Colors.black, + ), ), - ), - ], + ], + ), ), - ), - if (isIOS) + if (isIOS && allowed.contains(_PayMethod.apple)) GestureDetector( onTap: () => Get.back(result: _PayMethod.apple), child: Column( @@ -255,7 +337,7 @@ abstract class GoodsBaseController extends GetxController { ], ), ), - if (isAndroid) + if (isAndroid && allowed.contains(_PayMethod.google)) GestureDetector( onTap: () => Get.back(result: _PayMethod.google), child: Column( From 77bea390314deea48df8628c5175da40b5b4b3a1 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 14 Nov 2025 16:59:43 +0800 Subject: [PATCH 016/177] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改多个文件中的导入语句,将绝对路径改为相对路径,提高代码的可维护性和可移植性 --- lib/data/services/ble_manager.dart | 2 +- lib/data/services/pay_service.dart | 4 ++-- lib/modules/agent/controllers/agent_controller.dart | 12 ++++++------ lib/modules/qqmusic/views/qqmusic_playlist_view.dart | 6 +++--- lib/routes/app_pages.dart | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index aecf624c9..94cca3036 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -8,7 +8,7 @@ import 'package:get_storage/get_storage.dart'; import 'package:get/get.dart'; import 'package:ble_service/ble_service.dart'; import 'package:agent_service/agent_service.dart'; -import 'package:voitrans/data/models/appconfig_model.dart'; +import '../../data/models/appconfig_model.dart'; import '../../data/models/appconfig.dart'; import '../../core/utils/logger.dart'; diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index 9a5c66419..62f823e0b 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -3,10 +3,10 @@ import 'dart:convert'; import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; -import 'package:voitrans/data/services/network/api.dart'; +import '../../data/services/network/api.dart'; import 'package:tobias/tobias.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:voitrans/data/models/user_Info.dart'; +import '../../data/models/user_Info.dart'; import '../../modules/login/controllers/weixinLogin.dart'; diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 39662c1b5..2646dc84b 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -5,12 +5,12 @@ import 'package:amap_service/amap_service.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:uuid/uuid.dart'; -import 'package:voitrans/data/models/appconfig.dart'; -import 'package:voitrans/data/models/appconfig_model.dart'; -import 'package:voitrans/data/models/song_model.dart'; -import 'package:voitrans/data/services/ble_manager.dart'; -import 'package:voitrans/data/services/bluetooth_manager.dart'; -import 'package:voitrans/data/services/qq_music.dart'; +import '/data/models/appconfig.dart'; +import '/data/models/appconfig_model.dart'; +import '/data/models/song_model.dart'; +import '/data/services/ble_manager.dart'; +import '/data/services/bluetooth_manager.dart'; +import '/data/services/qq_music.dart'; import 'package:flutter_intro/flutter_intro.dart'; import '../../../data/services/novice_guide_service.dart'; import '../../../routes/app_routes.dart'; diff --git a/lib/modules/qqmusic/views/qqmusic_playlist_view.dart b/lib/modules/qqmusic/views/qqmusic_playlist_view.dart index a3d067524..8d5a2539b 100644 --- a/lib/modules/qqmusic/views/qqmusic_playlist_view.dart +++ b/lib/modules/qqmusic/views/qqmusic_playlist_view.dart @@ -1,9 +1,9 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:voitrans/modules/agent/widgets/circular_progress_button.dart'; -import 'package:voitrans/modules/qqmusic/controllers/qqmusic_playlist_controller.dart'; -import 'package:voitrans/data/models/song_model.dart'; // Use the data model instead +import '../../agent/widgets/circular_progress_button.dart'; +import '../controllers/qqmusic_playlist_controller.dart'; +import '/../../data/models/song_model.dart'; // Use the data model instead import '../../../core/utils/logger.dart'; class QqmusicPlaylistView extends GetView { diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 1738a207f..757c6d3f3 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; -import 'package:voitrans/modules/qqmusic/bindings/qqmusic_playlist_binding.dart'; -import 'package:voitrans/modules/qqmusic/views/qqmusic_playlist_view.dart'; +import '../modules/qqmusic/bindings/qqmusic_playlist_binding.dart'; +import '../modules/qqmusic/views/qqmusic_playlist_view.dart'; import '/modules/ble/bindings/ble_binding.dart'; import '../modules/ble/views/ble_view.dart'; From 8aca1f0a2acdb9dd41315543e6a8d68d567359ea Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Fri, 14 Nov 2025 17:00:38 +0800 Subject: [PATCH 017/177] =?UTF-8?q?=E9=99=90=E5=88=B6ota=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/ota_upgrade/views/ota_upgrade_view.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/modules/ota_upgrade/views/ota_upgrade_view.dart b/lib/modules/ota_upgrade/views/ota_upgrade_view.dart index 18dc7485f..a1663da02 100644 --- a/lib/modules/ota_upgrade/views/ota_upgrade_view.dart +++ b/lib/modules/ota_upgrade/views/ota_upgrade_view.dart @@ -13,7 +13,7 @@ class OtaUpgradeView extends GetView { return WillPopScope( onWillPop: () async { - if (controller.isUpgrade.value) { + if (controller.isUpgrade.value && controller.showDetailedStatus.value) { // 显示确认弹窗 await Get.dialog( AlertDialog( @@ -54,7 +54,8 @@ class OtaUpgradeView extends GetView { color: isDarkMode ? Colors.white : Colors.black, ), onPressed: () { - if (controller.isUpgrade.value) { + if (controller.isUpgrade.value && + controller.showDetailedStatus.value) { // 显示确认弹窗 Get.dialog( AlertDialog( @@ -827,7 +828,7 @@ class OtaUpgradeView extends GetView { // 更新按钮 Widget _buildUpdateButton(bool isDarkMode) { return Obx(() { - if (controller.isUpgrade.value) { + if (controller.isUpgrade.value && controller.showDetailedStatus.value) { return _buildProgressIndicator(isDarkMode); } From 6b8e2151e674c13812f343db6af23590f2c1eaaf Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Fri, 14 Nov 2025 17:32:31 +0800 Subject: [PATCH 018/177] 1 --- .../yunqiinnovation/ble_service/BleCommandSender.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt index 44bb4f630..692f83ada 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt @@ -219,11 +219,11 @@ class BleCommandSender { // 正常响应处理 val length = data[2].toInt() and 0xFF - // 检查数据长度 - if (data.size != length + 4) { // 帧头 + 命令 + 长度 + 数据 + CRC - Log.e(TAG, "设备响应数据长度不匹配: 期望=${length + 4}, 实际=${data.size}") - return - } + // // 检查数据长度 + // if (data.size != length + 4) { // 帧头 + 命令 + 长度 + 数据 + CRC + // Log.e(TAG, "设备响应数据长度不匹配: 期望=${length + 4}, 实际=${data.size}") + // return + // } // 计算CRC校验 - 修正:计算除最后一个CRC字节外的所有字节 val payload = data.sliceArray(0 until data.size - 1) From ae068abd04b3b5461e9c0ffc52422f242be7095b Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 14 Nov 2025 21:17:53 +0800 Subject: [PATCH 019/177] =?UTF-8?q?feat(ota):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC=E6=A3=80=E6=9F=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在DBProduct模型中添加isforceupdate字段标记强制更新 - 修改版本检查逻辑仅支持升级不支持降级 - 当检测到强制更新版本时不标记为已检查 - 缩短首页引导后的OTA检查延迟时间 --- lib/data/models/appconfig_model.dart | 2 ++ lib/data/models/appconfig_model.g.dart | 2 ++ lib/data/services/ota_check_service.dart | 18 +++++++++++++++--- .../home/controllers/home_controller.dart | 2 +- .../controllers/ota_core_contropller.dart | 13 +++++++++---- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/data/models/appconfig_model.dart b/lib/data/models/appconfig_model.dart index 65ea7838e..e656a62c9 100644 --- a/lib/data/models/appconfig_model.dart +++ b/lib/data/models/appconfig_model.dart @@ -79,6 +79,7 @@ class DBProduct { final String? productimage; final String scanuuid; final String? version; + bool? isforceupdate; final bool? iscontinuouschat; final String? updatedescription; final String? updatepackageaddress; @@ -91,6 +92,7 @@ class DBProduct { required this.productimage, required this.scanuuid, required this.version, + required this.isforceupdate, //该产品固件版本是否强制更新 required this.iscontinuouschat, required this.updatedescription, required this.updatepackageaddress, diff --git a/lib/data/models/appconfig_model.g.dart b/lib/data/models/appconfig_model.g.dart index f99ba35c6..fc97723ed 100644 --- a/lib/data/models/appconfig_model.g.dart +++ b/lib/data/models/appconfig_model.g.dart @@ -79,6 +79,7 @@ DBProduct _$DBProductFromJson(Map json) => DBProduct( productimage: json['productimage'] as String?, scanuuid: json['scanuuid'] as String, version: json['version'] as String?, + isforceupdate: json['isforceupdate'] as bool?, iscontinuouschat: json['iscontinuouschat'] as bool?, updatedescription: json['updatedescription'] as String?, updatepackageaddress: json['updatepackageaddress'] as String?, @@ -91,6 +92,7 @@ Map _$DBProductToJson(DBProduct instance) => { 'productimage': instance.productimage, 'scanuuid': instance.scanuuid, 'version': instance.version, + 'isforceupdate': instance.isforceupdate, 'iscontinuouschat': instance.iscontinuouschat, 'devicename': instance.devicename, 'updatedescription': instance.updatedescription, diff --git a/lib/data/services/ota_check_service.dart b/lib/data/services/ota_check_service.dart index 5caa31493..13a5f09d5 100644 --- a/lib/data/services/ota_check_service.dart +++ b/lib/data/services/ota_check_service.dart @@ -57,6 +57,7 @@ class OtaCheckService extends GetxService { /// [isFullyConnected] 设备是否完全连接 /// 返回是否成功执行了检查 Future performOtaCheck(bool isFullyConnected) async { + bool isForceUpdate = false; try { // 检查是否应该进行OTA检查 if (!shouldCheckOta()) { @@ -95,7 +96,12 @@ class OtaCheckService extends GetxService { _otaCoreService.isNewVersionAvailable(currentVersion, latestVersion); if (hasUpdate) { - Logger.d(_tag, '发现新版本,准备显示升级提醒'); + isForceUpdate = latestInfo['isForceUpdate'] as bool? ?? false; + if (isForceUpdate) { + Logger.d(_tag, '发现强制更新版本,准备显示升级提醒'); + } else { + Logger.d(_tag, '发现新版本,准备显示升级提醒'); + } // 再次确认当前在Home页面(防止异步执行期间页面切换) if (_isCurrentlyOnHomePage()) { @@ -109,12 +115,18 @@ class OtaCheckService extends GetxService { } // 标记为已检查(无论是否有更新都标记为已检查) - _markAsChecked(); + if (!isForceUpdate) { + _markAsChecked(); + } + _isCheckingInProgress = false; return true; } catch (e) { Logger.e(_tag, '检查OTA升级失败: $e'); // 即使检查失败,也标记为已检查,避免重复尝试 - _markAsChecked(); + if (!isForceUpdate) { + _markAsChecked(); + } + _isCheckingInProgress = false; return false; } } diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index 466b4792b..ab2478230 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -277,7 +277,7 @@ class HomeController extends GetxController { // 连接成功后检查OTA升级 if (noviceGuideService.isHomeGuide) { - Future.delayed(const Duration(seconds: 2), () { + Future.delayed(const Duration(seconds: 1), () { _checkOtaUpgrade(); }); } diff --git a/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart b/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart index cd05687f0..146645d90 100644 --- a/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart +++ b/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart @@ -525,17 +525,20 @@ class OtaCoreService { } } + product.isforceupdate = product.version?.contains("+"); + return { - 'latestVersion': product.version ?? "", + 'latestVersion': product.version?.split('+').first ?? "", 'updateDescription': product.updatedescription ?? "", 'updatePackageAddress': product.updatepackageaddress ?? "", + 'isForceUpdate': product.isforceupdate ?? false, }; } /// 比较版本号,判断是否有新版本可用 /// [currentVersion] 当前版本号 /// [latestVersion] 最新版本号 - /// 返回true表示有新版本可用(支持升级和降级) + /// 返回true表示有新版本可用(只支持升级) bool isNewVersionAvailable(String currentVersion, String latestVersion) { try { List currentParts = @@ -555,10 +558,12 @@ class OtaCoreService { latestParts.add(0); } - // 比较每一段,只要有不同就返回true(支持升级和降级) + // 从高位到低位比较版本号 for (int i = 0; i < maxLength; i++) { - if (latestParts[i] != currentParts[i]) { + if (latestParts[i] > currentParts[i]) { return true; + } else if (latestParts[i] < currentParts[i]) { + return false; } } From c87d878e154ebaa3362200e29de3fabdb205c335 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 14 Nov 2025 21:40:18 +0800 Subject: [PATCH 020/177] =?UTF-8?q?feat(translation=5Fview):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BF=94=E5=9B=9E=E6=8C=89=E9=92=AE=E5=88=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E8=A7=86=E5=9B=BE=E9=A1=B6=E9=83=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在翻译视图顶部添加返回按钮,方便用户快速返回上一页。按钮会根据当前主题模式自动调整颜色。 --- .../translation/views/translation_view.dart | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/modules/translation/views/translation_view.dart b/lib/modules/translation/views/translation_view.dart index b51cf7fa0..25362ae6e 100644 --- a/lib/modules/translation/views/translation_view.dart +++ b/lib/modules/translation/views/translation_view.dart @@ -80,6 +80,31 @@ class TranslationView extends GetView { controller: controller, ), + Positioned( + top: 2, + left: 0, + right: 0, + child: SafeArea( + top: true, + child: Container( + height: 56.h, + padding: EdgeInsets.symmetric(horizontal: 8.w), + color: Colors.transparent, + child: Align( + alignment: Alignment.centerLeft, + child: IconButton( + icon: Icon( + Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, + size: 20.sp, + ), + onPressed: () => Get.back(), + ), + ), + ), + ), + ), + // 顶部按钮(倒过来) Positioned( top: 50.h, From 521413957554b11f0323305629af81b1f2a7ddd0 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 15 Nov 2025 12:00:16 +0800 Subject: [PATCH 021/177] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E8=87=B31.0.19+61=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?iOS=20RunnerProfile.entitlements=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner/RunnerProfile.entitlements | 5 +++++ pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 ios/Runner/RunnerProfile.entitlements diff --git a/ios/Runner/RunnerProfile.entitlements b/ios/Runner/RunnerProfile.entitlements new file mode 100644 index 000000000..0c67376eb --- /dev/null +++ b/ios/Runner/RunnerProfile.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/pubspec.yaml b/pubspec.yaml index c2cbdf8c3..47a634b42 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.18+54 +version: 1.0.19+61 environment: sdk: ">=3.3.0 <4.0.0" From 36d11b81103ee134f22e3d1ec965016dff67b54a Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Sat, 15 Nov 2025 15:13:16 +0800 Subject: [PATCH 022/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0iOS=E7=94=BB=E4=B8=AD?= =?UTF-8?q?=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- local_plugins/native_plugin/.gitignore | 33 +++++ local_plugins/native_plugin/.metadata | 33 +++++ local_plugins/native_plugin/CHANGELOG.md | 3 + local_plugins/native_plugin/LICENSE | 1 + local_plugins/native_plugin/README.md | 15 +++ .../native_plugin/analysis_options.yaml | 4 + .../native_plugin/android/.gitignore | 9 ++ .../native_plugin/android/build.gradle | 52 ++++++++ .../native_plugin/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../example/native_plugin/NativePlugin.java | 38 ++++++ .../native_plugin/NativePluginTest.java | 29 +++++ local_plugins/native_plugin/ios/.gitignore | 38 ++++++ .../native_plugin/ios/Assets/.gitkeep | 0 .../native_plugin/ios/Classes/FLNativeView.h | 15 +++ .../native_plugin/ios/Classes/FLNativeView.m | 83 +++++++++++++ .../native_plugin/ios/Classes/NativePlugin.h | 4 + .../native_plugin/ios/Classes/NativePlugin.m | 114 ++++++++++++++++++ .../native_plugin/ios/Classes/PlayerView.h | 15 +++ .../native_plugin/ios/Classes/PlayerView.m | 100 +++++++++++++++ .../ios/Resources/PrivacyInfo.xcprivacy | 14 +++ .../native_plugin/ios/native_plugin.podspec | 29 +++++ .../native_plugin/lib/native_plugin.dart | 19 +++ .../lib/native_plugin_method_channel.dart | 37 ++++++ .../lib/native_plugin_platform_interface.dart | 47 ++++++++ local_plugins/native_plugin/pubspec.yaml | 72 +++++++++++ pubspec.yaml | 3 + 27 files changed, 811 insertions(+) create mode 100644 local_plugins/native_plugin/.gitignore create mode 100644 local_plugins/native_plugin/.metadata create mode 100644 local_plugins/native_plugin/CHANGELOG.md create mode 100644 local_plugins/native_plugin/LICENSE create mode 100644 local_plugins/native_plugin/README.md create mode 100644 local_plugins/native_plugin/analysis_options.yaml create mode 100644 local_plugins/native_plugin/android/.gitignore create mode 100644 local_plugins/native_plugin/android/build.gradle create mode 100644 local_plugins/native_plugin/android/settings.gradle create mode 100644 local_plugins/native_plugin/android/src/main/AndroidManifest.xml create mode 100644 local_plugins/native_plugin/android/src/main/java/com/example/native_plugin/NativePlugin.java create mode 100644 local_plugins/native_plugin/android/src/test/java/com/example/native_plugin/NativePluginTest.java create mode 100644 local_plugins/native_plugin/ios/.gitignore create mode 100644 local_plugins/native_plugin/ios/Assets/.gitkeep create mode 100644 local_plugins/native_plugin/ios/Classes/FLNativeView.h create mode 100644 local_plugins/native_plugin/ios/Classes/FLNativeView.m create mode 100644 local_plugins/native_plugin/ios/Classes/NativePlugin.h create mode 100644 local_plugins/native_plugin/ios/Classes/NativePlugin.m create mode 100644 local_plugins/native_plugin/ios/Classes/PlayerView.h create mode 100644 local_plugins/native_plugin/ios/Classes/PlayerView.m create mode 100644 local_plugins/native_plugin/ios/Resources/PrivacyInfo.xcprivacy create mode 100644 local_plugins/native_plugin/ios/native_plugin.podspec create mode 100644 local_plugins/native_plugin/lib/native_plugin.dart create mode 100644 local_plugins/native_plugin/lib/native_plugin_method_channel.dart create mode 100644 local_plugins/native_plugin/lib/native_plugin_platform_interface.dart create mode 100644 local_plugins/native_plugin/pubspec.yaml diff --git a/local_plugins/native_plugin/.gitignore b/local_plugins/native_plugin/.gitignore new file mode 100644 index 000000000..e7d347d9d --- /dev/null +++ b/local_plugins/native_plugin/.gitignore @@ -0,0 +1,33 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/local_plugins/native_plugin/.metadata b/local_plugins/native_plugin/.metadata new file mode 100644 index 000000000..a5700b901 --- /dev/null +++ b/local_plugins/native_plugin/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "35c388afb57ef061d06a39b537336c87e0e3d1b1" + channel: "stable" + +project_type: plugin + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + - platform: android + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + - platform: ios + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/local_plugins/native_plugin/CHANGELOG.md b/local_plugins/native_plugin/CHANGELOG.md new file mode 100644 index 000000000..41cc7d819 --- /dev/null +++ b/local_plugins/native_plugin/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/local_plugins/native_plugin/LICENSE b/local_plugins/native_plugin/LICENSE new file mode 100644 index 000000000..ba75c69f7 --- /dev/null +++ b/local_plugins/native_plugin/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/local_plugins/native_plugin/README.md b/local_plugins/native_plugin/README.md new file mode 100644 index 000000000..bc8261f01 --- /dev/null +++ b/local_plugins/native_plugin/README.md @@ -0,0 +1,15 @@ +# native_plugin + +A new Flutter plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/to/develop-plugins), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/local_plugins/native_plugin/analysis_options.yaml b/local_plugins/native_plugin/analysis_options.yaml new file mode 100644 index 000000000..a5744c1cf --- /dev/null +++ b/local_plugins/native_plugin/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/local_plugins/native_plugin/android/.gitignore b/local_plugins/native_plugin/android/.gitignore new file mode 100644 index 000000000..161bdcdaf --- /dev/null +++ b/local_plugins/native_plugin/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/local_plugins/native_plugin/android/build.gradle b/local_plugins/native_plugin/android/build.gradle new file mode 100644 index 000000000..948c5ef6f --- /dev/null +++ b/local_plugins/native_plugin/android/build.gradle @@ -0,0 +1,52 @@ +group = "com.example.native_plugin" +version = "1.0" + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.7.0") + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: "com.android.library" + +android { + namespace = "com.example.native_plugin" + + compileSdk = 35 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + defaultConfig { + minSdk = 21 + } + + dependencies { + testImplementation("junit:junit:4.13.2") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + } + } + } +} diff --git a/local_plugins/native_plugin/android/settings.gradle b/local_plugins/native_plugin/android/settings.gradle new file mode 100644 index 000000000..9f756a98c --- /dev/null +++ b/local_plugins/native_plugin/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'native_plugin' diff --git a/local_plugins/native_plugin/android/src/main/AndroidManifest.xml b/local_plugins/native_plugin/android/src/main/AndroidManifest.xml new file mode 100644 index 000000000..5153b5dc6 --- /dev/null +++ b/local_plugins/native_plugin/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/local_plugins/native_plugin/android/src/main/java/com/example/native_plugin/NativePlugin.java b/local_plugins/native_plugin/android/src/main/java/com/example/native_plugin/NativePlugin.java new file mode 100644 index 000000000..265796e9d --- /dev/null +++ b/local_plugins/native_plugin/android/src/main/java/com/example/native_plugin/NativePlugin.java @@ -0,0 +1,38 @@ +package com.example.native_plugin; + +import androidx.annotation.NonNull; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +/** NativePlugin */ +public class NativePlugin implements FlutterPlugin, MethodCallHandler { + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private MethodChannel channel; + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "native_plugin"); + channel.setMethodCallHandler(this); + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + if (call.method.equals("getPlatformVersion")) { + result.success("Android " + android.os.Build.VERSION.RELEASE); + } else { + result.notImplemented(); + } + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + } +} diff --git a/local_plugins/native_plugin/android/src/test/java/com/example/native_plugin/NativePluginTest.java b/local_plugins/native_plugin/android/src/test/java/com/example/native_plugin/NativePluginTest.java new file mode 100644 index 000000000..8034030e9 --- /dev/null +++ b/local_plugins/native_plugin/android/src/test/java/com/example/native_plugin/NativePluginTest.java @@ -0,0 +1,29 @@ +package com.example.native_plugin; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import org.junit.Test; + +/** + * This demonstrates a simple unit test of the Java portion of this plugin's implementation. + * + * Once you have built the plugin's example app, you can run these tests from the command + * line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or + * you can run them directly from IDEs that support JUnit such as Android Studio. + */ + +public class NativePluginTest { + @Test + public void onMethodCall_getPlatformVersion_returnsExpectedValue() { + NativePlugin plugin = new NativePlugin(); + + final MethodCall call = new MethodCall("getPlatformVersion", null); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + plugin.onMethodCall(call, mockResult); + + verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE); + } +} diff --git a/local_plugins/native_plugin/ios/.gitignore b/local_plugins/native_plugin/ios/.gitignore new file mode 100644 index 000000000..034771fc9 --- /dev/null +++ b/local_plugins/native_plugin/ios/.gitignore @@ -0,0 +1,38 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig +/Flutter/ephemeral/ +/Flutter/flutter_export_environment.sh diff --git a/local_plugins/native_plugin/ios/Assets/.gitkeep b/local_plugins/native_plugin/ios/Assets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/local_plugins/native_plugin/ios/Classes/FLNativeView.h b/local_plugins/native_plugin/ios/Classes/FLNativeView.h new file mode 100644 index 000000000..4c49e00f4 --- /dev/null +++ b/local_plugins/native_plugin/ios/Classes/FLNativeView.h @@ -0,0 +1,15 @@ +#import + +@interface FLNativeViewFactory : NSObject +- (instancetype)initWithMessenger:(NSObject *)messenger; +@end + +@interface FLNativeView : NSObject + +- (instancetype)initWithFrame:(CGRect)frame + viewIdentifier:(int64_t)viewId + arguments:(id _Nullable)args + binaryMessenger:(NSObject *)messenger; + +- (UIView *)view; +@end diff --git a/local_plugins/native_plugin/ios/Classes/FLNativeView.m b/local_plugins/native_plugin/ios/Classes/FLNativeView.m new file mode 100644 index 000000000..848785a6b --- /dev/null +++ b/local_plugins/native_plugin/ios/Classes/FLNativeView.m @@ -0,0 +1,83 @@ +#import "FLNativeView.h" +#import "PlayerView.h" + +@implementation FLNativeViewFactory { + NSObject *_messenger; +} + +- (instancetype)initWithMessenger: + (NSObject *)messenger { + self = [super init]; + if (self) { + _messenger = messenger; + } + return self; +} + +- (NSObject *)createWithFrame:(CGRect)frame + viewIdentifier:(int64_t)viewId + arguments:(id _Nullable)args { + return [[FLNativeView alloc] initWithFrame:frame + viewIdentifier:viewId + arguments:args + binaryMessenger:_messenger]; +} + +/// Implementing this method is only necessary when the `arguments` in +/// `createWithFrame` is not `nil`. +- (NSObject *)createArgsCodec { + return [FlutterStandardMessageCodec sharedInstance]; +} + +@end + +@implementation FLNativeView { + PlayerView *_view; + FlutterMethodChannel *_methodChannel; +} + +- (instancetype)initWithFrame:(CGRect)frame + viewIdentifier:(int64_t)viewId + arguments:(id _Nullable)args + binaryMessenger:(NSObject *)messenger { + if (self = [super init]) { + _view = [[PlayerView alloc] init]; + _methodChannel = [FlutterMethodChannel + methodChannelWithName: + [NSString + stringWithFormat:@"native_plugin/native_view_%lld", viewId] + binaryMessenger:messenger]; + __weak typeof(self) weakSelf = self; + [_methodChannel setMethodCallHandler:^(FlutterMethodCall *_Nonnull call, + FlutterResult _Nonnull result) { + typeof(self) strongSelf = weakSelf; + if (strongSelf != nil) { + [strongSelf onMethodCall:call result:result]; + } + }]; + } + return self; +} + +- (UIView *)view { + return _view; +} + +- (void)onMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { + if ([@"getInternalView" isEqualToString:call.method]) { + result(@((uint64_t)(_view))); + } else if ([@"updateContent" isEqualToString:call.method]) { + NSDictionary *data = call.arguments; + NSString *lang = data[@"lang"]; + NSString *cn = data[@"cn"]; + NSString *en = data[@"en"]; + dispatch_async(dispatch_get_main_queue(), ^{ + [_view updateWithLang:lang cn:cn en:en]; + }); + result(nil); + } else { + result(@(0)); + } +} + +@end diff --git a/local_plugins/native_plugin/ios/Classes/NativePlugin.h b/local_plugins/native_plugin/ios/Classes/NativePlugin.h new file mode 100644 index 000000000..2d0b3293e --- /dev/null +++ b/local_plugins/native_plugin/ios/Classes/NativePlugin.h @@ -0,0 +1,4 @@ +#import + +@interface NativePlugin : NSObject +@end diff --git a/local_plugins/native_plugin/ios/Classes/NativePlugin.m b/local_plugins/native_plugin/ios/Classes/NativePlugin.m new file mode 100644 index 000000000..bee63b337 --- /dev/null +++ b/local_plugins/native_plugin/ios/Classes/NativePlugin.m @@ -0,0 +1,114 @@ +#import "NativePlugin.h" +#import "FLNativeView.h" +#import "PlayerView.h" + +#import + +@interface NativePlugin () + +@property(nonatomic, strong) NSMutableArray *_Nonnull pipContentViewArray; + +@end + +@implementation NativePlugin + ++ (void)updateAudioSession { + AVAudioSession *audioSession = [AVAudioSession sharedInstance]; + NSError *categoryError = nil; + if (@available(iOS 14.5, *)) { + [audioSession + setCategory:AVAudioSessionCategoryPlayback + mode:AVAudioSessionModeMoviePlayback + options: + AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption + error:&categoryError]; + } else { + // Fallback on earlier versions + } + if (categoryError) { + NSLog(@"Set audio session category error: %@", + categoryError.localizedDescription); + } + NSError *activeError = nil; + [audioSession setActive:YES error:&activeError]; + if (activeError) { + NSLog(@"Set audio session active error: %@", + activeError.localizedDescription); + } +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + // must call this, otherwise pip will not possible + // https://github.com/jazzychad/PiPBugDemo + [NativePlugin updateAudioSession]; + + FlutterMethodChannel *channel = + [FlutterMethodChannel methodChannelWithName:@"native_plugin" + binaryMessenger:[registrar messenger]]; + NativePlugin *instance = [[NativePlugin alloc] init]; + + FLNativeViewFactory *factory = + [[FLNativeViewFactory alloc] initWithMessenger:registrar.messenger]; + [registrar registerViewFactory:factory withId:@"native_view"]; + + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _pipContentViewArray = [NSMutableArray array]; + } + return self; +} + +- (void)handleMethodCall:(FlutterMethodCall *)call + result:(FlutterResult)result { + if ([@"getPlatformVersion" isEqualToString:call.method]) { + result([@"iOS " + stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); + } else if ([@"createPipContentView" isEqualToString:call.method]) { + PlayerView *playerView = [[PlayerView alloc] init]; + + // should control the play state by event of pip, optimize it later + [playerView play]; + + [self.pipContentViewArray addObject:playerView]; + + result(@((uint64_t)playerView)); + } else if ([@"disposePipContentView" isEqualToString:call.method]) { + uint64_t viewId = [call.arguments unsignedLongLongValue]; + for (PlayerView *playerView in self.pipContentViewArray) { + if ((uint64_t)playerView == viewId) { + [playerView pause]; + [self.pipContentViewArray removeObject:playerView]; + break; + } + } + } else if ([@"updatePipContentView" isEqualToString:call.method]) { + NSDictionary *data = call.arguments; + NSString *lang = data[@"lang"]; + NSString *cn = data[@"cn"]; + NSString *en = data[@"en"]; + NSNumber *viewIdNum = data[@"viewId"]; + dispatch_async(dispatch_get_main_queue(), ^{ + if (viewIdNum != nil) { + uint64_t targetId = viewIdNum.unsignedLongLongValue; + for (PlayerView *playerView in self.pipContentViewArray) { + if ((uint64_t)playerView == targetId) { + [playerView updateWithLang:lang cn:cn en:en]; + break; + } + } + } else { + PlayerView *playerView = [self.pipContentViewArray lastObject]; + [playerView updateWithLang:lang cn:cn en:en]; + } + }); + result(nil); + } else { + result(FlutterMethodNotImplemented); + } +} + +@end diff --git a/local_plugins/native_plugin/ios/Classes/PlayerView.h b/local_plugins/native_plugin/ios/Classes/PlayerView.h new file mode 100644 index 000000000..50044ae41 --- /dev/null +++ b/local_plugins/native_plugin/ios/Classes/PlayerView.h @@ -0,0 +1,15 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface PlayerView : UIView + +- (void)play; + +- (void)pause; + +- (void)updateWithLang:(NSString *)lang cn:(NSString *)cn en:(NSString *)en; + +@end + +NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/local_plugins/native_plugin/ios/Classes/PlayerView.m b/local_plugins/native_plugin/ios/Classes/PlayerView.m new file mode 100644 index 000000000..e456fb91d --- /dev/null +++ b/local_plugins/native_plugin/ios/Classes/PlayerView.m @@ -0,0 +1,100 @@ +#import "PlayerView.h" + +@interface PlayerView () + +@property(nonatomic, strong) UILabel *titleLabel; +@property(nonatomic, strong) UILabel *langLabel; +@property(nonatomic, strong) UILabel *cnLabel; +@property(nonatomic, strong) UILabel *enLabel; +@property(nonatomic, strong) UIStackView *stackView; + +@end + +@implementation PlayerView + +- (instancetype)init { + if (self = [super init]) { + self.backgroundColor = [UIColor whiteColor]; + + UILabel *title = [[UILabel alloc] init]; + title.text = @"实时翻译"; + title.font = [UIFont boldSystemFontOfSize:22]; + title.textColor = [UIColor blackColor]; + title.textAlignment = NSTextAlignmentCenter; + title.numberOfLines = 1; + self.titleLabel = title; + + UILabel *lang = [[UILabel alloc] init]; + lang.text = @"中文(简体) -> 英语"; + lang.font = [UIFont systemFontOfSize:14]; + lang.textColor = [UIColor darkGrayColor]; + lang.textAlignment = NSTextAlignmentLeft; + lang.numberOfLines = 1; + self.langLabel = lang; + + UILabel *cn = [[UILabel alloc] init]; + cn.font = [UIFont systemFontOfSize:18]; + cn.textColor = [UIColor blackColor]; + cn.textAlignment = NSTextAlignmentLeft; + cn.numberOfLines = 0; + self.cnLabel = cn; + + UILabel *en = [[UILabel alloc] init]; + en.font = [UIFont systemFontOfSize:18]; + en.textColor = [UIColor colorWithRed:0.24 green:0.54 blue:0.90 alpha:1.0]; + en.textAlignment = NSTextAlignmentLeft; + en.numberOfLines = 0; + self.enLabel = en; + + NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init]; + para.lineSpacing = 4; + + self.cnLabel.attributedText = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSParagraphStyleAttributeName: para}]; + + self.enLabel.attributedText = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSParagraphStyleAttributeName: para}]; + + UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[self.titleLabel, self.langLabel, self.cnLabel, self.enLabel]]; + stack.axis = UILayoutConstraintAxisVertical; + stack.spacing = 12; + stack.alignment = UIStackViewAlignmentFill; + stack.distribution = UIStackViewDistributionFill; + stack.translatesAutoresizingMaskIntoConstraints = NO; + self.stackView = stack; + + self.layoutMargins = UIEdgeInsetsMake(16, 16, 16, 16); + [self addSubview:self.stackView]; + + UILayoutGuide *guide = self.layoutMarginsGuide; + [NSLayoutConstraint activateConstraints:@[ + [self.stackView.topAnchor constraintEqualToAnchor:guide.topAnchor], + [self.stackView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor], + [self.stackView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor], + [self.stackView.bottomAnchor constraintLessThanOrEqualToAnchor:guide.bottomAnchor] + ]]; + } + return self; +} + +- (void)play { + +} + +- (void)pause { + +} + +- (void)updateWithLang:(NSString *)lang cn:(NSString *)cn en:(NSString *)en { + if (lang != nil) { + self.langLabel.text = lang; + } + NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init]; + para.lineSpacing = 4; + if (cn != nil) { + self.cnLabel.attributedText = [[NSAttributedString alloc] initWithString:cn attributes:@{NSParagraphStyleAttributeName: para}]; + } + if (en != nil) { + self.enLabel.attributedText = [[NSAttributedString alloc] initWithString:en attributes:@{NSParagraphStyleAttributeName: para}]; + } +} + +@end diff --git a/local_plugins/native_plugin/ios/Resources/PrivacyInfo.xcprivacy b/local_plugins/native_plugin/ios/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..a34b7e2e6 --- /dev/null +++ b/local_plugins/native_plugin/ios/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/local_plugins/native_plugin/ios/native_plugin.podspec b/local_plugins/native_plugin/ios/native_plugin.podspec new file mode 100644 index 000000000..c84e9ffba --- /dev/null +++ b/local_plugins/native_plugin/ios/native_plugin.podspec @@ -0,0 +1,29 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint native_plugin.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'native_plugin' + s.version = '0.0.1' + s.summary = 'A new Flutter plugin project.' + s.description = <<-DESC +A new Flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.platform = :ios, '12.0' + + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + + # If your plugin requires a privacy manifest, for example if it uses any + # required reason APIs, update the PrivacyInfo.xcprivacy file to describe your + # plugin's privacy impact, and then uncomment this line. For more information, + # see https://developer.apple.com/documentation/bundleresources/privacy_manifest_files + # s.resource_bundles = {'native_plugin_privacy' => ['Resources/PrivacyInfo.xcprivacy']} +end diff --git a/local_plugins/native_plugin/lib/native_plugin.dart b/local_plugins/native_plugin/lib/native_plugin.dart new file mode 100644 index 000000000..c54721f1f --- /dev/null +++ b/local_plugins/native_plugin/lib/native_plugin.dart @@ -0,0 +1,19 @@ +import 'native_plugin_platform_interface.dart'; + +class NativePlugin { + Future getPlatformVersion() { + return NativePluginPlatform.instance.getPlatformVersion(); + } + + Future createPipContentView() { + return NativePluginPlatform.instance.createPipContentView(); + } + + Future updatePipContentView(Map data) { + return NativePluginPlatform.instance.updatePipContentView(data); + } + + Future disposePipContentView(int viewId) { + return NativePluginPlatform.instance.disposePipContentView(viewId); + } +} diff --git a/local_plugins/native_plugin/lib/native_plugin_method_channel.dart b/local_plugins/native_plugin/lib/native_plugin_method_channel.dart new file mode 100644 index 000000000..ec8e18ac5 --- /dev/null +++ b/local_plugins/native_plugin/lib/native_plugin_method_channel.dart @@ -0,0 +1,37 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'native_plugin_platform_interface.dart'; + +/// An implementation of [NativePluginPlatform] that uses method channels. +class MethodChannelNativePlugin extends NativePluginPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + final methodChannel = const MethodChannel('native_plugin'); + + @override + Future getPlatformVersion() async { + final version = await methodChannel.invokeMethod( + 'getPlatformVersion', + ); + return version; + } + + @override + Future createPipContentView() async { + final viewId = await methodChannel.invokeMethod( + 'createPipContentView', + ); + return viewId ?? 0; + } + + @override + Future updatePipContentView(Map data) async { + await methodChannel.invokeMethod('updatePipContentView', data); + } + + @override + Future disposePipContentView(int viewId) async { + await methodChannel.invokeMethod('disposePipContentView', viewId); + } +} diff --git a/local_plugins/native_plugin/lib/native_plugin_platform_interface.dart b/local_plugins/native_plugin/lib/native_plugin_platform_interface.dart new file mode 100644 index 000000000..c26495c2f --- /dev/null +++ b/local_plugins/native_plugin/lib/native_plugin_platform_interface.dart @@ -0,0 +1,47 @@ +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'native_plugin_method_channel.dart'; + +abstract class NativePluginPlatform extends PlatformInterface { + /// Constructs a NativePluginPlatform. + NativePluginPlatform() : super(token: _token); + + static final Object _token = Object(); + + static NativePluginPlatform _instance = MethodChannelNativePlugin(); + + /// The default instance of [NativePluginPlatform] to use. + /// + /// Defaults to [MethodChannelNativePlugin]. + static NativePluginPlatform get instance => _instance; + + /// Platform-specific implementations should set this with their own + /// platform-specific class that extends [NativePluginPlatform] when + /// they register themselves. + static set instance(NativePluginPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + Future getPlatformVersion() { + throw UnimplementedError('platformVersion() has not been implemented.'); + } + + Future createPipContentView() { + throw UnimplementedError( + 'createPipContentView() has not been implemented.', + ); + } + + Future updatePipContentView(Map data) { + throw UnimplementedError( + 'updatePipContentView() has not been implemented.', + ); + } + + Future disposePipContentView(int viewId) { + throw UnimplementedError( + 'disposePipContentView() has not been implemented.', + ); + } +} diff --git a/local_plugins/native_plugin/pubspec.yaml b/local_plugins/native_plugin/pubspec.yaml new file mode 100644 index 000000000..a284bfce8 --- /dev/null +++ b/local_plugins/native_plugin/pubspec.yaml @@ -0,0 +1,72 @@ +name: native_plugin +description: "A new Flutter plugin project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.7.0 + flutter: '>=3.3.0' + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: ^2.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) + # which should be registered in the plugin registry. This is required for + # using method channels. + # The Android 'package' specifies package in which the registered class is. + # This is required for using method channels on Android. + # The 'ffiPlugin' specifies that native code should be built and bundled. + # This is required for using `dart:ffi`. + # All these are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: com.example.native_plugin + pluginClass: NativePlugin + ios: + pluginClass: NativePlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/pubspec.yaml b/pubspec.yaml index 47a634b42..d58b22f96 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -76,6 +76,7 @@ dependencies: dio: ^5.8.0+1 sqflite: ^2.4.2 path: ^1.9.1 + pip: ^0.0.3 connectivity_plus: ^6.1.5 # 网络连接检测依赖 speech: path: local_plugins/speech @@ -111,6 +112,8 @@ dependencies: path: local_plugins/user_portrait qq_music: path: local_plugins/qq_music + native_plugin: + path: local_plugins/native_plugin test: path: local_plugins/test in_app_purchase: ^3.2.3 # 应用内购买插件 From 276eccd35b738814ba90be1f2028eeaacc36b561 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Sat, 15 Nov 2025 18:11:34 +0800 Subject: [PATCH 023/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9iOS=E7=94=BB=E4=B8=AD?= =?UTF-8?q?=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/translation_controller.dart | 115 +++++++++++++++--- .../translation/views/translation_view.dart | 43 ++++--- 2 files changed, 121 insertions(+), 37 deletions(-) diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 79cac6ab1..f15b1a0d0 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -2,12 +2,15 @@ import 'dart:io'; import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:intl/intl.dart'; +import 'package:native_plugin/native_plugin.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; +import 'package:pip/pip.dart'; import '../../../data/services/ast_service.dart'; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/music_manager.dart'; @@ -49,7 +52,12 @@ class TranslationController extends GetxController with WidgetsBindingObserver { final BleManager bleManager = Get.find(); final _musiceManager = Get.find(); late final TranslationUsageService _usageService; + // 安卓悬浮窗管理器 late final FloatingWindowManager _floatingWindowManager; + // 苹果悬浮窗管理器 + late final Pip _pip; + late final NativePlugin _nativePlugin; + int _pipContentView = 0; // ==================== 悬浮窗相关 ==================== final isFloatingWindowEnabled = false.obs; // 悬浮窗状态 @@ -135,7 +143,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { // 底部控制栏高度 double _bottomBarHeight = 0.0; - /// 初始化悬浮窗管理器 + /// 初始化安卓悬浮窗管理器 void _initFloatingWindowManager() { try { if (!Get.isRegistered()) { @@ -148,13 +156,68 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } } + /// 初始化苹果悬浮窗管理器 + Future initPlatformState() async { + _pip = Pip(); + _nativePlugin = NativePlugin(); + try { + isFloatingWindowEnabled.value = await _pip.isActived(); + await _pip.registerStateChangedObserver( + PipStateChangedObserver( + onPipStateChanged: (state, error) { + isFloatingWindowEnabled.value = state == PipState.pipStateStarted; + + if (state == PipState.pipStateFailed) { + _pip.dispose(); + } + }, + ), + ); + } on PlatformException { + isFloatingWindowEnabled.value = false; + } + } + /// 切换悬浮窗功能 Future toggleFloatingWindow() async { if (isFloatingWindowEnabled.value) { - await _disableFloatingWindow(); + if (Platform.isAndroid) { + await _disableFloatingWindow(); + } else if (Platform.isIOS) { + await _pip.dispose(); + } } else { - await _enableFloatingWindow(); + if (Platform.isAndroid) { + await _enableFloatingWindow(); + } else if (Platform.isIOS) { + await _startPip(); + } + } + } + + Future _startPip() async { + if (_pipContentView == 0) { + _pipContentView = await _nativePlugin.createPipContentView(); } + final options = PipOptions( + autoEnterEnabled: true, + aspectRatioX: 375, + aspectRatioY: 400, + sourceRectHintLeft: 0, + sourceRectHintTop: 0, + sourceRectHintRight: 0, + sourceRectHintBottom: 0, + seamlessResizeEnabled: true, + useExternalStateMonitor: true, + externalStateMonitorInterval: 100, + contentView: _pipContentView, + preferredContentWidth: 375, + preferredContentHeight: 400, + controlStyle: 2, + ); + + await _pip.setup(options); + await _pip.start(); } /// 启用悬浮窗功能 @@ -217,16 +280,24 @@ class TranslationController extends GetxController with WidgetsBindingObserver { _languageManager.getChineseNameByAsrCode(item.targetLanguageCode) ?? 'unknown'; - final data = FloatingWindowData( - sourceText: item.sourceText, - translatedText: item.translatedText, - sourceLanguage: sourceLanguageName, - targetLanguage: targetLanguageName, - timestamp: item.timestamp, - isIntermediate: item.isIntermediate, - ); - - await _floatingWindowManager.updateFloatingWindowContent(data); + if (Platform.isAndroid) { + final data = FloatingWindowData( + sourceText: item.sourceText, + translatedText: item.translatedText, + sourceLanguage: sourceLanguageName, + targetLanguage: targetLanguageName, + timestamp: item.timestamp, + isIntermediate: item.isIntermediate, + ); + await _floatingWindowManager.updateFloatingWindowContent(data); + } else if (Platform.isIOS) { + await _nativePlugin.updatePipContentView({ + 'viewId': _pipContentView, + 'cn': item.sourceText, + 'en': item.translatedText, + 'lang': '$sourceLanguageName -> $targetLanguageName', + }); + } } /// 更改翻译模式 @@ -374,8 +445,13 @@ class TranslationController extends GetxController with WidgetsBindingObserver { _timerManager = RecordTimerController(); _historyManager = TranslationHistoryManager(); - // 初始化悬浮窗管理器 - _initFloatingWindowManager(); + if (Platform.isAndroid) { + // 初始化安卓悬浮窗管理器 + _initFloatingWindowManager(); + } else if (Platform.isIOS) { + // 初始化苹果悬浮窗管理器 + initPlatformState(); + } // 预先检查权限,避免在用户交互时阻塞 _preCheckPermissions(); @@ -665,6 +741,15 @@ class TranslationController extends GetxController with WidgetsBindingObserver { // _asrService.dispose(); // _astService.dispose(); + if (Platform.isAndroid) { + _disableFloatingWindow(); + } else if (Platform.isIOS) { + _pip.dispose(); + if (_pipContentView != 0) { + _nativePlugin.disposePipContentView(_pipContentView); + } + } + // 释放管理器资源 _timerManager.dispose(); _historyManager.dispose(); diff --git a/lib/modules/translation/views/translation_view.dart b/lib/modules/translation/views/translation_view.dart index 25362ae6e..c089c0ff2 100644 --- a/lib/modules/translation/views/translation_view.dart +++ b/lib/modules/translation/views/translation_view.dart @@ -235,28 +235,27 @@ class TranslationView extends GetView { return Row( children: [ // 悬浮窗切换按钮(仅在支持的模式下显示) - if (Platform.isAndroid) - Obx(() { - if (controller.currentMode.value == 'call' || - controller.currentMode.value == 'audioVideo') { - return IconButton( - icon: Icon( - controller.isFloatingWindowEnabled.value - ? Icons.picture_in_picture - : Icons.picture_in_picture_alt_outlined, - color: controller.isFloatingWindowEnabled.value - ? Colors.blue - : (isDarkMode ? Colors.white : Colors.black), - size: 24.sp, - ), - onPressed: controller.toggleFloatingWindow, - tooltip: controller.isFloatingWindowEnabled.value - ? '禁用悬浮窗' - : '启用悬浮窗', - ); - } - return const SizedBox.shrink(); - }), + Obx(() { + if (controller.currentMode.value == 'call' || + controller.currentMode.value == 'audioVideo') { + return IconButton( + icon: Icon( + controller.isFloatingWindowEnabled.value + ? Icons.picture_in_picture + : Icons.picture_in_picture_alt_outlined, + color: controller.isFloatingWindowEnabled.value + ? Colors.blue + : (isDarkMode ? Colors.white : Colors.black), + size: 24.sp, + ), + onPressed: controller.toggleFloatingWindow, + tooltip: controller.isFloatingWindowEnabled.value + ? '禁用悬浮窗' + : '启用悬浮窗', + ); + } + return const SizedBox.shrink(); + }), IconButton( icon: Icon( Icons.radio_button_checked, From 81660ffa390cb256d922cd636976ea89890de4ae Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 17 Nov 2025 11:01:40 +0800 Subject: [PATCH 024/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=BB=E4=B8=AD?= =?UTF-8?q?=E7=94=BB=E9=BB=98=E8=AE=A4=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- local_plugins/native_plugin/ios/Classes/PlayerView.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/local_plugins/native_plugin/ios/Classes/PlayerView.m b/local_plugins/native_plugin/ios/Classes/PlayerView.m index e456fb91d..1272aef4c 100644 --- a/local_plugins/native_plugin/ios/Classes/PlayerView.m +++ b/local_plugins/native_plugin/ios/Classes/PlayerView.m @@ -49,9 +49,9 @@ NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init]; para.lineSpacing = 4; - self.cnLabel.attributedText = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSParagraphStyleAttributeName: para}]; + self.cnLabel.attributedText = [[NSAttributedString alloc] initWithString:@"正在识别..." attributes:@{NSParagraphStyleAttributeName: para}]; - self.enLabel.attributedText = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSParagraphStyleAttributeName: para}]; + self.enLabel.attributedText = [[NSAttributedString alloc] initWithString:@"翻译中..." attributes:@{NSParagraphStyleAttributeName: para}]; UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[self.titleLabel, self.langLabel, self.cnLabel, self.enLabel]]; stack.axis = UILayoutConstraintAxisVertical; From 9da7dabf6338b76b19c644479d117832d916c8d2 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 17 Nov 2025 15:11:50 +0800 Subject: [PATCH 025/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0google=E7=9A=84?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E4=BB=A3=E7=A0=81=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/pay_service.dart | 218 +++++++++++++++++- .../controllers/goods_base_controller.dart | 149 ++++++++---- lib/modules/goods/views/goodsai_view.dart | 147 ++++++------ lib/modules/settings/views/settings_view.dart | 4 +- pubspec.yaml | 3 +- 5 files changed, 397 insertions(+), 124 deletions(-) diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index 62f823e0b..1f8fe1882 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -3,6 +3,9 @@ import 'dart:convert'; import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:in_app_purchase_android/in_app_purchase_android.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../../data/services/network/api.dart'; import 'package:tobias/tobias.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -22,6 +25,9 @@ class PayService extends GetxService { StreamSubscription>? _iapSubscription; final RxBool iapAvailable = false.obs; PaymentResultCallback? _iapOnResult; + // 最近一次 IAP 购买上下文,用于主动查询时携带验证参数 + PurchaseDetails? _lastIapPurchase; + ProductDetails? _lastIapProduct; String? get lastOrderId => _lastOrderId; @@ -169,11 +175,35 @@ class PayService extends GetxService { return false; } try { - final purchaseParam = PurchaseParam(productDetails: product); - final ok = await _inAppPurchase.buyConsumable( - purchaseParam: purchaseParam, - autoConsume: true, - ); + // 记录最近一次用于购买的商品详情,便于后续构建查询参数 + _lastIapProduct = product; + final isAndroid = + !kIsWeb && defaultTargetPlatform == TargetPlatform.android; + bool ok; + if (isAndroid && product is GooglePlayProductDetails) { + // 通过环境变量决定订阅或一次性商品路径,避免访问不兼容的属性 + final isSubscription = + _getEnvInt('APP_IAP_GOOGLE_IS_SUBSCRIPTION', defaultValue: 0) == 1; + if (isSubscription) { + print('[IAP-android] 订阅商品(ENV),使用 buyNonConsumable'); + final gpParam = GooglePlayPurchaseParam(productDetails: product); + ok = await _inAppPurchase.buyNonConsumable(purchaseParam: gpParam); + } else { + // 普通一次性/消耗型商品,使用 buyConsumable + final purchaseParam = PurchaseParam(productDetails: product); + ok = await _inAppPurchase.buyConsumable( + purchaseParam: purchaseParam, + autoConsume: true, + ); + } + } else { + // iOS 或非订阅商品,按消耗型处理(如需支持 iOS 订阅,可通过 ENV 切换调用 buyNonConsumable) + final purchaseParam = PurchaseParam(productDetails: product); + ok = await _inAppPurchase.buyConsumable( + purchaseParam: purchaseParam, + autoConsume: true, + ); + } if (!ok) { onResult?.call(false, '无法发起内购'); } else { @@ -188,11 +218,17 @@ class PayService extends GetxService { Future _handlePurchaseUpdates(List detailsList) async { for (final details in detailsList) { + // 记录最近一次 IAP 购买详情 + _lastIapPurchase = details; + print( + '[IAP] 更新: status=${details.status} product=${details.productID} purchaseID=${details.purchaseID} error=${details.error}'); switch (details.status) { case PurchaseStatus.pending: _iapOnResult?.call(true, '支付处理中…'); break; case PurchaseStatus.error: + print( + '[IAP] 错误: code=${details.error?.code} message=${details.error?.message}'); _iapOnResult?.call(false, details.error?.message ?? '支付错误'); break; case PurchaseStatus.purchased: @@ -250,6 +286,66 @@ class PayService extends GetxService { } } + /// 构建 Apple/Google 主动查询(pay_askorder)所需的验证参数 + /// 返回与后端 PayAskOrCancelReq 对应的 Map + Future> buildIapAskParams() async { + final params = {}; + if (_lastOrderId != null && _lastOrderId!.isNotEmpty) { + params['order_id'] = _lastOrderId; + } + + final platform = _platformString(); + if (platform == 'ios') { + final receiptOrData = + _lastIapPurchase?.verificationData.serverVerificationData ?? ''; + final txId = _lastIapPurchase?.purchaseID ?? ''; + // 是否按交易ID校验,默认 false,可通过环境变量开启 + final useTxIdEnv = _getEnvBool('APP_IAP_USE_TXID', defaultValue: false); + // 沙箱标识,默认在非发布模式下认为是沙箱;支持环境变量覆盖 + final sandbox = + _getEnvBool('APP_IAP_SANDBOX', defaultValue: !kReleaseMode); + params['apple_receipt_data'] = useTxIdEnv ? txId : receiptOrData; + params['apple_use_transaction_id'] = useTxIdEnv; + params['apple_sandbox'] = sandbox; + } else if (platform == 'android') { + final packageInfo = await PackageInfo.fromPlatform(); + final pkg = packageInfo.packageName; + final token = + _lastIapPurchase?.verificationData.serverVerificationData ?? ''; + final productId = + _lastIapPurchase?.productID ?? _lastIapProduct?.id ?? ''; + // 订阅标识,默认 false;如需严格区分,可在商品元数据或环境变量中配置 + final isSub = + _getEnvBool('APP_IAP_GOOGLE_IS_SUBSCRIPTION', defaultValue: false); + params['google_package_name'] = pkg; + params['google_product_id'] = productId; + params['google_purchase_token'] = token; + params['google_is_subscription'] = isSub; + } + return params; + } + + bool _getEnvBool(String key, {required bool defaultValue}) { + try { + final v = dotenv.env[key]; + if (v != null && v.isNotEmpty) { + final low = v.toLowerCase(); + return low == 'true' || low == '1' || low == 'yes'; + } + } catch (_) {} + return defaultValue; + } + + int _getEnvInt(String key, {required int defaultValue}) { + try { + final v = dotenv.env[key]; + if (v != null && v.isNotEmpty) { + return int.tryParse(v.trim()) ?? defaultValue; + } + } catch (_) {} + return defaultValue; + } + String _platformString() { if (kIsWeb) return 'web'; switch (defaultTargetPlatform) { @@ -397,7 +493,7 @@ class PayService extends GetxService { 'product_name': productName, 'product_desc': productDesc ?? '', 'amount': amount, - 'payment_method': paymentMethod, + 'payment_method': 4, 'client_ip': clientIp ?? '', 'notify_url': notifyUrl ?? '', 'extra_data': extraData ?? '', @@ -517,7 +613,6 @@ class PayService extends GetxService { productName: description, productDesc: description, amount: amount, - paymentMethod: 3, // 支付宝支付 notifyUrl: 'https://api.ideapsound.com/api/home/pay_alipaynotify', ); @@ -612,7 +707,6 @@ class PayService extends GetxService { required String productName, String? productDesc, required int amount, - int paymentMethod = 3, // 2表示支付宝 String? clientIp, String? notifyUrl, String? extraData, @@ -624,7 +718,7 @@ class PayService extends GetxService { 'product_name': productName, 'product_desc': productDesc ?? '', 'amount': amount, - 'payment_method': paymentMethod, + 'payment_method': 3, 'client_ip': clientIp ?? '', 'notify_url': notifyUrl ?? '', 'extra_data': extraData ?? '', @@ -679,7 +773,6 @@ class PayService extends GetxService { required String productName, String? productDesc, required int amount, - int paymentMethod = 5, // 约定:5 表示 PayPal String? clientIp, String? notifyUrl, String? extraData, @@ -690,7 +783,7 @@ class PayService extends GetxService { 'product_name': productName, 'product_desc': productDesc ?? '', 'amount': amount, - 'payment_method': paymentMethod, + 'payment_method': 5, 'client_ip': clientIp ?? '', 'notify_url': notifyUrl ?? '', 'extra_data': extraData ?? '', @@ -828,7 +921,6 @@ class PayService extends GetxService { productName: description, productDesc: description, amount: amount, - paymentMethod: 5, notifyUrl: 'https://api.ideapsound.com/api/home/pay_paypalnotify', ); @@ -843,4 +935,106 @@ class PayService extends GetxService { return false; } } + + /// 创建 Apple 内购订单,仅用于在服务端生成并记录订单号,后续回查使用 + /// 返回服务端生成的 `order_id`,若失败则返回 null + Future createAppleIapOrder({ + required String productId, + required String productName, + String? productDesc, + required int amount, + }) async { + try { + final resp = await Api.paycreateorder({ + 'product_id': productId, + 'product_name': productName, + 'product_desc': productDesc ?? '', + 'amount': amount, + 'payment_method': 6, + }); + if (resp != null) { + String? orderId; + const candidates = [ + 'order_id', + 'orderId', + 'out_trade_no', + 'outTradeNo' + ]; + for (final k in candidates) { + final v = resp[k]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + if (orderId == null && resp['data'] is Map) { + final data = resp['data'] as Map; + for (final k in candidates) { + final v = data[k]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + } + _lastOrderId = orderId; + return orderId; + } + return null; + } catch (e) { + print('创建 Apple IAP 订单异常: $e'); + return null; + } + } + + /// 创建 Google 内购订单,仅用于在服务端生成并记录订单号,后续回查使用 + /// 返回服务端生成的 `order_id`,若失败则返回 null + Future createGoogleIapOrder({ + required String productId, + required String productName, + String? productDesc, + required int amount, + }) async { + try { + final resp = await Api.paycreateorder({ + 'product_id': productId, + 'product_name': productName, + 'product_desc': productDesc ?? '', + 'amount': amount, + 'payment_method': 7, + }); + if (resp != null) { + String? orderId; + const candidates = [ + 'order_id', + 'orderId', + 'out_trade_no', + 'outTradeNo' + ]; + for (final k in candidates) { + final v = resp[k]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + if (orderId == null && resp['data'] is Map) { + final data = resp['data'] as Map; + for (final k in candidates) { + final v = data[k]; + if (v is String && v.isNotEmpty) { + orderId = v; + break; + } + } + } + _lastOrderId = orderId; + return orderId; + } + return null; + } catch (e) { + print('创建 Google IAP 订单异常: $e'); + return null; + } + } } diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index f2a0aec77..0ff6faf38 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -455,55 +455,93 @@ abstract class GoodsBaseController extends GetxController { /// 指定 Apple 内购(App Store IAP) Future payAppleIAP(DBGoods item, {PaymentResultCallback? onResult}) async { - // 使用商品id作为内购的 productId(与后台保持一致) - final productId = item.id; - return _payService.processApplePayment( - productId: productId, - onResult: (success, msg) { - // 透传并根据阶段展示 - onResult?.call(success, msg); - if (!success) { - _showPayResultDialog(false, msg); - } else { - // 支付成功或额度待刷新时弹窗,其余阶段用轻提示 - final showDialog = msg.contains('支付成功'); - if (showDialog) { - _showPayResultDialog(true, msg); + try { + // 先创建服务端订单,记录 order_id 以便后续回查 + final orderId = await _payService.createAppleIapOrder( + productId: item.id, + productName: item.name, + productDesc: item.desc, + amount: item.price, + ); + if (orderId == null || orderId.isEmpty) { + onResult?.call(false, '创建 Apple 订单失败'); + return false; + } + + // 使用商品id作为内购的 productId(与后台保持一致) + final productId = item.id; + return _payService.processApplePayment( + productId: productId, + onResult: (success, msg) { + // 透传并根据阶段展示 + onResult?.call(success, msg); + if (!success) { + _showPayResultDialog(false, msg); } else { - Get.snackbar('提示', msg, - snackPosition: SnackPosition.BOTTOM, - margin: const EdgeInsets.all(12)); + // 支付成功或额度待刷新时弹窗,其余阶段用轻提示 + final showDialog = msg.contains('支付成功'); + if (showDialog) { + _showPayResultDialog(true, msg); + // 仅在支付成功阶段,携带校验参数主动查询订单 + _askOrderWithIapVerification(); + } else { + Get.snackbar('提示', msg, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + } } - } - }, - ); + }, + ); + } catch (e) { + onResult?.call(false, 'Apple 内购异常: $e'); + return false; + } } /// 指定 Google Play 内购(Play Billing IAP) Future payGoogleIAP(DBGoods item, {PaymentResultCallback? onResult}) async { - // 使用商品id作为内购的 productId(与后台保持一致) - final productId = item.id; - // 调试:查询并打印当前商品的内购详情,便于确认 ID - await _payService.debugQueryProducts({productId}); - return _payService.processGooglePayment( - productId: productId, - onResult: (success, msg) { - onResult?.call(success, msg); - if (!success) { - _showPayResultDialog(false, msg); - } else { - final showDialog = msg.contains('支付成功'); - if (showDialog) { - _showPayResultDialog(true, msg); + try { + // 先创建服务端订单,记录 order_id 以便后续回查 + final orderId = await _payService.createGoogleIapOrder( + productId: item.id, + productName: item.name, + productDesc: item.desc, + amount: item.price, + ); + if (orderId == null || orderId.isEmpty) { + onResult?.call(false, '创建 Google 订单失败'); + return false; + } + + // 使用商品id作为内购的 productId(与后台保持一致) + final productId = item.id; + // 调试:查询并打印当前商品的内购详情,便于确认 ID + await _payService.debugQueryProducts({productId}); + return _payService.processGooglePayment( + productId: productId, + onResult: (success, msg) { + onResult?.call(success, msg); + if (!success) { + _showPayResultDialog(false, msg); } else { - Get.snackbar('提示', msg, - snackPosition: SnackPosition.BOTTOM, - margin: const EdgeInsets.all(12)); + final showDialog = msg.contains('支付成功'); + if (showDialog) { + _showPayResultDialog(true, msg); + // 仅在支付成功阶段,携带校验参数主动查询订单 + _askOrderWithIapVerification(); + } else { + Get.snackbar('提示', msg, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + } } - } - }, - ); + }, + ); + } catch (e) { + onResult?.call(false, 'Google 内购异常: $e'); + return false; + } } /// 调试:打印当前页面所有商品的 Google IAP 查询结果 @@ -565,6 +603,37 @@ abstract class GoodsBaseController extends GetxController { _showPayResultDialog(success, message); } + /// Apple/Google 内购:无法监听平台回调时,主动查询订单并携带验证数据 + Future _askOrderWithIapVerification() async { + try { + final params = await _payService.buildIapAskParams(); + final resp = await Api.payaskorder(params); + print('[IAP] 主动查询订单 resp: $resp'); + final order = resp?['order'] as Map?; + final user = resp?['user'] as Map?; + if (order != null) { + final orderStatus = order['status']; + if (orderStatus == 1 && user != null) { + User.instance.updateUserInfo(user); + Get.snackbar('提示', '订单已确认,额度已刷新', + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + return; + } + } + // 若未确认成功,尝试回拉用户信息确保额度同步 + try { + final response = await Api.tokenlogin(); + if (response is Map && response['user'] is Map) { + User.instance + .updateUserInfo(response['user'] as Map); + } + } catch (_) {} + } catch (e) { + print('[IAP] 主动查询订单异常: $e'); + } + } + void _showPayResultDialog(bool success, String message) { final context = Get.context; final isDark = diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index c53c9442c..edc1cf688 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsai_controller.dart'; @@ -228,73 +229,83 @@ class GoodsaiView extends GetView { ), ), SizedBox(height: 10.h), - Wrap( - spacing: 12.w, - runSpacing: 12.h, - alignment: WrapAlignment.start, - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - _buildFeatureCard( - isDarkMode, - icon: Icons.music_note, - title: '听歌与推荐', - lines: [ - '检索曲库、播放控制', - '智能推荐歌单与相似歌曲', - ], - colorSeed: Colors.purple, - ), - _buildFeatureCard( - isDarkMode, - icon: Icons.navigation, - title: '导航与路线', - lines: [ - '路线规划与拥堵规避', - '语音播报与途径点设置', - ], - colorSeed: Colors.orange, - ), - _buildFeatureCard( - isDarkMode, - icon: Icons.wb_sunny, - title: '天气查询', - lines: [ - '实时天气与预报', - '穿衣建议与出行提醒', - ], - colorSeed: Colors.blue, - ), - _buildFeatureCard( - isDarkMode, - icon: Icons.place, - title: '附近搜索', - lines: [ - '餐饮/加油/停车等地点检索', - '评分、营业时间与路线直达', - ], - colorSeed: Colors.green, - ), - _buildFeatureCard( - isDarkMode, - icon: Icons.newspaper, - title: '新闻资讯', - lines: [ - '热点快讯与专题速览', - '长文总结与要点提炼', - ], - colorSeed: Colors.indigo, - ), - _buildFeatureCard( - isDarkMode, - icon: Icons.call, - title: '通讯助手', - lines: [ - '帮忙拨打电话与发短信', - '模板消息与日程提醒', - ], - colorSeed: Colors.teal, - ), - ], + MasonryGridView.count( + crossAxisCount: 2, + mainAxisSpacing: 12.h, + crossAxisSpacing: 12.w, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: 6, + itemBuilder: (context, index) { + switch (index) { + case 0: + return _buildFeatureCard( + isDarkMode, + icon: Icons.music_note, + title: '听歌与推荐', + lines: [ + '检索曲库、播放控制', + '智能推荐歌单与相似歌曲', + ], + colorSeed: Colors.purple, + ); + case 1: + return _buildFeatureCard( + isDarkMode, + icon: Icons.navigation, + title: '导航与路线', + lines: [ + '路线规划与拥堵规避', + '语音播报与途径点设置', + ], + colorSeed: Colors.orange, + ); + case 2: + return _buildFeatureCard( + isDarkMode, + icon: Icons.wb_sunny, + title: '天气查询', + lines: [ + '实时天气与预报', + '穿衣建议与出行提醒', + ], + colorSeed: Colors.blue, + ); + case 3: + return _buildFeatureCard( + isDarkMode, + icon: Icons.place, + title: '附近搜索', + lines: [ + '餐饮/加油/停车等地点检索', + '评分、营业时间与路线直达', + ], + colorSeed: Colors.green, + ); + case 4: + return _buildFeatureCard( + isDarkMode, + icon: Icons.newspaper, + title: '新闻资讯', + lines: [ + '热点快讯与专题速览', + '长文总结与要点提炼', + ], + colorSeed: Colors.indigo, + ); + default: + return _buildFeatureCard( + isDarkMode, + icon: Icons.call, + title: '通讯助手', + lines: [ + '帮忙拨打电话与发短信', + '模板消息与日程提醒', + ], + colorSeed: Colors.teal, + ); + } + }, ), SizedBox(height: 12.h), Text( @@ -349,9 +360,7 @@ class GoodsaiView extends GetView { final bgColor = isDarkMode ? Colors.grey[900] : Colors.white; final mainColor = isDarkMode ? colorSeed[300]! : colorSeed[600]!; final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; - final width = (Get.width - 16.w * 2 - 12.w) / 2; return Container( - width: width, padding: EdgeInsets.all(12.w), decoration: BoxDecoration( color: bgColor, diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index a94493ef4..febe0493c 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -265,7 +265,7 @@ class SettingsView extends GetView { onTap: () => Get.toNamed(Routes.goodstrade), ), _buildCategoryItem( - icon: Icons.people_alt, + icon: Icons.file_open, label: "Meet", iconBg: isDarkMode ? Colors.pink[900]!.withOpacity(0.3) @@ -274,7 +274,7 @@ class SettingsView extends GetView { onTap: () => Get.toNamed(Routes.goodsmeet), ), _buildCategoryItem( - icon: Icons.auto_awesome, + icon: Icons.smart_toy, label: "AI", iconBg: isDarkMode ? Colors.teal[900]!.withOpacity(0.3) diff --git a/pubspec.yaml b/pubspec.yaml index 7f00789b2..52bdd5bc4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.18+53 +version: 1.0.18+54 environment: sdk: ">=3.3.0 <4.0.0" @@ -19,6 +19,7 @@ dependencies: get_storage: ^2.1.1 http: ^1.3.0 flutter_screenutil: ^5.9.0 + flutter_staggered_grid_view: ^0.7.0 path_provider: ^2.1.5 audio_session: ^0.1.18 flutter_markdown: ^0.7.7+1 From 58bdcf2226fec4a84d9f245fb47418cada0172f6 Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Mon, 17 Nov 2025 15:15:52 +0800 Subject: [PATCH 026/177] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/ble_manager.dart | 73 +++++++++++++- .../ble_service/BleCommandSender.kt | 96 ++++++++++--------- 2 files changed, 123 insertions(+), 46 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index a94fd434f..ae6bedbb1 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -26,6 +26,67 @@ class BleCommands { static const int CONTROL_CODEC = 0x05; } +/// 判断编解码控制指令是否成功 +/// +/// 根据 rawData 第二字节是否为非 0 来判断: +/// - 成功:第二字节不为 0 +/// - 失败或无法解析:返回 false +bool _isCodecControlSuccess(Map data) { + final dynamic raw = data['rawData']; + if (raw == null) return false; + + int? secondByte; + + if (raw is List) { + if (raw.length >= 2) { + final s = raw[1]; + if (s is int) { + secondByte = s; + } else if (s is num) { + secondByte = s.toInt(); + } else if (s is String) { + final t = s.trim(); + if (t.startsWith('0x') || t.startsWith('0X')) { + secondByte = int.tryParse(t.substring(2), radix: 16); + } else { + secondByte = int.tryParse(t); + } + } + } + } else if (raw is String) { + final normalized = raw.trim().replaceAll('[', '').replaceAll(']', ''); + final parts = + normalized.split(RegExp(r'[,\s]+')).where((e) => e.isNotEmpty).toList(); + if (parts.length >= 2) { + final t = parts[1].trim(); + if (t.startsWith('0x') || t.startsWith('0X')) { + secondByte = int.tryParse(t.substring(2), radix: 16); + } else { + secondByte = int.tryParse(t); + } + } + } else if (raw is Map) { + final dynamic s = raw['second'] ?? raw['status2'] ?? raw['result']; + if (s is int) { + secondByte = s; + } else if (s is num) { + secondByte = s.toInt(); + } else if (s is String) { + final t = s.trim(); + if (t.startsWith('0x') || t.startsWith('0X')) { + secondByte = int.tryParse(t.substring(2), radix: 16); + } else { + secondByte = int.tryParse(t); + } + } + } else { + // 无法解析的类型 + return false; + } + + return secondByte != null && secondByte != 0; +} + /// 蓝牙设备信息缓存模型 class DeviceInfo { final String address; @@ -305,7 +366,17 @@ class BleManager extends GetxService { Logger.info('lxm--处理编解码控制命令'); // 处理通话状态 print(" CONTROL_CODEC: $commandId,$data"); - //_isCall.value = data['callStatus'] as bool? ?? false; + + final bool codecSuccess = _isCodecControlSuccess(data); + + if (codecSuccess) { + print("lxm--编解码控制成功 (rawData 第二字节非 0)"); + Logger.info('lxm--编解码控制成功 (rawData 第二字节非 0)'); + } else { + print("lxm--编解码控制失败 (rawData 为 [162, 0] 或无法解析)"); + Logger.warning('lxm--编解码控制失败 (rawData 为 [162, 0] 或无法解析)'); + } + break; default: Logger.warning('lxm--未处理的命令ID: $commandId,数据: $data'); diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt index 692f83ada..fba29431d 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt @@ -183,8 +183,13 @@ class BleCommandSender { } /** - * 处理设备响应数据 - 从BleService移动过来 - * @param data 响应数据 + * 处理设备响应数据(统一兼容失败无长度的场景) + * + * 帧格式通常为: [HEADER(0)=0xBB][CMD(1)][LEN/STATUS(2)][DATA(len)][CRC(最后1字节)] + * - 当 LEN/STATUS 为 0(例如收到 0xA2, 0x00),表示该命令执行失败,直接回调失败并返回。 + * - 正常响应时进行 CRC 校验(若帧长度不足则跳过校验并告警),拷贝数据使用安全长度以避免越界。 + * + * @param data 设备返回的原始字节数组 */ @SuppressLint("StaticFieldLeak") @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT) @@ -200,63 +205,64 @@ class BleCommandSender { val header = data[0] // 0xBB val cmdType = data[1].toInt() and 0xFF - - // 判断命令失败响应(长度为0) - if (data.size == 4 && data[2].toInt() and 0xFF == 0) { - Log.w(TAG, "命令 0x${cmdType.toString(16)} 执行失败") - // 创建失败结果Map - val resultMap = mapOf( - "success" to false, - "command" to cmdType, - "rawData" to byteArrayOf() - ) - callback?.notifyDeviceInfoReceived(cmdType, resultMap) - // 通知指令发送器处理响应 - onCommandResponse(cmdType) - return + val lenByte = data[2].toInt() and 0xFF + + + + // 正常响应处理:尽量进行 CRC 校验 + var crcOk = true + if (data.size >= 4) { + val payload = data.sliceArray(0 until data.size - 1) + val calculatedCrc = calculateCrc8Maxim(payload, payload.size) + val receivedCrc = data[data.size - 1].toInt() and 0xFF + crcOk = (calculatedCrc.toInt() and 0xFF) == receivedCrc + if (!crcOk) { + Log.e( + TAG, + "设备响应CRC校验失败: 计算=${calculatedCrc.toInt() and 0xFF}, 接收=${receivedCrc}" + ) + return + } + } else { + Log.w(TAG, "设备响应长度不足以包含CRC,跳过CRC校验") } + // 统一失败判定 + if (lenByte != data.size-4) { + Log.w(TAG, "命令 0x${cmdType.toString(16)} 执行失败(无数据长度)") + val resultMap = mapOf( + "success" to true, + "command" to cmdType, + "rawData" to byteArrayOf(data[2], data[data.size - 2]) // 取第二位和倒数第二位 + ) + callback?.notifyDeviceInfoReceived(cmdType, resultMap) + onCommandResponse(cmdType) + return + } + // 安全提取响应数据,避免越界 + val actualPayloadLen = (data.size - 4).coerceAtLeast(0) + val copyLen = minOf(lenByte, actualPayloadLen) + val responseData = if (copyLen > 0) ByteArray(copyLen) else ByteArray(0) - // 正常响应处理 - val length = data[2].toInt() and 0xFF - - // // 检查数据长度 - // if (data.size != length + 4) { // 帧头 + 命令 + 长度 + 数据 + CRC - // Log.e(TAG, "设备响应数据长度不匹配: 期望=${length + 4}, 实际=${data.size}") - // return - // } - - // 计算CRC校验 - 修正:计算除最后一个CRC字节外的所有字节 - val payload = data.sliceArray(0 until data.size - 1) - val calculatedCrc = calculateCrc8Maxim(payload, payload.size) - val receivedCrc = data[data.size - 1].toInt() and 0xFF - - if (calculatedCrc.toInt() and 0xFF != receivedCrc) { - Log.e( + if (copyLen < lenByte) { + Log.w( TAG, - "设备响应CRC校验失败: 计算=${calculatedCrc.toInt() and 0xFF}, 接收=${receivedCrc}" + "响应长度字段(${lenByte})与实际负载长度(${actualPayloadLen})不一致,按实际长度处理" ) - return } - // 提取响应数据 - val responseData = if (length > 0) ByteArray(length) else ByteArray(0) - if (length > 0) { - System.arraycopy(data, 3, responseData, 0, length) + if (copyLen > 0) { + System.arraycopy(data, 3, responseData, 0, copyLen) } Log.d( TAG, "收到设备响应: CMD=0x${cmdType.toString(16)}, 数据=${ - responseData.joinToString(", ") { - "0x${ - (it.toInt() and 0xFF).toString(16) - }" - } + responseData.joinToString(", ") { "0x${(it.toInt() and 0xFF).toString(16)}" } }" ) - // 通知指令发送器处理响应 + onCommandResponse(cmdType) - // 根据命令类型处理不同的响应 + when (cmdType) { BleConst.CMD_GET_VERSION -> { val resultMap = mutableMapOf( From 9ec455c79979d82371dc541b487efd427b36c775 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 15 Nov 2025 16:27:09 +0800 Subject: [PATCH 027/177] =?UTF-8?q?feat(usage):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=BD=BF=E7=94=A8=E7=BB=9F=E8=AE=A1=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E5=8C=85=E6=8B=AC=E8=A7=86=E5=9B=BE=E3=80=81?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E5=92=8C=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现翻译使用统计功能,包含以下主要组件: 1. 翻译统计视图,展示实时和历史使用数据 2. 翻译统计控制器,处理数据加载和业务逻辑 3. 翻译成本控制器,管理成本配置和阈值设置 4. 相关绑定类,用于依赖注入 模块支持查看今日、本周、本月和历史统计数据,包括API调用次数、数据量和成本分析 --- .../bindings/translation_stats_binding.dart | 10 +-- .../translation_cost_controller.dart | 84 +++++-------------- .../translation_stats_controller.dart | 62 ++++---------- .../views/translation_stats_view.dart | 55 +++--------- lib/routes/app_pages.dart | 4 +- 5 files changed, 52 insertions(+), 163 deletions(-) rename lib/modules/{translation => usage}/bindings/translation_stats_binding.dart (66%) rename lib/modules/{translation => usage}/controllers/translation_cost_controller.dart (78%) rename lib/modules/{translation => usage}/controllers/translation_stats_controller.dart (84%) rename lib/modules/{translation => usage}/views/translation_stats_view.dart (94%) diff --git a/lib/modules/translation/bindings/translation_stats_binding.dart b/lib/modules/usage/bindings/translation_stats_binding.dart similarity index 66% rename from lib/modules/translation/bindings/translation_stats_binding.dart rename to lib/modules/usage/bindings/translation_stats_binding.dart index 45c2824b1..6f0008d97 100644 --- a/lib/modules/translation/bindings/translation_stats_binding.dart +++ b/lib/modules/usage/bindings/translation_stats_binding.dart @@ -2,18 +2,12 @@ import 'package:get/get.dart'; import '../controllers/translation_stats_controller.dart'; import '../../../data/services/translation_usage_service.dart'; -//翻译统计页面依赖绑定 class TranslationStatsBinding implements Bindings { @override void dependencies() { - // 确保服务已注册 if (!Get.isRegistered()) { Get.put(TranslationUsageService(), permanent: true); } - - // 注册控制器 - Get.lazyPut( - () => TranslationStatsController(), - ); + Get.lazyPut(() => TranslationStatsController()); } -} +} \ No newline at end of file diff --git a/lib/modules/translation/controllers/translation_cost_controller.dart b/lib/modules/usage/controllers/translation_cost_controller.dart similarity index 78% rename from lib/modules/translation/controllers/translation_cost_controller.dart rename to lib/modules/usage/controllers/translation_cost_controller.dart index 75b7fccff..90c9ac688 100644 --- a/lib/modules/translation/controllers/translation_cost_controller.dart +++ b/lib/modules/usage/controllers/translation_cost_controller.dart @@ -3,25 +3,18 @@ import 'package:flutter/material.dart'; import '../../../data/services/translation_usage_service.dart'; import '../../../core/utils/logger.dart'; -/// 翻译成本配置控制器 class TranslationCostController extends GetxController { - // 依赖注入 - final TranslationUsageService _usageService = Get.find(); - - // 成本配置 + final TranslationUsageService _usageService = + Get.find(); final RxMap costConfig = {}.obs; final RxDouble dailyCostThreshold = 10.0.obs; final RxDouble monthlyCostThreshold = 300.0.obs; - - // 表单控制器 final translationCostController = TextEditingController(); final asrCostController = TextEditingController(); final ttsCostController = TextEditingController(); final aiSummaryCostController = TextEditingController(); final dailyThresholdController = TextEditingController(); final monthlyThresholdController = TextEditingController(); - - // 状态变量 final isLoading = false.obs; final isSaving = false.obs; @@ -33,7 +26,6 @@ class TranslationCostController extends GetxController { @override void onClose() { - // 释放控制器 translationCostController.dispose(); asrCostController.dispose(); ttsCostController.dispose(); @@ -43,24 +35,22 @@ class TranslationCostController extends GetxController { super.onClose(); } - /// 加载当前配置 void _loadCurrentConfig() { isLoading.value = true; - try { - // 从服务获取当前配置 costConfig.value = Map.from(_usageService.costConfig); dailyCostThreshold.value = _usageService.dailyCostThreshold.value; monthlyCostThreshold.value = _usageService.monthlyCostThreshold.value; - - // 更新表单控制器 - translationCostController.text = (costConfig['translation_per_1k_chars'] ?? 0.05).toString(); - asrCostController.text = (costConfig['asr_per_minute'] ?? 0.02).toString(); - ttsCostController.text = (costConfig['tts_per_1k_chars'] ?? 0.03).toString(); - aiSummaryCostController.text = (costConfig['ai_summary_per_request'] ?? 0.01).toString(); + translationCostController.text = + (costConfig['translation_per_1k_chars'] ?? 0.05).toString(); + asrCostController.text = + (costConfig['asr_per_minute'] ?? 0.02).toString(); + ttsCostController.text = + (costConfig['tts_per_1k_chars'] ?? 0.03).toString(); + aiSummaryCostController.text = + (costConfig['ai_summary_per_request'] ?? 0.01).toString(); dailyThresholdController.text = dailyCostThreshold.value.toString(); monthlyThresholdController.text = monthlyCostThreshold.value.toString(); - Logger.info('成本配置加载完成'); } catch (e) { Logger.error('加载成本配置失败: $e'); @@ -70,44 +60,32 @@ class TranslationCostController extends GetxController { } } - /// 保存配置 Future saveConfig() async { if (isSaving.value) return; - isSaving.value = true; - try { - // 验证输入 if (!_validateInputs()) { return; } - - // 更新成本配置 final newCostConfig = { - 'translation_per_1k_chars': double.parse(translationCostController.text), + 'translation_per_1k_chars': + double.parse(translationCostController.text), 'asr_per_minute': double.parse(asrCostController.text), 'tts_per_1k_chars': double.parse(ttsCostController.text), 'ai_summary_per_request': double.parse(aiSummaryCostController.text), }; - final newDailyThreshold = double.parse(dailyThresholdController.text); final newMonthlyThreshold = double.parse(monthlyThresholdController.text); - - // 保存到服务 _usageService.updateCostConfig(newCostConfig); _usageService.updateThresholds( dailyThreshold: newDailyThreshold, monthlyThreshold: newMonthlyThreshold, ); - - // 更新本地状态 costConfig.value = newCostConfig; dailyCostThreshold.value = newDailyThreshold; monthlyCostThreshold.value = newMonthlyThreshold; - _showSuccessSnackbar('配置保存成功'); Logger.info('成本配置保存成功'); - } catch (e) { Logger.error('保存成本配置失败: $e'); _showErrorSnackbar('保存配置失败'); @@ -116,7 +94,6 @@ class TranslationCostController extends GetxController { } } - /// 重置为默认配置 void resetToDefault() { translationCostController.text = '0.05'; asrCostController.text = '0.02'; @@ -124,11 +101,9 @@ class TranslationCostController extends GetxController { aiSummaryCostController.text = '0.01'; dailyThresholdController.text = '10.0'; monthlyThresholdController.text = '300.0'; - _showInfoSnackbar('已重置为默认配置,请点击保存生效'); } - /// 验证输入 bool _validateInputs() { try { final translationCost = double.parse(translationCostController.text); @@ -137,22 +112,21 @@ class TranslationCostController extends GetxController { final aiSummaryCost = double.parse(aiSummaryCostController.text); final dailyThreshold = double.parse(dailyThresholdController.text); final monthlyThreshold = double.parse(monthlyThresholdController.text); - - if (translationCost < 0 || asrCost < 0 || ttsCost < 0 || aiSummaryCost < 0) { + if (translationCost < 0 || + asrCost < 0 || + ttsCost < 0 || + aiSummaryCost < 0) { _showErrorSnackbar('成本不能为负数'); return false; } - if (dailyThreshold < 0 || monthlyThreshold < 0) { _showErrorSnackbar('预警阈值不能为负数'); return false; } - if (dailyThreshold > monthlyThreshold) { _showErrorSnackbar('日预警阈值不能大于月预警阈值'); return false; } - return true; } catch (e) { _showErrorSnackbar('请输入有效的数字'); @@ -160,13 +134,10 @@ class TranslationCostController extends GetxController { } } - /// 计算预估月成本 double calculateEstimatedMonthlyCost() { try { final dailyStats = _usageService.todayStats.value; if (dailyStats.estimatedCost == 0) return 0.0; - - // 简单按30天计算 return dailyStats.estimatedCost * 30; } catch (e) { Logger.error('计算预估月成本失败: $e'); @@ -174,84 +145,69 @@ class TranslationCostController extends GetxController { } } - /// 获取成本节约建议 List getCostSavingTips() { final tips = []; - try { final dailyStats = _usageService.todayStats.value; - - // 基于使用情况给出建议 if (dailyStats.translationApiCalls > 100) { tips.add('考虑批量翻译以减少API调用次数'); } - if (dailyStats.ttsApiCalls > 50) { tips.add('可以关闭自动语音播放以节省TTS成本'); } - if (dailyStats.aiSummaryApiCalls > 10) { tips.add('AI摘要功能按需使用,避免频繁调用'); } - - if (dailyStats.effectiveAudioDuration > 3600) { // 超过1小时 + if (dailyStats.effectiveAudioDuration > 3600) { tips.add('长时间录音会增加ASR成本,建议分段录音'); } - if (tips.isEmpty) { tips.add('您的使用习惯很好,继续保持!'); } - } catch (e) { Logger.error('获取成本节约建议失败: $e'); tips.add('暂无建议'); } - return tips; } - /// 显示成功提示 void _showSuccessSnackbar(String message) { Get.snackbar( '成功', message, snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.primary.withOpacity(0.1), + backgroundColor: Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, duration: const Duration(seconds: 3), ); } - /// 显示错误提示 void _showErrorSnackbar(String message) { Get.snackbar( '错误', message, snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.error.withOpacity(0.1), + backgroundColor: Get.theme.colorScheme.error.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.error, duration: const Duration(seconds: 3), ); } - /// 显示信息提示 void _showInfoSnackbar(String message) { Get.snackbar( '提示', message, snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.surface.withOpacity(0.9), + backgroundColor: Get.theme.colorScheme.surface.withValues(alpha: 0.9), colorText: Get.theme.colorScheme.onSurface, duration: const Duration(seconds: 3), ); } - /// 格式化成本显示 String formatCost(double cost) { return '¥${cost.toStringAsFixed(2)}'; } - /// 格式化百分比显示 String formatPercentage(double percentage) { return '${percentage.toStringAsFixed(1)}%'; } diff --git a/lib/modules/translation/controllers/translation_stats_controller.dart b/lib/modules/usage/controllers/translation_stats_controller.dart similarity index 84% rename from lib/modules/translation/controllers/translation_stats_controller.dart rename to lib/modules/usage/controllers/translation_stats_controller.dart index 1e103b372..28bc75e21 100644 --- a/lib/modules/translation/controllers/translation_stats_controller.dart +++ b/lib/modules/usage/controllers/translation_stats_controller.dart @@ -1,21 +1,16 @@ import 'package:get/get.dart'; -import 'package:flutter/material.dart'; import '../../../data/services/translation_usage_service.dart'; import '../../../data/models/translation_usage_stats.dart'; import '../../../core/utils/logger.dart'; -/// 翻译统计页面控制器 class TranslationStatsController extends GetxController { - // 依赖注入 final TranslationUsageService _usageService = Get.find(); - // 状态变量 final isLoading = false.obs; - final selectedTabIndex = 0.obs; // 0=今日, 1=本周, 2=本月, 3=历史 + final selectedTabIndex = 0.obs; final selectedTimeRange = '今日'.obs; - // 统计数据 final Rx todayStats = TranslationUsageStats.empty('').obs; final Rx weekStats = @@ -25,15 +20,12 @@ class TranslationStatsController extends GetxController { final RxList historyStats = [].obs; - // 实时统计数据 RealtimeUsageStats get realtimeStats => _usageService.realtimeStats.value; - // 成本配置 final RxMap costConfig = {}.obs; final RxDouble dailyCostThreshold = 10.0.obs; final RxDouble monthlyCostThreshold = 300.0.obs; - // 图表数据 final RxList> chartData = >[].obs; @override @@ -42,9 +34,7 @@ class TranslationStatsController extends GetxController { _initializeData(); } - /// 初始化数据 void _initializeData() { - // 监听使用服务的数据变化 ever(_usageService.todayStats, (stats) { todayStats.value = stats; _updateChartData(); @@ -62,28 +52,21 @@ class TranslationStatsController extends GetxController { monthlyCostThreshold.value = threshold; }); - // 初始加载数据 loadAllStats(); } - /// 加载所有统计数据 Future loadAllStats() async { isLoading.value = true; try { - // 加载今日数据 todayStats.value = _usageService.todayStats.value; - // 加载本周数据 await _loadWeekStats(); - // 加载本月数据 await _loadMonthStats(); - // 加载历史数据(最近7天) await _loadHistoryStats(); - // 更新图表数据 _updateChartData(); Logger.info('统计数据加载完成'); @@ -93,7 +76,8 @@ class TranslationStatsController extends GetxController { '加载失败', '统计数据加载失败,请稍后重试', snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.error.withOpacity(0.1), + backgroundColor: + Get.theme.colorScheme.error.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.error, ); } finally { @@ -101,7 +85,6 @@ class TranslationStatsController extends GetxController { } } - /// 加载本周统计数据 Future _loadWeekStats() async { try { final now = DateTime.now(); @@ -119,7 +102,6 @@ class TranslationStatsController extends GetxController { } } - /// 加载本月统计数据 Future _loadMonthStats() async { try { final now = DateTime.now(); @@ -130,7 +112,6 @@ class TranslationStatsController extends GetxController { } } - /// 加载历史统计数据 Future _loadHistoryStats() async { try { final endDate = DateTime.now(); @@ -141,14 +122,12 @@ class TranslationStatsController extends GetxController { endDate: endDate, ); - // 按日期排序 historyStats.sort((a, b) => b.date.compareTo(a.date)); } catch (e) { Logger.error('加载历史统计失败: $e'); } } - /// 聚合统计数据 TranslationUsageStats _aggregateStats( List statsList, String period) { if (statsList.isEmpty) { @@ -181,13 +160,11 @@ class TranslationStatsController extends GetxController { totalSessions += stats.sessionCount; totalCost += stats.estimatedCost; - // 合并语言对使用统计(使用兼容性getter) stats.languagePairUsage.forEach((key, value) { combinedLanguagePairUsage[key] = (combinedLanguagePairUsage[key] ?? 0) + value; }); - // 合并模式使用统计(使用兼容性getter) stats.modeUsage.forEach((key, value) { combinedModeUsage[key] = (combinedModeUsage[key] ?? 0) + value; }); @@ -211,13 +188,11 @@ class TranslationStatsController extends GetxController { ); } - /// 更新图表数据 void _updateChartData() { final List> data = []; - // 根据选中的时间范围生成图表数据 switch (selectedTabIndex.value) { - case 0: // 今日 + case 0: data.add({ 'label': '今日', 'apiCalls': todayStats.value.totalApiCalls, @@ -225,7 +200,7 @@ class TranslationStatsController extends GetxController { 'characters': todayStats.value.totalCharacterCount, }); break; - case 1: // 本周 + case 1: data.add({ 'label': '本周', 'apiCalls': weekStats.value.totalApiCalls, @@ -233,7 +208,7 @@ class TranslationStatsController extends GetxController { 'characters': weekStats.value.totalCharacterCount, }); break; - case 2: // 本月 + case 2: data.add({ 'label': '本月', 'apiCalls': monthStats.value.totalApiCalls, @@ -241,7 +216,7 @@ class TranslationStatsController extends GetxController { 'characters': monthStats.value.totalCharacterCount, }); break; - case 3: // 历史 + case 3: for (final stats in historyStats.take(7)) { data.add({ 'label': '${stats.date.month}/${stats.date.day}', @@ -256,7 +231,6 @@ class TranslationStatsController extends GetxController { chartData.value = data; } - /// 切换时间范围 void switchTimeRange(int index) { selectedTabIndex.value = index; @@ -278,7 +252,6 @@ class TranslationStatsController extends GetxController { _updateChartData(); } - /// 获取当前显示的统计数据 TranslationUsageStats get currentStats { switch (selectedTabIndex.value) { case 0: @@ -292,32 +265,30 @@ class TranslationStatsController extends GetxController { } } - /// 刷新数据 Future refreshData() async { await loadAllStats(); } - /// 清理过期数据 void cleanupOldData() { _usageService.cleanupOldData(); Get.snackbar( '清理完成', '已清理90天前的过期数据', snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.primary.withOpacity(0.1), + backgroundColor: + Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, ); } - /// 导出统计数据 Future exportStats() async { try { - // TODO: 实现数据导出功能 Get.snackbar( '导出功能', '数据导出功能正在开发中', snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.primary.withOpacity(0.1), + backgroundColor: + Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, ); } catch (e) { @@ -325,27 +296,24 @@ class TranslationStatsController extends GetxController { } } - /// 格式化时长显示 String formatDuration(int seconds) { if (seconds < 60) { - return '${seconds}秒'; + return '$seconds秒'; } else if (seconds < 3600) { final minutes = seconds ~/ 60; final remainingSeconds = seconds % 60; - return '${minutes}分${remainingSeconds}秒'; + return '$minutes分$remainingSeconds秒'; } else { final hours = seconds ~/ 3600; final minutes = (seconds % 3600) ~/ 60; - return '${hours}小时${minutes}分'; + return '$hours小时$minutes分'; } } - /// 格式化成本显示 String formatCost(double cost) { return '¥${cost.toStringAsFixed(2)}'; } - /// 格式化数字显示 String formatNumber(int number) { if (number < 1000) { return number.toString(); @@ -355,4 +323,4 @@ class TranslationStatsController extends GetxController { return '${(number / 1000000).toStringAsFixed(1)}M'; } } -} +} \ No newline at end of file diff --git a/lib/modules/translation/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart similarity index 94% rename from lib/modules/translation/views/translation_stats_view.dart rename to lib/modules/usage/views/translation_stats_view.dart index 271bdeb31..b8f3cc995 100644 --- a/lib/modules/translation/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -4,7 +4,6 @@ import 'package:get/get.dart'; import '../controllers/translation_stats_controller.dart'; import '../../../core/theme/app_colors.dart'; -/// 翻译统计页面 class TranslationStatsView extends GetView { const TranslationStatsView({Key? key}) : super(key: key); @@ -21,7 +20,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建应用栏 PreferredSizeWidget _buildAppBar(bool isDarkMode) { return AppBar( leading: IconButton( @@ -35,7 +33,7 @@ class TranslationStatsView extends GetView { backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, title: Text( - '翻译统计', // translationStats + '翻译统计', style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -44,7 +42,6 @@ class TranslationStatsView extends GetView { ), centerTitle: true, actions: [ - // 刷新按钮 IconButton( icon: Icon( Icons.refresh, @@ -52,7 +49,6 @@ class TranslationStatsView extends GetView { ), onPressed: controller.refreshData, ), - // 更多操作菜单 PopupMenuButton( icon: Icon( Icons.more_vert, @@ -68,12 +64,12 @@ class TranslationStatsView extends GetView { break; } }, - itemBuilder: (context) => [ - const PopupMenuItem( + itemBuilder: (context) => const [ + PopupMenuItem( value: 'cleanup', child: Text('清理过期数据'), ), - const PopupMenuItem( + PopupMenuItem( value: 'export', child: Text('导出数据'), ), @@ -83,42 +79,32 @@ class TranslationStatsView extends GetView { ); } - /// 构建加载组件 Widget _buildLoadingWidget() { return const Center( child: CircularProgressIndicator(), ); } - /// 构建主体内容 Widget _buildBody(bool isDarkMode) { return Column( children: [ - // 时间范围选择器 _buildTimeRangeSelector(isDarkMode), - // 统计内容 Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(16.w), child: Column( children: [ - // 实时统计卡片 if (controller.selectedTabIndex.value == 0) _buildRealtimeStatsCard(isDarkMode), SizedBox(height: 16.h), - // 概览统计卡片 _buildOverviewCard(isDarkMode), SizedBox(height: 16.h), - // API调用统计 _buildApiCallsCard(isDarkMode), SizedBox(height: 16.h), - // 数据量统计 _buildDataVolumeCard(isDarkMode), SizedBox(height: 16.h), - // 成本统计 _buildCostCard(isDarkMode), SizedBox(height: 16.h), - // 使用行为统计 _buildUsageBehaviorCard(isDarkMode), ], ), @@ -128,7 +114,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建时间范围选择器 Widget _buildTimeRangeSelector(bool isDarkMode) { return Container( margin: EdgeInsets.all(16.w), @@ -137,7 +122,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -154,7 +139,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建时间范围标签 Widget _buildTimeRangeTab(String title, int index, bool isDarkMode) { final isSelected = controller.selectedTabIndex.value == index; @@ -185,7 +169,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建实时统计卡片 Widget _buildRealtimeStatsCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), @@ -194,7 +177,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -272,7 +255,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建概览卡片 Widget _buildOverviewCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), @@ -281,7 +263,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -358,7 +340,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建统计项 Widget _buildStatItem( String label, String value, IconData icon, bool isDarkMode) { return Column( @@ -389,7 +370,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建API调用统计卡片 Widget _buildApiCallsCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), @@ -398,7 +378,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -452,7 +432,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建API调用行 Widget _buildApiCallRow( String label, int count, IconData icon, bool isDarkMode) { return Row( @@ -484,7 +463,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建数据量统计卡片 Widget _buildDataVolumeCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), @@ -493,7 +471,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -575,7 +553,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建成本统计卡片 Widget _buildCostCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), @@ -584,7 +561,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -614,11 +591,10 @@ class TranslationStatsView extends GetView { SizedBox(height: 16.h), Obx(() => Column( children: [ - // 当前成本 Container( padding: EdgeInsets.all(12.w), decoration: BoxDecoration( - color: AppColors.primary.withOpacity(0.1), + color: AppColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(8.r), ), child: Row( @@ -645,7 +621,6 @@ class TranslationStatsView extends GetView { ), ), SizedBox(height: 12.h), - // 预警阈值 Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -694,7 +669,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建使用行为统计卡片 Widget _buildUsageBehaviorCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), @@ -703,7 +677,7 @@ class TranslationStatsView extends GetView { borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.05), + color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), @@ -733,7 +707,6 @@ class TranslationStatsView extends GetView { SizedBox(height: 16.h), Obx(() => Column( children: [ - // 最常用语言对 _buildUsageBehaviorRow( '最常用语言对', controller.currentStats.mostUsedLanguagePair, @@ -741,7 +714,6 @@ class TranslationStatsView extends GetView { isDarkMode, ), SizedBox(height: 12.h), - // 最常用翻译模式 _buildUsageBehaviorRow( '最常用模式', controller.currentStats.mostUsedMode, @@ -755,7 +727,6 @@ class TranslationStatsView extends GetView { ); } - /// 构建使用行为行 Widget _buildUsageBehaviorRow( String label, String value, IconData icon, bool isDarkMode) { return Row( @@ -786,4 +757,4 @@ class TranslationStatsView extends GetView { ], ); } -} +} \ No newline at end of file diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 757c6d3f3..4f9b22eb5 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -34,8 +34,8 @@ import '../modules/timbre/views/timbre_view.dart'; import '../modules/translation/views/translation_view.dart'; import '../modules/translation/bindings/translation_binding.dart'; import '../modules/translation/views/translation_history_view.dart'; -import '../modules/translation/views/translation_stats_view.dart'; -import '../modules/translation/bindings/translation_stats_binding.dart'; +import '../modules/usage/views/translation_stats_view.dart'; +import '../modules/usage/bindings/translation_stats_binding.dart'; import '../modules/translation/bindings/translation_list_binding.dart'; import '../modules/translation/views/translation_list_view.dart'; import '../modules/translation/bindings/translation_history_binding.dart'; From 6101c622b4a1be4db5f8ab0f4e3f80c80d95a9d5 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 15 Nov 2025 23:32:04 +0800 Subject: [PATCH 028/177] =?UTF-8?q?refactor(usage):=20=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8DTranslationUsageService=E4=B8=BAUsageStatsService?= =?UTF-8?q?=E5=B9=B6=E9=87=8D=E6=9E=84=E7=BB=9F=E8=AE=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构翻译使用统计服务,将TranslationUsageService更名为更通用的UsageStatsService 优化统计逻辑,增加多维度统计和精确成本计算 添加月度统计汇总和历史数据清理功能 --- ..._service.dart => usage_stats_service.dart} | 126 +++++++++++------- .../controllers/translation_controller.dart | 14 +- .../translation_detail_controller.dart | 12 +- .../bindings/translation_stats_binding.dart | 8 +- .../translation_cost_controller.dart | 5 +- .../translation_stats_controller.dart | 16 +-- 6 files changed, 101 insertions(+), 80 deletions(-) rename lib/data/services/{translation_usage_service.dart => usage_stats_service.dart} (83%) diff --git a/lib/data/services/translation_usage_service.dart b/lib/data/services/usage_stats_service.dart similarity index 83% rename from lib/data/services/translation_usage_service.dart rename to lib/data/services/usage_stats_service.dart index 90f3db799..9a8653e7b 100644 --- a/lib/data/services/translation_usage_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -4,27 +4,28 @@ import 'package:get_storage/get_storage.dart'; import '../models/translation_usage_stats.dart'; import '../../core/utils/logger.dart'; -/// 翻译使用量统计服务 -class TranslationUsageService extends GetxService { - static const String _storageKey = 'translation_usage_stats'; +/// 使用量统计服务 +class UsageStatsService extends GetxService { + static const String _storageKey = 'usage_stats'; static const String _dailyStatsKey = 'daily_translation_stats'; static const String _costConfigKey = 'translation_cost_config'; - + final GetStorage _storage = GetStorage(); - + // 实时统计数据 final Rx realtimeStats = RealtimeUsageStats().obs; - + // 当日统计数据 - final Rx todayStats = TranslationUsageStats.empty('').obs; - + final Rx todayStats = + TranslationUsageStats.empty('').obs; + // 成本配置 final RxMap costConfig = {}.obs; - + // 预警阈值 final RxDouble dailyCostThreshold = 10.0.obs; // 日成本预警阈值 final RxDouble monthlyCostThreshold = 300.0.obs; // 月成本预警阈值 - + @override void onInit() { super.onInit(); @@ -72,11 +73,13 @@ class TranslationUsageService extends GetxService { void _loadTodayStats() { try { final today = DateTime.now(); - final todayKey = '${today.year}-${today.month.toString().padLeft(2, '0')}-${today.day.toString().padLeft(2, '0')}'; - + final todayKey = + '${today.year}-${today.month.toString().padLeft(2, '0')}-${today.day.toString().padLeft(2, '0')}'; + final statsData = _storage.read('${_dailyStatsKey}_$todayKey'); if (statsData != null) { - todayStats.value = TranslationUsageStats.fromJson(Map.from(statsData)); + todayStats.value = TranslationUsageStats.fromJson( + Map.from(statsData)); } else { todayStats.value = TranslationUsageStats.empty(getCurrentUserId()); } @@ -112,7 +115,8 @@ class TranslationUsageService extends GetxService { realtimeStats.value.translationCount++; realtimeStats.value.sourceTextCharacters += sourceText.length; realtimeStats.value.ttsTextCharacters += targetText.length; - realtimeStats.value.currentLanguagePair = '$sourceLanguage-$targetLanguage'; + realtimeStats.value.currentLanguagePair = + '$sourceLanguage-$targetLanguage'; realtimeStats.value.currentMode = mode; realtimeStats.refresh(); @@ -120,7 +124,8 @@ class TranslationUsageService extends GetxService { final languagePair = '$sourceLanguage→$targetLanguage'; // 更新语言对统计 - final newLanguagePairStats = Map.from(todayStats.value.languagePairStats); + final newLanguagePairStats = Map.from( + todayStats.value.languagePairStats); if (newLanguagePairStats.containsKey(languagePair)) { final existing = newLanguagePairStats[languagePair]!; newLanguagePairStats[languagePair] = LanguagePairStats( @@ -139,7 +144,8 @@ class TranslationUsageService extends GetxService { } // 更新模式统计 - final newModeStats = Map.from(todayStats.value.modeStats); + final newModeStats = + Map.from(todayStats.value.modeStats); if (newModeStats.containsKey(mode)) { final existing = newModeStats[mode]!; newModeStats[mode] = existing.copyWith( @@ -159,21 +165,26 @@ class TranslationUsageService extends GetxService { todayStats.value = todayStats.value.copyWith( translationApiCalls: todayStats.value.translationApiCalls + 1, - sourceTextCharacters: todayStats.value.sourceTextCharacters + sourceText.length, - ttsTextCharacters: todayStats.value.ttsTextCharacters + targetText.length, + sourceTextCharacters: + todayStats.value.sourceTextCharacters + sourceText.length, + ttsTextCharacters: + todayStats.value.ttsTextCharacters + targetText.length, languagePairStats: newLanguagePairStats, modeStats: newModeStats, estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( translationApiCalls: todayStats.value.translationApiCalls + 1, - sourceTextCharacters: todayStats.value.sourceTextCharacters + sourceText.length, - ttsTextCharacters: todayStats.value.ttsTextCharacters + targetText.length, + sourceTextCharacters: + todayStats.value.sourceTextCharacters + sourceText.length, + ttsTextCharacters: + todayStats.value.ttsTextCharacters + targetText.length, )), ); _saveTodayStats(); _checkCostThreshold(); - - Logger.info('记录翻译API调用: 源文本${sourceText.length}字符, 目标文本${targetText.length}字符'); + + Logger.info( + '记录翻译API调用: 源文本${sourceText.length}字符, 目标文本${targetText.length}字符'); } catch (e) { Logger.error('记录翻译API调用失败: $e'); } @@ -195,11 +206,13 @@ class TranslationUsageService extends GetxService { realtimeStats.refresh(); // 更新模式统计 - final newModeStats = Map.from(todayStats.value.modeStats); + final newModeStats = + Map.from(todayStats.value.modeStats); if (newModeStats.containsKey(mode)) { final existing = newModeStats[mode]!; newModeStats[mode] = existing.copyWith( - effectiveAudioDuration: existing.effectiveAudioDuration + effectiveDurationSeconds, + effectiveAudioDuration: + existing.effectiveAudioDuration + effectiveDurationSeconds, cost: existing.cost + _calculateAsrCost(effectiveDurationSeconds), ); } else { @@ -212,18 +225,22 @@ class TranslationUsageService extends GetxService { // 更新当日统计 todayStats.value = todayStats.value.copyWith( asrApiCalls: todayStats.value.asrApiCalls + 1, - effectiveAudioDuration: todayStats.value.effectiveAudioDuration + effectiveDurationSeconds, - totalSessionDuration: todayStats.value.totalSessionDuration + totalDurationSeconds, + effectiveAudioDuration: + todayStats.value.effectiveAudioDuration + effectiveDurationSeconds, + totalSessionDuration: + todayStats.value.totalSessionDuration + totalDurationSeconds, modeStats: newModeStats, estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( asrApiCalls: todayStats.value.asrApiCalls + 1, - effectiveAudioDuration: todayStats.value.effectiveAudioDuration + effectiveDurationSeconds, + effectiveAudioDuration: todayStats.value.effectiveAudioDuration + + effectiveDurationSeconds, )), ); _saveTodayStats(); - Logger.info('ASR统计: 有效语音${effectiveDurationSeconds}秒, 总时长${totalDurationSeconds}秒, 语言$language, 模式$mode'); + Logger.info( + 'ASR统计: 有效语音${effectiveDurationSeconds}秒, 总时长${totalDurationSeconds}秒, 语言$language, 模式$mode'); } catch (e) { Logger.error('记录ASR API调用失败: $e'); } @@ -244,7 +261,8 @@ class TranslationUsageService extends GetxService { todayStats.value = todayStats.value.copyWith( ttsApiCalls: todayStats.value.ttsApiCalls + 1, ttsTextCharacters: todayStats.value.ttsTextCharacters + text.length, - totalSessionDuration: todayStats.value.totalSessionDuration + durationSeconds, + totalSessionDuration: + todayStats.value.totalSessionDuration + durationSeconds, estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( ttsApiCalls: todayStats.value.ttsApiCalls + 1, ttsTextCharacters: todayStats.value.ttsTextCharacters + text.length, @@ -252,7 +270,7 @@ class TranslationUsageService extends GetxService { ); _saveTodayStats(); - + Logger.info('记录TTS API调用: 文本${text.length}字符, 时长${durationSeconds}秒'); } catch (e) { Logger.error('记录TTS API调用失败: $e'); @@ -271,7 +289,7 @@ class TranslationUsageService extends GetxService { ); _saveTodayStats(); - + Logger.info('记录AI摘要API调用'); } catch (e) { Logger.error('记录AI摘要API调用失败: $e'); @@ -281,12 +299,12 @@ class TranslationUsageService extends GetxService { /// 开始新会话 void startNewSession() { realtimeStats.value.reset(); - + // 更新当日会话数 todayStats.value = todayStats.value.copyWith( sessionCount: todayStats.value.sessionCount + 1, ); - + _saveTodayStats(); Logger.info('开始新的翻译会话'); } @@ -296,23 +314,28 @@ class TranslationUsageService extends GetxService { double cost = 0.0; // 翻译成本:基于源文本字符数 - cost += (stats.sourceTextCharacters / 1000) * (costConfig['translation_per_1k_chars'] ?? 0.05); + cost += (stats.sourceTextCharacters / 1000) * + (costConfig['translation_per_1k_chars'] ?? 0.05); // ASR成本:基于有效音频时长 - cost += (stats.effectiveAudioDuration / 60) * (costConfig['asr_per_minute'] ?? 0.02); + cost += (stats.effectiveAudioDuration / 60) * + (costConfig['asr_per_minute'] ?? 0.02); // TTS成本:基于TTS文本字符数 - cost += (stats.ttsTextCharacters / 1000) * (costConfig['tts_per_1k_chars'] ?? 0.03); + cost += (stats.ttsTextCharacters / 1000) * + (costConfig['tts_per_1k_chars'] ?? 0.03); // AI摘要成本(已废弃但保留兼容性) - cost += stats.aiSummaryApiCalls * (costConfig['ai_summary_per_request'] ?? 0.01); + cost += stats.aiSummaryApiCalls * + (costConfig['ai_summary_per_request'] ?? 0.01); return cost; } /// 计算翻译成本(单次调用) double _calculateTranslationCost(int sourceCharacters) { - return (sourceCharacters / 1000) * (costConfig['translation_per_1k_chars'] ?? 0.05); + return (sourceCharacters / 1000) * + (costConfig['translation_per_1k_chars'] ?? 0.05); } /// 计算ASR成本(单次调用) @@ -329,7 +352,8 @@ class TranslationUsageService extends GetxService { void _saveTodayStats() { try { final today = DateTime.now(); - final todayKey = '${today.year}-${today.month.toString().padLeft(2, '0')}-${today.day.toString().padLeft(2, '0')}'; + final todayKey = + '${today.year}-${today.month.toString().padLeft(2, '0')}-${today.day.toString().padLeft(2, '0')}'; _storage.write('${_dailyStatsKey}_$todayKey', todayStats.value.toJson()); } catch (e) { Logger.error('保存当日统计数据失败: $e'); @@ -339,7 +363,7 @@ class TranslationUsageService extends GetxService { /// 检查成本阈值 void _checkCostThreshold() { final todayCost = todayStats.value.estimatedCost; - + if (todayCost >= dailyCostThreshold.value) { _showCostWarning('今日翻译成本已达到预警阈值:¥${todayCost.toStringAsFixed(2)}'); } @@ -364,19 +388,20 @@ class TranslationUsageService extends GetxService { }) async { try { final List historyStats = []; - - for (DateTime date = startDate; - date.isBefore(endDate) || date.isAtSameMomentAs(endDate); - date = date.add(const Duration(days: 1))) { - - final dateKey = '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}'; + + for (DateTime date = startDate; + date.isBefore(endDate) || date.isAtSameMomentAs(endDate); + date = date.add(const Duration(days: 1))) { + final dateKey = + '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}'; final statsData = _storage.read('${_dailyStatsKey}_$dateKey'); - + if (statsData != null) { - historyStats.add(TranslationUsageStats.fromJson(Map.from(statsData))); + historyStats.add(TranslationUsageStats.fromJson( + Map.from(statsData))); } } - + return historyStats; } catch (e) { Logger.error('获取历史统计数据失败: $e'); @@ -486,7 +511,8 @@ class TranslationUsageService extends GetxService { // 合并语言对使用统计 stats.languagePairUsage.forEach((key, value) { - combinedLanguagePairUsage[key] = (combinedLanguagePairUsage[key] ?? 0) + value; + combinedLanguagePairUsage[key] = + (combinedLanguagePairUsage[key] ?? 0) + value; }); // 合并模式使用统计 diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index dcb70b5ba..2e3680687 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -19,7 +19,7 @@ import '../../../core/utils/permission_util.dart'; import '../../../core/services/floating_window_manager.dart'; import '../../../data/services/asr_service.dart'; -import '../../../data/services/translation_usage_service.dart'; +import '../../../data/services/usage_stats_service.dart'; import '../../../data/services/ble_manager.dart'; import 'record_timer_controller.dart'; import 'translation_history_controller.dart'; @@ -48,7 +48,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { final BluetoothManager bluetoothManager = Get.find(); final BleManager bleManager = Get.find(); final _musiceManager = Get.find(); - late final TranslationUsageService _usageService; + late final UsageStatsService _usageService; late final FloatingWindowManager _floatingWindowManager; // ==================== 悬浮窗相关 ==================== @@ -435,13 +435,13 @@ class TranslationController extends GetxController with WidgetsBindingObserver { void _initUsageService() { try { // 确保统计服务已注册 - if (!Get.isRegistered()) { - Get.put(TranslationUsageService(), permanent: true); + if (!Get.isRegistered()) { + Get.put(UsageStatsService(), permanent: true); } - _usageService = Get.find(); - Logger.info('翻译统计服务初始化完成'); + _usageService = Get.find(); + Logger.info('使用量统计服务初始化完成'); } catch (e) { - Logger.error('翻译统计服务初始化失败: $e'); + Logger.error('使用量统计服务初始化失败: $e'); } } diff --git a/lib/modules/translation/controllers/translation_detail_controller.dart b/lib/modules/translation/controllers/translation_detail_controller.dart index da34f3ff2..e2d965b0e 100644 --- a/lib/modules/translation/controllers/translation_detail_controller.dart +++ b/lib/modules/translation/controllers/translation_detail_controller.dart @@ -7,14 +7,14 @@ import '../models/translation_models.dart'; // 添加这行导入 import 'package:get_storage/get_storage.dart'; import 'dart:async'; import '../../../core/utils/logger.dart'; -import '../../../data/services/translation_usage_service.dart'; +import '../../../data/services/usage_stats_service.dart'; //详情页管理 class TranslationDetailController extends GetxController { // 依赖注入 //final VolcanoAIService _aiService = Get.find(); final GetStorage _storage = GetStorage(); - late final TranslationUsageService _usageService; + late final UsageStatsService _usageService; // 存储键前缀 static const String _summaryKeyPrefix = 'translation_summary_'; @@ -40,12 +40,12 @@ class TranslationDetailController extends GetxController { // 初始化统计服务 try { - if (!Get.isRegistered()) { - Get.put(TranslationUsageService(), permanent: true); + if (!Get.isRegistered()) { + Get.put(UsageStatsService(), permanent: true); } - _usageService = Get.find(); + _usageService = Get.find(); } catch (e) { - Logger.error('初始化统计服务失败: $e'); + Logger.error('初始化使用量统计服务失败: $e'); } // 从路由参数中获取数据 diff --git a/lib/modules/usage/bindings/translation_stats_binding.dart b/lib/modules/usage/bindings/translation_stats_binding.dart index 6f0008d97..da6c55d3a 100644 --- a/lib/modules/usage/bindings/translation_stats_binding.dart +++ b/lib/modules/usage/bindings/translation_stats_binding.dart @@ -1,13 +1,13 @@ import 'package:get/get.dart'; import '../controllers/translation_stats_controller.dart'; -import '../../../data/services/translation_usage_service.dart'; +import '../../../data/services/usage_stats_service.dart'; class TranslationStatsBinding implements Bindings { @override void dependencies() { - if (!Get.isRegistered()) { - Get.put(TranslationUsageService(), permanent: true); + if (!Get.isRegistered()) { + Get.put(UsageStatsService(), permanent: true); } Get.lazyPut(() => TranslationStatsController()); } -} \ No newline at end of file +} diff --git a/lib/modules/usage/controllers/translation_cost_controller.dart b/lib/modules/usage/controllers/translation_cost_controller.dart index 90c9ac688..94a5230ba 100644 --- a/lib/modules/usage/controllers/translation_cost_controller.dart +++ b/lib/modules/usage/controllers/translation_cost_controller.dart @@ -1,11 +1,10 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; -import '../../../data/services/translation_usage_service.dart'; +import '../../../data/services/usage_stats_service.dart'; import '../../../core/utils/logger.dart'; class TranslationCostController extends GetxController { - final TranslationUsageService _usageService = - Get.find(); + final UsageStatsService _usageService = Get.find(); final RxMap costConfig = {}.obs; final RxDouble dailyCostThreshold = 10.0.obs; final RxDouble monthlyCostThreshold = 300.0.obs; diff --git a/lib/modules/usage/controllers/translation_stats_controller.dart b/lib/modules/usage/controllers/translation_stats_controller.dart index 28bc75e21..c38393f84 100644 --- a/lib/modules/usage/controllers/translation_stats_controller.dart +++ b/lib/modules/usage/controllers/translation_stats_controller.dart @@ -1,11 +1,10 @@ import 'package:get/get.dart'; -import '../../../data/services/translation_usage_service.dart'; +import '../../../data/services/usage_stats_service.dart'; import '../../../data/models/translation_usage_stats.dart'; import '../../../core/utils/logger.dart'; class TranslationStatsController extends GetxController { - final TranslationUsageService _usageService = - Get.find(); + final UsageStatsService _usageService = Get.find(); final isLoading = false.obs; final selectedTabIndex = 0.obs; @@ -76,8 +75,7 @@ class TranslationStatsController extends GetxController { '加载失败', '统计数据加载失败,请稍后重试', snackPosition: SnackPosition.TOP, - backgroundColor: - Get.theme.colorScheme.error.withValues(alpha: 0.1), + backgroundColor: Get.theme.colorScheme.error.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.error, ); } finally { @@ -275,8 +273,7 @@ class TranslationStatsController extends GetxController { '清理完成', '已清理90天前的过期数据', snackPosition: SnackPosition.TOP, - backgroundColor: - Get.theme.colorScheme.primary.withValues(alpha: 0.1), + backgroundColor: Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, ); } @@ -287,8 +284,7 @@ class TranslationStatsController extends GetxController { '导出功能', '数据导出功能正在开发中', snackPosition: SnackPosition.TOP, - backgroundColor: - Get.theme.colorScheme.primary.withValues(alpha: 0.1), + backgroundColor: Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, ); } catch (e) { @@ -323,4 +319,4 @@ class TranslationStatsController extends GetxController { return '${(number / 1000000).toStringAsFixed(1)}M'; } } -} \ No newline at end of file +} From 364b8f53908731e58dfdb7044e72b1f84ace4271 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 17 Nov 2025 15:15:25 +0800 Subject: [PATCH 029/177] =?UTF-8?q?refactor(usage):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=88=90=E6=9C=AC=E7=BB=9F=E8=AE=A1=E7=9B=B8=E5=85=B3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除翻译使用统计中的成本计算、成本配置和阈值预警功能 更新相关视图和控制器以匹配功能变更 --- lib/data/services/usage_stats_service.dart | 168 +----------------- .../controllers/translation_controller.dart | 4 +- .../translation_cost_controller.dart | 103 +---------- .../translation_stats_controller.dart | 26 ++- .../usage/views/translation_stats_view.dart | 12 +- 5 files changed, 23 insertions(+), 290 deletions(-) diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index 9a8653e7b..5a361e341 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -8,7 +8,6 @@ import '../../core/utils/logger.dart'; class UsageStatsService extends GetxService { static const String _storageKey = 'usage_stats'; static const String _dailyStatsKey = 'daily_translation_stats'; - static const String _costConfigKey = 'translation_cost_config'; final GetStorage _storage = GetStorage(); @@ -19,13 +18,6 @@ class UsageStatsService extends GetxService { final Rx todayStats = TranslationUsageStats.empty('').obs; - // 成本配置 - final RxMap costConfig = {}.obs; - - // 预警阈值 - final RxDouble dailyCostThreshold = 10.0.obs; // 日成本预警阈值 - final RxDouble monthlyCostThreshold = 300.0.obs; // 月成本预警阈值 - @override void onInit() { super.onInit(); @@ -34,39 +26,8 @@ class UsageStatsService extends GetxService { /// 初始化服务 void _initializeService() { - _loadCostConfig(); _loadTodayStats(); - Logger.info('翻译使用量统计服务初始化完成'); - } - - /// 加载成本配置 - void _loadCostConfig() { - try { - final configData = _storage.read(_costConfigKey); - if (configData != null) { - costConfig.value = Map.from(configData); - } else { - // 设置默认成本配置(每千字符的成本,单位:元) - costConfig.value = { - 'translation_per_1k_chars': 0.05, // 翻译:每千字符0.05元 - 'asr_per_minute': 0.02, // ASR:每分钟0.02元 - 'tts_per_1k_chars': 0.03, // TTS:每千字符0.03元 - 'ai_summary_per_request': 0.01, // AI摘要:每次请求0.01元 - }; - _saveCostConfig(); - } - } catch (e) { - Logger.error('加载成本配置失败: $e'); - } - } - - /// 保存成本配置 - void _saveCostConfig() { - try { - _storage.write(_costConfigKey, costConfig.value); - } catch (e) { - Logger.error('保存成本配置失败: $e'); - } + Logger.info('lxm--使用量统计服务初始化完成'); } /// 加载当日统计数据 @@ -132,14 +93,12 @@ class UsageStatsService extends GetxService { languagePair: languagePair, translationCount: existing.translationCount + 1, sourceCharacters: existing.sourceCharacters + sourceText.length, - cost: existing.cost + _calculateTranslationCost(sourceText.length), ); } else { newLanguagePairStats[languagePair] = LanguagePairStats( languagePair: languagePair, translationCount: 1, sourceCharacters: sourceText.length, - cost: _calculateTranslationCost(sourceText.length), ); } @@ -152,14 +111,12 @@ class UsageStatsService extends GetxService { apiCalls: existing.apiCalls + 1, sourceCharacters: existing.sourceCharacters + sourceText.length, ttsCharacters: existing.ttsCharacters + targetText.length, - cost: existing.cost + _calculateTranslationCost(sourceText.length), ); } else { newModeStats[mode] = TranslationModeStats( apiCalls: 1, sourceCharacters: sourceText.length, ttsCharacters: targetText.length, - cost: _calculateTranslationCost(sourceText.length), ); } @@ -171,17 +128,9 @@ class UsageStatsService extends GetxService { todayStats.value.ttsTextCharacters + targetText.length, languagePairStats: newLanguagePairStats, modeStats: newModeStats, - estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( - translationApiCalls: todayStats.value.translationApiCalls + 1, - sourceTextCharacters: - todayStats.value.sourceTextCharacters + sourceText.length, - ttsTextCharacters: - todayStats.value.ttsTextCharacters + targetText.length, - )), ); _saveTodayStats(); - _checkCostThreshold(); Logger.info( '记录翻译API调用: 源文本${sourceText.length}字符, 目标文本${targetText.length}字符'); @@ -190,7 +139,7 @@ class UsageStatsService extends GetxService { } } - /// 记录ASR API调用 - 优化版(精确计费参数) + /// 记录ASR API调用 - 优化版(精确统计参数) void recordAsrApiCall({ required int effectiveDurationSeconds, // 有效语音时长(VAD检测的实际语音) required int totalDurationSeconds, // 总会话时长(包含静音) @@ -213,12 +162,10 @@ class UsageStatsService extends GetxService { newModeStats[mode] = existing.copyWith( effectiveAudioDuration: existing.effectiveAudioDuration + effectiveDurationSeconds, - cost: existing.cost + _calculateAsrCost(effectiveDurationSeconds), ); } else { newModeStats[mode] = TranslationModeStats( effectiveAudioDuration: effectiveDurationSeconds, - cost: _calculateAsrCost(effectiveDurationSeconds), ); } @@ -230,11 +177,6 @@ class UsageStatsService extends GetxService { totalSessionDuration: todayStats.value.totalSessionDuration + totalDurationSeconds, modeStats: newModeStats, - estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( - asrApiCalls: todayStats.value.asrApiCalls + 1, - effectiveAudioDuration: todayStats.value.effectiveAudioDuration + - effectiveDurationSeconds, - )), ); _saveTodayStats(); @@ -263,10 +205,6 @@ class UsageStatsService extends GetxService { ttsTextCharacters: todayStats.value.ttsTextCharacters + text.length, totalSessionDuration: todayStats.value.totalSessionDuration + durationSeconds, - estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( - ttsApiCalls: todayStats.value.ttsApiCalls + 1, - ttsTextCharacters: todayStats.value.ttsTextCharacters + text.length, - )), ); _saveTodayStats(); @@ -283,9 +221,6 @@ class UsageStatsService extends GetxService { // 更新当日统计 todayStats.value = todayStats.value.copyWith( aiSummaryApiCalls: todayStats.value.aiSummaryApiCalls + 1, - estimatedCost: _calculateEstimatedCost(todayStats.value.copyWith( - aiSummaryApiCalls: todayStats.value.aiSummaryApiCalls + 1, - )), ); _saveTodayStats(); @@ -309,45 +244,6 @@ class UsageStatsService extends GetxService { Logger.info('开始新的翻译会话'); } - /// 计算预估成本 - 优化版(基于精确计费参数) - double _calculateEstimatedCost(TranslationUsageStats stats) { - double cost = 0.0; - - // 翻译成本:基于源文本字符数 - cost += (stats.sourceTextCharacters / 1000) * - (costConfig['translation_per_1k_chars'] ?? 0.05); - - // ASR成本:基于有效音频时长 - cost += (stats.effectiveAudioDuration / 60) * - (costConfig['asr_per_minute'] ?? 0.02); - - // TTS成本:基于TTS文本字符数 - cost += (stats.ttsTextCharacters / 1000) * - (costConfig['tts_per_1k_chars'] ?? 0.03); - - // AI摘要成本(已废弃但保留兼容性) - cost += stats.aiSummaryApiCalls * - (costConfig['ai_summary_per_request'] ?? 0.01); - - return cost; - } - - /// 计算翻译成本(单次调用) - double _calculateTranslationCost(int sourceCharacters) { - return (sourceCharacters / 1000) * - (costConfig['translation_per_1k_chars'] ?? 0.05); - } - - /// 计算ASR成本(单次调用) - double _calculateAsrCost(int durationSeconds) { - return (durationSeconds / 60) * (costConfig['asr_per_minute'] ?? 0.02); - } - - /// 计算TTS成本(单次调用) - double _calculateTtsCost(int textCharacters) { - return (textCharacters / 1000) * (costConfig['tts_per_1k_chars'] ?? 0.03); - } - /// 保存当日统计数据 void _saveTodayStats() { try { @@ -360,27 +256,6 @@ class UsageStatsService extends GetxService { } } - /// 检查成本阈值 - void _checkCostThreshold() { - final todayCost = todayStats.value.estimatedCost; - - if (todayCost >= dailyCostThreshold.value) { - _showCostWarning('今日翻译成本已达到预警阈值:¥${todayCost.toStringAsFixed(2)}'); - } - } - - /// 显示成本预警 - void _showCostWarning(String message) { - Get.snackbar( - '成本预警', - message, - snackPosition: SnackPosition.TOP, - backgroundColor: Get.theme.colorScheme.error.withOpacity(0.1), - colorText: Get.theme.colorScheme.error, - duration: const Duration(seconds: 5), - ); - } - /// 获取历史统计数据 Future> getHistoryStats({ required DateTime startDate, @@ -434,39 +309,6 @@ class UsageStatsService extends GetxService { } } - /// 更新成本配置 - void updateCostConfig(Map newConfig) { - costConfig.value = newConfig; - _saveCostConfig(); - - // 重新计算当日成本 - todayStats.value = todayStats.value.copyWith( - estimatedCost: _calculateEstimatedCost(todayStats.value), - ); - _saveTodayStats(); - - Logger.info('更新成本配置完成'); - } - - /// 更新预警阈值 - void updateThresholds({ - double? dailyThreshold, - double? monthlyThreshold, - }) { - if (dailyThreshold != null) { - dailyCostThreshold.value = dailyThreshold; - } - if (monthlyThreshold != null) { - monthlyCostThreshold.value = monthlyThreshold; - } - - // 保存阈值配置 - _storage.write('daily_cost_threshold', dailyCostThreshold.value); - _storage.write('monthly_cost_threshold', monthlyCostThreshold.value); - - Logger.info('更新预警阈值完成'); - } - /// 获取月度统计汇总 Future getMonthlyStats(int year, int month) async { try { @@ -492,7 +334,7 @@ class UsageStatsService extends GetxService { int totalRecordingDuration = 0; int totalTtsPlayDuration = 0; int totalSessions = 0; - double totalCost = 0.0; + //double totalCost = 0.0; final Map combinedLanguagePairUsage = {}; final Map combinedModeUsage = {}; @@ -507,7 +349,7 @@ class UsageStatsService extends GetxService { totalRecordingDuration += stats.audioRecordingDuration; totalTtsPlayDuration += stats.ttsPlaybackDuration; totalSessions += stats.sessionCount; - totalCost += stats.estimatedCost; + // totalCost += stats.estimatedCost; // 合并语言对使用统计 stats.languagePairUsage.forEach((key, value) { @@ -535,7 +377,7 @@ class UsageStatsService extends GetxService { ttsTextCharacters: totalTargetChars, totalSessionDuration: totalTtsPlayDuration, sessionCount: totalSessions, - estimatedCost: totalCost, + // estimatedCost: totalCost, ); } catch (e) { Logger.error('获取月度统计失败: $e'); diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 2e3680687..b89d5a6e7 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -48,7 +48,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { final BluetoothManager bluetoothManager = Get.find(); final BleManager bleManager = Get.find(); final _musiceManager = Get.find(); - late final UsageStatsService _usageService; + late final UsageStatsService _usageService; //用量统计服务 late final FloatingWindowManager _floatingWindowManager; // ==================== 悬浮窗相关 ==================== @@ -431,7 +431,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } } - /// 初始化统计服务 + /// 初始化用量统计服务 void _initUsageService() { try { // 确保统计服务已注册 diff --git a/lib/modules/usage/controllers/translation_cost_controller.dart b/lib/modules/usage/controllers/translation_cost_controller.dart index 94a5230ba..934a709ec 100644 --- a/lib/modules/usage/controllers/translation_cost_controller.dart +++ b/lib/modules/usage/controllers/translation_cost_controller.dart @@ -20,7 +20,6 @@ class TranslationCostController extends GetxController { @override void onInit() { super.onInit(); - _loadCurrentConfig(); } @override @@ -34,74 +33,11 @@ class TranslationCostController extends GetxController { super.onClose(); } - void _loadCurrentConfig() { - isLoading.value = true; - try { - costConfig.value = Map.from(_usageService.costConfig); - dailyCostThreshold.value = _usageService.dailyCostThreshold.value; - monthlyCostThreshold.value = _usageService.monthlyCostThreshold.value; - translationCostController.text = - (costConfig['translation_per_1k_chars'] ?? 0.05).toString(); - asrCostController.text = - (costConfig['asr_per_minute'] ?? 0.02).toString(); - ttsCostController.text = - (costConfig['tts_per_1k_chars'] ?? 0.03).toString(); - aiSummaryCostController.text = - (costConfig['ai_summary_per_request'] ?? 0.01).toString(); - dailyThresholdController.text = dailyCostThreshold.value.toString(); - monthlyThresholdController.text = monthlyCostThreshold.value.toString(); - Logger.info('成本配置加载完成'); - } catch (e) { - Logger.error('加载成本配置失败: $e'); - _showErrorSnackbar('加载配置失败'); - } finally { - isLoading.value = false; - } - } + void _loadCurrentConfig() {} - Future saveConfig() async { - if (isSaving.value) return; - isSaving.value = true; - try { - if (!_validateInputs()) { - return; - } - final newCostConfig = { - 'translation_per_1k_chars': - double.parse(translationCostController.text), - 'asr_per_minute': double.parse(asrCostController.text), - 'tts_per_1k_chars': double.parse(ttsCostController.text), - 'ai_summary_per_request': double.parse(aiSummaryCostController.text), - }; - final newDailyThreshold = double.parse(dailyThresholdController.text); - final newMonthlyThreshold = double.parse(monthlyThresholdController.text); - _usageService.updateCostConfig(newCostConfig); - _usageService.updateThresholds( - dailyThreshold: newDailyThreshold, - monthlyThreshold: newMonthlyThreshold, - ); - costConfig.value = newCostConfig; - dailyCostThreshold.value = newDailyThreshold; - monthlyCostThreshold.value = newMonthlyThreshold; - _showSuccessSnackbar('配置保存成功'); - Logger.info('成本配置保存成功'); - } catch (e) { - Logger.error('保存成本配置失败: $e'); - _showErrorSnackbar('保存配置失败'); - } finally { - isSaving.value = false; - } - } + Future saveConfig() async {} - void resetToDefault() { - translationCostController.text = '0.05'; - asrCostController.text = '0.02'; - ttsCostController.text = '0.03'; - aiSummaryCostController.text = '0.01'; - dailyThresholdController.text = '10.0'; - monthlyThresholdController.text = '300.0'; - _showInfoSnackbar('已重置为默认配置,请点击保存生效'); - } + void resetToDefault() {} bool _validateInputs() { try { @@ -134,40 +70,11 @@ class TranslationCostController extends GetxController { } double calculateEstimatedMonthlyCost() { - try { - final dailyStats = _usageService.todayStats.value; - if (dailyStats.estimatedCost == 0) return 0.0; - return dailyStats.estimatedCost * 30; - } catch (e) { - Logger.error('计算预估月成本失败: $e'); - return 0.0; - } + return 0.0; } List getCostSavingTips() { - final tips = []; - try { - final dailyStats = _usageService.todayStats.value; - if (dailyStats.translationApiCalls > 100) { - tips.add('考虑批量翻译以减少API调用次数'); - } - if (dailyStats.ttsApiCalls > 50) { - tips.add('可以关闭自动语音播放以节省TTS成本'); - } - if (dailyStats.aiSummaryApiCalls > 10) { - tips.add('AI摘要功能按需使用,避免频繁调用'); - } - if (dailyStats.effectiveAudioDuration > 3600) { - tips.add('长时间录音会增加ASR成本,建议分段录音'); - } - if (tips.isEmpty) { - tips.add('您的使用习惯很好,继续保持!'); - } - } catch (e) { - Logger.error('获取成本节约建议失败: $e'); - tips.add('暂无建议'); - } - return tips; + return []; } void _showSuccessSnackbar(String message) { diff --git a/lib/modules/usage/controllers/translation_stats_controller.dart b/lib/modules/usage/controllers/translation_stats_controller.dart index c38393f84..81694dad7 100644 --- a/lib/modules/usage/controllers/translation_stats_controller.dart +++ b/lib/modules/usage/controllers/translation_stats_controller.dart @@ -39,17 +39,11 @@ class TranslationStatsController extends GetxController { _updateChartData(); }); - ever(_usageService.costConfig, (config) { - costConfig.value = config; - }); - ever(_usageService.dailyCostThreshold, (threshold) { - dailyCostThreshold.value = threshold; - }); - ever(_usageService.monthlyCostThreshold, (threshold) { - monthlyCostThreshold.value = threshold; - }); + + + loadAllStats(); } @@ -141,7 +135,7 @@ class TranslationStatsController extends GetxController { int totalRecordingDuration = 0; int totalTtsPlayDuration = 0; int totalSessions = 0; - double totalCost = 0.0; + final Map combinedLanguagePairUsage = {}; final Map combinedModeUsage = {}; @@ -156,7 +150,7 @@ class TranslationStatsController extends GetxController { totalRecordingDuration += stats.effectiveAudioDuration; totalTtsPlayDuration += stats.totalSessionDuration; totalSessions += stats.sessionCount; - totalCost += stats.estimatedCost; + stats.languagePairUsage.forEach((key, value) { combinedLanguagePairUsage[key] = @@ -182,7 +176,7 @@ class TranslationStatsController extends GetxController { effectiveAudioDuration: totalRecordingDuration, totalSessionDuration: totalTtsPlayDuration, sessionCount: totalSessions, - estimatedCost: totalCost, + estimatedCost: 0.0, ); } @@ -194,7 +188,7 @@ class TranslationStatsController extends GetxController { data.add({ 'label': '今日', 'apiCalls': todayStats.value.totalApiCalls, - 'cost': todayStats.value.estimatedCost, + 'cost': 0.0, 'characters': todayStats.value.totalCharacterCount, }); break; @@ -202,7 +196,7 @@ class TranslationStatsController extends GetxController { data.add({ 'label': '本周', 'apiCalls': weekStats.value.totalApiCalls, - 'cost': weekStats.value.estimatedCost, + 'cost': 0.0, 'characters': weekStats.value.totalCharacterCount, }); break; @@ -210,7 +204,7 @@ class TranslationStatsController extends GetxController { data.add({ 'label': '本月', 'apiCalls': monthStats.value.totalApiCalls, - 'cost': monthStats.value.estimatedCost, + 'cost': 0.0, 'characters': monthStats.value.totalCharacterCount, }); break; @@ -219,7 +213,7 @@ class TranslationStatsController extends GetxController { data.add({ 'label': '${stats.date.month}/${stats.date.day}', 'apiCalls': stats.totalApiCalls, - 'cost': stats.estimatedCost, + 'cost': 0.0, 'characters': stats.totalCharacterCount, }); } diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index b8f3cc995..ee1751234 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -103,8 +103,6 @@ class TranslationStatsView extends GetView { SizedBox(height: 16.h), _buildDataVolumeCard(isDarkMode), SizedBox(height: 16.h), - _buildCostCard(isDarkMode), - SizedBox(height: 16.h), _buildUsageBehaviorCard(isDarkMode), ], ), @@ -302,15 +300,7 @@ class TranslationStatsView extends GetView { isDarkMode, ), ), - Expanded( - child: _buildStatItem( - '预估成本', - controller - .formatCost(controller.currentStats.estimatedCost), - Icons.attach_money, - isDarkMode, - ), - ), + ], )), SizedBox(height: 12.h), From 0c1a4d70720fd77e2704b390ecffebdea0ddfbbc Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 17 Nov 2025 15:50:30 +0800 Subject: [PATCH 030/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E6=82=AC=E6=B5=AE=E7=AA=97=E5=8F=AF=E4=BB=A5=E6=8B=96=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../saitong/voitrans/FloatingWindowService.kt | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt b/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt index 8d4f460e9..b6e861db2 100644 --- a/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt +++ b/android/app/src/main/kotlin/com/saitong/voitrans/FloatingWindowService.kt @@ -19,6 +19,7 @@ class FloatingWindowService : Service() { private var windowManager: WindowManager? = null private var floatingView: View? = null private var isMinimized = true + private lateinit var layoutParams: WindowManager.LayoutParams private lateinit var sourceTextView: TextView private lateinit var translatedTextView: TextView @@ -73,7 +74,7 @@ class FloatingWindowService : Service() { setupClickListeners() // 设置窗口参数 - val layoutParams = WindowManager.LayoutParams().apply { + layoutParams = WindowManager.LayoutParams().apply { width = WindowManager.LayoutParams.WRAP_CONTENT height = WindowManager.LayoutParams.WRAP_CONTENT type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -255,26 +256,12 @@ class FloatingWindowService : Service() { } private fun setupClickListeners() { - // 最小化状态点击展开 - minimizedView.setOnClickListener { - isMinimized = false - updateViewState(false) - notifyStateChange("expanded") - } - - // 展开状态点击最小化 - expandedView.setOnClickListener { - isMinimized = true - updateViewState(true) - notifyStateChange("minimized") - } - // 长按关闭 floatingView!!.setOnLongClickListener { closeFloatingWindow() true } - + // 拖拽功能 setupDragListener() } @@ -284,25 +271,40 @@ class FloatingWindowService : Service() { var initialY = 0 var initialTouchX = 0f var initialTouchY = 0f - + var dragging = false + val threshold = (4 * resources.displayMetrics.density).toInt() floatingView!!.setOnTouchListener { _, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { - val layoutParams = floatingView!!.layoutParams as WindowManager.LayoutParams initialX = layoutParams.x initialY = layoutParams.y initialTouchX = event.rawX initialTouchY = event.rawY + dragging = false true } MotionEvent.ACTION_MOVE -> { - val layoutParams = floatingView!!.layoutParams as WindowManager.LayoutParams - layoutParams.x = initialX + (event.rawX - initialTouchX).toInt() - layoutParams.y = initialY + (event.rawY - initialTouchY).toInt() + val dx = (event.rawX - initialTouchX).toInt() + val dy = (event.rawY - initialTouchY).toInt() + if (Math.abs(dx) > threshold || Math.abs(dy) > threshold) dragging = true + val dm = resources.displayMetrics + val maxX = dm.widthPixels - (floatingView?.width ?: 0) + val maxY = dm.heightPixels - (floatingView?.height ?: 0) + layoutParams.x = (initialX + dx).coerceIn(0, maxX) + layoutParams.y = (initialY + dy).coerceIn(0, maxY) windowManager?.updateViewLayout(floatingView, layoutParams) true } - else -> false + MotionEvent.ACTION_UP -> { + if (!dragging) { + isMinimized = !isMinimized + updateViewState(isMinimized) + notifyStateChange(if (isMinimized) "minimized" else "expanded") + } + dragging = false + true + } + else -> true } } } @@ -347,11 +349,10 @@ class FloatingWindowService : Service() { val x = intent.getIntExtra(EXTRA_X, 0) val y = intent.getIntExtra(EXTRA_Y, 0) - floatingView?.let { view -> - val layoutParams = view.layoutParams as WindowManager.LayoutParams + floatingView?.let { layoutParams.x = x layoutParams.y = y - windowManager?.updateViewLayout(view, layoutParams) + windowManager?.updateViewLayout(it, layoutParams) } } From 438f12ccf0e37a896965a24dc3d147da5dd4c7a5 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 17 Nov 2025 17:29:06 +0800 Subject: [PATCH 031/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eq_settings/bindings/eq_settings_binding.dart | 10 ++++++++++ .../controllers/eq_settings_controller.dart | 3 +++ lib/modules/eq_settings/views/eq_settings_view.dart | 13 +++++++++++++ lib/routes/app_pages.dart | 9 +++++++++ lib/routes/app_routes.dart | 1 + 5 files changed, 36 insertions(+) create mode 100644 lib/modules/eq_settings/bindings/eq_settings_binding.dart create mode 100644 lib/modules/eq_settings/controllers/eq_settings_controller.dart create mode 100644 lib/modules/eq_settings/views/eq_settings_view.dart diff --git a/lib/modules/eq_settings/bindings/eq_settings_binding.dart b/lib/modules/eq_settings/bindings/eq_settings_binding.dart new file mode 100644 index 000000000..1f2884bd2 --- /dev/null +++ b/lib/modules/eq_settings/bindings/eq_settings_binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import '../controllers/eq_settings_controller.dart'; + +class EqSettingsBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => EqSettingsController()); + } +} diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart new file mode 100644 index 000000000..ef5daae05 --- /dev/null +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -0,0 +1,3 @@ +import 'package:get/get.dart'; + +class EqSettingsController extends GetxController {} diff --git a/lib/modules/eq_settings/views/eq_settings_view.dart b/lib/modules/eq_settings/views/eq_settings_view.dart new file mode 100644 index 000000000..32c26179f --- /dev/null +++ b/lib/modules/eq_settings/views/eq_settings_view.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../controllers/eq_settings_controller.dart'; + +class EqSettingsView extends GetView { + const EqSettingsView({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 8d9b2ee2b..f6ba20dfa 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -1,5 +1,7 @@ import 'package:get/get.dart'; import 'package:qq_music/qq_music.dart'; +import '../modules/eq_settings/bindings/eq_settings_binding.dart'; +import '../modules/eq_settings/views/eq_settings_view.dart'; import '/modules/qqmusic/bindings/qqmusic_playlist_binding.dart'; import '/modules/qqmusic/views/qqmusic_playlist_view.dart'; @@ -324,5 +326,12 @@ abstract class AppPages { transition: Transition.rightToLeft, transitionDuration: Duration(milliseconds: 250), ), + GetPage( + name: Routes.eqSettings, + page: () => const EqSettingsView(), + binding: EqSettingsBinding(), + transition: Transition.rightToLeft, + transitionDuration: Duration(milliseconds: 250), + ), ]; } diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index b513e0369..fd9440940 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -19,6 +19,7 @@ abstract class Routes { static const settings = '/settings'; // 系统设置 static const permissions = '/permissions'; // 权限管理 static const recording = '/recording'; // 录音功能 + static const eqSettings = '/eq_settings'; // 设备设置 // 会议相关 static const meeting = '/meeting'; From dbd298a8722994d1104b154cbe5d0a204db778fb Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Tue, 18 Nov 2025 11:03:03 +0800 Subject: [PATCH 032/177] =?UTF-8?q?ios=E5=8A=A0=E5=85=A5=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ble_service/BleService.swift | 135 +++++++++++------- 1 file changed, 84 insertions(+), 51 deletions(-) diff --git a/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift b/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift index 84c3a4a44..d757e18ca 100644 --- a/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift +++ b/local_plugins/ble_service/ios/ble_service/Sources/ble_service/BleService.swift @@ -891,22 +891,27 @@ private var cmdReplyType: UInt8 = 0 } /// 处理接收到的响应数据 + /// + /// - 功能: + /// - 解析设备响应帧,校验头、长度与 CRC + /// - 与 Android 保持一致的失败判定:当长度字段与实际长度不匹配时,上报 rawData = [length, data[data.count-2]] + /// - 在 CMD_CONTROL_CODEC 分支对齐安卓对错误响应的处理逻辑 private func handleResponseData(_ data: Data) { - guard let characteristic = writeCharacteristic, + guard let characteristic = writeCharacteristic, connectionState == BleConst.STATE_CONNECTED else { os_log(" 设备未连接", log: logger, type: .error) - return + return } guard data.count >= 4 else { os_log("响应数据格式错误:数据长度过短", log: logger, type: .error) return } - + // 提取帧信息 let header = data[0] let cmd = data[1] let length = data[2] - + // 检查帧头,确保是设备响应 guard header == BleConst.DEVICE_RESPONSE_HEADER else { // 如果是设备主动上报 @@ -915,35 +920,59 @@ private var cmdReplyType: UInt8 = 0 } return } - + // 记录响应详情 var hexString = data.map { String(format: "0x%02X", $0) }.joined(separator: ", ") os_log("收到设备响应: %@", log: logger, type: .debug, hexString) - - // 检查数据长度 + + // 检查数据长度(与 Android 统一失败判定保持一致) if data.count != Int(length) + 4 { // 帧头 + 命令 + 长度 + 数据 + CRC os_log("设备响应数据长度不匹配: 期望=%d, 实际=%d", log: logger, type: .error, Int(length) + 4, data.count) + + // 与 Android 保持一致:构造 rawData 为 [length, 倒数第二位(payload 最后一位)] + var raw: [UInt8] = [] + raw.append(length) + if data.count >= 2 { + raw.append(data[data.count - 2]) + } + + let resultMap: [String: Any] = [ + "success": true, // 与 Android 对齐(Dart 层按 rawData 判断) + "command": Int(cmd), + "rawData": Data(raw) + ] + + // 推进命令队列(与后续正常路径一致) + isReply = true + cmdReplyType = cmd + if !commandQueue.isEmpty { + let nextCmd = commandQueue.removeFirst() + peripheralDevice?.writeValue(nextCmd, for: characteristic, type: .withoutResponse) + } + + // 上报到 Dart 层 + notifyDeviceInfoReceived(infoType: Int(cmd), infoData: resultMap) return } - + // 计算CRC校验 - 不包括最后一个字节(CRC) let payload = data.prefix(data.count - 1) let calculatedCrc = calculateCRC8(data: payload) let receivedCrc = data[data.count - 1] - + if calculatedCrc != receivedCrc { os_log("设备响应CRC校验失败: 计算=0x%02X, 接收=0x%02X", log: logger, type: .error, calculatedCrc, receivedCrc) return } - + // 提取响应数据 let responseData = length > 0 ? data.subdata(in: 3..<(3 + Int(length))) : Data() - isReply = true; - cmdReplyType = cmd; - if !commandQueue.isEmpty { - let nextCmd = commandQueue.removeFirst() - peripheralDevice?.writeValue(nextCmd, for: characteristic, type: .withoutResponse) -} + isReply = true + cmdReplyType = cmd + if !commandQueue.isEmpty { + let nextCmd = commandQueue.removeFirst() + peripheralDevice?.writeValue(nextCmd, for: characteristic, type: .withoutResponse) + } // 根据命令类型处理设备响应 switch cmd { @@ -953,103 +982,98 @@ private var cmdReplyType: UInt8 = 0 "command": "versionInfo", "rawData": responseData ] - + if !responseData.isEmpty { - // 如果无法解析为字符串,以点分隔的数字表示版本 let versionNums = responseData .map { $0 } - .filter { $0 != 0xFF } // 过滤掉无效字节 + .filter { $0 != 0xFF } .map { String($0) } .joined(separator: ".") resultMap["version"] = versionNums os_log("接收到目标版本号(数字格式): %@", log: logger, type: .info, versionNums) } - + notifyDeviceInfoReceived(infoType: Int(cmd), infoData: resultMap) - + case BleConst.CMD_GET_PRODUCT_ID: var resultMap: [String: Any] = [ "success": true, "command": "productId", "rawData": responseData ] - + if !responseData.isEmpty { let productId = responseData.map { String($0 & 0xFF) }.joined(separator: ".") resultMap["productId"] = productId os_log("接收到产品ID: %d", log: logger, type: .info, productId) } - + notifyDeviceInfoReceived(infoType: Int(cmd), infoData: resultMap) - + case BleConst.CMD_GET_COLOR_ID: var resultMap: [String: Any] = [ "success": true, "command": "colorInfo", "rawData": responseData ] - + if !responseData.isEmpty { let colorId = Int(responseData[0]) resultMap["colorId"] = colorId os_log("接收到耳机颜色ID: %d", log: logger, type: .info, colorId) } - + notifyDeviceInfoReceived(infoType: Int(cmd), infoData: resultMap) - + case BleConst.CMD_GET_BATTERY_INFO: var resultMap: [String: Any] = [ "success": true, "command": "batteryInfo", "rawData": responseData ] - + if responseData.count >= 3 { - // 处理电池信息 - 左耳、右耳、充电仓 let leftEarBattery = Int(responseData[0] & 0x7F) let leftEarCharging = (responseData[0] & 0x80) != 0 - + let rightEarBattery = Int(responseData[1] & 0x7F) let rightEarCharging = (responseData[1] & 0x80) != 0 - + let caseBattery = Int(responseData[2] & 0x7F) let caseCharging = (responseData[2] & 0x80) != 0 - - // 添加到结果Map + resultMap["leftEarBattery"] = leftEarBattery resultMap["leftEarCharging"] = leftEarCharging resultMap["rightEarBattery"] = rightEarBattery resultMap["rightEarCharging"] = rightEarCharging resultMap["caseBattery"] = caseBattery resultMap["caseCharging"] = caseCharging - resultMap["batteryLevel"] = leftEarBattery // 整体电量用左耳表示 - - os_log("接收到电量信息: 左耳=%d%% (%@), 右耳=%d%% (%@), 充电仓=%d%% (%@)", + resultMap["batteryLevel"] = leftEarBattery + + os_log("接收到电量信息: 左耳=%d%% (%@), 右耳=%d%% (%@), 充电仓=%d%% (%@)", log: logger, type: .info, - leftEarBattery, leftEarCharging ? "充电中" : "未充电", + leftEarBattery, leftEarCharging ? "充电中" : "未充电", rightEarBattery, rightEarCharging ? "充电中" : "未充电", caseBattery, caseCharging ? "充电中" : "未充电") } else if !responseData.isEmpty { - // 兼容单字节电量 let batteryLevel = Int(responseData[0]) resultMap["batteryLevel"] = batteryLevel os_log("接收到电量信息(简化): %d%%", log: logger, type: .info, batteryLevel) } - + notifyDeviceInfoReceived(infoType: Int(cmd), infoData: resultMap) - + case BleConst.CMD_CONTROL_CODEC: var resultMap: [String: Any] = [ "success": true, "command": Int(cmd), "rawData": responseData ] - - if responseData.count >= 2 { + + if !responseData.isEmpty && responseData.count >= 2 { let codecStatus = Int(responseData[0]) let channelMode = Int(responseData[1]) - - // 解码状态描述 + let statusDesc: String switch codecStatus { case Int(BleConst.CODEC_CONTROL_CLOSE): @@ -1065,8 +1089,7 @@ private var cmdReplyType: UInt8 = 0 default: statusDesc = "未知状态(\(codecStatus))" } - - // 声道模式描述 + let channelDesc: String switch channelMode { case Int(BleConst.AUDIO_CHANNEL_LEFT): @@ -1078,19 +1101,29 @@ private var cmdReplyType: UInt8 = 0 default: channelDesc = "未知声道(\(channelMode))" } - + resultMap["codecStatus"] = codecStatus resultMap["channelMode"] = channelMode resultMap["statusDesc"] = statusDesc resultMap["channelDesc"] = channelDesc - + os_log("编解码控制响应: %@, %@", log: logger, type: .info, statusDesc, channelDesc) + } else if !responseData.isEmpty && responseData.count == 1 { + // 与 Android 保持一致:单字节且为 0 判定为错误 + let codecStatus = Int(responseData[0]) + if codecStatus == 0x00 { + os_log("收到设备响应: 失败, codecStatus: %d", log: logger, type: .debug, codecStatus) + resultMap = [ + "success": true, // 与 Android 对齐(Dart 层按 rawData 判断) + "command": "Error", + "rawData": responseData + ] + } } - + notifyDeviceInfoReceived(infoType: Int(cmd), infoData: resultMap) - + default: - // 对于未知命令,返回原始数据 let resultMap: [String: Any] = [ "success": true, "command": Int(cmd), From da712a9a6253889bf11bebde4ad5b9cc5d4c8838 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 18 Nov 2025 15:20:51 +0800 Subject: [PATCH 033/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/devices/views/devices_view.dart | 171 ++++++------- .../controllers/eq_settings_controller.dart | 84 ++++++- .../eq_settings/views/eq_settings_view.dart | 84 ++++++- .../views/widgets/row_confirm_widget.dart | 96 ++++++++ .../views/widgets/row_input_widget.dart | 231 ++++++++++++++++++ 5 files changed, 581 insertions(+), 85 deletions(-) create mode 100644 lib/modules/eq_settings/views/widgets/row_confirm_widget.dart create mode 100644 lib/modules/eq_settings/views/widgets/row_input_widget.dart diff --git a/lib/modules/devices/views/devices_view.dart b/lib/modules/devices/views/devices_view.dart index 846004a4e..7a69dd5b0 100644 --- a/lib/modules/devices/views/devices_view.dart +++ b/lib/modules/devices/views/devices_view.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import '../../../routes/app_routes.dart'; import '/modules/devices/controllers/devices_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -201,103 +202,107 @@ class DevicesView extends GetView { required DeviceType deviceType, required bool isDarkMode, }) { - return Container( - margin: EdgeInsets.only(bottom: 12.h), - padding: EdgeInsets.all(16.w), - decoration: BoxDecoration( - color: isDarkMode ? AppColors.cardBackground : Colors.white, - borderRadius: BorderRadius.circular(12.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.05), - blurRadius: 8, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - children: [ - // 设备图标 - Container( - width: 48.w, - height: 48.w, - decoration: BoxDecoration( - color: - isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[100], - borderRadius: BorderRadius.circular(12.r), + return GestureDetector( + onTap: () => Get.toNamed(Routes.eqSettings), + child: Container( + margin: EdgeInsets.only(bottom: 12.h), + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 8, + offset: const Offset(0, 2), ), - child: Icon( - deviceType.icon, - color: isDarkMode ? Colors.white : Colors.black87, - size: 24.sp, + ], + ), + child: Row( + children: [ + // 设备图标 + Container( + width: 48.w, + height: 48.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.white.withOpacity(0.1) + : Colors.grey[100], + borderRadius: BorderRadius.circular(12.r), + ), + child: Icon( + deviceType.icon, + color: isDarkMode ? Colors.white : Colors.black87, + size: 24.sp, + ), ), - ), - SizedBox(width: 16.w), - // 设备信息 - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - device.devicename.isNotEmpty - ? device.devicename - : "deviceTypeUnknown".tr, - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w500, - color: isDarkMode ? Colors.white : Colors.black87, - ), - ), - SizedBox(height: 4.h), - Text( - device.devicemac.isNotEmpty - ? device.devicemac - : "noMacAddress".tr, - style: TextStyle( - fontSize: 14.sp, - color: isDarkMode ? Colors.white70 : Colors.grey[600], + SizedBox(width: 16.w), + // 设备信息 + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + device.devicename.isNotEmpty + ? device.devicename + : "deviceTypeUnknown".tr, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: isDarkMode ? Colors.white : Colors.black87, + ), ), - ), - if (device.license.isNotEmpty) ...[ SizedBox(height: 4.h), Text( - "${"licenseCode".tr}: ${device.license}", + device.devicemac.isNotEmpty + ? device.devicemac + : "noMacAddress".tr, style: TextStyle( - fontSize: 12.sp, - color: isDarkMode ? Colors.white54 : Colors.grey[500], + fontSize: 14.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[600], ), ), + if (device.license.isNotEmpty) ...[ + SizedBox(height: 4.h), + Text( + "${"licenseCode".tr}: ${device.license}", + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white54 : Colors.grey[500], + ), + ), + ], ], - ], - ), - ), - // 解绑按钮 - GestureDetector( - onTap: () => _showUnbindDialog(device, isDarkMode), - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, - vertical: 6.h, ), - decoration: BoxDecoration( - color: Colors.red.withOpacity(0.1), - borderRadius: BorderRadius.circular(6.r), - border: Border.all( - color: Colors.red.withOpacity(0.3), - width: 1, + ), + // 解绑按钮 + GestureDetector( + onTap: () => _showUnbindDialog(device, isDarkMode), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12.w, + vertical: 6.h, ), - ), - child: Text( - "unbind".tr, - style: TextStyle( - fontSize: 12.sp, - color: Colors.red, - fontWeight: FontWeight.w500, + decoration: BoxDecoration( + color: Colors.red.withOpacity(0.1), + borderRadius: BorderRadius.circular(6.r), + border: Border.all( + color: Colors.red.withOpacity(0.3), + width: 1, + ), + ), + child: Text( + "unbind".tr, + style: TextStyle( + fontSize: 12.sp, + color: Colors.red, + fontWeight: FontWeight.w500, + ), ), ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index ef5daae05..a0857a5a1 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -1,3 +1,85 @@ +import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; -class EqSettingsController extends GetxController {} +import '../../../core/utils/logger.dart'; +import '../../../routes/app_routes.dart'; +import '../views/widgets/row_confirm_widget.dart'; +import '../views/widgets/row_input_widget.dart'; + +class EqSettingsController extends GetxController { + final RxList uiList = [ + { + 'title': '音效', + 'templates': [], + }, + { + 'title': '按键功能', + 'templates': [], + }, + { + 'title': '耳机功能', + 'templates': [ + { + 'type': 'input', + 'name': '修改名称', + 'value': 'voitrans', + 'onCallback': (String value) { + Logger.d('input', '修改名称:$value'); + }, + }, + { + 'type': 'input', + 'name': '工作模式', + 'value': '', + 'onCallback': () {}, + }, + { + 'type': 'switch', + 'name': '闪灯开关', + 'value': false, + 'onCallback': () {}, + }, + { + 'type': 'switch', + 'name': '查找设备', + 'value': false, + 'description': '在设备上播放声音', + 'onCallback': () {}, + }, + ], + }, + { + 'templates': [ + { + 'type': 'confirm', + 'name': '升级耳机固件', + 'onCallback': () => Get.toNamed(Routes.OTA_UPGRADE), + }, + { + 'type': 'confirm', + 'name': '恢复出厂设置', + 'tips': '确定要恢复出厂设置吗?', + 'onCallback': () { + Logger.d('confirm', '恢复出厂设置'); + }, + }, + { + 'type': 'confirm', + 'name': '清除配对记录', + 'tips': '确定要清除配对记录吗?', + 'onCallback': () { + Logger.d('confirm', '清除配对记录'); + }, + }, + ], + } + ].obs; + + Widget getTemplate(Map data) { + return switch (data['type']) { + 'input' => RowInputWidget(data), + 'confirm' => RowConfirmWidget(data), + _ => const SizedBox.shrink(), + }; + } +} diff --git a/lib/modules/eq_settings/views/eq_settings_view.dart b/lib/modules/eq_settings/views/eq_settings_view.dart index 32c26179f..67f0403e9 100644 --- a/lib/modules/eq_settings/views/eq_settings_view.dart +++ b/lib/modules/eq_settings/views/eq_settings_view.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../controllers/eq_settings_controller.dart'; @@ -8,6 +9,87 @@ class EqSettingsView extends GetView { @override Widget build(BuildContext context) { - return const Placeholder(); + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + // 构建应用栏 + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + surfaceTintColor: Colors.transparent, + elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, + size: 20.sp, + ), + onPressed: () => Get.back(), + ), + title: Text( + '设备设置', + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ); + } + + // 构建主体内容 + Widget _buildBody(bool isDarkMode) { + return Obx( + () => ListView.builder( + itemCount: controller.uiList.length, + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 5.w), + itemBuilder: (BuildContext context, int index) { + Map data = controller.uiList[index]; + return _item(isDarkMode, data); + }, + ), + ); + } + + Widget _item(bool isDarkMode, Map data) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 10.w), + margin: EdgeInsets.symmetric(vertical: 5.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.white.withValues(alpha: 0.05) : Colors.white, + borderRadius: BorderRadius.circular(8.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (data['title'] != null) + Text( + data['title'], + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ...data['templates'].map((e) => controller.getTemplate(e)).toList(), + ], + ), + ); } } diff --git a/lib/modules/eq_settings/views/widgets/row_confirm_widget.dart b/lib/modules/eq_settings/views/widgets/row_confirm_widget.dart new file mode 100644 index 000000000..ce680b1d0 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_confirm_widget.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class RowConfirmWidget extends StatefulWidget { + final Map templateData; + + const RowConfirmWidget(this.templateData, {super.key}); + + @override + State createState() => _RowConfirmWidgetState(); +} + +class _RowConfirmWidgetState extends State { + Map get _templateData => widget.templateData; + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return GestureDetector( + onTap: () { + if (_templateData['tips'] != null) { + _alertDialog(isDarkMode); + } else { + _templateData['onCallback'](); + } + }, + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Icon( + Icons.chevron_right, + size: 26.w, + color: Colors.blue, + ), + ], + ), + ), + ); + } + + void _alertDialog(bool isDarkMode) { + Get.dialog( + AlertDialog( + backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white, + title: Text( + _templateData['name'], + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + ), + ), + content: Text( + _templateData['tips'], + style: TextStyle( + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + TextButton( + onPressed: () { + _templateData['onCallback'](); + Get.back(); + }, + child: Text( + 'confirm'.tr, // 确定 + style: TextStyle( + color: isDarkMode ? Colors.red[300] : Colors.red[600], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/modules/eq_settings/views/widgets/row_input_widget.dart b/lib/modules/eq_settings/views/widgets/row_input_widget.dart new file mode 100644 index 000000000..2409e644e --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_input_widget.dart @@ -0,0 +1,231 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class RowInputWidget extends StatefulWidget { + final Map templateData; + + const RowInputWidget(this.templateData, {super.key}); + + @override + State createState() => _RowInputWidgetState(); +} + +class _RowInputWidgetState extends State { + Map get _templateData => widget.templateData; + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return GestureDetector( + onTap: () => _inputBottomSheet(isDarkMode), + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Text( + _templateData['value'], + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + Icon( + Icons.chevron_right, + size: 26.w, + color: Colors.blue, + ), + ], + ), + ), + ); + } + + void _inputBottomSheet(bool isDarkMode) { + Get.bottomSheet( + InputBox(_templateData['name'], _templateData['value']), + isScrollControlled: true, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ).then((value) { + if (value != null) { + setState(() { + _templateData['value'] = value; + }); + _templateData['onCallback'](value); + } + }); + } +} + +class InputBox extends StatefulWidget { + final String title; + final String inputText; + + const InputBox(this.title, this.inputText, {super.key}); + + @override + State createState() => _InputBoxState(); +} + +class _InputBoxState extends State { + final TextEditingController _inputController = TextEditingController(); + + @override + void initState() { + super.initState(); + _inputController.text = widget.inputText; + } + + @override + void dispose() { + _inputController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.title, + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), + ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], + ), + ), + ) + ], + ), + ), + Divider( + height: 1, + color: Colors.grey[300], + ), + Container( + margin: EdgeInsets.symmetric(vertical: 20.w), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: TextField( + controller: _inputController, + style: TextStyle( + color: Colors.black87, + fontSize: 16.sp, + ), + decoration: InputDecoration( + hintText: 'maxCharacters'.tr, + hintStyle: TextStyle( + color: Colors.black54, + fontSize: 16.sp, + ), + isDense: true, + fillColor: Colors.transparent, + border: InputBorder.none, + contentPadding: EdgeInsets.all(10.w), + ), + ), + ), + Padding( + padding: EdgeInsets.only(bottom: 20.w), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => Get.back(), + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + fontSize: 16.sp, + color: Colors.black, + ), + ), + ), + ), + ), + 10.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: () { + Get.back(result: _inputController.text); + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'confirm'.tr, // 确认 + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } +} From f7c5a509a35cd21d771420adb933cbb81e0da90f Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 18 Nov 2025 16:34:59 +0800 Subject: [PATCH 034/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 14 +- .../views/widgets/row_radio_widget.dart | 187 ++++++++++++++++++ 2 files changed, 198 insertions(+), 3 deletions(-) create mode 100644 lib/modules/eq_settings/views/widgets/row_radio_widget.dart diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index a0857a5a1..66fef8720 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -5,6 +5,7 @@ import '../../../core/utils/logger.dart'; import '../../../routes/app_routes.dart'; import '../views/widgets/row_confirm_widget.dart'; import '../views/widgets/row_input_widget.dart'; +import '../views/widgets/row_radio_widget.dart'; class EqSettingsController extends GetxController { final RxList uiList = [ @@ -28,10 +29,16 @@ class EqSettingsController extends GetxController { }, }, { - 'type': 'input', + 'type': 'radio', 'name': '工作模式', - 'value': '', - 'onCallback': () {}, + 'value': '1', + 'options': [ + {'label': '游戏模式', 'value': '1'}, + {'label': '娱乐模式', 'value': '2'}, + ], + 'onCallback': (String value) { + Logger.d('radio', '工作模式:$value'); + }, }, { 'type': 'switch', @@ -78,6 +85,7 @@ class EqSettingsController extends GetxController { Widget getTemplate(Map data) { return switch (data['type']) { 'input' => RowInputWidget(data), + 'radio' => RowRadioWidget(data), 'confirm' => RowConfirmWidget(data), _ => const SizedBox.shrink(), }; diff --git a/lib/modules/eq_settings/views/widgets/row_radio_widget.dart b/lib/modules/eq_settings/views/widgets/row_radio_widget.dart new file mode 100644 index 000000000..6dbfd46f1 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_radio_widget.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class RowRadioWidget extends StatefulWidget { + final Map templateData; + + const RowRadioWidget(this.templateData, {super.key}); + + @override + State createState() => _RowRadioWidgetState(); +} + +class _RowRadioWidgetState extends State { + Map get _templateData => widget.templateData; + + String _label = ''; + + @override + void initState() { + super.initState(); + _label = _templateData['options'].firstWhere( + (option) => option['value'] == _templateData['value'], + orElse: () => {'label': ''}, + )['label']; + } + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return GestureDetector( + onTap: () => _radioDialog(isDarkMode), + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Text( + _label, + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + Icon( + Icons.chevron_right, + size: 26.w, + color: Colors.blue, + ), + ], + ), + ), + ); + } + + void _radioDialog(bool isDarkMode) { + Get.dialog( + Dialog( + backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.r), + ), + child: Padding( + padding: EdgeInsets.all(12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _templateData['name'], + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black87, + ), + ), + SizedBox(height: 16.h), + Container( + constraints: BoxConstraints(maxHeight: 0.5.sh), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: _templateData['options'] + .map((option) => _item(isDarkMode, option)) + .toList(), + ), + ), + ), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Get.back(), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget _item(bool isDarkMode, Map option) { + return GestureDetector( + onTap: () { + setState(() { + _label = option['label']; + }); + _templateData['value'] = option['value']; + _templateData['onCallback'](option['value']); + Get.back(); + }, + child: Container( + margin: EdgeInsets.only(bottom: 10.h), + padding: EdgeInsets.all(10.w), + decoration: BoxDecoration( + color: _templateData['value'] == option['value'] + ? (isDarkMode + ? Colors.teal[900]!.withValues(alpha: 0.3) + : Colors.teal[50]!) + : (isDarkMode + ? Colors.white.withValues(alpha: 0.05) + : Colors.grey[100]!), + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: _templateData['value'] == option['value'] + ? (isDarkMode ? Colors.teal[300]! : Colors.teal[600]!) + : Colors.transparent, + width: 1, + ), + ), + child: Row( + children: [ + Expanded( + child: Text( + option['label'], + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: isDarkMode ? Colors.white : Colors.black87, + ), + overflow: TextOverflow.ellipsis, + ), + ), + Container( + width: 24.w, + height: 24.w, + decoration: BoxDecoration( + color: _templateData['value'] == option['value'] + ? (isDarkMode ? Colors.teal[300] : Colors.teal[600]) + : (isDarkMode + ? Colors.white.withValues(alpha: 0.1) + : Colors.grey[300]), + shape: BoxShape.circle, + ), + child: _templateData['value'] == option['value'] + ? Icon( + Icons.check, + size: 16.w, + color: Colors.white, + ) + : null, + ), + ], + ), + ), + ); + } +} From fb92ee6b84e0592364131d28dcd2ad598a9ef6b2 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 18 Nov 2025 17:06:38 +0800 Subject: [PATCH 035/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 11 +++- .../views/widgets/row_switch_widget.dart | 61 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 lib/modules/eq_settings/views/widgets/row_switch_widget.dart diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index 66fef8720..3f08120f4 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -6,6 +6,7 @@ import '../../../routes/app_routes.dart'; import '../views/widgets/row_confirm_widget.dart'; import '../views/widgets/row_input_widget.dart'; import '../views/widgets/row_radio_widget.dart'; +import '../views/widgets/row_switch_widget.dart'; class EqSettingsController extends GetxController { final RxList uiList = [ @@ -35,6 +36,7 @@ class EqSettingsController extends GetxController { 'options': [ {'label': '游戏模式', 'value': '1'}, {'label': '娱乐模式', 'value': '2'}, + {'label': '睡眠模式', 'value': '3'}, ], 'onCallback': (String value) { Logger.d('radio', '工作模式:$value'); @@ -44,14 +46,18 @@ class EqSettingsController extends GetxController { 'type': 'switch', 'name': '闪灯开关', 'value': false, - 'onCallback': () {}, + 'onCallback': (bool value) { + Logger.d('switch', '闪灯开关:$value'); + }, }, { 'type': 'switch', 'name': '查找设备', 'value': false, 'description': '在设备上播放声音', - 'onCallback': () {}, + 'onCallback': (bool value) { + Logger.d('switch', '查找设备:$value'); + }, }, ], }, @@ -86,6 +92,7 @@ class EqSettingsController extends GetxController { return switch (data['type']) { 'input' => RowInputWidget(data), 'radio' => RowRadioWidget(data), + 'switch' => RowSwitchWidget(data), 'confirm' => RowConfirmWidget(data), _ => const SizedBox.shrink(), }; diff --git a/lib/modules/eq_settings/views/widgets/row_switch_widget.dart b/lib/modules/eq_settings/views/widgets/row_switch_widget.dart new file mode 100644 index 000000000..e21223ba5 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_switch_widget.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class RowSwitchWidget extends StatefulWidget { + final Map templateData; + + const RowSwitchWidget(this.templateData, {super.key}); + + @override + State createState() => _RowSwitchWidgetState(); +} + +class _RowSwitchWidgetState extends State { + Map get _templateData => widget.templateData; + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + if (_templateData['description'] != null) + Text( + _templateData['description'], + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + SizedBox( + height: 26.w, + child: Transform.scale( + scale: 0.8, + alignment: Alignment.centerRight, + child: Switch( + value: _templateData['value'], + onChanged: (bool value) { + setState(() { + _templateData['value'] = value; + }); + _templateData['onCallback'](value); + }, + ), + ), + ), + ], + ), + ); + } +} From a5e810ce9f11baaa20d26fd94775b1b2509cc795 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 18 Nov 2025 19:59:17 +0800 Subject: [PATCH 036/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 42 +++- .../views/widgets/row_keypress_widget.dart | 236 ++++++++++++++++++ 2 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 lib/modules/eq_settings/views/widgets/row_keypress_widget.dart diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index 3f08120f4..842fa5be0 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -1,10 +1,11 @@ -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../core/utils/logger.dart'; import '../../../routes/app_routes.dart'; import '../views/widgets/row_confirm_widget.dart'; import '../views/widgets/row_input_widget.dart'; +import '../views/widgets/row_keypress_widget.dart'; import '../views/widgets/row_radio_widget.dart'; import '../views/widgets/row_switch_widget.dart'; @@ -16,7 +17,33 @@ class EqSettingsController extends GetxController { }, { 'title': '按键功能', - 'templates': [], + 'templates': [ + { + 'type': 'keypress', + 'data': [ + {'key': 'key1', 'label': '单击', 'left': 1, 'right': 1}, + {'key': 'key2', 'label': '双击', 'left': 1, 'right': 1}, + {'key': 'key3', 'label': '三击', 'left': 1, 'right': 1}, + {'key': 'key4', 'label': '长按', 'left': 1, 'right': 1}, + ], + 'options': [ + {'label': '无作用', 'value': 0}, + {'label': '回拨电话', 'value': 1}, + {'label': '语音助手', 'value': 2}, + {'label': '上一曲', 'value': 3}, + {'label': '下一曲', 'value': 4}, + {'label': '音量加', 'value': 5}, + {'label': '音量减', 'value': 6}, + {'label': '播放暂停', 'value': 7}, + {'label': '游戏模式', 'value': 8}, + {'label': '降噪设置', 'value': 9}, + {'label': 'EQ切换', 'value': 10}, + ], + 'onCallback': (Map value) { + Logger.d('keypress', '按键功能:$value'); + }, + }, + ], }, { 'title': '耳机功能', @@ -32,13 +59,13 @@ class EqSettingsController extends GetxController { { 'type': 'radio', 'name': '工作模式', - 'value': '1', + 'value': 1, 'options': [ - {'label': '游戏模式', 'value': '1'}, - {'label': '娱乐模式', 'value': '2'}, - {'label': '睡眠模式', 'value': '3'}, + {'label': '游戏模式', 'value': 1}, + {'label': '娱乐模式', 'value': 2}, + {'label': '睡眠模式', 'value': 3}, ], - 'onCallback': (String value) { + 'onCallback': (int value) { Logger.d('radio', '工作模式:$value'); }, }, @@ -90,6 +117,7 @@ class EqSettingsController extends GetxController { Widget getTemplate(Map data) { return switch (data['type']) { + 'keypress' => RowKeypressWidget(data), 'input' => RowInputWidget(data), 'radio' => RowRadioWidget(data), 'switch' => RowSwitchWidget(data), diff --git a/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart b/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart new file mode 100644 index 000000000..0e5f5229a --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart @@ -0,0 +1,236 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class RowKeypressWidget extends StatefulWidget { + final Map templateData; + + const RowKeypressWidget(this.templateData, {super.key}); + + @override + State createState() => _RowKeypressWidgetState(); +} + +class _RowKeypressWidgetState extends State { + Map get _templateData => widget.templateData; + + String _getLabel(int value) { + return _templateData['options'].firstWhere((item) => item['value'] == value, + orElse: () => {'label': ''})['label']; + } + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + children: [ + const Spacer(), + Expanded( + child: Text( + '左', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Expanded( + child: Text( + '右', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + ], + ), + ), + ..._templateData['data'] + .map((item) => _rowItem(isDarkMode, item)) + .toList(), + ], + ); + } + + Widget _rowItem(bool isDarkMode, Map item) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + children: [ + Expanded( + child: Text( + item['label'], + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Expanded( + child: GestureDetector( + onTap: () => _radioDialog(isDarkMode, item, 'left'), + behavior: HitTestBehavior.translucent, + child: Text( + _getLabel(item['left']), + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + ), + ), + Expanded( + child: GestureDetector( + onTap: () => _radioDialog(isDarkMode, item, 'right'), + behavior: HitTestBehavior.translucent, + child: Text( + _getLabel(item['right']), + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + ), + ), + ], + ), + ); + } + + void _radioDialog(bool isDarkMode, Map item, String key) { + Get.dialog( + Dialog( + backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.r), + ), + child: Padding( + padding: EdgeInsets.all(12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${item['label']}-${key == 'left' ? '左' : '右'}', + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black87, + ), + ), + SizedBox(height: 16.h), + Container( + constraints: BoxConstraints(maxHeight: 0.5.sh), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: _templateData['options'] + .map((option) => + _radioItem(isDarkMode, option, item, key)) + .toList(), + ), + ), + ), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Get.back(), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget _radioItem(bool isDarkMode, Map option, Map item, String key) { + return GestureDetector( + onTap: () { + setState(() { + item[key] = option['value']; + }); + Map data = { + 'key': item['key'], + key: option['value'], + }; + _templateData['onCallback'](data); + Get.back(); + }, + child: Container( + margin: EdgeInsets.only(bottom: 10.h), + padding: EdgeInsets.all(10.w), + decoration: BoxDecoration( + color: item[key] == option['value'] + ? (isDarkMode + ? Colors.teal[900]!.withValues(alpha: 0.3) + : Colors.teal[50]!) + : (isDarkMode + ? Colors.white.withValues(alpha: 0.05) + : Colors.grey[100]!), + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: item[key] == option['value'] + ? (isDarkMode ? Colors.teal[300]! : Colors.teal[600]!) + : Colors.transparent, + width: 1, + ), + ), + child: Row( + children: [ + Expanded( + child: Text( + option['label'], + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: isDarkMode ? Colors.white : Colors.black87, + ), + overflow: TextOverflow.ellipsis, + ), + ), + Container( + width: 24.w, + height: 24.w, + decoration: BoxDecoration( + color: item[key] == option['value'] + ? (isDarkMode ? Colors.teal[300] : Colors.teal[600]) + : (isDarkMode + ? Colors.white.withValues(alpha: 0.1) + : Colors.grey[300]), + shape: BoxShape.circle, + ), + child: item[key] == option['value'] + ? Icon( + Icons.check, + size: 16.w, + color: Colors.white, + ) + : null, + ), + ], + ), + ), + ); + } +} From dd2726f324843dfbc7baa957821a4b94fab2f5c0 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 18 Nov 2025 20:51:58 +0800 Subject: [PATCH 037/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 20 +++++++ .../views/widgets/row_grade_widget.dart | 37 ++++++++++++ .../views/widgets/row_keypress_widget.dart | 36 +++++++----- .../views/widgets/row_timer_widget.dart | 56 +++++++++++++++++++ 4 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 lib/modules/eq_settings/views/widgets/row_grade_widget.dart create mode 100644 lib/modules/eq_settings/views/widgets/row_timer_widget.dart diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index 842fa5be0..7709ff5d1 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -4,10 +4,12 @@ import 'package:get/get.dart'; import '../../../core/utils/logger.dart'; import '../../../routes/app_routes.dart'; import '../views/widgets/row_confirm_widget.dart'; +import '../views/widgets/row_grade_widget.dart'; import '../views/widgets/row_input_widget.dart'; import '../views/widgets/row_keypress_widget.dart'; import '../views/widgets/row_radio_widget.dart'; import '../views/widgets/row_switch_widget.dart'; +import '../views/widgets/row_timer_widget.dart'; class EqSettingsController extends GetxController { final RxList uiList = [ @@ -86,6 +88,22 @@ class EqSettingsController extends GetxController { Logger.d('switch', '查找设备:$value'); }, }, + { + 'type': 'grade', + 'name': '降噪等级', + 'value': 0, + 'onCallback': (int value) { + Logger.d('grade', '降噪等级:$value'); + }, + }, + { + 'type': 'timer', + 'name': '定时关机', + 'value': 0, + 'onCallback': (int value) { + Logger.d('timer', '定时关机:$value'); + }, + }, ], }, { @@ -121,6 +139,8 @@ class EqSettingsController extends GetxController { 'input' => RowInputWidget(data), 'radio' => RowRadioWidget(data), 'switch' => RowSwitchWidget(data), + 'grade' => RowGradeWidget(data), + 'timer' => RowTimerWidget(data), 'confirm' => RowConfirmWidget(data), _ => const SizedBox.shrink(), }; diff --git a/lib/modules/eq_settings/views/widgets/row_grade_widget.dart b/lib/modules/eq_settings/views/widgets/row_grade_widget.dart new file mode 100644 index 000000000..9ac8d9fa4 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_grade_widget.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class RowGradeWidget extends StatefulWidget { + final Map templateData; + + const RowGradeWidget(this.templateData, {super.key}); + + @override + State createState() => _RowGradeWidgetState(); +} + +class _RowGradeWidgetState extends State { + Map get _templateData => widget.templateData; + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart b/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart index 0e5f5229a..2e7722017 100644 --- a/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_keypress_widget.dart @@ -61,11 +61,11 @@ class _RowKeypressWidgetState extends State { } Widget _rowItem(bool isDarkMode, Map item) { - return Padding( - padding: EdgeInsets.symmetric(vertical: 10.w), - child: Row( - children: [ - Expanded( + return Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), child: Text( item['label'], textAlign: TextAlign.center, @@ -75,10 +75,13 @@ class _RowKeypressWidgetState extends State { ), ), ), - Expanded( - child: GestureDetector( - onTap: () => _radioDialog(isDarkMode, item, 'left'), - behavior: HitTestBehavior.translucent, + ), + Expanded( + child: GestureDetector( + onTap: () => _radioDialog(isDarkMode, item, 'left'), + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), child: Text( _getLabel(item['left']), textAlign: TextAlign.center, @@ -89,10 +92,13 @@ class _RowKeypressWidgetState extends State { ), ), ), - Expanded( - child: GestureDetector( - onTap: () => _radioDialog(isDarkMode, item, 'right'), - behavior: HitTestBehavior.translucent, + ), + Expanded( + child: GestureDetector( + onTap: () => _radioDialog(isDarkMode, item, 'right'), + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), child: Text( _getLabel(item['right']), textAlign: TextAlign.center, @@ -103,8 +109,8 @@ class _RowKeypressWidgetState extends State { ), ), ), - ], - ), + ), + ], ); } diff --git a/lib/modules/eq_settings/views/widgets/row_timer_widget.dart b/lib/modules/eq_settings/views/widgets/row_timer_widget.dart new file mode 100644 index 000000000..a178662b2 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_timer_widget.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class RowTimerWidget extends StatefulWidget { + final Map templateData; + + const RowTimerWidget(this.templateData, {super.key}); + + @override + State createState() => _RowTimerWidgetState(); +} + +class _RowTimerWidgetState extends State { + Map get _templateData => widget.templateData; + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return GestureDetector( + onTap: () => _timerBottomSheet(isDarkMode), + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + if (_templateData['value'] > 0) + Text( + '${_templateData['value']}分钟', + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + Icon( + Icons.chevron_right, + size: 26.w, + color: Colors.blue, + ), + ], + ), + ), + ); + } + + void _timerBottomSheet(bool isDarkMode) {} +} From d25fa0e99f9da7bf2dc771bac86481896c25f361 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 14:42:33 +0800 Subject: [PATCH 038/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/widgets/row_timer_widget.dart | 23 +- .../views/widgets/select_date.dart | 231 ++++++++++++++++++ 2 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 lib/modules/eq_settings/views/widgets/select_date.dart diff --git a/lib/modules/eq_settings/views/widgets/row_timer_widget.dart b/lib/modules/eq_settings/views/widgets/row_timer_widget.dart index a178662b2..bcc519ba6 100644 --- a/lib/modules/eq_settings/views/widgets/row_timer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_timer_widget.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import 'select_date.dart'; class RowTimerWidget extends StatefulWidget { final Map templateData; @@ -52,5 +55,23 @@ class _RowTimerWidgetState extends State { ); } - void _timerBottomSheet(bool isDarkMode) {} + void _timerBottomSheet(bool isDarkMode) { + Get.bottomSheet( + SelectTimerWidget(_templateData['name'], _templateData['value']), + isScrollControlled: true, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ).then((value) { + if (value != null) { + setState(() { + _templateData['value'] = value; + }); + _templateData['onCallback'](value); + } + }); + } } diff --git a/lib/modules/eq_settings/views/widgets/select_date.dart b/lib/modules/eq_settings/views/widgets/select_date.dart new file mode 100644 index 000000000..ec082d4e2 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/select_date.dart @@ -0,0 +1,231 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class SelectTimerWidget extends StatefulWidget { + final String title; + final int time; + + const SelectTimerWidget(this.title, this.time, {super.key}); + + @override + State createState() => _SelectTimerWidgetState(); +} + +class _SelectTimerWidgetState extends State { + late FixedExtentScrollController _hourScrollController; + late FixedExtentScrollController _minuteScrollController; + + int _hour = 0; + int _minute = 0; + + @override + void initState() { + super.initState(); + _hour = widget.time ~/ 60; + _minute = widget.time % 60; + _hourScrollController = FixedExtentScrollController(initialItem: _hour); + _minuteScrollController = FixedExtentScrollController(initialItem: _minute); + } + + @override + void dispose() { + super.dispose(); + _hourScrollController.dispose(); + _minuteScrollController.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.title, + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), + ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], + ), + ), + ) + ], + ), + ), + Divider( + height: 1, + color: Colors.grey[300], + ), + SizedBox( + height: 220.w, + child: Row( + children: [ + Expanded( + child: CupertinoPicker.builder( + itemExtent: 40.w, + diameterRatio: 1.1, + squeeze: 1.25, + childCount: 24, + selectionOverlay: _selectionOverlayWidget( + isRadiusLeft: true, + ), + scrollController: _hourScrollController, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: EdgeInsets.only(right: 10.w), + alignment: Alignment.centerRight, + child: Text( + '$index时', + style: _hour == index + ? TextStyle( + color: const Color(0xFFFF5561), + fontSize: 15.sp, + fontWeight: FontWeight.w500, + ) + : TextStyle( + color: const Color(0xFF9D9D9D), + fontSize: 15.sp, + ), + ), + ); + }, + onSelectedItemChanged: (int index) { + setState(() { + _hour = index; + }); + }, + ), + ), + Expanded( + child: CupertinoPicker.builder( + itemExtent: 40.w, + diameterRatio: 1.1, + squeeze: 1.25, + childCount: 60, + selectionOverlay: _selectionOverlayWidget( + isRadiusRight: true, + ), + scrollController: _minuteScrollController, + itemBuilder: (BuildContext context, int index) { + return Container( + padding: EdgeInsets.only(left: 10.w), + alignment: Alignment.centerLeft, + child: Text( + '$index分', + style: _minute == index + ? TextStyle( + color: const Color(0xFFFF5561), + fontSize: 15.sp, + fontWeight: FontWeight.w500, + ) + : TextStyle( + color: const Color(0xFF9D9D9D), + fontSize: 15.sp, + ), + ), + ); + }, + onSelectedItemChanged: (int index) { + setState(() { + _minute = index; + }); + }, + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(bottom: 20.w), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => Get.back(), + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + fontSize: 16.sp, + color: Colors.black, + ), + ), + ), + ), + ), + 10.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: () { + int time = _hour * 60 + _minute; + Get.back(result: time); + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'confirm'.tr, // 确认 + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _selectionOverlayWidget({ + bool isRadiusLeft = false, + bool isRadiusRight = false, + }) { + return Container( + decoration: BoxDecoration( + color: const Color.fromARGB(45, 255, 85, 97), + borderRadius: BorderRadius.horizontal( + left: isRadiusLeft ? Radius.circular(8.w) : Radius.zero, + right: isRadiusRight ? Radius.circular(8.w) : Radius.zero, + ), + ), + ); + } +} From 4c26185c7a171c48ec99c33ecb151e0db80db24d Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 15:12:22 +0800 Subject: [PATCH 039/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/widgets/row_grade_widget.dart | 26 +++++++++++++++++++ .../views/widgets/row_timer_widget.dart | 2 +- ...ect_date.dart => select_timer_widget.dart} | 0 3 files changed, 27 insertions(+), 1 deletion(-) rename lib/modules/eq_settings/views/widgets/{select_date.dart => select_timer_widget.dart} (100%) diff --git a/lib/modules/eq_settings/views/widgets/row_grade_widget.dart b/lib/modules/eq_settings/views/widgets/row_grade_widget.dart index 9ac8d9fa4..8abd2d327 100644 --- a/lib/modules/eq_settings/views/widgets/row_grade_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_grade_widget.dart @@ -30,6 +30,32 @@ class _RowGradeWidgetState extends State { ), ), ), + Slider( + value: _templateData['value'].toDouble(), + min: 0, + max: 10, + divisions: 10, + activeColor: Colors.blue, + onChanged: (value) { + setState(() { + _templateData['value'] = value.toInt(); + }); + }, + onChangeEnd: (value) { + _templateData['onCallback'](_templateData['value']); + }, + ), + SizedBox( + width: 15.w, + child: Text( + _templateData['value'].toString(), + textAlign: TextAlign.right, + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + ), ], ), ); diff --git a/lib/modules/eq_settings/views/widgets/row_timer_widget.dart b/lib/modules/eq_settings/views/widgets/row_timer_widget.dart index bcc519ba6..2a950f60e 100644 --- a/lib/modules/eq_settings/views/widgets/row_timer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_timer_widget.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'select_date.dart'; +import 'select_timer_widget.dart'; class RowTimerWidget extends StatefulWidget { final Map templateData; diff --git a/lib/modules/eq_settings/views/widgets/select_date.dart b/lib/modules/eq_settings/views/widgets/select_timer_widget.dart similarity index 100% rename from lib/modules/eq_settings/views/widgets/select_date.dart rename to lib/modules/eq_settings/views/widgets/select_timer_widget.dart From 5c9db7e1df98f2faff4bf521b228da1105d35e80 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 16:14:55 +0800 Subject: [PATCH 040/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 45 ++++++++++- .../views/widgets/row_equalizer_widget.dart | 76 +++++++++++++++++++ .../widgets/select_equalizer_widget.dart | 58 ++++++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart create mode 100644 lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index 7709ff5d1..003a0c23b 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -4,6 +4,7 @@ import 'package:get/get.dart'; import '../../../core/utils/logger.dart'; import '../../../routes/app_routes.dart'; import '../views/widgets/row_confirm_widget.dart'; +import '../views/widgets/row_equalizer_widget.dart'; import '../views/widgets/row_grade_widget.dart'; import '../views/widgets/row_input_widget.dart'; import '../views/widgets/row_keypress_widget.dart'; @@ -15,7 +16,48 @@ class EqSettingsController extends GetxController { final RxList uiList = [ { 'title': '音效', - 'templates': [], + 'templates': [ + { + 'type': 'equalizer', + 'name': '均衡器', + 'value': [], + 'options': [ + { + 'label': '默认', + 'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + 'default': true, + }, + { + 'label': '流行', + 'value': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], + 'default': true, + }, + { + 'label': '摇滚', + 'value': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], + 'default': true, + }, + { + 'label': '爵士', + 'value': [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + 'default': true, + }, + { + 'label': '经典', + 'value': [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + 'default': true, + }, + { + 'label': '乡村', + 'value': [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + 'default': true, + }, + ], + 'onCallback': (List value) { + Logger.d('equalizer', '均衡器:$value'); + }, + } + ], }, { 'title': '按键功能', @@ -135,6 +177,7 @@ class EqSettingsController extends GetxController { Widget getTemplate(Map data) { return switch (data['type']) { + 'equalizer' => RowEqualizerWidget(data), 'keypress' => RowKeypressWidget(data), 'input' => RowInputWidget(data), 'radio' => RowRadioWidget(data), diff --git a/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart new file mode 100644 index 000000000..bdeb652ed --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import 'select_equalizer_widget.dart'; + +class RowEqualizerWidget extends StatefulWidget { + final Map templateData; + + const RowEqualizerWidget(this.templateData, {super.key}); + + @override + State createState() => _RowEqualizerWidgetState(); +} + +class _RowEqualizerWidgetState extends State { + Map get _templateData => widget.templateData; + + String _label = ''; + + @override + void initState() { + super.initState(); + _label = _templateData['options'].firstWhere( + (option) => option['value'] == _templateData['value'], + orElse: () => {'label': ''}, + )['label']; + } + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return GestureDetector( + onTap: () async { + var result = await Get.to(() => SelectEqualizerWidget(_templateData)); + if (result != null) { + setState(() { + _label = result['label']; + }); + _templateData['value'] = result['value']; + _templateData['onCallback'](result['value']); + } + }, + behavior: HitTestBehavior.translucent, + child: Padding( + padding: EdgeInsets.fromLTRB(10.w, 10.w, 0, 10.w), + child: Row( + children: [ + Expanded( + child: Text( + _templateData['name'], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Text( + _label, + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), + Icon( + Icons.chevron_right, + size: 26.w, + color: Colors.blue, + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart new file mode 100644 index 000000000..c9c364d62 --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class SelectEqualizerWidget extends StatefulWidget { + final Map templateData; + + const SelectEqualizerWidget(this.templateData, {super.key}); + + @override + State createState() => _SelectEqualizerWidgetState(); +} + +class _SelectEqualizerWidgetState extends State { + Map get _templateData => widget.templateData; + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + // 构建应用栏 + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + surfaceTintColor: Colors.transparent, + elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, + size: 20.sp, + ), + onPressed: () => Get.back(), + ), + title: Text( + _templateData['name'], + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ); + } + + // 构建主体内容 + Widget _buildBody(bool isDarkMode) { + return Container(); + } +} From d3a445259716964b54f2e37502c67fa56ff00ddc Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 16:41:39 +0800 Subject: [PATCH 041/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/select_equalizer_widget.dart | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index c9c364d62..3ff4abeaf 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -53,6 +53,62 @@ class _SelectEqualizerWidgetState extends State { // 构建主体内容 Widget _buildBody(bool isDarkMode) { - return Container(); + return ListView( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), + children: [ + Wrap( + spacing: 10.w, + runSpacing: 10.w, + children: _templateData['options'].map((Map option) { + return _item(isDarkMode, option); + }).toList(), + ), + ], + ); + } + + Widget _item(bool isDarkMode, Map option) { + return GestureDetector( + onTap: () { + Get.back(result: { + 'label': option['label'], + 'value': option['value'], + }); + }, + child: Container( + width: 110.w, + height: 110.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: _templateData['value'] == option['value'] + ? Colors.green + : isDarkMode + ? Colors.white.withValues(alpha: 0.05) + : Colors.white, + borderRadius: BorderRadius.circular(8.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Text( + option['label'], + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: _templateData['value'] == option['value'] + ? Colors.white + : isDarkMode + ? Colors.white + : Colors.black, + ), + ), + ), + ); } } From 5670ac3819077fc34290005d175a7466b102c5e8 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 19 Nov 2025 17:55:39 +0800 Subject: [PATCH 042/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 ++++++++++++++++++ lib/data/services/pay_service.dart | 6 +----- pubspec.yaml | 3 ++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4d98d097a..e08b80ab5 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,21 @@ lib/ │ └─ main.dart # 程序入口 ``` +### 本地调试内购(IAP)流程 + +不需要真实购买即可在本地跑通前端内购流程: + +- 在项目根目录的环境变量文件(如 `.env`)里添加: + +``` +APP_IAP_MOCK=1 +``` + +- 作用:在 `PayService` 中启用“本地内购模拟”,调用 `processGooglePayment` 或 `processApplePayment` 会: + - 立即触发“已发起内购(本地模拟)”; + - 短暂延时后触发“支付处理中…(本地模拟)”; + - 再触发“支付成功(本地模拟)”。 + +- 注意:该模式不依赖 Google Play / App Store 安装来源,也不会进行服务器收据校验,仅用于前端 UI 与状态机验证。 + +- 关闭模拟:将 `APP_IAP_MOCK` 移除或设为 `0/false`,恢复真实内购流程。 diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index 1f8fe1882..abda1ca0a 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -287,7 +287,7 @@ class PayService extends GetxService { } /// 构建 Apple/Google 主动查询(pay_askorder)所需的验证参数 - /// 返回与后端 PayAskOrCancelReq 对应的 Map + /// 返回与后端 PayAskOrCancelReq 对应的 Map(不再携带 apple_sandbox) Future> buildIapAskParams() async { final params = {}; if (_lastOrderId != null && _lastOrderId!.isNotEmpty) { @@ -301,12 +301,8 @@ class PayService extends GetxService { final txId = _lastIapPurchase?.purchaseID ?? ''; // 是否按交易ID校验,默认 false,可通过环境变量开启 final useTxIdEnv = _getEnvBool('APP_IAP_USE_TXID', defaultValue: false); - // 沙箱标识,默认在非发布模式下认为是沙箱;支持环境变量覆盖 - final sandbox = - _getEnvBool('APP_IAP_SANDBOX', defaultValue: !kReleaseMode); params['apple_receipt_data'] = useTxIdEnv ? txId : receiptOrData; params['apple_use_transaction_id'] = useTxIdEnv; - params['apple_sandbox'] = sandbox; } else if (platform == 'android') { final packageInfo = await PackageInfo.fromPlatform(); final pkg = packageInfo.packageName; diff --git a/pubspec.yaml b/pubspec.yaml index 52bdd5bc4..5943a452f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.18+54 +version: 1.0.18+57 environment: sdk: ">=3.3.0 <4.0.0" @@ -66,6 +66,7 @@ dependencies: tobias: ^5.2.0 # 支付宝SDK url_launcher: ^6.3.1 in_app_purchase: ^3.1.11 + in_app_purchase_android: ^0.4.0+5 firebase_core: ^4.0.0 firebase_auth: ^6.0.1 google_sign_in: ^6.2.2 From 1b0ec9676ca35d0a243a26a3f206158a94a04519 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 20:14:03 +0800 Subject: [PATCH 043/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 26 +++++--- .../widgets/select_equalizer_widget.dart | 62 ++++++++++++++++++- 2 files changed, 79 insertions(+), 9 deletions(-) diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index 003a0c23b..7b4341ae4 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -20,39 +20,51 @@ class EqSettingsController extends GetxController { { 'type': 'equalizer', 'name': '均衡器', - 'value': [], + 'value': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'options': [ { 'label': '默认', - 'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + 'value': [1, 2, 3, 4, 5, 4, 3, 2, 1, 0], 'default': true, }, { 'label': '流行', - 'value': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], + 'value': [1, 0, 3, 4, 5, 4, 1, 2, 1, 0], 'default': true, }, { 'label': '摇滚', - 'value': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], + 'value': [2, 3, 4, 5, 4, 3, 2, 1, 0, -1], 'default': true, }, { 'label': '爵士', - 'value': [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + 'value': [3, 4, 0, 4, 3, 2, 1, 0, -1, -2], 'default': true, }, { 'label': '经典', - 'value': [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + 'value': [3, 4, 2, 4, 3, 2, 1, 0, -1, -2], 'default': true, }, { 'label': '乡村', - 'value': [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], + 'value': [3, 4, 1, 4, 3, 2, 1, 0, -1, -2], 'default': true, }, ], + 'xAxis': [ + '8', + '31', + '62', + '125', + '250', + '500', + '1K', + '2K', + '4K', + '16K' + ], 'onCallback': (List value) { Logger.d('equalizer', '均衡器:$value'); }, diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 3ff4abeaf..12e96a718 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -14,6 +15,14 @@ class SelectEqualizerWidget extends StatefulWidget { class _SelectEqualizerWidgetState extends State { Map get _templateData => widget.templateData; + List _values = []; + + @override + void initState() { + super.initState(); + _values = List.from(_templateData['value']); + } + @override Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; @@ -56,6 +65,7 @@ class _SelectEqualizerWidgetState extends State { return ListView( padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), children: [ + _equalizer(isDarkMode), Wrap( spacing: 10.w, runSpacing: 10.w, @@ -67,6 +77,54 @@ class _SelectEqualizerWidgetState extends State { ); } + Widget _equalizer(bool isDarkMode) { + return Container( + height: 220.w, + margin: EdgeInsets.only(bottom: 5.w), + child: Row( + children: List.generate( + _templateData['xAxis'].length, + (index) => Expanded( + child: Column( + children: [ + Expanded( + child: RotatedBox( + quarterTurns: 3, + child: StatefulBuilder( + builder: (BuildContext context, setStateful) { + return Slider( + value: _values[index].toDouble(), + min: -5, + max: 5, + divisions: 10, + activeColor: Colors.green, + onChanged: (value) { + setStateful(() { + _values[index] = value.toInt(); + }); + }, + onChangeEnd: (value) { + setState(() {}); + }, + ); + }, + ), + ), + ), + Text( + _templateData['xAxis'][index], + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.grey), + ), + ], + ), + ), + ), + ), + ); + } + Widget _item(bool isDarkMode, Map option) { return GestureDetector( onTap: () { @@ -80,7 +138,7 @@ class _SelectEqualizerWidgetState extends State { height: 110.w, alignment: Alignment.center, decoration: BoxDecoration( - color: _templateData['value'] == option['value'] + color: listEquals(_values, option['value']) ? Colors.green : isDarkMode ? Colors.white.withValues(alpha: 0.05) @@ -101,7 +159,7 @@ class _SelectEqualizerWidgetState extends State { style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: _templateData['value'] == option['value'] + color: listEquals(_values, option['value']) ? Colors.white : isDarkMode ? Colors.white From 90baacd0a269d700863cadc1daa0314e6192d46c Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 20:38:18 +0800 Subject: [PATCH 044/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/select_equalizer_widget.dart | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 12e96a718..a9cfc7431 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -85,37 +85,39 @@ class _SelectEqualizerWidgetState extends State { children: List.generate( _templateData['xAxis'].length, (index) => Expanded( - child: Column( + child: Stack( children: [ - Expanded( - child: RotatedBox( - quarterTurns: 3, - child: StatefulBuilder( - builder: (BuildContext context, setStateful) { - return Slider( - value: _values[index].toDouble(), - min: -5, - max: 5, - divisions: 10, - activeColor: Colors.green, - onChanged: (value) { - setStateful(() { - _values[index] = value.toInt(); - }); - }, - onChangeEnd: (value) { - setState(() {}); - }, - ); - }, - ), + RotatedBox( + quarterTurns: 3, + child: StatefulBuilder( + builder: (BuildContext context, setStateful) { + return Slider( + value: _values[index].toDouble(), + min: -5, + max: 5, + divisions: 10, + activeColor: Colors.green, + onChanged: (value) { + setStateful(() { + _values[index] = value.toInt(); + }); + }, + onChangeEnd: (value) { + setState(() {}); + }, + ); + }, ), ), - Text( - _templateData['xAxis'][index], - style: TextStyle( + Align( + alignment: Alignment.bottomCenter, + child: Text( + _templateData['xAxis'][index], + style: TextStyle( fontSize: 14.sp, - color: isDarkMode ? Colors.white : Colors.grey), + color: isDarkMode ? Colors.white : Colors.grey, + ), + ), ), ], ), From 5a67ca76ad6fe3bdd9ad7e2892f268cb0234ef63 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 21:06:39 +0800 Subject: [PATCH 045/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/select_equalizer_widget.dart | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index a9cfc7431..1c62abde0 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -62,6 +62,8 @@ class _SelectEqualizerWidgetState extends State { // 构建主体内容 Widget _buildBody(bool isDarkMode) { + bool isAdd = true; + return ListView( padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), children: [ @@ -69,9 +71,41 @@ class _SelectEqualizerWidgetState extends State { Wrap( spacing: 10.w, runSpacing: 10.w, - children: _templateData['options'].map((Map option) { - return _item(isDarkMode, option); - }).toList(), + children: [ + ..._templateData['options'].map((Map option) { + bool isSelected = listEquals(_values, option['value']); + if (isSelected) { + isAdd = false; + } + return _item(isDarkMode, option, isSelected); + }).toList(), + if (isAdd) + Container( + width: 110.w, + height: 110.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.white.withValues(alpha: 0.05) + : Colors.white, + borderRadius: BorderRadius.circular(8.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Icon( + Icons.add, + size: 40.sp, + color: Colors.green, + ), + ), + ], ), ], ); @@ -127,7 +161,7 @@ class _SelectEqualizerWidgetState extends State { ); } - Widget _item(bool isDarkMode, Map option) { + Widget _item(bool isDarkMode, Map option, bool isSelected) { return GestureDetector( onTap: () { Get.back(result: { @@ -140,7 +174,7 @@ class _SelectEqualizerWidgetState extends State { height: 110.w, alignment: Alignment.center, decoration: BoxDecoration( - color: listEquals(_values, option['value']) + color: isSelected ? Colors.green : isDarkMode ? Colors.white.withValues(alpha: 0.05) @@ -161,7 +195,7 @@ class _SelectEqualizerWidgetState extends State { style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: listEquals(_values, option['value']) + color: isSelected ? Colors.white : isDarkMode ? Colors.white From d9d708fb58bc90619f122f7e61908edbf2f0f151 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 19 Nov 2025 21:24:34 +0800 Subject: [PATCH 046/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/widgets/row_input_widget.dart | 161 +---------------- .../widgets/select_equalizer_widget.dart | 66 ++++--- .../views/widgets/settings_input_widget.dart | 162 ++++++++++++++++++ 3 files changed, 208 insertions(+), 181 deletions(-) create mode 100644 lib/modules/eq_settings/views/widgets/settings_input_widget.dart diff --git a/lib/modules/eq_settings/views/widgets/row_input_widget.dart b/lib/modules/eq_settings/views/widgets/row_input_widget.dart index 2409e644e..339b79ce8 100644 --- a/lib/modules/eq_settings/views/widgets/row_input_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_input_widget.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'settings_input_widget.dart'; + class RowInputWidget extends StatefulWidget { final Map templateData; @@ -54,7 +56,7 @@ class _RowInputWidgetState extends State { void _inputBottomSheet(bool isDarkMode) { Get.bottomSheet( - InputBox(_templateData['name'], _templateData['value']), + SettingsInputWidget(_templateData['name'], _templateData['value']), isScrollControlled: true, backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], shape: RoundedRectangleBorder( @@ -72,160 +74,3 @@ class _RowInputWidgetState extends State { }); } } - -class InputBox extends StatefulWidget { - final String title; - final String inputText; - - const InputBox(this.title, this.inputText, {super.key}); - - @override - State createState() => _InputBoxState(); -} - -class _InputBoxState extends State { - final TextEditingController _inputController = TextEditingController(); - - @override - void initState() { - super.initState(); - _inputController.text = widget.inputText; - } - - @override - void dispose() { - _inputController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: EdgeInsets.symmetric(vertical: 10.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.title, - style: TextStyle( - fontSize: 16.sp, - color: Colors.black87, - fontWeight: FontWeight.bold, - ), - ), - GestureDetector( - onTap: () => Get.back(), - child: Container( - width: 26.w, - height: 26.w, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(26.r), - ), - child: Icon( - Icons.close, - size: 18.w, - color: Colors.grey[400], - ), - ), - ) - ], - ), - ), - Divider( - height: 1, - color: Colors.grey[300], - ), - Container( - margin: EdgeInsets.symmetric(vertical: 20.w), - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12.w), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.05), - blurRadius: 10, - offset: const Offset(0, 2), - ), - ], - ), - child: TextField( - controller: _inputController, - style: TextStyle( - color: Colors.black87, - fontSize: 16.sp, - ), - decoration: InputDecoration( - hintText: 'maxCharacters'.tr, - hintStyle: TextStyle( - color: Colors.black54, - fontSize: 16.sp, - ), - isDense: true, - fillColor: Colors.transparent, - border: InputBorder.none, - contentPadding: EdgeInsets.all(10.w), - ), - ), - ), - Padding( - padding: EdgeInsets.only(bottom: 20.w), - child: Row( - children: [ - Expanded( - child: GestureDetector( - onTap: () => Get.back(), - child: Container( - height: 48.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.grey[300], - borderRadius: BorderRadius.circular(12.r), - ), - child: Text( - 'cancel'.tr, // 取消 - style: TextStyle( - fontSize: 16.sp, - color: Colors.black, - ), - ), - ), - ), - ), - 10.horizontalSpace, - Expanded( - child: GestureDetector( - onTap: () { - Get.back(result: _inputController.text); - }, - child: Container( - height: 48.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(12.r), - ), - child: Text( - 'confirm'.tr, // 确认 - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - ), - ), - ), - ), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 1c62abde0..427c643d2 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'settings_input_widget.dart'; + class SelectEqualizerWidget extends StatefulWidget { final Map templateData; @@ -80,29 +82,32 @@ class _SelectEqualizerWidgetState extends State { return _item(isDarkMode, option, isSelected); }).toList(), if (isAdd) - Container( - width: 110.w, - height: 110.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.white.withValues(alpha: 0.05) - : Colors.white, - borderRadius: BorderRadius.circular(8.w), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withValues(alpha: 0.2) - : Colors.black.withValues(alpha: 0.05), - blurRadius: 10, - offset: const Offset(0, 4), - ), - ], - ), - child: Icon( - Icons.add, - size: 40.sp, - color: Colors.green, + GestureDetector( + onTap: () => _inputBottomSheet(isDarkMode), + child: Container( + width: 110.w, + height: 110.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.white.withValues(alpha: 0.05) + : Colors.white, + borderRadius: BorderRadius.circular(8.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Icon( + Icons.add, + size: 40.sp, + color: Colors.green, + ), ), ), ], @@ -205,4 +210,19 @@ class _SelectEqualizerWidgetState extends State { ), ); } + + void _inputBottomSheet(bool isDarkMode) { + Get.bottomSheet( + const SettingsInputWidget('添加均衡器', ''), + isScrollControlled: true, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ).then((value) { + if (value != null) {} + }); + } } diff --git a/lib/modules/eq_settings/views/widgets/settings_input_widget.dart b/lib/modules/eq_settings/views/widgets/settings_input_widget.dart new file mode 100644 index 000000000..ea41dd49c --- /dev/null +++ b/lib/modules/eq_settings/views/widgets/settings_input_widget.dart @@ -0,0 +1,162 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +class SettingsInputWidget extends StatefulWidget { + final String title; + final String inputText; + + const SettingsInputWidget(this.title, this.inputText, {super.key}); + + @override + State createState() => _SettingsInputWidgetState(); +} + +class _SettingsInputWidgetState extends State { + final TextEditingController _inputController = TextEditingController(); + + @override + void initState() { + super.initState(); + _inputController.text = widget.inputText; + } + + @override + void dispose() { + _inputController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.title, + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), + ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], + ), + ), + ) + ], + ), + ), + Divider( + height: 1, + color: Colors.grey[300], + ), + Container( + margin: EdgeInsets.symmetric(vertical: 20.w), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: TextField( + controller: _inputController, + style: TextStyle( + color: Colors.black87, + fontSize: 16.sp, + ), + decoration: InputDecoration( + hintText: 'maxCharacters'.tr, + hintStyle: TextStyle( + color: Colors.black54, + fontSize: 16.sp, + ), + isDense: true, + fillColor: Colors.transparent, + border: InputBorder.none, + contentPadding: EdgeInsets.all(10.w), + ), + ), + ), + Padding( + padding: EdgeInsets.only(bottom: 20.w), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => Get.back(), + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + fontSize: 16.sp, + color: Colors.black, + ), + ), + ), + ), + ), + 10.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: () { + if (_inputController.text.isNotEmpty) { + Get.back(result: _inputController.text); + } + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'confirm'.tr, // 确认 + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } +} From 3c5c31b8bbe1948439c01ca8d4d9dad6ffb50122 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 20 Nov 2025 11:11:24 +0800 Subject: [PATCH 047/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/select_equalizer_widget.dart | 124 +++++++++++++----- 1 file changed, 93 insertions(+), 31 deletions(-) diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 427c643d2..6fcf6429a 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -19,6 +19,8 @@ class _SelectEqualizerWidgetState extends State { List _values = []; + bool isEdit = false; + @override void initState() { super.initState(); @@ -59,6 +61,28 @@ class _SelectEqualizerWidgetState extends State { ), ), centerTitle: true, + actions: [ + GestureDetector( + onTap: () { + setState(() { + isEdit = !isEdit; + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w, + vertical: 6.w, + ), + child: Text( + isEdit ? 'cancel'.tr : 'edit'.tr, + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + fontSize: 16.sp, + ), + ), + ), + ), + ], ); } @@ -174,39 +198,69 @@ class _SelectEqualizerWidgetState extends State { 'value': option['value'], }); }, - child: Container( - width: 110.w, - height: 110.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: isSelected - ? Colors.green - : isDarkMode - ? Colors.white.withValues(alpha: 0.05) - : Colors.white, - borderRadius: BorderRadius.circular(8.w), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withValues(alpha: 0.2) - : Colors.black.withValues(alpha: 0.05), - blurRadius: 10, - offset: const Offset(0, 4), + child: Stack( + children: [ + Container( + width: 110.w, + height: 110.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: isSelected + ? Colors.green + : isDarkMode + ? Colors.white.withValues(alpha: 0.05) + : Colors.white, + borderRadius: BorderRadius.circular(8.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], ), - ], - ), - child: Text( - option['label'], - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isSelected - ? Colors.white - : isDarkMode + child: Text( + option['label'], + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isSelected ? Colors.white - : Colors.black, + : isDarkMode + ? Colors.white + : Colors.black, + ), + ), ), - ), + if (isEdit && !option['default']) + Positioned( + top: 4.w, + right: 4.w, + child: GestureDetector( + onTap: () { + setState(() { + _templateData['options'].remove(option); + }); + }, + child: Container( + width: 24.w, + height: 24.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(12.w), + ), + child: Icon( + Icons.close, + size: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ], ), ); } @@ -222,7 +276,15 @@ class _SelectEqualizerWidgetState extends State { ), ), ).then((value) { - if (value != null) {} + if (value != null) { + setState(() { + _templateData['options'].add({ + 'label': value, + 'value': List.from(_values), + 'default': false, + }); + }); + } }); } } From 708c93017a1bbcee726a35dfb9ce0bbc6d2e7b5b Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 20 Nov 2025 11:48:19 +0800 Subject: [PATCH 048/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eq_settings/controllers/eq_settings_controller.dart | 2 +- .../eq_settings/views/widgets/row_equalizer_widget.dart | 3 ++- .../eq_settings/views/widgets/select_equalizer_widget.dart | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index 7b4341ae4..a80ab8b97 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -20,7 +20,7 @@ class EqSettingsController extends GetxController { { 'type': 'equalizer', 'name': '均衡器', - 'value': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 'value': [], 'options': [ { 'label': '默认', diff --git a/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart index bdeb652ed..93194c36c 100644 --- a/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -22,7 +23,7 @@ class _RowEqualizerWidgetState extends State { void initState() { super.initState(); _label = _templateData['options'].firstWhere( - (option) => option['value'] == _templateData['value'], + (option) => listEquals(_templateData['value'], option['value']), orElse: () => {'label': ''}, )['label']; } diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 6fcf6429a..98fe0549e 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -17,14 +17,16 @@ class SelectEqualizerWidget extends StatefulWidget { class _SelectEqualizerWidgetState extends State { Map get _templateData => widget.templateData; - List _values = []; + List _values = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; bool isEdit = false; @override void initState() { super.initState(); - _values = List.from(_templateData['value']); + if (_templateData['value'].isNotEmpty) { + _values = List.from(_templateData['value']); + } } @override From 7fcfff628f8f64c4d9c36ca1c842809a86aae556 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 20 Nov 2025 14:25:08 +0800 Subject: [PATCH 049/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/widgets/row_equalizer_widget.dart | 16 +++++++++++----- .../views/widgets/select_equalizer_widget.dart | 10 ++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart index 93194c36c..cccd24734 100644 --- a/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/row_equalizer_widget.dart @@ -28,6 +28,15 @@ class _RowEqualizerWidgetState extends State { )['label']; } + void _setLabel() { + setState(() { + _label = _templateData['options'].firstWhere( + (option) => listEquals(_templateData['value'], option['value']), + orElse: () => {'label': ''}, + )['label']; + }); + } + @override Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; @@ -35,12 +44,9 @@ class _RowEqualizerWidgetState extends State { return GestureDetector( onTap: () async { var result = await Get.to(() => SelectEqualizerWidget(_templateData)); + _setLabel(); if (result != null) { - setState(() { - _label = result['label']; - }); - _templateData['value'] = result['value']; - _templateData['onCallback'](result['value']); + _templateData['onCallback'](_templateData['value']); } }, behavior: HitTestBehavior.translucent, diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 98fe0549e..3532b18ac 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -195,10 +195,8 @@ class _SelectEqualizerWidgetState extends State { Widget _item(bool isDarkMode, Map option, bool isSelected) { return GestureDetector( onTap: () { - Get.back(result: { - 'label': option['label'], - 'value': option['value'], - }); + _templateData['value'] = option['value']; + Get.back(result: true); }, child: Stack( children: [ @@ -242,6 +240,10 @@ class _SelectEqualizerWidgetState extends State { right: 4.w, child: GestureDetector( onTap: () { + if (isSelected) { + _templateData['value'] = []; + _templateData['onCallback']([]); + } setState(() { _templateData['options'].remove(option); }); From 6bd91d2431aa8826c029c57fd57d0154cbc8156a Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 20 Nov 2025 14:33:21 +0800 Subject: [PATCH 050/177] =?UTF-8?q?fix(ble=5Fmanager):=20=E5=9C=A8?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=96=B0=E8=AE=BE=E5=A4=87=E5=89=8D=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E8=AE=BE=E5=A4=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 确保在连接新设备时清除上一个设备的残留信息,避免数据混淆 --- lib/data/services/ble_manager.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index ae6bedbb1..f367f466b 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -1156,6 +1156,11 @@ class BleManager extends GetxService { List? uuids, }) async { try { + // 在注册新设备前先清除旧设备信息 + if (macAddress != null && macAddress != currentDeviceAddress) { + clearDeviceInfo(); // 清除上一个设备的信息 + } + // 保存设备地址信息 if (macAddress != null) { currentDeviceAddress = macAddress; From 21df4c3c0d018f69520a49943c38abcf0165dd0c Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 20 Nov 2025 15:01:45 +0800 Subject: [PATCH 051/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0paypal=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 14 +++ ios/Runner/Info.plist | 9 ++ lib/data/services/network/dio_manager.dart | 10 ++ lib/data/services/pay_service.dart | 13 +++ .../controllers/goods_base_controller.dart | 109 +++++++++++++++++- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + pubspec.yaml | 1 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 10 files changed, 160 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 915595a3f..c2de8317d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -109,6 +109,20 @@ + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 7720e0d46..c2c5f976b 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -54,6 +54,15 @@ voitrans + + + CFBundleURLName + deepvoiceclient.payment + CFBundleURLSchemes + + deepvoiceclient + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) diff --git a/lib/data/services/network/dio_manager.dart b/lib/data/services/network/dio_manager.dart index 0496c11f9..e0141cc36 100644 --- a/lib/data/services/network/dio_manager.dart +++ b/lib/data/services/network/dio_manager.dart @@ -34,6 +34,16 @@ class DioManager { dio = Dio(options); dio.interceptors.add(AuthInterceptor()); + // 调试:输出请求与响应的详细日志,便于排查服务端创建订单或查询订单问题 + dio.interceptors.add(LogInterceptor( + request: true, + requestHeader: true, + requestBody: true, + responseHeader: false, + responseBody: true, + error: true, + logPrint: (obj) => print('[DIO] $obj'), + )); } // 请求,返回参数为 T diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index abda1ca0a..bbe89c42b 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -774,6 +774,9 @@ class PayService extends GetxService { String? extraData, }) async { try { + // 回跳地址:自定义 Scheme,分别用于支付完成与取消 + const returnUrl = 'deepvoiceclient://paypal/return'; + const cancelUrl = 'deepvoiceclient://paypal/cancel'; final response = await Api.paycreateorder({ 'product_id': productId, 'product_name': productName, @@ -783,9 +786,13 @@ class PayService extends GetxService { 'client_ip': clientIp ?? '', 'notify_url': notifyUrl ?? '', 'extra_data': extraData ?? '', + // 供后端设置 PayPal application_context 用于网页授权回跳 + 'return_url': returnUrl, + 'cancel_url': cancelUrl, }); if (response != null) { + print('创建 PayPal 订单响应: $response'); // 1) 提取并缓存平台订单号(用于回查) String? appOrderId; const candidates = [ @@ -839,6 +846,8 @@ class PayService extends GetxService { hrefRaw.isNotEmpty) { // 清理日志中可能出现的反引号等噪音字符 final href = hrefRaw.replaceAll('`', '').trim(); + print( + '解析到 PayPal 授权链接(links.approve): $href, appOrderId: $appOrderId'); return href; } } @@ -862,6 +871,7 @@ class PayService extends GetxService { for (final key in urlKeys) { final url = response[key]; if (url is String && url.isNotEmpty) { + print('解析到 PayPal 授权链接($key): $url, appOrderId: $appOrderId'); return url; } } @@ -869,6 +879,8 @@ class PayService extends GetxService { for (final key in urlKeys) { final url = data[key]; if (url is String && url.isNotEmpty) { + print( + '解析到 PayPal 授权链接(data.$key): $url, appOrderId: $appOrderId'); return url; } } @@ -890,6 +902,7 @@ class PayService extends GetxService { PaymentResultCallback? onResult, }) async { try { + print('准备打开 PayPal 授权页面: $approvalUrl'); final uri = Uri.parse(approvalUrl); final ok = await launchUrl(uri, mode: LaunchMode.externalApplication); if (ok) { diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 0ff6faf38..846b35dc6 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -9,6 +9,8 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../../../data/services/network/dio_manager.dart'; import '../../../data/services/network/api.dart'; import 'package:flutter/foundation.dart'; +import 'dart:async'; +import 'package:app_links/app_links.dart'; /// goods 模块基础控制器,封装通用的商品加载与支付流程 abstract class GoodsBaseController extends GetxController { @@ -17,11 +19,22 @@ abstract class GoodsBaseController extends GetxController { final RxString error = ''.obs; late final PayService _payService = Get.find(); + StreamSubscription? _deeplinkSub; + late final AppLinks _appLinks = AppLinks(); @override void onInit() { super.onInit(); _init(); + // 处理冷启动场景:如果 App 通过深链直接启动 + _handleInitialDeepLink(); + } + + @override + void onClose() { + _deeplinkSub?.cancel(); + _deeplinkSub = null; + super.onClose(); } Future _init() async { @@ -559,8 +572,13 @@ abstract class GoodsBaseController extends GetxController { } } - Future _confirmOrderAndShow(String? orderId, - {required String channel, String? initialMessage}) async { + Future _confirmOrderAndShow( + String? orderId, { + required String channel, + String? initialMessage, + int retries = 5, + int intervalMs = 1500, + }) async { // 若无法获取订单号,直接弹成功提示但提醒稍后刷新 if (orderId == null || orderId.isEmpty) { _showPayResultDialog(true, '${channel}支付成功,订单处理中,请稍后查看。'); @@ -571,7 +589,7 @@ abstract class GoodsBaseController extends GetxController { bool success = false; try { // 简单轮询回查,避免回调延迟 - for (int i = 0; i < 5; i++) { + for (int i = 0; i < retries; i++) { final resp = await Api.payaskorder({'order_id': orderId}); print("查询订单 resp: $resp"); final order = resp?['order'] as Map?; @@ -584,7 +602,7 @@ abstract class GoodsBaseController extends GetxController { break; } } - await Future.delayed(const Duration(milliseconds: 1500)); + await Future.delayed(Duration(milliseconds: intervalMs)); } // 若标记成功但未拿到用户信息,使用token登录接口回拉用户资料,确保额度刷新 @@ -728,7 +746,88 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(false, '创建 PayPal 订单失败'); return false; } - return _payService.paypalPay(approvalUrl: approvalUrl, onResult: onResult); + final orderId = _payService.lastOrderId; // 创建订单时已缓存 + print('[PayPal] 创建完成,orderId: $orderId, approvalUrl: $approvalUrl'); + + // 启动深链监听:当浏览器重定向到 deepvoiceclient://paypal/return 或 /cancel 时处理 + _deeplinkSub?.cancel(); + _deeplinkSub = _appLinks.uriLinkStream.listen((uri) async { + if (uri == null) return; + print('[PayPal] 深链回跳: ${uri.toString()}'); + final token = uri.queryParameters['token'] ?? ''; + if (token.isNotEmpty) { + print('[PayPal] 回跳 token(订单ID): $token'); + } + final scheme = uri.scheme; + final host = uri.host; + final path = uri.path; + if (scheme == 'deepvoiceclient' && host == 'paypal') { + if (path == '/return') { + print('[PayPal] 检测到 /return,使用 orderId 回查: $orderId'); + await _confirmOrderAndShow( + orderId, + channel: 'PayPal', + initialMessage: '支付完成,正在确认', + retries: 1, + intervalMs: 0, + ); + } else if (path == '/cancel') { + _showPayResultDialog(false, '已取消支付'); + } + // 一次性监听,处理后即取消 + _deeplinkSub?.cancel(); + _deeplinkSub = null; + } + }, onError: (e) { + // 忽略监听错误,保持现有轮询逻辑 + }); + return _payService.paypalPay( + approvalUrl: approvalUrl, + onResult: (success, msg) async { + onResult?.call(success, msg); + if (success) { + // 仅提示已打开授权页面,不在此处回查与弹窗,等待深链回跳后再处理 + print('[PayPal] 已打开授权页面,等待回跳后再确认。orderId: $orderId'); + Get.snackbar('提示', msg ?? '已打开 PayPal,请在浏览器完成支付', + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(12)); + } else { + // 无法打开授权页才提示失败 + _showPayResultDialog(false, msg ?? '无法打开 PayPal 支付页面'); + } + }, + ); + } + + Future _handleInitialDeepLink() async { + try { + final uri = await _appLinks.getInitialLink(); + if (uri == null) return; + print('[PayPal] 冷启动深链: ${uri.toString()}'); + final token = uri.queryParameters['token'] ?? ''; + if (token.isNotEmpty) { + print('[PayPal] 冷启动 token(订单ID): $token'); + } + if (uri.scheme == 'deepvoiceclient' && uri.host == 'paypal') { + if (uri.path == '/return') { + final orderId = _payService.lastOrderId; + if (orderId != null) { + print('[PayPal] 冷启动 /return,使用 orderId 回查: $orderId'); + await _confirmOrderAndShow( + orderId, + channel: 'PayPal', + initialMessage: '支付完成,正在确认', + retries: 1, + intervalMs: 0, + ); + } + } else if (uri.path == '/cancel') { + _showPayResultDialog(false, '已取消支付'); + } + } + } catch (_) { + // 忽略异常,维持原有逻辑 + } } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index f443e8bbe..382b3ca70 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -19,6 +20,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) gtk_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); + gtk_plugin_register_with_registrar(gtk_registrar); g_autoptr(FlPluginRegistrar) record_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); record_linux_plugin_register_with_registrar(record_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 346ccb75e..bd3f71e4d 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -5,6 +5,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_linux flutter_secure_storage_linux + gtk record_linux url_launcher_linux window_size diff --git a/pubspec.yaml b/pubspec.yaml index 5943a452f..26889ffc7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -67,6 +67,7 @@ dependencies: url_launcher: ^6.3.1 in_app_purchase: ^3.1.11 in_app_purchase_android: ^0.4.0+5 + app_links: firebase_core: ^4.0.0 firebase_auth: ^6.0.1 google_sign_in: ^6.2.2 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index fae16f5da..227ab6e38 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,7 @@ #include "generated_plugin_registrant.h" +#include #include #include #include @@ -19,6 +20,8 @@ #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AppLinksPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AppLinksPluginCApi")); ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); FileSelectorWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 44fbd12be..17287648d 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + app_links connectivity_plus file_selector_windows firebase_auth From e47f2e338afe3726613b55e4e6d08378a458df5d Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 20 Nov 2025 17:05:04 +0800 Subject: [PATCH 052/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/eq_settings_controller.dart | 14 +++++++++++++ .../widgets/select_equalizer_widget.dart | 21 ++++++++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/modules/eq_settings/controllers/eq_settings_controller.dart b/lib/modules/eq_settings/controllers/eq_settings_controller.dart index a80ab8b97..12a373c0c 100644 --- a/lib/modules/eq_settings/controllers/eq_settings_controller.dart +++ b/lib/modules/eq_settings/controllers/eq_settings_controller.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import '../../../core/utils/logger.dart'; import '../../../routes/app_routes.dart'; @@ -187,6 +188,19 @@ class EqSettingsController extends GetxController { } ].obs; + final GetStorage _storage = GetStorage(); + + @override + void onInit() { + super.onInit(); + final List equalizerOptions = _storage.read('equalizer_options') ?? []; + if (equalizerOptions.isNotEmpty) { + List options = + equalizerOptions.map((e) => Map.from(e)).toList(); + uiList[0]['templates'][0]['options'].addAll(options); + } + } + Widget getTemplate(Map data) { return switch (data['type']) { 'equalizer' => RowEqualizerWidget(data), diff --git a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart index 3532b18ac..ea04be1f5 100644 --- a/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart +++ b/lib/modules/eq_settings/views/widgets/select_equalizer_widget.dart @@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import 'settings_input_widget.dart'; @@ -21,12 +22,16 @@ class _SelectEqualizerWidgetState extends State { bool isEdit = false; + final GetStorage _storage = GetStorage(); + List _equalizerOptions = []; + @override void initState() { super.initState(); if (_templateData['value'].isNotEmpty) { _values = List.from(_templateData['value']); } + _equalizerOptions = _storage.read('equalizer_options') ?? []; } @override @@ -244,6 +249,9 @@ class _SelectEqualizerWidgetState extends State { _templateData['value'] = []; _templateData['onCallback']([]); } + _equalizerOptions.removeWhere( + (e) => listEquals(e['value'], option['value'])); + _storage.write('equalizer_options', _equalizerOptions); setState(() { _templateData['options'].remove(option); }); @@ -281,12 +289,15 @@ class _SelectEqualizerWidgetState extends State { ), ).then((value) { if (value != null) { + Map option = { + 'label': value, + 'value': List.from(_values), + 'default': false, + }; + _equalizerOptions.add(option); + _storage.write('equalizer_options', _equalizerOptions); setState(() { - _templateData['options'].add({ - 'label': value, - 'value': List.from(_values), - 'default': false, - }); + _templateData['options'].add(option); }); } }); From 94c109c90d236c925894f03cc0454eb167b1452c Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Fri, 21 Nov 2025 15:08:01 +0800 Subject: [PATCH 053/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/meeting/meeting_task_service.dart | 3 ++- lib/modules/splash/controllers/splash_controller.dart | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 5688628b8..08b48f065 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -332,7 +332,8 @@ class MeetingTaskService extends GetxService { Logger.info("lxm---大模型asr响应体结果$respDic['result']['text']"); - if (respDic['result']['text'] != null) { + if (respDic['result']['text'] != null && + respDic['result']['text'] != '') { await _addTextList( item['id'], //会议ID respDic['result']['utterances'], //语音转文字结果 diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index 60631b889..7a45d1b9a 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -268,6 +268,8 @@ class SplashController extends GetxController { if (token != null && token.isNotEmpty && isAppConfigInitialized) { Get.offAllNamed(Routes.pairing); } else { + _storage.remove('operation_records'); + _storage.remove('operation_delids'); Get.offAllNamed(Routes.login); } } From 0c680963968f67221c5d01e892492602f7c10794 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 21 Nov 2025 20:10:23 +0800 Subject: [PATCH 054/177] =?UTF-8?q?feat(translation):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BC=96=E8=A7=A3=E7=A0=81=E5=99=A8=E7=8A=B6=E6=80=81=E8=B7=9F?= =?UTF-8?q?=E8=B8=AA=E5=92=8C=E5=87=86=E5=A4=87=E7=8A=B6=E6=80=81=E5=8A=A8?= =?UTF-8?q?=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在BleManager中添加isCodecActive状态跟踪 - 在TranslationController中添加isPreparing状态 - 为准备状态添加动画效果和视觉反馈 - 增加编解码器激活检查逻辑 --- lib/data/services/ble_manager.dart | 6 + .../controllers/translation_controller.dart | 34 ++- .../translation/views/translation_view.dart | 238 +++++++++--------- 3 files changed, 151 insertions(+), 127 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index f367f466b..4572b2ba0 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -195,6 +195,11 @@ class BleManager extends GetxService { // 设备信息缓存 final deviceInfo = Rx(null); // 使用 Rx 包装 + //添加编码器状态跟踪 + final _isCodecActive = false.obs; + bool get isCodecActive => _isCodecActive.value; + RxBool get isCodecActiveRx => _isCodecActive; + // 订阅 StreamSubscription? _statusSubscription; StreamSubscription? _dataSubscription; @@ -368,6 +373,7 @@ class BleManager extends GetxService { print(" CONTROL_CODEC: $commandId,$data"); final bool codecSuccess = _isCodecControlSuccess(data); + _isCodecActive.value = codecSuccess; // 更新编解码器状态 if (codecSuccess) { print("lxm--编解码控制成功 (rawData 第二字节非 0)"); diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index f15b1a0d0..ae6019fbf 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -87,6 +87,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { RxInt activeSpeaker = 0.obs; // 0=无激活, 1=按钮1, 2=按钮2 RxInt lastActiveSpeaker = 0.obs; // 上一次状态 final isRecognizing = false.obs; + final isPreparing = false.obs; final isTranslating = false.obs; final isTtsEnabled = true.obs; final isRecording = false.obs; @@ -844,10 +845,16 @@ class TranslationController extends GetxController with WidgetsBindingObserver { await _initializeSession(); await _configureAudioMode(); if (currentMode.value != 'faceToFace') { + if ((currentMode.value == 'audioVideo' || + currentMode.value == 'call') && + !bleManager.isCodecActive) { + return; + } await _startAsrService(); await _finalizeRecognitionStart(); } } catch (e) { + isPreparing.value = false; isRecognizing.value = false; Logger.error('启动语音识别失败: ${e.toString()}'); } @@ -893,7 +900,18 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// 配置音视频模式 Future _configureAudioVideoMode() async { - bleManager.openDecoder(); + isPreparing.value = true; + await bleManager.openDecoder(); + int attempts = 0; + while (!bleManager.isCodecActive && attempts < 10) { + await Future.delayed(const Duration(milliseconds: 150)); + attempts++; + } + isPreparing.value = false; + if (!bleManager.isCodecActive) { + Get.snackbar('tip'.tr, 'operationFailedPleaseRetry'.tr); + throw Exception('lxm--BLE编解码打开失败'); + } _audioSourceType = true; isTtsEnabled.value = false; Logger.info('发送ble音乐或者通话远端声音'); @@ -907,7 +925,18 @@ class TranslationController extends GetxController with WidgetsBindingObserver { ]; Logger.info('1初始化AST服务,支持语言: $callModeLanguages'); //ast=asr+translate await _astService.initialize(supportedLanguages: callModeLanguages); - bleManager.openA2DPDecoder(); + isPreparing.value = true; + await bleManager.openA2DPDecoder(); + int attempts = 0; + while (!bleManager.isCodecActive && attempts < 10) { + await Future.delayed(const Duration(milliseconds: 150)); + attempts++; + } + isPreparing.value = false; + if (!bleManager.isCodecActive) { + Get.snackbar('tip'.tr, 'operationFailedPleaseRetry'.tr); + throw Exception('lxm--BLE编解码打开失败'); + } _audioSourceType = true; isTtsEnabled.value = false; Logger.info('发送ble系统mic和dac(音乐或者通话远端)声音'); @@ -1379,6 +1408,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// 停止所有操作 Future stopAll() async { try { + isPreparing.value = false; if (currentMode.value == "audioVideo" || currentMode.value == "call") { bleManager.closeCodec(); Logger.info('关闭ble编解码器'); diff --git a/lib/modules/translation/views/translation_view.dart b/lib/modules/translation/views/translation_view.dart index c089c0ff2..595126454 100644 --- a/lib/modules/translation/views/translation_view.dart +++ b/lib/modules/translation/views/translation_view.dart @@ -467,134 +467,122 @@ class TranslationView extends GetView { ), ], ), - child: Obx(() { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - // 原有的按钮区域 - if (controller.currentMode.value == 'faceToFace') - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // 耳机图标按钮 (说话者1)-显示源语言 - Obx(() => _buildHoldToTalkButton( - isDarkMode: isDarkMode, - speakerId: 1, - activeSpeaker: controller.activeSpeaker.value, - icon: Icons.mic_none, - label: controller.sourceLanguage.value - .split(' ')[0] - .tr, // 源语言名称 - )), - SizedBox(width: 16.w), - // 手机图标按钮 (说话者2)-显示目标语言 - Obx(() => _buildHoldToTalkButton( - isDarkMode: isDarkMode, - speakerId: 2, - activeSpeaker: controller.activeSpeaker.value, - icon: Icons.mic_none, - label: controller.targetLanguage.value - .split(' ')[0] - .tr, // 目标语言名称 - )), - ], - ) - else - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // 主要控制按钮 - 开始/暂停语音识别 - Obx(() { - final isRecognizing = controller.isRecognizing.value; - return GestureDetector( - onTap: () { - if (isRecognizing) { - controller.stopAll(); - } else { - controller.startRecognition(); - } - }, - child: Container( - width: 60.w, - height: 60.w, - decoration: BoxDecoration( - color: isRecognizing - ? (isDarkMode ? Colors.red[700] : Colors.red) - : (isDarkMode ? AppColors.primary : Colors.blue), - shape: BoxShape.circle, - ), - child: Icon( - isRecognizing ? Icons.pause : Icons.play_arrow, - color: Colors.white, - size: 30.sp, - ), - ), - ); - }), - ], - ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 原有的按钮区域 + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // 主要控制按钮 - 开始/暂停语音识别 + Obx(() { + final isRecognizing = controller.isRecognizing.value; + final isPreparing = controller.isPreparing.value; + return GestureDetector( + onTap: () { + if (isRecognizing) { + controller.stopAll(); + } else { + controller.startRecognition(); + } + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + width: 60.w, + height: 60.w, + transform: isPreparing + ? (Matrix4.identity()..scale(1.08)) + : Matrix4.identity(), + decoration: BoxDecoration( + color: isRecognizing + ? (isDarkMode ? Colors.red[700] : Colors.red) + : (isDarkMode ? AppColors.primary : Colors.blue), + shape: BoxShape.circle, + boxShadow: isPreparing + ? [ + BoxShadow( + color: (isDarkMode + ? AppColors.primary + : Colors.blue) + .withOpacity(0.5), + blurRadius: 12, + spreadRadius: 2, + ) + ] + : [], + ), + child: Icon( + isRecognizing ? Icons.pause : Icons.play_arrow, + color: Colors.white, + size: 30.sp, + ), + ), + ); + }), + ], + ), - // 添加间距 - //SizedBox(height: 16.h), + // 添加间距 + //SizedBox(height: 16.h), - // 语音识别结果显示框 - // Container( - // width: double.infinity, - // padding: EdgeInsets.all(12.w), - // decoration: BoxDecoration( - // color: isDarkMode ? Colors.grey[800] : Colors.grey[100], - // borderRadius: BorderRadius.circular(8.r), - // border: Border.all( - // color: isDarkMode ? Colors.grey[600]! : Colors.grey[300]!, - // width: 1, - // ), - // ), - // child: Obx(() { - // // 显示最新的语音识别结果 - // final recognitionText = controller.latestRecognitionText.value; - // final detectedLanguage = controller.detectedLanguageCode1.value; + // 语音识别结果显示框 + // Container( + // width: double.infinity, + // padding: EdgeInsets.all(12.w), + // decoration: BoxDecoration( + // color: isDarkMode ? Colors.grey[800] : Colors.grey[100], + // borderRadius: BorderRadius.circular(8.r), + // border: Border.all( + // color: isDarkMode ? Colors.grey[600]! : Colors.grey[300]!, + // width: 1, + // ), + // ), + // child: Obx(() { + // // 显示最新的语音识别结果 + // final recognitionText = controller.latestRecognitionText.value; + // final detectedLanguage = controller.detectedLanguageCode1.value; - // return Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // // 标题 - // Text( - // '麦头语音识别结果', - // style: TextStyle( - // fontSize: 12.sp, - // color: isDarkMode ? Colors.grey[400] : Colors.grey[600], - // fontWeight: FontWeight.w500, - // ), - // ), - // SizedBox(height: 4.h), - // // 识别文本 - 这里显示 finalResult1 的内容 - // Text( - // recognitionText.isEmpty ? '等待语音输入...' : recognitionText, - // style: TextStyle( - // fontSize: 14.sp, - // color: isDarkMode ? Colors.white : Colors.black87, - // height: 1.3, - // ), - // ), - // // 检测到的语言(如果有) - // if (detectedLanguage.isNotEmpty) ...[ - // SizedBox(height: 4.h), - // Text( - // '检测语言: $detectedLanguage', - // style: TextStyle( - // fontSize: 10.sp, - // color: - // isDarkMode ? Colors.grey[500] : Colors.grey[500], - // ), - // ), - // ], - // ], - // ); - // }), - // ), - ], - ); - }), + // return Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // // 标题 + // Text( + // '麦头语音识别结果', + // style: TextStyle( + // fontSize: 12.sp, + // color: isDarkMode ? Colors.grey[400] : Colors.grey[600], + // fontWeight: FontWeight.w500, + // ), + // ), + // SizedBox(height: 4.h), + // // 识别文本 - 这里显示 finalResult1 的内容 + // Text( + // recognitionText.isEmpty ? '等待语音输入...' : recognitionText, + // style: TextStyle( + // fontSize: 14.sp, + // color: isDarkMode ? Colors.white : Colors.black87, + // height: 1.3, + // ), + // ), + // // 检测到的语言(如果有) + // if (detectedLanguage.isNotEmpty) ...[ + // SizedBox(height: 4.h), + // Text( + // '检测语言: $detectedLanguage', + // style: TextStyle( + // fontSize: 10.sp, + // color: + // isDarkMode ? Colors.grey[500] : Colors.grey[500], + // ), + // ), + // ], + // ], + // ); + // }), + // ), + ], + ), ); } From 9e808cfbdbf5d3874abf4b3be467dd9196d708d4 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Sat, 22 Nov 2025 15:55:19 +0800 Subject: [PATCH 055/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=85=E9=99=A4?= =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E8=AE=B0=E5=BD=95=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/account_service.dart | 5 +++++ lib/data/services/meeting/meeting_task_service.dart | 8 ++++++++ lib/data/services/meeting/meeting_upload_service.dart | 7 +++++++ .../meeting/controllers/meeting_details_controller.dart | 1 + lib/modules/splash/controllers/splash_controller.dart | 3 +++ 5 files changed, 24 insertions(+) diff --git a/lib/data/services/account_service.dart b/lib/data/services/account_service.dart index 419749ee4..c2c9748bd 100644 --- a/lib/data/services/account_service.dart +++ b/lib/data/services/account_service.dart @@ -6,6 +6,7 @@ import '../../modules/login/controllers/googleLogin.dart'; import '../../modules/login/controllers/facebookLogin.dart'; import '../services/network/api.dart'; import 'db/database_helper.dart'; +import 'meeting/meeting_task_service.dart'; /// 账号管理服务 /// @@ -79,6 +80,10 @@ class AccountService extends GetxService { /// 返回操作结果,包含成功状态和错误信息 Future signOut() async { try { + // 清除会议记录任务列表 + final taskService = Get.find(); + taskService.cancelTask(); + // 上传会议记录操作记录 await Synchrodata.uploadOperationRecords(); diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 08b48f065..c13f135fe 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -58,6 +58,14 @@ class MeetingTaskService extends GetxService { _getTaskList(); } + void cancelTask() { + _isTask = false; + _taskList.clear(); + _storage.remove("meeting_task_list"); + _storage.remove("meeting_task_finish_list"); + _uploadService.cancelUpload(); + } + Future _initialize() async { try { _appid = AppConfig.env('VOLC_OPENSPEECH_APP_ID') ?? ''; diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 13a98ef2d..63fde0f02 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -24,6 +24,13 @@ class MeetingUploadService extends GetxService { _getUploadList(); } + void cancelUpload() { + _isUpload = false; + _handled = 0; + uploadList.clear(); + _storage.remove("meeting_upload_list"); + } + void _getUploadList() { uploadList.value = _storage.read("meeting_upload_list") ?? []; executeUpload(); diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index aa679d154..7b908e0d7 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -127,6 +127,7 @@ class MeetingDetailsController extends GetxController final data = await SqfliteApi.getMeetingDetails(id); meetingData.value = MeetingModel.fromJson(data); meetingDetails.value = MeetingDetailsModel.fromJson(data['details']); + _everType = meetingDetails.value.tasktype + 1; _meetingTaskService.tasktype.value = meetingDetails.value.tasktype; if (meetingDetails.value.tasktype >= 3) { dragOffset.value = 0; diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index 7a45d1b9a..e35379d1f 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -268,6 +268,9 @@ class SplashController extends GetxController { if (token != null && token.isNotEmpty && isAppConfigInitialized) { Get.offAllNamed(Routes.pairing); } else { + _storage.remove('meeting_task_list'); + _storage.remove('meeting_task_finish_list'); + _storage.remove('meeting_upload_list'); _storage.remove('operation_records'); _storage.remove('operation_delids'); Get.offAllNamed(Routes.login); From 1161cb73901a48f91ff2af2464feec36f23ddd90 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 17 Nov 2025 16:13:22 +0800 Subject: [PATCH 056/177] =?UTF-8?q?refactor(goods):=20=E5=B0=86Trade?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=B1=BB=E5=9E=8B=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E4=B8=BATranslation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新商品相关枚举和控制器,将Trade使用类型统一更名为Translation以更准确描述其用途 --- lib/data/models/goods.dart | 14 ++++---- lib/data/services/network/api.dart | 32 ++++++++++++++++++- .../controllers/goodstrade_controller.dart | 4 +-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/lib/data/models/goods.dart b/lib/data/models/goods.dart index 99485eafe..bda3a6c37 100644 --- a/lib/data/models/goods.dart +++ b/lib/data/models/goods.dart @@ -6,7 +6,7 @@ enum UsageType { /// 未知使用量类型 UsageNull, // 0 /// 翻译 - Trade, // 1 + Translation, // 1 /// 会议 Meet, // 2 /// 智能体 @@ -19,7 +19,7 @@ enum UsageType { case 0: return UsageType.UsageNull; case 1: - return UsageType.Trade; + return UsageType.Translation; case 2: return UsageType.Meet; case 3: @@ -36,8 +36,8 @@ enum UsageType { case 'null': case 'unknown': return UsageType.UsageNull; - case 'trade': - return UsageType.Trade; + case 'translation': + return UsageType.Translation; case 'meet': case 'meeting': return UsageType.Meet; @@ -54,7 +54,7 @@ enum UsageType { switch (this) { case UsageType.UsageNull: return 0; - case UsageType.Trade: + case UsageType.Translation: return 1; case UsageType.Meet: return 2; @@ -67,8 +67,8 @@ enum UsageType { switch (this) { case UsageType.UsageNull: return 'UsageNull'; - case UsageType.Trade: - return 'Trade'; + case UsageType.Translation: + return 'Translation'; case UsageType.Meet: return 'Meet'; case UsageType.AI: diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index e405bd87f..ca56fc8a5 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -244,7 +244,37 @@ class Api { ); } - //资源使用请求 + /// 资源使用上报(`/api/home/user_usages`) + /// + /// 用途:在 AI 聊天等场景中,上报本次会话的消耗与功能调用次数,服务端据此统计并更新积分。 + /// + /// 请求方式:`POST /api/home/user_usages` + /// + /// 认证:已通过全局拦截器自动携带 `Authorization`(见 `AuthInterceptor`)。 + /// + /// 参数(`params`)结构: + /// - `usagetype`:`int` 类型,使用场景类型;Android 端 Agent 使用 `3` 表示 AICHAT。 + /// - `usages`:`Map`,各项指标的键值对,例如: + /// - `AICHAT_PROMPT_TOKENS`:本次对话的提示词 Token 数 + /// - `AICHAT_COMPLETION_TOKENS`:本次对话的生成 Token 数 + /// - `AICHAT_FUNCTION_{函数名}`:被调用的函数次数(按函数名累加) + /// + /// 返回:标准封装后 `code == 0` 时返回 `data`。其中 `data.usages` 可能包含键 `"3"`,表示最新的 AI 积分值。 + /// + /// 使用示例: + /// ```dart + /// final params = { + /// 'usagetype': 3, // AICHAT + /// 'usages': { + /// 'AICHAT_PROMPT_TOKENS': 120, + /// 'AICHAT_COMPLETION_TOKENS': 256, + /// 'AICHAT_FUNCTION_toolX': 1, + /// } + /// }; + /// final data = await Api.usagesResPoints(params); + /// final usages = (data['usages'] as Map?)?.cast(); + /// final aiIntegral = usages?['3']; // 服务端返回的最新 AI 积分(如有) + /// ``` static usagesResPoints([params]) { return DioManager().request( NWMethod.post, diff --git a/lib/modules/goods/controllers/goodstrade_controller.dart b/lib/modules/goods/controllers/goodstrade_controller.dart index 871241f9c..d0a218c5b 100644 --- a/lib/modules/goods/controllers/goodstrade_controller.dart +++ b/lib/modules/goods/controllers/goodstrade_controller.dart @@ -7,7 +7,7 @@ import 'goods_base_controller.dart'; class GoodstradeController extends GoodsBaseController { @override Future> fetchProducts() async { - final resp = await Api.getGoods({'usagetype': UsageType.Trade.toInt}); + final resp = await Api.getGoods({'usagetype': UsageType.Translation.toInt}); if (resp == null || resp is! Map) return []; if (resp.containsKey('error') || resp.containsKey('msg')) { final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; @@ -21,7 +21,7 @@ class GoodstradeController extends GoodsBaseController { if (data is List) { final list = data.whereType>().map(DBGoods.fromJson).toList(); - return list.where((g) => g.usagetype == UsageType.Trade).toList(); + return list.where((g) => g.usagetype == UsageType.Translation).toList(); } return []; } From 3a6fb57659192e5d376c7111cd6231298f14604f Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 19 Nov 2025 15:18:46 +0800 Subject: [PATCH 057/177] =?UTF-8?q?feat(ASR):=20=E6=B7=BB=E5=8A=A0ASR?= =?UTF-8?q?=E7=94=A8=E9=87=8F=E4=B8=8A=E6=8A=A5=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现ASR使用情况上报到服务器的功能,包括会话统计和用量参数处理。同时在翻译控制器中添加相关调用逻辑,确保在会话结束时上报数据。 --- lib/data/services/usage_stats_service.dart | 41 +++++++++++++++++++ .../controllers/translation_controller.dart | 16 +++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index 5a361e341..ddd3677dd 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -3,6 +3,8 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import '../models/translation_usage_stats.dart'; import '../../core/utils/logger.dart'; +import 'network/api.dart'; +import '../models/goods.dart'; /// 使用量统计服务 class UsageStatsService extends GetxService { @@ -186,6 +188,45 @@ class UsageStatsService extends GetxService { } catch (e) { Logger.error('记录ASR API调用失败: $e'); } + + _reportAsrUsageToServer( + effectiveDurationSeconds: effectiveDurationSeconds, + //totalDurationSeconds: totalDurationSeconds, + language: language, + mode: mode, + ); + } + + /// 上报ASR用量到服务器 + Future _reportAsrUsageToServer({ + required int effectiveDurationSeconds, + //required int totalDurationSeconds, + required String language, + required String mode, + }) async { + try { + final params = { + 'usagetype': UsageType.Translation.toInt, + 'usages': { + // 'TRANSLATION_ASR_EFFECTIVE_SECONDS': effectiveDurationSeconds, + //'TRANSLATION_ASR_TOTAL_SECONDS': totalDurationSeconds, + 'TRANSLATION_MODE_$mode': effectiveDurationSeconds, + 'TRANSLATION_ASR_LANGUAGE_$language': 1, + 'TRANSLATION_SOURCE_CHARACTERS': + realtimeStats.value.sourceTextCharacters, + 'TRANSLATION_TARGET_CHARACTERS': + realtimeStats.value.ttsTextCharacters, + }, + }; + + Logger.info('lxm---ASR用量上报参数: $params'); + + final response = await Api.usagesResPoints(params); + + Logger.info('lxm---ASR用量上报响应: $response'); + } catch (e) { + Logger.error('记录ASR API调用失败: $e'); + } } /// 记录TTS API调用 diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index b89d5a6e7..bf53d8f36 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -318,6 +318,9 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// [speakerId] 说话者ID Future _startFaceToFaceRecognition(int speakerId) async { try { + if (_asrSessionStartTime == null) { + await _initializeSession(); + } await _asrService.startContinuousRecognition(_audioSourceType); //开启识别 _startAsrActiveTracking(); //开启识别活动跟踪 if (isRecording.value) { @@ -347,6 +350,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } await _asrService.stopContinuousRecognition(); _stopAsrActiveTracking(); //停止识别活动跟踪 + _recordAsrUsageStats(sourceLanguage.value); isRecognizing.value = false; currentSessionId = null; @@ -902,6 +906,13 @@ class TranslationController extends GetxController with WidgetsBindingObserver { await _astService.stopContinuousTranslation(); } _stopAsrActiveTracking(); + final langName = _languageManager + .getChineseNameByAsrCode( + (detectedLanguageCode.isNotEmpty + ? detectedLanguageCode + : sourceLanguageCode.value)) ?? + '未知'; + _recordAsrUsageStats(langName); isRecognizing.value = false; currentSessionId = null; } catch (e) { @@ -1197,7 +1208,6 @@ class TranslationController extends GetxController with WidgetsBindingObserver { Logger.info( '翻译统计: 源文本${sourceText.length}字符, 模式${currentMode.value}, 语言对$sourceLanguageName→$targetLanguageName'); - _recordAsrUsageStats(sourceLanguageName); } catch (e) { Logger.error('记录翻译统计失败: $e'); } @@ -1579,6 +1589,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver { Logger.info( 'ASR会话统计: 总时长${totalDurationSeconds}秒, 实际活跃时长${effectiveDurationSeconds}秒, 语言$language'); + _asrSessionStartTime = null; + _asrActiveDuration = Duration.zero; + _isAsrActive = false; + _asrActiveStartTime = null; } catch (e) { Logger.error('记录ASR统计失败: $e'); } From 2ef347913b9d7a08b44efc002f982ca05ea63417 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 20 Nov 2025 12:24:08 +0800 Subject: [PATCH 058/177] =?UTF-8?q?feat(usage=5Fstats):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=A7=AF=E5=88=86=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E5=AE=9E=E7=8E=B0=E4=BC=9A=E8=AE=AEASR=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加用户积分统计显示界面,实现根据服务器响应更新积分逻辑 新增会议音频转文字相关统计模型类 移除视图中的导出数据功能 --- lib/data/models/meeting_usage_stats.dart | 113 +++++++++++ lib/data/services/usage_stats_service.dart | 46 +++++ .../usage/views/translation_stats_view.dart | 179 +++++++++++++++--- 3 files changed, 310 insertions(+), 28 deletions(-) create mode 100644 lib/data/models/meeting_usage_stats.dart diff --git a/lib/data/models/meeting_usage_stats.dart b/lib/data/models/meeting_usage_stats.dart new file mode 100644 index 000000000..2b486fe1f --- /dev/null +++ b/lib/data/models/meeting_usage_stats.dart @@ -0,0 +1,113 @@ +const int asrStatusProcessing = 0; // 处理中 +const int asrStatusFailed = 1; // 处理失败 +const int asrStatusCompleted = 2; // 已完成 + +// 会议音频文件转文字单次数据 +class MeetingAsrRecord { + String id; // 本次ASR唯一标识 + int meetingId; // 会议记录ID + String taskId; // 云端任务ID + int audioSeconds; // 音频总时长(秒) + int fileSizeBytes; // 音频文件大小(字节) + String language; // ASR语言 + int submitTimestamp; // 提交时间戳(毫秒) + + int status; // 状态: 0-处理中, 1-处理失败, 2-已完成 + int transcriptBytes; // 转写后的字节数(utf8) + int completeTimestamp; // 完成时间戳(毫秒) + + MeetingAsrRecord({ + required this.id, + required this.meetingId, + required this.taskId, + required this.audioSeconds, + required this.fileSizeBytes, + required this.language, + required this.submitTimestamp, + required this.status, + required this.transcriptBytes, + required this.completeTimestamp, + }); + + Map toJson() => { + 'id': id, + 'meetingId': meetingId, + 'taskId': taskId, + 'audioSeconds': audioSeconds, + 'fileSizeBytes': fileSizeBytes, + 'language': language, + 'submitTimestamp': submitTimestamp, + 'status': status, + 'transcriptBytes': transcriptBytes, + 'completeTimestamp': completeTimestamp, + }; + + factory MeetingAsrRecord.fromJson(Map json) { + return MeetingAsrRecord( + id: json['id'] ?? '', + meetingId: json['meetingId'] ?? 0, + taskId: json['taskId'] ?? '', + audioSeconds: json['audioSeconds'] ?? 0, + fileSizeBytes: json['fileSizeBytes'] ?? 0, + language: json['language'] ?? '', + submitTimestamp: json['submitTimestamp'] ?? 0, + status: json['status'] ?? 0, + transcriptBytes: json['transcriptBytes'] ?? 0, + completeTimestamp: json['completeTimestamp'] ?? 0, + ); + } +} + +// 会议音频文件转文字单日统计 +class MeetingAsrDailyStats { + String date; // 日期字符串: YYYY-MM-DD + String userId; // 用户ID + List items; // 当天所有单次ASR + + MeetingAsrDailyStats({ + required this.date, + required this.userId, + required this.items, + }); + + // 计算型聚合,不冗余存储 + int get asrCalls => items.length; + int get audioSecondsTotal => items.fold(0, (s, r) => s + r.audioSeconds); + int get audioBytesTotal => items.fold(0, (s, r) => s + r.fileSizeBytes); + int get transcriptBytesTotal => + items.fold(0, (s, r) => s + r.transcriptBytes); + + Map toJson() => { + 'date': date, + 'userId': userId, + 'items': items.map((e) => e.toJson()).toList(), + }; + + factory MeetingAsrDailyStats.fromJson(Map json) { + final list = (json['items'] as List? ?? []) + .map((e) => MeetingAsrRecord.fromJson(Map.from(e))) + .toList(); + return MeetingAsrDailyStats( + date: json['date'] ?? '', + userId: json['userId'] ?? 'anonymous', + items: list, + ); + } +} + +// 会议音频文件转文字历史统计 +class MeetingAsrHistoryStats { + String userId; // 用户ID + int allAsrCalls; // 所有ASR调用次数 + int allAudioSeconds; // 所有音频总时长(秒) + int allAudioFileBytes; // 所有音频文件大小(字节) + int allTranscriptBytes; // 所有转写后的字节数(utf8) + + MeetingAsrHistoryStats({ + required this.userId, + required this.allAsrCalls, + required this.allAudioSeconds, + required this.allAudioFileBytes, + required this.allTranscriptBytes, + }); +} diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index ddd3677dd..0f930fab5 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -5,8 +5,10 @@ import '../models/translation_usage_stats.dart'; import '../../core/utils/logger.dart'; import 'network/api.dart'; import '../models/goods.dart'; +import '../models/user_Info.dart'; /// 使用量统计服务 +/// class UsageStatsService extends GetxService { static const String _storageKey = 'usage_stats'; static const String _dailyStatsKey = 'daily_translation_stats'; @@ -224,11 +226,55 @@ class UsageStatsService extends GetxService { final response = await Api.usagesResPoints(params); Logger.info('lxm---ASR用量上报响应: $response'); + + _applyUsageResponse(response); } catch (e) { Logger.error('记录ASR API调用失败: $e'); } } + /// 根据服务器用量上报回应,更新用户积分(非总积分) + /// 用量类型:0 AI聊天、1 翻译、2 会议 + void _applyUsageResponse(dynamic response) { + try { + if (response is! Map) return; + final usagesObj = response['usages']; + if (usagesObj is! Map) return; + final usages = Map.from(usagesObj as Map); + int _asInt(dynamic v) { + if (v == null) return 0; + if (v is int) return v; + if (v is num) return v.toInt(); + if (v is String) return int.tryParse(v) ?? 0; + return 0; + } + + final Map update = {}; + usages.forEach((k, v) { + final key = int.tryParse(k.toString()); + final val = _asInt(v); + if (key == null) return; + switch (key) { + case 0: + update['aichatintegral'] = val; + break; + case 1: + update['tradeintegral'] = val; + break; + case 2: + update['meetintegral'] = val; + break; + } + }); + if (update.isNotEmpty) { + User.instance.updateUserInfo(update); + Logger.info('积分更新: $update'); + } + } catch (e) { + Logger.error('解析用量回应并更新积分失败: $e'); + } + } + /// 记录TTS API调用 void recordTtsApiCall({ required String text, diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index ee1751234..19ceef070 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../controllers/translation_stats_controller.dart'; import '../../../core/theme/app_colors.dart'; +import '../../../data/models/user_Info.dart'; class TranslationStatsView extends GetView { const TranslationStatsView({Key? key}) : super(key: key); @@ -49,32 +50,32 @@ class TranslationStatsView extends GetView { ), onPressed: controller.refreshData, ), - PopupMenuButton( - icon: Icon( - Icons.more_vert, - color: isDarkMode ? Colors.white : Colors.black, - ), - onSelected: (value) { - switch (value) { - case 'cleanup': - controller.cleanupOldData(); - break; - case 'export': - controller.exportStats(); - break; - } - }, - itemBuilder: (context) => const [ - PopupMenuItem( - value: 'cleanup', - child: Text('清理过期数据'), - ), - PopupMenuItem( - value: 'export', - child: Text('导出数据'), - ), - ], - ), + // PopupMenuButton( + // icon: Icon( + // Icons.more_vert, + // color: isDarkMode ? Colors.white : Colors.black, + // ), + // onSelected: (value) { + // switch (value) { + // case 'cleanup': + // controller.cleanupOldData(); + // break; + // // case 'export': + // // controller.exportStats(); + // // break; + // } + // }, + // itemBuilder: (context) => const [ + // PopupMenuItem( + // value: 'cleanup', + // child: Text('清理过期数据'), + // ), + // // PopupMenuItem( + // // value: 'export', + // // child: Text('导出数据'), + // // ), + // ], + // ), ], ); } @@ -99,6 +100,8 @@ class TranslationStatsView extends GetView { SizedBox(height: 16.h), _buildOverviewCard(isDarkMode), SizedBox(height: 16.h), + _buildIntegralCard(isDarkMode), + SizedBox(height: 16.h), _buildApiCallsCard(isDarkMode), SizedBox(height: 16.h), _buildDataVolumeCard(isDarkMode), @@ -300,7 +303,6 @@ class TranslationStatsView extends GetView { isDarkMode, ), ), - ], )), SizedBox(height: 12.h), @@ -422,6 +424,127 @@ class TranslationStatsView extends GetView { ); } + Widget _buildIntegralCard(bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.stacked_line_chart, + color: AppColors.primary, + size: 20.sp, + ), + SizedBox(width: 8.w), + Text( + '积分统计', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ], + ), + SizedBox(height: 16.h), + Obx(() { + final _ = User.refreshTick.value; + final u = User.instance; + return Column( + children: [ + _buildIntegralRow( + 'AI聊天积分', + controller.formatNumber(u.aichatintegral), + Icons.chat_bubble_outline, + isDarkMode, + ), + SizedBox(height: 12.h), + _buildIntegralRow( + 'AI聊天总积分', + controller.formatNumber(u.aichattotalintegral), + Icons.chat_outlined, + isDarkMode, + ), + SizedBox(height: 12.h), + _buildIntegralRow( + '翻译积分', + controller.formatNumber(u.tradeintegral), + Icons.translate, + isDarkMode, + ), + SizedBox(height: 12.h), + _buildIntegralRow( + '翻译总积分', + controller.formatNumber(u.tradetotalintegral), + Icons.g_translate, + isDarkMode, + ), + SizedBox(height: 12.h), + _buildIntegralRow( + '会议积分', + controller.formatNumber(u.meetintegral), + Icons.groups, + isDarkMode, + ), + SizedBox(height: 12.h), + _buildIntegralRow( + '会议总积分', + controller.formatNumber(u.meettotalintegral), + Icons.meeting_room, + isDarkMode, + ), + ], + ); + }), + ], + ), + ); + } + + Widget _buildIntegralRow( + String label, String value, IconData icon, bool isDarkMode) { + return Row( + children: [ + Icon( + icon, + color: AppColors.primary, + size: 18.sp, + ), + SizedBox(width: 12.w), + Expanded( + child: Text( + label, + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + Text( + value, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ], + ); + } + Widget _buildApiCallRow( String label, int count, IconData icon, bool isDarkMode) { return Row( @@ -747,4 +870,4 @@ class TranslationStatsView extends GetView { ], ); } -} \ No newline at end of file +} From abf1ee6cb108810ff0af78bf5d52828f85701f8c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 20 Nov 2025 12:24:52 +0800 Subject: [PATCH 059/177] =?UTF-8?q?feat(meeting):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BC=9A=E8=AE=AEASR=E4=BB=BB=E5=8A=A1=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在MeetingTaskService中添加会议ASR任务的使用统计记录功能,包括任务提交和完成时的数据收集。同时在UsageStatsService中实现相关统计数据的存储和更新逻辑。 --- .../meeting/meeting_task_service.dart | 37 +++++++++++ lib/data/services/usage_stats_service.dart | 65 +++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 7ec049fc7..fc6f6b8fc 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; @@ -9,6 +10,8 @@ import '../../../core/utils/synchrodata.dart'; import '../db/sqflite_api.dart'; import '../deapsound_ai_service.dart'; import 'meeting_upload_service.dart'; +import '../usage_stats_service.dart'; +import '../../models/meeting_usage_stats.dart'; ///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。 class MeetingTaskService extends GetxService { @@ -117,6 +120,30 @@ class MeetingTaskService extends GetxService { taskId = await _submitTask(audiourl, isSpeaker, language); } await SqfliteApi.editMeeting(id, {'tasktype': 1, 'taskid': taskId}); + try { + final detail = await SqfliteApi.getMeetingDetails(id); + final seconds = (detail['seconds'] ?? 0) as int; + final filepath = (detail['filepath'] ?? '') as String; + int fileSizeBytes = 0; + if (filepath.isNotEmpty) { + try { + fileSizeBytes = await File(filepath).length(); + } catch (_) {} + } + final record = MeetingAsrRecord( + id: taskId, + meetingId: id, + taskId: taskId, + audioSeconds: seconds, + fileSizeBytes: fileSizeBytes, + language: language, + submitTimestamp: DateTime.now().millisecondsSinceEpoch, + status: asrStatusProcessing, + transcriptBytes: 0, + completeTimestamp: 0, + ); + Get.find().addMeetingAsrRecord(record); + } catch (_) {} _taskList.add({ 'id': id, 'taskid': taskId, @@ -373,6 +400,16 @@ class MeetingTaskService extends GetxService { _storage.write("meeting_task_list", _taskList); _storage.write("meeting_task_finish_list", taskFinishList); } + try { + final details = await SqfliteApi.getMeetingDetails(id); + final tid = (details['taskid'] ?? '') as String; + final transcriptBytes = utf8.encode(text).length; + Get.find().completeMeetingAsrRecord( + id: tid, + transcriptBytes: transcriptBytes, + completeTimestamp: DateTime.now().millisecondsSinceEpoch, + ); + } catch (_) {} // 触发AI分析,分别请求总结和概览 aiServiceMessage(id, text, prompt, outline); diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index 0f930fab5..f8a2d1be7 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import '../models/translation_usage_stats.dart'; +import '../models/meeting_usage_stats.dart'; import '../../core/utils/logger.dart'; import 'network/api.dart'; import '../models/goods.dart'; @@ -12,6 +13,7 @@ import '../models/user_Info.dart'; class UsageStatsService extends GetxService { static const String _storageKey = 'usage_stats'; static const String _dailyStatsKey = 'daily_translation_stats'; + static const String _meetingDailyKey = 'daily_meeting_asr_stats'; final GetStorage _storage = GetStorage(); @@ -67,6 +69,69 @@ class UsageStatsService extends GetxService { return 'anonymous'; } + MeetingAsrDailyStats _loadMeetingDaily(String dateKey) { + final data = _storage.read('${_meetingDailyKey}_$dateKey'); + if (data != null) { + return MeetingAsrDailyStats.fromJson(Map.from(data)); + } + return MeetingAsrDailyStats( + date: dateKey, userId: getCurrentUserId(), items: []); + } + + void _saveMeetingDaily(MeetingAsrDailyStats stats) { + _storage.write('${_meetingDailyKey}_${stats.date}', stats.toJson()); + } + + String _formatDate(DateTime d) { + final y = d.year; + final m = d.month.toString().padLeft(2, '0'); + final day = d.day.toString().padLeft(2, '0'); + return '$y-$m-$day'; + } + + void addMeetingAsrRecord(MeetingAsrRecord record) { + final dateKey = _formatDate( + DateTime.fromMillisecondsSinceEpoch(record.submitTimestamp)); + final daily = _loadMeetingDaily(dateKey); + final idx = daily.items.indexWhere((e) => e.id == record.id); + if (idx >= 0) { + daily.items[idx] = record; + } else { + daily.items.add(record); + } + _saveMeetingDaily(daily); + } + + void completeMeetingAsrRecord({ + required String id, + required int transcriptBytes, + required int completeTimestamp, + }) { + final now = DateTime.now(); + for (int i = 0; i < 3; i++) { + final dateKey = _formatDate(now.subtract(Duration(days: i))); + final daily = _loadMeetingDaily(dateKey); + final idx = daily.items.indexWhere((e) => e.id == id); + if (idx >= 0) { + final old = daily.items[idx]; + daily.items[idx] = MeetingAsrRecord( + id: old.id, + meetingId: old.meetingId, + taskId: old.taskId, + audioSeconds: old.audioSeconds, + fileSizeBytes: old.fileSizeBytes, + language: old.language, + submitTimestamp: old.submitTimestamp, + status: asrStatusCompleted, + transcriptBytes: transcriptBytes, + completeTimestamp: completeTimestamp, + ); + _saveMeetingDaily(daily); + return; + } + } + } + /// 记录翻译API调用 void recordTranslationApiCall({ required String sourceText, From de255cf48d290361db5d5a50353829c864dbcecb Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Sat, 22 Nov 2025 19:24:45 +0800 Subject: [PATCH 060/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BC=9A=E8=AE=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=80=BB=E7=BB=93=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/bindings/initial_binding.dart | 4 + .../meeting/meeting_task_service.dart | 78 +---------- .../meeting/summary_task_service.dart | 132 ++++++++++++++++++ .../meeting_details_controller.dart | 8 +- .../controllers/meeting_home_controller.dart | 2 + 5 files changed, 148 insertions(+), 76 deletions(-) create mode 100644 lib/data/services/meeting/summary_task_service.dart diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index 38f439e9d..e25234505 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -1,3 +1,4 @@ +import '../../data/services/meeting/summary_task_service.dart'; import '/data/services/pay_service.dart'; import '/data/services/qq_music.dart'; @@ -70,6 +71,9 @@ class InitialBinding extends Bindings { // 会议助手任务服务 Get.lazyPut(() => MeetingTaskService(), fenix: true); + // 会议助手总结任务服务 + Get.lazyPut(() => SummaryTaskService(), fenix: true); + // 会议助手音频上传 Get.lazyPut(() => MeetingUploadService(), fenix: true); diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index c13f135fe..7b5014a6e 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -7,15 +7,16 @@ import 'package:http/http.dart' as http; import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; import '../db/sqflite_api.dart'; -import '../deapsound_ai_service.dart'; import 'meeting_upload_service.dart'; import '../../../data/models/appconfig.dart'; +import 'summary_task_service.dart'; ///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。 class MeetingTaskService extends GetxService { final GetStorage _storage = GetStorage(); MeetingUploadService get _uploadService => Get.find(); + SummaryTaskService get _summaryTaskService => Get.find(); List _taskList = []; //待处理的会议任务列表 RxList taskFinishList = [].obs; //已处理的会议任务列表 @@ -45,8 +46,6 @@ class MeetingTaskService extends GetxService { int meetingId = 0; RxInt tasktype = 1.obs; //任务类型,1-转写中,2-总结中,3-完成 List textList = []; //转写结果列表 - String summary = ''; //AI总结内容 - String overview = ''; //AI概览内容 @override void onInit() { @@ -64,6 +63,7 @@ class MeetingTaskService extends GetxService { _storage.remove("meeting_task_list"); _storage.remove("meeting_task_finish_list"); _uploadService.cancelUpload(); + _summaryTaskService.cancelTask(); } Future _initialize() async { @@ -205,6 +205,7 @@ class MeetingTaskService extends GetxService { if (isDeleteTask) { _taskList.removeWhere((element) => element['id'] == id); _storage.write("meeting_task_list", _taskList); + _summaryTaskService.removeTask(id); } } @@ -420,75 +421,6 @@ class MeetingTaskService extends GetxService { } // 触发AI分析,分别请求总结和概览 - aiServiceMessage(id, text, prompt, outline); - } - - ///触发AI分析,分别请求总结和概览 - ///[id] 会议ID - ///[text] 语音转文字结果 - ///[prompt] AI总结提示词 - ///[outline] AI概览提示词 - void aiServiceMessage(int id, String text, String prompt, String outline) { - int awaitQuantity = 0; - String summaryText = ''; - String overviewText = ''; - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': prompt, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - summaryText = value; - Logger.info("lxm---大模型asr总结结果$summaryText"); - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': outline, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - overviewText = value; - Logger.info("lxm---大模型asr概览结果$overviewText"); - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - } - - ///处理AI分析完成后的结果,包括数据库存储和状态更新 - ///[id] 会议ID - ///[summaryText] 总结结果 - ///[overviewText] 概览结果 - void _aiServiceValue(int id, String summaryText, String overviewText) { - SqfliteApi.editMeeting(id, { - 'tasktype': 3, - 'summary': summaryText, - 'overview': overviewText, - }); - if (id == meetingId) { - summary = summaryText; - overview = overviewText; - tasktype.value = 3; - } - Map taskFinishData = taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData.isNotEmpty) { - taskFinishData['tasktype'] = 3; - taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", taskFinishList); + _summaryTaskService.addTaskList(id, text, prompt, outline); } } diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart new file mode 100644 index 000000000..0887b068c --- /dev/null +++ b/lib/data/services/meeting/summary_task_service.dart @@ -0,0 +1,132 @@ +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import '../../../core/utils/logger.dart'; +import '../db/sqflite_api.dart'; +import '../deapsound_ai_service.dart'; +import 'meeting_task_service.dart'; + +class SummaryTaskService extends GetxService { + final _taskService = Get.find(); + + final GetStorage _storage = GetStorage(); + + List _taskList = []; + + bool _isTask = false; + + String summary = ''; //AI总结内容 + String overview = ''; //AI概览内容 + + @override + void onInit() { + super.onInit(); + _getTaskList(); + } + + void cancelTask() { + _taskList.clear(); + _storage.remove("summary_task_list"); + } + + void _getTaskList() { + _taskList = _storage.read("summary_task_list") ?? []; + _executeTask(); + } + + Future addTaskList( + int id, String text, String prompt, String outline) async { + Logger.debug("添加总结任务列表"); + _taskList.add({ + 'id': id, + 'text': text, + 'prompt': prompt, + 'outline': outline, + }); + _storage.write("summary_task_list", _taskList); + _executeTask(); + } + + void _executeTask() async { + if (_taskList.isEmpty) return; + if (_isTask) return; + _isTask = true; + var task = _taskList.first; + _aiServiceMessage( + task['id'], + task['text'], + task['prompt'], + task['outline'], + ); + Logger.debug("执行总结任务列表"); + } + + void removeTask(int id) { + _taskList.removeWhere((element) => element['id'] == id); + _storage.write("summary_task_list", _taskList); + } + + void _aiServiceMessage(int id, String text, String prompt, String outline) { + int awaitQuantity = 0; + String summaryText = ''; + String overviewText = ''; + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': prompt, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + summaryText = value; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': outline, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + overviewText = value; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + } + + void _aiServiceValue(int id, String summaryText, String overviewText) { + if (!_taskList.any((item) => item['id'] == id)) return; + SqfliteApi.editMeeting(id, { + 'tasktype': 3, + 'summary': summaryText, + 'overview': overviewText, + }); + if (id == _taskService.meetingId) { + summary = summaryText; + overview = overviewText; + _taskService.tasktype.value = 3; + } + Map taskFinishData = _taskService.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 3; + _taskService.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", _taskService.taskFinishList); + _taskList.removeWhere((element) => element['id'] == id); + _storage.write("summary_task_list", _taskList); + _isTask = false; + _executeTask(); + Logger.debug("总结任务完成"); + } +} diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 7b908e0d7..a65074b23 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -15,6 +15,7 @@ import '../../../core/utils/synchrodata.dart'; import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; +import '../../../data/services/meeting/summary_task_service.dart'; import '../model/meeting_details_model.dart'; import '../model/meeting_model.dart'; @@ -30,6 +31,7 @@ class MeetingDetailsController extends GetxController final _meetingUploadService = Get.find(); final _meetingTaskService = Get.find(); + final _summaryTaskService = Get.find(); final PlayerController playerController = PlayerController(); @@ -97,8 +99,8 @@ class MeetingDetailsController extends GetxController if (value == 2) { textList.value = _meetingTaskService.textList; } else if (value == 3) { - meetingDetails.value.summary = _meetingTaskService.summary; - meetingDetails.value.overview = _meetingTaskService.overview; + meetingDetails.value.summary = _summaryTaskService.summary; + meetingDetails.value.overview = _summaryTaskService.overview; summaryNumberModifications.value++; } } @@ -275,6 +277,6 @@ class MeetingDetailsController extends GetxController _everType = 3; await SqfliteApi.editMeeting(id, {'tasktype': 2}); _meetingTaskService.tasktype.value = 2; - _meetingTaskService.aiServiceMessage(id, text, prompt, outline); + _summaryTaskService.addTaskList(id, text, prompt, outline); } } diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index 28317cfbd..db2ae56cc 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -20,6 +20,7 @@ import 'package:share_plus/share_plus.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; +import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; import 'meeting_controller.dart'; @@ -28,6 +29,7 @@ class MeetingHomeController extends GetxController { final meetingController = Get.find(); final meetingUploadService = Get.find(); final meetingTaskService = Get.find(); + final summaryTaskService = Get.find(); final AudioPlayer _audioPlayer = AudioPlayer(); From c72606570ff571ab1150ed7a7dec722b75bbc5bb Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 24 Nov 2025 11:28:30 +0800 Subject: [PATCH 061/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BC=9A=E8=AE=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=80=BB=E7=BB=93=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/summary_task_service.dart | 65 ++++++++----------- .../splash/controllers/splash_controller.dart | 6 ++ 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart index 0887b068c..f35c5f275 100644 --- a/lib/data/services/meeting/summary_task_service.dart +++ b/lib/data/services/meeting/summary_task_service.dart @@ -66,45 +66,36 @@ class SummaryTaskService extends GetxService { _storage.write("summary_task_list", _taskList); } - void _aiServiceMessage(int id, String text, String prompt, String outline) { - int awaitQuantity = 0; - String summaryText = ''; - String overviewText = ''; - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': prompt, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - summaryText = value; - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': outline, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - overviewText = value; - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); + Future _aiServiceMessage( + int id, String text, String prompt, String outline) async { + final ai = DeapsoundAIService(); + try { + final results = await Future.wait([ + ai.sendMessage(messages: [ + {'role': 'system', 'content': prompt}, + {'role': 'user', 'content': text}, + ]).timeout(const Duration(seconds: 300)), + ai.sendMessage(messages: [ + {'role': 'system', 'content': outline}, + {'role': 'user', 'content': text}, + ]).timeout(const Duration(seconds: 300)), + ], eagerError: true); + _aiServiceValue(id, results[0], results[1]); + } catch (e) { + _isTask = false; + _executeTask(); + } } - void _aiServiceValue(int id, String summaryText, String overviewText) { - if (!_taskList.any((item) => item['id'] == id)) return; - SqfliteApi.editMeeting(id, { + Future _aiServiceValue( + int id, String summaryText, String overviewText) async { + final exists = _taskList.any((item) => item['id'] == id); + if (!exists) { + _isTask = false; + _executeTask(); + return; + } + await SqfliteApi.editMeeting(id, { 'tasktype': 3, 'summary': summaryText, 'overview': overviewText, diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index e35379d1f..eabfbbadb 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -10,6 +10,9 @@ import 'package:http/http.dart' as http; import '../../../data/models/appconfig.dart'; import '../../../data/models/appconfig_model.dart'; import '../../../data/models/user_Info.dart'; +import '../../../data/services/meeting/meeting_task_service.dart'; +import '../../../data/services/meeting/meeting_upload_service.dart'; +import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; import '../../../data/services/network/api.dart'; import '../../../data/services/version_update_service.dart'; @@ -266,6 +269,9 @@ class SplashController extends GetxController { final isAppConfigInitialized = AppConfig.isInitialized(); // 检查登录状态和配置初始化状态 if (token != null && token.isNotEmpty && isAppConfigInitialized) { + Get.find(); + Get.find(); + Get.find(); Get.offAllNamed(Routes.pairing); } else { _storage.remove('meeting_task_list'); From 488c42325677a3a90700939f4a16a74b8347e4fc Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 24 Nov 2025 14:24:24 +0800 Subject: [PATCH 062/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BC=9A=E8=AE=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=80=BB=E7=BB=93=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/deapsound_ai_service.dart | 4 ++ .../meeting/summary_task_service.dart | 71 ++++++++++++++----- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/lib/data/services/deapsound_ai_service.dart b/lib/data/services/deapsound_ai_service.dart index da7181f4f..311af1184 100644 --- a/lib/data/services/deapsound_ai_service.dart +++ b/lib/data/services/deapsound_ai_service.dart @@ -78,6 +78,10 @@ class DeapsoundAIService implements AiService { ..body = jsonEncode(requestBody); final response = await client.send(request); + if (response.statusCode != 200) { + throw Exception('Unknown error'); + } + await for (final chunk in response.stream .transform(utf8.decoder) .transform(const LineSplitter())) { diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart index f35c5f275..5657c8b74 100644 --- a/lib/data/services/meeting/summary_task_service.dart +++ b/lib/data/services/meeting/summary_task_service.dart @@ -66,25 +66,62 @@ class SummaryTaskService extends GetxService { _storage.write("summary_task_list", _taskList); } - Future _aiServiceMessage( - int id, String text, String prompt, String outline) async { + void _aiServiceMessage(int id, String text, String prompt, String outline) { final ai = DeapsoundAIService(); - try { - final results = await Future.wait([ - ai.sendMessage(messages: [ - {'role': 'system', 'content': prompt}, - {'role': 'user', 'content': text}, - ]).timeout(const Duration(seconds: 300)), - ai.sendMessage(messages: [ - {'role': 'system', 'content': outline}, - {'role': 'user', 'content': text}, - ]).timeout(const Duration(seconds: 300)), - ], eagerError: true); - _aiServiceValue(id, results[0], results[1]); - } catch (e) { - _isTask = false; - _executeTask(); + String summaryText = ''; + String overviewText = ''; + var summaryDone = false; + var overviewDone = false; + var summarySuccess = false; + var overviewSuccess = false; + + void tryFinish() { + if (summaryDone && overviewDone) { + if (summarySuccess && + overviewSuccess && + summaryText.isNotEmpty && + overviewText.isNotEmpty) { + _aiServiceValue(id, summaryText, overviewText); + } else { + _isTask = false; + _executeTask(); + } + } } + + final summaryStream = ai.sendMessageStream(messages: [ + {'role': 'system', 'content': prompt}, + {'role': 'user', 'content': text}, + ]).timeout(const Duration(seconds: 120)); + + final overviewStream = ai.sendMessageStream(messages: [ + {'role': 'system', 'content': outline}, + {'role': 'user', 'content': text}, + ]).timeout(const Duration(seconds: 120)); + + summaryStream.listen((chunk) { + summaryText += chunk; + }, onError: (error) { + summaryDone = true; + summarySuccess = false; + tryFinish(); + }, onDone: () { + summaryDone = true; + summarySuccess = true; + tryFinish(); + }, cancelOnError: true); + + overviewStream.listen((chunk) { + overviewText += chunk; + }, onError: (error) { + overviewDone = true; + overviewSuccess = false; + tryFinish(); + }, onDone: () { + overviewDone = true; + overviewSuccess = true; + tryFinish(); + }, cancelOnError: true); } Future _aiServiceValue( From 3554b128421799435324f5204a7058c7009eab8d Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Nov 2025 16:32:25 +0800 Subject: [PATCH 063/177] =?UTF-8?q?refactor(usage):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=9C=8D=E5=8A=A1=E5=92=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构统计服务中的变量命名,将realtimeStats和todayStats改为更明确的realtimeTranslationStats和todayTranslationStats 简化用户模型中的初始化逻辑,添加日志记录 合并积分显示行,优化UI展示 --- lib/data/models/meeting_usage_stats.dart | 4 +- lib/data/models/user_Info.dart | 37 +++--- lib/data/services/usage_stats_service.dart | 105 ++++++++++-------- .../translation_stats_controller.dart | 15 +-- .../usage/views/translation_stats_view.dart | 33 +----- 5 files changed, 89 insertions(+), 105 deletions(-) diff --git a/lib/data/models/meeting_usage_stats.dart b/lib/data/models/meeting_usage_stats.dart index 2b486fe1f..88ef7e69c 100644 --- a/lib/data/models/meeting_usage_stats.dart +++ b/lib/data/models/meeting_usage_stats.dart @@ -1,3 +1,5 @@ +///会议模块用量统计的模型类 + const int asrStatusProcessing = 0; // 处理中 const int asrStatusFailed = 1; // 处理失败 const int asrStatusCompleted = 2; // 已完成 @@ -95,7 +97,7 @@ class MeetingAsrDailyStats { } } -// 会议音频文件转文字历史统计 +// 会议音频文件转文字历史统计(所有的用量) class MeetingAsrHistoryStats { String userId; // 用户ID int allAsrCalls; // 所有ASR调用次数 diff --git a/lib/data/models/user_Info.dart b/lib/data/models/user_Info.dart index 861d1604a..7620e93b6 100644 --- a/lib/data/models/user_Info.dart +++ b/lib/data/models/user_Info.dart @@ -83,11 +83,9 @@ class User { final devicesData = json['devices'] as List?; // 允许空值 //final token = json['data']['token'] as String? ?? ''; //final token = ''; - // 更新单例实例 - return _instance = User._( + final u = User._( token: '', - //token: token as String? ?? '', - name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值 + name: (userData?['name'] as String?) ?? '默认名称', uid: (userData?['uid'] as String?) ?? '', avatar: (userData?['avatar'] as String?) ?? '', language: (userData?['language'] as String?) ?? 'en', @@ -95,42 +93,43 @@ class User { phone: (userData?['phone'] as String?) ?? '', phonemac: (userData?['phonemac'] as String?) ?? '', password: (userData?['password'] as String?) ?? '', - viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 - viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 - + viplv: (userData?['viplv'] as int?) ?? 0, + viptime: (userData?['viptime'] as int?) ?? 0, aichatintegral: (userData?['aichatintegral'] as int?) ?? 0, aichattotalintegral: (userData?['aichattotalintegral'] as int?) ?? 0, tradeintegral: (userData?['tradeintegral'] as int?) ?? 0, tradetotalintegral: (userData?['tradetotalintegral'] as int?) ?? 0, meetintegral: (userData?['meetintegral'] as int?) ?? 0, meettotalintegral: (userData?['meettotalintegral'] as int?) ?? 0, - devices: devicesData ?.map((e) => UserDevice.fromJson(e as Map)) .toList() ?? - [], // 处理设备列表 + [], ); + _instance = u; + Logger.i("User", + "初始化用户: uid=${u.uid}, name=${u.name}, viplv=${u.viplv}, viptime=${u.viptime}, ai聊天=${u.aichatintegral}/${u.aichattotalintegral}, 翻译=${u.tradeintegral}/${u.tradetotalintegral}, 会议=${u.meetintegral}/${u.meettotalintegral}"); + return u; } factory User.fronTokenJson(Map json) { // 修复1:安全获取嵌套的 user 字段 final userData = json['user'] as Map?; // 允许空值 final devicesData = json['devices'] as List?; // 允许空值 - print("数据获取fronTokenJson$userData $devicesData"); - // 更新单例实例 - return _instance = User._( + Logger.d("User", + "fronTokenJson: user=$userData, devices=${devicesData?.length ?? 0}"); + final u = User._( token: '', - name: (userData?['name'] as String?) ?? '默认名称', // 提供默认值 + name: (userData?['name'] as String?) ?? '默认名称', uid: (userData?['uid'] as String?) ?? '', avatar: (userData?['avatar'] as String?) ?? '', language: (userData?['language'] as String?) ?? 'en', - mail: (userData?['mail'] as String?) ?? '', phone: (userData?['phone'] as String?) ?? '', phonemac: (userData?['phonemac'] as String?) ?? '', password: (userData?['password'] as String?) ?? '', - viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 - viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 + viplv: (userData?['viplv'] as int?) ?? 0, + viptime: (userData?['viptime'] as int?) ?? 0, aichatintegral: (userData?['aichatintegral'] as int?) ?? 0, aichattotalintegral: (userData?['aichattotalintegral'] as int?) ?? 0, tradeintegral: (userData?['tradeintegral'] as int?) ?? 0, @@ -141,8 +140,12 @@ class User { ? (devicesData) .map((e) => UserDevice.fromJson(e as Map)) .toList() - : [], // 处理设备列表 + : [], ); + _instance = u; + Logger.i("User", + "初始化用户(token): uid=${u.uid}, name=${u.name}, viplv=${u.viplv}, viptime=${u.viptime}, ai聊天=${u.aichatintegral}/${u.aichattotalintegral}, 翻译=${u.tradeintegral}/${u.tradetotalintegral}, 会议=${u.meetintegral}/${u.meettotalintegral}"); + return u; } updateUserInfo(Map user) { diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index f8a2d1be7..9a9d0003f 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import '../models/translation_usage_stats.dart'; @@ -11,17 +10,17 @@ import '../models/user_Info.dart'; /// 使用量统计服务 /// class UsageStatsService extends GetxService { - static const String _storageKey = 'usage_stats'; static const String _dailyStatsKey = 'daily_translation_stats'; static const String _meetingDailyKey = 'daily_meeting_asr_stats'; final GetStorage _storage = GetStorage(); // 实时统计数据 - final Rx realtimeStats = RealtimeUsageStats().obs; + final Rx realtimeTranslationStats = + RealtimeUsageStats().obs; // 当日统计数据 - final Rx todayStats = + final Rx todayTranslationStats = TranslationUsageStats.empty('').obs; @override @@ -32,12 +31,12 @@ class UsageStatsService extends GetxService { /// 初始化服务 void _initializeService() { - _loadTodayStats(); + _loadTodayTranslationStats(); Logger.info('lxm--使用量统计服务初始化完成'); } - /// 加载当日统计数据 - void _loadTodayStats() { + /// 加载当日翻译统计数据 + void _loadTodayTranslationStats() { try { final today = DateTime.now(); final todayKey = @@ -45,14 +44,16 @@ class UsageStatsService extends GetxService { final statsData = _storage.read('${_dailyStatsKey}_$todayKey'); if (statsData != null) { - todayStats.value = TranslationUsageStats.fromJson( + todayTranslationStats.value = TranslationUsageStats.fromJson( Map.from(statsData)); } else { - todayStats.value = TranslationUsageStats.empty(getCurrentUserId()); + todayTranslationStats.value = + TranslationUsageStats.empty(getCurrentUserId()); } } catch (e) { - Logger.error('加载当日统计数据失败: $e'); - todayStats.value = TranslationUsageStats.empty(getCurrentUserId()); + Logger.error('加载当日翻译统计数据失败: $e'); + todayTranslationStats.value = + TranslationUsageStats.empty(getCurrentUserId()); } } @@ -142,20 +143,20 @@ class UsageStatsService extends GetxService { }) { try { // 更新实时统计 - realtimeStats.value.translationCount++; - realtimeStats.value.sourceTextCharacters += sourceText.length; - realtimeStats.value.ttsTextCharacters += targetText.length; - realtimeStats.value.currentLanguagePair = + realtimeTranslationStats.value.translationCount++; + realtimeTranslationStats.value.sourceTextCharacters += sourceText.length; + realtimeTranslationStats.value.ttsTextCharacters += targetText.length; + realtimeTranslationStats.value.currentLanguagePair = '$sourceLanguage-$targetLanguage'; - realtimeStats.value.currentMode = mode; - realtimeStats.refresh(); + realtimeTranslationStats.value.currentMode = mode; + realtimeTranslationStats.refresh(); // 更新当日统计 - 使用多维度统计 final languagePair = '$sourceLanguage→$targetLanguage'; // 更新语言对统计 final newLanguagePairStats = Map.from( - todayStats.value.languagePairStats); + todayTranslationStats.value.languagePairStats); if (newLanguagePairStats.containsKey(languagePair)) { final existing = newLanguagePairStats[languagePair]!; newLanguagePairStats[languagePair] = LanguagePairStats( @@ -172,8 +173,8 @@ class UsageStatsService extends GetxService { } // 更新模式统计 - final newModeStats = - Map.from(todayStats.value.modeStats); + final newModeStats = Map.from( + todayTranslationStats.value.modeStats); if (newModeStats.containsKey(mode)) { final existing = newModeStats[mode]!; newModeStats[mode] = existing.copyWith( @@ -189,12 +190,13 @@ class UsageStatsService extends GetxService { ); } - todayStats.value = todayStats.value.copyWith( - translationApiCalls: todayStats.value.translationApiCalls + 1, - sourceTextCharacters: - todayStats.value.sourceTextCharacters + sourceText.length, + todayTranslationStats.value = todayTranslationStats.value.copyWith( + translationApiCalls: + todayTranslationStats.value.translationApiCalls + 1, + sourceTextCharacters: todayTranslationStats.value.sourceTextCharacters + + sourceText.length, ttsTextCharacters: - todayStats.value.ttsTextCharacters + targetText.length, + todayTranslationStats.value.ttsTextCharacters + targetText.length, languagePairStats: newLanguagePairStats, modeStats: newModeStats, ); @@ -219,13 +221,15 @@ class UsageStatsService extends GetxService { }) { try { // 更新实时统计(使用有效语音时长作为主要计费依据) - realtimeStats.value.effectiveAudioDuration += effectiveDurationSeconds; - realtimeStats.value.totalSessionDuration += totalDurationSeconds; - realtimeStats.refresh(); + realtimeTranslationStats.value.effectiveAudioDuration += + effectiveDurationSeconds; + realtimeTranslationStats.value.totalSessionDuration += + totalDurationSeconds; + realtimeTranslationStats.refresh(); // 更新模式统计 - final newModeStats = - Map.from(todayStats.value.modeStats); + final newModeStats = Map.from( + todayTranslationStats.value.modeStats); if (newModeStats.containsKey(mode)) { final existing = newModeStats[mode]!; newModeStats[mode] = existing.copyWith( @@ -239,12 +243,13 @@ class UsageStatsService extends GetxService { } // 更新当日统计 - todayStats.value = todayStats.value.copyWith( - asrApiCalls: todayStats.value.asrApiCalls + 1, + todayTranslationStats.value = todayTranslationStats.value.copyWith( + asrApiCalls: todayTranslationStats.value.asrApiCalls + 1, effectiveAudioDuration: - todayStats.value.effectiveAudioDuration + effectiveDurationSeconds, - totalSessionDuration: - todayStats.value.totalSessionDuration + totalDurationSeconds, + todayTranslationStats.value.effectiveAudioDuration + + effectiveDurationSeconds, + totalSessionDuration: todayTranslationStats.value.totalSessionDuration + + totalDurationSeconds, modeStats: newModeStats, ); @@ -280,9 +285,9 @@ class UsageStatsService extends GetxService { 'TRANSLATION_MODE_$mode': effectiveDurationSeconds, 'TRANSLATION_ASR_LANGUAGE_$language': 1, 'TRANSLATION_SOURCE_CHARACTERS': - realtimeStats.value.sourceTextCharacters, + realtimeTranslationStats.value.sourceTextCharacters, 'TRANSLATION_TARGET_CHARACTERS': - realtimeStats.value.ttsTextCharacters, + realtimeTranslationStats.value.ttsTextCharacters, }, }; @@ -348,15 +353,16 @@ class UsageStatsService extends GetxService { }) { try { // 更新实时统计 - realtimeStats.value.totalSessionDuration += durationSeconds; - realtimeStats.refresh(); + realtimeTranslationStats.value.totalSessionDuration += durationSeconds; + realtimeTranslationStats.refresh(); // 更新当日统计(TTS按字符数计费,不是按时长) - todayStats.value = todayStats.value.copyWith( - ttsApiCalls: todayStats.value.ttsApiCalls + 1, - ttsTextCharacters: todayStats.value.ttsTextCharacters + text.length, + todayTranslationStats.value = todayTranslationStats.value.copyWith( + ttsApiCalls: todayTranslationStats.value.ttsApiCalls + 1, + ttsTextCharacters: + todayTranslationStats.value.ttsTextCharacters + text.length, totalSessionDuration: - todayStats.value.totalSessionDuration + durationSeconds, + todayTranslationStats.value.totalSessionDuration + durationSeconds, ); _saveTodayStats(); @@ -371,8 +377,8 @@ class UsageStatsService extends GetxService { void recordAiSummaryApiCall() { try { // 更新当日统计 - todayStats.value = todayStats.value.copyWith( - aiSummaryApiCalls: todayStats.value.aiSummaryApiCalls + 1, + todayTranslationStats.value = todayTranslationStats.value.copyWith( + aiSummaryApiCalls: todayTranslationStats.value.aiSummaryApiCalls + 1, ); _saveTodayStats(); @@ -385,11 +391,11 @@ class UsageStatsService extends GetxService { /// 开始新会话 void startNewSession() { - realtimeStats.value.reset(); + realtimeTranslationStats.value.reset(); // 更新当日会话数 - todayStats.value = todayStats.value.copyWith( - sessionCount: todayStats.value.sessionCount + 1, + todayTranslationStats.value = todayTranslationStats.value.copyWith( + sessionCount: todayTranslationStats.value.sessionCount + 1, ); _saveTodayStats(); @@ -402,7 +408,8 @@ class UsageStatsService extends GetxService { final today = DateTime.now(); final todayKey = '${today.year}-${today.month.toString().padLeft(2, '0')}-${today.day.toString().padLeft(2, '0')}'; - _storage.write('${_dailyStatsKey}_$todayKey', todayStats.value.toJson()); + _storage.write( + '${_dailyStatsKey}_$todayKey', todayTranslationStats.value.toJson()); } catch (e) { Logger.error('保存当日统计数据失败: $e'); } diff --git a/lib/modules/usage/controllers/translation_stats_controller.dart b/lib/modules/usage/controllers/translation_stats_controller.dart index 81694dad7..7015537aa 100644 --- a/lib/modules/usage/controllers/translation_stats_controller.dart +++ b/lib/modules/usage/controllers/translation_stats_controller.dart @@ -19,7 +19,8 @@ class TranslationStatsController extends GetxController { final RxList historyStats = [].obs; - RealtimeUsageStats get realtimeStats => _usageService.realtimeStats.value; + RealtimeUsageStats get realtimeStats => + _usageService.realtimeTranslationStats.value; final RxMap costConfig = {}.obs; final RxDouble dailyCostThreshold = 10.0.obs; @@ -34,17 +35,11 @@ class TranslationStatsController extends GetxController { } void _initializeData() { - ever(_usageService.todayStats, (stats) { + ever(_usageService.todayTranslationStats, (stats) { todayStats.value = stats; _updateChartData(); }); - - - - - - loadAllStats(); } @@ -52,7 +47,7 @@ class TranslationStatsController extends GetxController { isLoading.value = true; try { - todayStats.value = _usageService.todayStats.value; + todayStats.value = _usageService.todayTranslationStats.value; await _loadWeekStats(); @@ -136,7 +131,6 @@ class TranslationStatsController extends GetxController { int totalTtsPlayDuration = 0; int totalSessions = 0; - final Map combinedLanguagePairUsage = {}; final Map combinedModeUsage = {}; @@ -151,7 +145,6 @@ class TranslationStatsController extends GetxController { totalTtsPlayDuration += stats.totalSessionDuration; totalSessions += stats.sessionCount; - stats.languagePairUsage.forEach((key, value) { combinedLanguagePairUsage[key] = (combinedLanguagePairUsage[key] ?? 0) + value; diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index 19ceef070..30d0501a6 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -466,46 +466,25 @@ class TranslationStatsView extends GetView { return Column( children: [ _buildIntegralRow( - 'AI聊天积分', - controller.formatNumber(u.aichatintegral), + 'AI聊天', + '${controller.formatNumber(u.aichatintegral)}/${controller.formatNumber(u.aichattotalintegral)}', Icons.chat_bubble_outline, isDarkMode, ), SizedBox(height: 12.h), _buildIntegralRow( - 'AI聊天总积分', - controller.formatNumber(u.aichattotalintegral), - Icons.chat_outlined, - isDarkMode, - ), - SizedBox(height: 12.h), - _buildIntegralRow( - '翻译积分', - controller.formatNumber(u.tradeintegral), + '翻译', + '${controller.formatNumber(u.tradeintegral)}/${controller.formatNumber(u.tradetotalintegral)}', Icons.translate, isDarkMode, ), SizedBox(height: 12.h), _buildIntegralRow( - '翻译总积分', - controller.formatNumber(u.tradetotalintegral), - Icons.g_translate, - isDarkMode, - ), - SizedBox(height: 12.h), - _buildIntegralRow( - '会议积分', - controller.formatNumber(u.meetintegral), + '会议', + '${controller.formatNumber(u.meetintegral)}/${controller.formatNumber(u.meettotalintegral)}', Icons.groups, isDarkMode, ), - SizedBox(height: 12.h), - _buildIntegralRow( - '会议总积分', - controller.formatNumber(u.meettotalintegral), - Icons.meeting_room, - isDarkMode, - ), ], ); }), From 2fe25cd8d7b07d3df43abbd177707cd86520453a Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Nov 2025 19:11:06 +0800 Subject: [PATCH 064/177] =?UTF-8?q?refactor(=E5=9B=BE=E7=89=87=E8=B5=84?= =?UTF-8?q?=E6=BA=90):=20=E6=9B=BF=E6=8D=A2=E9=BB=98=E8=AE=A4=E8=80=B3?= =?UTF-8?q?=E6=9C=BA=E5=9B=BE=E7=89=87=E5=B9=B6=E4=BC=98=E5=8C=96=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除旧的headphone_new3.png和headphone_new4.png图片 - 新增defaultPicture.png和defaultPicture.jpg作为统一默认图片 - 修改图片显示逻辑,移除暗黑模式判断,使用统一图片 - 优化图片显示样式,使用cover模式并添加圆角 - 调整图片容器尺寸和间距 --- assets/images/DefaultPicture.jpg | Bin 0 -> 223745 bytes assets/images/defaultPicture.png | Bin 0 -> 629148 bytes assets/images/headphone_new3.png | Bin 792396 -> 0 bytes assets/images/headphone_new4.png | Bin 926083 -> 0 bytes .../home/controllers/home_controller.dart | 4 +- lib/modules/home/views/home_view.dart | 26 +++--- .../ota_upgrade/views/ota_upgrade_view.dart | 82 ++++++++++-------- pubspec.yaml | 4 +- 8 files changed, 61 insertions(+), 55 deletions(-) create mode 100644 assets/images/DefaultPicture.jpg create mode 100644 assets/images/defaultPicture.png delete mode 100644 assets/images/headphone_new3.png delete mode 100644 assets/images/headphone_new4.png diff --git a/assets/images/DefaultPicture.jpg b/assets/images/DefaultPicture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef039c3015e7f8ab591bd873c4fb0416313e419b GIT binary patch literal 223745 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�)=GG4p0#Ym7uPvKq+yzB$M4{3aQvd2D*sv<}@j`5-Ctby>*!#NFDV zr&%9uDW(GA1EOqxbkA8bHY6p!s&{J6e9E|?>nPK?u8N?hk=BDLUtRZ7w%ZhcyecI~ zPNEg9Okz~=KE~bnaV}e7>cG)WGm>TB?T-`ib|@iv#R%>40T;FqtIYMy!rn;O-sxLg zi(RXW>Ydif+nIMl16mN@bXNvi3!?MBm-dK^#mreM>kmh`2vn8^oN>MB@f>Ep%;TcV z4OdhRuLv%pEr8eej#=W%BE~)I>5B7gfWCJFKbII#V|7$FJOPRTHy?O*v>0LxVC#$q z@NDkLgg?Ff1tVgN?pfT;8AFV{0bH~Z<165z0nZG)%Xl_kc^bGQkOrMZlMm1U7Yx9L z8pP%(F%TV}Mpi^r%Zw(z$xILuMoi?KB2*>OwTlvl6Rmm=KZvW$QN{_x019G`g9Ec_ zsDq&OMF7tM7VV1w;WaYjUvHlngQFyv<=DU{_>@#%9CQHGvC&^innC!ho(6^>;NVB< z$CwnKVkwAx`^tpr)S*0oAj5bIk~=ul&WUORIo)gJUYz8~qfH^~!*E7!1Y57>S{iV& zRX277R5Up$z4~1y7&Lb@4*AQVsw5)po$O_^)^)z*PZ^uvP}0-9n4enbZ0G)JY>UQ7 z&;%7G>4gjCx#oS5LVVvJ@RK$?14}c}E(Y;bH(qttw)RviM{PARh*Hlgg{E(k-W3Ix4~E7B=k&}yIn<}##!8>9vEO4dP7A7Gr6TTHj!pmZRhN$j9)>7O_A)j(rI(9*tSsa>Pj;u2x6y1 z^Jb(0)A+Y@u)MR#epS_td0oG?%egJ}CmCYrH0mqU->N^m5ZCH^mWL7hQ($(CV9=dW zT1v3FmS$qOv3&b=55=y{;1VM!Mlw9U z8HuY&4ovp?r&K`wmp421>3mWhg_6g2M;hLp0^98$&*t_6^B*8**(>+TW0$sf{Cp+m zov5X(Xp$ES?`s@#2X0tp+U1DW$efF=mNtE7aXCEQH|W9B-!IRrn4`~H)ei<#WL}Tk zWx(1r8+IsHzO$P?rsZl-X7q1cM7Hih!so&t3OTjQju{3tcU-=w+}x)9Jr*|GM)s{h z*PaBwuUTD6Disb}eT8r6Jd~x^(V;pl9W)qvv7`ZUgpglucp@LW35#Szt^|B0$BGcKOWs_U0RZ=J-zKyCUicvajQnTvpC9|5!AdnmY`56|D<}xhH#?Oba*;V)Gc$ zA03{Ly?&Hde2LS$JZu1%(x1wfY&G)M^42)Iw?ZVC`*ZZ1kH%yDqf%twZ;ws!ib(t2 zj0avod-)Lg^MS}Vm46JRw`VF=1>#1Gc*53jl|}K8yu9EtH|O+F&w|y_qL!wd7c1>L z!JITZU0qurHsKBJEJOVKzx^o=dJnor*vSItEMbn{qD>SPV0#`xl2`h&E+@AIXD#Xr z;4k5)sgxvihp7g-mhp#WF46isHivYQSKvoaYH@4=XX7;lT`?jF+~Kf*))0F0q~hs( zoT#2bZU0DHalJ$w_cYTnRhFdb z8>PVBYg%@igs2jP`p+ikEtN-ATxTOWa@m*T{U4}(|Jtt2?E4@gg5zHL2f-uZ zdwj;99PVhcWx45Oo=1m=4zupB-n%Q{HJ)A?LD5hP44pqrS zdW`jj+N(p(F6Z?ceIeD2`xTUx>^w>DzHL}Vex10Paa>C9qD|KqY~(qk%%Xn3_|=WM zfr^K`Yc_sCZ|*6mOydQqZzMAFN^s>2PcE_d*`G^JsN(KuAxK9?OdQF}vtCgf$BKWv zykm-dgW;JFjJ5w@JzGU-P_Q|?IH@4mcDLB1WAS<{+f8nUhP5=a&??$S&YLsNeN0KL-e*QV7ZPhNnS>b%*0|*3USmtP z{<)Ax;esB}$y&S1hLNGn&Gi%;;>(!$dSvGoC{y>_ww8_=16_=NM1CRR9Z5tme`vg<7 zka}OU&`C{80R=@rcnvTeis>$jS;^o}9c(s!Sg?ZBM7}N|Cw; zdzE_Px_f$DtZv!m@x_*`kShZ>nyCzKEJ_VcvGB$34U6`?s1oO}&pHpEk*DuSRH4{3 zIB-UGso+L>IQV~z8>>=&?4h*@)Wygb`qtgf!29vMT-!2ffBv*R3B4MU2HS;1EA~q3 zv5RoIt`_qpQ}LZJ;$C7ax_L6Pu^$DKwRTgI^*2lMRw9>4*1c*vrUaLGu0~z$ABN=Z zSYM~jqg{v?^ANzjEZdacc+8(@HECQHEk37w`H{D@pXD+-(!0o&vCzNrX4>n8F05qJ2seqqxDE` z8`18u>CvZq_M~=*hV^X4ePOC&%V6J#l(LJ@7wN?^d;Ltm{jSxhY1ZIQK!hT#&~MFe zZe|Hyco$Mtx0Gynm*8~?DFfM0OO2bX_0H1w5Z6*XlX&iCujo}Z>^Ej1lZaSlv*I0W z`y)5j4mcL&wb7cD^?i?dzA8h8McK;aE1q0%zfC2!;zOKWG`j5{9Mp2K8lOb3wNK0cuJ%}U&gke%<7uc$(lBl$6$JX$6lDeMsDB7};{F68*vD#b;i+wd4P>Pf*^jKB|*F@Z4X=M<->hLS|*!A^_JipU0?+XUa zXcN7iTzQ6&T)*Gc>fbZON;u(lkhF1Ed`N~whnnY7$WKRle+qxa+GptBnchROOAagW#44RzOXr>Bu^b}LiXLhN&Ft~-ir zew=Mk5vZU=bC<$c)0O$diMktEhTJu_hB7j`Ki12y<;qk3=#FJDqcmBqu6zTrvpg3& z>|e8M>SUUL5YAP2s6()0JAXdeF0m83=^dqQ+BRMw^px@Up&@_L5j58F_a&EO_sqwY z<9H0k;m=DGwdLa%sUl(0P=A>idPw8YRAlo<~u=7cP6;lEgTwVy_ zI;eS}^Wazd>VtvdBHgpMkF|Z*!!}y;r?+|$n+NAsZny8$G;aQZlnP$)N7CA8P3y%e%Thh0T>ch&=cUU@S36?X^yBHJtr;md*) z^sg04^S8gC^=T(^V#XvrxJEYi-7A&GqT|P{Sqj`KTmcdEtGN!0(gc0W%45u0#mLLF zywtt)BkYs@2r`Gaw@8LWwCJI<%dyx(?Q52KPAi%znTPbbHL{s?qd||7KW8PQ1hb&`) zs3vfPb*R)1l9=}*)4k;ho2;0?fOA7`R+u=*0))Y0nB00P^m=Y{AT6@X^NT(8RZ9u+ zsLzhrxI?b7o>0Mv;GtA2q`i{zx%UPI$X{Nw4k(rkbnLkA$7^>M<&B%=Jl;%=O~Z&}N^L8TK(z>OvFckg>ab{%cO)O{Hol?! zf>-T3MN)hu$DkNN|4trio;x_qR+q#?iWhYPOYhW(ui^>q@=_kUC0lmw#$3yB>N9CU zZ2woihJhpQ)Of##>t2)fszVb}x^D?>sD%Pk6H4{W%h~9*tnO_>IEIJOaOZfiVxDY` zD`H7uNugR>R177oF^pzz}{rw}~ua1`}DLlt5 z1(MV8DThGw!d>!b`zX_5m8_ryeP?|YLimtu<$MP;)MzP}Iblh}NBL$kPo{@COY!8+vm9{3-N@%#yvv8tLyU!)`Gjk(2zIOX1`-Ow2sbi)kBYsIrk6!5BQ9&&F!WQT2A zM6{5wKipI(Z4tL0e!_Qr<)&s=@3~~HqpqXsiEZ-_W%7?c!-{L~=zY#4jjb+W6Hz&; z{A!3pqHvdKmbn}qNj}xdf#O#*osc8~4k_&<+CvwtzG;sTat=eR(S!1E4_gT=5ZHcT z>zIIO~Fp9#6cb$poGw?dL-iYUcT7xs(ehW zuG0a`mNS&E#>dt8fyuDt@l8)o`uX-w@~6J4cbctw5bp4^Phgb%pv zu8r?vFgu@yQ*M;DEPHlSTRtM)RriMubPg<0R90s>R#Ut4K_~?aVk=%Wwlx$EKD}Gw zBC0vqc4*BdwUhP<$C8WlmOkPXt>o7b5#ctC$ojbG<8`TJ?3pw~BS?XdG441PB?A=@ zj49AtUYe=%*6JJ98K+$o(HMfw$3RyTre zFjYrKm*>5Y#fxloJ1eW$*+NGj2- zx}Z;_2tx3VqpQ`?oY5Q1i;J5&;yIN4GUOv$Z$i)(P3KB$vHTIMoHAB6ey~-irIm&C z6SdM8hmrQtw5txR!&@~2_df;@R(?M{PBIjUlDjfNAWhS2cm|@ku=e$-U70?1^>~XJ zRxE_}kT1AG`tu8?ZwP^clF7P!rLRGMAg!{r5;rZLrHv*tH{>m(YACGUV;(N~s`{~T zWmRs!cX0qyny*#&D!l%wf};+0B8cyhyZXFGM;p7$+?<{kJ}YhZU8rmi`F%@Qf>z~k z4Xd_~-*jJQ8ZF%(lvad!r*(CS&EjTx-egF!9&RxrEK|N4stXtJb;UYM~*Uk*+`JDT`{PKK0S3 zUo4!G_-Gdj4d`2gEOEJ1FD#J-D^jHJU&;Ptew6?C7m~$6%8NqAN7?%l(Kgy%R%y`D3$cfAdR>pqFUpIcNjG}G+VG?;_M@_gVY1->&(dIK zUt3o{<-@f)WyUDkrqUPJ)|{R?Z|JZm*9eUbR4NhQI-N$ac^ncCL(TIa z?f%|TKVMq^hUAPa`jTEh6F*w_@kNR8ndi@oT4MDoE{XZuwTdSdutz2<;X+EP9K2<8 zX5!zNp5LABfO00=E`*8@BF8a{v4)Z5SxbXivJ5nguPam@MPd6-%zeA64Jl45iP_nC>IN$dORm~%)Ha(zC zYclQC7N9+gviVW7O-|FJ=H+m;C#M{vjQ&5+ z^VQR)`uqz}`je=|%kgAW$r`dXk^{p-m@@M2aA!ftS5+qStanbUA8S7Of} zcejsBH;&-1YahgikDNHG=Tv~u63CfT`@nA9HO$bgAM7Jhi_4~N&S$aeB9m^_LT+7> z8yn%;W7@Sn_clG1>gw$uO9Ex8Ax!>HvUUGJXl*AiIKRwQbirNnFV)*WYd0Jq6HNl~ zXR!EKJns9VJ1m>$T24RxdkH*~6vGQu2FmBw8|b+!Z+u4+mk_Ibne>|UcS=Z=;)Ym5 zSIMd1k!rWuRF73h>aG&@6=hdi!#+jup`gB*=+3>MS9Ca|XQIAv7vSZm@&GeXw z#geVD_#n#?cGU>d)JJ6*Qe;dOB@6})QR32>o&z2OLU<>ttAp4sfr*gnWtYlLY1IuR z>Y)DE!Yd`tBS&Qp)79ma%HXVvMZGFYKZ=YX4auwYUEnqFC1)!syMyr+hqJY4I#XDY zbopJrUd^Oq7C^G4d961c#!!hXdjOSXjMb%_Lm#Y%e=q+{?3*+1+Q>EWngaO_VnYTo zS^u{?1Y|#+gU&|TjMH|!A>fsP<|$AXu$2Vv&{S!e(;TtF0J^7eMl^qWbcuZ?cyp&Y zchENnax-vZ3t%m>3B3f%h$cExr!E>!6HBZfAW@(<>M|(vf&wlm?SgbaXd?!5g7!hQ zGf2q*_YM{fJhCd#k=-L#2#UWLA@w?81gIYqhi5p0789}_VbD@is+^c>gihN)2_uR9 zVCc?GVpE-s{xUU69m@T@s!c6}ypPZNb57MZwzHhrJG(JOW)1JkSisr1hrHp+b6Hmv z)pPzPPtd#MFw`8%s{uKb&1Pit<&h3-T2h7AKYHw2;*_|Wc|M+fIWXR8(^#sCo$RbG z84n^Hvah2_$%Qp7@bVRw9$wX_Cvo5E>@4n{{H=Y?yT5Frk(AngNnre<#FD1q?2fai zRR#+_FW&cajjV0jGFC&}G=|?cJbF#GEPBGA zY2EY(Qty`*%pcg0O)W^~F7RuyVlRZPpDTT)Iwox#W_uyj=enVnM_|}+ORB!|`CZ4j z-Q>JKkUKZuUwu67Eze^1%q-kinmV&Ub%-mPnf}fbh>1*IFxNNB&UJ`jdNgD}kH#>L~|HMAWmV_D9+BIuae3%m!aN{n^g7WeGxHA%bamYd71D#>tP$<$hIDhwSsGp3C>0th9v6bIHxw#M?GGL;tR%{{vFCfMaya@LpW zKajFabHQOsTDC05c@rHNq7$mBUpv-L#*?Y~7F+hZ%I`uxO*^&Zd`F*4N<^zmpbI&E zL-lUk)2J?oFIJlNw4rGFD+1}A{p^f>D& z{Pp`F5DEyi%uFDfjZ3P(e<8(u6X6e8{^9!m!M)iB_mq9?RxXgY+{ol}lbKb;t}B_p zSi)P$mXJR@`vbKzhJS+%mLccNd7{h%8K~HMR!>;`6xCCEA34P4d?#7z*0qs$6UML_ z8iP^2^EVj>Q|k^?>5OS@F6W=Tey}UKcAakTO<{-&DyA8O8GNbHFz&nO67rh{ zfak~z>S!JNWVRpuD*-h9&PI%2w%KU)_b9IkyZLP9!l&xmd4Lz?5}-_)>FPIcwkm zgb|sTDIdqTUaPclf)g({^l2hQ+CEyczY}X8?>n!{mvXhYs8`{)dx~^jh3NRmZ=S_I z!D@V>U}d9!f3k+3Gv(#1@2_@y()=*XtzIN>uBdJQTLN9&Rl>F`3bai9`_k#6jZ1H? ze{DKqTbn7|fT{b~Xe19?NDO$!&PZ2H5qdJfw(F%XS>Cu zd>8tz&{ot);Er|nZ=sVICSCFm8G527%f3o+o9g+R!F&aacGmFEHrMZ#{HWT7bD=v{ zu58^xKGDHEDv*Qkz~c2O16mmT%)I=BuiR@dPo~--=*;os328rQznA4sKg7*XmmsA5 zjFSiug)Z(S@x621z75(d{Wxpu`856!O76DBnDPgvHw!<^|MJ!qWa^=nes;aVh&pjZ zx2vn~-T2#(KalAyc>as&)oo9juPaOZU56uN7W$b*R%%W$Y-wHa+K3;d-ae5R)P@%q z>^l>9Zd53^vu&!U9?C*9GnY@&x&v3H9j>rBV-VB)NXVLqDvT)UR1>;rTqCl9vkL_=0S{!Ir`O@)oIVH=4yua}|`TY9&7d zjZA(Yi3k7WT{~vxyE`OnuA4L_g#sb50@v95>>Dqv>a(quFo%+$5gkf0^E+8C4f<(Q z^|l}K(hDHJwH^q68Cu=@$T0L$`N>{E;9;rf;{cz3_+xD+XI6a87xm9v_=4nmc*HC* zFwSXwdsgC=H`Fr&DRkx0QbBZ3C)eRf9qN|HMf@wV_-j(VjnPSM()EL>H#1$#$JKg# zF#g#gM@Z97B-dGgYBrTr8T{A&^VPjKMsKucR}`*GzuKSqI2qQFl2#t zsYqR(P4SSTX5%Q(*1q%$voyJAC_Niv+<4j{8Ka3_-K=SWO@7vnAS#*rnckf}xk$#1 zJ;RE7+WxnijEX zw6o5{O#BKoMISroTF?4j*g9Yu{=V6t?j?gt?}(=7B%@&G;$o6kT&<2L35n@N;#$Qn zKR6SVEW(Q0bx$qK%vkb-&gK<}MoDcHSZ-9+cFpFjqzFEyjHbM?l%9r9RvPt<4KO$H zRtHk{VIAF;d*%L(H}|jFNwG%e5g?uH-?`9&V|}#seFC)>E^jr$ZgAmKT!v&;XJnG5 z)|h?JEVr)T+WsW7-DXy9w48UNuRvqiU-4vg^=e|}m7h(&n-FPR=y`kNP{rI;ZShia zagAX}=f<|^=FGHOvd5L@t%-zDWscc-LdmfsBWSqN$g6dH9>|E(=N(@uBa}=ZhE&ZRWSRQwOld$anEzrZju!)WYu{+ z_*d9Zg++q0VrfIcj@GeMV-3MSU>>=(ODXUOX)@wer8T!z_i};y;<&yW#+wnXU?@+i zJoN{{IHH{_rLZ?i7+Tc-rZC9tM(K&Uoy_UAm15wEeby+B6;r|cSCp95a^!O5s&huEkgE>QIL)quVN^^wcs%HWJ2$jODU%@MmhK$H4uC(AYx zvBvs-Y`<^m4%H4#s@ z7=eR0;8@BaXhkk_BpwUNNC4$F4GJ*Ej1(Ld(;@ne-~?0YyVs><#bpl@ai(=jAidX= zv5k)MqCIVuAvO$(LBRY?meJt+N9p;PL{JDsqLIX=Mq$zGlop^(W)!!naxc*k7e3t@ z-F0W#tH?}@F#9^08k?5K`@nbf*XA8q+hK7`aGQX%-1>CdbIXM>=i1Bn&~ICfMSVMM zH1i8elYb?selxoX+h(17{oT6IC#~dM_n8GUrj~cxksd{R0}EC+Zk_Z3ogd z!UJ8DhCF0YeEf|{OiHeyeGjYG2>Jtp%jt8IbuTgmN6TJj*`R24cwn%>RJjh11ZV$h z=`g{sb~zR9Mk3VuZF^6S=?OEQpK)INnfxH-g)bG0_V>Tpe9jfoInYO1%b7UTI{kKx zGpg%n@w7vyBUdD;MrliHFzH4kzYlNZB< zk{R#5PoY7kEJFs?ps?r09E8UBx?k7jhT-MU62uZGKe9UVxU*BKdK()k+wQT83wrU< zyp-YoB&X&`Pw~0n4pg?rlRo!@^X9A=UsBy0XL}wzCH6yw=0J5fJNvRnTAs(O?6%OJ z;eFMnhDd{#39l62O!WjRe@PLhsq7-x6DZdMB^HuAYkzxTdOaxFNyuv5Ce!Rl(3suj z2YR*)bI0+o@&aSSdm|Vo3BxCg??qVBGYs#(MaRT)o4WiCE9n>Dyo$Zt;rj>j`45ET z!%Y7C$}_XML6sbTD=V#7tsPqI#Lf~pA>=LgM(lw)-@Mk>@P6UDg^O3;QXTzF(#JRj z2l~lQeo^iw%}VP-L0k{F`cy0#b;bs`^mOcECBMJI7h1dv)UDLbQri|Md^%ZI8-Bl6 zp2lR0M(LyLPsJy!7qcTVYW$n^7Ar1Dta@Px_s27v{fOt~@ahsK1v;UZdQ} z&_70t}+9~nrGRQ0%<|x1@S6DX%F`0v%1=PuP*S@ zG$q_f-PD*(e$AoBB<#-A@64%BCb`|}^v^rxy1oJK`F90h$Lw?#_uuNW@0zX|dEJ{u zQD*b@_r%2?4@aJxv#{*9)Zvb8_|Z|{ezb$`C)hbi4zLd46Bsx>yiVS6dL1#&9t&%K zFO+#R+_2@qBX7s9Pt8;%S3s!|Su$FMdl=%TC*|n~8hhmYn2U z3qLIG5yARmmYebfU)W(2j%}sN?e(6R3fvu2T~oUp_5M3_EYti(7G^<8fI8)wY9Km% zY{0kWvt{wmZtokP@|CHt-TDVA+-keC7+fGCsd!0UI?C&V&H1oJO)?~m?X3&>%aL!g zQv_if>A`-DV-5RNf;^Th?Xj4!JYBm=U=Is-^M|4;@1g5QG|n^?v}dCGzU&!WoNZ0x zkaia@6Qp~UypVic41d2uGVj9s$*HrL#q!1gQ-7O)50}fQO?ds`ratq~%*=ofZDUk^ z%mpSq9-Dr`F!;dB^Fx4i$t!$`|2JOWn;BUk+gol3w!hm0$+P1ZZA%Lb_+Y-#%YkV%!?Sou6vQzhLX4| zmsoe_3?{-9NRg|wXO(Ghs@KV_D&Mt71qoSeMiZDqQZ(1qGHkux7&fl~ZQz+i)hB$( z`FY>X(~{!28&0+y5ujMic};G3bHR|~UetY^A0ur`D<`4l1Ac-C+D08K4~MS}zb{g< z^QJHhPRcW0?g|#CZP~~7iI8y}oOn<^E>otID`dU)!S7wV{`eKkTs@ZpHa9DB7K;?A zH8!4{O;aaJWL(@V?|~(TYX#B`1*eV}kQG}vYa&|7&PQLm5K@KNb;l`Me+<=I;dG^%qF3E$(EIX+D~-ER z2PAE{7{}v!$R&d#f4*EultpXH^vL>gRfarO=(1Qx>2@70mbGQ>x@Xx9fTdCLBYSnwF>?a;BB!)@?3QjU@pEcG>Otp^F&R8~9;Lh;!kpdghAXEqKfR z{o_y<_P$37L)XRx$0y$AmWJCvuRpNE(T9@6Qn~bUrc!mWUCbY!_ybWAzbNUY(A*$Y z_Bt!ud`>e)&^4{il?#7X*I!fMYsDt3&VEqp>jqJshVv8>@mKG=45(k7;;uSsX_zf5 zpB}RlzHPAi?CyRT@Q#x~p+{KPh9t z`~CcnuW5y`V+)}tA{r^wO4TZp)J9YHo=Roy;lPl4z`24e+*P1~*4N&-cy`xeLY!q% zFblz>H{Igv22q^N@7J~3*`!*n>P->5on(mIMj(mjOuGfNg%4@MLYP{N(^sX zmT=04$X)WBC!j<({VkJGGRzlWzX*zHxou^JD@u>&204r^R2zPfcIP%!&_(&>^mmcT zd-OYEjU0$RcF^#!a4yf{Svhi#txtq~Ic8#M>>mBE{sv8v=SqZ}UE(1x9B3dWzLNgW ziCtS4&mJYvT1#xF0{KVKi4{!z{~UUhKqnP&6^X|*qYaeCKtnSWw37u(h|wb|d(JKT_9w^oR1pUq6)HOI=>_lv}0weW^=Yv5z7}~ki z*&HRI*SnaW29Aahz0Mv`-36z5C5(yQCGn&haQ_hCWF1cQGW#TB@|0}GwmEJ?B{Hdm zSvu!uBRl<1|IVYM@8uTEeXridyX6Wyhtt-@DlA0FOcr-lcmQ`W9Dkj@4c1o2Ex9Wu zwY|A&-1)Pb{;=!Uw8(C(zdpAvvo==dqWT^EvoT$&tF9LW0tZwU8U&m37X$_&gryBE(+Wu1b8beD?ix4%bDq`JT%MV6y9hmu~dMg;oK(|XlEkesfiGU<=hkKAoBOI||0 zIMt^FQ_zjlBj@>%{VKwopf^=h6O0BvyyWlyho!TOYVz^_{uC5J1VKO=q+7ZN0@5Yj zAl=iZV>w9|>UY4KXWeOBG14;Mz;$UBv}xqUhp zVb)@lE;nxOfB5_+Mc&hVXMW^DsvrbR`=i|KC3-(vlwV@BE$)8adgTU}kiFh_&iOHP z5lH>Ka5I}&YqCak_-Cr<)9YR6mnBP7pO>IXM*6(=Hn-LLhknEzI;U?DAISL@Oo!+J z5r3ku5Tf?V#uw=Mt z0Cm~1NkPJ=>;9@qFy9++`PbOi?*yc|*W}mKy{sKcjGu_w&6rl%kq^`nCryHIWQ%}M z>_}ha%ZAplvx!6tC6O~se&Z)eT(YB+nj>)^Hn~cWYEW}LZHmp$0PU^M>x$SH?3f-1LI9 zemznbd07mRv`HU<4;?aKOC$KE^tHQp8*m2WZ9T*6x$7l6!Dhr8k9L%#`_HKC7O8yqw>l6lLgeT2fmw(u&)jNXtzm<JGZ)qX?fm_#Yayj3`R(qbi2Gea$n;?H?V})ugArGuj@)-3lvapVjlW zjx`81T9B~#E^FS(5gIB^klNzkk3AQo57BH^ZJ041P!0{Z$@=m|qOrI0SU~b@XFSOyrLw$+G`dK8`WTPV-k^PzVEo?$;~u9RMVi@#JiGDR(j47 z{V?WE@!~JI=M-MO66NhxpjA;?4^%=Zt}fhSMvjk?yWVL*t?Lf7Alj3UtiDcM7s};^ z!y(M5+EkE6L>ew~zIB;7H&x9VQ~t8>h}eGQ7X>>tOZi_jiza2F zA8geRWHUFxyIn3ha0KN_j6XcTq*6EaYgW$nqjf*1o@+BgVD3N?unY4S#G5(a#Ceiddg^GKbOED(uLnp0@F$OXrv8ImyI_ zKolGjlt~yNt3LX0|t#C{zLo^J(P#=Ds8e|=ZIDxlF z`&yi&{h@rL-n6)-B!j4Ugu5_C2Xa|jI^)YLVUs#ud4pg$7!(<`l;ZtYIn}r=_@lDR zMVUc8l*ZJgBJ0c5<6gWac&nlXu~v=dxiap!uN2Ql*No1WdU+PWXJo7(H?-()&>D6^ z1^IYUsrl7xjXJyK3hDEx4&J05Z$_vwb^ZgieP!`zeE8yaU9KwT&N58;Y&w)fRqi64 zQ_uv+!5zHI?Z&qX*-J5b0IgSZ{-Dv4a0&AR9TH$-%i z_#U%^s~5}&{b5U&TEyV?5MIfxD!Uk27b&q`OPa$eG6$3kk-j7>3ux(B-j5N~$gn-f z%5b-&E#PA5cNtjXR*ZU$*3Qwn*`YsCFldZ-@lF#VyXJ<#v=52eE!lE?Y{TZ(%gLy7 zb)NAts5;C^?<+t+e=D=LvX9_}T3tT;R&w#>_=D9Q5jxiRJi_jq!Dr#fb&Pry>%fa$ zx|<$Bs|n_bzxni?XyBn7qD&r`?M=#IsFYlr28|!;XJ*5Uz<*Z*S}}Rg~*yuLtPa3dp)pCXMeO?vrwI?X~pBQr2zowq#9(UEW~Vi#NW(uNCKY zZt@WJ(|9Yj!Q&C#1S2kY{ARpqf)H6^@DKN{J%0@S4@=plqXr3T5CcX#8f^s6Jb^^kP?@X->1GsC z=^%B>8~Ds$0)4o;OIv1|NxJThD03%?}jAm-p09MkvXrIzrAJ?E&Yh6WNF``_})UGV`g1NZ^oHChJO zl1XHap^qJO!m`w)tuac<)PJSVZnw6k;gu=88C2mqG^)LPIh1Jsg~@#0i|vV_YM}fa z+=$c@>r*L7+&IymvM0VjXPpUr{VHpWJ>s=IX?z?SeY>EB3BUy9H6V`A&C&T7c~mkQ z-nIu)_+>FN{b^<{&QOom0-b`D3eRt)VFFw3<2-s7nt20xk-utgEIVgQ)&|acYOkA@tO*H z0eHyP^8Y`8|NohatUA-OG3+1<5dU$cGO#w;C5ehvuK%;)8G7m75s>v3^x|101+F8{ zUL+Gq0_nkn<9d*n>wG~elI~FY23gdr{-x%ulpiFU^B?_&N%wzkyf1V}xfL0VEJU8d zKmR+9)!A{=k-QL9lCmiP&+v<7+F zW_smP4gXuP3`)*T5zX=uGHf@yo+ynM_E;;^{H~uO#R&T4H4_MAed759`Iwlq)b(11 zsQ0TBI_meJKp+F|b_;9^cB7@mKFHeE3hpQBuEjj&AHUdLY!jP>R19ZD4acdkZBkxS zMDyWk+uTm4Ih<(D9831(Eu6zyR~fr#oUdt~dGM?zW#aodFW4nfH)%4l{EF&}ssmZE zm||mc_>h5$|_ZkvnABOr=@(qUoo9O-I!T0*?2p3 z$T;Exo1dSCd^1yne|gjCTqwU3l@t7iI?l?1r8g@rGdnF6tUR6GQ8aG+Dr>MMXuR33 z!fLQt?wHcJ?&5t9t~Wmbt0*R~H5VJSVqu&4+7#>q*_sV0H+~i6vCj7E7K@9j660rp z1S49JEa`1v@~jFaLZuA~m78*kE5OPQS^Wzu zilzb}YkV4a22Y0X-IQ0t?to`}!l$jyaq1tVX*8l-F5V)$P{W{aF=XT*ZkQVPR%lwa zm?6i{s6ck-pcvV$X+3RW&cE+9C)Y3Sws0 z489a^rG8TECJ$}e^W6)%*$|SClyM-lFQOg|qeu$dk3Z}z33)@-U#u{5Y^m}*kl17^uW!J5}1^Ix4R;_=d zwsZfEmqZ!RP5C74tmO_AwC9xpZ}smCWDGHz71xwdr_$C}r+#w%geo`W*&ln7Euqv! zR+>#}^Z3gV)Ut%dr88ci`pux| zr+1gW&I;cuX}k+R1q^J`M)Q1GLMOVeTwHGqG18meY)v23ll|H5$o^Q_>2?d`Lev*3 zPNy(EcT|n^ViA1ZaO)*`{~isE`t3#oj+5u z4ZU^|ZEuV-?T5*3I*d9bHk^r8j3dD6T2vtK$JITHeG!VYY212E1Q5>cVD1QXIgE*F zsY|*g)r_4#D%9DjpM+XOT-q$X$3xHW$1Kk61oD^R{QW()srH#Ig{MH?$!@e~2raqC z?6d1&uMOe=F0x!Rj!E_U;y2&PO~O1%#6gl^ywljD6l=!im~~WO?DYm3j3m z20B(R8g$X_%(?4O*jcIj<2(mutO-3is!y52=cpQ^$$}Pz(M~^ImpGT@ZL2wq-`{1Z zL1VhRHoP-^4Kmtp+7IrZfg|tG)}MC3DJBLgm2OYXF=H~9$-n{nKr{tk+qMuAqj!gI ziz8)@w?T?Ec0_TwqLEF6K-m*yTO_8~Cfn}gl=Kejhvv^AUk#x@$3%bEIkbuu^xoK( zN6t4QyD9Otx*CW5KU}{RYF4Q0dK`6B8T~b}H90h)5K>azH+Og_Xz-|ec-GJJGSY3+ zN}e;Ab~6Wsg5@PO%vH5BbFT!(i)1SyTZnmU=LJI>=!f?o#?!ykxMr&@%`tCKgy9T0 zvbF+!tw|8QJ8iwc!L<}8lqajYYiyr+r0w5bkFo((h-lJj$M)&p%{h}NO;{^lDlP!+ zk{&y%dQOXzH=M%-k0n`EYgG|X_Wl`umZg==dDb8LOLX*CmIryd83;};1Bck9maYho z4TFjgi21@EIr#j5@ws#?jG3 zDrlM#*q&6l=7=K!GNHuwX5rmKFUo>V_k zZm5X%fp6|E*R)m~0)iW9LP3Zz;gmoDGp}WXZxu!Z(UlJsGa-v`- z7<=<&9BtoVEWX5=@4g``rhy0gTy6z%Z@6c`cuoaoK(x+_HG@xu-(MW2&QBY{Wu6hK-&l%2ztF~&oBq|o;q;=e&)G}nmh45H&y>@aN ztd~LfJ>uXVhgzn*VM|pI@^=d~J@g}HhPuk2{g~G<<60ndU2&y>&%JO4++mMfEAN)I z>KcA-6mSIuse=`n)f%Qwr(dw(9GlZmmrw>7s#WdHrEBK0w)P*3k$i`|*D)f`UN#zo(88)S8ERR126z&yO$!)~x%nee&=CuSxt)|{>xFdAr&X%trf>c0LA=bcK5`{i@?z;(Gre5PIDAnmP>LHS3m^{2;=FNF#c z75_MpBF`e9{$CF9@(MA>(aqGESTjeW*p7x9c!Ar$s{aAT1-w!AmnaI|R@f(xUuW&; zMFpaxO*YdSavw0M#_W>ehe4&Z3q?c!GssZ>+@a|;q>Qq1aq+)!@d@BZIjexm9mp@J z%7QtlDkle8JRj0ef9Mx2ezP`tI9RNUdUo#`XLxXgoPXW)+X;)J2ANJq{Mk;5KU!l3 zSurjaUqxKX#J+;lFq8CE(8Q6O(`coy{dk#@Yw8m z>Lxu?lq)Rx>`Mx+Z+roGi6TDJIF|JMdeqc(!hoO+nF#54gwaPTaanU2Njsxo=;40x za@P+aSru5rme7D6?=)NLc|lae%)SQ+sk=Mo6dNK)^nzm~NZNbj@B})IGeHz8vZM)% zp%)05U+0N-X6V#F=_dXshU$a_Ev4J}pa3q2NP~L=bLeD>a$NqG3JkCa(&5D;PaOo- z4HEU^!GQ%iQ(EVrTBudnqXCv{HHyq2+tI+{mJ?&&Y) z5M~piu6>C8h9w2sNb|OIwHRnjz7RJv*dz7b{s#cU@2B1ju}!uk_43tJ8%@XJ)p2W@ z_(2-hhA2yF{w-f=aUtR|CBc~dSRW4|j5^lM_B2P+?VjpxY6TtXQEEOS(&%6rTeUjrXQSrEDIN#mBx)o7>IV zN+a!tM2{jJYEET}bQ3gILQywJ5BnBH<(INv8Ggz@Asi%G@*UZtB1bE>4bx7BGg($w zx}LKT6JK)0{I{nU#*gxIRHd7wYSnZnGl2z-ZZY34nAr`#pi%JIJ*XiN8V&Nv`r@ZG zvTF%ZS0})J{8t2I(@8&Lc31;AU4scx_LVMD`#ZL`a6byi31+HUA2Kr`v7`JnF3m{8 zh+Es?=}jpT+6LTw!O7K$2F&0-5{ml|H76_iU)2kVWkPE1NOU73#^eN2;cxjr{--Ej zhSiIDB=+NfIpxGhB*pmuLxNw_n;>bT$X>QmVT1r3YBy%>&*^@m@1mb118-)c3M?=< zdtRJsvLMEUDr{8rTS3Yvxy~dBi^-(e-8>z(mHPxk1ang0UZlc9!9IZG3!Sd@Z%34L z0hgo7W-_^>NFJci{w@}@l_@2LY=?Spn-eOx!`7aGOmBzvGUzng8X?OWC*k>w*+o9H zqfZSx#iS{`y3oGL_~?tTyPC7>r3v-qvdDq zGeN~+`3EekcKxz!NmtJZ$7z3` zAqzMmd)tNwhZBka0QaTEgnJup?nqhdg0^(p;akF$$3tb(TxDT4y=2CA%%w`b>qMoo z4mE{AsMGyMxec*zZ;Cp5LE-h@QrW)t=A}Apv{8cJWl3Df1<*#CADvv71gNf+ zl@ITq-uYH+-08MFRJOK0X56JFYDtz@BdELHEk}=T7Zz-l$#QxRk_J^c#-{0YI7w60 ze!kj2QWc=#P_$>H5(=Xj2_G*4QJ4m)395$eZ+ud-r+{Riecn^+r4@`A>$@fSujZ)w z=j0Pn(FPLsiv$n27putT5K9-*G5#&+RSYmkRvs;ok^29Ec``61WaVXLb8wR*mNvLeuc0+so_ucSOM0_r$A0cHvEH1;I5GKB_87?8Yz#)QGR8iS#s zfll73Kz1h(g^z5(W#Q+BZ%+7Hc>(Nz$5)&Vr(3*yUYXoV1DzqSl-^M17Ht$a#1PRf zx^jfD7M#9q+O6(Kl05}!TnFOi>ZB^fhsxCXuK^cmvyo_=ZIK9`q{1H8VPCrWO-goL zRE|>AG=c5r7veDmmp^rEvvR7t`njR?KSmdukL49qA{Ak`ABMg|9Fx01;j+f3!JA zQ}m!lTq&Z*9dKL3UyzSa_VK#-y7Z$&7d1?*mnG_gOQ=pb6g=jlJU!DUa(Lv*ooxwg z#w;Wj`n6I(;b`R7fXWe0`_)^M$D&*23D1+B9FmCdYw+h`yaoqtUUOS%M1h`3>QtlO zbk9dkWROeOx1@7tT4bD$g6&k!eTmu8orY0Z3nTQUcCE%!pLg-Fw=-)dL9NWHMP%xf z1JKEJ$;J7aTRU+%g?@A1BY`KYZ6f6x%(i3(YoH0C2V3)r>41RLHDQy6OR3NaKG-gX zK2v}|C;bIJC4q#3UAW#iYZ1diV(f{!yC9WF0mIP~5A3?~S1ihEM?zE8m6h9di$)Xv zTFlp5VAtt{!E!BC+U3c&@@7AssAZqZ?KDcJD!A9L=rbz}IurH;%b znKznrUuq@>-71@}k9(o=iWgh%f64Q~zE)X0$Zfv!eeqFyFL}O?q3r zEXl)Cz5k0(%@rQDVZNCJNi8mx;IUnhoOo?cI9WE4!`(f`N@(}Tj*}09U7+0nQu;`byjtKEdtWu3c;&^_k;PF?F~ zS3Ed$rD{DI$Y$^GvM9G0CfpNu8wp$0KeL@W>eAkVXvTT}HO6Zip|)Bxy*@NZ+<(&j ztbW%fTA06jDdH$RvMf`^hVIk$V+IcNJgym7lrCGL;9Aj(Yg z0NRq%@4_4mpX3Q>)MEB<$cMq-6D66eAP2kEyQQ;cVt4_s)L z@AMtuIz=lf*Z$jhf4m}=6nEY(*BHE@A8qn}symoYNw2Jrv(cOzrslq2Yyw+7yBSZt zd*tCxHl%H^4O@0ZOK^&2SdF6-b<0+ptQdeWdO55$HKwaWjtSPyzR8bvX^0kDB(@Ky zU(fg(&7~c?b}bCYAI~mlKTTD|(De{V|SJ z&eE~UKP>JWB%Ym5su?)uH9Q;b?k=5kRBI1S@5Am)S7f2~bCq!0 z_EKBhbz5*-Z%DBdj5y&lBze%?T>$rM+lKKf4<*d1)z$VT>rT>*p6?klNJN1d>fl8l zQp*!s|F*2KugcZ;hlOUy*A2!towfs8(1V^Mj&-Ald^wHc`xsTD+u9n!PuPWwv#QBe zjYgt>9S?4=H5i%fCEa`}E-L>4M6zzCbFFZ9#&w%ori$8{9)52tp}vF2WBb$;E!Ys; z3Vux|FRHWQvl@!;`)lPZHm)$IwMO<)%@*pjT%Qp<OX)b>zcFIed$ z5+#A?$D@u14UX>?SLP2?t>(_;X?Gm45hjeB_7A<-ghV%$5tUgMg`maz{k%tB z%Xs=r%UVBkX=Rw6KQRgyZ+GjZhxT-nSED!9KWJ+8#K-h@RoKCbKjYamV z8tPVNAsrKY!71%uwfdd&q}LX={4ZhLjyQ|UHdD(_F?xYD^~B!4UR#EHyLfNXpj`EO z_lLE2`hEzLI|DHr-cb6bMxuikfX)T<=(QL)7|dA$F_w5i_H^kJJ}oo9_?aw+vycf0DrT z%S(BX`wb*GF_1EXNn3K!c7fUD*zJ6mJW&1cJNLEHk93D@5_C&edR6dnh>P7-77q;z z*MV%8D&EIiAyk$gSy@^xn43X|5fPP9)MJozZ+G80)2^zN3-xG0o8v{9Hcw9@nqz-z z>}MQBVt3f*4@-8L%bj9(rl`9%F+Y9FcCrdr^;T|Ad)eKuS?KSV=^eB71q>;C~h+-tGa#Hh3y@gV;%N)V~_NcoN9 zGqYy%9vVh!UCOu@htkDxgBTtgg*OQw5Bd6t^Y!-2ZAn8UL+Nxvmo0&z)%&LgZV=k~ z^iHW*+z?WxOs&kn>DN@5r#0zEB1S|#HfU%x=coEjlA3MGD^M6v|A&<^p4B?d_Go(t z@G~+|*VPf_m7(Imcv5p9aAX^O`BI21;!d^6Vd3-||B#&i5BECIqAVPSq8Ybrl?UDku{l1Ueu0&t!q+v?H%J zx8u!F7E%4AvWkKAe3UDTX~#E7OjvLJ0jxl=hf3WE51MW5=W_`1yjc&%RiC_IlFg0)D#en=WLep z7+UF)gj2jDZt zGm+T7=}Z78=!GQoXmHG)Pvx89SVijaffAOP&(xx zv3bI3HL8;r;6;Zj<4?AdQzyw*1)y283qn#F+sCi>koo;Fp9sBoBAeehBUOkvUa^q< zHmmtvwp;$86Cc0g!?HqL*N0)QvznYi?nAwd43b#hNgdW*{aofQ@|>U(LGn#xbs}lf z27Bf58HQBjDuzf-KTAx6N{A7iNGdy=7f!3{=gYr$nxyk~hS>OOFJx@EO=Y-5D80`M zeP%6N_~i5bLqBy9L(PxpTh@+&Sk+cv@x!qssxT%NYf|}N(RfZ}KtYJFRmiwshO5_Q zFLBQyu~a`RGeqv^^mo^UepE{yig-qt?avPx?#>@%V-p34Fnk9FAKyvFxULp*&?KsV zKQ^vU;uiS^;c}|w{uG)@ZC|0)j=o0h`#9(d5h|Eu zoYaJqWlFWY|Bw}#x#oj84U;7q8D?V63LTd6{kdArx+wh2UsQlA%sCP^iYNIsN&vm( zWcM(Ti4$m5t;0P@;Z7{+$|SzHsrfr|_xdy@J6J*qNl|wr2%*RBG_HTqaQP=&9B4gH zwvnQm#Y$L+@Ysbpr?Y4yTuotuNE$Y+5a54%FC70trUN&St&pbt^#3TTjQ$u5)gco| zBl&H3IzJM|+TE0?^7B8eO{f#nhGk=%=(`w-7msC`Wd9od(N%~%;KlUBcerl+^ek@` z$epZJ5ku%70B`cmgtUwH8MBfi-Rxk5&3y&CK1v9zA#4c_5f^ZOfUWrfq8Nowv8YShhq`9R2!TjF{T(TeV4a`N4$;SDmWuWwz2JBcav_QXN>-3!{(3H&E$C z3}xR@Jihu#p`c;gVo}%9)Zp5jla$ALSRbF=kDrShS@m|QScm%|F%6iXvTb~|g!jx1 zp6E^CP0ZKu`2kstZoiStQ6y}&6>3~G_j}dabEWD(GkC4pHJ-~O?qv>ZN?uv_P=1@b zWh906I`yzw4zh_~wL#@z*sXTzYgZ)k51^R;wD=D|D;mvgD3U$5dl&uCpk?i6`#AHw z#f$wn)rxZw;^6kj^4G1ci@#U)8LkAjiLD^Q8_Jg3+~CjVr7di~Cw+C~Th_)Sch&^vz54FL;Gvw6|D1hS z70<->&FMj9;n^r8w!JWm{D#?@jICR?XqiDi(Xa(1({aqW}5US($g` zn0l!fTYUJSI0Oa4Uvx;!dIBzG{apZa0ZbTldP-6Pu|Sqc!ij2@RG&R{#e!`H%S{|M zgyZ=>_F-Qds&h7$>q^^V4V$vd3;_>2Eyc_acOG~#ZRP+8L6a&`^{@w@n}2}M@tmca zkj4(S+XJ}#@OV+ou%h>Yf@b~f4I(;o4sIuEnf~gM&F&|yxF?w9vYw)~_+)po_K--b zU!SgUYj)28h{QMK<>nz7SV;atuK{v(!&y=W9T}%)<5Dw@-vC1-`Jj~Vqo%B{vTU^f zTLe*wNDernoTrmu82SF#O;o(h50?DY7?;C!yx4lbdG*L7tP*8P85I>3lRpbT@=Dff zVoGt>IOt)xPf%UfZL9ccW|i$URIfyc1LnFXj)-6(UQ+n>hC0SZ&oV|R)zIp3K7Ixw zyy=BTE(=1{J{$r6{vTVI0VM(dXZQS*x zE0iCVqEu9$d`1CDVr;Oonx+2M%E862A-*LYeLO&@f4)is0ie#vCgFOkGNQ(p*H#34 z=SKrPBflgPLWSi0I&y6`CJ|(G2xkFMX_$RZU=HcF^E7_vAW;6h+o)Q|ieAb^PVlY^ z`h0|ToPaQf{{sC3J>oHipzyJSkAe}2a=j|*;)Y#>vu=Zl(4?ay;{QIs42V8DI_Y~a zMj7~qpYj^t=I|R5(u|n7Vc}hSg@HZtrIUV-YYGMIlU~*XlNIHl0ecT#mwyE74w*dA zmh0Io$fn8PML(VR_%e{lHXwyr0Ju-+gQYj^Q3ahw4-WJ9I-G8|-OQI*03wm3S6LNv zDd?}@j!7++01(&*`?*0_cc*jN`(_inZt(NN)bk%BIs42M_MvgJDVjW9%s)YK*}a)= zPE*x~4(iDV2`r=;5gM#S zK3S*W=!=o6jM2y}-iAea-ETJVK2kP^!aVD5k3Ei8jw1>rIET56 zO;!3wd>Q-L^oYhPta=4HE(ORI*R^NymI$*s#Fke25%tHyeC39}YY{r~G?Ffp?DOGA zI@Qdr(>zA+{+hS8aZWNXwug9AKOr6}{5S8kXjyj}Hw_F}5PJjq;IPqJ9+Y-L&4}dI za!q4Wh24+b%_a>k&mF2k*6sT7))z*Ih8{4WS`USp0EoheAu4#_HvZ1=uL&p;>L`J1 z2Ps-b4E>m~2nSV@cgP*J(&lvMTiM%|^jf?7(iF<~K^(j`ft~oe{Elp=_B+4ES*vbB zmIk(=X}o9R5GCyO^lSEcZOKc%#yh))Yhk9lmWpj9f-Swas=XQLcJpBWy1gNSi0zS& zxh;C@r)XVNYEu5VG+Im+Xaf!uTECv@-GV264C=lZz-Xuku*-CI=|gs4?r)br$aEy= zM$Cei#kL9B-2ly;rX+xIQXj18CsFn0na}j;wk0vi7QCybkQuNFWb4UmKT5NbbNdNV zyJ{Fad~d|6#FQ4oG2Ejh=&1x@8skxwWiplYlZEmqUHp-48ELsF)Z*-7==<9z z@||mu=<%JaxZytlciNh2Ijx4eqsGi(m4EzZt(Tr$q^WPVF7KenA4SoG*p$2g!CjA6 zl4!x-DJ*pyc;4z85LQZjb$;zX0}-s*yo5sadd^zL3;#OUKIwYz$mV%doX9{E>c5*g zUlmOAfSOHOQ*=9mlpANLKd^jzcR^FL_DXb_-s-Wu9q;UTAOG-)^>%8|&F87W*3_;! zL+i9-+2X!E+x*An+61ZHN1yhRK)vLMJ(jPDN&YjI(-6ip>msSJaS`}MOX|)Y?6?)_ z0GOtO4E1fCp;yUTZ^;XP)rG9=Cb)H6%!EQYt;Pn;GL)uiW1oSQKNc%Y{;r`5&M9aJ z86fqm>)F%v@<~Ud2hZo%Y$5}Z@sezTI07bD~+2B6~ctfZY!dFXT`!;ewf-BK?BN=hF9@*%(6hUc>;{?iH#kU0%~V)Z%z^rs zw_YyU0MJ!OTBeB@`F6nC!)ywqrsi6XvQi|TtvJ?M$-X0>#uK&`> z&mpf?>nluA_r7me6Bccs&z4X%0UkJKL|~D_LOCB%T`f*}na{@neWXf#qI?lwA^BPcH7 zYxZcwdSzk-lTXpo=Ia*bQCeXM8s-gVZTo`wm))#wXV@nIv|OG|Sx2vSlH_Y1N=oZi zSi_~#jp)kazP!_HJX;bCap6*hl*1PqLV>*o=W^}@2L#)&H1c>AZQ86#fzJp`Lz&xD zJ=6S@z>#OX58jD(-FBKKs-Y(Ebd&h5V_>)PzLv)XBRhP>P&iNKAEgG64?0M0z8QRBKGSM!ms6|Zq zPZvf0;;UDWsqXwrYFMC-D61kWbKgSv>en?fn$}ggUW_Qiwhw%+AM0r1~e zuV@Nk%!kh;ZjBjrE@svO3KYu@?T-b2td-zn1m+1wQ^M&!w%# zR>PbYY^B%}>b34@bo@cu8$*AcvgsQVSW)lWYqc-JrB=Oam!h1$d30u&i$RF|b#eT4 z6=yZ^Os0uFmrCHiT_rJM1>l*&+GVCTKg}2S<=7Qe%y$E_eo%llDyMkYUE>nO3UrZ0NUpo@n?s_ag-WS8*027 zt*5*qyNS(88Jbh=(vs1C)ThaGv-x&aaZfgsM>1T$?ZD|`);XL#ilosdGVXH{X*eK9 zO+GRBpd7KOn4lPfpp7CT#9>2Q0k{CYuPX|cOv>0|tFC?hE(iLInZB!*r2l~G>@R9e zv^lgkS|+xQ)fGxRKV>^`x4gBT`k;^hj)k@f(cjc7a{VY;E;m@^6>+kw63d9+qpyRL;q(SZjoD!0obD{^w9ch=8-HJ;Q4CT2^A z6#QfUp@nXA#cnr;#bdLL@<4wPNH3;7GiZ>1=muUpmwa*oc9aHPc}kWa|+Qt5;w`injK_))c?d<*IkY>1xCs{HG)0t)M71j5VU zmc>eMD)p3Rcup}|7Ue8L*g5U0KDfDH{e9QJZD>J_nS0uA`Pbh-2(m&!#57oPamkiB zxH`)7EVE0yN^Tq%U!5HX!JDl6)EL9@9+#PmyLtQPo+!rEGSg-^IlUPuQe)!!y;sr; zE1kBvl1Hwq3JTo6bh}dR6xKqlw8JztKL*71)UTNJTVr!8II4HHN}6>A1fb$NVotQt zv#RPj4+GtqIID*$bf#WQIiF~?OF45 zwe@rg8k%HtDFv^VnlayWp?a#K<28D|1NqaAF1#p;<1XUa<43c)$I3#+5)xLt$-ULK z#H*#sa=)ltohE>NZN>_Vdu=UET^(KMW467~0ObI#04yi;etrQoL{_j@DLt(xBCbG&Q=dV4d}PQ=`TR0LXhR(c;xH;$E0jvJZhdntWn)IngO`;-@u(cS>nz zlWfgdLynpIAr5EJgMg9R| zm7He_CXb;fl|+tglar{?1>SFlNj)^4>BdA1Il1;#5&H@H`zar51n~o^t5DzST9op4)P4RqyGHwazd01swMU0==o0m-Y_I)v5a5iD(CZ+JY@ z-FEIV)Z{0?H7RXN5u>b_(Kluu@uo-sXQi)?=e|N95q;LDU{Co^h{!lj5GI6CgKSdz ztA)&&{?E98Ow4<;sW+qSvdks1@Zj%FUSRb!tym60isz<1za#?2`O)aIUU9_k`p{c~A z@6sv~Wc_hy-vOO?N5o69$RWv%Kz8p!ndsh9` zykyE30K;Sh!`xHkHvc1r>YX1&%E{6pLGg2XH|g*{KunyiILSK!o;Tc96|^(goN}YW zS|Nn9N)@F6VqZ~GL_!->;Zw(st&%s`@3<56D3WNio{bXCw^)CM_0!X5V*7|}nDX=G zgC}nt4wkPS=Jws-H)i$)2s!Ne>tkMpEBUya5&zR1=|fFB?hf4j;?YSH_#2;w#Bvt< zYYiHT9<`$@WZ1Gp5BS;8B5n8;9|2oQ=S%q$)O9EHK{CNv+N8`z-Cvq;Cu~>YJccy% zZ(EtK$Mrq$Rq{L=myiUJVYOW);W>G&QS$6NroDUOIaLJLKS0mJS9mS_uzgTud>6#+ zz#Ds;a#04)Iz_lW$gtL5*G;V_OT7JPO_cew^`m2F9Dt})Sh3`7c?s0sJb9z9OJvke zCz43X&s*T+7z~6(_=gA7H`Pz72XfD&s>XS7b&NAUqQ6BdD+TuvV6EWU%9A;t&&uhV z`<^E682o!OdPE>!NgwXIU)Gw_npzmu68Kr0( zZZA_o5`5f7l@ON>SK*gb{=V2)9T5pqH74B4syh>UKU82Q{-=FXDjoP#InB|>Y_u@= zOQEpLek$@2tT#~68k_qbk9N%rSBA!5`&o^!5;N3IS5hRh^POqrCUlO)D)|Q^n;C_-{J7? z=ZR_2=TX`6cZkoSTc=yf9#2xmWBb$3=697yc!p}`ysc*XSmsYt zxQaKaZ>Xs7ZZF_!+c5G^Mr~WN{lK*5*%#DN0OJ<=^p$Gzh7Ty%6KA{vuk3&vs)i zFv!?}p56fDZEA*HeABk_-Kok3{8;?poumAu*^Ie%VKSFJ**V35MQmWLX@vtuV_9Z= zpKS`fF@5a7*0y9s>wUBA`^;nH098Yhj7u9YPxqWVei4-R-s<@Bp?zl!xrBMoOkEI* z_a6&E;q|22Ug?XpoJwmXAtLoe8W!aF~8iZsnitYtoF3xgCP|X5fi&0c(rN-}UyPp#sT4In} z1?O}*@t7`xq_|P)@l!z&;911Ri3C~2XYQY#_+pvZx*q7da}EQ))?O+DT(zp)7Fdq+ zlV#u6i6)-|#KK`{07&Szai$wRzC2NB5yZMj+}kYiYYX+t0-`-I5(Bw<=HpJe*c80j zgd~@aDGL4vsQ7B;&To!H#5WzQ&Fg0f4OHTzq+VW}FlPqxQ^$EDt%$`z#KD2=5>s8A zN0lT1fVKw6>uzm^+KZ}8u8h(qYC@|e2s;r?7632``5J+VNPRMA*Q){W&J5cILM(i# zgywc&H$wHM<2%k<%Lj|cj9BjD#q5^4;$l%Cvj$%2mD%DRFnYDFM}weYLa0; zYJOE#G$7@zsb|uX)gBEH_#+Tl)_e7Saj4whn`{FQ(~#R7Ls>)Mgo!y=W+%xcP99f? zX#i~%aOO{(d_T1F+xXqlJJdpnU^|!M+|34|kM8bO!ySjkkNm5($~U4gZ^aw?XQQ+} zJ|CZFAmfeaErE)Duia3#^_Q6Wy8xnx;zl(^@WzHbzx`JHXoZ4;ZEPaP;kfI#(!y;n z8xhMk4Cl9|6qcD)SG>&gp$BWre$wapBZj9sr$^%K zOwCe9!w_bW)z-NXkB{bI#({CMAqn4UbnBk`;!~X zUc4+@A$B4m=l=s%L8-p{*q|A zMZ8Clu17=M174-!y>CwO28g;ou;L=Q@-8ux89h{v>V3HtwLPqP*!aG6QLDv&TAow5 zNMw24i{m35&-hn+;4K?RyRf#nHaGf~s9do~@{vb_z${2yet$}X#6AVN(=MWxNX)iO z;fus~EQy|Wu=cM@i%+_`dv}iQ^vxzDUnC;0QyVRTP^J#vGq$e;gyBj4aWmH&Urn$SDwtiDtm(}YL@f2m;I>W9dLvU zboIw-?1kKJ?$?w505ikEVIzo#G^!-KUH+;5XG>#0hSKiPX(-^Y@vG|BQE8eHYg?ItS*|XZFbWgE8T9S%Ts7va1;&m{lj^cr)U}zL1})ABF4$R&d#ij=y6rftu5B3n!c%{#dT?JpJ#Z{3P+q^ zWct=MCnVZV*Yba#mwmolcVTd}==;%zyT5r|_Eya1${vfM!0z3r?Q7h0k6tdiPIjcq97a9-5o95CF0d82AFLtz$mMDx$hDIY9{nx`Gy zTCS~etLqk%MQDq+b%JeJ*EJP;p-No|n_fH2N;Od)9qRHo9fOlTNn&#Ej}HTKvm%Hbuk(kfxK#ytvZCq0{X& ztzPSNhBVx4$UJ2K00`o`8|^Df(Wkt%)NZz2#;bXzT+JbT#5zQO5J4Tm^z4KZrL>Vymx)EX0spJeSXr_yW}d51W;jD^AZhdW25R<`jK>l^)QaeXDkc#6{HaplF-VnNWHR5;=O*1zyK z{{VyMr@gVXUM)t+rJ~x)eG>BT<^Ao7ui=plA7qvrkL`QLSJRXcv7;xep2zD)_Fc4^ zoN?G`w=@3$XGgzOh2$KSKQ`0pO8TtU9v%w;yDAi|%3tKH4 zOSngA2zjqrOmc2+sQ#c-N)#5ck8YazFIN8m55uA|uHB^fZ@s%W>DgZQ*T{;}SuKvE zu4&p#4Wv11bxF?g4(^!u9<@Z<>KcEC*5*5)wmN|*(4?Hc-|q^)tl6p5tu!qrEX=!O zo64VbcM^Yib{tiGQ%|@50EC$|{Vvk)3d+Y?ucfVBr{Yn~@m8G?{l$Mvvb1c#Bl>+0*Z%Uf(YZt?loP$dBy0UHF@gr)*HN`c`TdZ=Y3CBpZf*}X<{nS2+rGI_JHkMz8Sc+pG&x~)224IPi`Mp zy0{yp80{CRKi08q{{Xe+lV7@nQH>;3VR+@hGpRi7^{M>umilS&4XfG14Y6wnf-ns2 zpO=5AuIdtTe)H=0OTTsc?)Eur(^HQk^4YhtzR!Df``*?qGwswYwJSS)9y@#GHZjKI z?hc+~uVdb^Et=O$y}#4-Q!VYP?p0f94#tzS`-;`qpt_K115whVxYZ?C?oHLBWgv?k z2pkO6B)WTl5ZK-5I!U+l5G)W(H>|8i2^s5}Ro$eTUz^`Xy#D~NE7cuf{X4Fjt#5v| zy}CBaT3mXx`ZlE+?cMBAEF&q|t#4SN}sio8rL8w^+axM(lH(e!=9;$sS zYet%JlI6cgtY6Qg{W=i2sx>Ie_Ug22POE4BZ(_ZjuiG@+xuw(+FR`d-pplMWKisaP z!2T!u11*~IT@K>ee8^-Nnlf8B3)7!|hOus-)qmkJxzKpCw&hoPua{l=-RXb3)cE&Kcv#*|IJMHxe~GKR-$t(2Lz7JbwGA~cr|}lw5b76C z_IFvyQmRkN0QMisovHY9R@W?J)9<`dq+QEus^J0o1ooXf5J&`rrbd- ziZp5jWixrv(4N~U%^cloaB9_Z?3FC~KQlC7WZRM{|EidWc zUHTokY+I{Wl{T8ydx^CBF3Br(I17ZIPP(4iqygf5Hpa@5JA+=Y@Y7W~{+TX^s412? z5zJ+|^4tPL4^Egqwav%jyB$}_heOkKD6azz#$&&C;a!lAPw+0AGPJQauR0jmA(6%W$4{?MI;AgXHj~r({EuT5iG_G5r1`(D*WB`bZW(mVTh6yWSS)rh?~c4yWw(&m zN^crL2_(6UWxMqJYHd#CuP-E+=LGP5Dl3^Hb%@6gl**Ws9T@tL>s;@B4_=gHpp>_^ zHY&@%=imawFK{;u z{b?;M?k^VMt)nis@foE(0;unwpz*HvNzk3u{CHE%^0M)ZwDA%&2IGCL{<$os{40~@*Qagb_l7S_hqig1Y{?4xM9LiB<<^gveR>~iaR(e6d*h{B)UMX{NKAIn+eHjwDC3VO0CV#(<&H_ldJa2Nv3F^tMz^;s zr?rYpw$6IaWX>$Z!D~EsEfIe&<;-(ES6UhT19mvEVj~| zB$*ub#~ns+ah|w1sAG4EMR=W&*Og^BBj{+bD_Qbe{tuYz%V)H^n%-iDNSLD(V9HOi z9cmgd6>zJ-90A2?Y8rCd+QmF_Nb1E@v#1LDlW=Iya5)4XK@{vhWgA9MR#3NOONiQK z-56}J#&SQ;H0!N}*J~@b+&iM}Rz9G8F`8u*70a#2$j5pyR;`^8SzPVQ0)AcFhjsS# zs`#b}>tURZoKcE(6bxo4#XAO$Xc*3vQ|TzM4WgaJ7!+6r(Ta8{F+f~yD5ao~pptM0 zB$@_EXKOw6nOf9QGFRORVL`pCp$J4Xlp6HX?H1 z9O0Pr)C!kKy0g%2Z(_dF^$E4hfGxx*L|#-)gMi$&=`sPp&JH-qt6H9urcJFyron3- zn{B3BnRSWbm898>W;JFfEI5pMu|AYo^Xk`9smnC^H@fR?x;|~}mA7xMgbR6R7l*Dj z3+)R=g>C~uV2J~7cN{#Wiyx6XXS;FO)kfXntvO>|%dcL<3%Bvv+pysWq_P9gaHI~V zt-*FK?ruCws9Q$1RwZq;`xDG&KtFW|^;91_`k(iz4Ki6QE#>hw^BMICW_7UhMts|k z`Dt*&y2qY7ZXkA`gqlq?*K6+jN6~L5*U>aXsbfIX-$#Q3P@MqOq)tp=;H|2kZVTh9 zVR{NRU-*$}&!iz$znw$sk`A$st85RT;h)v8J5#h#{h4O|Ai4eJz?GuYmQS0_xa#vZ zdWiF%cO%lG&~4%d>sZwk&u3!6%1Cl59d?w35}z z-&)IV-jl>r`HEJuvqeTqq}=G#PWJQL(XQsJcw1gkk)>QX^@)-H0Q43$M)OP5ESGiW zpLqiR0D4Fm56>8?k*W@3!1rE1m0q*eH7h2~o}+sS{{Uuo$K*~ad#1Lmx~KAM^?#8; zSU25Zeup%qWMGWe+3^h52O71OpQ$0?jIao${3SpLKK#;2q(gacCC`WFlI3Dj^I1#) zx`jtp0C6f0?=K^`q|)df*~j>*-g~dVOMKE_FtVO4UfvxyRFz`6j0o&+ve%tpU(MR^Bo9J>8=ay;o=O^yXkD4t10Cqq>@1Q+v z4*}GM1ZRQ|1bbA7=P4vERlyF9rv*sl5%e{&;vlzX-&%nJCZW5}Md=;V{{XB5*|Hpe zylGnKrTeOu=`YXz3fI*>tg~gPc#~9SeKsQUs0%H{y|ilWfq-5@I^Yg+Dm(2bSiD)z zp{d*4PZUitwR`^nI#yK~Y$zmfIqTY>(sOsC>pEctvklCNBJA{V^w?EOR3J_;O6NhoOaV!rT4$fV>;R-l4v3YV@V`b-HsP=13#^7 zU+B7YH&-@;Uxg)w+9z9!IS^zV9!5oFUs|=D&CRbzx0T`q`l}ER=~p%D$h946?)C&^ zj^TuxU#M-Pcj^shtdqLb>6bj_oFvk-+TK>(KQaC%k{PvN_SX?ysJ4L~ScxiKP%C2~ z9@J`M9v|@f`mNJ{D%rqZddF6X_-D+aHq=e%I&?cqgGoh{o55L9$$nlMltq{LP53^sprCqSc#~{z>2TOXfpoiTpFGTd>cO zG#5#qa$|4MkIJRgm9;G**Hei3lUl}>m&2>62N6hpRhJ8&RmCNgen*D&Tc`WCQblD5 zKg7Yj$0PmF2jbOFNxz#*)FZmL3dMd`jmB0~KY18;2lO~Ss$0<~+x27RZOTyHJv{x@ zb^Uepu}dD`pK2?h@e4()M<%~#2!OoaUG=)0`BERbAV1x3Fn`(y*06C|$~Ja4rBm8Q z?OF9*pKt4RsM;xUMk*|7B_=6xMk-nz#?s=K6jHG6Hi~s6LqIT!Db!-6pgOD()Dgyc z7^xtdTXro3j~ftFl{h3G)iw3P+%j!4FkQ!VnA~?9c?bqN zRoy!MtbE;&#V+!WJj~%;2`Jok!8yU>AbM1~v9v7;*$8mEve2mju13Jw>iEeg-xX5U zC7S9OUPXyykx`^>iV4PP*o&%=yq1Jqo=GfEB%Y?NeWE|?{{XXnj^EABe$~&J_p^^o zV~_s;T|ZZX8*9%h+&YgfOUCXUqjQ|8VZk`TUsbPG^{C34hp2U-}<-o%1Q$|t1v|@0b(<>6UoQ7TDPmkXAS1fJ@>>AZa!x5yC?1aBoU%UFseKLeQ2>)mDPl}zm|PE*2t<43- z2}wm+F2B=cIEU={FDKeJaJxp$zPam~O`o|EZ%mfP%>3V6dQ+Jr5Gw~`DPkEm@CRd_ z{{Tu?grpJ3S$}z)DC!5TI~9L2Hb+?1*bt0J2iCg}3;0u0)O7nzO5RI$wDU4xS$4@F z&ph-8(>2a%pr)r}XS9;`HE`c%UQCPJ04t-_FT6RbT`EUqb)eoEl>>vdBV6*uM*!De z8kAqXFUN1t;KtOer8;ZX+V)VUAN^{%r|H_FXxA5s z;sldXF&l+}X2^JlQpeV<*=n9D(xH&~%jLsvw=AM?!((*g)|9DMlI3@6_1n4XQm;~* zY84}c%MZ4V;1>)N#HbvhagW9$9eI!7_#@k1=*Jg~1nQjtopDO}9 zv!3~`!0Y;m`$*Mv{XRo)63Hu)6@oWTR~4jFLx)Se+ZWkJ1Is0yz&n?&RGzhT`KfBt zzkA->8P>l#L% z7N2(^TTAdRRwQ8C^U$Aq^gFK$_+s(m^0l3>a07uNXOsQn3FfI!@a!9)EOmQ1r;Uci z^S)q5BLLPlCCuA*{DOq*fw%uON?&k%nU4y6D*vqD+r1pUClWruJJvR!s zseQXj@cbHd-(!;2_ZMo>;hlYn?Oj%_;4ctrI+xn@1~)9st1HG-ouiHbK9!e!;7wKy zWQ{7u=4)ke(S4x^-Hvd5s&3nqliyF5T@HxiD76(PmA&V^ujJm^l=PcOuTxFYthL5i z^)g!SA1{dHA9Q=?71dp9!$!A)?PGiU*dT2`Qb3zlFsJ1wj1GS=Y6OQ-^0hmyQqtQ@ zTd=Z0b(s+8L0>#Ehg)zVkfMQ*WIWj#rCc=W9|N4|j;8;29xmLZ*i`=fVZ%|7(&^7yg~ zd7nDu1!9Y7QMUt*dR1LhNWZhxEUfOPStgkf!opq3fw~O#sBU!o+g)_&=1uy5kVYCg zGnPFt)yGlEyR`R9r>{@E^=YU{T{!Bb_V3qyyZ0^FuD>UUFJZE2j;$bdxeCK`e|tTu zt*kn%x*hskd524Z!`&bwXl}%cMzhqdHO8@DH8oBCQCQ#RW<9gtG`6~4sWzc;rQ1a} z+JGi#17q&>&#gkc)86X8uh;L?x5}3_<7-9ymtFS$Uc~p~TKfi#d3sr`zU_e|9*3qs z#;#2I++H|YFRWs@)>wu%%%H2~c;Io;vSHJ&uC$w*N#BI9Nypyr=!5I0HwWFn+do7=@N2lMn<&}4I`JS5Yw9?&H z%kg7uQpDUPwv(<+XBEYv7qVOoDPjBr+N#}6b3TJ-dnT-pC8VB3y{hpfYCni$wOTS= zNucSPgXy+Ur|HxAM2v2ovz$2UMOkmO*|gfekp-p4_Jl9z+eZ%JW~cd9_EJyuzscLz z`tO%FEU&x2TW+tTcGBza*w4DPvp074>i4>yo&vt1F479Q>bt6Mu-nILJ=$qaEvBZ% z9Wa@4@i0Hc1zokZOS=i7(d4?ag&|2Mw3rqblLO8@t3t*NO7`mGRkhOQx7MR7*08}I zZO{RRC4Fj?DXm?#*YMWQ`s!soLyEQb(^qcRy{xz0tEClYR9y^P-OMc7Z8q;lwp)vq zbLJz>+Zf}TrEwRCN!0ZD?4q9L^#$$2g$(MwcLUnGyDbA>IwZEXmN$uYs7b$4mPE?P zGyFN}#zl2{kA|%ET~gwGMlbBq_H}|O(&b`e2T;Ht@&yyAO4hxXm&>F6zGobxu7UxlrcX z3tiv5jD0;T)b0Ko=pmCDxO*vnRE-?DGJYIWTSM@^haPU=)TW)EY)-KGc_XmSYm(}2 z&hG17{{4=XnbEzety8*IU3cqy_h|Er%^j_$(^hNiueKkO=?b0JtDeWd6{%yOU8CGS zm8)F_w3{|5u;xtlY<4x;$>QG&MP{-=rYzc@oFfrTT1S(ddje}aSoo83U~lY&l)81$ zBg%?2SiG_R)&@>~wX3MpZ7VM~{#X9I>_V@Js+1I6{TF`CEj72Nnbr7i%f!|*#r?B? z4aS)qe>>c$h_-p^c_dd$b!Dd^mhKx!?ye>S0uVC5botx2&{u|D_@>8D)U$OyqAd-- z%*D4kn;-fPYp?JRi{L&RYpquLNSjUl%fZI|Jd*6>hhz1x5%F9anzVOXjMnbA07$D0 zfv^v#9X^%c>)spi)sCSH>%Jwta_r6_mTa6hPhpTN3hsXdYkFd&QNEpj3~oZe2@FRH z3Gbc{=Uq{u3Df0*yL)KY{1^EAu6E_MJ(QJLrzH1k8ZGwMZ@$L?8_92yxWtKq2*@Iv z97xbe#y}l0gg?YT#+toBVVoXEtx99_ry|)74`2*DFQatM01vA$3K~+^U1Ro%!*ZCdbf4;6paj#MFqeiL$UJ6Z%5=Pj__9OM8#5=tflDGB!d5|j;8Q9Dbz}z!{ z!#Nop`R1%?@Y>5W{l4X`p;+0&B5!A4K2=fbPp$?5=B#Mn*~a2j)psmS5fQqQHb3Ft z9Xn^OXDPx0_y-)(V%z3!D(lbugc;g5U>^L{%_iwAwFI6;B|@^~Dzhd=1E_8Z9dLL& z(rMGfYkM5`Hlpq{$?{pYhB)IsqdiA)nyh&|05W(3wt4~lsg6sY@M}U#!xY!kHJm0m zWRRGm>QocJ{{ZWL6v^P0-e-p5CyHb^WO0Hhjz@xYmNH|SCl03^t0~Ci*p8KBQoU>Y zgq5O>5Rr)0BP4(UC%-*d{RRN(KrUp`TYq2I^{Co}?WX;Oghnrv7uoy5s!J*s{^%r; z$9!iM6@`t)p>&qkk(niPf#^GAp2Ilg@y#K&m|88#iN(7~;+oX zwEK-ZSmL`-lQM5Hlk-Q(8(4Ncepoc@UoyIjdXQSd=gqLm9BKh(XKkYcuRgfxOqEq- zaTAw}F$&~kaO`o~n~DxVIONe`rLFEJD66-Y$rMWQ?%R-|*yKtI=Wz7rj8!@;5t5R+ z7v&M)0$BAYx6+tKX=!M%(A-gqb7QwY^psd*aYiZBQDKZCj8mw^78SjK(eC8cb(sf>zaM0p(dfH+1=gh%Ky9f$7?_0l<9eA3DR3%$CP8D__>O|e{0*cMo@6%J%43?;2u!RM^ zlwb4C1^d77Bg-FlG-&#q`a@iOmK#Y@;x8gt?qTy4lR4XrjB*F$D_dKZ-1ug}=F+sw zO-lYlJWXiAPGW9FA0k*Ux7#Clb2KGOTd-XTal-S_wNGs`m$gyo&_=m0n#zzRG|s6}(An4peJ zYYQ0u&1-Kc+VRAs{LDJ;W0pSW+K`kSzi{<$S$b`6M{6(cr`EPnC+E%h6;DF z9OQx8smV5jJjNUSI{QSr=uN8`QGT$=h6CAJm94Q-s~X=FIivD=ceeKJYu|DsuC2lU z0EwoLrCtNo(jT)+_&j+2MuBah-tldHccn~vCHjeB&!?K4sP|>3PvP6cZudG|kZTrb zGSb+R&lvvzZX@%r{zBb5Ym4Cd9 zIAQK83wdR>xQgQ1SBByy4;-j)$iuibp{456SlhLnk)`gJA>Ac}f_w za$M=rBwETTlIF%G!rXz&O91TM+CRm8D+&o-DI%WQR*qQMNffAgRtF%Dp{GM5$0So* z$kEFi2_u#^!z&Ji5zyA&q!U`xX4WB&IJFCQ15<_}wOld6+^Y7;;lSV$4;i3K_bo;1 z7pJF}quF`s=`HS8mSw~pcu<&Y`6y?;X_;R{74 zr%r#-%Eo57abYEnk!_~WaX7R|mD+fGwi};vjtK`G@+t+@ZjwDQEaZ~XYczP0SY#^C zz4vqYoO)HUX`^ZmW7F>@({D%oyJ~DawmyPj2GjodA6lh(qUv_{Ut_t`Zv^f>R9K7e z9;#O%hqxxQcikJ)bgZF0)!)6ox4Z1tuWO@Y#4ti^XFBEXn{VPfX24rQ8LoNdB~=?$ z$7daS5#E_Sv>qa3tI2r6^D&L1qx)90bNG_lXs$I+>|Hr9qGNus zMDNg|c}zmgMBdnaM1ByC0d4udu1Cbd-A)zSS=Voo6vC zZ0!+|?ih6{gPnuB{sShh8(lv{Z0bHvr>U*A0<(MFop8LOqen>h@9BN~?S&B(_Cn&%V{pfSnEC)Tf6Y1i6^I(?1R(*FQ@7@3#z0~Kcb zK-Fw4TJHMIpoLjcx4Q3A-*+krARJ>RlTED_g+@@PHl;Pp?b&*1{e9L;Clt7)qOv+} zHx!ts=hli$E;AIEr;+JKJ!(gCJW+~vD8(SS+)`qnicD0rJDr3UQ`|!&u*bSM@*M61 z7#Tf%stR^J`0GV>Sn)N!q_J9DO$3ue1hPXP-;q};oM)5Uj%plw)T=bB8%B~k#@XC~ zunuqzez+f%M~W;8{YeG1t7&ALiHuAl-#B;-eByG7#836q$*p%ec=0rmUaxh1=OFhi9 ztTE3sI>ftUQhw zV~l4b7#!o1-j#w)=sQ^ci@H4w;0|S%E>D2Y9H4B(-Qqe8#{FQ<&hd9fg{NURMR1yAhMmZ1=`#tgt+A2qTqb3;X7G1Uq`D>?x#Y9$Q7)*8DW;MB)~L z6^a%~lpiue`49A7*r&7*3nZ)e;)N4$FM03tXO1${65CE?zH~^E)-x% zb|)*2g0pTR^2oym$jQLz?McGM)axni$uuoi>qOM!z0>v^g#`d*+zxogE7Rf9wX4MY zcZoEuH&JsA)PR2N*C#nS7|-&>a$gVabT!o4ZxLJ@Tc{Z%wT^7YkKcArUTfI(i`kb+ z-4*4m5vVS*%mG1>*F0x6*+I^omACJI(^Ka2tXhqA2uI%jYdw6EO*?mM(C76B@b`i) zp}K1U0^A@TY!Q}FNARCR&*NNwh+*JL>M$5vzPaW9y*X{I8<4XmdU%#HkKALoNwS{>E&mrtqP*y%QQ z7pf#hW4C#aji`TxjdR{9({3K?Rln9Q zh-+p;gh8HjP7Q3|SH7Q#GsD5Q)H)?~XV1DOXs9Q=HN=(Hz#9`hPIp|FNIzCEk6GM>*jLD4Nf}ECH^O`PKnue z_1CG=YJMiV)5VwDw0#zDwZy_@B>&vSTTsJ5ef z?z-yN&!CVJM6D_JaZeEM95N2LVT-T_kI3VW})hHl9ZqL2;dPRNv{z&RAHH{ZX)UJ{Z2UCvv zL}=zlkTVc^E{n99Bxn;te}ev(@)W_T529f>VcS zbH_@C(e-;c^<5?_GSW;pT_KBepd9Dgj#qnY*ZTgy4Z&gH{pRnt+U)H9OQ)Wi8%M-` z6A;B3cw6UF^D&&{io0*(F9^P?98h?0n>H8>H#CK@&@O#zkhr;)Zx7nQEF(*6X%24{ z4qTt%V^;Oq^%T6*H8--0O=A+ZyFf4)FY*0qV-&sT<OR6@VCx>+FN05|8xCK@=^>9ryO!4i+I?%FRCd12;UnSBAl|0_VliIk?5zTKV zulB1exvxxtWqGDeq{-ipO10vlGwaaLsoq;o_Yub=l39!dUrc{^3em*Qvz zbfnUf_@lPEHTeEp9b)*$UyH=&OKEI$=@vqT*%M@cQUy}8@n4Dc4MOtT+gFY=0y~#7 zY)1?I->+)sJdF}h5HxRlb^VTc`$HyVCmx?#uWzMGcW06Y5?D~IS<si-&_N{TJ zTEROJZ4(n4?8g59P+PrbB-6(O#F9#o%gZ1nE92MJrnuCu?sVI2K52JaTN2SG2g*-g zYc({LuG6>m{dW9%mKq9IP>%hzT7EC?(9$~PwdTJK-R-=V_6ndp7Lpa@54=6|TDnh* zuONd|y^~jw?pFzEZ*ab0Do-U(Kylu={XA_pXT7cegTn_0y;2)A~j=Ftq0cr%mnT_Iqp9_wCf|wS?7l zbkg-*HqO@fPqzkeQGCM_u;jTMk~5!brw@rdJFHl~q2k*!ajrs0MT;x;kbdrQz{g6b z;Cr)e8(Zo6xwgB$pUC?x$(Xhg_sKo`Q~X;Ftz{;qYpG~7Mzn ziN1Bt<-cuT;r@SfI3q$Tudu1{Eu@=_n!da5yS<*irWTAG~bx`vSU_xBDbf@f@O zi1x)hOxA6zhqwozIpE`{`c;i%RK3=94Jhh%49^@31ZjdAaoM@` zr^|1tc$dU*>6hxZ*Ko(=#Tih$LX3qz{`H=zxk1_OwY=T*R{Re^Yfty+78U6zxv`09(*n)9ii>v$%$2X&76kb}#o^ z<@>|(J*&;MH`VU7&$K<;NhXv$##v|CltcGa*ROm&)OEiQT51~G>b7yD%2v+8On&Pb zA2I4rx1}ntmK@g8ZG5bj*ZbN$3|15B^5$wXO4@7NM78X%cWdf-2Z)Y|scG-2>9HL; z_)D^T1NU>?m(!lr&4cCabaEfB92Kua*St*7YHerZFAM3?+%GQB60Sk$!1t~O?VxM9 z8qrxG-I&#mNEzu^Vq+I+E&BfepZp)p`YgUvaOIR;w@&Ix-ILw?$fF3`%&f!ZC3cME zyHt4m>ceiix%m(Wkno`Knrg^I4+smj*fBWyxac$KT(&&~#GA@t5P>8IU=nUQ-2L!9 zI#Syh?XO}tcI_;2I5Jz3P_Q4ueJM;*!yFeMbUPM}f#)iE`uJPHzWn@z2K?4Kv@8~=BrdixQwahm#Y%)gM(|QJ6`-8!$ zbon za!pQ}Y_F!9)p+)e#6`~Xic~XtU>01CxH;)Yqo>^IvPB)@2<4J7Ce6UIgV~2;-{?W8 z{{YwgIa?mI5tbz6mN_KyNv#bp zPCARq1o6Nl*fQ!{b31KC=Ow>NZ}v`+5Bz=jqST-6*;&hR{{WACqLCc*rT+jgB`-_=0PTqp zokv3>AMlFCLFyY+pP$mBD|h0r6Gnr}hI_|Y)F{Mu(JJGQMMMPt9`!kc!wJ_>*Jk&Q z&M3$JJmk|`RME8S8|buV)Ee^gFS9iFrX}*BCoT{n`^*4bo`WfY5iiDib@$k8n1SuJ$p-gL@-TZ^N_ zvV8_NFS4InJSl#fZlNXD*e@>SFf>p#sVeY03>g&dBXAi5(>bjxJucX?8-E1r_bQ|i zlFcU8$76`bN38;!l^LkGzF4g_TE6b>Y`*s2k)I!jkJ)V9^=k_~O6Dt}m~& zJLzS(lgyMl2-J=~L6R`LKvC!gZt6BVjs4`8cb*8-mS+GHKC83<000H^000000+G); z^xI0SjMlwlqtis&T5slHcwSL(+LERE!Qx#(yqkNAklR=}{pQ&KJ0)^n&@`znnOzb+N;0L@w+3y_ zNjwU8&(s{{Vy0-?@*b-*|e

)!( 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

WR&k&B0XZ0klvz@Er|JJ^p50 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

Ue3Hvtotcc;g+m0 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�$byM8y=SY9X$HFCP7*mW?Y+F?e4&?u`W(iWq zSymD8DBApzmv=Gj?gDovACgisVoa)QwA$ij_On^0R-&i^pbhQO`YqyRqovQczNS6Y z6GK=+c0C+=2Nlv_<3o0UC~}@q?9fwEjdHHogeu3L0aB+am5{xF54aJ|&GNYy1;=@p zD49ryr1ZEo6!lRm^}?0NeczO<#@T?cYTSd&Rd#g6msg!8lzvINzA4K?RU4y&V65Xl zMsLD^|Gk1ehgIw2{j_;2XM2Uos{x08rIclu%rG3I*A1GiJ|e?##M^sRnt0jci68{H z!2Tf!)aht(*_1gWwd5F}+r#E2cJ|Qk%PNfYCyb}q*q|?b7C-(8CSxlG3(41TZ{Ctt z@S*@Sx?NgZMXzUf90Azf#Ydi_-}(k&O3!>8-}x4a42}uk??eFDyo>9XX*8ugCy_;l zuv~;pBr>e6(`XM_2UjoQU{4y$qiH(9$|`;Nm*}IPz@6JTIF!NBJ6&9Q8!x|#8<)}T zA=A+nVCxv7>J zSd%uj6J?aOcrrq(Yu=SCm|9(2d>m`1`Rqm7-9k|imH9zLn9p$P9L`+C&3BQ{B=csSiJ+~*X>UZ@8quH>8e)=o zBRVK#sX`07CvK6Rm1vHWJzQR#Xmz2=G{gvuoWfQhJd zi~$Jc0jMB5$RlF?&jvC(26=^%qLAItE2HT&>Fo-qB%KJ%l88bZ+j4JLswYV} zPpYMi$9p_ADQmX^YWc=6dR5gaHtbv>v-Rz&sNR#s@Ii@q@1(>Pb@*Fe? zz<5FrUZf8_MDJZjw_B==7B&Gg!P~p^$V1sL{UtseVRO?*pF&_bM9%d2Ph&X3&aMt8 zFPmSQ%-_F>yr8u;Dhj_-2yirZfEn!$+8xtc-20lcyvJhff_J1WRnq|_&7cG5xVx4GK~{+fliMeeu{tgZCrc;8|UcyTj=!l zSQ83#2H*law+)9CoMAr4WQe?cIhCvL+qmnr&)rf)A z?VA0<*;Y)6Q0l204omJtspU4^s79(tnx>qJY{(l+Z8azEMYASsK7&!K<4RBMBrJ58 z_gQe6WO+HcL3>2JK1_)NpBAM{Wi(g~yo}S4xzk7@<{JYgTg{Eat|v}yLDU}cjUgZb z^++CtRL&>>mODEGUI0Q?4URd+L{^a=ph(rxnDO>~fQST8K0RlaGv4uy342TdVtGTD zi*l29L4P2KiO|GUEya7(K}GWwUo#B1Q=K`a`Jsp=pyjW9vCP~6uSd4DMG`CN<2#x! zrX;8qSQi&!qam;EWxFweOFgn-E8^s}SF&F1K|>6xc+-+3O6c{FuH zZW9=o&GEqf`1nWA@6*jY0Q5T>Qm!2w(lbxdQ;*^1E&A*y@z%R27@4JAPG=Yl=qq19 zyDdKc9N)Z&!=Y{aq&&xTD*oZ$V+Q~DWjb>P1(e^gAP|X+<~eO`(|ksQL4E&rIv9_! zvx|1yf1EgT0C|2lp06Z~)f4LWVhu|!QyeXLch1!jKZRs8g47!R?&;k;Tp8sYwn z^p!91?K?CYQL9Y^Vy0G``h6vyh{}IvGh~8(^EbJ_M(@6bejm)pT4=YiwF5!&P*uqY z5i{-WVmd{qD>-a;vAsn_0Y1dr?_y`u3JsaqlJ|D7w~tK7cPd~2Z!RVh)MX$ zJ}~HC!4T`c3kyp$ln*IDt?IKxjkoo?pC}R1#Umm;T65sq;Xow)T_gLDl_u?5qVua^ znnx;P?(R9J+-pAYntnjQZ>FSV}3XiB@tj>d}efyo4GjMk=6e zqET*EBn|BePVF@;v5qLopzIX;nFDcZx<{?-fSyia{#u9$Wn~utGYU0)zHf|AS^374 z^$P2{va*L8lKRr*l~c)F@&!;Ll23#DkR;QKz;u&= zEs0=Z^i+T#$)MphmaJNuY%oVl{*Fe>tj^;`gaINYn zzIvTD*66Eq>!yiXXpR?Chf5f)b=eS?Lx+ zf903Z>EgyMSk5-4QIn~}`A{zM+VF4Vn{J19ck%YSD01ArgQ76aA%Q%{);5sgaEM-C z_H};+tE=dC!G(e;0D&fB2onGCe?nOsfA*(XTeEw`M>-7b@6liV9s1Pg_+S2W9`qqd zz8aBb6ndpkC-~SW=)s5S`qk3s8{HmuxAFFCxOxNcU&Y#n#Nv7Z+B*+3<}*C@G=287 zI6TCbby%zr$mh6u6~hB?;UikvR|bZf^XBy9Y>{C;$LIhrLD0SsqapH{6ZxK*Cu8x{ z$LZr=#;Y$O&y~hV()e)kFq=Q&`e%Y76 zRUF2J1LQ(16KB*{I|?OVLai8W4r&Q=G6LV22r+SVLp!A`7Gw@LB{uoxOLDM%W3&l5 z;;`Ww+O07)8i7-!7P13ScwGRHkev{|X%M!nfZFmvQ23&d8({kAQvy@@WImOY%q^9u z7#(Z9MCh0oPxU-A`D~}dm{Uz;v8b=<&TJx(%1SMa4hN&VSRkm~%qum=f|f0pQahQq zdBT1cRQVx+c|olVtqk+r>M?>I+B`?UPZ!P>H*Vqd2D%;W>;}heGKlEHdFpo1@A1|5 zX*NUFG6SK9qu0g$LGkiy)b60&Vs&h{{PcT#^#*l1Xt#^+d>^fhvrOLwfNq;_-9@V< zo_H+(SAUGnEer-$M+>ytG@kLdUlRQu?d)TB7wvWlYMFr96ss%Z8^6JK?$WRR67Fu| z+I4gd>?0v)K1a8!+#zBf-lYCzrnNO}-sKjeRXe2y%mFMWxgeS#i*7}u^z zCcXKhx21j`w{K%}2ldcUEbeE!K@?U*ve!{{q`;V%5UNm zpT=Mf4?T(>y+kXkGX6=4zq?LA8#S8N;u;Te-^29Ve+!$}=~KUeYnNzvNUb&zQI^qs zPIqsS$ReI6&eR12p~wMNp5+84%x7qK=`&xW&wmXE2e@?|J!7Y**@T|{1g2yD>35vh zt4g!?J3ql>h~B^n4h*2(Lq12Iqt%r!?2x?x^&W4JsaiCsfae5@R#ju6mugKei|fc! zFQwHd^OlCfXGS$EUfeAQFSX)s=eW0})!!K$?h~-IpEsqO9-OXYg4>E3c?S2Uj# za8HS(^z^ok2bw){50qEIOq{mG>R2Fj49X+MV;=4Cj<6`3gD`a57`9*fEb)K{nT!RE z(M^We4-I_T%lks1_7bv}YMBpb!!9!pR+1ATP@uH4w}Z(=1HlxhyKX%6Y=D@d#c^_H2O?G&Wiw%4aPIrAGvXAR z7wB}P4H$&!Tm?gvr2$|*$LS69x)_e=%qeW|qKv-caXXu1IHU{b_`PemyM@6ZfP=E{ zP!!Z^p(WGR)k!RT~pZB0WH`Rr|PpPu;${mx&*c#l5zJiqu|FjMAsTAo|O%2;2=&tAscZ}Pcw zY>Y01EaSaB-ri+F=qops{tDl@$*;dER@VgySD?s8Ym(n0$6$q89f%3`hj{O8Xn%1c zEBFZjAZuZCh~W_95%L^^0k}YxVLU{U)1ZZe30=K}`5f90N}j-~m$4vHtJ&wQ=(@Ze1l?DJnNPBDA}z_w+21 z&VWiN`3u8^P~nN?TaDl28fyDMJcVHXp$B#jlyKn54 zMX6-WATFn|m8EP3qZv)r!YzA@DJDYId`b47VKKb#jHb%Lazgq;A0ZMTc*MGKZpjS||6=>W9O{APDX;yu*Uh_1Ol9NhzutbNb>8$taS|XLVNF6gu z6tv4WK}N|EK@f#+C3!oxSDal6sU(QbUaUYx(d!bjb4_OFOr<0bO(8pgQV(M1WnL5Q zF;>8W?65r3g?@DFy~!Ctfq`R;#f^8x6sc*CwGpy(XOGQ*2s5nC;dUlXL13=o01 z)f%sOfwf`;^{cTJ*(&8uqCmyGO@noRV%qBwP?b5Nt&CDnYTsTJ?>$q`?clOW=ZM1+Op3E>BQNN!&tLQjVGs4nIS;Lk> zKikw*uZ9K?8IQ&oj&T14 zY;L31l?R%}DyKYWBKr8p=;As4!B27RI#yP6W+uXXjy#7DNg`_ecr>C%K17c{%&)%1 zw{KCe7v?Nm3L!8a71Ig2eLmc$(`U-_t$1sT&YZ=@23@|4)ip}@APgcCoq}w zTQB40`{?yR0{IO4ySVrec6U(}==Lj!fCP#h2m9RXq0^P#_QL}_`~*G!IgBU#-m7@` zb@W#NfD25g^r^4n>^hH`zxPcV50xtmg9PR?%xA8XgW{o4=_^knn_bmkg4WM z%_1rOc(LUkuQFbZ|C3c_(i}MVo1M)h>#VN5rl2K6)#L`CPv~q|7Ku?267Ps!C9?}k?>fhvZIJBp1m%$a}u3VZuW1xbhlRvYIfolVZ_R`$CiqKZ{MQnq2$>0o@9tA7<#P;HaQ*^r-NIy4J|y9tZTjRF z@QE*A_kFtfbn##PXYx3wQinO*!$Tj!&NgOKbO&H{WUNbFpT?;UVQMss8XN_h&Qfwh zqO3Gxd?|A4Ar-?pdDPy0LduXv5G|+UJXI?U9g-gkXliK3peO^$!>R>X@f?yxX|u{`u;vx3 zGPH+Ah~NneqnU4vX!sH;NXBTlui2qv!ZOCA9bnSVFhZktTQ0|$taNAhptGb>hu%n^ zrUa-1Xk=TwY!MYgx{N!~+_hs*8nsh048Npn`woVD#D`B=Rmx{U5%&>_`@?9K(tVYx zQM2RLQtn^n^WoCSLsr&fNA2Yp=ua8KqGH_1`Uvm4msA18x^+k1F2|7sx*Zu`JX&v2 z$iN`OA%FvDyVQMqObBUI%XBBGf6MAx8Elg#~4)FAo^jCik^BJ8wjqm@6vdp-ev|8BS!ElW61erj)1qKEKtgWEi@pp6r@9ohq zd<7!IkAF%lgX9zA@+H^d2wPit^G)2jL#~3Sci|>Drih^uEqVO@b|vMyW7-Ke*8k9+sDBHh|uZEjoF?*=ApQd z5=>p;23jzQjAm1sO{v|na+kxMVKT;KM9kFg!puklWtdOV>VO2MW3)PeJi^S{NC@o? z<}=GJ$CZSXC0C!WD&lJiO-FaMD<90q@)oE{<~<@yFgcxPHNE`4kU)$IsOF_DnV=+O zVkfZ})qF=k!L4$=Q=(9$~`GzXpfoM@QI@Kgmy#QLap? zc>tAQQDl_oq-TrAl_2Cf4u>d;h(mdb_gF9ZJQ(qsVK&EP1^}7XMO7Xm0K9*Y{qAqj z#yY?BBf4-_okdS-BLTMe=$F5eef?`-=F8=~o4Pi_!4R!1`-9&W7w_ZC*W?1y8Cosg z+M#)lR*T1z($7clE3%JgbILLjS*f{FyCcKMQ2Bx~m_Xew-@J{xTSVah&%cz9DWLj$ zIK+paq+j?VefVi??O=Bwt+q4P_Ewa&0OD6)!?o*ZwH!T12<+_e&K|Wgc}!Ja;Puz= z_9a}qinUcEkA)xrH*X=&X>A=vLERqi+{TqFD02R{e}efOs-vR20Uz$;W6#rX{~mw$ zFQ{}|CxI-(l}q^9o0v_ovZmt1MrR>oHp2rCV|5J&dnWJ{5k^CL_62O+!KHW5AC#&B z_4>GR4L|w`?QhZQDQA*^tW#RONme5*%~Z)UKHR5+J@f}gbP!=Y#Of(rd=$5@lOW16 zW8a-laNi^Jk3H3;lYR?wJ&p++$v743gkx5DE><2|4mPle%EO-~(3o0{lmXQ=T6bnPvV{T=-LfvXLKSI1$Oo@pP{D?Hp(&_>|;9jUn-bP=-FrK)6Zcz z#{L1a3ASz?Rlq+g@NH2U|eD16K z!|zJJ7XX6L>EPNW+`gfr{(}H8(CK1jrHlmcY4hn>XC;wgHpT7^Mu%v3&}y3@AYeM8 zN1mdmKaTA?n9n6pp3Sg!nx6S2^;dD`KHRwh%A~@^1v)+P?5FY0D>!?RdMntvsod*{ z#zT7eDQ>m!#t-PRk76{$eCk*(N?-r=vzSdV+$YK$W|<)bvJBk;%_mgk>J{R0P6JsR zLVy90p-}H4>klP94FrP3;A)LWJ63H*s$UgdyVK=&b#N_F<;Stw=1M zLbHNjfsqE@U8nXWe^%4NEH;9#;65Zpia>1Nlgg(xGu#o1F(R`lP!!f~eh4+{&Jg%| z2rT!HRHN+1)j}Yjli1CYf*rq@?5dg&bUU=n;Q8e^7vqg`Nm*U0&G(cD?(WPMt6ini3Dj<8=Na>^$pZC!c(62^2 z{X{O#{yWdH#0UDb!7$~2kMg>&e3F`X5E{u1r(mA=}ly#+cQ zdiF`&-Qug)`QU7__g+}h+zS7|UX?b|yPPd(Q9U;I66Zu2{r zsoQZTp&-6-hh{TcTPAkG@rws z$+H~&6`VdxZ@gAMCzOHDMT_=#X*!{9ug>q*2Bzu?0Fhxj!PXu0`sV%J=>&sS`us1@ zGoQru%a}~mV-0{A(=k2&MSAYj{F85k3#mvHIl6s%%`1=u9=YVSqsB`T04b}GgK6GxJyM|dPd2_IStmZx`De_A*7rn6T1l@!s+`k zKA_P7vJT7wB`~Ai1~aB3v^yXnLlxDgvN)QcAN4JfN^aEN6v_lpaKj!e%}wRU<;loB zn7?|%i0LRXDJz9lLYFW?-V*ppmcq_eViSI5yI10!@6{4i=eN%uClBOM@WpPEy@w=f zk0KwJzAfWjBHnL;cD;l`{bmls_V}{*2(bqKP)`g3>ajZE_HdAl zZ%l+>NYgg4yAzM<@w#eS`evj?ONKaCkihFzt!0Z(TbgKZBS$3KLOF_wWrI|+%u-H^ z<4EKDKyA&+8P@a=tMAHP+aXb5iINRqMyG@6l(Nhc-qw(DfqqXs@hE-dX@2_>=D80> z+bs-7c=rkp4&$LD0Wj0)4gTIw@ZJ@iJA=_i+lPJ-` zc*1XALY5WZdI?2AeH$zi3BuM6wcEu{U*ng4L}xafCJMoKHpM4CN)KM-KYJ1VzL`=* z!Q+Ye+rLYvPT@zdV13PbDbpGnCPJ@=>o@p^uh891oHA7qGwmJF-}-%e@P7L8mw0mv z@4kzE;z&^;P~;d5as3AW^kq6YK)WUDDCgQ_0s>ksfFW9(7kKMkl*h-Gub}udMs@IL zM1z&=KmAW|`5NAQ6N7;QK%m)-m?_JwIj&rH%2f>@FL*SjZ~PwadjQ{m2`ejd>a^Q9 z*vI8}05BKUI%Tw4$Xb=2HtPJQtu27np-yUsj)%DL5PkJmaQBu85V>=gKKF}w_zAv# zl|K0ey#8Z(RsaMFU^b`czkutP@$&bvc1pIU)yD1?4)^F|pW{0>aOF*aWFYyHrMoxi z)OpM%xbg;ddIp+j875=e-@?iUHg8~jh*pOI(ynn?3*#a7Hj%aMrK+JYF=#qMK3B$g zy>dVVDhjmPXm!CrF*p1)Nz#}Q3ZLkwDj5W?GP-{qQm#Nrj;c+*iYxt>JjomXz&=(( z^B3ZMcgyhgm5Sta7CHPy8ss#guHlH}Gnf&vcOXg;SMd_0nN2}yO7b727UBep@m3pKVIK)i07`6Cy8L}_-nrT^1 zl@xlE$*nPVS@)m9vAT%>^HHX#0LfUn%CtK1OR4EzPAcsG{!>@ z(1#!AmtVv7F0w3=QwZMLp$G1xCm-V81L|kpN_jc@sR* z-c1FjQ_N=Q_aVqJ@iL>;!qzq)j;PzgxzlB^0jn%wI^%YWbU(1VpBI=+==Xk&zW$er z|IL4n8@I8#VoEXN?iPfAAe=b`X4VgHtrz==nGX)dZ+#so(CYF_KfsM!==bGNwp!TR zyicBKI-l|O4hlxMgVU!mpR0xxXtl7?$Nr%@brs0k*xJTuj0^V}zKKv27>&`& z%;8E!!IQE0#_!<0_lobmMC-Qwh3%)M41y4R=Qd|8oIlUAIRF$)cW%?)|3~N#@L&Gt zR;U@GBIo%W?N0qnEOK!9oLE{2AfKbZg89s;S7aFOfy-w*Ewno_LM7Cu zIXXa*W3cYO)?D`FY>cdptj%nq+E|^JUOr`$RWzDFbTSCY+Q{eNA{v}mx@|Gc8cFU1 zRT!^%lFO2npC%TQXG_MGaXGL%w{hL3-s9lGp}_ht!Rl*@6lqYij^C&EeqD%zs$CWu zP%o!SGGlE#7QpF1Yr30psg4v`5=e$Xu_)Iyr+FZk3Yt}uA?#Hyy_92hmBAdN)3K@w zj>V|43o4DdPz9{ckN0z`I##76BDX=g1KeeeKA4SQzCuIXBpR!XXA(_|p>~%m9hEQ| zqn$V+MjhS6R(<>{s)kf^N|nG4&0gk@3#lkpE=PwzVQ5H~F}G|4VY_roYO#Tc_NqMU z*R3E)KVU9-FIK<)OW{R$4|5vuV7(TtWLYz1BcU@al!A9a63Ueu+4rdj{vv zU_9k-y@-zEW8?3^heMn@gFBnZ1Xfqe(2&GL!y%seFrIu2fApsWV(Dn)DjsEkvC#pBP|J zks~kgwO_>MCcgU}Uf+p@4%Xtkwki%SI9&N42S4+(CK3H4o;U3Rlv7y z&|mvQeCQFpdkuGQ^7sB68>c0a{XP2pS8)C!|BL??tLw5WM23SswA=LTbNtR*m`r38 z8aXZg#2KSTM!lStw*SA1UBUH=ZNou^r8a*<8 zR?6fNNmy(w&QJnIvkQNt_$q+Eep3{nUE*YBDukaaKz5;fnPYTJ zgFNC;>PaO^j-mEyLpuQ!%@c?0>WQ%>`x^}5vUt7XR5!W#h7IOm(}joEZFw5ke;OL@ zU554CB!-O@Y&lL=epp(f3*V)aoC)@9VRxGXlQTD(;o;c~-7e0Z0Rg-F*gq(vgWHdo z(d}Swj}H$qnb2qq%m3SwfdU02CbOA{_Dw`UuswEck65e4H*O=#=)QB9&HZL&g12@s zo6*_R5JCzh%~qE2%{$HQd9qJ~|2^GzKIk-s>iRw2-R1B87~MAY`w>HLnUR27x9RtOhaSF={s&rHmrS(UeCIZbf>&3$ zC?xO=CtH?bJm$?U8uYMnx(sSe!x1h%gim~$wl{fi7q7mIZVv=n-M~9;h)wZZI`ZLee7CHB) z>^ieml}#u}X_(4t8$*`m6@{)y+X%uTa8_WV4J8#D!F&5@ie``}KAH$N=pYsP`aC z;4dIOsFK@+Yo-Me)pT+h^)eAR#?M>gd*l616}~z)p+wKPo?7Z66tZTL!a~UFHYbVL z@Oq8wORSkB5UZB@4#6>}$C_3-pU4T~TJW*z0#a`T3-yIOHrzGo$m_%?Y9QgTB~hj& z{q4;kM0nsnzI6v+I(r&-wqj?d0<9J?uz!eFW-le(80)j3n$s!~-ZphR=%_a-O;0fI z?q}clIy$Z5C$G}E(*`t`{BQ4y-}`m(wJ-3We_v}9a@d%$f0+H@Z`0$C@?U(PPH#B- zf4ha9U1S2Q1MD4O&~u`~6Tpn=41^K_QkG$L1({$QwX|C}IK=gvxOJER#UD|@GJGU} zS&mH5=RQTB`WQ}a;N2_ebcjHi4pC{1c(0E;clqU4d1r@*BRvEp1ZHz=?;_99@5(M8 z4Dia&@aEfeYTX=MTGHIv1xPx^%;$9W3|3ds>)`#Hxc)wR11SmxS#KVL08FQN`e|Ia z51V(5YkRwmYgh5^+dP}HQ0G~cPDkywl3PNr5oZohrx>h=U;HYqoWhk$==T8T`5gT| zef$MFyGl=d6yN_YL>(CH$4>@EblUHKYxxM*WZ zZxhx+Gt0Kxppd?0NHm}QR9m4!CROsiNmXRtQiz3(u?0@DszAgEO_OYb)lXpTQPL96 zyoA)CEiO9?n^Qa!%Xogov0=uSViwHYCVAtOSG6L3?y5u zK4iX>N2(6`%mwGnA}eJs%TM{hL|}atSw^Q%@zyTSW_IWphg&LrNc>KSeoPXAm~s0q zTCMT~BCnmivq#T8)B5{=z~B2ZkEhge)rLH$OwiZ9kp0bX@OxMI>ig(*O+74Qn2Nvk z4YXSPo$u3%b@*r*rv1VDvw!f1*xcfuy-EGPVe()|A9_f9;Zx%CFQC`qSKgqNf$ZHZ z!@&^a2|aW_4i4oo>TRtY$uiVZY1w`49lZJ$I&G{BG)ve!z=xj{fA{z4p^M1c{HHI{ z`l_T+_R01xCR6lPT*z*R-?>D4`?R_$pEwY>4BqnD=h5xs_NI)(!$7OFC`++QM3m>~ zwCR~AF`Z*LlCC&!zJ)8-@w3-)={;#mFD0=*Ucl}y{qiq~-~V0ym;Xxk06^U?Zr;F+ z_i25d^jZnG!d46W`*bj($(XvmGCn%rz9oL`x5OttiH)-utl?)bW3Y;Dm+#!h&FeUS zmS6lfc6X@MbBY4}0VX3{yMb<3zt(K+?-i5H|5}lhQAV$%;Gj zC`*+{kxrIOY-(QfYpPA;F-`E|lBkiiG@w|i%G&jarDuDjsL81(pXmX41{ztM>ckd5 zUg4F6sVxZ+ifS4YlCbi>?###c0#`4rmP;3}A zgWSIn|ajqC)1pb4?y`yOoiN&+N;d;SB~5<1dIcW72DN;?By%S5wRYdK>i+Jo+R5yT}dU?PT_t+ zNoqg5(=*Ah%j$6JmpXS=n;LXKSb|Gk1i(zI19aNdX=5H9+(;loo?|u_XHN6h4sY+E zTb@{{Y$^mMX7Zek*q6=BC<-fbtCi++wAEICCd(>&^yZrub@dv*}&pm^J`Q~kY`!cNz%C6(_n9iRSzw~ACktgZdCyQ_YkosM< zKM^rwa|cC%$pnKQz*y;HZB+(d)U&JG!R|ip+`*L_{ICCvdOZ`HvH&Ji@yX}t+-cn1 zA{AYS%sacXSNZmB@pu0wed$y5!t=#@SNQ!~=ys`Wnit=5p5t&V{EN3Sm<@CZUCu)V|khnP-CMwI~pIM@erT)9T`8AJ;pFwp6tH;~e&G_H#b zlL_WI+8wz7c6Y@mUJzgTEcG{d^DdZ42x@n*w~K=*R@=C97w=!A{(t})tYB}CzxzEL z>|%YL)$TFyy4;p{#&A1JOgf^Sk5ra7_NR5ymD!eI7x=@j;h=eO?L9a~W_-kDDCJ1J?2 zx8=B=&;bKYYBwZY5U;*O3dQ@_9Tp9$u@3s-tohGdn%J5Oxpi)v~2pV==X4WQBwDI*8#w_P8)g#05{)T+#}B zW73cv@aM6z!crNdT?TwqC!-Rbn4ulYF~;?ciRX;8g(ZLSIFB|>5(FrlZ>=khgt<+9 zV^CUWg}1IM#6guc!fmJ_C7;r0`71RQBHP9+r1Ic4M9B`)7X{dw++~NjJjYgenbo%b zaL`=EhlSLGK1n+r`dvp(Zlztyr7qmPG!S>;M`kSwD$m!vc?V}t6N9F+@+475-^nse zr^W3}%x2W>dViaVQd z!?)Aw3a-4*FTX~kF>cy+ZCt&9_pb2!H+eosD=Vi53F5;M0TS!CT68$X&K|~N zdjA%6J95^Pk;Qdl#&}Af{|tTN8Js?YJ9lIZy3$wYrSH?q0A)l-2Pj+fEzjxv1?qHZ zGM21v?}#sanLhD?_}Itz&Ru@zE$R=@?PBvTu3y2GtGM(Yoj$EzaAaz=Xl<3cy;6nq z(4?NjQed*VD95gq(RhTdE%f{9z)=E#JjeP5iUQ+9rGEl~=x`s;JckD!!Mksv*H_IU zfG{4>g^Tp$v$VH^+0=B@WQ>(H`uJzDeHWtxbo+8}%LzZ9Vs!(PF%>!K(I?0mGM!*L zL94B)89h6-RoVS(CP08P$=HUf#BPIHERx|3ecO`MsXDZuLwnau&&Lr^!Fjl>9U#K%#0MTLX7n^6If1Otu(Z>&1&yG^r<8Sk?m za{`IBln_BE8@bM$kYzD3A#JmDkiA5Ya;=wTwAXYh6=jBozA@#&i<*T> z$pr*b1J-zXfWXjUfRz)A=0Tu*wNv_ysVzj8QS!>c>tw{bem)TlanQ_C}k6!4f?o#i{HD#H*OW*e34GAn@&9((jyPF{{G*f`!Aqi{)->bs&cStW!T)tgZI(H z7jf&Zd~UEZz}kuoFKA?IK`R67?&0M(`0Y!8ddQGvm`rhZ8;3(8qLmfub@9$6e&-6m zeTj&u*C)L(WEsw%;n@sDE-$UE;`O)i#@i|cJ^%s<%5$3Ml$DA{!NZ~W-EYuGpP*-- z;~)PN`}-35ciI@NC|$Qi&H{Ok!g>b6jGbNj)n5@`{R;odpQ6_zB3fPHH{ZbiA+B7) zn{Oh^D9fl|Djm@0bJD>m%{vBWM^Q`2_;Jd2unCm4v9*Of$6!?k^#@@*#)bRolP_R* zm&Rimiygpx1`_n^zk}frH{X}~;lVzhd5%8wMKIz1i@5wYT5U6X@)=gv@XLP{x8A2a zH>uMF2nC~Hdf|(pjLzSO{as9~S|(#$c!(Z(icX!w?iTVHgfPfqHo=(-xc?FCZ6lvU zSW~^+`)4yMaw0+DAqH^rlIa^)bdcJ?szk6>_UrapC79)QP^!CugjZG+8)JB{28Dvk zEL3)N5O%7D7AtYqbOlawl_3}AyQRZqe6xewLBo>>zPbvl`Het)tbA3~CL3Fpc%OQl zhj25Bb_3a6A7irOBH3SUv!*KGKTL?xQQu@LUk$1-haoYhHj!voMCp+Kx~+`s&N0)w zb{;d;S=TEnf+=V?)YqF~cW?2Sv4=vuCS|m;?n8Fh&>pLWl%YMrK#a{w-~BJG9Jln;c)3WpW^UK-pn9Y)Jw21}as)PfC`Gq9d17l_*`V;=VC3 z6V9%HWC``NYQIQA_A0y%?XY7lEM{piXYIwV3A07PGqIax5I3>QM*6E)DG2I)o4_l* z%x1sb$*^n*X7Pbw`Qp1!(RiZ6a(Xd4P^8}ozAeA}6v%{pPgDo(_Bvh=rZf3mYwsYj zg@mabER|CbrgNT5F`p5`KZXU{sLY`yL z*R9jpxM1pZFc`$Q^yr5K&2xe}Fv!}*Aq1u~K0G9m88k2Zl4v&P!y$D$C>X7b)>hH$ zmQga)5DEQZJ+}fm5>(;(S)NW(%fNyQ$+KuA>`)_Hbk1UgecY6z8{fzkfFVLqy zhLr(-`vf{2>pf%{dOi7|U^Ky*Q}or()AP>)!27q* z%Fyjlze|I@6I^^Y$Kg=?@BcBKJ;Q(WXV_SSAQT1qJ@orz!jlum6Am=JqtijJ%bQ!Ys?J)POlf0-E?nRr{{)!;31osqhBsg5 zx8J5thsrk@%C00LAkoKgQ-A>UQP0j}Ga{Xa0Y*{dd%D$#oxy{eE@Mx%o>k=YFqqPG~e5 zjYcD*5eR@Fm;jQZD9WNlQj+DF5yzG$SQFM7kH=n`nMK)_Jf0wHESaXLAth!4AR6dK z=hxjY=ltbxb2#U0|4~&ZpZk3cYRaSQ z9}hi+o0l=@U_!@@X4rVJ z3m_q=fYiQI=82VKp8bz`g~ZP7@s z_zK9)l29P7Y>r}qFq(Xk zFCf8Gvkj?+0@HO7t>GQjnoFh$qd|%idRcq{=TvqwhW2C+jD~Z%zzi7G7@eWM*gNIX zt_#Y0w5O_z2tlTG%MI;1y^b4`Ok9>STZ(mO&*J`k&cq2zQ&i?n6rm{QD70{NdqX>+ zZwyheT6^k=*be~N6P(g8VwDP`-wZuTm;EF(N8*a!j2C;PVlvEUwI3~B*Y$~&ph_b3 zh}4W|QYtC&KIy;?V@fx|OU}8-GEAf-oK~h8UmXI6V$5eLyz&$ezZFnj^L;ib>j&aW_jW$=V#@WH!&Q=VO5giA~nWMyRtCy zhDdTpKs3Vc^jNDR|2PhoSD_t&Mq^am*azQrxUt2#89sC`w%YK6)F~R@$KGAoy?|Sb zXf;zdc-KX*kM&JftE{*XL9Lqd>d|Q(7mkwC7v$U(&NLG)=|r!u9=sR(_sES!xp0+h z8_>jS^z1mi?*zsZ490*$rNTx7%?2DNIx--u8|tG^^C!N@<44dR$*b>hcBXjHIgWID ztT*7gID3J$Y9vx^t`?1w#uKU4)L;H4o_-j6_TuDeRI9Aj*z3#5(^y?MGK{M51HcC0 z8V)f(r+(@ieBfTTTDWitRSzWUH7qX5d#6#U8Mh@(f1}A}6UvDW(ObS!{h6Lee}drv zb?tT!+1gUiKF5!Lm~Ioxi+Y+Mz|okMiu#pblk3-T<`h~j-IruC;o+l%!fQW3r4sEs zQ3MOSuyh;e&$8Yy;;7WQcpKd|AAbTrd=<-!@QkcTigK{ACbzC(GPZZG>ZL`1r8|7& zDG3EnQp4;5uARsJBT$s?7Nd;g5q2LyrH1x8 z=5}M$kM7TkRgSu*&<3)lvr++ zwV^VXER{8~bYwmf-C$(tn?gw*%A1*B>Z&F=qa@|?ZvnyY6vR*Cqoj`5lTc!_7NfbO zJbM}Cx%UMu6z0uJBk@Tu{Mo5*OmdKC0zSfo#xy0R4edbw zZr(DF_JneYQcfA|B%NgX>7gD|#U>y-V^VXOnO&b0OJ11T>oKu(3hePky*7sI0JaMn zQ#gj17@Mg99DA`FESqLU<2tR@$1Oh&Cznr_QjvmIYd7Qg!y@ZX}S*>7Y4UQwH&dcp3&d-&{Nlxo=MT~un zeN-woIIsPX;s;omcuxB>{0f`m<-If9wJYw9 zuFL)a%WG^k;5rCHDB{q5R$PvJoH~bU6#{54^LjmQ563~Li`f|rh8T>{sKfW+I5=>C zhxgL0g>SscdOhxt{sfBI1G4c)K{>Lqh4n2uPJA@h4>0lhwXbp49yxW2^*TvxZt@eK zz=;!l_z`q_IDZxmYu;|Pu(X8tP8yeS-D&G}+`2Aj-e;|zvYJ(ESiFsk=ee+8yE6en zvxSWfyz+f)tZ`;8>SO@vdFXY}-bB5b>bG7M;~}nGz^$v8j8SXEzj_sHZJ^&JfSZ@i z2?srSC=cBZd><0K zk%my2jj5!nwMh{*Y7q2*K!&tuC37$#T|g0CQ&?jbhZYp3|5s>++a9|c;2xv)GF(pe zK}~%{v0377R!D8m&`v;sq4i2vRvOw_I?Hz2B2GIdBhZ;iS+4esnOvtV4ZT?o*_m^U z$@YS*Ov5Xtp0}PWZtCc;x{pyrm=ErGV<9>4xSjA zCmi{Z!0~Y<#p*9NV3gHjp*=vOG8+)lq?ZvY3=yUeMM@(vb;e3O2Jf*9nfutXO*v7A z$*0V9gD`}nQ1RgV@ckdrny$;yk;1jlLuRHB0m*~=xG+!8mD3j>FwVYF`)V`Z%|(PE zo6S^^_36*VN27*{Crhib8%FeOwAI7+IluAO={oYxX?UK2J|z4=s-E*VexAOMYDL~X z3*Xmx8UVJseC$E>%;U1UF6SXE?&AWWR>RdB2tqhYE?i~37OT}DfbXkse33Iv z`Od3sns6%+U@%lqKBQj!2u~ahFJ7feEQA1A-N06du7g??u8ZLiB%2L}Vyq?FYy7}o zZfwfg%ecJ^&ow0|h4n4WwJ;pR4^Xcn3~})qZY`o-him6k-SsXmZ z@raAdY&OvEzSX+TxfpYZz zpvmZY=(VxFg3cy@l%3vjG3Wxs{v+sj(cU!ntYoF6+O;2(A$lF1m+41OEO0B4Gi6p$ zkSH*FnU0)lajP67_%jv0?%;`3B8s)~_65X>w4mH_#TflIBo&X&- z=VJGmvL)k=525NrMV4%8XYulpl*?k>V*nu)B(i_&QJr-Y$vL%~Qj=d11M5<8C+}2} zl1@@Mv=Wegsylm`OM3J&3SN%%8x$MbQP6NoNMnpP1JR1Es5=xjRw-nMaaB(*6cQ@d z#F;c8E9nvwd9mkwb)wZs5o-zVnDAnU^@?%Qdo(eh(I~O;&J$JvYR8@gOg98gv7<9l zyj39akA?0r+df1XA_xug{?VS%7`x{9)T0=U(H{T_Vl;)0!eoNcmBJ9T)!plu3Wr^*WTscy$BHtonWIbubq_hSGjLb zk}5W8T;GzHU&pmua1!PQ-xt97^N7Yw9ixWq1dr3~7t`ZaY6AiVD$R9tkr zPzqrvqmlZ#Z}Q=Lx&Ki3-YM#iO0rtTojY>wEMcO>oAt?=Q#f^&BpVGzCs~z)W(&%R z{gI+MINHUH?ypQd$&sJ>rBIW_-7W_iqwl65t(^cm@S?K;>5=QWAi*N%G}ptRi}nVF zebY~}REJP5Mgs(a`87I!4+VhAq3aQPqpX~flDVdk=Lko{tg_^Z5+nn86;~g1&Wwn* zCCQ{u);g7uyt0kwlqjHZvgoN93kWD9F8~axhJZL!;rZytV+v9gs zMXs-iZIpZg`C8HyW(bZRTNX(`i2X;?>}8AjU~BFVdZ!Xl1lROPl_(^B!d@E!+=)kf z;TWG{XeWTQ*UgkrkC`{tFf`o}rI6F20+YTmVmtZ{^Xl$Gu?x%T8a7krRM8OtbL-W_ z)m@BSVhJ+2H)8S>IvbVSg{&1R^{?2{5|Fug7?_H6CS>K*F%oI4AVh%41PgPh*VR48!V6b%YY};ea-}dFq1VSu6P3y|gSw>thfriNbiVu< zdHYm&>KyMn0^d(07Lah1^NT+P(*H015qHlaxerD{1f8A?N8G;$0wjY>D$42xh9l0; zVzy;mO%fSps}0X%vxzXsYnJ4Tl>C%JuMbC|RiK7!zxS1y0X<_vyR>K2to`7xc4|oId>WLx+zT&eu$-2%(XB#gNYA7hC}tl!?M-I z)$6F$iW_UI!%shtg&DcEDrYZZJVCXB)pedYCKVS~Z=%^`7#4OeGmtu+cuybGVa|5o6nOOvWQ4QI~qOjzi@Pfn% z!#se3In=z4^g;HC21~(RVfO!eWa){pUr$mhtVJ! z*F|*|JT_I5jI3a2reRxPZVoIUS#pdN=1Mq}A+DlK372scc?%T|rjktQhj|)HA4&YH z|0?c=`SwqqL7SC zKP;Qv_12m0wNtuTqS3|HUVzbGTPz>CZ?ER(yP&og_FXL7&tXe?q zKU#{~KadHK1|nq(F%YE~bt3?s~6}QC%;&UvLtDaPAN&MyGyPk zmE(1!_=>s6LH5!|KuHu3^OpUi{E6G*FAC7prT(a;O?-GB{2=xuNj^I4j2~cr7UMC3 zP%L2H(c?Jib}{y`YaT(6{k1>9zCF%2f1D?d2LJe<$y@JZeh#p>Pjl4kqf&wIqh3ue zD(oM$H+|Y4BK<5mI<2PYRQXtZ$-T!|Y6oRDF22-DRWBMjb(z?9vDVfX4d1 zwjqNN_AH=UiAxy!m~HaDF8`a41M0$Nx zt7z5{gy;{jZ?`P3(^1-0Mg$o9IIxFD4#?UjuG~b$1Awg#0L;zA%nwIsHq3V-m9 zynDt3z!8zfRn9i!C5@K$?IkoD*gcPlFN-Vc7k^TH{6n(Z34il{kgX1CHINt#5r$~g zZ51Sec9*WJ9qR$0)5VjI;+ZGqpZ^Xf)=8<|;m4jstuBB1XPBJ@0N26BCWd2Ft8BGW zA#u`=i0rV}2?P@#O4(D+_94;kz;n@v_jUw87^2gbdXv@MnsYRSSD|)vktw$TZUcBq zr{-)SNmD{0thZQrdVvychZfQ~MN!xV%MJ)Os~RaRFO7V~-u%3iLSx{aplI4t2$gpF zY!6kFPT$*;u?-e4DkR^We_;@ho#6O9!5@GE0xSlInw@+B+ranC7_kd4N$dP=`h8(3 zQ%B!6WyXlSxa|tja1lDsqAxp;qjE~SR~dO>CXtRo$yj?#1N76eyF-1vCi8qykM?3i zyNQHVEKijKV3Kfy)?gZu*NQ%zIwjyErl597ye*>LN&3ncqxParGXvRkPCMz0D0E4W zO0`w0w3R)IUtS#fJx2}!l@Lg|?O%6qRe;)=N9~sQL|IA4!^GihVJt?y=wh0Ys47nL zBuZ?j#(BjaH(^1iNpME9#xS;eTBnMFJCzD*&24UOyYeZ0(%aH;Fu1}3bKBTDi{0NO zF$uVPf&2G>3jKb;CYV6qONzlzi#O@)n0^X+qV#&|?z?zszr1(GL^@ACjsqb4qwjL2 ziEbZD%cy#>Z1f+M3W5Nx%j8w5NrA_^?F2~IVSmU@kF^>c71OH7(U`L>1R>g8H0tr( zrigAIj&eTv974gyR=kE$O4=P(D}4G9=?`Qu6vqZVRSFYd`XlP&zW{1g&NS&bdgqop z`bxEe;Yi-UAWN%kHsH8+!A#Vva_u&|ee?!cTs7ArDaFwUj-wvB2fmN~zyt;A4Oyw6 z;u(!2f~^jJ^;_!8pWwm0@~5wupg^^1c1uJc?XLRepW@t%{PD}2o6$|rSsU&~6XW|J z_|sp8QgZb+t2MToIC%zFZprH>v9`g6KBY>yPAVvnF5$>QAu$@6aXK1d&n|xX^YYqT z?Dpt+B++ch>9e?U6?^vRSTP6%)he0|R4eI4a2gMi3_}D$N5$I7b07Q%}Jo6+*XVL*KqdF2AqBw#1W80l-ZHX(@2gzBi_)|0^B_GjzNa@`> zxdIa!V;bdoVyvnySss+KP%6DNv4x5(MXo&zFx~MdS5d0$!qh)n#+;POl5E>g^1?~x z-oCv`R)%1&lW z%NWD;3Mvj>le%E5P!Hr``d{=RnF8E)jA~0(tT1TPny1W@-lm)Q+&zzaRc_qj;r$#8 z=?4+bNqq^}7&TMLOxI2dFdD0meOP_*Q)t$4@mk^{WCDb8FbUYGhp)Ve<#jB~$2XoP z>v9y7)o}!<071J85fctPdRzxft2l9lk31lEmYHmVFqHmK{leGPH@+xupF*c+&^CaP zk9uAG#7pX#$9Vi``0ZEOsGBo0!x87_oUeS=`NT)mk%Pe>z08@GCPPLeD98DYzlNg+ z<(0QtwO95K2m-Xbm}zn}GMBuznyA-6A{2A`CJCij@xt%Fg|!XrnnM^8gdfPnSHJ%A z>a)-DzT@&|uhMhrD7p?@2fcyx2dvjX(s8h~D(9}?2XAvQqUVw{$A~xD)}N;erKps= z^0r*M#!4mbK1!j}HCq`XKqzaQ>TmxN_wSY8`xDO3f(o9CTTAHn5uFUy!**pIfU&Pj zD68x4Z~VG??7`r-{|)r=%=6go?p{guOZ#d;?aaKOpdj{tg4%7$%&)04 z{hgVfnHx_fr6LMjHw8?Vyp-IVD0+n9*U}<69uw52i%$Y~ez0qmbj4XVm^g%5)K&7< zR(rFO-M?Vk(5`Vav&qxE6+%y7TENF-=opls_QIhofKcU~c2dvO8&63K&~=B<4Hh?G z6gQ?|aAv9z5K4q5LS&AlWY5o#6zLsgMtBLE@QYr%)8SeN`r} zWPi$XWe6gLDxPLdJ*kUD6TBBl^@Bc1%$-)3NzHDy#Kej>N)JSdZI;pykOTlfz}$=| z7xfy$5F2f{PFyLiQ7wHZ6l~uD2*<^6giaq`B@S_&_;6-M-aCuYnD^a{*WcBb`^4PA z4)tae`nIE73E2-7{0Rm_e)w?&0k%5u5}`{r+kE;_KJ_S{e;Ok4_9?a+G0)X17FT%p zQLJzB<{f(}58wxwX{irADz_HpwUb!eLbYP(pG>%WL4D{^+_)XS@jf;?s8(a~`aTaI z;PJ!Z>nAl32cQ=}{KCi8S3ifN2jsi2vsI7VR$ojz8lk571!pwxVce&b!(DT7;|@-q z$I2!=SEEdhCOmP3^Rrl9N3Dvghg(ZHbrHP*W}8OMj3=C*;fEjR19t<&(mFgBu7^$^ zy#cCKyLkkJA@02ku7`F{8};c`t#t{U69qa+Biwn0TWZelqc8{+i&RIF|w@KLWB<|jTH4fWK+*lc5K3ynG?#KtDS z^hNdTkL9D#g$cl`HSl5CwSrnmX@)+gi1w*10Focg+1!w`_P(|AH2eu82}W4 zi2BfzxPAlY&Y?MD=$ZJKnc-uP>d;zDk1002R}kJKGVXA~YV8 zg1#D+S>~XkrJuB&+Z{_?YHC2SAV6d>otYYTZul!H&=M295JGZCc9=|&D9HkMt)q87 zKB?uAq3?snjbXxwtB))=_PQby0&<6jcKbD1c9~3tY1l1sNf~<61)8_h??9afQlk{M zCq}+87IU*SXiR<_YTp=9`YNVm$oaIsEB1|v#%GFivpW&hCHAUSTF4^l<$<9hj>wP(W0luGr^`r~=yxGNE6zFNil zrkuMhXD`XcYuvkw5}MxUIwa-f8Tr9mtX1K;CQg*^!}HXaKFNv~zI%?>ZyVQeP&z&C z-{bzDegi9Oa_S-*b<^mMgW*V)*VwG1;(?U6PlfND$BjkK&ql<^W=B2!i1T-USzdhy ztDE#(R6NW?YaReVe~5j1_>Ir=$p>+B5oa!;)qnt=3)fA$4$JC>^H+aLec^@hxBiHY z8c0+;tZtaNK;~epf+Chy0ian&7$OX1ZA1Noe}@P5g}?JhT$m%lnU=hNR^C5{-MivL z1|%vKiJeIl0IY3*G}q9EAxS>_IA&&X{ib$alEo$Ub3dg%@-%ku!^Q^IH&F2~9OBqf z-g6Hhd00-L=T;kD1+}`|xQWgH5Zt)MZXce<<_xY}m0pjNp}g@HLAWkJz3qT==Wy#5 zYgIF7NVqP7K+c}Q>Iy2gxR)!^t6*zg-hUUa7vBINLf_|;AHq9t%IWtwKWE1T(d*;L zQGDhLc>i52EwWZKdbQi(!%txUA?)6Z@dR6&aJ?9q5O5T|iVO#Iv$v9^$B9{}YyF%U z&*h)UnlM#MrS;F0WCe?h@~RV#h109gXn_Q-n4T+3R-_1bv~>7Ddb^NE*cP-F#%Xn? za~Z;uT$j<8t5LV>_AQpv_^BUvhz<*CFDJebzL$|0&3$<=m9oAgKPkl+!yNO z6!9tWU=Vx~*G93h3QJ7Vnq?%bBK5<@#9mw%P;HP^=rRVMU!{v2vrQQBm{l#XtFW0<5O&tm~< zCxy;bclK#N#wim0FZKeDJ5vEMnHSp7E(}SerIg!hkqlML$t}rXdf5;+kfcZj0FhWm zISEoJTFC(&pbkiiE~LL=bb`l`W-`drk~7mB1?mzL;yx60Wl6bCbPY) zC7V5INRS{vv(C9$8IQAecSgySP_WfOrwiAGqmWiVns;S3%M_uaKL|x3gOGc6sr!!e zk^94U&w|FICgFTXI1Z`w(bBSQ?3gV5|G^N7&NsiN?m31Vx8VnHl;L1B!oJw&lHZvbfCo*%;BnhU2eRP^~~hJIh#y=Fu4A31^!2Y#$JY zIu1I9V}v1RnsFEz{WuDa16S##g<+uLVmy|2&xUWkFYlhk-rdpFQFL6iyV$#c!ALG# zXWiI$(Hr9EA?Kx!%hlT$PoNysYi!g}uSM2b0<2YV^_HxxquXPr2hSx*&qZ&5jSj{> zs#P=^vbHJbuFBhIaOx7~XH90;!FYnTP1LGzmF|{ua}n(>);7(l9}!eMRJ@dZUBJ&g z4@b$;Dk~lw2O)U%7H-@|Z(!VwLSeniYLyb2Uak~_fTJ-z*9@dEgzNCZ`v9WXgHl-E zz!Q)1TVLmiyWqMwc?!)YsW2R4qIhVpT)%~tRa7ge*KzJVhC`e_gPS)|s{%x&f^H9& zF5}cW^!sQw&55jL11qcH$x{?TvlVaS=-naThgX4!9o&Rc=yU+44reO|2yyWO0KLr6 z!xGAYTg4l%Vr7-H^N}$C1VZ8b0y=GZ{S_U1UJIGS0q%Q9I-6Kq<)csH^t-7rK1yM8 z9rr$nV<&L^3S5^+Xa*7@7{#|5Ta+?I`Q!%Kj`dZva!zZ2>?hXF<+wA+f<+0;>6QXD zn4keu$tdOk@w}10OciD<{M&irVxws<144_cN)r>kod(|}kv@~1aeGYTYdg7ZkKi$- zghYoB6#KrHRUOZ*ISHgWN_|UFVte;ah)?uN-B&U-0-#vqwC1AJx2L3WlNBbHMjzbt zo_w#{S49Ik)7&Mc6&yTGQ^JVOxDOL>IJ0Z#_@*RfxuKoqzA;3?OGKq0dlrx8W3)3t z3)5w@AOwmf-kS4uO$EZtc1?*6_o%#MellArPPOIOp(`=Gj@{Xd$7I1c(U_GY_BQb} z4=KviR3%0ck;y1F^t$~{yAu+EX)C*JP}|KiN@%{O9Ag}X!9WH>sZ}M8rbE-i2vw`$#vNR~&WVq;4Y;l~K9R|er=mrO zeW?`uKvvh#AFy6GH`M4S6pY5|XTJ&oKm3H;T;$Cq)~cpZ*G0R>;Rrz({@$OdYL%X6 zIiU&WeeE`=*lZyPLG7y$8lPq%lrqBdTy(m!yv|m`goSaGrWSsHb{DRT(FFA>NYH@* zu7~w4Ong(aiNIHD`!8en zy!`%m_3>iXYq)p?x0kUiI+Fl1yF^_u2+?eyTE%EWM-hMovc9SQ)4z+|yTaf5W6aOe z^U&#HX#*_}>up}S#zviu2Cm(}?L|3r9=8@TGYbKzP_5z8Roq!ZYsO53BIeSiiie~( zya+sxt(JKiYd?YGWJ1lD0jERJ+o2eb%vwE_-i#5TQcZ+du!FWz!R9*7pT*pKDlAK- zg4;KE{B9mQE*H*VYttUCAOH*p*ng1sJ%p7dtgRqkg%VJh_^4EI;4nucO!TqWXo90Y zV34zml}{D%tk1aBk}O0sdB&(1;q&-?N~5y)u}FZ{GMzAxrK!vkkSMa0nbJ>OW135& zQVVlg`AnN=x242t?Fhspo)M?yO3a>xTo;y*AwH6Hw(ZL6EhK8^X83$oMhZS@^x8IK zQV41G8A()s%e7DH`?ftM#W)LdB_*Sc)A1FV`6i&5UGlu->a{~40i33YqKx^a{yCC(7wa<%-Ol$+yfkRPx8%FUbJy2Jle7WYWiditBkaeo|je z;wdU5<&v(0dgX}AWf#Euf|T)yRL9Lfg4oI)4QmY_p<0O?R zQBabiA=;j?J0VddM<#@x9|%*1A|q-F#5;W%Zf)B}e2jNfq5_j^)2X^JH7d5L(fqx$ z2|}fZcwyAm^7;f}$Yui*AHJ`zUrv!?>5jZ{GCf8H1KxL>je7XnNow0IU?d~@`eWXIocEtVs}cUe_t5F1Vo$jC2YmEC?wSuzU&Lm|1ZN}>ifnAs z^Ds9PM>xr7e5KIsWA{9&6|8Q+bpU}MO4Z}N$FXlWZr+ji&au_h5=cr}RyNcZKBhkV zQMrC6{Fi@%E$xMG84(f9*I%)S4{BB1xDC&>eMFF4$N4_iw-5xFn?b7qKah5p_uS?D`+p<&KmTK#yM);p0BCpk znU7;M4!`#*XJ?=khGTTQXg1;doM}lA=ZQ|T9l|)cd?bOk$ z?-GtWno<~#;QN@FMX!rm%?=X*z|jatk7M^eHFit!o#R10mXKf?RAHA+@&0y@u^??gXMmgJ-;*@a3 zOlrn9vg3?8-wva~XG+M?usyp|Qe*vdLzs0;Scpy8W>Z05U1A6+JcOF4lu43fPV=Z;knxRCwt=(}H0jH3 zg`VjL+~L8~oZ?j%C7RpHLi=a_Qs{z^; zcO7*5==2bVa2(_FK!T8sE%n4h?%(}u*w~b-H(Bvw{zqdr8_qBPH2MR1{iJG{1BmGL zapa)$SAGhOhMd1Dmu|3Wf{Mucrt^zmSI<2m>znfS8B-k~x0lryKJNU|H~857a_)*; zx=w91_X8PE+`sWn-hCwe;k&F=P3?|CD6+Nz<>-^C^gL{KFdV_e$sxu*8#VQ%Pw=68 zD)eb~3rz?<*k))M#ZMko-#aimrU39llekqQNb za^Sd$+tKwPWwK*42+;4-^XND_NEIE2zK_iTTE^c!%eu zyS-Jpglt&F7whf>?N%ZzG&>hcZ%SQp6GR=s^rdOcCOeqz3=w%#OoxDlZiOH0KxR|B zcU~T;T*WWrA85BAk{toaxcF>UGc^J@U}>o&lh(Zrw4JQcO)dDn<0zFbpLy8%Nq zlqXU#USOeHhT;!sXct0}kMG(5Em7kZd+^ z+&bBU^I?`!4qJuiq*~V zk6xCuSJ-MAK?yJ(^MMmQv_E|9UAp!L`|$*>JsPY4H>-=jvVAip5Xr7SYBrs!g0~=ArwTxF*`jRJE*?)X+Hfh+C5yq z!&-%rYlpIe8%?lx7w{a2im+N?wZiD^$z+1L8O+UKbraPJ zMq^Yf>hmwCPdJx3&{5@)Pk2c4dDdu-O@ zZsoZc3}rY(qmEDrAPCWDaPJ-rhVc;&e}ZO%_ua$M2&0j9ERn%b-FH8a9+gX1SgXbU zZy_*0kI@()sEq%*A7Eu2!y#%lC>2F%gQ9jED!+jwsa2vOW+xVHUQP#9v${s$x_W7v z9a_pk7+_-^y)KoLav7aWuzN2Y7Z=asz+r@;i7}clL8g-(wZYDza1^{fv4&5;K7-B; zD2{(f`xP1O6JZv!%mxeOP)tOO;HMzkofVWMJohrSUd+^GHQ%)Q)6)Qfq$_-B?)>~= zdQv&Ng`&%p!<{uX(;1V$6fJ5@$_$jtW;eW&)+scJ;7c{yr!HR^7Gd`ylRIrO1Qe5FPrJrtmP#lt5CF5Qh!inXg32H= zv@0mm#5Grm;E%<5iy*s-a1>MXO&6+sGCt58`>rQYRQU)9xWHAK=#RW^Iodktjfx`(F?#7QZJ~#u(YXwyZj+Z*F_jon>K?WOKr;b zmUFUC+W&_W)awWZL6|j-lL&>bgTXMoe#@AUclbysTV3~;f7S=q5&`+nt0ZC{0Fzzds5s8LCT283f2f{&5@E=#u8z-54T{=b=U2X|9)FOYD{s6< z-;W({YE|_5;dg!*zITrEv)NjjHR%m7o}f~pSXHZ?-7j9pW{11x7z#;qP_uA{b53tgD~@s$9Q=+bgJ4;JO%3u+cU*VF7d;^afbp0*QJR z6Q5zopZ_uSW1qlijCapreiogsoVp+vuj0M))Tf*UpkkvAW7@DC&qTc>0Jtu;IznfA811vW{~X(P#ib ze<*Xa>hJyUaP>ORUt*)i(HIN!>YG1-`326j(8QXVy7cOOjj0dyha5Q8n zQTawuCL0;r6ecBlB;B=8nvM5idrMt1c}Kek!Kp2aWXqSrh7$k?hH*u z>`rB<$P%xBc**l`0mP?jDa@XKMSx;Xf)=tL^IJ4I7Ho$wVRFmVo8vS&HYE;+laNLl`bdkfs=a4m`SoI@J>u^l1F<%G1JKkEbH-NxuE%30^Ack zrI~R`u}c9YvyzKTa;)P-XbtW0{YUzdEJ&jz2O0TJiO~))bq-aPxW}aPY-4Cgv2#lz zztw|EQHg0DQ3-eU0ukkUye@=75tY11sH{?$5u&2(woBzDmSMp_cCo%O3C7dt+%%vn zh3pz$CmcBvH5M_Mk{OaNF-){LnQt}3y`kte^D7)-#*e@7iM7uMhv`hvYqM#~_hbUk zg8)I8mtSQdFc^lYR#~e;5st!U2a^c^gdyrx&NSJm!%>(7SlxghveBSYbX__w zRTNoN!F5R`ufG>wy+!Q+qnl(f;=#S@XTBuYZprF~c%FE!)GFfpve^+okXi+ey4+cj zGneqrS^9zTdkI50jyiS-b4~UJtXA0W%Gt|u<}$W=m~9!X83_07g7%+r9acPcy10B3 zgAvBQ_LhO8VqY2pgAwjK$|oNLfXyx(2LuLVN{EdP^ts_`75yPD-9RYj5>o{;K$EuK zii^<*eqiFXv^)IB6Y9Aq#1FByY2r4nY^X1P+WD2A4}bd)j3<&n+8y=f&rzxH2d{Is z1-)7()uDai#Vgp@WTj$yUA+d^#XG0q2O5sk4-ibSXO8>#5h?D3@7kj{$r&LGqc4|Mmc$Vx$zVl_Bk_;&KCOJc;#RKKuFg^wGP*%@7uL~k>bf; z^C)nR%P&6QWQ}*k||{Hl7m-IARQNiwMnRF^?ok%`Yv|_&7&B zi@p?!t|ahIUK}jB46C47nQ=)<^5NKNI(H1EZ*76G?De-iSchSk5e9DbbS@|se(wgm*Cx8KVcL!#`f&! zBB3djW(@6ySmwAE6O)~mHr+r0fHL10^Fm6RIOalG&wEpqjkY=s{_5QlZQV_hYV~Y! zWhIbZ*OK#!$vd6ra%Bg^_D^z{+j%}qFA)Mtp;AR47za>Eu&yO6#vLN1NuxA0xc|T& z?p_GrdXFcLa5BMQ1ZSsLq(Lc6CJaOA56z{X$rCn8K}4?I3|@Oj&RynA(~@CJ7lG%R zuqRPI*OBFQb@YJx@ME~OL?ViFkI{(x_PAgFyliZRXD-UM+pJdXlucACa_&m_>N^|^ zxiBAlVuL*^} z(+}h1S%yMK5k#kld+$OQ9!QLoFH3v%uf?Tx4O zJotgU`W6NQ)T;Uz2`U~sUHtGZD!X0dC zU~vh0}n{n&Z2aEG~~}i0Y4UQT$JqzBKWPpO_VRk*ISS zv)rZRkf}EhebPmh3Mt8HLS08@c$=s^BQr@#Fk(UeqM}lk`0WZ{!JA~86cAomXtdHz zjgiFKH7TOPX}?Iw$)#4V2baV5a)whC>-3VVyvV*>R0xT}eR$@w=nGCh)`;-{@TNo7kG$>lX% zr?cCQFf|RePZ=Z{1RKaMc0gO-m=AaYRg5)bs$&cy2c#%f;;#(+GCK*z^k5-7%^}oO zbap#JGt`!{ppqUbnR%~Fu}EwJkLZl-@;@46FEaC&K=uy?)5Yri6jCoziHN$rB}Sjo z*S2;Qony9L0w^gZ{rCYIb+#Hjun&`o++0L_a5FYor6)4;KLOG0^Wc8>mw%d$D=X_5 zY44O218mf(4cm^&Yyui=oe@;0&wK7tkKONl=rL5Q;p^|x20x+aVPgxMZLDpC-+o0c z%*8D0LTVK@8>r~3h!h+L>unj1DMYmzd)SYCG#lz;&p4m@2)251YsvVR3o#n2dE zenn1SlADXDRY3?u);85oeNlb*aXE8I-oIeH;R&p6s2~5Fdj2W7a#K!SLMU)t2xNWB z`Nm7mx4r^0<=5Wn@k5XBiyz0?%NiC_DLM{C*zOT99_p@xm353KsCq_b?XG&{UiGC< z&~@b8HDgPzRN%PM?nxM;RuRX+c!I@MT)587u8C8rW4Cwv@B>ynO}VUWV5@^(!Zlpq zb*iD>Xu|m!zW8AtJ&1N6oj#gPT)QJ@uj1l$j7D%3KvpZLRZ($GJGu_K18%knuvUeL zbb9Ku&-2A+I2>bXO(SFJ_SK8eqSKf6&$HEJtBF$=0d{nFxzW~ay=5woBwe)J$)CA}_s8(=mQG3FeGYKR;kL&B`4@>}f5Xu1+ zE?$wvRh+xXY7P2URFVSD&B^IAJbQuj^8}5>z1`u*pXYt|$+y3QFfa>%PKS5jtv>T9 z-gOri7t!n4s4s+a(CJ`n3!bOFv$oe3>4WJRAOP2;a+sOU0Z>5#40=EaRcIC>AaoqK zE`ofBiNvsHq#;>gd@m}P*`f*y$9CG%sG1niCtztp8y06Q`XqH*<|#0>MAHyyt`Uyp ztY^FE++P}k<(W#5SHiI|wro|NtM-j$zwV_hGMWyiUr4ufpa@thM& z*7Mt1?<7;6&{#;*R?<9KiK^j>AjnR(CqdjSD7Md9ANke>_vnFW*nsTc^VPto@tOhn?;ac0d7lIDiz|EOVd@* z&zYW^Y`f?J^g=Zn0dfA+^nox$5F!)`;HvZpC0rMs9+X4ZmCHBaI5tW&(*8EeMz~Q) z+TjPBpTS_LUih%wT9i90tX9*r2mwSF$0Xm##ugogAcUeMP(`@B=KR>F)I;}$@1F}V zUPHHUP_@opt%Mh^$&E$s*@fiXva*ix7_;``Bm#tV`@HYC`%_=!o`vw;v#gm2iL$uj zeDOu+Cq6GL8*=6n+Z|LYrkqAy&Rz=s^cD1nbQ}{uheW-K>vzKU&&zjSqvygi*Iu$w z$CaD%{(1TSTMPo!tM+WXB1Fzyl0Scgeqcl5(74mwdrWTJ!B&_0y&njmzV>O>sw$O&x`X-2rYavR;j^xm60GAn@V12Hiez0*CkF_6k=w4PSSb(Ho*(Grh=F z=nXI&vr&TpTRlAe5MF!+6Cayxk{FG7*CBrV8F;R|{+_F~)X*lJ>PQ$775{NM*{HBILq z4EVr<{PbtBxG3xE))=qVo}%wlgsz)p(*h_v_EYdB!#7hAu4sq6&7R5?hElDvi+m4k zX%wVau+i8^L*GL9o~VIQ8eu{<*(_7mD=Ey)bT;G&$kC8{8TEe~WGO5xrL>%agsJs5 zOphzX?gfvdw8i}cyT=qsE$h)98QNj5n9O>#=Q@?qG6~e4EPhHmMJ3A)&!NJguOG?K zE{Gw!Rg9^)F-7AiM}RpMWN!j3H&4Ws<{^7L^%aOq5fOpLc}d@?lq#iYaZ-e&W5`aV zmw}1ttAOeqnAnTBo(9Oj!I2EnY_|LCHgsK?tR| ze=p}};QJi=CU!?sS9vZs+p@BTYQ@|=q)F0`qtG$fF~2Nly@rjg@bV2geGzM$Y}O5J zOmxwt(6l@pC2O1NBTqUneVp^Na{U%bSbG*5b-8hewThg(BB#%D?}CBCno|MmHP&mf zltPhC-}&@MxqDu2uTqd(QdwU*Pd0a{acvd)6EbC0VP;`WDtU!&l#t%QrYb z7Xd^9tauoXNoXGxPC`<#QbW5Zw^umRLZyO0(C)!=S*@Z!!s0sXHPmVxPdFU0T4A*+ zH}1&kOC->!$9oG^59@7t^&R*D>eWcn68P%aK>_9Z9aKE?cH;Aa6PTaH@;a&&OhT+~ zAQaRp@u~T-uZ|yLt07l!v*J-HHfpT6q64i|T#P4JnB#qS0mRKE_&!KuleRV|h9O21 z^`(!a*}#Pxm~Ejuz=dnLaGmR$Xw)fU++$+1BQPA{!Mk~IkK9>-=b}HrU5C{tKa9B+ z-n|HrjhbA%fzub|%q3Ep-54qap>d;!^{#F7?bwI{9zmhWXbtHT9Jq1TnpVYu`a&F~eh>B<2_amJQpk9+3H?g$LJ$n!u zKXTL?xO5q_b2xDX=PqJ#3Dp`&1_5g|_1VwMrHksW6XMv%q8P6+)+~LPoP-EQHtCd-j_OS)0b6eBxKU9n z>}(a0r^~2Z`@QJ-fQ7I6Z4Bds5CwOC$Pe zTb^wLA)3gT`?V+w6JKlrc8->^jMLz|{WEnPV7AL_Ge4$#agx3)za=70G^Cx~#g0m& zYO)!1fu%z)I;hui^(L&(yM<0JQ> zKM3DF%fknX_tV1=<8iuVfIujKKK+@lZZyWitn<~+Vm#se?BpN*_iWY^F<2Z7N3y!k z*%szz;0FMp2!SlG0pPyfdLZf|rQLNt_k#1OkH}~|`Op7v^jtVD2=N0}Tt5AXj3?o% zZ?j&HwTkPYKa}-N&d#9KKo}wvYLfm9HnQN#Y-a_PEW zC+LRa#OI!c&{4d(WQw(dl;H@WpiwhofM|{|nV69Cp`g=)>!R5(LKZ=9z>h!8qX)v@ z`Xe}w0kUC;!4N@+S{1blf)K-z2_|S{B2Wr*E%*UCJva)(vE_(xU4{YzqlrnZ5&U3; z$L~iF;?xDy>jJ_L5QcG7A6>Xo=nte`BY=%IUU~t?56VCJEzUIIIMVK8*Bl%N?LHg@ z5+dji;JR`AN8KwTY)4>i6QN+&oIVr*5$JQ$B52eM$_KG$7rK3P2XGXE0G`W7@0F`} zaP=nk?bi290l@yvp^@hCvE^ggIQ};S8 zD`k$ldR~SkmQz@EcaQy96ExspAgfP`F7NGa$@aRy|Pft; zMV9r5LQbCxqg8&wc#`f0Iw?_F5kfN}t3nyf!Wz3%=;zlPbF@U{0$$$$(;tX15<{g>!@;T!L>QGfXEL)J1r%p*$1}eatiw3PJ&hiU-d_5JE?w zSA^%{`l8%e)L~Vi5vS|mzT>?Ago)Vbx^Nt$Getm3Z^*;@)r-%dQJ0&`oP_XPC}q62 z^tHg$aBK|x{UM)wLVfDP5W$T_ljZh` zT)qXzF=oJu$8Mj)F{*A%aAg11T|*yN4MWtb@O^~f6A$3vJ}j*obN+aON=5z3H)VAL zHy2T@AQV~KbpEry!$bSR-~Be{W@K$sJ@c6Q)>nAspmh4Uauf9`fZiZTdrqL;!|Db-4?!TVt6q8$`}fMlD|#!5T6&d=^!gl**fi@dDl!iB zI3>7B?jwMsP^n-vw#QiQU{MN}FZ1pbxN}=hpJJnFESQ54@41(|cFFht9FISN#YH>L zVWK_G%%ECDyNzl!ebhCvE1Ma^vAWF@X)~lWe7cOtL|0rwuE44K#LQs{OML+-DP$s{ z>WU~q84ZazgVCg$GxoDMZ`Mf9q`@UG?gZr#YdNFz6t=Rv1=F6GU?z%6n&Gq5O)G?! z-KbfnwJEbD*e@w*6*po5S=RrjoLUw;zNhB>1ZA{>&DB&)Kt6xWy=}xOfh5wTGUk!7 ztt;8viA3D`ZS3xrcWNVWDrNErH*$R@*O5!eOIb$^smdBcbHJU`&Y>22do!jLfGEO& zIj$jyZkM!AZh>RFIFoPUXR3Qlj86;QWAYeLU;;jt7{(I=EdQ9eF^R3E$dO(ZsJU{; z9$JY17lrH@3$(ycVqTfZnk50+cXk6*Dyn8OWg*E1`eyuCB+?tjoTjFqJW&N#eHqA} z%aNWxBBB+b;6P~$Pvj=FElf{MV5PdUgn&%bGd(8}gakfBcwjI316f^1#Y@zi$X8w~ zn~m_~Sx$WJTEO`$=5Ev!Ateik)lK#F&%59Ff?TGN`fYqwCd=nzF)p5T3DfR3Vy!Wo~-LvQoqAQu`ICABtoVy&Jy2xF#MxGkh zIAp77JY)p)eePM{-rZPSK_iaCE&U;@Rrf#obN% zI(<2J1>FI+vDpm2^8?PdFdTC49`)7F^TE66y7Kn>)Y~aRh{;5K{l`$N z%EhbZM8w2LwaWQfF0Zj(i%oj^Co=0!lN&&0=OL+o90#6@_uj|tTbP|S>rW7s3U1%w z-o5IPN4c>f%PWZd21jGe&*7eXa9}?s6Krgx76ZDXvKcN`jP6Q*zmiR%Ioyb%aY9$D=HiU<}vn;GHIDL!_-JKh2cq zirF-kN;Gj#)$LQtNrL#y{FHtqkv+kADFZQ8nbZJ_@MTn#(Z z&GX&A2(kkdh)|!h+Ck75G9iz|UrdgrWDZJn9>HLAG2xc-kUcv%Q80+(pfTH6+0Eu^ z5nm-hHdS$<07w@0#^hxX`HHeMMduI{D3bH+k6Ol#uIReT?dQKVB+g2PfIdwqpkr05 zJ-8EnTnEDuHrwb9;Chi8YoZK=(HMbmf_7(!Qc6Z+I1Uz9!?Tw;KRbO}(@wq`CMt+H zk3GnPdxP)2P95_xdOR1}|GrU+T}qUa)eZIFJ#00xwt-~W_`%S5;TbwA_=E4^#%CJ-5xy;73)Akpws1%gO&gIZ=%!F7|~3po+rH#PF+O1hm8(A z*9u3lzANuvUm&Es#;}E3pqvEMgJ&Vy8OY8JpDn-3SnM@!=wSuvaTg!6k2HJh&7d{Tq zYVwi$cz8d$0}RIyU}Y17F`_v46CYKN&pn3T09#!&s#w{?h3nX8qh5uehjHx=1*leJc?0LJab*Jyd!Z@GP)uAw0YtEC4q=Gl2o)Eb9X|D-`pS!_c({5S zRG0)ju$#|5g5Ch9FY84SE?&o-6|8Kc-J|ExbwSDx-{oePwTjl@Y}E1UN!(mA%RJA; zXpE~j<>WbBzs-etEmC?ee()w%*Eu_5mMEhUuHD4emb~>IMT2G!8=JU(n+JAdbwe&) z)7J~gXvCS8`jwvx&s+>ITt=fIp~!HozVul>^|1JYYqwCXf`sd$*GH?#(TKj!suvxx zDc3iNp`qjE)*GnR?Ups;@pI!QTvu+~;BaW}7XvXKUjNiJn&ZiyU>v!gk?V=pqdl22-J7SxXwP}HBaT>8G*+@N_38p*wDnHnJZ5-G{8a{;0W&wl zZWu8gOMV-I^?SSN!^q~GawRK<(K&KqB9)fwi|LbRN$Zz6#$>5Vs_BUJZ!#%)xQw@^$W>H%`X+N1~`__Fgu?K;+d8 z1R?kChU+9Rv4^8%b%XU9YE=YbE}#t()*9$arPEW7+^3#@n$?Q`PyZE$qu9YZ2;g~W z*5vvf&d(x(i9rB2@?--5gd*LZ`-|V;u6h5T{Bs#k5CsVe-Nf}b+V6j2Jjks8&3=LiXPOW} zuP=VUS{3!G_G>2~4J{rK-af{hNA*W*QzAAp3bjGOz@57Bkyhwq|Rqar2~V`UFQ zJAwt!wgDOdU2)MLg2ZqnyXVzspG6SLcixcYbtr{B^L+9_OeXU3+fWWj>GrW}4uP0s zvW`M`fKC_9CTE-GNCSz94@Eff%>bg^-&2ccF}_35SI{&~bh1LrVQmAg24-7^UjUnJ zcpe<0(LfjgKoFu@;n72K^#+1aNQ5HouKI~DspH2WVesGme=wQAb7gbOdFnB~@F6*W zO<`!VvvFDiu_#sR1<{@R3KcYe6=*
  • Z;z&(Y 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�L(TAgdkfXK{9Tsf-Ax%S(2HpwF!Tss0yx(Sc|)*RS&iDc(^n}OPtzVSCd|wgTpqhG(_Qob zE+Wjd?(jxCdPVHsXzQGwTISGwi}BE0xLNp?TI@>LeaUgvm9YMN>nxVf)uM)Tk5UFC zK}tfM#ZkSq8j)=JVKTvTY|s^SM^ELo_K!v}k2S;?yrG*>x zWC;TMKR&Mdvodaj01d7x1e!tyEJ-mF%oGILBc7=cv9T-Z-!+0jBW9uGamhr)b8=Ng z%xb~9ZOXbWX?3K{=LlRE7k|+%-jWg%fqBH`2MT(BKICVGA41pxUTp?HE0=%gho5cI z8!Z&THtu_%YMlzqo~Us(ssIDdM?1WSuJ5@P=@5pmUSIs1>nSpW&Nle#^ute)b-y-x zr8_1Q$CR-LT2f_DJnxy#OXJ>my7WCK{ri|x1aFeWgg$h@xc&;cW1IW+6Y|0>&Wlj$ z-xGSn9(Zo)ZMX7eQcv|#TRXNtSNo^Q7^idurmYV?#2$+TO8=w*qVgn{uT%q2R-S8K(6;JTXH4h|Z)TSj5V#4fx{%BNR;{EWA7JtKOa# zVq7EvX^;dYSh>MuDE#KjVz0yOKXv&J-Yw!~U2TuP^-60qa-VD0QwP~C%dX4QpX>7u zAp4;bm!qk-#mtUa=~tVxUmiAkH?DggDg{KY7va}p=7Tx^P$vA6z4>o*aO|iIorXx5 zn|mt{`6CA^>g+MuY3W(tKUpf=8*!hQD6YHk6<rFNmEVj=R(Z7 zcz6758~dJv$!VPWIM00dbmA&+>z6Ov!0*vT1GaVn=6Q6 zMNCA@ISrwfq+?Xh6z!g{v_yV?#!Ohv<@~IdzNRxM270KRxF9wD^T9>Hodl^$Jt(a9 zw6x{ZF&NF&($ei4*C)0b-Fju835`%!PZzJF3E0&z{~u^&=VdJ=HFm_D394BMS&Z6S zz^diLUpJA08V_PimG`S9Uwax-$cX7rS7g+J)~XzkB>-qovtlD+AkY*tRnaFYgd=NP z;kp`tARXz|_~-z1!{K^Om_|>Nt`W9Df*4@cSb3Ri&ct*r=n|NfmJthqW>42>^tCas z3LXie17AjMT~#%wF)|e*q99WtOUQ`nPZVXsh9Fkj>WWqlj_ZRwBS`V_2fBT zYBLy^|ILf0k_wmz)Y?_G{ z`_o}acMUFnvWTe%@_al)NryE^ zF$dbXaSO_RaK}I`993xF?VHvt&O=ayL zK>oln&4|1@Wn2}atHSh>gsf^gQ0D!bp8_3UW9Q#yyY~m~No?4KwJ|&im}6QOm0tn> zIH9WiHeZ%gr-Pl() z8h^Vv_h)eo92e~+QaQ2&#Udck^Z`~7ZL;#Ehbr0@dO)2({s(=*lSe5Pvo3?*fnc;J z_O`9jKNhq97z^&JI&Zy(J@$TcAL){gUL=A%!~}eBE-UOYN+l@d=>7Ljy`fL2l1!C! zF2*IL#wB|$q=pXI51Tt-?*v&%_zbC7Rk;MN9g}tka-Z%MUA>Xl_eOdYt-~xZ{*@A) zsMsHACnF;|cDDaRr#pnn*A`i1w0lANbLZLTVf;_0Fnfk#QDe()=gMUETN&^E)AH?? z7A;KWQTCU0-`8#{Q(`okX9eVcu>Z7@}ckc>@l4GwtM&?PQPk=QFlOh};l6rhU z2r};InUg%mvQ4Veur6zv+Rc~kX#WRiTN*a_utf41NME{s{Y&j_Hr4=t4cxq$J_^j1 zxlLlt6&M0Oeh;R9bj%J_-C;>Y5X1q8cP4cusGcqeM{>ZZ`@m)ZWJy&Dyr;58)Pzae zRWc;44k!E2l%H{>Edc~YzwPQyGilGIQ)^ea|=owmO^|zSq76 zA@$7e$d=gPS5LTOl^Srb#a>nAKv+W9k_=*Iq0#KteL)g1B4*}}G1jo!?L{Uh4j6>U z)|fZt=AX@I)=SIP&+0y?gF=j=` zUUN24o8uO_|5}3Dmp;hys2%feVqilhWJ668LTvGEt=1sN@781P-R#%g(Lu7 zQ8hnk(2!9}SAtqUXc ztG;%X33#Igt_F=A_+{Qki!NFO2YA7y1!p>&|5^;|7h3mP2+*uawTgby0&33#xCTf+ zcd6EcqPD<3?QdaW4GZmqD~Zus0ORRF&lZ`NE&jA<5>FGmV|jNs%>`-Mis!R20Aj(k zqItdvTrWALx&l9bX>(Wx7q-Oii}NqV?&o^R^XM6%)q27?2X=4v{k|L`UkJKeXnd>i z!mbxFEzc=@qr1+{?4tVLwIy(|n%!D9Q9H~|AkAF%FkVD8K*(HlGOD$hn(K!7rpbUa zW%=T5l(4ZWNjVo8x0UgpK|sRP{j>aAMM@)J*a84bzSxq4t8{;sQXwcb+#oel!d6E! za#I_nL-iO^wL=fpfNTj3*ph5nV}25Vsv=3oOSf^Rs`d?0XBdj%YuG|WBu^I9c#+Z} zC=KNrmu%1(SDngJ%7JA-2snl)dX8B^$kevs%^G*P&Rr1`6|4!%E92s#5M3|u$0hc| zn0DysbBxD}+zXsxK0(M2y5z7Xq0P}KG z@7~t=moVUrAKc-Xpfo7$sax+Y9^Q(iA{qe1pn>u79Cz1wOit5SiKSH#pI5R*=iGroh zoSlA4fy|20mlVCbsyCm~UEa3aH>Dwlid?=QG7m57PyW@A!H<)boc%_OOQvY6k`dE4H2utP9q3yulhTx3ReNvUgfX`f=(#XL>q>^|9Th+p6AC=mOw*WCg(p z{1M3XG?@iLw-5o$+E;Ceun8S7OPGQyzOHDIJU_5fskipnFTnuuI-mz+C;6XWPA`Q0 zF5ove1@7U>9oNXr0Oi}PcfLp*EaT3vGM_BuA3D}%kH~bC71hJX2>4TF_8F3O5P&Fl zNr%q)#e*|4YC?k~8F2$(Xcnf>uActgh_0yG8B;&&MbB&NdfCRp6EoV=GGx>_Gwo2#B{l z5#+s~;9Kpsup2Jk84Na4bB?zceBNft$~}=GQ&dMQmEp3Pw9!n+VP;>)wkJv_@@C2o zt&8RlWsK<44r|iX@H}J(&cTgg)JP|*dCVyft=T-Di<08lsi^8Mc|!8vMe`W6-|1Fh?Sx(8JO z5Hagz51}kC7?#KG3l(osKkm$8DRyuD{54rvGY{vw|iQ{8WxJhM66-d+y6q@0B^NCF{p1_vd)~`l4b- zZ}9VDR0r-&esd8hiW@vrfS`(Bc26O0$jb-eD|Q3S6=7*;?ktMvJYDeaI$7}=R*tck zbw$!-t_Fpz^_nD->!@;zS|D9g^+G6Q5bHSkm7f4>P(f-fp z)q)6p@Ctn=?4PX)e`J*$M&U1XTCGzw&ZnPYTc}`*H0Mc`II9aID`FuoJMLXi z2%dwsTCDHn`Eei%4#NlaUBrcwI<-e6po%g5!i)8d;nJ_3_Mbm&{r+!vzDq1@>MhO` z0n7loaVmVl(^p4U{XDYxZ^h!BmPmEvzA-D!W3tO(KdEmVF8;>Pee<{$JtY!4E7;Fw zC;t|OJsf_2WQz`SEzWoy<~7OQ-@;frKli?0ioT)HP3sZR^zR=dIn8zsc8>_|8-wq^i)R=aS%~9kx^!`L;~K74FS?+kat7t6MA1bcWN4v z%Ki=gj3Yx*hILj9Fi9xegDf90Dj}F1Kfixr;eiPR0g-@$D*5q?yOLM-&irV^9xKSO zR^w((%bviB*{_Nu$H8M_Q~N$d``@%>FQGqIe=JEv@>!fuj<*iu0JOE(n`= z4%Z8<*s`}$(v+cMal$W*`~Lq5*{MpmYE_K@b*q@#BiczIZE)uj)P5E+7^n&kqV52P z7)1F4bKS36FHQ(!Aewt-y7MKgWp~IP&nI=McbNXP7vvndF)2(5Dg2DXfzmre$_+$B zXFE_n%eVozGUOaE84`i2oUjupk^u)Fokpw2PLO`3@c(r@z7k5c4W)| zK!$Wi7Rgtu|LPh@Vo#a<(XlV=mJvNDxH4+`3njK)V<pWNrtealer`8HrP0pdNYEXif6{3LhvCVR_N+t6$?^~;A zk~8c7TDcRJmsOU$)hhmY&IP5_h&X3>eeT`^%Ote3oc_OK_m$ntG!h`%Mf9zGR;V0m z)mTbRK09}%dt*5jK3e0y%V78R9%jmqfMSTVdYGx|-3eGBG*!cVZWIgKm$?GOUq-xp zffrQ)ls)e>%+Iq+nGHh4*|0m8BOeI}Vh)-|aHWcfK!TKN2_(pH1B4A)mqN+s6AK`< zG69sZ_~{9{bP#T!o|&YC0jP4gJ2h_;F?EFM&N=}q@7ZOxC8(@xmzNL9i~9X9G%o~B7>Qbu`nC< zqB!OOrwD5Vt`MmUkT0R|UnN?buZr4+p6~M&b)gQ$$tF} z7pW&BY><8tan^EwX_tP?>?K0)jTZh+X&1}Xodda#n%=j6;Qd6U@9n{yp}ln&I+VLE z@hMXzv3Sc)^Ci0Z^6uh4kMM~z=9?~5GmihnE*+2iPDWT=$nt~c1%YJXbJy0McgV>Jf?Ql++&JW_j!i@ErOH%Kr%zv*he)TsZ zKF8SA@ws&r!opiDDm<*x3G1d*;zgJ~yvu#k@g6CqcZTC{munH5ndicON?ixOTsQ|8 z-Qy`WmxH#U>)*D(#oT){Dzje&7j^&RMr{bwuQgO5%f$}!sw-l*BmE^|odfpsUU*%s=Z;}}G#?bbawOHV z8eSCx(n*+FBk(01QkOu@OoR2LUO1UM@!111sMMSy1Pw z9I&*c(1n+Ag(a(AaT-}UYKAdbDFABuP_ezMmKC0*8p{8pVGJrpu9adN)Gf83nf0og zlhlc7gWB7;ky!~#sd54av1s7j3V^g^@o3uY43QwC({x62FhqD$vUns-0^v3B>{Q;F zC?u~l^iB(kgRG-$-x!Q4J0K#z-~?`+*u@`6w%TL>6%Isrf#l!P@cNhfHM6giua*o~`(jHq`u687 z=Y-m8*V7uLt|jA60GAJMT79v%mR2s{tZ4|OYE3NvX+en9Le8SyZ%aVg#+}M=b)|LI ztQ>v8*nKG}?Gv}d?ki%om72^AOPW{I@7A29l*e-=*O28hEB;5%K}XyES>CGsT=eeE z2$&i}D6LF(rG|5Kw_m#ld@d=^ZOE2XeHQtkoQBFfNzFXx?ET#6{idb-hBd_Hn7Ng+ z$R)I$#Sf1Ft7;IhNibsgE)!2LkD~uaL^Hg4$LuiIoKq4T?vE4 zn|xdlf`~%_r9otYnLH*}WAb7%05ssqfU!}>)qSfioB=`rUDf5F6Hf=malsqA)xdV~ z$hh{Jp~zbk#c!nSduOxnv4y3Km&?-U((>9+>f^C|KJOnWc}KcweW$$bwY>ikKC({? zrt*KDhT{noox86lli|#XRXeox02>_I82i15b2^g#_L|6tH%H%~r9Wc1_i^mgR|pe@ zk39}ch2DFSI#ckUew@OV?2K{76B6po$;{siEi$GJv06Af`+G6iIguEJVFqJU#fSQX z(K!(gNEd1`Yu^Vsz|e9mED9xycNU$87Q91R>ND57)5_042SR{4PK)oDbgxjtJflvH z&b)n4SaYItJ==f>kOoaBp0*!eCs&0bT+$7dRV2*NB``l2Pj#RRy!R0<{{6ntx=G(# zo%!2E8-m{}~bCIs0o-5zNZzPN`ek;IVYW&j`0lW$b$5`csy@-(?q4eM( ztHXteGb>0!**t&*2Z3?|VaYO*CQSr+k9`&)$>oraie*$2mSj)Cl78NkF+F+VK;dvk z6+Iz|114SQDYK%J281cSMK`;9Hn(rVnJgL|7Axj}Wkfgn!a?3gpp;YbuLnWw2JEp2 zm*G^|T22TUpo+dV+!@{wFP<(GPi16G)?=m+{H&)Z&4KIJEIvK!XWa6& z!Um>Pfz(Sh<&YM6S!dzVDPc)1B3U&$oFZlg5c^7)n$cluQR$a_cg|_KN6XA-vt{S9 z^Y${+KgXS{E#~;YXxXcjEIlPJ`^9h2zXDahyTV@9O6-!&V?_W#05|B3s40t#>ZKDI zNd%3AsWHRLdhtv8MnC^7h$34%G7q0Ao=8IqYi*)#5Jsg5ais@x@2g5l7-+vk%BXk zbtiJpSe68F(Sv|USnLJHsyJC%>Cg;GVQuPiXY$7CB$%DC?7+^x`ClAy#8?SKG$Kj zs7O>brTYuIEwlmfW*&;z1zp;;!7Gef`1wlMpls61h+E$0=DXep| z=8L+*{v+cgP?0DYoN?sN9{}QdOtWqQG-kkL|pKwFG7~4Mzdr} z0)qnt1co}aphj~D6oi21%U#`^^MZ*23<*s@YNQL!ia?U^=G0Ha-o`}OLZ=Bf0p-$Ci4 zGCR$9t080Sf-P(50_D5xuhmjt>@R%JRi=!+Ne{H{(3R}_a3{bM)0yA46L$`2Z%t+1 zbu;k{7LN1jLy(pn$lL#L4?99zKk5FUWZ&6Mr30cnn*ChVAF)NpNi{uSKb#7V&yr=x zjUWfXw9qdajQ_4xe9$U=%L=`1d*Z{L*?)ok1gN{d;~c2Zh)sgK3MO z)nv37%sGp{fjlrPqghpo%k8V3g9yHHig-`J7biY(zB=R0zi%P*Cu`%cf(b#u%pRV& zo3$KwyeAn0^u?PBP&zkd$Xn^W)XC|Ags3C}=&d(R0*& zHZ=P7HONg`o2Rm0J(B%)0)>MrH#YJ68|?G9Z24N}PkMPZ0ALN#i#6N{_Iwnw@Q(0f zPtvYA?$}A<2~QjtnT>f`!Ld3gphe4<-JO$p5=5p{wy*bE;q~#tp#?wV3QJ>81w~&* zbRq&nT2k4;^qnVUSd(#Gc?_cD)%}S}yPSz)X~ChWM%>EIr74vYOnmd07S)ZeO8BH8 z@0tDK)qika?%?9YH;xEPBM=Gl3!WCywQk*>D9W(Ls;-7Ed*W-fh123j=D7u&CRCGCn(GUy`K;pX%hEg;r*6 zrzWnv5@EeGk}Xab&EBv*nzJ?}iYL;MtsVYsLFHX*U4lL3PUMvvgf^sdd!|KLFP%t- z)+VGW84N)|&ec;UDHedx$BrdiV%H1{N%rvty*r}!Mbp1L z7QbPwH&;ZUOrW@DvaFtL7L-=dpEh<=+nK@5f7jBj4BpBIBu!SM^_jPlXUUc~R4ak1 zL&#v_x~Hn;X;}GHo8tmj42V_`M=j~jvBm}&iK+rV1ElIpoE0ze@Y+&Di!k+n!R{*} z(N>hb@}yBXn}WQd)U#`v%i8pnT|-uWw$7b%0hG0J>IO47C+yy8FatE2ID%K|2ejbh zv&cJ5`Buj6)ReMb=n7p?(f%~3PtMkF1b~UD!9n7=bT!wPOWV$*mR@Q6&TL3n8VWuI zD~0{4VRry*NKEHpX_PYf_yTI~7m1)4c^3ep21M<0O}k<(jZdekFN(e>g>*O`U{wn7 z0x)36O7=j(lvGoY13X(4R}X1#*yev>H+yB2!31Viy@VF1vdv6g5s`J|hNSl5bt>ks`C~m-0T=eyqt>?K?aB!B)Fr+}igA-8Fgkt0zXp*4VS3H#$ z15tI#?dS2VH znkUz)V|#s>m+K;Y2F?$kRPHU>=6?711G&HIv2IzdZ|U-%IGw+zpQ1X&yZn7~K&N&! z{7()uL}D8P8Cm$&fVruA_4`95KQwX2P;lZ@>N9IPZ^qc?2HhV%r_8S89}h&h# ze=sgzvn6sF3ceowot>-x6bmC<@<_xWx+$`WbN?l~KN)gHLo<(G-}{9y2y?$Lklv?q zo|dvr>fC_@(DlH0sX+exdZ_JzA2CZiBrA9-F2}h|I8B+{=>=qa#>cXI!-|^7+o+ieokK zDaLA$3$x;%mn7H? z{H%)rB#7OBgos_x?o!v*3^< zl2sPL6_0aG0iJeO~(h|v~v{9hn@BbHLtH>i4vS)%Y;nbbCr9c|@| zl`o{0ojI&nI0;fEfAN7cJuhExPZT2CJF`zt559A|*=-e`pHE)9N<@ty=LTszv?1v& z*rBzF*&iGuP3Qv=CK8%(Cky6KOjsH-lTN{+O_F5HV8@4)0N7WgRh7UBr~vnxeUz`o zEp`KT0}!zjgtv9UkjMV?o*?ajpm&GXeCh@$mb&m}3eigkje(dqSA-u#F6dRhvQI2@ zynKrY>FK+U4u9dL_Nj&FwQF3U@Z6-<6>4Z};|;I|D7mz6SJLsV@M@`)RqpEl#Uvw*Pc3Xr#A4q zrO+41PFnJ}QME2#paMi=r>uODaV40zWX`os*;K-c&Q}^Ce$)88U>990hF>}dy?fI? zMcMlAEFx_EYgIUEmwt)goaJHu3fO%`FPw~KznW)vAYUg9=ZM`K612COX_LL8Wzhw6 zL0-UNt!x~!!c%tFQfY~y@kp9aEW(gvY83+&r4TS(Gyp-ocM^uS68*YFx}*-xiLkDo z8mE*AQhl3=AYnmJ zM;3WJ4?7@$bFSQyV%t}fc~}~08u1L@HSIiff&PhJtB*>64pIt10q4gs3p(jD@@&Kb zK?Wdz7+426AOKUq2;c%inja$CnczJ+AdkL&41p-kS`kJs5+F-)R3`&G7)JuE1KlY^ z1l%IjCD6c`IP?urpv8CgJEwAP))nieB4ln2g|CATOfOs+ew&~H%zx;7F>EG&Kau@e zfAO-Jr zb4li(^0@;%xSi@%+c!=(Ww!h^I5@qV7T=fF#q;{`nDcmI{PkTzFLK}&e?Hy) zPnV@`?;d+!cJx(;wRlD*0uj|fL69*)x~AKz81~aWz88+X=)CxK(b%=1DDTPR^HKce zX|TuEV;p&u2eu)!odz#MIEpL?J_@Jdjpk&BE8<;#Ish?Pv4V(e>;{#|W>S!I^UsxJ zSR+jYML&5>Z+LTZ?&qi3Q!pj_>@PYZqRX((0Z0e?YUYQh*;B%h5a5879rV3zgON0+ zzI)QoxWbYoNO{Vgwe^G{V>IcnLLvsn1QL-qhb17vTjVy}K&4zjPTH*H(evd{9i z8LjX24s-4oBdcD&S%ft`VHTgCBSUoDvUdKiQysUgiJsq+eRwRtf3EB0>#a3$y*Dfj z>CTr_(Gy`^hBW6)F7cvOdZ)!fKvH^(HUKSUx??UGk_hk>G*N9^S^JLijAahM&?1H^ zR<)$($(TbnMb;^nr$om)~h7T>&CtEPN4iq2Mh z`3*O0w9MrVSyeE5ov@lhdu1fq@-(R1o35WWp{#Q&ZMk~eEd^3&0q%IA*!^6Utku*_ zWv`UJ>``Q;h&rug;2aP+tpq_^uw&a8H`QVqT|+iw_ZM5NX0`oF1JFFRmhHIz^^_=|f;BpVKimANb_bP}GvXYwv_wK}?MyVSz1l#aI;a^3 zogtV4cCdod9aW`Sr6pC*FdV4L=oCEK+D##i-GH`q^Zsc>YZ2*|s&yD0VNByb`izz^UDaC{V8Qi|CnO+aQv`ULIn@FgP;T>2^EDjkN^UZ3oyf;<-Hn(9^{~i;B|CZA@^g2ei7?MsmT7*fXClHUJD$d)HW7rbPlk{Lq^dJ%GsPcPxH=8ImaLZ&?xu5h)sZjp+6R6z%Oy>cY34_ zsi1Czy>YW|Gml~LZ{qfecv?00;8 zZNH9@dsrWY(M_Y@WaMDI29i1d6T+QG1x?sb_6RX5Ix-6%m>$T`=j)KC#vE7*d{EV{aQ1Ep%BNDbV#sEu6>?vb))aVZv_b({NC!L@` znvl_o!J9BdkaN@bk9#vE8PV7cAVlh>L1&^^I+c?l4Ghx2J`0^7E4wi1($9I)(v%yN zwc|m_CqwqWa!uh#+L?Ji%$1T2K7#}a6D&^=DFat zdZZyhaZn0KQY}7IGux;j9;&!3T*|L12t#?yR1O+{cF4Yhh4KF{keyMx2-|AK-bnZI zuHI_@Z~wH@wJ)1xMRV#liW0pelzVnIKT|YT#oU>a-euXx)19}iJ^0371Vul2^AfZ@-W3jVPEhc)l%}5h?rOifN6Q`z6{QI0oc7IEauACU9l3Vdth2oDZ5fhjo-?5U(Zn-ST1Q(Wh?5< z&-N@6lBwZ)%MIw(PFM!JuPivy(w{3OtJJ?7c3(0s^(nFPd|*@pyEZPxbHeVGYUwP8 zBds(nYuwecM-m(#Lg&sf1q!ZzE;^|u>|U#&yx25>oP)5=d6$Ob*xRyDmlPf-SX$*$ zsb6t4K^jq56w+yXHyl5>@3iO&R}A0Ftq&AM zbog9t10(QwCa=GBJ5Lq7A0HF_Q3&FK3jh%vF#`Yx3Lr{Y!E>_|GpHPRl>nb131#bj zgUSjrvNS%Hfh1vS2pC=5Bk7%)hpf67Ir$xtt7#J{jCFBlEbc0e9P9Xrq%Lu@FuqSZnEh462EqE?QQ&%9o z$Vz~t2moP|o8h@hcq6nh!0CMmt)eI}^EIHK#d&0`h4&ONO_mKQ5ns=i$u1}wB5e~g z_u0^WmmBdM!*~{-;U^j_#0!lU)3foBC@b@M+>* zcJhyOV}~4lTP}13dj23b{n5;kH|1CVd@z0!O~3KfzL&0ztkq02#3u@)z~U6?+b$ls z!}5UHrxCdpuE%@=p=+@4_Y}I(ioXU^Z(S9+V^id%nESJczyBE~Plo2HTXXI^Gcy`? z9+)8v**PlqS?m5tMlS43XVKk*G;@hyWT^0YL|=y3Wg`F6euUx!pYP8-HL&m*SXTZd-8f3i^YWJr>vAn*Bk-{>p{Ibza4pqU?>Vg<9y zB11wkdn$fuch@b0A|iA97p%cZW#$JQ6nq)hgkDj2YZ1-QIH$jIM20l8$E>X>ch2s; zW3>!Pzu=j@R%yH-LsbSShy(WKY+*`0Wl(JyGLs}NT8@rJ98i;Lgdrn(>2yID(nuNk zgTByOFV>VTbD~>PLD6$2i=?;N3KuR0TKj;`J);W`1+B`?t;)VSV8Tht~hss|tH3yWhMs?*@fEV|s6-0kzk9s2R00 zSSjTO2oxC13|0sf1EdL(0%ZrpI!KmHN1C#>pmyTMOPtI1JXcen(->8-Z_VjmLuHMM z$u=AJIh0>pAmz3!_qAQ#);2C_^EuqdZH|Io#YM}bp_Q@wS+N&4L#?x*E+Qx{2l_p0 z`kM8{$}|(sSu$D4QD!sX7F;=f0dNjhAI;kAvjBgt26jCsX{T(VzoOoKsaUy8(pG~R zERWq+AZg{WwG4>=9d@Uh{Ct)zs6_%fw~HB)-~<(I@zV1g0z6f5i{3br)jn!1&5}Hp zAxjgRy41lLHmas7g5U*Q3+_j&4%~p^CQMm# za9i(~kj|r7wP#Y^Fw9xEY$YiKl;d;GLn>4;xR=#s52A<>?4I;YEjX1%++Z;0JxZDs zG1OF^D&8;{U>E{+;N3k!mQHb#-GD4jzj?L)bJ0Qz~ zHzFspYTeDD_scMl1GKw5=N~7sUx~;5EyX}#hK*=Kdz~pSChuQO^`jB)H%h-YWb`nt zjflQZbcIBhsZ8P!&Ax~Xf*4~Fr@0QEc_<)9b=|C&zzg4l8l<3?4GS_3$!vHOk8saw zWcG6?19>D6Px!IFvFrsdo*}N;y8^ ze#e~i1TQGFn4kNjdATkXxjB^o_@esl?$C8f`+?%rBE&W$`R52nF*OBu8a=ll|2R|# zksGM=%c6as(0UC7MF=mc}7SZd`^Dz{j#_0cGDyq^y4)P|3Bl^|g`!#wicxDFAJ4mcT z*DDDY7N14-TON-d)>eBYy8vQOK?I~rFf#;6l#XYiSZHMrw-njc5oA4gyg<4D5xapf zq%bOzT$oY?Ja^Zb{Qd>4!z4jo+BN&b$*U5%ee=o=NGne{*1M{AyUPadhKO!S<`1W{ zPtDeXBC)4PipZw8Gg;!G?8TKiVA9FxHVL2x%QUI6H(QEtPo;OyW}lfg;&rci>?wFb z@5@&^Q-%EVX&GAL$en6Tf*TjA42j~YZ2m}EhBaY`27PChb~gyGO8}4&UGK8o*;2D# z8Z4v6Xn^chQT;4>j^)rswT^ZS?wp?T9;PZZF#&=Z%Wr-S(Uck~c>$39Tuj@~2H97t zk(srD$jlFpuX*1EdY2X6+ByG=Q|zk#x1Bfjjf2S>hN2hs+9%UwN_#RN6uh9|WgZ?+ z-aIU01_(jc@zRdj7g2UVf>hpP$2Ypes_faFDDVPJua2^!GH_=vDBr;lVOr zO8JXLmG@N1Qw1l;l!B}SW*O2&)D%&(Dza5Z_MAf2*8hEWMB6+*OYI-3i=gg6hN>F( z<)5lEn%38}oXFWW`3j^qyi~OXwsi8>SFg4dMuNc0V%ue~(z4inDNL*k7FA;2tOP>| zO0Zy1#q;J_f!#_L9ZeaRXb-!aNn2BvZxM4DO%kto(TAJ$v*kHK%M(_^?r2~l z%eRG?7^H~nCX_9mtZEFrdH}Kz^E6<0 z)MEgy(Bbv=R%mNFBSQP;6T|UY5Rs_vI8=7B4%1a5#_1q#xX zt)rQ#!%~Om)yYK!OdTO8Rz*+rN5xC~{kuoXo@5%PtAHWl1@4cJQQV}s2`7LXn167A zI=<-q=YHy`x~BFOB*QFkCzT+VAgHk%NtuKngtd(LV3yS8452@hwkxj?@n#Xltbod~WV`=8GU$IINj(VIc(Zgjni^(fLIP!WL#`#4Jl0CpZ- zA0(cTv#-wvZ#)TFkdceHptPx@r5|0O#!CE^N3)M<93L_-S>JhQJo^Q|`1Qy24W9F7 ztJJ89{O%=Y#43Gv(HwhJ&c7`EfUrNgKYIIc;&N@_3yvCBJ--^TALQJpGpYYs$DXzL z!MViWtkc%$3-8RQK9|xjPR+j9jsL08)~=ep6`}3Gg`K5L$DqY>Egc`_**uDS5x*8f z!as$M_ab{g{7DMkB=g_OWAg6IKdi}pS%aO?Uwm`qB9wj|&yQ`lZ|>~9Z6Nt#lz@wX zUBGv9oGD_U7pD(le4et8U-|E^0$*#X1PV}JQp?C<%7a{#^|IB;FlOG=Hf0y_q&A;UOv=Mf#_u+^ouVswS_2N&HL+gq@; zuvV6Q%b&cw*Ll;R-f3!4%{g6Ao?_X;n3`d4jVCFV5h)|G$~?F!2r@&MnikXYM>E!7 zgjM^^x$L1m2+Ft8Yt|)P4!HC}AbU%(Z3sX2r&=gig3?mirAp=QX>ET3Dw=h!{;1|& zNsw5v+Gcv29hz`G*;&h3HcbG?h*mm1KlR-sUAM3IW=n}H2IhZ$vg?%_PXGN={%ooH zRU41}!9ATXUDyA6J5K%W<0L8f)Ktgq>m$3m?2~CG_GXHDU$m?v=Ro;cSMLhJS0E?} zRrE*~q)9N83djI6D^HOi3RsVuqziw#APngTO6v)05#2tyC?dL_aZ)$0C2-;CNnvTm zK-3sc%>370C?s!Qqb1DQ|Js|pZKJh5b>=Vb?tS0oLDB2DV{4Il;eYn(1JN>SX8?gx zB`?T1%64VcG}m{AHg_3A39Tb6!nz^~@^(;g5ipsObV(sy#!bCD0z*^fZB~$XCha^w zZ6BU?j?XzK=Sh<643lM4l#JzGu3dF)z%{Ks&r8O!{?x8WaKkiiM&$MEOEq^(oKH3X zlfk4a=GzU0*T`;@x54`jmVRx{#C4?A_GMGv${Vc(IM$XGNIZFs^n)z z+014+Uf0m)6(vTw(;H_)BW*QrvV!aAw%)_7@&z#}V4o^ClH1JJis;DQI&HflQZ^D5}HEs0x4;@V`usX7cKDl^VOEHIqQo z0whMjkb=9yi0H)4A>5iPplaV$Ss-9)6*(zT0Eme5j<|Fcq~OI8o!`q(j3M5}^J9eq z#fa)^wg^p>^_1mE+G2eQzLHlC_`f_!NvmUn+9dzzNCoRl z!9|a=uILOy2uP}Xb0<(l51yI`PGu@iJ zHh~+^2PA>#|Mh(P8*4DPNT<>=eGoAZQIDROR8MT?tf|H}SO{q^>7qHd0M!lcKWIJB z1->T*VMD(K?l?3Ti{Q|9tOcKlA^fi$>idp&-+bvy2gpmq^oyVQh3sEvzGr8!f80NC zuj-@H{p-|Z$^5Mw$*_6Pqxx{cd(>Ebu8$Uv>)Yn-J0E5*q=okfXWaCcwg-M67fI0#6LCf9yWVF63^U& z`43GO_aYo)c}=1YQO3@?*dswWGg}j!ob8VX8%11uad%apmG!;c?3Tk;}>lL_olh1m^sc z)6k^|X+hD`VtU7ogMQvy{NL8%(B(ZGm&CH5rSPDbT{OFWDUeF>s3HUizOPZk# z@zTjGl`r`bL`arK^F+{7W+gJbue79*yrS1H`tEc|RxQX$kaB{c=#wUdB}uEYL1tk{ zccvr^0a=NUQ{Jl~$Q%rV$et>B8AnF+^6Dj2BS1H}O=*ht%u!l-Y8_9!a&0tU`sT*VtHl zwWH5kOJnXOP2;BDO-?z^+Pt$6z!fjTOp2|+=-3zc^}KGg-f1ST8kqRX{*GJLblkXR z`hO0udhhw>a4hrW#NeM@-1*XV<6n5zU$ld)lel^?zh^>54g1()^5!)%ZbC6h;mwz< z)p12o0BJ%MeG)_lu?i^gNh9`|JQk*4$2V5TLFCR9lp&Puh1aKKL@$k`g{8YQ+32ob zce>zC6||Vq@tUp7$lNoce6QoR=h>&ynFmj9{{9<^&(E@AV>nTKezs><--)k3YmY33 zw{?Pu?LzV!UGeQ4S{HOHUOGDgb+7Jaw_O0kA8olUhNlRWMl& zDvH|6THYFzsysE1b=-*0sBY4~1Qb?kSO)8$jEbsWn^r)s71UU!uM8ZQ(X$c@Ff%cW zazI+5BE}L|)x!rY!z&l~QUfum<0Wmb2<_678z*s@zv>;}JVrW22$5f78MXjgRO;6*2M|sLN9t$ut zLYf*`lwpHXVGaTg0&3jYE7ek^Y2|+!5&)G=2?cT5Q3qzkl|x9|m1O0myJ&O3++o#u zV(nyrKq)JDY9hFI1d7Sfz|18NotC_?Pwky%*B831bOi&FAjtd0Ns1a2(V-Y64@t{- z?Pl+nr_@M>B02j{83-#e z6lUL7dy#kG+&vpSs>@4a#ucPpNDeRycz_Sg06sXhhK!FSnUl^l@V`HVGYiPu6e^OR zM+|mJ_5y2uFFFnMfkzbFJN+{kP;Q%azQrXA*S-On4(ypi)JJ~|C1CPtq}H&wvfq4D zzrWk|50{LaQl&5Kl{@+qf11qyuqQZiIymuE?n8$~=eE=@hLuWWZr`r)GvrPpdyM^* z;;k}r8b+X;ox#asaO^IUc?dK8u7EhFr%q@8gdsE;-jo0ICTLONK3Dj+9t5V)4>>SH%4#FI+=G4{Is#ETXqTbW{Gz==e)`XW%^ctmy8U`slEK;D~Ycww^zh z>ECqZJ~E@Yl#K^{pEK^*ft$g<0Rhl~<9j)HisT8TPn67SLw%pc;-_N%sX+M!=ehCh z`oUmyjKZCXHwbs6d*T&~3*YkOE*+b7V-*knPHg)1u?-u!2;_heF#fp8d}onLaV&Tf zzdNE3>ixSRtCMDa%%6V)x}v!FdVGBi0^p`B^3NSet{XvDzq@*!ZD{PMaKaL%B&FP( zN48JHrph=*OzKgsbRx?opCsTb4oF4~W`<%_3d|iHT8Ek2JqxYEaDsvlK!hr>nY5_x zPM5~Mdc$7S)*n#UdmDC{^KTq*0LfipMfR&dcpx zFgh##*OjLr(EI8&%2SIEOtN3GC@Zr{VU-V>R1>X;;}n+sml{IACE&p-aEu2~%>wmBYoenS)T3O`S7R zui>Ny8c{j@tnR**5QPnTbX0U9Z5n)5jK1{Ym77)FLzbZVvo!MTGJ^sGToD8zw1k%5 zKRbQrp}se64GMl}eKPm-^qLP}_S}oV-~W#7owu(){fQ^jkBmnz>SfO-gGxsi%;C6l zl+kCDjxBb+a-+32;Y}BWDV@oDXltj4>g7WfRrDZ9NR%~~Qp!q%K1lWgtvABV&RhYy zP;+)@a~Ctb@toNm4s_DGLWSq1wV2_j?dUbDOGoFtsZ8Xeeq%6p;+;P;SEnN9_n&_M zFMHp2xi?=5@9N9v-MN3?&CK>l+8j!xZrK<)e?X)xRr36WqH}Vwm@X;L7ZF2Gg+;ir3=FQ%nJkt^1Ou35(=&p9^h z9-1ybH&)s=fk0_JF%i|OxVWv=N(0(%61#YL)XuGrESKCtD+|*VM;Z0^h5^!^YHMqR2kyN{8R^dAu zMtOOmt~~kb65VoRS6dHMYYwUiwtbe$NLEvDC0oS+r*$zbA+IJURM7r%9t;>7!Syj! z00~gj&QSr_1abpN0oh=%PH0pq)E`6RnSu&0$n*QvlT!#8^@S^lvknN9un?%F-j&MG zp5nTCW)i;Q>4FGX&EDLAt{WDH3?3LkNNb*Z1c1VZIy4V}l2*k5{6a~)epueL&JQ@) zGr>}jBq+sBK&FHc)M0?DK5zkHNS?QmcPp3Vyg;r=u&>lu4pD%>HRdA zLkOoXKn`>RSOfNSV*U}}1QM6CW}Di@R_J=TzZwb-jTC;i!+&&&y(lRb12dpl@tZ?j zvN<@ydO(sGea5R_q-`@wUottTqMy4+&7k6e6p;bSj>3NUpnBXifNH8AHV2l_X3uG-$| zN;#_;2P3BIs~+3e-9VLmW&21wFhC|S?SR3q0x{`epGkn3wYYAd$~j~CV8NAP4GdNC zL!0A~Ey?slQ>y5bCRj0P0s)gw<-It_`>|ae$xC}PyJy_VQaO@5fuJhJ>nH~`A&?*u z(&m3X4nanzRl9@dExMgA9?*L%D2R~eXT7S|cIL82NKeVA*0=?0aiee~oq2jz@36F( z-slvPeP&3H*h3Lxk1_6Ok2#Vl#+&~+#s+6VTiJ_ zyDb8(Fv*oAhGm|LR;rB5tJV%Ryk6S|s(8K8TEF(`g~9aY0eUO>wax2=I&LrLUJgWYMvp+l0`HBsbU)ekVgCntvdgE6N z6!y(z9z4_c`{#!?rq~TiC(|S-dVbIBx1SeL!#i;*9W43!Iy^k*n4w@7N)L!r|%651z|Ec+?qLkWowaM9QH@sw2|)zoqI!RB_f)tX~Hb zl`Eu`&Amn5Q&m9Jn!OAYE51>vNj_(86N7wfR*;`qe7x)HeB@ zmSWvyR2Pg%{q%9=1R=tewx$KB{8L(Z4@3n&KHZjfgHjU#7 zL$GWUn)r5WflHIt6VwrZ`v$iDdnMZHpBjf2ZF+A-@(4=?qWVZepuh~-4&N6&bVose z>q9iz_%{eE4PzSCu}})0odh$&dS#Ug!J`@ZiY@ZIZnbBELONR4PqnWEkuLe(9Bq_M$6N5rpRqIbAi5G01E3xepF}uE4 z9hcj>khVGNk`youh>WBRI*3Hv4`QW<)6T~ZVYDaqdSL*0P!G5ZnDt1DQ7q2c4CSAI znD8k?93c?~kAojW@js{1znBQVoGJCDk{hADRJSkI&ewTU81rFz?ij2Th6P562>2}U ziCzrt#DSeyJW2U~J|Z7Gj?%9KUJSzT?tzEm_rr;Q8jij(Uifa8arIF2kGFWo;t2JG-hOG2OOVwc z`R$8?xgL4md5J$?=N#V@{ll)<+oPrX4PzbDgje`ZsrbBUz6j=a1Y=bCv8_%ll%5JZ zzkEvDkV^hhlEa#Pe_CbPdEDkxkGVTH?08r56($Y?KR-+p--7=i6YdXp3$r6~l~uZb zF&KYF8{TR^Yvg}$9CJ^x-P8H0%aVVP%zuAe8|du#-Cd<;wCJV!>c6nOl&}xN3E0nI z{9c~_oU>?ZGe2DL?>$W29nRC!YWBFbbI?v`i+d7g#B#!P^e{VJ6f$uN_^;FSSN~CZ z;y(^_O&rq)LqRlJidl|jg!-cw@9cQRdUGIYJ{LC^QkK>g@;f7bcQ{bw&wFG@Wq&rnmt}g^ZFuT4g`XVI2;DToignHk)DJXjRy>kFaRMpZIzRUnfCqLu*i%#L- zqQB_KNI8-`SgD}ovr;moL8;oVDZ^5h&xOiplUTXF*&7NE$I_2XmyTy;q=M0fB!AH{ zx-4@r>`s?2iB{KWfd?XEObNa=Df;CqMO=j2X$7Z<1aRy?QvjCaFq( zXv#h{ucboqo38TC+2Q zYN);8E-e5sG0KKPRnIu(boJn@^}nh_H&oNg7nscV*TX}nW*x4DFA9S z^;_Wk@{qJ9rK7gAmqSraqqEEvoEn>GrKUXrE5Ua(bnudFXA@4!E0=3&X~mS4^jrnc z%TQXk0;>5-Y8D2T2cXN1RLj-X%DWXuwp{Y^;bWK0S%vRs>ALF2nlm0+!t0G@OLvBVAg0Z?$|BNEPs2&7}zn>x~+E zo-fE7*UFpLsi((zDo2K_-Yuhs!s_&sRrW{&prWcLO^PjDNSFA~T*c$NCOBim4JcwP zHO(hO4=Uf6Hi3B*~0)XqY?ZFSks;FGoi7bc|rN{hx#`)5fV5b7o;&P7oAVJ~>|Bla^AYvaNu=i^!bf1U~++fO5V#oUN=5BiU= zbLA?n7yc~rMRKBKr!n^_+CPkF4@H69puM1119{+<5dLZa|8i- z!7=U1ZP7Ov{#@9*cR$4eFDEzdjDKz$^$dCs&x^52B+FLdUbftWDxS{pjLzG@wHZ3r(;o7j^A~VI0(?GQ`at;*OLMQORL#D5e=v zqm-~z#FQl14z!Sr?MS-gMR&Xaf{-G}d#dPHOxr7~kCYu`AD<4gp0G3$LfL^gZxf+n z!9pMnU@jiZfLV*_Wjk1Jp%lNkYxuo8f`VH-yeLAlx{y@`_Y+rcH8BfQ`tx@2aJFZENJ9lg%z1I4alkA z>T2B1&K;lE`RohGLpYn3y|s0<+Y0ScHn7|!k^n2#lIFrar=yn-#5Z?PPiXeX$KqEF z201skXKK}ZFPizzVU>4#-m)$G3r%X zYn2`3pPG~*U07P|vcdeGsUYXF9YoLX)w;q9_ne@p5u}~2S8w&_in&Kdg(1y#sl*Ly z=e~7-1Esv6_Z=6^-g%(#{9NDL&+mHMuG1g9*PF_9+`cigwTD8wb9ipy*T=k!qjFAY zFvgCbeq=C7*lpZn&s&RE(UOvJBU*YTR|9k1LTI)6axil~xb zdVV^0|B1|9hZn!UPnA4tZAxF;5!y8nxqK*c<(km>gXa29V^vb`j*6(ke&FXFnXqIc z1WBxz3$Du9Dr>V7$ki!pYhU!bjrw598&5mWPmv%QGok9o3#z6;MBK(Myzwbp>9VMrBrSDL(q@2`yFiL+L5&M&SqCsJ z*tagfHMe?cwx$Bhqt`~sO66gx1+-{uQqo**)tmh?rw}!NJKUx}+q#`;Y{imGv&$II zG>mL*8gf%n#LNu#ZN?a?sUN0}%Aex$nHsjuO zt(F)yWAEjxkD5y^|5nw06x9uWd5EtVnxLULk1Qf%!)y+aL||Wm0ZnqnKTT!Aw_zTJ z2A|b0j|KOgq*ZYQ46p(u2{1TqQ`AJoFJ2pYhN6Z#FvCTUXY%N?M zB9a?QWJP&aQ1L+UUq_M2i+wkGH}+;?RLpaJ4y)I|F9!452IBuZ*s(?A0q+|=dC#cu z#$f1TZD9@_8clceB&*G&K2aPywRdbow|;yebz4~5P6x+eokn7R?tyvPcZKC$M{gGR z4Df}`##cVvvv;zm;|_#(!n?cQd*J?b?t-0?v6)YfsKxxuI|nFpLd|FG zZe&R5mTYZytSKc;XQUztlloVK&KI`zF_NH zB0liczohXG&vNXd!hoepBL1G&SeI)Hf3e@6PqQ=VXArso`UO`C{rnB@j86X=)4vUM zk(PcM2hU?%j`?{!2#haa_*Q&;JH|K3?^=|#^g;%gC5$tZ8y|Ud?|Gk%vpqcVgJ57C zZvx%&R-OR10y{u|3tj}JOgMdRfDjB_k&scH3~2@&vOP6d`X$l5Y7EU>Fc5)2WP{Dr$t%a~D)a_VQj z(E3>N%^R{$&lQg>3SCfnizF&Le5{$Q$gpmo&gY+BY>I3uh#jSzK$se7vdqy0hzRVn zmv*(NUd5;Y;LSN*zcUPQ>2zKgvgPt8N%C_ZdrC_hP3w|DAhRpXfkHs7DtTri3U7#I zcF%;@C(OQ3;b>YeaVA+y+_ZZ(n39780tQgO+_Fp&jXxTltZ;Lpvnn~3GR+k#eF3n$ zhLyPa)d~-tQ>tnjuF{0+;I5Fdx(&7C)|Ey{VGYHO{qeowdtaa2-d((X!_1wBhX3-4 zXRiF_!0+u^_nB)Cy#5CRe{|8{A6<0lEkB$6?xEBTt5Y`&XP=tNJbb3>jpxO$7|1<# zhHc+pu&v>QD*4nI3UUqzGH$q&IaUgW2m+-%CWaQ#WYj1;J1H#b%@;dfy;YU`;=x%8 zX~`SchE^xd^&M+IalN@Jk$-qJdF86!w`|uUM)BZG?$Ob}Q^sJ->W_ssbZDJnZ?*s; zNSIZ`x1N4n47V^GmC}sj6a>T56!Uc%gzvlkYP>s#@O~t&zxb;Cqn~4>x*gKQGF=o z9Gju1M};B7H*D^I+htvEyKL@%b}#(rW6tvv`nqnI8nuQAFYAFCogX)&^r~0vmJx3* zrKL;;YJS;k!@8WS?mCv|3dpF#`le(GsC!YY`H$yXjkN|WPnaq zSXLB+HDajoS4)m^mS$t?Hcw-M`p>g6hidK?w=O8-|2B!2vnpBf-Ew48wZvsnezj-H zhCD>1s;^dJWlfS*drOzImCy#kHxJfQLAA;A3|iCI329>5P1Y%drk+@i$O?KFAki>c zmzV3R(~X!24M)7KS z0t6@pH-G?)a?p)RYoH6xyJ|WQr9j}Kr(HgvZSGK01$O*O2tYd^Nn~l2_!UyX4S1#m zUy()>Fv1}U>6~#Pr3eS;WXw(k`?|cH5!ppXk`z!fwb1K3FI*!W2jd@~)gE~`pdRbb zZ%zJgud}d5fAz5Wt`7S@;6JEv>|r_kn9+5faa9MRlBVH*`Ly%zk6=_cN-<}rv1S7i z=&ykH1KWWgT}ZwI_1TxIQ!+H8PEB*x6CIY^vVrCK zk+%;ee%myMkbR2g{>+u+intS;JYxSQWB>R#nWFRG*I745OFx1-b1?s1z4Vj7dTnCk z^|a_>`maYLm+0Q9kaO3)YSFc>-(+5h!uJ-9ZChh+8Cv`o4SM=}aQ zH4Ny;1biZ(v=6Q5QQi%vZDK{lD(`6>X7}qhXfdO(Zyt)vc$Ww=qLEgy*I+M@mP}nY z;OD%;{smdN*8!C6#T(YCFr}aO79X7O=54*B5($-E);mLb(p0vp+K*M%JOouEm^R`^ zX2tQHou!d%=CLUwW!5EFDcm_bv@RZA7k9=ALKmnrv?{M8YPUTR1A59d`oaK;Co)2l zZI~Pp`wCQ6h7gFrr0T4^!Y7t$dm4V!6zW_@0nK`mTJEJ7eQBC@&kFdwnJYGx(ukzb z;i2l~F*-Xz?TBm4cD5?1otC|YP-Yp`ovC8(>FKUlZHjH_%lx@}!I# z%J!2tuCb3VIA^kf9Yil3lo369&nYdUX-O;j;&tiYoK#uYU$pz)d7*PAo4)5{uxN+2 zb%)m`&5a#;)XeW5cgJ&~&7JJ3>2L1K?HP++IMDs39o=uHW(a5Cp2=XsIw6 z(l0pC7p+CWCx7QVr9Gpi15^G));&3&c=@)z_r56nqII#GHbt)6U~KB?ddKAmX{D!5 z8*4gM#!kKSs?dc)v!D2teRR6?+Pk zVLG)HCn|(CR@(-+qsflEJxFCVerbU@E83mc;c68jmCI@ezZz8j6#ruvmg2nle_#naYct6q7DVikbjO04Z?6 z(eBtHuUsAMo#cfQ8P&k#N7Gi6Wt1QH;NA~ud6^&XC^a8h)m5aON`?TYf{ zpc5rb{_7N#0(#GN!>^Lv5#+BS_jyo)DGV7wFs*`-0qyo3;rB@QXN&ef{ziCXP(8*w z&X4_#DKv^Y@Jc*3kBxEs9${A$@f03=%<P(5X7xIFxU%pGfbO+lTI=b=wIV5f)W2ZE3G~;iIc@yg+uSk)}{?SAJ zM8bL0Ruehvr5DOU)7TX^HyG20gSoFy$i-04cQ+UpMoPcdBd^-vjcDn=Kja^G%p11! z{}$Z1Dtt@D-XWcnJhB&VH;FFo!kwafE1pZ@CH?qY9ajVI>Y;Bf;)`Fvcl%* zLjg%&O6ssw%nTyBAJd{CxkW=%!V=U&*cZ^_E>5^qEckNKM%EFIPmYg3vFqy*oph0T za6)ChvJV+m3REc&hO8;AWk~lIo%vs#aVLs0rdQ^6!0apbSy-|WxRMlF%%}x&0^n!e z$fo$}_v|2zvU{e5S((XPbp9zI*$yacp0G@Ki@zUnCI9ifGvA1|HB z_T9cAe#PLzy(7tMhMbX1{+a2ue|OEXKl*j-;{NW}Z<+b#L3g^)^IJPghv%Kqtc>W% z8`fm*JtcI>fr?+Vy70_YQ1aOJ6W0zq6S?By1@?p3m4m{N*@s3zh+fnm-qADno#(y9 zlGYXKdE3shPd@65Wjk)&ki2n?pL4ShoOaG+w1la=08%8bUmL$+ZO@x_CSSHW$h+zL zN76qzY@b+QFVH(e@vDZz+j_vg4r+@am(HSB^?r6IAFRpct%+7ypkF~K&OIivD z@9Iz7wk7?80~~N!a#jT|w6$03jTWCC(+3kGYLKP*vxTmAUoBJN$v^v9Y41et?!yaT zd5lt_@Fl~!pB#|M5CWEQGk)vV;!`6cVj)mnAH7XahW+tHVlEz@;=I%QmdmsYh6)cJ z^JnuS8E%rO%hRGshh7_xR*9j!l-K8+h8eL@}}i0wX(EUq`T5h8ma-yMq-x2_ZsqA0;3z< zy3pCEUGcJM!_x>rmsZMkx|add4dX|3)Y=}ZE}^l`WdJnCa9Y}3ZSuE#ZAIkE_Fn~( zwvK+aE!^_8^}=ftA632VWswc(2A_vOv36uMriu4GRDn|mdbI~ zD!U6oRLy)ENv?F)k}>6q-~~eUEW4V_56~ASOH)rz(0M&rEFs`Z%66@)^l+=@jN$m= z@*(xa8TH&0r5ZfGSM1k)is<$Gc8x?!L2jUqE|4zjXujy7E3E(S`8-wN@f?{AR&!;0 zHdbWHiitcxnn0j}z0*8ZAVY${WjpxSou|gKJX4KusTh6$3FrcX1d{+rmpormCo`OO zNlNmWEGaMR=jj6FJrF??VpR-o06VD20CoVyXo4>aWKcLq`A%|s10BIW@FH>@uniPU z%D%KCxMO(Dl_Cn9^bkA)`{O135;^!15nM>Y+D`rIK^|n$PyW3H-us}~enaH5I}j%K zAp~DKxbXGS8E3F-8@vQ2fOi240(-8v-nvojWyAUY^EiFPc~Ge11?ak8HFNg2Bw@zron!^@EkPTP9eJ*9qaKr9iQ}Zzo46eQ#zh>5cD9Lz*|<)(SBob zT&}uVz5{e?C$g90X$!r;rNEv|m>r_@53&ENi{aUWp^bTE#3&R&)SzT2&v=_8dB2N5Km-aX`pY!#3o90WHFHzBjUdgVwo0KiO!kd`D_Sx&0xYjI=fk9V1ak^HlBwUyd-OA?lJCX1!hId`V$ z%{w(`izF#1`hlaM36f3myURyLWQZ2n>dcgSU%$bdv)!2z`^uRvk|~?mOxa|v40>9~ z(1mi8Gf^NxWuGt=Q`#DO^jTV((P=s3c`a@bz$KqV{kBpKLDuWy`kUIWwsfC3M;QD< z3|*=$v=MWoik=#Ja!D@yZ&m3_6gM?|)%vMLNwG|6gcit-s>l9D(ki@?K$6_4ygQW} z{_qviZC&#ZjdfkpAKI9j{^61Sx9^zv*Jr}#b#=UW-QlaX1PmhIm^z{G1rN&S~SX%bMk=&D`+WGynUwBNgB12OJ&sdX6y? z3rkZVf1wb+Z3`Ib@9fn&BNb!cl4ow{ltYR911E)5Iqc$+Yi{l)T}%J>ZiIAz$q+JP zS{JM;K0X2k5z*WeGu9PrgS73Pn&Yf(Z0c2t7r*qdOoT(%Y?%9(2j}nHJ@CgjMef*H zeEg(8mKLTCS)VjZW+T;LL-VXqR5fQt<&>(zG@9p2ySdn`xo?nsm)63KB+(Kw7*KUT z-{r}psxJ8$b@z+ZFmcO2mg?XEK+1KOH=?_iL`!{Hv~YoTjc?`wCA>hgauxBR_9N@YI~KrMN124ZTnu#agBs z^cGMIr65I{8Qq}$x1W$3!CISqtO?BmoMg$@< zqsIU?xp6Go;|W z%LR|ZdaWI05B3m*AmFJ2Nx_-`S4@Ys?cHKihreeM3}}MOVP8bOPs{fMNEdKCD6Y8T zX7EA@1s_zo9V2%2h@luy72qfU)DtEtQ1YP>h~O#q6iEU}uuY*2<}1nALdD0ha5qjo zh1?P5ehdy#3^;WZxj#J;d~s5HTX*NHH3wMy8dDbGS5RUNNe%WRVSl`zUp)}MS-QV* zolo5(#Bnv-A9-uv1sBj!&=03E5XD!4*8y(?{&@syBJ9ph8IwWu%NJ@FuW|32f}_k= zu9d@Ze!58Ngc_sLZ*n~HoG_>CyM+6Tqry1kpYC+;$*8G=6iEcr(O~~G-rnbVey;SS?>y=!{&sEr z&${hjorRd`9qqOES z%$uywAvJ{XIt&4aI+5+eB^tg3Tn~J;i0}U*_?e+L^og#`v~U1N@5XB`M%M=I@w9e0 zhjl~P1$@WBf`$_4NziFQxo6>i<8;`2S|1c_CRo!bZgMmfbVU4Babqyr(P1WI`i?Gb zOG3It3lgImZ8hkv8h^;69~I$ce0|my)5X*((=<^!v`D@}prDwEq@`7ELNold8^5Zr z_idXC`xo5Fg0Lh>!M+M|o-kxN1WaYx1&TBgq@B|7j4(A2Ac);SIRQ1_8V7+iVUOgz zd0R^wT+_rCyzu(Cuw-ES70m-0G`Gv~FprZL_t<0k^kdU{%B-yd03^uId0Na6A?asa zVaP`CQ4T074A~+K)N2b^OBj$8c+^8!# zmxaorU9Ph~OE$jBab=SX(_oy?xRsx^b#*O!#Z^)Hu2&W2HG-9jPD@gdv5O}bl2;6D z_|$dgP%Jc@a3>3s-#fhK_Ko^rY~k_op4V=k{I_TO-*d5jIz9KD!)rcuefn1?vk#6A zzW-ADcOGOc9`8D|I`>5iR;%WC&)cM=1%0h z-@3y-vAB58$&FvUEp`1`KkJAN%RaW?j^{`h2w299(3Y;~rGt?*DaAbf?|Wvx_RRc` z4rT8jaYq(nR}2mP!>yB_d3gHEPi5~rnYsJ;z$aeJoj~j6E zr91KuAM;Mlv*WVs%cup_cv+%~eW`*cn}K!>8FPcj46dl^mqG1ZaRsTGr&B{+t+R1i z)XqR99ukAvuC%O~8XQP2MZ2xVF13JeQ*W(OYMZS5wdVC@89Vzn@VyNMZHcVsso8$lN8oH7 z(!P#*OWO5!UHWNjbX03gW5KP4@8`sKtE}@})7Ns7+!#|Auk(3pfFp2rL9yW5d=}7pw}e| z&N;Nc!+85eJeE;M=E&0PxfMeJLX>U%nzwnPu)$*)wST4@4z^NS)|QtJ$cqPqgEP=X z1$FxhZa^9lK&C9auqQxRI#1=*SPnBqo-08UD(7nFb(^o*>OV8ZZcquQX9p;H6w)ik z^e7wsF)}uYAPEBS6wj4N66Za5ian;`xV9yw=4~!`#4LJ3B5rWegV0H)d2&V_?-J)* z;p@n_kmM)|kE+;u`oIvKa&Yt=d(2=Q8yQAu9ohc{c@fDd7CyQVoNzk7 z+1Goev;q5THl6$>ZF))c^IPHa>~1x&n+ALEl}?NTHvt~-wP9NQig?Ero3dl8!?%Jo zxIa82!Y91l(*Caurbb0qfZ_~~3O16Y&2g3yij$lTj{0g&iqKL2h;;Xd1V5*ylyjgP z3wx0-cymK|{!A`rirYF~`iIs}cgokV;w)htIQl3#-#lvOj%nvzAi6raB!iI*7LOS_ z2SKL$gsz|89gNz}&+q1((AM|ZPmy_fSJz*}ONY8*ZygT3xGVRcPV}{52bAc-+HE+! zTTSm%a+C0SF;|44(TIR6@YfnX3B&+^5(a(y-wM;8Ds{d&w8NqY?n3V{KEILfka(<< zPkarBG(6mepZzz{{g}7unWOI9PqOZJkBaC~(Hl{SC`+TRFuEeznz$T}#Z%VixY!w^ zZBg22B0&U6n?v+Q6Sryf4=#R?MJnxCa}Lehm@8tg7>wuqsRDtaRFL=J2c%IYiXE|x zX!hxR>G=hJ!4bNEAXW5)CPM4te#Wi&Y%1HC=9hOQ@(S6)QHU+?X6#j-VyvF{+%hzD>2Gv{IZT_JZQEd2>~4?T4=Ddg+Gz!Pygk zdf&(=9v}M4EA*Io=DUZ6U%pZAi56#y=5T!azxJ>D>r$Ps z-ZJ;S!`^JM<7FG1QyJ$}+FIXXtW7Nb`UFXeUNR^wnS1CAz^Pj|*eBC-KRVR)nytwf zuTTHxMDOdiS*zlcU*GG_6rh-W*5alJX-r7mu&(psK`-l0-?{J9d+tKaps?ZWown8| z-O1e0XI^5TTAcjUL!pgbLQ?3G!Oq{kX!_&#!w<;P0I0m1dh_{(M@LErrbWUkGkleC zVlUnlWS!FPF&VeY-Qc^v))xzH>CHcUk~AsGqN1;4!m=(H%s+Yx0h1I&PKRu7nD^@oCW+t&V05r`5F7XdY-<@`GyzHgyGfq%S?a5#5w%%LXeg}-wKvNukaFFnwT991*6Ayt;dY3njT-WWsotB4X%w256kcA$ zEUMvlSTufJroOYm_i{Z|m$l1M-o&)d0lu$9M7yjFg;XYL&Ay^N!d_ZJ1Fo%?*?@Pe zPc3>;{UXj1f-5^nEpv0LmqD)Wo~kzF1;h9Df?1t?Q*F~|TWl>mH7vrV@SRci+^Cir zBSx!ZhdL?C=-|uIVaBuY12Sdx<_aP2(ggzm5H;Z`6dXuVC$O?_G!(VuW*d2m24Zl0 z|E^;cHJdn<7jVfZt#+W_WSvv_SKft`6(LkHimvgtU8IZP(J?At@?!;EP|U=FO;)pS zX=aLOJX7E^84=UV#E1@yqDF9Z0RRc&Qb0p7ZDR+IWve#_m=_%a5NSX{xoaG!;O4*ToiJ%PA@%!`q`3;xeNS|ua58*xGDJ@D>4!l||1OE;P?5&pMI3%~zV z=;rPVZ!wMo4+OYC;0KDHA$*Vc6u{A`Sbti>c3+M ziBsQ4aVLbJTYwF~y};ie#@9RPAn~Ga7#D?RvoO|STEit5(uD?&0`oBxZ$KfBGfAx4 z0C$?^|0D12d5WjTMSqU^x;Pf4P77UOPKD(_MBfmL#q>=EwnVWZBF+no)h4Yr=mrZn z>(m2$HK3om=$iNR1s4l8=1N#BxhFFInVgh>7jU4=Rbgpp>?;+hnsp*6xYI=lB1!Bk zk`%qDyXTIz?rh0EnJqgAEm z>HGLA^N*jfcaLaY(dv0PHDBm#8S7R%le$@a4Hs20fA#-m5YUX~D;btrt*B-hu?pf_ z!EiHGRf3z{?QvD$WU8y@iCVAUR(?yl?y`El)xVYkD#DUiSejrZ_cdfT4sy#`+o!9m&?*ZXRVqlEToEtpta1Un6&~C z322A_+yGN+smjZMYw*35fQAyQ=P>2|Y4`^S=O9tkh^@(~{|oruhPLYDV5-lSHYHGF z+9la5#Heb!T4?hXEQzoI$6uCgTGD|G5W$etWPZcsF*-t=wkfPrGK3Qgu=IMqGUgCX zZENi;OUHPQ56@CEgrMQ#SH_m-_iMLp3Z5A!0t8jB4RD=F5kYToUO_~fP^UBMz$}!4 zE&=dtQM+lKym=kZ7BQ7a87>eibuq}06w)etSxE9^E;ukF!dlrVnA0Wg>LIzM(|>H7 zED2vBtZNtbu@i8{CPP9H+W`tLLV8)*!;G@G05w~rK#?IJiL)-JZE^#savxY?KniCx zxaWxfpzqH1T3e}P;Q%=3BJK8=xH)=}iCJL&eqa5~UUx=DKN?kOINw72s}>ELN>W;( z@WzK#wh;g7<(pnC0F)wvBN1~TT-3zRXAw){Z#3M`cv|7b0;_-@_R8E(vZ0HUiBGR~ z_h|mULgeF@gl^JGKP&R|qWQ}8LWlFyF*z)OuzUY$kz!UM@1YS&>PUvY`==->#OAR7 zvst^Srf-Rwm*B_!cm+@Zeg%9B_zj=~zbo*ze(luN@??_fK_y58v(R>RCjYp@esIz~ zVJoMn_+uyZ>b}kociQ``(2ad+hU`ZJZIGSk2;D}0-XGpf*KNY7PVDT(EgLoM4aNr( z%nl+$xFvxRU@E|uT>M(YfxqX`-F#+*;y&H@W|}JCXd2N6aPsTHmrl)n^$DI>QcueEQMi#?KeYo3Ln@}O0BPMl*C}nv`D;?6LPJI#D92S>ZxYVHYHEfj7 zh#qqJE*n;W#VqF+J(+fCzJ&QA(k03}A_(9sb_2Hkt~=I-H>YyDrzt=+oEd>g7_z)7 zRna$xVqLFTn|p4)xOa{LY8w^}03a;QohquF=Px?`ye$k-S(ggru^`dR5eN*@gnc5b zNt!3(e&~w8_R|lKS!yVz1Kv*N;YGre!we)_K;?0d)gTGAZ*^y3@; z<(Ax|Bm4P&zm}^W6iXjh(CBcSU$pXZGRKx!vP_&dvPh1iK&P%AM&SiB4RMJ$~mE31J;)A^p6gZsny~MsH`2m zaihwVO3$2;F-w&(B{RU0%Z8ojr&Zd9E&&CBAm@g!S?8ag_s242PX@tUA$v zyQ=DaC3Zb}^eL-M` zsZ}gh0<~;UHxbhQ1f$YdI$Gy;|CCd6vI;p6l8PHEV;7^LqZcZNdo{p z1ws06U4V?O_D+!|EB@%1$?>`95i=|etQz`{0Km{NQ{<9IQKQ1XJVgmpZ0;0mQ)=Hd zDTWjXnB9QNhAz#-ur8s=a-;%c7M8}drQqlSfguRKf=1fatF>+2!RZWVYy?cb5z!x2 zb43tA2rxMBfk9!Ns0tPcD0&-jhjZE^I^zT@Vs)0tcYS zKAGcp?{zPVB)&WpO9(GS?2!9IpUx*^fZV??^2tEmabD*u^qf}=SZ+UGu^+xK?~`D}2q z_MWuX@dxaQa-A2lxv zhyNgK?>59Aa$3mvC~n(=)4eFV_-l#R8@L*Hg+XtR;Z|S{NE1Ft_%}h1uH%vaF427m zZj-mK=No&mU%|BzOe=41I%1na-dfm8bH_^KliukAeu0brd4@O8L!FUOf5Z#x1yj!? z!}(OG&|zsE#+HP9Wm3E>f{P8>q`@QrG|PC_j7>_x z3n*Y>hJt-OW1q?fc~2OEGzyBIDtf|_l^BQwp^G5r`tx?-`2}yTq(zM~+75EAD)?kb z(GVt#B(cxAXXpI1D-&kLmR%4BtlU7^z82D#-jNa^ttr+R;4L`Oi@N&Ww%Htvc+(|+ z!6m(_{BA@J4FYn703p128$`v!i|nehZzVKyU{=gNlO$H$6o9Fb?KM`h^kIOA%JQ`o z2wKc}8wy#Dm(>RV~8|8CbWZ(=wr>D>S)9#)(Y>jX4E*zQnoxq(f9{ZDf zx?j7cw9pMG41jl{OD*oF=^q@OOuuNs>C($lN{`10IS6WPblZ2a2oC*Jq#@V1_= z*KQsA^drgZ*G4YroB7Y@IN;8gZ_3<%+8IfQHgsq`;r#9if1wn(L1cRmh);j`UVEyr z^_#DbZtc!Ibjlga1z9J&u`_nvn)z?Uz2UG(ZTV;{O3 z46>xk`=M>Up`AU8-`*#zvZF8r87F$#kUkjC{QQuN8nxX=W$oxq8&uXVJw1k)RSh&l zoO7c$Y;Z@@-sqyRw6Z+u&*URFY*as!(t?%-5iDUgmQHB1O5K=cv+N zq25Mt(+0k`sNS2iF0sp@vx-1%2yPECtBT#m9bh?~6IX9Xl&ffJM$-^iT$0u_*Da8@ zsZ6RM?gq%-`1^&Z(y0;}scl8ewFoQAleONiI(%&1o!aJYn1hW&%ur00jzA&rVX1*B z5z1&ARIwW8+Knk*dWb<~oJzoC7H2XD7-mheM@ZY^s@3Ac0p2@Jx+vd5q3WVvfnuN< zKPF=b&rDL$N7=+hF%-)S2eeC9sl^hf%MK-L*%`!83`0rg_JO`kOw7R57IIF9|r;8D%XM57ntN}~P1 zY>~Vdb;UnCczLIo1@cEgzbe}Id6C~S)glUiQ3`)#F#2{K;PC=Yzq64Cg<0&{)?U`{024I1%L&Uma$5ty=8t z_@d#B4an|9^qnaEBCemWTenI3hlX*Dp)L}IHQ{f*)Oa88L(rRnzu!wIb(BuRP?Snx z@rQW+(c&Zjb7e8L4;T;v4h}Z<23%h4JEETJIs!kLdtY zvoJSMbQo?2zq=oobm2h_M|yDP6b?O%Q(Nf?AEyO{fa9POpx*}GOmx1W2)I8*@^;;Q znF#H`-lyPeP`%JMQvc1e_jQTbOHJzd|5$tLxXF$xef&99S6W~9_Z@f3B$J7ILP$c0 z3xp6fI4o|v3oNp@EG!N|10=)=ad*#T+o~Cjz=^-s?TkYp41yXr_(s6RX?p!tca2+ zFzL}wn^OuCF1A_dw|T_EK!N-7yeE&Tv@1soJdo8Lw|R9lEYBIrlVT_)W|HLP953z2 zmHTHgJB}KKuzLXD_56^vsBrj{Ttz=x!zA{EyY2&d515^?OoRBnPm#sq?k|ZLv zhAsrKVj0zBT=&wBjB4z$zp+~W1U}pSFEh~>zzHTzuu|aa+fxq%)5{ncWvE=r@c&ns z9tP-CRulzFkl@Zgu7WIw$LKR?*2^`ij#3TJIkX(tq15kGE-@T0ZL!1M?_J&UhPjc> zxHFO`z)e|uzVeiHAU*$!Cvm|^zd9^iqi)uje0+byNj*kqqVv23vE^-3uMHP=Oc-+- z+h#RTUjqZNC2gZOZSMKR@#Fv8<>s8e&z-#EZMXM+=46>PhJW>H$91b!#%{S_p>jNL ztkC_QW6a*9mW)^cwxwYY>+3rYw^v3maR-?6l zYVxjaLKBHIW=9sZIQyr1KY2>y8S_Y!gWrFuuw_K+NPyvuW*aYEDx=2K-#5q>|GX*G zWIle@Jkb(M-@R2fM$66NrSi$M7joXoy>LJ#O&@9qCT}vIJb$^$6pHH(iKOA%im35i z{Imt6%luQj{Y*HMH;KB z2B*jmBNCuQmEWpWhUWF!EmYZQVBEhHV1_zYPADHa|B@ntOWuXbpXt?ArA$g*{fP;s zGfbsUC}kQ{w(JCJ27DZ}McI9D8GuunxWn8dTb&VD1^isRo>d~ah?o8Cr-}eFz3$~P z6I=*fYKM|4rCvwWY_tG?V9pmI1vDlO+Z{0gxE>6RIue{JB5xz`vrZ);yG&JijVd`4 zGbH@>RbG%`rihj8bWArtx`!fKi8BDc)_*(?L1>9h6Y@(x1R#a?;vq6MBu$iVo@3ji zrEQ4ma&?#c&+RZZ--?DOiflQeH3nT)Z>$qQ)D%(A9Rh>eW2~56MW&>t2wSdS1#%e? zO}}cn*Pl_Z4pLkP0fJz=0ANZoWN>dCgW?7ziuMD0MWaa(9fs!Zn#BFPNfUt%(($M( zt}kzM9^I$L3dAgzwo#MmZ5|EayRYe2@OK-b7+w@Hk9ZpucGI6`Ww*}z!5e4kvtXQO zoDAblz>NhA{%BHtZp%k`{@z$I!k2D1eK=Ilza27zi3;7GV}r;O{NLU%|70!ZA1=IIjUK zSKub#@;;0A6geGL`1ZgRZlpr~QM#@119hsP5{2`N?y zUO;Fk))`7+vY^IX?6+tjqd6e~rFg&_&do(GUuaJ440 z^PNivf3Y$9>X_aVDUWxp$pnL41%Me|(bXD_&TAGA+^}WxiGHIkikX8jq&1Y!ZJLl# z&CR{D#Z2SKqvvjD>GOU!kx05vBIL?p5Jjw-{gyfnb(F3 zdsC@bhN8X6#osxTB3kB^A=g!82+#4l-m$XrtXW>cO|I!4et7SJFFoG%(X~w%F5LFs zd(4hl>syz%oHko5M08o}$jw`NKYP-FZ#)&9-#qvG=Wf0H?@MmGYW(k8(@*T5^QjXu zyC%8dwp_GGZ;KTNGU?4D(fLi}F$=PGPbSy)L>9D+{^7O!_OaFLK9qiT|K1PX9Y3nG z;pD!7?>!@%BhF~L@q)$8$M$m0w)Rer|NMo_Gy5V7n~lCEb`?k|+cx@|+*Fah@_=Ag zERqo}x(JV6FaTwF{u)uiB?2mMv*j3ljmlpU{2+xll^2cCQg<)_7Q~9lQ^cUWqqis6 za@1r&?{0wO$=NOT!3iM+3a+-K6%oxjG)@uejoWUfC_9p}qapwB*7zl>vwwf7@q=f! z|Kx2$@4CTQ+EwXwCg1QLfGBIX>y3}XoOAg-=GS?P@o{sDt=jA*@5gc?^{Ow$&Y(T%v_a6)KAWY&wcKYnAO0ZB3;1oIAh7BEj(59wu~X7!IavnPH*S9nko_q5lt>?;)$Xf z)e!YWY&Qlc=?9y+=n1^x0Bw!awT^|90! zUH!AtH6q?Yj=VFP`j+0b0?KW&?uD6P=go%Eg=XgABCd>5`iI5%Q(j^$VZE|H{cv2i zWxWks;F9PRoH!wJ*-GO=BxW;#3g9IGfh6!T;A9{M><9lR(3<7b1TK%!H^3(Xj{@fd zA9HY-07+zl)jHam@c{6q7;^KmVMGo#YF3`2E)TePY8-l$oKc42#wel@!m;r7V)zwc zq!7!y9nH~s30gZ(wYJ7%3As$-G>Mf2185b^Xr+u4(f<_bs`rRS=wHFC>tL9E3zc0G8?87)XtY6+w4{@7@b zW?mS!4`ta?vOxzk5qXve<{B3@g(iZKa$;MYF3&iq;F~7Ivn*jO|Pm4|jxgT96UV z8Z9_eR-`ZCWNe{{3OD{&k#vclhlrc@rv|3~KY{h|x)IWiRJBgPs>_F>s*A4=r;ZQ; zO~_%Al+SF1(;RLo;$Zpl5f>2&fQx&kNEh?Ia!UIteTQyXpWZmC(pG$N%Yv_*qVmqz zeS4g|8(-FHCiKXHCYdyc{)|pwKSbNtLe-+_Hb^+pDx+G||Y&}ifrFGlCLv|O>$%h;J`4;bBX zG8$74>`dRYE%n%5FKe6gnz}!IO8(VBFYk~BFbh+cO%ZGVWQpwu@+9d}6&+C7@gn;@ z=M`*`G;2>y2zZlu*&Jgp1Vahzc%%g|6d>hzqAAJ+hddTUPP(WsY5a9%bG{`7z6HE&sG^6-%LVYC@f&?q_rv%M}-D{Ad1j;^h>SApMGx>hOxeUcZ zk*VCmRBjaC&uG25TZ3-vZ3|Sv8n=NvRfNV$ErsRRC9-^Zk^y33uvePUL_|ECL0g=fqdb^~5#G^acpiu# zYhBTy(yFBwy2O-)p)3-SK#AbL&e~#mJDMY~JaIyw_rgImMo=Dr;T$UT28{wRnj_xM zaW$F~g2=xt!((_Xj_DE&5w<<=-W}v0SJed47Q2d?qa}qsSMo9hY!3wmU4ofRjZ;PY z@0<0r=5fw}Az85+$(bKm15>kq_L69eg8)~dIfAUsS&JG>|5P8l9uZNa!5o~TBU59` z^EQrBT!${83pJE=9^MB@6xYFk$7(po9tT(JItoRXT1-sj;SkG4*&T_@wcOWUF@I(M zz31qgkD=x{NdKwjD`>d_xE2_H4fY+J9^k}h#QY^VXmR4}!uvaqen-u@L;GM1H-aAl z#UFYFR&53#-mwNxFAlg9&cj|<+wRZjRxYUBcdgA3S>`cC<3E-Jf>rd z#C%|$#36#-&W?Z5Pj-e4@W_AY-)D0q(W->*XLo3aaR4w@e6A3R9>VOk#o@ zrZe?$92^$W{y)L=a3O@!CToaAlru?OY{GGy(zdNCjdBtmYqZYAbcBJ zP1u7OCspjaZbjF%E1Z%1hAZ!s?a|q9UlCc_I`WU5d%yOKop-w4zOtb`>Wt=PbEJ4M zV;wjYS#mu97WKU9Sjin#on|k3; z@`PUZKuWeo9i`Hb?j=n$owqQ*Zpa%cLQ-sPPhsz*$`(l`MO05evHf;AL8XdXTOzD|1u<#lP2^=)GIU>F z2?;QmybfYy8FhBWnG-gr+)fK!+TFp-?fe%kE95ra}l^t4-*p} zLlv!EwH-^<@L=|;fKvr_hnB+9aGW-u7$t3SP4eoso=PSSWjg8((Xbs30bC6%f}+Y7 z866HC`tM7(gA&geuMFmV9?ZlQ#9OY$H27YIVmw1l$`w*X5ankKah*p*W-W`OT? z>RT&XR9C*zW#t~E8XKmWTCZ&KL&P9|dm%vZGbSm&Em3q>&K>y33Ut!G*-J@9T~5wb z;+e02C;!f!>b=EjuzO~~rZU2)+{YB8uABotY_A4!0(6Yv7$yAso9YEBbBaJ3Vlbde zrtQ=7FIBvB2|#Era#_@Ie;#T>@UT!Ff8k$g(1t_N07~E>8T`tH~)M&Ehv4GG7 zGeZJOsfTyt)VVNZKr?|;7Ih~?Pm_77kT+|)zqLmUO(2jl^5 z4bD~gJ+KGV2OPzCi4dPpp8#9nJ9PX=q4y$Oy$`czp>GxyfjGDgXcUOXsSP}Qy%-dr z-QW`%jkm!W?u%UsCk2+!mO+5q0mbMfECOu;F9Lo50Js(S7N`Ke3Ygo4=RwaMK^(X|f&t(;9fKK+*y!${78m;+9?@v7;A4PBU^nPV&_y=ZCh-9St)ORt8y!sK z;bpzyw3p7SiGnwrbF(_RF_B9PHD&5@|we!k=V5Um~t9han=8EyX2wapBkh#~YMhR|u3FrAG5D{X(jr zk}`@ZOw)AO^e>cF%KCLCC~I~o4B4rQhH1&Bj$(9j<@4d1#= zWu5NpR~PrCG6R{!FBC-!f>_~s?ITsi*uelJy=`=j&h9pfW^-Pm;g!nt2Mee~X)qql5{ zFK;vQc5GEgVegc^ZEWyYFOjJ&zUAuO@4hqh?1AKovj)HS%*bCi%=y82*>!{2rw+td zcgv>8_}@0lR+D17)*hd_XS>!GV^^`O^sc0D@1XLIKC8K~d)ygH8NH1RDA$wC5fFJJ zIbq1sQo~SCmMa@0AVT@x~Hu*W393|360VBcC2 zU{}fR2H6tL-rX;oW7dw5md~6c5@znZG-k}2aRRj-u?;E5(A*mZO{JY`RE&0#Li!pe{hp*jg|T?IRTPmRh6faF?V43^ zJm;AMWNLxYizFT^KqG37!l^jKB?cU(sKHT#0Jsb=HAmb#w~--5W5gGQ*mk{FhxAL9 z(5y!6or0;URMC9P3LekfkL(qV5!fE$x}4Xf_Dylo@%IF{;KKGOs>9Hr6hQD4nG%vv zx)_0t~dq`hf_#C7vqakr5Y}A_j99&g+(=JFf03T_;me z%mWz`y5<_%l%cr{X}R%&gULKwcC6KK26Nt6A+RbDLhmu1-4ph%40%Ku=}%c@D^^N? z*->1ujaCyyxWhRDpcFh7n&hH8_=9yaF145e5|D(f%bt=+qdYSStT&tK=ZDzwl;wy> z%}QLoLJEk4oP6w%mvgx2NrOZQX3hZTSZ_6RuZkfVIm82NDkV#$X9z6C6 z?!N?vXAZ$iR;ftvf641BLT`M&703;x-99S6^V1#y-_!{u`RsMn$R7kD$;PLWYvr%n zwY{9U)|jDoStmkn^H|Hpix&USIsHF>b>G*XAx-E_5!oC$_=6V`r}ZuP)|p_=zHrFs zN+j2I>+P|j->(-5qwR_%V>fRdy=ALAo}d4{bLV{K#EqBVGWo!s<3~O@`QYx&m;d$X zr{534&TH>j{mS*}Cl4I_;qx7DS|T35mu%CMt?>N`qHMu^$V*bt(kBGQFBp4YpQq{%R9BtvtD(`0J0 zEy@MkcUi;CEJTpZ!#A;(eC=S%e_v)S>+V0}dvaE@Dq4u^ zky94tZhBE9BW}82?;JLkb?5GQi4!^*rF&cb6CBDHYOB4%_yZ|)ITyi9k_=}Bm~;`Y1nRBpwc-( zE{WvR5PVhfD4F&8QQ5DvFE50METuaFb}!|xN=PwK)6{NNlsruZw3aNp%V%Ut{DU`sOG6>BYzZC+it1|1h&`0yqD!qYFaoDBA|Q+l zuINtaZ(N{uPdbn6f#b35$<*^ifP#;QIN;FG1suh;OA$R_ftDL6<2?vH zNl_1R4>T5gZVz6Yvq>0pLf&@IJC3ap*a>n0McK z-JA>K4v_f*)0Mn*tvC^Q78IE+?LKHt*kRM&Us_+dL@t{nQy#Df3uocUC`N!gfkVJ% z-~oU^kAc4jWWd9q-GBxNPzIO>MiS>G(F#6r9U4IlP5>D|0}4P9Xz-hlc{QLDUIVQJ zdcb=#$h>B6>hOkF#AY>6^h9hK;f?{!Zc_VVxI+^ba5S(cjsxJmz%Z}~ct7aJz`9p~ z2X`A?mXVCRjnNHBlSs(C-7=QdCUTrAAa8Tg<-9F)!62nTnt&u$5R90q5de?ba$$S% zV_Nm3?rzERctON82mwLa=LcDVbV(773*e$lh9pU(6g-BfyoqAt(Jk>c?Zdy^=#Cep zDZ%XDUL+cHW(5hba&vBUZX;WsJ(4F~RHm?mS8&Jf-m5j4GN!Y~B+1LWUe*y&DWau| zO9RoFtii&-AGaH=5g9XBF_?uey_BVFC6hWy5q1>8E*q^;Rdnsayo?*HxXcFZ(L(aL zj+T?Vr(PJ!tQ(bat->5i+``xQ*O&sUf@{uBYRyLarQzuOMr$aKS{Ko^ftjeZl2-Ea zlrvtGQH@#6Xm#^11g`uI^b8@?9(aEV?F3T^Nl=LI{j1UghyG)lIr+5b0kSA9e<&{j zR8sPkT8k0Z6;4yDm#{v{6)Uv^0gUX%(av|Rn*X)aHePXiZqwL`TQ1d1SsX7Gc1=c> zG$)p|9r(_3qyN}3|LbSAUA$=YwyoQ)yQ}fcIcxs+ywr|~;@&BDG&lbz=XJmL=vPkr zV}9${@u|;F{&UCX%l~rJBk$GQqTAnk`%y1npMLt__RDW+f7j}!bLZQKGR{O^?}%F& zt6}ZDNK_LAH@|hX@ajPK2T#zNBZJ?2MnrVQN;aB2QD{78fjd!1J-EY77n`nF?qn@{ zFe77nY-N|qTJ}KN=uXO(NOVj|s3q%yxl;=qVVx)*0 z_P&YesxHxFLU|A+?VBdu;T)M#>q=VNhJ_ZK{2(Dz&VnQgPMa`@St*JdYBCQZ62d(+ zmAGh?b8xcw$^osXVeVre&potl`0KZ|e)RmV|9$J&_a7Sl>K(BY7j^&U9ilzaf8{T^ zV7rsK=6}Di;eDqMUH)?}*jihx@WP&s-@KEg$o%5r0R{LP)ZIDs_^uu040`i1tEmm1ABzfB;qoCRo);e z7}f+}rYqLVlbNdRbV`N=^+I{Vm&AuMI4kqo8th*BRz^z0a3J zUj-GH5POgti}LZ|l2t?q?jU@=W=8mqFc2);Kh+@k0B8az10_+}pbdwx6O;0wp%97n zDqTq&8ZNMDF7U3#%d_j1%@)zo**y^HV_=u z4!DCP6dfo=)To~A^@67m(I^rJgB`ad0xN1VdHa}m{|-v(foKLIA$YPteGPCGGIrVR zx-XSfX`TH0XjHJFL8j*3zL}CHC5$qvrp~x_!6Nt8&2W_h3lK7vSlKQ*6W+52;X54g zbN9Ctw349Z_pks(bxajW_ib_%B@O$otz>GV$pk9Z5@?uD{x4WQ9M;Clr; z_`DPU^R|e+pN69_bQqcoQXoxv()Lu|CfkAS5m;+7)l`vl4rzix%J!nmTV>qHZypB- z0`NQ{vUi{`Ww}$9j7oT(%Gwms$k2lI$#O(glkKKAUgRSCZb`vPi%|N>Lxt_*Y`H=w zup$q>`4$I8eGI_MT9KuVEpMLJ|ASWxTPL(8vovT45?Wh?0OcwI+>8^Q+mJZ6GrNA& z9>~E{0p?%^SVl;8MF6l0j%zz9D}GFejOn@8M#&^qth!Q-6<`p7l&Tz1Qw2A=pwZ}w zXSPiyj_sU!ZbDiwW5;y&f9r|tv-`~@E$L_X!w`$_db`=v zu>Xq>=pAuys$ec?whyJ?DX-upR`zvN-nu@O+qPW3;f6!1_E)mF(Dp%x!@}>%G zdDI+pUfM6>hSNWlyy_TpRnNe6e~2D8yZg`YvNsR*zy0^UzrMcly(bU6=MSmhKh^p5 zE1Ir9&Du45@S^|qhSJf~7B+w3g2-|6hOhj&z5akcr=|GX{+2IYl(_P^!Ha*w5gk&H z`nc`L;DY}N&o6`>-k->yO}+Yz^L_V!Ie?U08|O@1vV0)=wWP89ws$9__C2n zd4l*MY{*`kLbYd7xrB7f@U&cDhzLwOqsLs%U#p6JIDI5a(5DiACeMjf0;*+dDqy4z zm_r3E`G2`o39nI)TwX$Zbza#WH`0vmZhL8$A(X6Lo#R*sF9D^k(* zPKzHz_NsOxsz5fEp7?OHhG$kZ4buq;{iSdpp>8*o1Q-hbQ1FY&AeHKMP&GY1odNw+ z&Tm@d_%xL1tU}r4tSdOaY|)Ambyam%)l`-Hi7Jg2&bUHkWg#l(5E8&DREO#t>h-D# z#i4kmm(^`dH^s!h|v(mSU$M1#UFWscr-`LJCQJW!yrZV8HKJ8N!5=TO%b(W zNbMM-mMC%-O4psMbWtpAlW#f7yL}T6rO^-xa*%|)1I0*GoJH1TN{x|lcaR~#Z2$5_ z?oU%w1b~9#siL{EL!LSZ5zW14N8qc`^FdmD!-X83+)yv-v#nuk)9(7_-ny**PX`r3CUU3mRzN*EM3e82;b$q-~pWG!eC zV9#-hKu~}rJ;6l{5zFYYND^ZwoGto8O`A7$Z)n!#!J+s;azA$Qtn2Yc0SVlmM*7qD zxU&j4Az=eAfINo9yhuO-{rlMajQP$aa^PFzv}PU;0ULmAz~2BS+)Nk;Ukp4u0_lOQv%Ca>F5sgxJVd};M z9NQl+cu6(p78z*=M6B3ojq1G#XCUhh<;f82DJYICYmqI{;>Ix)UHI30GP|QWE;{5m zU_gL8KyY!#I0+%5I$MezPw!4}(e;WpNrFr4DCN2>Z=O@wHI;tkpq9{q0DZEnirXe+ zO!rxcXFDq6h?p*uI=jKZ)7xT`4<9TZ$ara6CXA5iUbSBN!^fSnB6E`v7~3`><9eBY z1YDu|WDUEDU9a`hCFY#O$X~X}s7{h+n0@6^6i8_eIvUK$#}AT8EK2ibM#LTjnUKZ( zDYG|0nkei`lUX9or>#UGJZ4uhfizKl*sK(M#uiu@*G0pjCB26HviiKlwL+j36*?*@ z4__;;&H~jirXG3WB7&Nf89vI=1WM9HtsjpHMh7sHJF4^jw&?I*Hrk{4w#$|*|H~z0%0oYXaqP|=Mn^opyxkvv z`Ca2<_wHDF>s3u>&3S45Pe_-?9sKy{UpH*K_U|k2en)h1>xScgyW*ki3cDvaUikaj zpFFeevL#-@)jQ+4-IMHk@e_Iv{?Bs*-+XG$Pv4YXH<)>JZ_8CH8jk6f8YR|r3qyk@ z3cJQdlR*ii>GXLGXU(^EjP1JiAunAt`WoRW*$~M-dqBi>l_^G+w0RlZ8A|KDjbI26 zX+kMg5tbx5V_AD5A6?Ov`uhfIOZW!dWRSgURM{%By0@@pogNA7GDrxO&Z~@N%xUJL ztxz&6CniBEZ##!3Wx|N8=rQKE#ZI12y^XoYwzKPr)>zliuR*5R^zM_RE4y>|ZW{f@ zeZ6;lP@mPjXYrS0OKidBuS1C8&)zb1<5P(XDp~otQ8k*VH_|F9a}J^NFdd~SQ#~4~A{Lb5l&~fMLiOR) z>Iqc~CrL;NkB=RFGu|!Bd4P0329l zad{K4{ErY)zH_bVe5jx*nrqq((<)ff!3TdtRqcYvT$3V@2e{1AYT#*A)ET>JdPh|x z4F;D_8Hd!&wXQiX0ME+?&|L1^Sw zO5|*$iZHdZaR>ku9GcTavzjoLg>PUJ zlv5H>j_A4xfUD48z)_sFeBx%DGg|pH;Ce?8@O{R zvPqVrhB$zrsCR|6Sf0~ljuEbh|w z9ZeV%75>G39FT+EYTfT5I#5EpIES)?(9@5hteiGtmqRXLktnvYA!5bki!>CecR z&Yt3eN4g{rT2y0ZxSm(^Vrx2*r}yQb8OS`-ueC%NL;@;P9KU&+Fr<*ou15rSyg-7q z<_N_!Uj}qWi;Zub({TE%ksCHS{aG0=9f>9)Lhh9jnb3Vt|D=&SQB*}wYcfT&B=h2sJ&@BH3=jq9Xaf1KX2J)Y zS&JIhfov`^#vbRljvH-(3%v589jsOr2M<0oEiqC;es>ChjA{^7oHODQi?)002R%U>A2!ExzG`=)&gBSKYbbSLeGUxmVWy-sp&HO}aCZ zX*i{?@8idreGLP@dbR%-uM%@~af?jq07JkY$+6=d{p$N<(tN4!e~hm9FGRERJu1Gor?`8W;?s_3wzd`9l&ZI!q6&V-k>WJe-c;SE__KNwrn8|X$k z09Pt!yXm62tW#x*=x#t+8LE^wnb$iKp6mINBLQrCaJ<-wb9?{iN-{OlrJJ?v{S#B) zf7seOr1vxcJox?_g|4ZhJ^9Ng?H$9iE19|T)y!?Lw*AM2Z67>i@Qb%k{_L^XDGTP@ z{Yh1%KT`WFkdO5_FDEb5a6m5Re6RS zfK(D!VXYAUV**G8wDB}zYD=jpf)Kj-D#$8CT(#kN1;3OK8JF?-H146o5=IRnGZU#o zr1(^pq`9E*>Fm{qbY;q^s?6G!uI`L#YnI?g>1c{yHih74u=`klH>NzcOWc&HBG6AC zB&B+Wb}>pZ%hE!PrBBt;7DTFDKx&~fRaV|Ii}&X#g>x&lL7l-IT0l@1sHz470H!)4 zpx%-~?3XSHQUVO+QMqS556w}Y%41zWnqr~tFaj|Y!}S0{#K+1NG*G8ljlfk*fI1T1 zJ=>@`Mhy}6IPmYT7)4jSWi^@7`SnXAMF6G=oVQVQDWZq3Z7Su@fUkx}`4vSql`7h| zY$QXYhy;N>g{bB`Ux$P*WU7&z@t!r5FzjEvM9mQp!BrGD$Pk>igY5x9oV8JKC}AL` z`_3ZadQd=I12dEYfo(;mWGP4~FyJw3f}~&qJQe`Fl9fduSO%BB1(t**&%{*jVM*`| zHZ_rua9PfAwVjXe`S7AGa}xBz7JXYZ{=(@WO(F&S{-1~?@L&(tf^Gx%3Vd({{uB5N za4hgRkSIaEo561Z0l45Gb_@JRFD?NAxK`pd@C`tx;Kvw`N-`HxAHbtdmv6d#`Q&dO7eD{U<{fL(UpZ>kQDWW~XAit@_Q2zl z={?x}0uFgdw1N8J4npOv;@*Pw%pozg*;uMEH`u##Pzr`*SAjqg=?-QCKPQIZf(w8m zx-*mqK|~~2c{xWIl1z;ZL55JCB0-U5t>*lu;w!`UU{*vmKnck*spr>^2sd4`jToB^!17U}%afMS=ng8O6+SMhY!& zo@@3bChpneOjH+Q&0A@!&EXDV^~ik?j9B#1OoxowSEOX|7p6GYHkBkXxq$}2(2@|5F|CIEs5Rae#>&UZC zoUpJ`T3+hJnmPYEJp3?EeC=Od5FbiKV9T}kPc8cG1zKBl%Qbf`yYtG_WBayVbIY=u zt^nUaAirulsxx;mjl2_I(=~C=uI(SVxAPsVR^NSfX47bH{h&Qw^iq~Rnge0QLvL4> zyKcoVBJ-M#UjKoyn>THJ=gq6`cxPfw*XDC?T>1Dr?V-%p3;(j{rYmEsI@9ZhjGkob zo*f6j{&?3%PiQ=E;r8?X6rJ7P^SM)|?%8P%W}{2n(vR#OyJ>?nm|@pze8c?Avj=2C zmvN*2zaA-U8?|h*qJ>xPN*rADpVeK4Ep0h~A4fslWe|ShL?i!7qFh`hL;0zp)QQhsI zn*9Cqf~dH8u&`yYxMfgljU_Hv(fr<%w5|rx67PTe@2yS!a~}JYY>pLPJ1AS@BcHoX zjb&BAF76+XEblhwwwWt>5H*IsaBKFT>$R@N#Dyzkr!O&&>Z6FB{rd}3zkX7-#6?TA z_{!dfcc0q&t*a-$e{bfGPaCWHte5x5IjyOkL$Rw)uwUNmWeOr{RP}G|AmQnv8-2Zx)X>5aTrvazOv)dv)h?M!D5xY=2l&BPN0qmc2(0Q$qIGC4(Lex8G4HrAh^eBv zZm6}$JJR&6`2X|&&SUNvi|Dy^yIp+L-KXnmNm6RJz8Z%e&cNnXF& zpkSa?57o-c@F&pBQE7v?{%{N9`yZ#Nq5se&=EQbu~4-MpOFbhMJPc%R&I9_mu zRT5%4Y!8Yd2ri4p2x$VAf*`n_oZTSjH=*dLj14d);<87m_1m=){+*S-@6p2Z8`ahwQad2q4fY~X z3e3<1JBp+rL$b#NB0(U6%d)|c4JPMZ(ujN)Jw(wJ?U3Z9EPo6r+mj7O?AR_hRkZh~ zp_Jd(B!sgsW$m1VrzoO<8AZom(nt_V0<$}sPoCP-@u8zh6WON^2~+y>MMO1cG@p84 z9~WHNXfPOxRnGEdHepI|u*E-O$vex9^Z2phW zjVx%|^|1$6+tc2zdp9C?Z7vm5fNQT+Wpx_vg?MI{q3^Iyr$tltZ%t& z$-MWinc6fme*0E)cEiet-frzntzYx&_^OVhUwQxNO`En}^VgNPU6)+jv*k^HU3~ME z#hv3j-hTU{zg-!b-)s+LB6FJT1F4}OKX1-%TKK2SM}G6l*k3pHeE!t+~(9h+hl_YFzLb>%Cua2OmW+Y-JcdQ9RTT~xMisEk`>16=Bb<4>0L=M zn3;6x_NS6>Ug7K+bqA&>qN}3o^ruv|m^f>3>%IBZlm4Eqw zy>ARev+wzE%R5d~=^_j*_vm(FZu|PhxqobM2Bw;?Kb3_jzOujd^XH31Wb{97%0ITN z;nJg9zHokV>)_BQZxRW!_45}rzwflz=}SaJ&po(#;#>FT9^DEpN6pIL`hsjthI@IMygMBzs~N^<x51$UMDGppoSBBtK*tcFop>pD(geYg`r*&zg@VC$>guClkXWGMXqg8|4>iC5E zn)|A(tDvX9c2t#AUPunJbWkOJc*`jarz?fk(V8FT1h#)k3IPyAB~Qw=YuU6pL^c1{ zkR14;30WNZlxK@{#zJa|s!fBiU1%Zaae`ob0o*U8s%q19M?-N5jB>B>#^l(3tB{T z)ay_AYEjrO0c?3(a7dS2aCpi^%%p^dXoJu)_Otu?A2_Isp_ zM}`*1o`}&`K%F23`Z@3zum>0*bPzob+5yu0>8xhNfiFz*H?v6F&>PS|cmOyBv=($d zFdHZUQ-A}qzyj0&o(-%9j$^bDQowHD*^RXGo%;s9^WcH)Pzzg@%n@r(NFMu+`K!)M zXdQBQ7wy=G{ZFBPyOmn+Socr5&u$lZMQiK&MVcsWOl>*Z5rq_}p55wq)=y$KmNCLi4A3}%Jz@1~M(f@-s#o|f5FGN$P*W^6^9GhT2;@-y6=8nATVIRMJ+j>x}( z!Dx@FoTJjV&}ZO6l?u*`p(~J}e5(To-?^kiEdz8+1L%h@w7N3EYDOH z0;-SG1~i3#919>0d4x_~8rtzVO(ZEgurP+;-J%_F#7W zj%{Q2?wb4M)8>8i?BPGWw)ri$#E$N6JbUheU%xW+vzL-5_btEYn#ucjZ$9_W4X4ds z^~`&Qe)-alci+77)^|jgwCsG(U5oF0Yx?oMyFd8PW%pmFcgDe(x@S9>qYGPye)htg zpIkt|{!iRz^dx5e_Zuef+M0f9uig=3fCLqHjT_yKi*CF+ziD{<&#xI>ad$YYa`v1b zys7geCl3DL>7gGysdpyW_4K}`$nuW#LpwYd4!YmROE z_?gD+=F~0ga*yqBQ+Z>4Yx8v{w14yrIkzSI&^Fl;m#uNOTry<*jmuIuy*&7d8`W4L zbLV=ktFiO9*A0LCrtu#>6hCLFY)fSSu`Y4>nuaTm&;0d;sb4=~Z68j)<+$eeo*p}U zDVU2-?VS3>;}hS%zxd)Fts@yZeqQp*;~L+4di1o#&fd|n&)#Ievd>u9Wp6wfIelsS zUp_SXt$*ZidqJPq5jk;T@qrCwYD82r!>T)wfYOnVlC^LMdWI*<3`3}-v}a#2QFD=# zZvkIDpOgY**`7XRSzpeU7-iEjuDoPX^1c`ZVv=Wlur%&bnE-WA*YpsE%cbAbjRWh~ zy9zy5gRPp(QD$=iFetsR;-mp~JS-@z1K;aF9#lOFA-Iss^eT8?hxl-zGrS6Gv$?wY z{r{@4V+e^>)q47I)gv<98oCY}nalU6mJe;z=2M#qg^8)ks%~+I$MG`_!mw-+BI}4_ zH7K(3cX~7qeVWBb%>f{ zsQ9EKyE_KAUH9czol(%7+VmbiPnV_Vp_D!+l-{K@mBNUxLY;zPl9_iA*1r|V{ zn=f}OTgW?Xnk1Dw2J|$?qgiK<$h7pJYqnV0+PXF|Iv3FfENDP8pn#DSvU^du2i_~` zOz$qJB+g&7?;^}8wZ~7uuL3s!vc%$c0)s#rP(T7`00`I&YydU^F9C8ZiKkK{V+Z;1 zDa7X|KG%K9NpuR(0z3jd^Aa-ONvqxKg&fp$p(P4rSkNOtls!eJl+6*9u{rNR2qLhp zWV5NYMctvC%DWH(1UQ~Z8nVG~NAm1)SzFACx#&U{LKlK5*fa;&Q6veHK%{aG+pbI+ z&_n*XC`NZDYrVlcdk0z9R)#t@)(xZ{Pyi9Ib> zEOsY~sr&clHjGyM$p8ScuRA9YNcedc9FjuBG@;7?lz{!1eidX>aHmXgXi70SILKXg zv;u%M;fxhTqZyf#EbN$+QN3zH5xFS~L|S9*-R~qw6bp6bk+xX5}b;MIBeobING;^(+f@3qq-gQn{ry|MjEf*ZI6Q zPRQQ)Uy%rAEUxC@EEph7w$9oy(tPdO#*0>o#;7})FFdn5@wVes*6M%v zpWrEdc60HygV9qL_TBRS$)7zw{*C+eB^~zmq4pnL-SF1q_AdSpXa7Xk4eyAaxpee% zw>G~01oPNAgYWviH=6Or(#cDYaYr(lTVK`}cErzGW-RZ~W;LTZMpAIzwqD(ryMKeT zdssHdRi;R$*6{u_6Q8&s^{s!T|Mvl{r&(Xt)9~pFCq8u}Y?llTfgwt`(>Xj0LeoNp zA~Dy2>?OWY3jW%l7(iLw9u^(L`>h9;Rpdx{Jfk z`*4zAnjZ;}p%z(`pv?4wr^8mRdRgXtrKi(ibsdUpRrQqutJ<;xH%ri@+W$y(QLnSm z>QIAd>x1|s!SRsqm6GW7dJudWn^ygtmN`nz9#-myBiFW46*1GW`Vl**UPDcnVM5fE zUmZajsirx!64!}&7$SY`n*wU=f0#kU5gnSKoKx{eS1(kNUHQM76hX*Z&;%knJQXbO zV7Lq-an2$%M%A4g;WCwPb`*q+#RUg3osyAh9%JgxuhN{A#FKf7=+FdQhJTk{swj`^ z6U#fOE9u_4NgbG?nC>$%dGZ{!ZInl{Ftwl=^9~9w3`vcV((SD?6+JEZ%xSU+T~LDw zk4XwnTTo0*5qJT+z9W75G>MxYrLJFbPaCzd(2iXaY3= zIUqIWt&5B8Q5wAwa{nQ{;Lyt>RM9V(uFEGs^E#JMp2Dj1rP+0$H+Ot5F)Av;F#fM?8Mo#wXS&j zu3cazP53iNS#D%$GwE7k!-$AzK2{EfIada|mvdsrbeO$~?6U(ZWBc1Os^IFKvBdG+ z`7Psx&0~6Nq=d!6o`S6SL1cjQUSxK%`TTkLO=E?v6JExq^6l#cc+CE#0X5B=bJ$U2 z2rX%_7jjHcg5b(lGHF!VUJ%?#E3u|i*=}+Bq)1f1Ezc;+6S^Q-yAjSFL$NVC>7{IM zs_0{jaxLl(h5FJzGc-YhpunyQaq#~Ozzr8&QALzabN!3>`(GlUw4nb>n)=t9bNK&| zmNdLTNnssKn{yi${^r61UwN|cvnP$+w)N1ro;mK&$8)a@?|jeQ!W68y@AId$UAb)V zSFiN{?@OGwyZ`Nk#a}#i7Op!_su8w{>KAH zJ@Y||$b(;gbkR*$jr{86y`Q=Jm`$I`ts5jsT5D|Ud4E_l@cD_GH|+i7-Aiu2&Yat_ zNT%UjQTc_^aGWgvmBa2$y@j`S($E>fu!I;(5|Mf>F@7`w4YOoJYHJ-O*&Mz)W z-Mekyzx~5Ll(cVaE8;#Q|5Jl?Tx#y_>;0+ znJ^(mas5Eg4=;+JG-uc8KQ$J&krV(q1F6L6^ED9I@oo?b+NOT?LYp%tu2G?U%R;FGw1I=<(u)#*ED_l zJe4lwAKWtX&fl2Jd%JG`h#H)7$1~Mf zt;Uf+e7WA`BB~0m4qV#S3>s`2lP@<%%}^-|Ge;z+{H>0YCe-+T*lA!@(@T!o}bE4$SrJCH8IET6Um7ag&zLpy&7Qbit2Q`H%r%4{hY zP*n});O10j7{X^R6w}nsF)}0%Wq8M^ZxGKD1$q1|{q4uN5AWi%MY;q7SzDYoSDw(v zqdBAs&;`Jdf-@H99I8MZV#RR0;EK&^S}3APUGt5RNHOV>bWvqz>;IGlA|B20L_su} zBC2z$pa!zUOpQ?zff|(oA|g$aAp;@GRo+xl6&w^DNFpgHBB{ZI@AU;31oD6fXg~@W2I4>i&_dJ;dI`k9Y`_GJ znAoY);N9@P_o8^^F|lV~WVt2gB-J>PkPs3eFl(I&^5MIG!cq_vMADFLQDu2hiVPW8 zLq#>MI|;{wqsY_%V%L)mW^8pQH1bCBLKg(E?TV;uxMUH#${olA;FthUiKL;mNA0~+ za6I3Z9mK*A_WqPJkkJ|p5>Q!NSza*QHGhD?8Ob%AJGbqcWn{|y#!)Zl`t~6rqInrR z`@(>iw)B=raGSGIoU?@#IAbfK&@>w~9nIs8A)J$G4V<(R3H0LJGuDHs(&Ujwvb&O$rzo_A<6=dQl zb6%s2>10ZFJhr_uVKvY>%vNjp8~XM#zv^eu(|G}?5b=rJp{y z>wW(erX)jK^yf1 z=rR0~F?oUnKzq8}|W4E36hu$xq z9$DPB@1y^WE^O=g*h!;*T$g?RK+@&o9r5&i+f~-K4@@Oaof})#J^qK6 zjIN|e7@4Q`Cf>L>vbtyTkFOX#jZjK7o0$i;wOoIK-kzAcZG+L(0GDN>nSE+c;;e;< zGZs$X@VwUD00q({0lBC4jQ-}?$y?V!KyOdTmMA<$1btyg?&;l`JJ*{F+Vt5iaJ{Kt zJ!LNGZ2#7!*?(?yc8{7XdYm02nfo?%{?FAQOB${@K7aqF{3BaH z==|e*2e1Bxvwbjm&57pHE@M?+?!JxDQx?Y0Suy&lzm0t5Z-s}pc|%jOEg3y^N$k8; z@i(nbTykveoaM4TnY(|(kziAW&j za(F2Z2gL|0<^A~(cFs`}`6_1&>kK^qj770?P9M%l_h={!QW!(x-GjW+Qhl)T%Wg`T?onHrTC6xT#*G8UpXKn>+l`UGP zuC#HjhB_ISlheLA!FLcFsbzWyJo~3luY0 z5>FNM)8kC^| zs^|@6$dvHdx00f=6Hku;B0FP`$U=J`&RTuUaV?E8?9E#H4|vEjG&in_AmNy1tjS0; z=#9F_GbXcc+;N(tvib<1k_gxPYONAvtIJJ;n^S zJ#$$bT();ikRd<>%M;C!$Z_2&>lD`w!S+ZK?06!kM^BwalJd_S@}`Qy)Sy^7UgE5| z#;j!Su>;QTN#S44;xQ9PPwewXa>XrUG8TAjBq_YC%|%x>nt`p0$0Vv&2ev&C*W;)3 zX)TedyLPhW30;EVrLEZNj>w|c%+m**;hanwP*t2OJWIU1n>f0&VQp9TrJ>vl1F|Jr zB7nTSqYAEwX+(lb7Fi_8ohqultGCBU6J?z}n3e6tR8+8f^*h8l z%L@=IX2Bx_{ntj!T!+Q-Tu;Uf? zPA$3VGHdsg))sXJvwJ`D@Y;PJ8@qkmzArqYw?-LQe(&4t!OXTx|L&!Vv%YdhbarEA z{ZM}WP;ToeF+@}Yp}2FR=ig78{pB;aU3K&LZClpt|5WDL0~2>_UHI3l4t(;yLqBiQ%6;zw)(@r61e9|Ks<}`u_RJ)93BJ<|Z<=wznVCeEK|V zsz4Emf=iOdZ{0Zc;Eu?GRxfLL8Eftz-(t>h+57Il7hW6Gnxj2mc|+qx%XXf7L+2OH z$iH}S@|F!EZt7i$IX7H&@Zat#ZXMD(lI~lxo+Td|I9wU$C%qf%=W>l$jYuc zf4p|zHGe8@9X95+FtbV*o#FKSM?R9ief`AmpVzya*z?>&Q_QOIEyor&94c-ZG#9qB z$6&U$3`UNfHS4DL=APQs|GvNIJq@xY&IPBqX`ub9Z*Kn3>HE+9u{SWOFYK^34;V{3 zXWjepkuTnszVQWpUYoOfboO&!uwFYbbp0P8sP)@dCazesr|Bb!D~@ab>9s0da7Qx( z=YPNPJ*PE&<+9?#o2fZQrcRRJdS0raQh9gxaPg%**0uqXLNrFb;S|Np#*d$$_`o^i zAOBXL)1`+>>z$ERI4CYt~R_0XA;^hIkHET3KB0BIt?$@P35;d)l{t- zn^uVdrEJS0!wke!e!Ol3ACjF=-G)aBWeKPvxE?{^nVG^FrJZU)W_o|2wu$N%SkoF@ zarX~qm>P5m$AeXM5hD~slW2}Y2#n?6GGyqE_38A~A)$J@*)E7Gmf3!ybWt4LOLJOe zGU7eIPwgG2nBgbotSwKOr}j-^B!ep7?f$XC(C9zn!2?0aJDjtrHC7p2jt42^8S^-0 zsh1B4|E|rEO!Qml^Hibu?Z>G*2@vOPF}vBk`Y7whb!s?EQ4Ju@+4|aERrI_q!xT5D z=+I~$$Mz~B_1pm|2r+{a1~oF8xE342Y%(=Nz{D!@EkG+r+k~`qP2iA0Hk1UVJszWh*EF@KqQ7DEkWK+aTSzL5U69i(V$dGzh+?yVAnW)?Z>8X55<9+zck35@d6oAL^RSx#af*JhC5Lp zDYWK_eU2Yg(T%TckFV}bKXtIMb3$v0Ry%yGnJFRs48UX3$>>RnnC^_^ouRCV)Cc{C z559*@(f|;9s&unxm|v7v=P)do8RP!zA#^Xt|1HnysY(Zfr?Q=H)>U4t({=W4C`~@_}7@KKY>D9#=VQ*+1XrP87DBcOxra^oL6tPMe*1 zXph#Dlo3r8+<{-bRNOgUJTTSsxl?C-=9Enr{5k#j-eZS9KlR|Q$vd|$y79`L*Zh6# zrgcYc{Dj^fUpM=E3;uMa-ksQb_6?mMJE`qmYxZ7$hnFrczVDqAH*XyK)4IrlRxe%j z^0qJpTONB#6dH#A?nX2%IX)>>jBZjhkD`u>hD zzp?pU$L~D;hrYu{cRbhdh9$i}zI^hw^}}Dj7eYXy`Id@9TN#-)`S1%9GW_G#jmv1xNJ)(+qE_x>ip5wjaRSTcha{!+tvG;tqq3~7q9O4 z>DvyS|6^}(3Ieh@*7x}5M?U-a%wJ!C>-IeK8I>&_IOPi+-+WK(O{?7fWBSsb{j2^x ze(^C4R~~2Y8*}!KxCh7G{t0h5%>|pHIz@C=Os1|c?uwmvRP@v(tjo!7++jVnO`Frk zmfQ8pH&frZJ^SlNv<00t0G%rimutqJs#bo7Ldl76D1P0aT=FPc_8A^l29)P#rS!5R z@Jb|M}|`3{ng~4cEaZu#|K8SILhKb8Sx@rXrQv)OcU0%yW0WwtKg~NvDG{9KyL)@RDq{)C_h=`{8)86J`a@qG`PnIXzVsd4tT0e-4 zMYAQtcY2q=BX=MYV>nofCiKBCRvw z0UqGlu4s#yZ(M+c;l4WHz0yz3Q8Hxd?45!D5wWMp5TY>x*JD?a0E(`*q63=Xp$zGQ zG@(Xw$l5SVCKFPyqu}{YbwGkBs)Jc&T?kV)k{K@=vS1pHXoPGMT7+Xunj_s&X%{0+ z%8Waagl!l_GwMVeDB48Pm}?eNG(Ie?QN1xI8>2E2fzb4$dPPL@Msg$t1Rwy#vLzy$ zB3y6)U*`=FbKVAlbOBGPi2|6(kZidsZ~MZAGmvFl$%upkT;*eNm9eSl`QVas4rgo< zM5Yv`44fe{RNjH3$dCjOF@aRx)!L(NA3c^Ge|to;^nn|p28nJQ{c z5r5-|${#^+Je7B#*gs-X^^sslsl20#t~;Ku$vIR8z|8)w!_#?KMGOeTjPmLn#tQ#u zn9e04{;wI#SbB*Xdm=@|jtx}hgMujb-ZC5RCd)tc4%Y(h|Ts?N@ z_IW>l)6^6D_kQvLy(Oyh&hq=OWy{@o;%{Y>x#EGh$5wP~yY!}!zirIC*k9N+uCi8f z&t!hX(3~H?sr!S+tv~jc)}F~@$G5naR$tuZ2!W^u=u z-rKPF(GL{X5A40-My(~LcP72@T;qjHoPqTCA773x?@$@5@zRy)hj*|C*%ZkK~gMFI|y5d(rqWp3yrKAd+qI)IT=HPo3BHk<&)L_prI3t?z%Y zY`l2o$oC!{`R@lrL~p+O=&mnc5LwZkzGw5mXYU|F&rhy~;`E)b$%Y6SQntk0j5YbI zr<$%mrSWaYPyOy$_LNANvL%-O)AQ!hvzq_?g6tiyshp+tH0K`JqW3j7fBc-OpFgVi zG}$|coylCwS1-xk`Vxrp4{U1r&x=UuqyP2SS&MT`HwqT~)I02>0V*VQ*PP3p71dtq{(m>c#5; z@rM}?q4*V}@QR2)<({w1kedFPG4HyC9X8PPo;{KS%9{0&nX2a4k%+8Eg2J>GE-h3M z4X#2&L&2_cRpBYQormdwP%bAzT0VrB+lCaP;^K!jLJPSWxu9%%-R$a5ycHE-8;hs=t3Qs z;&hRcCMiV#MKp}%y>$bm%7cw4qN#z5T0h8pCycio75)4f#&v6qjzq+AMrB> zSzw0knQvXKt>}ndxsoM$Ls_>e>P-}!v7EJkN}tzkzj(;Dz1+#402ds6NtxO%zqif+j%{B-v)!mNeJ&QPkiu3sQrSBz4jaC@oO2GuTmZ6kDz@T&bcb zTceRuS| zo=oVzgL76&w8vtn&jQ#T%#a}fX4hk-THdo-w#ABDM#%`~8H1JOnhTn_=oYt+lkdY3 zOs3|I7m8a(MN}6N2?h~y(PaW@RGBggs^GRk2 zYf_OEqzhqG?R5FGkc+N}YVl(_Nt51`RV5OX(!x`!;MTQ_4}!-Kq$La}CbxW&ib|i- z@^Pf4@%4oNH*9`bXny$U6^Wx}Ie0zL{0LOlbE#FKfF#+2Sz~tNf?r**EJm??1hI%g5b`{Eo~2>W=4Uedjzf zWdBzlX?oL=mbb0$|H1=$OJde{FBtgh!}i_@y*c8q1tf@wnBX5uv38F~mvt<>=iO7c zZ#?*cJB+>twp=m7PWwksnY#Hk zD3(#3h|_m(>H6{;MckOYZN1i=gdkyRQ-6Ckar%Oe51*PiZ<)Po^w7s{&D^u4^47e)wtEU>SJuZ3i z>eLO-k}hT35J@wA%gd4D<_TRCpWDlh3#HP3ex~s~r^U}(nZEfYeNJoszKyZ7mc`Cq zmc8jk&K0@nG`{c5{4KBMAKcXR)yp!!dr~ALjUPHE`}Y@!x$PJ4ZhrsS6xAbVE!S7} z8H>90z82W7v-wc=rsvYXdDPuGq;)r|blw}!G<@!&8YiEgd*SDEc&HUu#cao@ce1enQwPo&kcWso6{g=dEzluQj{xJUG;jQf>%TMmFmX{P%*)|4VFnst@Tw#w6gbIj;xla_Db>E~=%~ZA3~`M!llnJ>}$&`k>MMr z6QLo3Q~{O;Axa)(84PqM$<)vkMXm_X^G~Nt%Q{dDP|X9B^Iqrn_J6`JPeRis- zp4g)%3*M$-}DXlf;JibRix<~Dwat=&IE?SoR z+9R?5Jlp!yI^)etqHkR6>9X_5rNQ>s5rx}=!yJiZsU7rk;N6YM*;K#+c1uW|Z3 z*skhNQ&eZmRbx5MIj~#+kOH>HjtcM`GZTrX2pJOo$xDw#OeZPSL^0T}kbNf-{!N+5v)OkRVp< zjpp4$DYz7+;H`Z zXkPZ=$xD~&eaYg+5$8}Ej;E$9HC1#+^CX4J*w(rsm2*|bX2mK~ zgzFVv8nE_G$tKf37N#;bTaHZXGNutB7^t2n8w{1Ud|469MC|*gGv+p0`=(M4>>&VJ zuzU!`BuT~%5z%~26%j}Zm3O?n1Eomw2XHXFMNGF2qyZGRjJd;kt-+|(=2oU~>5-#k zgVA)}d~0u72r6tF2ZKcU>{Df(toi9X$%LTTsy1ghr*}r7*h^c}T-h*u9sf+AnE`@K z8c-Y<@OX7(l7A`u>*$=P{jB?`8=?OBc zId=1AEopdD*8XolJ$~=b^do!0AVaQr@H%%qzwW4?w4Aqi)no6PxO3ai_ui$oMD>n1 zyNYz_j%0-?mpt$ey)F7`*LPYjTfY3BxA%YhiCrJLdEsx~5?|fD_4MD&|J~)r{FW`J z|HkNT)H)NL|8~;&pI^&7wtLPmE^!AlhyLr{1%G{8_NjdbzjVLeksv`Lst5hV!J6-m z=He&Kp8dLW0BPpUfG17N!)Z61z zw{IBz$&*@ZoT4(arnlprCyf7N!{BFcF=n?Jvzo!Ibv6_?^iTcyg|>e?D|z|RlYe{x zjwfS=h#Ao2#CIQvU$CO-Jtybx-^i|qm?0us?#^}IaEc;&vf)GL3|;<{=C53;^){#e_#iAK z-+lVzPac@~>TS-;d-M0cmcR4m+}*D_n-0SDM9fsFyvi1%7p-aj_S^K8vnD_Fr|ci@ zi(PT5wxFwU>+_-|&ZSnZ0P!#utykt^ffXA9vhY1))Qh=LGW z^F2dwow-vzOOzCI*M#4dSrI^VWF2`q0#k6qTRlV`Ue9Ym{9&+HJ+i6#=ix{Ks&H_9 zEErO_mL;y&gN!QxkV>Gv7N1VzNr&}v7|N=yED(f>ma<-@>SkM#AA-MBCb;56yyDZQ zoV*&3)&cQ{@3QK4q}m77Zx#Z4!#D>S7*qm zI^OU)R!2#&J*10pRd8sgLOY`)$y~=Dl=KE^g<%<=nA3@uLef*WP5l^(gnXLC#yz ze?Ln}g5`0>mNA{AfMS(*yd7h{E6IqdSv$sz^A>4K+U-a8z*7Ko*5*`^bO~mjDstMY z*lY;myaNI>!L}k@Xsf%l1uZ<8R})2w>1w>7M)Sedp#U>Tmk@x*C}D1IFcUcB@jF6* zbm{xh6o%xS?e0&hj77m|1Xh+STOyHTd)<*N7i4$c6!EJr}%E(#s5@*kg zENO!&iyMa3lx1xj%|Ei&Ig~b+w3^G>BS&?{kME72I$Is%Gvm2xY>4@(ed%)qpLgeuMCwgGzADkptxnMuwew2 zM+rS>Ln@=aD){K83b8ev&2L`hW-V28*!4VRPz{ea>iJ#g0}N**CldxM<^Z@K_QHpM8Jtg#9p;mV$*Y71`0&w=n9<>zq83NJzQA?(aP6($ zDDIqC@XHIWJ(Fy!_G?$||H32fZ(F(Of6i|@e^JBQ?pa?tqp)La%LO;~eEgI}zrS?< z7arXE>HGDT2)oKn6=8e!K*s1!EPeRh_MXZ0tN*9(zs{Za!wYs@fBWE%o@sgWs@dN@ zZ{J7mF7BJ``RX|nf8SW#KBn?^$NP^r`Wp9t^seTMmbP7Y%-;9k-gw5s*`GSi9?!R5 zc~s+@m*>{?7d8*e<|u_6Z8;;E_V=A2V*0*!-5guf3kDaR-fz9BxO=>~W!Rg{M~?1| zuIZip^DB`>ZP~|mC(m0FJ9+NJZ=W}Ml4Q#4qdPml^hUPb%)MK+&ZKCL7B>v$pW8p{ zr&p?sow;YT-kA_lO_*Bx!5!X2&Y0T_jbvja_xO&~L)$vPa$&<|$E5%EvdY<_Dax*= zwZ^?napG4`HoSFh^GDChJ+PT`HY;`yO~{U9;tk6ZXDmtI^_nx37N$;yMpAfV+3r8R zH-6?4w||O@PU>$jO#SX@ST+|Nt*6o6d{Cd$7Q6VE^dFv*iHNeC#C0bZpV(1&bZhe6 zr^~j)_-Fst`pv5o=N_H?%QJ}tyW`3X6@Ex0Z^JW0f~E0DPU_zw<{Flue(QPQ{}d~+gd zP`iKEGpMwsScW;Z(kE5kS8|(<_!(ekt^)31QcH@3k{#~rf@=ZYL^bngI*1P;qOuqi zqJD-z(|#Qu!B?f4!S1<4GblXA5lT}XxxOS*!R_TYGdUBip9sDovF9^`p6rv3Y!8I`__&IaI-&`oriac)jgcG+$Z*kmY8TX3qN@-{_D#!*WPTLzu35NY32iWH2&rawQF2GTW6xHSY7T!PQjpSk%FHQc(FuEu{d+ z*^TfNiZ1B_9&@UwCX1Z0hzUfb2_kU8AwiG?%b}KtaeS{D$#LEe4!Qa!Ed}4i z3l>t7srMw47c4Rswj|%Q(3sOCTccgydPDS>Zkp4GCC{FlIAgYc#_Uy>ELnK{8nY)k{Lh`7t{zw;^P-)9cTOy*>vQ3ZK<>aZew5CY*`F=7)*>3?elOPe*NKn

    uX}+8!G9@5e)DMehu6l}ba`1jwybsCvY+*R{*<}jI%n)}8?8erv#+7B zV{G3S9@3g4bAEgQ9M4HxT^~EK=?x1KC(Vkl>eSlf(Yej@etYTE13PzK{@3}xxUBn= zCvCg<#>|uZ%sI^q{_>Xe<9iN$`Js*v9G^J8Z|M6^YK^9sE%yB9*{SaKyV^*WRcf#5}()+zj zGLP;oZX4Fy5?Wilu>Mf~)q`DMe-jB5UI3>+Sie3f5~i0bDBB?kiW^`+L2HZKyGAB& ze6i{3W7|G;PUgPN*49D2Gs%i&(j+O;e|^zh(gDZIJ+h57YWvI^JOAqrU~2l?lBtAd40A@PwrG8=P|DpkocQp0=E+N}XSch96C!SaRn_?M zp+=n%UX9uV%d0x`v|{BI!r2Uz?j$Y)F5e*xRjk;n$0~q|1!@f$r6a1Lc@iY63*3W9 zAssE1HfyI@T+~Zgp@#xrS0N~0N?Ao~NEYGHllrC9dwRId#5z!WCVPo66s53rN^SHR zAz;NpV+a5q9>iB4|E&`tOdJJ81Qxa-)W{U3y?zE^`u&aRAj8@lv&u9>goZnnhfa{H zROR|ZB0Q$6{5%GoTepwvh%4bCQA#N=@ATlNWy_(?B#I7-F3NVd z)m}Bp@5QotdPOn^DfVx}F4?^V2DQS}c+WVt4Re2rl96B?SB$Y7d?o#GhI2Ngz*IpV zJ4-C>5DVHkQ{=tlh-f^Tk!LK>PMrs(xM0J#p3hpMw?RK^0UX5x>EI$K%N4y16w|fK zSD9~G%6W&n8`P#D$t>Cv_Jce0<7YYdZPQMe?QS14m$VaLKfE*gg){U2^^kGJD%v`t zw?w(SLH0G|zw}_k-`{ROvI{``)2C0J_KVn8&xOm;$$Z0#uKZ*{4WyyK6M4$o_O1zP zj`C3esMeDZFVXif|kh2j@EPLqdDS5wV0{(#PsZo1B1VQMQe+-oY?1#7e?>h*}8jj_QgvEpFUvD zZEU${apc(U=uw>wD?8>bZ0U^~`Sz%_tgYjUW#-&QZ>nG)OslNp9Lf|nj>x1*zTv(g zFKsEyqnKWrK@7l4+wo(&qs!Xu11T~kyIf`gBBHzFh3s>Oin}IAP{p-8m7s2|c7oig zV#7&&tyeE&k5$%DMYrYzwlFmrH-cRYUjXn~i6FK-m3M_9h#`b1vEmXFmBJk>So@~n zDc|^^cHR?#p==MRCq?^A$5DX?xPntMMXfUAcn>wf)zDXOe& zE4ef)FY)0~6M6%X6xM;M*oyX^PoF3Z&6_IjeCw?Xetu!cdyd}u&O1hK+EmyvKJmb= z^iv0n-lWzXo49#%>Ve%P$V*vZmI=e?OqlbU8&8@we*5OVAH1{m+SPNvdQR%eeR_98 z+q>7aU9{9m7Y}{@es;a?&z|m07RGOUl|9vR*~<8Fvkrdp?!@Wyn=V{B@Xg0$!tloP zQxERUK6fDZ%AwRs?8|Q^?S)ts@O@SS*`ksr$Cc<`}z*44F7< zVdnmAvcW8D=uezJKYqgO@jtw1%x^7h9FS4HY^1ZUrECyXV%EkC~=QdlqUid}a`{>CRnA_A&D-$HcXhvUf-j9Ne39rY$~Jn(on9VTgo|Wj)cOwl(5z;8;1wXLGs#Avsqul zh*i`DX)Bb^gz;twb;#n-^qwhh4RogPx2mSA&7>YBb&0Q3_AvBw2!+>=HbY1F!Wox< z+Y$PvR2Hg*wCZ$qWWh3jELD$65d$>NWmG-`#nVL;|4OUFrz=xZM`;u?>#BKsxJI7# z{xB_8S5hE^yC4*)nn@g9BrDB!O`vF_;6N`M$q)c8x?+AC6!R+wMBF6bpxOUqEt=O( zOFF4NiIEIB9ufIAdjt?Oxhf=o9DYTtxfGbl)WGHQd<=kMIuE4y;1utlK*pk|4hF>y zwQCHHA~5fr;H*Wugy&JhL`zH_KZmkKwPgr#ohNeggxT`sd17vp8cwU>3>i{Q{_?7L(^Bt+18i!s zYu7Y%B}7jHmUgfp^O6;X8(uOr8UOexV@tmm`}FDB>hAoHpElpLG<(M;n%x9J_U~Wj zIZZA@L^S8I-TFy$?1y*iC(h=fjA)B_{prXtJ($&4_~WaAaf>E6=ZK!9aqc2_&m;;C z=@Np}p_Iy4rSq5^fIQ1L4PwsP`qK8u+4Dj0_D_%@!K{WdP)vsJIuTrSw54sLEvkld zq!H;-rHg7jPbC+DTySMu%sjDAw#K~vjLO-h3DN}wsZ5>F-!L_%KlYe`zzt#xy z#`DmG))D8lWvpoL`s}GqZ(B9>@b1}X&ztkM)tfK$T`>5i#|~Zfcj`*YIZed_sm1eKj%|si zfkRuz3{&%L*HdiuXXd=`n7M)uZW*2U=S~sR$A0!w><#k^&-V|d3a|b6h5Uk+Xk2ex z)7`MPCvnM=hBM|sm&NU4-jpSihR_8V-ee(iREO3UbBD7e%X5gmyrXr*+pa(Q|6}c~ zqZz^8KWcyYhmg~048O+W&4$t-Z0q!amI+fAJVjs z0LtxC&UE>ver(6qAE7Q*g3EJ7*^Q9X)mSo#VK8F~Gp*M9u5iz(oOtC_*Oy zG-HfDyf?LXP#;NV_7A1^4@I6i%oyVWj*6QXMV>oijHRrYTK|*F()$NvFCQ0YR79RS zlsPs=Tmp6poL}aA66crskSo2XKfP}-^v&~An>($fmOB}M0aXp`ljM~RiC2yjpM+&j z*+1aFZ7E|kwY8J0bSei1gI`#q9v#-YBVvOu@!ARR%}bo;&zN{{Cs*a>DxLA?4v~Od z^V@6U&mJ^};>K`1^qot+*DdP3@o(CxQRfA->K?g0^Y%&4?JMN@HSuTnGm9a&2qq=6 zKs-|PpSz5ac+I`HGGK{k_K^w~5QGpS9?6_Y`987QyM9sU*}qVa49ZIyk;GZ?3_>XQ zlWQ~Y9yhwfT)>4GOTB(1@RRH4SVG;|$v0P|UOnjAutZwf5`Sc?FsoYG)#3WYS~{Mz z1}2PS1I}Ak145bC5ArRQ&a0M2e)f#>#&e90Q4(|sOByG>{IIs;wDQ_P<;_FNJBQV+ zr;OtRU|3idXd(@oE?>FS`}GaZn^s$ck?6Pnsct&ryz5dr7%|(2kwYx924a&&1%o11 zw?CZpB)9Ta1m8B)UdDH<_owPl~}Z&BdmQ zueD$R%{Gk57G#c6g{AzKgRs-z5I;C_K|9%l8ukV8z$*Zz&ZNaA9|yExkb4SP~~SBynI-u$|Wn z867Qagw8OeH9W5xPKbv?d25?DiRipZq7sM}}V{Y%^A_{ljjMUaH;j9Mjxg)~Gvml%@Gls!{ zPGoR%0Q+R1OuTLZizp0$zjRjShi^N-u}<064GlhFWj*%F+7k!J+$zo`XwMvyKD9!7 z?VAM1CO}>h zR1*N9tV{hwhK{GR$6EphBoIa^qcj^Pk|_ph^pXaT*)@^l1%i-3Xj(^Fg#{$e!dXE~-WZ(Wshrw#gn2#dH%ahIm3_Dz0>RHnh1eY!zDl?%Ni|9@(#U zMTFKs*XLdqmeu&byDt3G&6)SQtM0ji_GO|koN!#&BFznsJ$FLe-WT}lYL>Ppe!sKk zk5}@wZeuV({Ia~VZsHHSw0%RK4YLy`!~Oe)thG&~#%-JmGY6mE(I33JE#;GkRKx5~ zq~7k5msE#;z1_90apH+1`fyS{zd8Qfou12Qjy`+2RgdAtp$%{hz$uLVBDBr!rC8)>8)#G6+rdm-2=l%ZkMk+vAPaBp~{+VGRf;|_t zI9Jxvq^=Jpu~3ZSf_OqRdTP&b=HMt2aKW-}8;Dbx5CEuR3RN!GiW;faZ$uP5lF2T8 zl+25hEpE0EMk(W~oxoW3h^RtDpj>8~m_;Av`F4h@Y*c>~ux!g*=8so)vBG~Jt@!Cm z%8JWu50)1@+F%?@oRu+rm&_7p1V;b3 z9SOv_vfg(^+wdpk$Cl})f?f0PM{PpBDLQ1=JxdF_Uij?6B+{XM|WYjh$IdeB|bUz zh^Drx*`7+Rxof-2-GL@;&%*MeC%Ff|LQ>q6=jGm7IUoyJ#PfEZ8 z!A&KuGSk5K^7f#Tu~UxjpbX=cXD{Z;ewf19yGX=TgS4PTl;i3TyULNunQ~1N__Fx5 zw8_~&Wm%>tsU%h>D@w@^1M&GrpmGdqr@VA+#0J97jNr>VC+`Yh+HEC>-d?7?msp<2 z$&{SIs9x9vR#G1-4PwvoDnSv!qrxdr1(FK%7fG5#r>*MjVtCo;_z1xqrstykL~Q3~ zllu#_ z0EZ#1fxv-gfMG#?17)tZDTdXgcG?*ti=8kakwXFpB!7?%Wym4ISc)DWMIx6C(Vab{ zopyw+6JwwlS+7bY39LWLhLh^XQ+Rm;SLvcD4I*j%$cPz9v)&jzJ}TUGw)V9bg>PS& zetaK0IZ77PSUbA;)lEicn6*@}jE)=v=oUByu_Zte0+--e*P8nIdpPL8eh1f9DXeay zx`iFQaLFw7se_rv4!G~WRJm^l*WxFuoACA?;p`@L-yq*s2^f<~m%OCbN@~X5eu!zf z!U39Tofrqka$7~S7%{1XL9+pKm}Uy+Hc1!EU@6V)jv}YPGP*SsXPSvbF3VJmGVI{N zV$7sj7j|nTY4ybsm$M%O14b#S^8i99V_=Q|qb#8z!^+~kEHluIE-tSnL5F@i3>?nA z3Q9>p2FA4gLwu{h>b~{jtO}aY;xC_24i3AnofrPjM(=Hl99Pb2zxc2I&#!V{Gbj9i z-Xc!P|NV8z`}Yj}?SS<0C33ARdjDRb+3&t_-o!7rl34-DApEOs{@WHZo%-%t9)Ij` z^3g-`7gqFd?osy-S8ZsEynGTN#D!dmw>mhtsI^CsgHJqr+<)gHtt)B{CM&+Ma^Mp$ zhQ7a6>y9N~IaTqoMSZ{BIdf?Z8BQhxvQ+5|oZswNRi8RElG)Mkzj?k;?Mm+)FnVIh zzI~Z8&L^3pX)~%2w^+6XW-@d%MpJ=X=5sy?FtRd+))^^{;LZ?FFpq)cU7K>ujes$l z)-i`cH!)9aLIw~6B5}rWO7Bk)x1e=K35T_wBN%V}{p#E>KGI?8emy&G59{<14d5Op_73aAxHstdWTRA0RwucBZN5?{6KYRA4 zmi4}Ta^#`?^WObL;@z(9&%G=*`8l7&Op8$qC}q@QmQ~ouXp_xF0+B$JljF{1wJi@^ z>snUly?nO!vf2LgTYVemB)4~K?c>$|eV#Ruj=gl8X7s8rolO;U>W2HS zNxysAbKL^HE2114B0fhh9u#9ly6H}GtI$RM=Q-?Y+k(cI|$@1c-~1YPNu_q%Ud#Wz=^p8i0X9n!Y6JFZ+J%&$xQZ7bJU zLC52+YnCfJPJ>~BYC0}msPF00kMv9Hm+;M%v7bHb{n~nMR|g{4ebcJ=y>GZbeS!B& zmkJjwaNMv;zI=(}nw9c-^GT&geg8!4=g(zc+lL4yA-~x&W}`9S_rlarzyPHQJ#vjpYi~vkP^|- zQNajqS~3~aWT)mcjvsqyyz)UmSrklFS{ZIePd3ocOfB1r#3ED_O(o*zLp##$0&WlRa)yjKafd!UWzK849B)sXs|=0;@OWg10EhuRsTM3X5cqews=L*~(Kc4{csou*wvwsp9@AbWD#zSHt>?`L|Y_LB3B z%jz*DF%wJtR;TD0dt6O~0B6f6jB^G6z!6BO5LdylSmy*tT<$po7FWoIg{aC+cXVZg zndE9osJNv9uW7+86)+MHsY3Co^R`QP~${`%v~$1%jMH7Ut&q zgJ2Li#1kl(IT=Mxo&kes#(b}X85VBxlLo)l5e9?mkM5Dad4aj915C=VYfatycgHU_ zSbO_Hx5&a8V`ICxwv{yaNWIVMoG>?aT1kz?6vO~rBDb)HwD>KH(RvT|%Y-A=P#gq~ zBz4zk&QhK~f)U_mKWL`o#zp*Cin&GbNy3Z@EOA`OMRm(OK8l>Yd2ARc#X(2T{|PZ> zTG+wkSry2^fnqS-WTr(U8ROuP*%JkW(x}3c8c4(%OEbkFGLHyiF;!Sr%PkC9C&p18 z@#XZK94|AL)WowJxmgwZ(b25WG~zHIM3Xv8>j02F+0^KYnqw)%6Bbj<(Ikyz%>EeP z=o1!(#3j|9TNhb<@zlZ|GcqR+OcN(Kf7EXOkk0tDLwJ*anH^3xe7V_`<=cU<^g4~ z#}3#0?$VJTzfYQdb$2d;BV)A}&*=X3HWPuFHoOZ%6}K$V(|YuYBQ$BKN5>GxIdApC zMHvVf^CWxbQFcsN6B#fm!WeOg+1K_MV1e)za^_?>y=##3OH&QgNmgwHRzh=~UGF-l zo>@#EOd_6S-%LR;V2NWHLu;SFGKX=|pMGk&R(c~0U^2vEzRE!r(@Lm?NT9{5Xgfd! z16-cEg5+ZbzxrwK;*gw#&Zn>~mIllDzrE~|*LJQ9l!(MhhuoZbcAWnCWOBb$`_mqz|| zL?2HPw@~q!m1Do%YK|mZpS<0>e$McB-{|}9t3t>V{QT=%&EbUqmL=(3y)>l}r>LD6l@``G&TfwW;{%~7p!Y?rXr|`p8`AHe zHb!E6y;s@YXN;xl|9rE$zhBwiBh-4i3P=38gCO(zsnPMDyy3lmN#paMAN%ghk>9>6 zFK@sWB_0WjB=X2kGo@Dj;U?^n63-pL5|3m7EXq~7%z;Sa?>qdTTkE}jRs7MNR57qy zL_8r9AAfkO`?i&?D;CBdexG;a^es~S=T;|n-e8>xmVGTw7-?&0~=QxXH zh%6d|5!c7osN35awe-V%&a0PmRbK6#qjV(hxOy4IDD(DVVPS)?s44l-yV5yxxN2|u zi5;~+zS+%kM^H zg^aXV`(y)r33)8LtrnG#O;F=fd!n4vW^v!)G-k)5iIdqt{M2J`3VBjYSfINc<=FDu z(cv^^=KPYWjqndKsF$cTB_F5Dk{75s99wDyw)>=KT}_G@(k{EsAg1y^vC^*}LRCo~ zfWkiDDJO(nL0KzN@wX{9mrkS1l*J+}zR?ds@Ok}b>NHc#JB1`g^}yZ)RQ3i+6p9jl zv+d>1+3pMcRz^bpd5O+2&CF5Q)LYh=0#zIaYM-M@%gLH^3flrEqxlcDg=H&a3B9I9P6Hd!5BD%A`uA{Eo(p`$C4^u)!vIgjl zKw3ot$wkcIFiI$p){$ETYTx&Ypad>Wbxm$S{xi1q7(xhnBuJ>{TPMlf5S|mF$42BFy`Nj&V7${VeQ}L>Y?QPFfB|ms0Y`vCv@dGz>9@vH%(P%E zMdnrGTCZH~a>P^!xy^*edZVnt?^#q+8E~XAfJapSw1Znvo!Q>QFRTH9kXe<8CqNlR zh->sYZ&(N|etupR-{e7VBsE;?5zcEtF2Ou83K{vzTJY zH_VqVn{AG#UF+xY9#K6u3JI0?Wjdawkqk>}kUhIJZP1Z~p46#HQBt?!DobiKk}=!E z)3&8`rZ*U^Y#^u>@sXk4|T3QcN!qtA6^oAc6{!u*iDrb${>>%6i} zJ2Y$zCf(<^7{Jix?pfbGZ|Iq$(y|(D&yY2g@P6^E@ZIlu7FE~Xxp?&9eP(aW`{mVU zZ#4PjVaNK}&UMX^dv)BlT0s~dcdfdt$zKmPXvnaw@* zf4^?{XInT9o%Q8a$({WQ0_WKc^8Bjw=APtR9j>$MLpLulva1};zR{m=@?6>GzO=Rb zhNoM8eaS>uwEvl7&U5M`5AS!ZtV`?}bhZU6E^M`UJbwRP-Y;Xfkn>)^$cn30T*VGP z>qVBEpeVHxTE!=pa5XNyFU~B6Y|M`xyxt$r91rWgapD%Im*_UJ31CH4*V*-)U($Qy z(t^tLo*^uAr5F<-28duR7N3`yif%~@b^ zhGEAheffWZ%b_ss7iF4l288@3rBeAinM^wvnzE8J(#nc0n!bo!MI6?8qI`pQ@w2x? z_Y8*L@2>x!^9O(U?%=Pt^7U?cR=~5iDR}+-idz=>FQ4VPbe8AhneK~bcrKply=126 zl9}F1X8A6g?Y&~Q@3PsR3ukyQn&Da3?3`QGc<)v5*G~3+^%X2})@WMm2#3D1CjREB z=qo1zw=5RtR*l}fo$03U>iO6$Cf_>Mw)KllF}rVmR6RQCUeOqT`9$E3rQ(c==yON7 zN|(hLLyR&CJTgZTzMGb$clFRzE>J9S2$|izo~!3evnpec?dL)sB=hOLeg03ZGgbQGLJ-FJ2{GFfva*SUq43UnT9{#q76h7Z=FCcL1?W=zjHFP`7~ec;X)qw zh6Q?0MA_bf3C1pgS{CIA4!Kir9#eL7R{i)Y=LKzvr#^s;Mtl-7P0sJMQd;ExP41gk zc>m+P_}{mqv`#!yc6&+up)G;$t(O+m#UI{+E8W;Fnf(#%*igkUZctu7LdOzZonLwH zxO~A}$Axnf4{XM>t1??oIImeD%&1I1vm0?7*BBI+HK(54#T1=CYX+(DDKG8C4pF*r zp0T%wB^3Fp<>|+^khOE1x2}o(?0MW6G>`U2?*5x`V9+?)OA{HO6f}cW`{nh^T%Wwa zaq}8sd28mW?TPO^EZ=Z0_B!-8_M?D{mZ*+72#8p2GRnq(!2lST&1{fG+`w2Nn1_Az zGXS9Zm^E1k)oie-GKRMYEo8uGF)}&;uNSo7Fi-Z+Q%ER9R6lNvUC`|bVQ0a$~vWoSVP{(YE%g-JHjDSL!87@DP7y#tX zBBcy+f$EqIu$Rh)snxIoW8}aM2;~PcB9Vi>2#hDeE9ZQ6vx#M%b&R8G4{ohwU18cE z0f`3yNNadb2rsE;o#S{}BRw*h4_l5{B#qjt@#0$6K9)VwHCGykA(jEv1gB8cj|c|E zU}+ufQ8fq#)r7bLJV6{OEWRTK+3m9k08xe<0`^MQdmZ`{`>nnhcm7QA>ILS(LE*YZ zETx%43D>7r(U?NR8E#&+_P5>896%n4)ce4s$Rly{s*%VMg9hNtj6QxNU+jH z5Xx{E2*ys{R18WmYxKwe>m|?KmvSLD8%fY+Kd$v4f{{R&JqA|D#V@U=2;58Sycf<) zZfu9BihT~_@Gu=ti03qO3#!HQW(aLTZeB>Ovd(kk0{N=B`kn!CdA;YeD;-zPF?u5M znr7c!XVu&=pP5X)VZOM!(f#qI($ZQQPE(Im{m}KE3tC-EY8-2tqd2z6o}+MRIy+|OLJ%da! zap|y{gb_<0AjAv{5JD8P-cZ^2@2q5I$wnojKy0yYCJVa{y-O=EZfyPk2h9uewCK}f zn}X~K3gFq^v8eRx^rZYdgq8zyn+W^2E<~^q&QR5u|Hj9xq&BgCD0t)iuFt+O_SgrZ zPp@qH@x{K?4MKyDSxh-O9^cxNJ~*5?Jd)l&lsPb@o*2_QC$!$EF`6`^8KxQ8`jJ2! zvxDhskl?=Pjm~m3OUTni+fg5U8gA)+MgRHNKk{#hyRX zbNdrQwOgq7G6qyN%%tl7_=@;z$0*AkUw{FKgID(Sd#_n2RC^NtI?PwO5d#beEM|t& zzK^d+zH^GII(7@%$x+Ah2G@BrqK|#RRk(=Xk$UHp(I4f4PE08R#?^R}Z=TSGtu&s&UI|G&RgLru`zwEYD?=#t z{5}%$azU4}=>$Kk%5~>Ci3i>#K^K;IZBLiy%NJ{>hK$Zp%oD_6`LadIi+hRBVNE2Z zbKCS|gEW>VwE=!+NPX`ZODfW3i&!+HzJJ1b%W7@gNmDn)b@OOaQD55^`19vz`vj>E z;DD2#-{81(spAtDIIdaA)dy%Kt-Y~7`Ma0(ohLER%h#+zBAp;PEI=fqfdARLk_r3@hla zc^0-~&@;ULyab;LLr>9?JgWdIaoH)I1Iqid%p+y06$!-3vP@3_EBTwN9ZCqm2mp|k zRecN9Lhhgd1|V@Da3FACT9c1zFFCpx<=2r4O)WVx!d7Wvn6msA%0M8%lj7ME`MspT z81zNic#@qOMNT1CzCh?e6gdRkRKe03Z661M0U@v`Q%vsjYf!*p?dZzITFDX>PI1>Q zLG?a%Y#0f78>C6WDUg;57E|)w56m!;Qy@zlSW;y%1tcDTWi=|4C6AC?GZ;`{q{buu z=Q`BrM@|7bMKZUFMis%qt55F-w`d(5Vt~x!qk+rj2xm3w6B(}BW44EBe-um_Sk)*t z_>(((kZuX{sx^dk01bc=Y#bP5-4Uvos#^q+lRvhcYw+{c9^6)C?(G+r)^h^UJH}Z| zC4L71Fac;(u?`Jc<0*N0eZ{IqC83yUosA~BMb*-VxsKbH0*9DI=~$XL`OKzHt3PIG z76N1*85LJIGJ$B(44xYjuUo*+3%S2^j`L&7giB^gSI-w0R`W}1#mm~H)(Yp`N{ulR zbaE{L8p$|sT%boXxY1|!M&+yLS^Y6RoH2$I%qd_OFSb>2vx4$<^F!CpZIXErU~J!D z;>~uwCn_}fjJ{Z=KMn|?YNy!X(~ga1VyZa5O4~i)xO`UPFMFkx_0qzsv0rZ1=2eSl zHzZ#;L5EZBI~SWniOlP##8vh3>W1)dw<8XF?_3(WXFK2M3w(WzyDbQHo>b6b?i=J9 zyh4+I^xJO*zqHD5@FUM3BNxw%Z0}XK^muPtpdB8~Z0!-+f?T6-{AceQBPri43$2)v zc>aXz(wTgVZ|n!}1;4OTo>w*SrB@sNdUfRfJ@VpeBciCs$GBF%Z(#^Gdt*->CT@YI zbm!R((%hiDsLD!cddCEox%|+;SRm=${aX8kIh+Cxmr6D??~8LjsT`RXcoYhv&L&P7{%;Y=6% zFyUGF#U_|Pq)b#M;)~5I2$aHU)(pyR=Y_V|zD@?xA4!48&DyL~LHLNO$5efZfU1Vx z7oGX&4X$}r@zWD>jr-(z59vLzIsdw&^3J8nZM{SH?;d~lNaWR%>4U?@Xv!E$7=sC8 zBxwvMw7!_u8CFh>D~E>Ddj?Wldy<rHlB{Way+@Ei>r2Hk)w=h{n6SVU#gxQ zi$8Oi_sJEXUXkA3qwERn^n_I6U`!EPb*`eEO@$DB44qDMv}_&+dTiZ z!AxYVa1uKu67p(qA7+Z~zGE%FVurkKzPP*<1zdDIt~{|d{oqFR^?h_SN`fvd3sx-c z`r0+xwqwTO9^!J~vJn6Pz$^d?4CSos44@E-k(TpSp2N#FnC3k_7%R^*?dDf(pV|>+ zIdok@SkBO%H|5!#b3PQf+sVz>QZ%aC;pueSEAz1KLl7|70> zEu|E|jwZ7-PDcsYKzz22a)~)%K%S`L2NKW2x$8lSQa}vj0`Jh#b*pT1zh8?c631`1BGCP868)BArkO0RAP#{^83y6b6_7D#e+&s6 zU}PK{_I&kx&rjD&EfvHg8EKs!8Z^5m9LwwFdY>T+R!m{XNBDDF^(~zh-@MT3k0l@7 zL-+RcXE&R>dd-ceSe-YqxdRc*%?*(%x0TisM}}yv7beok!JB*gX>SBY6>erQi>r+8 z2#TxPiBTF;_*ySbXpCTWWyM5oTH@M?4d0&qXu2s6q|Ot*B>;p-`p@oaGP@0N?22oI>W%u;7yfk3{BHsT)tx z&dB)V2Q*nw9^6Hme5w0)Nf*vcJ$KZR)=^C5=2R)~bufz=V<{YTT3r#E(3AhzC#`B^ z78Niuj*luyedHheaKNGO?!#5i#KzM;r@+Nk$Err^m*v$B`tE*VZdLlZBmAYawXO;4 z=&0+u`PT9A32HaH_aCse39Sp5Zi)! zdwA&X_u}{O_TI7B8qY{eYSQm^YMoL4ol6Gq-vhHMT+3?t85Mw$(H&KG4ypA>uSAXnuSFKkV{d;%!=Zkiwd({8TD?Y(jS_|M<3|JJ#qPaol3qDfiR zIZdWlO1yju5#%_hL9BG9w)g2B6FIMR+fgRiC75GrU<_yDCS@l#jI5-}bTfzYZNt+_ zsM7o@-*t1Ts)LBlNT%RPkFu=JV|^$|RfD($pcHZrrjXa78BJ?Uw@}d%Ur>k{V-zrA zn#tFCfKn@($%j%s^MwjyIHz`JY)?9?BiM1ONcUBd6c*@ZPkDuk}QqKZrvv%4n7&%-(3=ldF^+ zJ?f!BF6gSe|7N3SBKhhuYbxti){MSA#5bP3|Wg&-v-BRq)T~swH z@4Fokq+d9IeG(9i1cGHg{?Hb2VSVsN*CwCZWsN6@&q;zVZEv?R7^(cz$1`soF?+^H zwbvR;8117KKe_}R75yB^dJ_vjzA>w7zt7j|c! z*rLC8gr-#Db0CMn6wMlpFx~L~S;jpW+U)j`Ia%Gl6)hU}i^;ITyC$Ae6(K^bJRdjF4 zz4Ix>n~-B*|b!nLL1BQbiTEe0RoUXAOMUZo!ZYPMhGFrfJzrQ zMM$cUJ(Z@|bvY7?3l5VtheGXkWeJth2Y>)&LopVW43?G4Y%qo_3uG>5bsz{#YVGd> zlYuQdH39@YVMB3tY#0CmhjT@1CYn(JNsS&KB0R}$>B9&z2Ji$oSD?W-jHR%^fo36> zNG_jiwU4vDC^&c)&7ew`c-=ytU`T7~mJUm|u*6v>#~_^6Pma+BpY`5pZhkfEi(;pc z8BJ;(h7v5P(cUO>34nl3Wa#Oz z*)dMz3a)VIhX!3O73}z^G8CsBVR2Oxa|+7oaqG$bx?2QEU{Qr7RlK;?*xg6GqO_*P z9Ej^3VdK~cL%?(s^Vrla&Z6SH5E)M^2@TH*(*79cu+$QuNlia6s2>|mZ|dZGqy8E< z>6}QnhxLIt2{>RVjw>8yZ&X^>svj5<*EA`wpKQE!5ed2Z25;i6c42uPLI^R22)0BH zB#sNngaHaVhc}*{_@JNnO2o;7lh=0j3u~Jlh80@VJpS4VlgEg%%&RAah1Hn@gOv+w zJnNb!UOC~oUAE2 zrc>u7GtA+Xwr@yWRL#|Sl|2LQa~hhK*ChuN@t00`u9_n>ddBYFNR zy>?1y@M&qi_Oe;Yo~U|cl*TnPl2K2Nvy4fyCw7%cqTJE2_5o;yGtT98oKMz=61kAr zIV&0<223%9Ca-g4U1rw+%jmiDiSrVd0pz2wm(RG2Ql?q*yei@m%!#Q$IftlWnc=jR z(pcI+7?nmoC=rCV@i^&X02mcQVHT5SgWnZb&!)VgR4nIvskE-ruahn(slZ1!OeW#d6H&0v~IGX`iDm=tHNpLwXj7_(GES`Z>Zr`8=YM-rSX_LqEoq4VbC=OGVMWt` z5OxY+QY3I(r7QL7QDsYe#ShoJ)-Oyxzuy{3kP0WWC~$q7BvKZabx12+v!9Sdn8inO22*(`l>xs=luzqgJr%$z zpsTW+C1`khbXD-jwfoSYp`oQyg^j=x+&#IPQg}Uu-oju?<96{3%WNiAmaV*&GZB$1 za@w{{O?m0Lo+Zi3kuCrOhW^d4@#PFzumgQq#>u4Tn2MF^eq~B(iTan%i0mot<(0gO z$&PBpM{S4QUv?}NFa#d{6VUKC_@M#jv#~P<0c^lfCxsaVI3Jl2#|wE`4BYNEzzUHtS5pT zBII_%19tGNHv(}5MiZ=S0=akqKs-jOL5~eXQbi^O%0M?Azq!Ur>*}d7HlxzQnC zu(TOLh^t69filEl7F9@<6LgEzxV6DJ-xqOsWv9l#_@7vpDCn8!xVrM1Zq z`VGTkDUEm}Mj3JnOf|f7Dg*21W{!>+qe&J~GA|zGoPsbflzHX2>k}(tzj)94*_9Jd z9kMDM@xvpuCn}xQV026{#XxOU)$^(<&T1I=*HOOGDK4)|J#mn4@<~f-fgp1@Da@(F z0av7hJ$e)8lg;5oeP# zY<=7}coD9yX9DnsBsD|s(SxhxEyZeY+l9tqn^Q(|s2ra5fPh?`x9e1A7 z=vdtl`Tb7E%6h)VKlrV;s{iNwvDZ$C)h=@^EzYfUu4#%rf1ITaE1@BQAznpdddLFtC!EXI+!n=#|=nG_F}ADa@0C8jE>CQ<{2YR6R0g#T1eaNLo5&O?NTX zl;>ArnI~=m2sXo+;`z0n#Q9+Tu+?p^d&oF72 zPcPeTA3hpJpX46!?_~Z^G9W)6mqYWC=p6Z@MR0yi9+yaL8!ZGG6Dc#HHU9Z(->hKY zgC7k2`u(;yKZOKxa>GB=&Iw0bCB|Sy6>}uXbSea$LX}Ib^~f`We6rOdq{;NhYlGd9x1)0!+Xn8 zd46^LZ@YzBZ?1cIq8u2k{@MEA7uSaWv}Ne)&(oADoz>X*>VH@nec-l7B7fcPyP7C`R){kz2S54G_%r*E#JMh+YlhR&2ex9b9Qf)*=4e7YJjhkLvm3tnT945ajz6;9 zb>)JJ@2yw%_hxo>lAs$90AqZePdm~de{5&P|6Jv|YDwZB+nHt(uLJ~A ziXUH>cw~zeO%tz!RJc-4?{?j|(zSj`;!kgrpquy|=~wo9zjg&Ms%$*MH&^LL`&~Dl zWps?OXxeNacHFp%Ay9X;Gu@CcUu1TS8b=4D%NAj;tZh9`qp8FLZ*xtR{=07mNl;$i zVHR28|2#iUkEC;JSlN>`ihPc8*=!*(a(vAI(Sob1ZG5mo zo=Iesslg=#WWzz)D$f5cz!w{ShN-Tpkffc60@f}fczZ53SprP6XR%0O8Hi^LP~IJ( zn6}*TKh-s@4St$y8pWU>RuD{ARf+whywsdk-R?hKs3Ti!Zp$w!Q{sxzRbY~yaOQ@T zv(NNN%PjGz?2~QUL-`D4p+e7i6_~Sx+y0%`QL0W%-}U+5S$WXVTr5_*ic%~DO?l@- zK^09h0A(CMEfW+=HRiE3_qpSylo%sQP0Y=Cv0KveDW-tZ}1Old282bnS zC?KZ*X&uH>;NXje5Dbwts0K(J8;Nt5&JnI%%z7qpmD@ZzjGY1sIO)-0AQ;j*mN-=9 zriX{{;yUxSW5N~ltdnE7(T{6=>hCwAYqEsrINZ9YIbWyF|)!WOk7ENJhs5jjLQ*=jyzoSBAqwT8#(A6e4g)jF#5vF+~e!$gCi3A4ejGFffZ^4s$`L(HZ8O16F?&*Ln4m zW5g?gMUl+Ym;z2gSXx(E?-et;=@t`PyE&I&bVcZJlDlkn;;*}%m&~#T;xws~Mt|gq zgWhWw=m&=QnL(P?`IZ1AwZz7D))I*Qb&u5>(~gZ|g3Ym%yrxN9RKwMIm`;Tzf99Rj zbV6}n(Pj~34i+}dqDvPnczwD{};wtU< zD9ae)d989vZ<|*+mekU_`dydI#1fZ!uZtPfec3D;RZ?4eVfzzQ$CixzZd*p;JS*zc+j^yip~UX~(8_wlFUDUu&ewbFF{BViW;iXj`mtNECNjCm z`dOB;C=!V8x_Np}3<%acCYWkr4%>Ma2?Qa`R1@1bPoL>x0Eiis^U2c8Kzh#rSK(l3 zgC=yGUu7zT{s^OKrZ51;7-Lw@?@d3moTD^bc?m69OP1*Wi{p27idmI<^>RkjfspA&a^yuZQVsPx_-Yc{$~5^ zmp`7|(%t>>XT=&15jlMz!BsfiD;omW&9As+k@wP>j#Z70v+BhKA$duyV|9b;{2A_x zW_T}~?L4c&=!?;4hV#kFfuY2X9y6Q{edBzsb0V{EfNG}a;#uVbja z7uP8V2l}r63!O+K%2IEgh`(?!v*k4A2^aEI{^ol3b&ItV!^->ZB;Y_iW~N2_4n}G0 zf%lQjSN`^90F-*^02VNI3Cy&(N|zN*B_7`Dy?vGM%NJ#KoHj?|NZ^1c*exU<+AOV_ z8Ti39$w#)*q(Um3h{LIWeGvH3_280H&+O(}f@c2&nAG#>^HYy)CqAcsxX-a+skopa z{f{lcD8H4N#OA3R2?0@C`WsrxrN zZ(plzJ0Y%alh!X+-Z>oj`&T%>6Nh}H!VMU#j$v)n5#@#5nJ3=Qy!3(9Gm0y{ESz+H z?HazdI`hcefDz(IZVI1dnJciL4QG|X1N*2bDFLxU#**`$ild-(y3IeQ#Yd=sBoQi{ zoQeu5OW2>_#>J&Dw-gWAf?3*HiY6tT;(L)cX8TmczIFtU@(Ie&nEh)RszYE~9V}hWM$XhOpHM>z+!+WEyObhmIbpy2mrfDz*f02K94 z#(*b4Ffc|FDxO&>Tre8|5Qmv&T1N)SylQ%K6gT*-9o_tu^Nh#$k+YlGLWey?0#2VpA4#x!pZ3H)eoc!RQ+dCP zy283<^7E?cVBCx;mRrP{DV*DC?C1s#3uiTgMa`}Wnoxyh^}>oq?bMiibt6t2>gjRJ zfYiA4l&*Ayjq#L{F}R?UMKeg|u~T5G#V7-lvPhaz@LtwdE%7*}#3$0`iBaRwkoLk+ z-`Cc$aN6t$15d!BhHm);99mQx?ulZTz{XO1otLF`>=2l0A_vdnDyj9-iHwmkBD?x5 z4)Z}5jVkhnxsg9@ue)vm=aaZK%_Jblf49Z=jq_6f+~>G_Hl%c;JHpSc5@rUi_VMt& z+xd?z6Fnl0sR#fVGdm)V^>fU@MEt&;z?ghNt9E$AI63CLVh#zpVvp>RS2b`U*VrF- zNXzPi|FKG#Q{}sHp)e;Hy?1BQCqY|P?EYQu4RZlwy*=!^X<>BlKn!Dj|B&7umd|S7 zs@<8l+99R6u4vOcCSv#OK#JkMdX9EtO!;8Iv%Zb1a)$5O?!9%fyeJg;`R2eESH=Hz zR9sd|BN^tGJ!_hjqr=+C@%*7n3;?Wz=2+bz&aMy}d{$DmA{pTFOVgM!gPL)LuXQK4 z_viz0>=yC|lH2$c1L9EmT!;|WO{SYjAf;>8Ii9Dw$q-1hgT_!&?~4+3I>)$#jnMmXK@n=3|swPoyow-S$NB~<6) zn!0bD=iksK)VirfGlxfFZ=H^B>WIJH5r6GOa#M%0cR)Qntezape9-ScztwSeQ{?dj z#490zm?KFul93kH#9lngD6@u>fxA{4W2waRN10{$KeZA7ChmEkrqsGWULXAOn%I;3 znPCA(tXM`~SR=Gl#9ur@{Bo`{1)`lCm6p~^3u@wze!$mxvhLT6G2)RkJG;4RcknCc zMeg5*T|$;!iQkdl(vf=mBni3e9=_9i`-d*51TTZPdm?U zb+2FGx^A)eb8CX1Spy=M-gw+`(HyE9(LcRkeb3E&Q$^zGy#S23C1z42awOcs7DS#-PHkzWf#G)TTVRmzI0Zr?;DpV z9(f;hgM@tMNG!AIc<_&(FisC^yE}!p+Vm^?o!71u=GUbk-_F>1THeD`z-Ab-wz-etupZ_B)jqcF8xdF%I{T zDz9t(^5oy%C6(UHGusn)KdEj!puW1-*waBrqRgVmE#sgE2sZY2IKO>^xPGOvztid+ zV?$vi^H6elsvT-E0HAglz@SVG&OOaeg2hM0DGhSJ9WYi9j zHBS_-T$iz25f&>NBuoBBEZg?nsL$^w$VS_tWqyZcm6fRR|JId#F%-apT#ppW$vYdc zlDpJp%HF&7CTC?KV~pm@FG-02Fv|uFWkrQ5pC{k$$s%t0R@gRKow51Zf@$`iG^=ER zT6T+Pw!I7(Lxq=ady(Y?fW2FojU?NB<`+@g%t9wH#`0chW&D=Aa>I(*vSj-aXf`AJ zkPe(YyA~NK8)hrp71@5s4lkR{hyu#rm;qRzX{Aeec`^|O(_#}zNNZW&+-zlt0n#n( z7I9Mrl6Zu2ai((QGk~;?d=AtSWEmY%hA8BQIAuT(OJrDDWf%&tl`+Z~W7J~Q%6+ym z)uhkGKC|&TDrhfurb77@@X7Nul6k8uOht}s3xVH37S`f<)#k2lkauxmDXrnQJ+1;#!}d#MmP;T&PMh`2&iFUuSjY=+Oc7#nbP9giq6-;CMD;JsIg=e3xl3H{VKY4MvwF?Dw@GpV$^j;V&xJ}$Hbc!UQ3 zv@6MD_t}lfNB56>^_Af-y*T!p_rav*!J)ASKVa2P=h|lFgMO~o%@iE~c(0h~kEOdK z*ejSr3GCpBiwDy(N0Z{5AXn`)dLlGq$jfVKQq3G61m<_s5WvP_PO&v){~O z*)SDlGbdxzw6ZZPjo}m^20YG>t!xTf_%x+l{ZQ#wJ{~7OD*dS>_cSssKilSSlx=3| zLmRaP34n_?A`FrIq8%;;b0ttO}P0uHv9lLiMl8JwP+l+^AsQvbNRz@58)6Smnzt#7Hx5LjIQrgGN zu@p^d7$Y#LF`80OjHP$?N1i$u-_*%6IcfVszq|EU+KP#l|XpjEng^GJWf!q>}r%AvW|KppEYgY(! zYk?!_*A5twl=IW)v6!N5Z)d70T`->}(?-__uJ9nY!yJiHp5O{MO(=9C1tI}1yY!N? zz3J^k41lW-nkV{&)w4l0xk@ir6Ci#!U`!Kft9Q(79{|(z{_m$wke?ia&~$#P)S#d;~6J`v+DjAqi;&fAd zh*<9IHYgdROEj*+qD1k|B5BGHrMVLzSsvn3n<|YF>KsRL1&KVe7@~|7ltbNw8ZYB8JJ5$Y zl8rZ-nUo7Z-ysAbrGlaZ$;k-}0E|+`EC7ZP>l())Hyemz zw@5AO`s6D1=5f?gfqb&Lxt(9xfEL#~&S{l70`scPm|}H~(~Q9n$9Vv2Fh)DWW+aU` zjJ-0g_vx~L>wM0;)*#9p-@Vv6J|bMV2)RWTNdrQ-DZnkMvlz2t8P|_4cV4xShTO7Y z1=r1h*_9N4nHDjuv@C=>Cy;JY)j%EzaTqyxBoV*}Cq;)(`bAxD4y-tZkyjDGgn#50Gai)JFPsO}xWZc$iXZ;mDDc#3bU zV5X_Jk0Ft8&0cI8974FtLE{Pv$bqk|^?&hfT;<|t`pr|LRygBa-=^&81DRt0Of>)@ z(J%8gE{2dX6h{I94jbXLetLog9LO!2QN;?Ug|8H! zC<981usNT&U^p*F=Rg>cyv!-Jn&${D%+ZtX>`z(vZX+xk<(jeVX*jr~MucsqOpE|1 zRgaBSfB*dY4RgBwwwJ5-dM}!J`oh1)UODEubXMz=w^e@rtW5iO*Ee46`o?R@@lnn% zOD%q(%0(Ok7C9^sAP8|7%N%wK#4Gak9@px|%%Nc{a=BNdnc}>V+8Y5z)%G#x1+9Fg zGxdHKc8gq%#|)>8zS!)O-$4TDx$$qtPz;G&c8vnN1?AA7WifGn70svx#v@)y`Jh+X z+ZX!zRmNx{xAOr20AYzIE}`d|2VK`L^4z(?7)$8A<7PNn`{!Hg9=JXE;-TIv{{$xG zs@%$vLB2Uq``a7p|8%Q+{Q_es7JX{Z*iT*`{_<0!UwJzG)7O+k157ahfCL;&HG~-f zb1>R-_Ro#}NaK$0I4+y79qePO0R%I{5}GQAOB%ZVPto7LRrB~=fgfD09v?EJNroBX z5Z@3my2f0$u5NnkTkbp0(GK>}w2mDj-x?gg;U21+q1V4@4o7G#Ei7q@|MoR)PiOG{ zPn(^iT&+Lz(mwrgpXWz67~P{-7SuNmO6Rm8r$8rS=HLXsycsOZ>K#WCM?xMemH`0l zmLVHKpIS&3fHANbaG0i4rkfN%Tr=0$+bOJSJW9?3rF^}pe02lLYqCStNg#OIhNHZGRbpW& zN8v?`SzI)k3qSX`yi)$Wb0%(K|fV@`GFg3pyri*G;2 z4Ou0MX3rJN>Vr91n@d`XS@YEun{QVG%9kcen^;DqJ>wLeX$SF)(J2f%08nBTF7~?} zh);Kw5@08EnpTvyD7V~IzM#PX00b_#!k(uvSDQnCz6cy2LVgF7^`UM;jR$HxY;O+` zTw?FiP2`c$ni(kQLY7se3IWUL;1KxFtpl$NidI6OqTyu?sMZ6jR&11_p@4&2y$C`s z7EVHTUmY-@6gUh%IcrZWmXg+>*^iq1Own_L#U;?81lrl`CN%OV-;$dGkp z25dhkn_!v^`rs1^m>M<*(WOnw{H~D?lZi8SjO&}PXmgp1^Mpz(7H$fzn zGE*@*1g?5d`qg8~##7p^UhEcFQrE_k(O+%SwsnI+<#nyf=1v0vA;=s{$(PPn-fkz= zE<~`|7t5R&)fq68>PLp<^Je(JzD``-$TfIftD9VvPQJ;n9~lP25*Jic)zJInV!aQE z#OR6uLZrq`C(?+=Nalec?zY$N(xMvm(6G#5c}}INSxh$p z0q2u30&5_lnN(Uo$9vs;Yb*(jaUmB1X7t9mDklJw=2W?72c@=PX8(YhP~Dfer8l;7 zRW8I~t1re{{i*jlqlvy3r*&vxbDu$j=zNCprfgvwpd z%EmH>X;QP2D!|mv<-{W;H+2~Uad~0Lim7MX{5{!xke8;+vKY$+B`IHNMGSF3Rh^n9 z;(%%f!nUQh5>Q^qQkYf?f-Psg%F9@=NzCjDdH!2bPtM6V8#FJomrt=Io1H2#L;1Ui z&h3a9N@b!|yr%%@b{kg7Y{Rm8JF+A4LXBA)M7A?ZgfPliizpzb938Iw;;QB^pEK~> z5q?&MP~$qW>OOru)%^FHn;yPF?Twzg?TLY(zRQxD+~5O~8oe>SJ7NsR&2ZX^XL3t7 zdD%$Qx?^Pn4#>&(PIDCw0LDyDlPXmWuFC0HP*eA( z8?+OnT^HVu-69UUsG|$Wby$%!=Xdh0m3(6bsc=%=0I;xEqA8W?7FXxPRqmlX9*+FxtR0b3AGFOkfTHrNkwP3mc-pe{1l%dtIM8x8~LVLKqqC!-yyP(E-nA&U4>!_Q>ZS z@qYP|ss}!4v=3Q{G_G*q3diuJza$}V=&7$5U1Ojbd`soTm;WxUn(6t^%e5nYTytgg z$ItUCTBVB?AdY07-GyX9ym-DI=~G_c&(Eyp8iQu%DB}pOuVAq>Vt^z9z<_2?^_IY* zfEeWoWOVG5^q~m9a)xoF+ZvAe@BOU%CwI7he4FFj*E_y&g|uM>H=~*k$I|z|5xMSX z=HXu6TLZF4bscd4MaW*X9hT16<&Yf!@~~z~AjBX)7)u@&U8z|ys_Z1>P&$kXBQTGJ zOKkR8J1GJNTsaMSuZu!t!rWFvRA>^|Hl0nr3U%k(UC<*6zP!km*zPdRvUQ-GEXw21 zsRGUv{$`!3OPudet|VqlWGev`v!h(4WhLiL7unqgxFitA)Yqi_L$(iWs)kR#@`5=} zSF!Bkj!I;!h~?X!ZE1ENjIHwWUbA;vE=93eU{ibc=X8vGE<0b99(Pj45RB#drNA_~ z$TRuJ_U&dRMcWSmDL%KwkO3RnQ2HTXx4pnAnl*(-mc2|{(+YD_p^c@3x!4G1&thXe zR?^CRzI=1ao=+ZDWio>039-MC{OIB^jHiGjSKvizZ=YWjP zR0CWB4X4oIL3Kf`o>b&jP0HsU7e99nXoh*;X7$`wWKoNjNaY`31n}aNBo*p+24dS4acxAcTo$8N@OX{>u9hk$qOHg|v zhyikoyi33{gPd2UBMIu4lU)$aug@4bem$w_$4BM0Ev|E$ zT`d*PN*8g9@zIokP&P_NdN@9dL)ya7_~L47d#@E$_!h6xH=&;#la|(UA*Y(rs{IZ+ zKQtQMrS(LGg(3CGh!t0zORJ+h`_SSV)*OJ|=+J+^p4!~$UOy-Jv1L><`Fd~FcQ0Uy z0h+0GOe8jUrS}a80ViMS0&~g`%K!jYRFThaBz`IR%1JKdrWqr9VkNNLOv4aj43azg z5Jm_im?|RV87~BsVv%DeWd;Qf+sAGp)&RnYDmnlljPnwubiyc#jzwHQ(u=8WJz{GG1~9{Ec|o;nZId*o3QN2`oG`~z zOf|Hwhr zx<~Fz@9a`f3=1=YMt2wxZhZbOVNR&`!h4iGy^Sw@!MS!ujGa` zN4%19bZF?mpUWKR=K>Bc=;Er}U@>M|RMDBL8+~KID8d+kA-8OFjR63o3_C<|VO{M0 z&B}WxD*yN9#?9Xv|Jswv`=^9?brcvN#xJSY4)*o0{z>I;ZmHk;z3{i5j^6*8_l^rI ze|P)H9SR`%?6RLjEUxZ2>Hp!4T&2f()pF#NaLA{3jZ(wnTC0rx zU4Q^d0&o~8Wx9?$GL2_&wI2~|h2v7SPkVizbm1sRw%McX>7e8X!lsohvpe4PwXegO*=>Mm{Lbp2MSztDB14TmYR zPT441^9u@!jZQns_K4?MGfg4hWl4o)otDS_C9Rl}I6J(ycWF72F6%6m-GsqPtH~N3 zY%Q`y$eE0-p@gG~^8hN-{U+rsqr9y6DRjaq*Q@Le13)ady_MQD+H&rhs_>FgX-i(1 z*h?}_GgsSY(0p#3O(|jk29&Z~-u&ywi1kMhM?m7Tr@G{da0;wzoW(NW6j&^S3M|S1 zIRrKkwK~UHT1W2U5t2+bakZC)leBXT1g=0K^2pZCE;OSOw*+ZI0nGrn2mqk!sMZTI z&s3vm#bkh7A{$Atp&0P_SoH(}0lK3zolsI;VJ!2~kFVxtR%X8P6j{}p{NJ}p(8*$o zx%rg*z-`)Jw((ajFjbRc0FeX3BrO%j#uI#N5W55#NkQ5`Z6T{Wti5&w*ZNpWV*@b~ zbW+veHIttaGza4bfb#er5_IubFC-=v5g4x>B?8A)IA~8qdE>Y`tCDv~{0uLnl(;4F z{F#v__p*@Nc~&!WiC|dfp+W!rYN5%WscpP5$nE8csu8F&%ttB%vH0Qa7G*UOk^Q`mCXZyBk~BpLa|JIt_HN;kvl+UGwduWcFm#G~Y#Ch44}jeP#u%<&Q7tOjvyv*;3%qX`SZ8c$J|fP)TZ zS~P80ah32S@!S!*Z@{%-4&Uep26{&raY$NN6aUNZ?sY9}cBSYP^^@bm%nIb>wa$q1 z;#t;c$}ulA@!;-}Z@-RZq5iMe`)*qtfAm1?_s5LB7}HFy(&@fnhWo-9fjgHf`v%7D z-JaUhZ#e~Lt(S-#qj`atN0|&PnpT}>H*gh>#9Qsu&@th2LoGkUA^~M1wgG`j`@=p2 z;4;fXJP}&`#!!-JCbJk=v@o7aj1jo7>!Wl)e<*_fw=V?1a+T*~^BKyviJ>WFgXt};c>)@4T0&NWTSzJ6wyGq-#t^3M;3zWS0hF9ZaUphNGS=(zcB%I;oq zeu$}t-WvgoxLS|aF-~{_47h4{?8$we>lS%7%uj7R#Z|j=bAV;?t^WAShs3`$*Z%Y4 zU8{ei?COyg*EKx6+d9Q>K~y*ZoC1Hi9^WE1aR9UoEejnSSSF%(RtHZ6W@O} z^ZEh#;`v7J_~4qmYu@@!?Y18dU;0b4bChcd8C_$;7yYdM&@Zf!SmcM#N-JB_&+d{g zTU_z*T_b0GA2$Z#zkIRkweL8tKP&U{p7h^03o~n^OBN~bA6K@XV3q}j0jf?aJ-VXh zJlZ887fUVRGLH|C`U+r-h7-smYi}QP+`3jgZ-MsKL9;*1ObY=3hk?V$D-*vHFk*^s z9O&Ry%y9qX8=2p~fJ6=ne15^Lh?q-oJVR61+DqYe7A2Ia-FaTkTh?vSV)A&YM5Gjt zkz*wTs!#(h%$9iq3IKyK#@T+e6*?KA=9-Ftm4S;a04qG2&aONO<7Tl-DQ?NtQba&y zV7knlIXUc1p`s!>wt;vk(pnZsE4OxH(@$)fAYW@yS;;F1Q#Q5anzVwEliEd$ipqkI zlwS5m74$Kd6K2SUB#Vhr9=~S8M;1C7P1S29<=e2mU2aZpX31-_PfLaH^!67~(jT@m z5ENLzMn*9teA(16ss8Mz-0Ymg(Co|^^W^5sx2=avliL2l-v2g-{(K6AY=hITgiQB( zX=%O8)|2IIKQ(RnWdK$Z4Yi=C7x;l82M+*1X$j*p09k-&1_)*XS9Bpj0A9&@`zR7P z6p(F(OoS?3)~+tvJq~^cMAAi4yb?P+fHN8$j?u$|DCo*jQt6~SI#|aTatll`QMP{w z0$}E|d%-Osmr#HWND{!X*!%5F;4I42pTEJcZUqM1MQ!>&cJlvqtM;=u`A?n0C}@A& z?B4Y)0zc6%HCx^wAV& z#^J+5nF9lkTbEiE3~qjiR5&9)eAE5q za~(GzAR`d_XIzII@a2OJ5!+T$FU$-#v*gh1H)t8P&JW|H6+~>Bkp#-aPkt!#nRG@4` zHCa+KUOA4Of~A^VjT=mA4kwsy@l8I?B}DfPdN$1ELr(qF7`kSjFvFkO)7S9(tBtsl ze5*b3z)mFM;5XO$KYLcsY1vA|7>T<0`V-O3yvrwF^wn?YIv*4_bWC~@@Z z!(2Em*L#`C0HCn%hxp{oj$Rs3gqcAroWf3iYJiDz27vN0hk#jG*o}cPR5GX$03eKj zf!-VAf=;HJ#&8OiMQbf9tuO$K<97NNKh1QW#MD zTWl;UP4!_@;N(WJQrQT0^ueY`31tWe73OY&_5L_lA=m%$YJD`xh1`SRem%XVYtgCy z!49Eg!z0R}5qWN<)-?efH2mQz&jm9R@0<=ly5AU0SaB6Bh9pAVl0KfQ{Ng#G?_QjI z^As~oByd12uEJqP(>Y*(01=Etj;6F(JN_&3(9WT6z9KEGK^$Th#ZEyxJC3% z0Z+`q7&9!PHJ~0IgzPvHdF}L=c5>8n-Qwuqc5<~YW)%<~lIGQnefvdmPN?>Q+hX^< zU-!&sqYrQI`~07ScU)5U*e4VJIxzCJf3dWNU83)EYkZ$rZ4AZ+KJ%!ur$=lJN(*Xf zQq?-fvCPZM8vN^K32h<75x|I<7EqRWW^eMfBf^Z@$gke0{Qa%f4}D_%+yCM!oTS>z zOiC)T?4n0RE1cCe@BZ=Z`lwmo+5TU=`; zQ*^#AV2vk+&b_XP7aQ&|8@22-_{2v(hqME7d1t{_K%ta zzx4j(rr5Wh01m0|9&z5eHuL;$npDR=b}v&6rs_x_h$lwxAfuF<5n?6<#>~@0WJZWl zMoo&`ve7Zb&8uS>jWGrsq2UB}N&J##ka-$O0x;kSa0Do&rUk0O5aXJvoZr7i{>oM9 zpFXKQ`M&4xUrT=LZ!DHVQgQg(pl=owlpL*UvvZeB&zM2cIiSd{3|OhpKyG;C)~t&I ziUG~;C1p+`6-se@ zR-_e%?qq_zSwUz&GN8p-v1%qbo;yFSJ3dZDG zZGZFPd+PU8;((O1xY&g_v+;tx?Iq>gv3)6TO%W8VNO75?%T$4e?YhULwwCxo=Q*LI zkg2qY$#@spzm{exPDF)2#cBA%LaMRS52aLVCk0G34Z7JPAC8EY{CvGAXKbvEexFnLu8-sO2C8 z2BjTi$SK$kq-2miyC$syhx0Ox0R_N-s@&OGnYNFro7%~|YI@iXVJj80FD2;aLxd1xDQ2;96HvpcN6eiS3dUyat z&WdLUMruN#qY2`Z&51PE9H3oc?TusnrE_tukN6$guHi#&^4}LRnWqf&H;<7)D4SETdZp#8pjJOkoZ|XsIAcH6Bj) z1IUYNlTYub%j;1jgDaf4+GQCQIC!9xahT&tCZYBX#z8YMN5G_DQp92LqFKp%wxk~4 z=Qyj0#Z{WoiDBtShg~->_5I|E)cxE1zq>B^;10%NJinTr9CI(PA0JPNZb_J5jVzk{ z`v-v^T?XMao>S$#eqnm!De?Rn!onKk=%_fan$&spQ{&P(&7{J?k{S{@uE|d$X-1h9 z%aD+ZY9<>^@=IzJllksiEw@!EM~01_h%l#$jc1Ts*}&ILyY9n8SR%&*+UZi;4@Y&7Np{Ter{>$b8Ue zbWXUhnpg4FwF7rPX>>=Cix(Wbfact6MTH@{aw#24Tl8TlJipfVxm***)$V(+rxzQ2j zXPHSQ=CVy%Yq0%T?kZX`9hA&51ep^Vs+moX-ztaP$s@ykcRj~>3|3ra8C_@$FvZ9* z5w-X_PvoKPwSWJZ^P<_>u@S!B$1Iu)x<#fl!|66c1H%(Jwv z?CR2v51XTLb1Z2kRi>GIoll%qm3iaH$Ur3Y$fxQTe{KAm&uEAGg*nyPP@LkT26bnr z^6m*h)c@maNrij-Ymb9!@U2yhQgLCuIUMV~;O7Vv@$6Zo!lmwLClxMIi1n4QDP`!`lR z`~~s6x$5R)z+vnV_yzS`TOBu}npC*>#!Bs-!!)hnYM<*1SK!8=6-{BUgq)&zxX1a0 z%gv5qt|bJj&UC|yr>Q}4U4UOPlWVM`s?HJ$5_ymXQspI;9#rXJPATz)`?ROGa;w@H zW!UGi!ZBclJy>?eEwP9fVLB_}Lj-^!y9ux)b>Y0Q>;szfu%=m`^xRgBd~%xIlUP1s zGkeXrWcb=~6~j~bxKD8vRuXdKH*b@e8sOSNe6gx>96vpX2OE(LinSmpb!dSy5Hl5s zw%Lr#SrJ7L2xXA2}O4F7w^du->hN^9Eps-fL5VMKx zZ1+sFvSU+FN~f+fAzK^qQ+uZ%05&D2pF9JdLBRl<$_Kz0U;+rhVm7z+d@jU*(rl1H z$ofI&RJ$p?R;PITA9k@)Qp;5zn+h~lL$X1v?F&Z$Kp99plJY<0UKIrb$R!jwuvmXK zR=r&!m8c{Z@`@->%@V5ee_oKje7^qDA^E}E>1fQ_-zUHE73Bvn2^Y;V4)n3%gw-A9 z&z~)wJ3~t-u%K3d{U}%rS9`&v>D}G#OXn-wJE7KRZf=)8dA9!04yDP@lBzJP$~ry9 zEp5OFm7W+u5|8{224IXP%(&{9U1er8#z0s*69gj8s*3;a-J#wnT3WB|=;m4i>Hm4v z^`k3YpIgJ#dx0Y~uF%7SbTpwwGr@~yJ1U%NZ$xeIgHIOy4rmOFB{eRVsrcCjQ#Al1 zYc#=3%Q3UkI6iEeCXzX-8X$3riL^DALIMGc0tQe`ts`7<`JCFT=6CJxWdkwn5|B&e zyi)uRo4wz)8W?TisNA%@#riKX!5XRZC+~sDD zycC@3VU`$Fx(xl126ahu?b)Y92=>h~<)c0?E?Lq2JYQfb?zaD&ouXMO=_n^B3I@GN zZke|0OfzVyZIWsxGmNJDud7~GKlJYDo=-hp{k3(KUpcq$i_gbiJSxwrG6v&JAg#}S zOl%Gee(#Ogt0(wsx3r+97&8O_5Kzq!+k*1ay0KrpLp&m20E-c)h5wn3d9` z`87gY)!j1Is_41xb_|H$q3r5T zzHq4KzFT|N{4Z0D;>o*|5x;|(snM@LZ;dClBZD)K{ett!-Ix3!v!#Qp^Htrw!F|*6 z#N!`?fAtnvOqyS7#T516fV8YJ_}`a^3v12(NP6S(%m>|i?*!rr_Q^=#kXzzCQuYPV zv?k20HoC|A*8HOK$Jf@q{GZVWHbs8%8dvEdAvZM)T;Z?`U0B*8U%bFPHB|rhwwNERiwV2lOX9jQt&m=WtyGa?9N8I%HYMG!cj; zs6D?~H9ODdMj)EPNe1OW8RV0cUD^Cu#T5`xUF}V{@+z0iq0a6Bq!&lR@uCBEC#I02D&o0@!EiTnh`@ zpzZM)?lY0{VMJz+nAHq0EaS~%kW%@J=jngnA>6f=9qe~5ZG^@3z?il5G;Ru5BMDOD zb=|nk+;och9HiRAt)0ou3Z?h-s(X5v$RpJN%20#fc;SGsvYA`fhzPdY$GC-csM2Ni zM$D5Vcvi@G{(!Z=-x^IC3B?&siL#(M1jJ)At@HK1_#-=+U$%~q;3_vHRPom3*ddUX z3jOVq+~PW}-cM!*xg`xkz2Bu6Qfp*q-xabjB+QcWwW zu(WQ)Reg7#(lsGmI?LKW;M_3Z(N;Ba?-st%Zw$nfkM1MQe)rkUET$OYGzq%I1=X4N zI>4fQqmOU&sk?gRtL6un)FH}ZZ=E6nab7gb=#Ho#^gGUNaa}l5>j?WUZ=)Gw;tyMW zpI_}**E;&umpPBb46EUhn^ltz{&O!KjPsRFqbKS(x4HHgS9;dAP}MNIBFRmihacRf zpB#rsM(d7%VPU6`-TzxAS?p6CLWo%u466vFCb4O@5TV|S9fCQQLKsiWyePj6n;n%U zAooM~{r}NbhBLrEcjRO5lpFy!bs@Pp8YRUsTSSlBDy%~Xa7#S5w_I4 zGQA`zrXpDDoNz3uo&A3<8hrjp|2JM~`Nyr!)lHpO|4lhKB(?_B<71u;bDN&JQ|kzK zY-cm5r&_ zj$xUHtTQZQoKH^t>!9z`XY;KUvA^vU8vKyoj>H(lUP;~4gFIsEsk_boXz!)>s7D4| z7tO7I_VYq(aQJhN#s9ujXssk(SvxVzg>W0@zFF6@<& zz#)Rcq%5hLV+lkVc1z5#u*ZQVF8TN__4ttQ>zBE%U#{-%&<^xqzXJ=L(LG-I$B(Jo z+6Qm`4Oij!fA?x(c}wP@a9|K%O2zr2l|lDg%%^FJ;HiPzpcYK_F?4a>!4Elkmk zLp`a-wj}R)HTBPp%9{u1coK1lWi)lmQRSuG`t}q0-VVnnFW?q5>RXRX*PWgI)$^{e zY|ytIC$nn6?_!Cx@j*McusL<_%bELL(YGJdUf-j>@`3v1UgJ2!m6y@mw}6UyeU<&N5iyB$FLPIB!8^jG>Y_uw(|$jv4zvvt5)HZ1K6& zlcxSjWtJOcF)ILfmLt7TQx4Hh13QXisT={9r!2h+!#J0lK)K2-RxM4+KEwdG7W8zIJW_}9*t z$X*&MDJ{Jw(`lK_^^LBKLmA}sHdm#v99&`gF9vCaL@PWmEV5o8%*Cu2g$;^-SxJSZonse?d6mL8lz=f7&45Wk;)=-;0*u&5f>DZ` zVm2c)ED(6Ib{4;+5hDZ`na>}uftBcGi5<=e>W2pTkV`jcv?s!QW!GJ6j3dLKTY7(toZam6 zN>y{KGXV$fiweu?g{A-wIK-6=jz)~8^XySsJ z-aLWbg0#9h^~65M#j`*l)S}I|E>#EP(VacM&#op_PS<5~ zd|zBM_M1)B7tWf0^OD}D59p`EKrkCiNo!i-_wUdL;-2|6H5blQeGV*h+QA{`MYEKh zy)>hffGo_Z;+q2&kE_mVM3ex}HImHi>~US%1_E(}Tn(4a>A!EA z-Z@eIn+?i=p~TBat!Sq1kJp(_{>Wv2!-tz z(ot_Tv%N>06%5?6m~ZeYyZSJPvB=rh8w;W&_ay74j9r2?kwzTOk0#rN5in+qrWmC( zr7^`or9opp9FpgmJSWsY;+$~il1mXe0D%1V9~Mw6ejuyg{5-B{ch`IaOjyg}k`d98A!p z7P|Y2*fR&UQ)Ad80{}BD;+I_)%}Tv@n#R&dAc)5_p<3Y-RSkqu%UfUaTsS-W_+IVM zki4Ry{^8qsze68QBwjm8DqH}7B~Cjw5%w zQ~tV9x@irf%skXh0xm2H;Fgfzg`5(Ymf1CoOe?VQXN*#P>rvzo^_?e>*9kcf7Fx=B zg*~Jc^0P6{4g!>$3xSoy04dCgMZ^b%+0#B?Siww>%6*(+GHRa`_ogtqa_TfUIWKmCyGz`(W_&<;>+P_Hy~zQVlJ zp4NV!f0}3&aAU|K0mT#*!+pMw?Qmzb58d}r8%{&k1^<}Vs!1>@h2&2hO z%$JZ48LR4m0b~v|tt2U>P~if`m_q=@AfaS^F|*Ym%>s`Ep%6sVFdEN6|Llb^C?+^X zKmhR!IHi)9)(C-af)Lxf;RssO;U zhD^5v+09stF-0eTk*sJ&2yr!D{lP7` z-Vb9*<5zES=gmqFL>U4a&q&|CoDM~qNx6k}%CRA`xSlg9Ztx?KH{%MotN|*W^vDqM zN-VB`MajbY^l#n*%@od?jr|U@bKE#J>QW8&wM(!|OjUa#AM}v%6ep78aNN)gHjzQ| zYRvXg84}N44TowFvYbq)a_l+6c~N;xN}vr9=2K7XHBXH>E|?`>wLtBOXavn#QV$o-9_g77f-cS_;(DJ@ z=|TWh;?q03Ig5(T6?By@&IyT^%$8az=*6>>kL+?>ITyPHmNA5SU*zW-xoZ{@kBD6Y zP=;krdAA)&0;zFp6vqGXKF%0cPsAKcVV`V_B>Z=sBhITzO=N0*c~$Jq6IM!V_|px^ zp?K!qcI=lZVu&Mp=eTxi98?1kaMf;WI6)%{BACW9WGFG(K8ATBxJ9a&RJV|W14@yT z&%ECW&9Aa1GWtNwbM<`x^$P)mHJ)}|Hd{WcVfepZB7O()NQlQa*Y@IYW}3mb1xb|~ ziG*ehnp9ENv$-&i83RDXEm&hIzz7KhC_R$|nC{9-HH?7TCb&s5rc4sqB*-+SLO#kB z0I(b`C^*&Swm|0PSwR+MAJD=UD3%lItRVOD615oDdHVW`f2Xwue3))CMJi^0kQF+J zU?ZBLNu}Yj+cO6TQ-_C}pZVCt{X53*-NuL9=0qlN>yqH-S5w_=U-gH~zW#Z8zE1*j z_s5@KeI!9D9L=xZmEL#)IRxSs&wY0E+b@}E&3DUk;*n5xvKEMWdQ3k(?%J>* z@yvcMIS@6!$q3UfkCHPoYnf&aX)@+Vi1-~H;?kDirg zH`V<0W8$39$QPeXzHmUCTVq92#_5s3m(F*sU&s_={O(s0FCOG-yu!R1U<@p3jU}y= zD$J;IU%f<}Ta)#cp_<`X+DK-H#=iU*RdoR1YJJSIxRxMG>!Wx5-Fevp-#4zPdHz46 zKYh{r<%=^Lk7`HygoX9O!a5pG3}5p*_b1kQKX;+?^2O2LzLt6K7~fJ!LSE!`OnmDJ zW&6p%Z$Bojn=|qCM~#z%;>uR#mAxa^{JQGJZ<1GVmwz|hyQbE9Q&_k-c@@2~$H?1)bcE`W{ zkLV4*AaDLC^Y|v|uFLh41Gv(Q0MWj2Zbl8A7z4_X*GUI^uxVybum?(!TjpA;xC^6u*;m?1YH@?O>X=aXYk*;uuhC^tR)aP|~F?!`5Nyia-FxXFsZuMB>bfJa=Y3IGb`?K5oqL;1?`RF%d>FAHWk z^+ijJf5;|EriEX26G8#UPlMp0NL&%AqdY`JsN{LsRY36BJa(K^UQNCmk*%Tvye!Hw z1~xm1-OD8p+KUah5mmCzV2iGk_p#0wS=2LfyI8X>_eCAcuKeUxh^e|R4`B;`@{MA) zU(cY@lrS!^QkKu*-ty9NvsY1rne4}3V5eedmQh^XLpklmrfTd|4Z(RL3bSGMf0}SljM^5WJv>S9|fmi?e0P@2>_U)qo9kwW0mpn zR;KC5DF6VHc^Xa_Pklg^G{8^{1Og%lz|3d&CSE>>LLT9&Mf~|~7=Uaii~K)?L;OU#b3)W+j7 z0GmjeJ_n>VCQDa{=0mjX^` z2?8)&?+4w)9A-%sLLSFAE;M%cX71TUtG$(1&hs|}x?VrZ1Jbs3#{c`dszcvn;Z*pN zd;L#-3Rk+Ufhg5X&wV#n-n=Y&VkCBQ)P2{v+6TS*&TjeUrOx#W^ngRUY%ZcqKR&|y zWz{VmJwD8FgsX63muMLl=aZxNY$guA;d5&e2l`WeQE6o}rcB%4@3>}R>XoDVSkj6q zT14TN)ziTk@=C-h5)N6a$u;`Hq(*<#b=xx6x|!x^^7MUMl=iWP=RU1&I?dJBIWB3- zY&z{&T9fFBCPtF(85QE3Dx_N)K=?baA_?<#?)dwsBeyN1qe*37pV;6B-Qt1{l~F66 z0SxMa0d@bN5mS60Ux8$vrZj4pAo9qhNHsXO2sNJc!9l%$Aav0sRyd;_8V1G!UpY7N z%5i1ifV8AmJv?0dmm8gHTe{BvBQq^|X)Wkh^2DfE?QZzTt^Dj@^0_0i=a1;!5zZ&K zy!E-dM{e%>%8MeUkTP*Lwo>UFiDX_m`v0-^)^Tza&Hs3HkFM{z-^Ja9B)A24ch?8E z2Y+zq0Uq4l-4Y;JAPEUch`U_Qeec#~X1eS5$J)&9Uf}b6{Ti~jJJV8a)$gjVuI^ID za(Q%Fbn!0Cta8@*jtHO#$*(5mh?ON2goaJ+-<#RUxqA;ue2iy`N?UErU&s-Nby9)v}{4v%at$+J; zJ`m+`qw@9x+b;bivUnF&D0Rz2pE*t)U(xr{($4>UFV(mw_TR6y_!|#?kxGKzGT?uI zHBm$!)2J%i4;}5h{wt6L*Krg5@2&vgAYf{vFRqC-Zqym;3kx0_AP|Xa+k3@o_pl|` z1wUKUa>^SGKV2!-dYM1kealw^&;8~(dk+8fs;T41Cp;JJTmJHedN|&H z$*Z*3&IiJ@*hz~Va*-qa;nMJD%ZqP6uKdLdV+%L=?*Cld)FzFpRAvr~|F)%bpSw$* zyP#^xJ-#bmi+#LQnmk1Rb4T~Sca{Hs53MTlUGfrfs(pvuUpoJ`suhofKUy5P^8?-& z5=K@PKYxijdz8MdGxo#k*e~mi#x4wp2p|Cp00;(vC{~v#hfQ@}eN@@@7yFO9ziZ!X zQvOryS>U9!X1kU4cEQr7N z3q&>2P|myklw_w%W+x3nkAu|XrbIxPKM*Ax;}GKA}M|l zF!>iZc|geEcoWk!BUF+Ru6WjYWePHzhB&d%nd#cUX}avMH07E8G;cEPPDVq^m#mv^iel3QVVa;95ueN9lEm}4acXOrVdOpo=9Q5L1Z zI3&+DC6B0rN!S+w214L~{mDXUS%mEU`Kem&- zM?o|W5iP5&k0qeiOXm#d->ijj0u%|6CvEC65T@ft2$LK1ca{*{$Ry$YVd=yfz&NQb zri#Ru?jT+}0Ecjljw&a0#kjdcIANOp;;%#zffAxh&_2M69mH!F8cO)WZN!eLfkz4Z zay2&j1e=^@j7Z&fZ0t2Qb`Vt}UK?@_0Hnr45V5^K@%*o#i1M*hNwGt6+cl1CAQB3tyO-$54DGiDj9ngJ0a2||gWvshe@eY;^`VzuG1 zi5df0V0|I6%8lU!Xa?KTP3ycum0R1=9r_1AWD<+iiU`+7Z^$i`g%!!dW@!GW& z&BQKB^DYf{d}}uk#PqHpDYj#iFXpj{ zPL-``OGtuH>QtxH*!CUK`@j$7k}!I5&9=HCQtpyU9lRr;Z|R0=w@ne`i|06Hf!2EC zT|u?VMMMIEz`H}j+|fpN(CCk-M~)A^zRc(f*+!RppFTlr?vE^KwC_JM{Lw1vwk5iP z%E&U-9*DIJs1vH}Q)_#k_%;0XdfVQ^Ag)7H4~OGW?h+Ki2*g-aBOVnQW1%=0NQ-S8 zI7wPbiGbVy#z7#=FnGeCZq?`xx#u(t`RZ!>K_mL^U4XHKTe94PQe zob`vRpE{PNx!g|?%w@44T-r%&VIMC7*}Qnf3!k%)jXU8;0r%;3Se;I$Ev zXghnw2JevHuN!!8MduYCOLavc5P4)--@WsNQl~njUT+-$09x*3UBTq(e4*GD{(fW8 z<@K)S-E*|#i1Gf97uA1rqw}bVO>-U&FI!)E_Zek( z9o_%bPrdhiBabZS{;1YAQ1;M?u9K#R=dJ6#^Gje%8CgLnL4)f}J;W}1FWlR4@Hnc9 z@wKgiw-zThwDW-|amdtdqoq#P;YWs4m2G>E^qw%o_sVYrkI%!7erZGnA_|pWp~4+} zYf*IB4(e1eoUk7`)oAaJE!-qEloF>Zj;O%6?z{Q@@W)Gw?mDsZyIX?KEeO5*GxgY| zk(GQP(tG?9t}Eu2zIs`BuQ7pJ-lb(8qqVPN@{JWsA1wLsTHhH@ai;rkd`lc!9(j2I z#x%!8bG>(-Y&3TD-}yoG>lK)YNyDn`N6nCD45w8^#HIiN48)9`orxb;M_!*Fedkxt z+t-z>e9|}LIwFaf&}f;PRu&nr|ES)7R_MByrJ9ELN55k%LC4lnKneunI`#zhmD}~z zJB$rYKnNXDfesZaij7}Z6PKDEk7h)XKMqrXo+ME_G0&U)g};EO_Oy46v<*WVbeN8i znGkk9C1yODBT?)gxLYcL9KdQkoI;6NbYf*9$x_W*3mJ)pK4>oF!5^YDOf^L?BrLG7fn&5_RNSFDFp~fRN6thq~ws0FVq_V)<{aQk|O{tBqYKtvv6i1aiPM!uL zO|0(_t30)zUKr{M#(fd7Gl+c=qdzJRFU7tHw@VenOG(RsdsxZVoxRf0`^V>PRAx5_ z#WrnKi*)}HiAG=PwfmDMpZ~RGRiB(sqMBp>k?|GH_I-wdA}~bJt$862cJ>iAVu?VV0FMnX?QBkRu_4xD-MO#te+>yK~~s)BDwfpyZ_0ElJy_ zCMQTC5RW;3O#~*Pg5`QRfZcJjyb4;Ep4Y`m#PEfcDYZ2ppYMNb zS@$)cs^cs5RzHtw)F~5(ER;I|LEF(wM5<1%32f+)>WWfQlO*&#@nhAS=Z5C3*Bg7q zx?*6Ah=Sf30D})}yg%^aiq7-j9=h~yWn9(Hx|_AO-XZgEam*dpaqjEkZ`aGCDzt4~ z_5;V1|MwJ(Xq^|n8U1yOJgSm9WYi69XCDaEbK&0Z6Q^TLkNmVT_~~Cp`+!*C7QA+$ z*pX>ReP<77x-x4>_{&xDurjgQQ~Tr1{-+lN-&`zsZM3=w5X2D`=#S_<0U#h$xQlN) zCc0p~|G5R)`WCsNOmM4oQk~xB>pbRh*O_~{Z#dF%{LH}P-^S*z5$j5n=|jRV{iOZ1 zv*gWx$$Q@0cmDIp7{s*h8UHT%^v2?sFAYBU8QavV{j`=kRPQVQvYjwHaQBD)N54cC zv+Xs>an^p~#0Fw;9*MKQAny$T0Cn1weaEZE?4j@K3Elp-@AMms6AyXk-PK!phOu~4 z*%!C_E`3%QQ3(PiiY!bX%64^!pZJ297YG4}DiOC`s4GLx_2ru!PhBAlsnEXtla_h% zj)YnUWUhUA_Kddac^1zRp7OeG#osBtViuH`JhG!HUIrPURr8LST+C<8GK2J=0{3*4 zAeX)rv@o-x%%@eon@m8!vN>iFL{fYKGicldaI9pQQB}s|!(2}KZmc}~YSBiU7*7sk z%<0!$Lb6FP``paH(ul{Dw$Qbp8T6X<0S4Iv43O7$<``z~njw-{Bd3ZpG59o5>FkrI z-7OuLsYj+x8Bai||IA$5EEMEW#vu#hlZBew+}foDaD0ZCL7;p#t$CVR+tvcgQxQlS zFK6mxF54<9=6pv0n%RsVbQ#R4i;0-rH@U}LGR}Q4BU`0gAg5;`rB2frP?|=xsonxg zfN^Z@1puG~B@r^Fc!U4}zNLcpyH{Cr)#}bFnmcJf*a_ z(i0Ua9ylhlXgda?#3spOt9%>d2;5HtfRK|sP8l|>_(U=*AJaZIgi zzTs0a7{+z^m`N4?IV$nP#{LW6fw*oveWv5&=`5l1sOGwAe`m2hF|I1Hs+E?xFs?(w zpcQU$L>Wqybp(KMacm{;3&*}*FO8{?XAPxpCG_Mkw$CpX##MxFe8+po30hAm^4O2= zs}6|whGP$YFV7ifKWVCWe3cHMcLk|K7G0_W5a8$(nHO8?MrC^M81&g0N!FR(K z&I@O&)9Zta8zc`XVS0&QWkF#Nb3@1b|ASz)+9s zQ01;ZXFvO}lJ48*Q@0x5&>3CcOehhmJ<{+}_nt#~9{B|g#`+`GZ=VtTXieywO}6QE zTr)zOIwwALeEo3~mb~-_U%bmPtcchp1fJN`ZJSbE_58`KGuZvmPmLQo?W4*;XT&Zf zCHU0z%2)zo#u_wzEl%2j#NcSxG$1)ruYx*bQC;w=m@x8gU(VPQTGx$C1QSOw9~Vmz zg%%2M5Q41pqW~hwOr1eOUgQEdBjp2Y^AD2$qHzAXKw?l5l2s)ljc@F7A2+e?(mkW0 zME{%1JMaC*K5&qgR1&0GFOTUg5R;rzra&T6Qf$|@_7IUEa2`oGj~E;L@UQOc zK2ye5f+Qd!4<)EmNp1iF1s+XkjXuZRvHq79LDH%MQLOcbzg-`AcX`!Y=QhuN1S1LR zQjHEj=&b&?8{&WL=sf$iAY}12O7MkWfWON6GGKbOSFMIT4*GbcY zZ!h&d{2g^D%9L6_)S7!Su6xhh%X!pfBGAxhe+AxHj5-tRisdntscT^nc__yE!@!V7 zZ_aF z7av&u`~})yjiI*}CDyl!btPh%M=WtgKlwBE!#dARM-|<3lJm^Hf=|xVR_~I=R2xmb zoqONuzT?Ew&u;MF_>Qr$)!5b%y#KS353UVA`Hj)sCsY*`e{nOB#h$r$#eQF|j2q*+ z{upWMFxKu%e7!vW{VIJ^8#lt~X-Q~FiE`jX+l6zBmpl@@{Q3U#ZY^K&p8L5gBG1oP z_M2$@wcYjPCEAaxo&UQec;jn;AP%VjNbBb^Ly2+L+Ka)6 zgtS1PmMg4)o8(|@Fri2jAj1^9$|@-dW}cft>>w60$p$6ab}~Dt&4whQ*`l*YV2R28 z8?0P02R~c!TmgD4PpszEn4&BX_9a&jYf6*W-O{91keUlGtrtjYr}eeC4@S>dUNUgJNIn%9jIVF|SE7pg4>3tiqV3HrdQm z_WS7*#Fm;`rzijnGK&VCGNd30kUGGXK6o|(L%=C&eQtH4RU3^^&DRzJ) zq%!0P5+Own2*yC9D42wE#y}BCg&P1!ih-ubvZcAwtN_ei4}=oX4GbrUO9epy0OC-< z;No5*gh{o$!!K8R_0Ly@Z~e^q(1{En1c0S3z1b&}y9|Gf2!wa|r9;Q-D|P{;(&6Kc zFILlHC+`Wy+XuvviWCz%C=#~#Y;IK;S4C=zpgTx`@PP;^ajM5m3cs+x7>IaoK1AEu zt91tKqst|MGLb+$A=G&wZlFI5l#)sp*BKv(0AoUtjTYGxf9&J~QRSe~7|~d}Ke3~i z08rH>*LYNi-22;h6sY&!qqJpBkyrnq5``(XToRPg6|vuUMz(YTfXaVSMTS0_(xR{hy43s-!bFEAFX2DL8079Bmo#_ePMBEi8{L> zv9g6l65v$8;HYy%q?9nk5>*Ta<0V(^>*@||`euE_=`)Bb0!O{MKm7fc(tjUlcd7EQ zVrgiJ>)7!^nbY^c0%dF&B1>%Uti10C;mql)ul*bbV$k6Skpdx!we9Ycrqn!pqVLtE z-FJK^Rk>{SMLe7UgXz5y!KH|0PSlxcj9HCRQ_CP`_ud!>g!D~egUwqc1gJyAgr3^M zGQ9%;OdasIul5Lmjt>V{(~Zap}@p|kn?_v4$o)G-x$XMlR`Lw~z6@czp7 ze|@Tst0W2~z>S^|k%hXKPPI?33;(*k{rWF>OqYk3YCC(VDuBVzU>Q&b43pRWXia_8 zCMNN>|J6U(KvXDqB1Zy12=Gu`s_~GNCj<~H-GNX3Du4PEW!6xmwV$SU2<6e0J=cEH zu>9W@&!66T&YNPT3mF^o*RA1i)^(oq`tbJ0jP`-;qpx-BF|q!STcba3?mYWdp~Q&^ zT^v(c`SLlSvyM|=imhl=##RwUVgq5l$>%&`Qprt+Q&|kYztsQkQZTqUq$KGS7=iFm zl=TFOLs6$S*!CVN4k;Bpb|R4YlI^Uy2XyASWdGiq-U)rZ%5(i;B@dtCK6kHyXBWi( z*e+EU3&nOoptZ%?+LrFqp0>}O=)7qE;+HSdRyKxS{8?YuEY_8XW2!I`@BjC^;)n|G zEytC;du8;8wf@Jx#%LUL7J1`W`?>oQiV%(oWiI#aCxjmUTwA(L98ppF`vbRQUO+KlFlLsdLdRjv5eTIH<6t(8l?$eNhU7QCh43u8P10s60y9ZW zcc^Bee1?*YSYwf1QplH>;-{cKfz(n+G7iEriBf+uSt17@JZB4-BuUCY$DDr}EWaQ2q#k3_5@MaK_J4AQW#swmhIF&Um4ie zsT@2mKB|(|77H$wj;~SoAH!SwdB*@Lb_!lQQp(!~$nbLeL1QCN|D?xs;!vnB!h zxG<(+Bu*3&T?*3~@A7kow88~CfD zSRh8dHhEHwQ0ff5u`Kf1AI@tIAd_o?SA4{oQS{^~N<*=>qc=RHL^*tX_hHWxkyd|w zneYDZ;=gQD|94V!bzAW1g}kv(sPVGafzr3mPONF;2;t)<4J&o(06Sj$Bl`MM>Q-Yv zY^hy+i~rG|pf@a>HB*o4vLbR>Fxvde%zDwQGGB!ChLmZw?u%weYrRBBI^$(Y_ktXm zE`eL3c0|>yHvjvFvfJjCo;@?sGC)L11nNF}hU>&BjsKaCfw*Jup{`>m4m|xE#trIJ z;;Y-d7tSvG*WTNYcqz8B)z(l%oeD@od`)}tHTzZEKDXogFa7VXR3}z}K#4$&&LDNj zmA4!e{CRt9RhwMz&5mR&%qUXZa-0*95`plTP6V1(oSXP80uW^3gkYDz;5?=QrGsJc zob@q1SqEJ?27Q*F^X{O(6;)W)pv+_}2oVbMw;WKOj#}!8^gk6_(X{K(|CF3_Wc6DY_@4RMclXy~rQ7KA zdoMen^xorw?=0!P^)u>H)v0w5H}v(bLS1pqyO*fb8$w^K>U-jQi0b0dGLqc?=H<#oA(hXSX<^Rwyr~#rFQ&KMudU#Cy%5 zFZJ085isQQD zLic^(zxxT0#G-k3ciWHE7OuCQwhwFRp`&X9=RHyM+as*0n|J$#q2;#oPo`cc>*xan z>ar1!oqCryWlE2j*DOwK$wSkEmMtV7yRCv#uB8D15vpqakhzO;B1EKuKk!wh1wM9Jal=Fw%| zOdS-&n={TH0L?>oRuk$BNhCXbGxVDVL7G>ml~8F;PFSa&~Cr!|t&6-k|S$dHuT zz|O+{!uOSe#r!9y%9gsDj_q2+5HlLiX$`Y%l{8&3pCh#vl&TL0(}iM|#VK#Jqj_(~ zv>QXR(GY-eL?KJwU}H9C1QuT(VH% z=FR=lCl?5!NE|Y$^3V!5olv8kI!l=~Jj4GmuJfK?^!IIAhu=}@G1~hRfvElJgV?S< zZQeR%Y*o-MsQ}W18X{1LX(&*}IA@$l0vZe`0RlW2qhl&v(;K23$*@xP(`FC_u**mQ zD_n^;mI%Ykg&HsOh3#k0j(xt$zN=5YV6VVyixVrG;_ofTV9fQ<@$sle3=X0If`FO< z2!_T=t39eij-RoIv1mKj8H*$Uxlr#Vl(2yakp=FHI1U>pzIUBGYiRF|9vX-cmx3G_ z(~)qb1XKYXl2Yz+j;@I9H=OP473;jAkN*n(=UaK!5cge2(o$#av(v9AA}-23k@g$h?Xj{7M`wc6< z|H!s;-Z3_`JEvA7N7PwjO?&C>hn8HofAi^YMi=f-r&J?HLLsraOPN$t`Sb~5OjGwC z(R#vbMqflMwj<*_VNkn_IwO$0%gi)+lizhF)_Q;=wgreJ@Pt8V-moVGI5z@ulDy~m z{}Q-qnvlFtNH2whAabj~|9>bJ^S%^(&rLrEV?^BgDu=U*7`6#$^Ym_Js2&k?Z|EgjcbdgJ(x=bSw{(O*S{hrp86<&L7YP*}q1>abYU)|=v^saZ>%0R>o;p|G(H;35Xq^d4|0LcI8g|FYgd-;wtN z=bqQEa-4sV@2LBt^A^aXCwd+_N1D{2FWVY<>g)Kg>-4^!?>;t%fYvt4zh{a;5VK3^>FH4YI# z*DF`Yt8A;2^UiEgELpGf#}k{gNZ?pfzEpoz0n8GmL2<36OH!K>z?L!9bJ_DFu#v zTNf$!B<%*#7Z&y%O()j!o!z9|#TIWTb|pnHN4C8u=~Fl5!isTP?BG2?wzHc!RpM09 zV5G!OitUI<7{|UaYw_s|HtO#!la8G#9XVN?QcnOtm4x~dV|9yB=5&_1#ECU6zi*S< z`i1e;@YO2&&4)p$D?SjR9u+7BLLhF?BD>KaL79@SAek`)DItPDbf){GMt=nAi$M}F z9M_jOvSuG^?#GxGe{UH`g5%6t(jntnk=;G4H2(W`>G1KcJ%;%bM(nwT#384xhLA`C z>Kq7R2zIYsQA9Gnn*P;{2wZ0bfG8qxgt#G8d%`dLrj4x<$5h1Ut&e`cQTwaKe%cHo zP>R4gN6uMaSUGLFZNCwop(Wizi}ls5Jf;by4qEO^Sz;!1;*e;O!)Wr+61)BANyb2w z_l8h6BA>5O_84N@cceOZEdP0{{iq3%#y)lL;d+-}8d_{Wd1~U8FSU&w&Qqolf%sou zEX-<9<_wK|yMc8E5kRObPOR@_ePQ*$QHdv7BA=`-d*&2SWn?^QQpKaX=vJZJ)%?qY(j-KFuZ7H?OMqgO0^;ExePTvDR zL>6pTC)Xh77}K?#y_HX&=sI<3%i%91Hg>9$s?cCW6tpef%9NU#PtW(i^hei?U)Fzl zQRU00wjK8>b;`h)Twg?;3J+^WcLGs55{Vj}LBVU2>b-hLaL~C&ND{ym6t;J> zz?qlhTpVkidxgUP1*>P06kw7CT{5DD-R5k?n_!Q1VK*;eIS(`Z0Si-}{|rHI8>oKf zWOZWo#>o#?-f?KrxwE?O{jUFwWpZtiI;H|RvQQiVq=q8jbH5wy0cCUk}R z={;k*=j@rg4t_=~a{z!)<+cqgjV{_joeB{MXp9KNbYm{^P+S>R&LbM{3`#?af${i; z_VPzgaGkYB>oG6rT|ueZli1o_bj=W<(v4A#cvGh)#9B|_oj+VBO|5w0jE>V^Q76=- z_!wvMm`eW}OO)BejhsVmickfrBkNy;^yy}E%;2eM(?fopOdCuF%aqKkI z41H^-|LFyZ)y>qU3MEcySUIGR`SZ921meGM_S|`#a=^II6Z4f>BdAA}y|qUBK==7C z+UAUKo-*70uR|Oc9uQx+Df0OWy)P(Kdxc6Dt#WB=ntRWFM%i<;^Tb)6tB!D8d~kHp z=IF;uxj!t_6-7T=7XNvj^Q`@1zpN(?8APGzrOQMA{W`Mn=duqUrIp^E$=9M5FM8*C z+bMhZ&bT4**9zA~r@0?EOJCDCaK?XQ%l{O;waRg`9FvCGD1k4JS_I%!r(=Bi?t&F5aW8% zR~2z6wAck>YV|+Y+ip5TDs{(K?*NgaMLU<7e%A4a2*~s9Tux34o_p>j`z{T;vs221 z!YzSY_(Z{cY3Y9}5X~+*S(HvJe*kl@Nll9=XiAxe zt=24(Qbp!3CmBN*bC;SX^gmv>(PV;^H|`5SjdUWC_ays;SRSTdQ384SN?dGpQ_{0L$O7*TlKu!SbwP=f{jw44 z5&$7~iT4EX-6dd`L6uS`3lV`KRU}X(004t$Yf69%lsXmSRD?Ooy&5YY*?o<+={AJ%`m~zOt*b_g3KsZN^oNz*90TVh9E+HA{3d$~3f94n7&x%u|m+T`9Esn2fcAYm{oz;NdLDCx*CR9;@@PQ}*i1kGf z*I6Krl!#SsHV^^igc4w!C;}mXkvJ`J2(pMfy34LTO!r3zUS3@E?}OyAl~fjuwgJ7- z7hTdAUC~r>=V7R^@F%OqTCcXbyY|)X{Sb#-4}-1o?jzK4FaO|I^|@{^%|-cWkq5#85*?mTilION!>R&{1Q zjccqYOk^PsdJ;_N%*VMbpso|qG^EWF!!mnvP&;INoMl9K6VJ*^0M>VZ6LMCn9Pzs# zBG0Gal*)1nEu%omTfwbd-n7nJ=^1PR|3}qBARrXk!V9-We&1gA@@dqi>^$fhqrvDRDp!fBm1e;HrfrcS7iZ|JCg>uhaD zZ}79#vO|G1lOP-kM?w$?lDIC_7qQ+D>IMSD*S414e~kBv{hIcEOyA{G##P2wHWy!a zp!c$UJ5G8L2ofR5*O3w`y43Cq-fZ~mPVdG023}nxPpm7T?*|!jKo9Fe@9E* z+#f0V@Os|s@4xXW=jkV^C+*p{*Db8O&GW#e_OtfynQ)c1ajoZ$OWpUK8MyWB;KQ#8 z?n>{IH%ha|fM)PO1Y-$W=622*H+0$Q; zp106g26QIC*4jbOey zb5I;lGMX4u^X3T(=2p!;vOvh-!vL(!Z(37$DwpiFeknsN%yu*aq&>F}R$r@tl)t5r zL%;d0=_qwJt0a{<9+OStW9|qv#WPhDv*lXOk>&M3p&Av4myV6ZJP9+Y83#&%X6}MW zN1+5X0}Kv|l)UlPw7L^u9OF8%WnMw*c{on0ymUwzU$GO=0GpiZD_@B2Ge#I$iBXNO zYQp9|uqyz7z>^aQqndEoM7FjC7zcq8j}5nWvQSKzSjT?d3^o}^iaa7w&~(rZ5NV17 zCXL%n7u2PiodNp70DwgfkOW{HREc=)(tcw|u|0P0*T8vL5uMMULX^F4b$a97nQ7yJ;n=-sysPXEnT4=c|#L;N=(Quq;2BCzOxp+@l zswpC(z}g3ROrwfOI1qx|V~ckBq18v-Do_B%DFy5eX`(Rn(GzJ?UpGgA5TY4udry4n zPSzO^G()H_7ROf`fYf6X>WYl@?LpT%HmQad;{!8E4tL`^asCFB>`Y@&mwH`1G9*Pr@(jpr$#yC=$A~T3XB82d8 zT%J_TV;b*|6yIy84H~Q1o#FlP#Mx8XaoCV`XZ-``6aV8BpB7#7WbBr1wQsf0tyJ1k0u$KixYK>=x|Sb)ZYqPvOz49al+*>abO`VWN? zLQrQ~OTRp(qWXnXL!Yhbyy;7^#-og{WCJn1Z9pDTR&m!6?xQEh+XmWBe_fOu#3li9 zAb^^|`Xlw=nuA*AKBe#SDPt?+E1O)W%qY9>*!I(2jxF4#OsGbKrwt^zSni5% z?(Dki{nE!y4*j%A>+*{gZeU0RqVMWar`8Wyai{N*`CYfXGHm%1Vtq;TAQ;oM?On=@p_MP3 zE7g@mzF+76-w)g$m4=qlQfKnkP%s$l3G!G%8e8K&VTL@ZUMP3d+LFEtUmm#oGwcr+ z-Fl4c+m@;vLZRQ~yJ7XVUTurfFVQ+QuAuewlh?&d=IB*e)kF()q+ zGN5EIvLMS}vfl@p^o24Zrprt7@-Z=CtJ*xpkSx|Uxzb1u;4;B5l4(oRR!bUkrFAR+ zG-UcDOTG!gX8}1B=${-90VaDAl3&?uGnk`W=*SU!Ok>)t;xC|INnigGV)p!lsagyk3Y`#7WtWHPO;d7^J|X4{7;Li%D_Ql7-H|WrLUoaUE1SqiG<7KwLwYjg+`j zo+V`|Yx>1GPy+SE=#N4o>$Msa1}SyZ*&}fvLiZZOm+t_bLGmr*#BIZ13`9XVY_k5? zH>vAUy>`B?1rX@e2K}4WBq>-Tg270U9S0)p+tuJysY6Mhd_@2Nk)|3X$sAL1zI8k^ z4uHa*!@;HU6^)oMh%6CAq6)mNPjJcN^ahCQ#!nlAM?Y!1WPkPOsmkao4k&a7g$j=d zKb1q+-Kw57 zJMzG{tiw-+l-gT-6;~b9`_m@T7jb`ZG3@Nscl5x{9{cr&u*M#YCTOjfwGBwq>uH5c z9ACwghvAYpENHsuwk6NzB1Z%ussy2U_^J<-!zQ@?wJ-gBJ8$<>o8-KFKRUWRaQ(-u zrQg`r?L2cPvgu-dar}pkw8Djfh$zycM~^pp!g7r_(bA6s!HA}J2ko+0^5Ai(8PVT& z0CH-V4S%fXpeJh@@2~pqs{U`+jl1@s{vS8@|FF@u?+EXWbB*qhI<216dPDckBas+m zMq*u?GQA$%N_<_bOCa*(8e?;(w#x^@OF^O-jDkRkM?u|44tLZHT4dM53D)M9hnMrt zfI6c=aI4|Z)`Y*?sBP$kgu&xFkLl8|QupzbOKv-adhNc4eh^CSfZ#rD`oQBq@o3yO zw%+Iq$2WIYy?VB~&+w+%k7HbyhZdo35K)M4>hv5kcGMeZw|>5+?~xzn(dEgpLv3n;6+nxxtSTfj*R_`;LVv;h3mkYY5rTYi*{`%iPu^Tc50 z^;r0M_SfIx^4(C8qrCW=P+%p>4V3UmTyO3#zxT+Z%lGa0*N4IPSE>`MSRfYP*rATA zEV<$s`-}#oFWh?m+hq?OTlLH-EyuqsmO7|Yp^BK;(OdbR&fFOsg69H62j=*DjqOrZ?UvtauII`{d7qoTl>cr~AUrnxK zr&PamR>uWzMt|67n^w<)apnsPm7b(ThXxZzR|MYq!+z-an$Iq8nRy>L6zW!uW}jeJ z>VLnv|MBm8Zh3p;mKRVrTKBjQLUC%7%HO?2*<(n{0S{|yTh-Y^S#QW_>Gj@nwDT;a4hdO73Q0c{prfusSc;xHihfeogcX)j9*1(HDg+E{6z4{REbw@bQ+AH?k=IFfD z#+GiO)Fl))u%u-N?7kx!N?GltoZnr=U0itX^p`mWyi${mTNTUm22wJWs95&vdI zo|Sy_%CZ6*B=*p;;Y!orNvL&45AQv@Do~8=6U|I==;A%zM5x0 z`f$(xE*?1hiO5%9xUap;{p3aAhd&A2`ajWAW54`xada)nB5&!9y!2h~NmrJB^sM)j z+qxT$Ppsal95s`-_R!i=B8%G6&9+OAm5<)TzyHku;JEX2*4&*~@P|-Y36U7FDa7j( zhEV=6z#c>V1rOQA2N^Sje`%P!^ogLXxNDz}BgN)q#@mUCeS|$06Cqc{+P|f~l z(zr7FB%7@XYGO)?Fxl%Q7kCaJB4$`m%GFUin?YfPsY>P|iS-{zlW0axxyabcGDtc@ zV&XD?4}#Iu29U*Ah40bGQF55fQ6P8Rz9GQql?k8RyL)_)MXu ztW$_Mn^OVgX!0tOikr43A$bYRt!7G6KqSkc>m2@V?wYK{l-2aYBn4TH>gLruTV+#q zvhj)aBl9*VAG3&_P~rkbg6;qjsih>%fKoS)75;XAUQ| z#e8dL()5Ltx!F$}gy};`g_r%X4vOq)IyotG@-1zA)lRUcU%EvcIwbWTKyoBzA#D@dpbM+ zYU=%FHE9{(0}(b5&>uTP*=sm)s@NZiy|YZ7IfUy*4J3$r+yZ&Q8NG$I3~}7szXYcrjrsIs8V8WYsV?C>RY>oB0HhL4MVJO3e)PsOBxdo zd>8(1gHYw+{wNP6iZ0*BXzlmEu~eB*Z98am_=Ax#I}h$ti) zd!*r|C66B0^Titf>r3UK#mVb$c`RY{1RH+4I`q{#!DFla?8270&nctJNpe5uAHvSO z8Jbm!nfbxsyu}i$kf@!>IrTf&qrl(LWBP^vul2G9%j%KyqM-T^%-8T)$@>QcQOYB6 zy?LPK{qyWI8k+WfLfhFV)fXkU_d50)S^3}|Qk6$*_VqmUL*)1EsIi`Ze^LF$*~8{v z5#QCPHTv{spZoYJo)f3E9`_PeM5+izf28W0%Y&b-4t};uom$5j2LR4EDgx)g4Mstv zh=53RP6%k*y4^=it9b78_ETSuFW#<9u1l&KeA=j5mSujzSy^`Vv9CIEFlaj7wSp`#*McA zfxAB;PDR~!tUP;^de{{ENpo-@tgYM`|7|1h^b>*Tt9SM<+9(byR}Y?SJ7!kwhgIRH zzfp!yu${bT_vlABvv5 zU7b5cTi2v-XaXS0^by4i9}ZmfzkyTlEME7z?bIWU#T&)(_1qVv9tUgfv0Zuu2BYye zezaY9sIhW00-+T}o^KunN{A$aK!E^65*XK5b9dyOAM~Z0z+kq64izU43!VQcE%&Ci zomfC24wzm$E${LSy0gg4vW_DVf+Ts3S_apq*G5QBV-87tZ-RG_fuEShEEY6xa(RP* zAeyjiDtXt zp&5jl2)CS-v@+yDaip-PqY2U^OUych8C2VmI=PBj_G-4_ z&lf!avQh`8=`GYv8Hz0ZVn*r(220_cpj=VGGFZ(SW(MbO#-VkfWji{vKVmv=oUKNR zeydcp`;e;3U@Gu*!I*AzOikoeM__KbyDgd$;2e2co0bvNlcggEMF2oBjBJH65fDJ6 zV3(7!17>(fGB3tSsSA4o7}v<~3f$0U(i0#6f?eW&Hq$wy$j~y}+yM?H^)9Z{VHJ?j zu_s`I(wQUZq4hC901lI=tmF|Gljsp-f#$Rcn=jR65* zoDM04grR-%r}pj=kj1Qn{Dc7pv;X&W^B__3|-v;e{U$hV1r}s_;^e+x&z2KC=wBb_>%1)3AD^5 zO{t5&ybx@XIHflFzaPnUhtLWSbt)K&^H_q&UXUmx4DFBY&U5#opIizYFs|c3#Ms)+ zC&n=l*H*VcTubdZRJx=?#~B+tgrTMSj&2guiN_8E^v;03rUeip_8n7PMp?Ud$a3? zxuID@OI%9r<@+^X{Cd&A(e|S!ML+yg-_j*dt^tS48vCj$Tpbtf6?pegjA??$jyg+S z4aS&+;F(loKYfNgu_nH}$?%0i7C{oYW;lF;FDESZ&<7= zLIUdCv61gK5?KVD4ZO8%_){m@_8h)`>VqVbkQ<88U__)^V~Ab7#ao?bnL zqyuSgy=Ja(7~EJS!#piznav{$*n93i?1qZ}Lo$-{+^V@7EUSXg|Bh%vFs|vle6^ok zq)w@8oc$Q<3KE;7jxH~H?0BiJD6y`+=k9sYKbyo7hdQhbM5;IUcbxU6`{;?%sB(E& z2@;|XEA6>^UVKBlI=ME!zPJOp|HmcJb5^Gx=M@*`E`JB$n-wnP0r!uYH2*mVeU-_%&mYz7h{npO{&;FuL zYe0hm0(C3KU%t@0ORHZ#&v*A1n9%Dt-WPs^F*EEJ z9uTf#dDR%y3W%9p<<)RYVyeUGuDLz*&- z_XL6uK3DY8UG7hA?JYW9`+1ExdyKw#qd1{~xa>d)P%4bAk3RF2di-A6yk(@q8@l#+ zp}t(4&_LV{j3sz)5PSOBjtTc9DHb#Kdg{hYDOaMs6w|@$(XC_as7(gW&%RitBi?D zr2l5+fz<6NCeZwkK@NgtKQN8avf#jsq^(=s8MJM|B6)8!g2wKke5PJ$hM2uPGfUfG z;sscwtz=hN2+dDrg7TR(nU-Lt($eE3^*IPr%QRQ!{4Gfil4J!)rY1-rZ>zyfdCtvN zkQs{^mjRaMHjm!I0$2t_=C?<|>J(g-3Ovk5^Ev&Moe^eg&`fQnX8G%Gt_K)XN9EVi zylCYw$>xV>j-U1aloAp0U}ze^XU1_}iAhokkj#Nr>m6HwfE-i>bRFUe$UQknz%ZcL z4Uz!6dO=8u66t>ck^rrJq|yuEz+lWmn<#)U1UtLv9wQ(S!S;TTh3p26Q-w`!Sm7Z_ zGn*8*0*W9w?HJS9C(A$-1h*Y%dJ84_=~h#<(+um}HwQGyHr5~t5RPLo3Zg)~4iHnf z#$q%^hm;5>?!lh_38FfvG5`=&gm8>~zm`^cu|Gmo5i<8c5dwm#D;Wb-B&9A4#sHCc z?L?7)aR35=D8zMPY&BWB9pgH!aHo1p5djD!?JHag-`N9%5UZc4+>(xG#)bJ3;5108u2+7|0^l6;rp3^o3}Jo48cIwM#x?a_s3JVz1d8kDnq8 zEiu-&8$Cffsg_7o7+I~aZXVdwA&o4jWiDFmBt>@l;4xH@P@s0r5NnE!&HNstt{k%PGhmCJN<>i4RCwfkqAxUcdmo4@arV7=? ziQl#<`;2hR9@_ocs*a2Ia*inL>-2Mj6R!%IPDFwUMj7YzMcv|uiR&3(Utql`;QL2x>(!UYd>Tx*yYeyYo#H@hA*rP zFC%*n-*NhDWFRV!EJK46QP6hvi8bE(-){)Mzr6RlPimeThUE(oySdX zp7n^>P{d<;=Oypee0FJc>8`}87OB1%jnr`qlIAw4l{IUFRfy{#f+PS*TEk~g6crrV zrV*YKNScfO4X!P0aGJ{VZv=)x-sU|iF!%n6i12?*f_dK%fDppCwxzrJjk9dChc=G9 zTWj~ZkDXe4>E6nS^5}}D-Uq%*Z0ZuLJ<8Y$;K+f4!G#(R3&wk&T?mX*mqOh(M8HTw zo={~BMAWHuj>E_IUi&c-h+va5cTEtEL>2%!FqV-(csMQ%DK45leAi{~gx>p8ojEkI zrBfPTUGeUPT{nFae0P~Ty@7`l`u6UsFRv7e?M+8NUHQco`nIn4vYqmXasZN8*Wx^R zX8FtKbzbofkHo8gy(#p;vhGV>Z)p2pY*}OXX)j_Y5<7; z)mU`LvBkF?)BnI%{)fMnhLqA8FCwz;0P7EXZal(s#UZg@H+7x%EJhR3m@0sj%M+uu z4>@|SI@EdE96k{4zwfii59GT> zsIvDMX?&eLb0q4_@CA)ct=g)c#>Q477?k%K8~IUcrDf5T|#bDI)$VGZfcl4!sw4nkt-Pq7%tlWm0K_~%5B#K0Avd~Zl24g!r zh|BI?`>L_I$@u9nY3>aD-5;T<*fRLC<|t_xomGkh0Fty4J2i3uIPfg!F=@&X^3kzH zvQ0u13Xom?%oBm6$SH8x)H-3rLBNU$bwV0AnG$Bf1AygJ=b#|gQg)6-M+$RVGtIuW zJO{`??rgP_@HK;nb}v#SQ{{OAx8R{H@r4x}1?-k#H})`Dz?do3bmADZI#6PcI|zSI zXOJB)=^;nbmzbtwA@D+*B_xwYS^=CE9dgeuTBIE-EY1g8IbTiSGTlH{DPnga_Y7_( zue8H-ld?L$b#rpabaBq;%6{fv=v%02sc}<4YR#EJnD;#YiRE$5^evEKHfElyB|;&R z06_pr%(trpi9$F6+yI9JaXmArFv*NW3ZXc#ekgWAPr&Lx0>Pm`cL4lR03-~PTIy8B zk^sRdbo+_RmbCrNbOtg;BmqiXX%cn=6b6SH1OO3|x1yL2zlLK_<`xf`grOMwV;dn- zYJzeEfdD1kAwz$NCiM}FgCc+|@KBT}0#X3Z(zz!mTYA?507EfS;u7~64anKbCP)~m zOZeQX_Q?vc$<%GP5Sww=jR=$wr_4M3@(I&~A*E2{(7sp|IQd!qhQl2f@2~7X25b^W z6GWA%KoNifAbLUrBztMqkk(H}S24?D?d_8GhSvr=EqSQaQyf>8}5F?-M|&6!ev2ia{T*}wUQHCeW^ z`}HgpjX+v^SFosz?d|^)2>*WwmQ}#K$(SE6+u}r^@eS=IcO2$8Z2VU5^TF-MBlOVKsz_l6^hNP{o@7}cs+5Wlk+u1FTz4Ek#c}E!aYRM*vp>Uc{SJ0XJz^>mY3$dH`j!sru?eMaq0Ehu zMDTy}+-?CjPzwHiCRFdPR0fLvR(Be8e`P$~?okY|jL zrVW?pj8+ev#3OM+fOzcD*M1T`)$;7o@h_Kg2-q%~8(+CSw)j`?eb@6)%zxb@#rNGV zj;ZOcKCSq(`_vQm3|{|g;`cSup5r}FU!M5(&&20TgfZ28VIRgcp|S`lL4TNf?BKTZ zogI8gMf{5;7>*M{K$eIsfya?X&w#Kbh+8$(!cUxXbOsCexmu!Aa3GwGbzAY ziN!`4@}Rj1O_}~=QFxa4{9p#isl_vE8kBmR(TM+Dz)UUx>7%hp9B*agX{?Xdp_ut; zX@pEQ@?d2yh=<%>&c~qUJS=iihIs2Ml9xO)M<6|RP4uVTtL4cD*8a*x=a?rfS?V~* zqrbD)F_)N~E}1_Cg@-~(bH8WAEwp5koXa}Px%nm4BuUg8jDkQ@9;DJqIRFJDssOqU zZGA)*LCnk@0)W5)Y;uZUNYo+~AO~3h*_I+N)9%@xE+{XOY#*jlWN&y$5B795BXQ!f zp)U-wKpbjv#l^m$c*<<*wqqzp%BCA{EuxiP03c2q?CN75Eh9ic5_6}rKrP%A05}K6 zP@p8eA%J}$`S3}?^kEo@3$?}ZXBW`wA^-q^u)ZK6Kx}em>?NlLMl}FPn@1z@+Kp9B z+!rFUguw_MUKV}j*TjMiwnHb1dyf)^mXb0T+GHTa=n81-+v2O6<+O3CEqnXoV0Ta;z(a995MiwY ztg*+~)*WBC83QpQP@&unvKag5&*+snd2zkd4zyf@T&*waR5KpaxSx`T`{+r%2xU`A&kwx(6z(Ibs4mq(Nb zUtKJeIE-C=?(^o*GH3t!Z^`4UlBZGi#$LI;xbCNG{I4wTz2hroTs24(86%>Q*wSU+ zcVyMeXLViqLFCu1%EW4JFyIIhjW25y{(T57a~S@JV3RPd%m4sjTyQ8Ti@-RK>qKXS z(gMo_N5TLk0RS<1<*?Pz5(eiMdGD?47r?TTShL9m^l6rcx$iMI&i@}F_gHNKhMTj> zm?wA6yEM}gsMg$PJ9Lce!aWaNORQ;YyX^hgs%E*iNSROt3{!4oEvtnI z8&Lw3khDFj;8Nm$?s6VG$+pjk#9z(St!82(W1x!2fNO@3MrcxXQU9Yqpk}C3>W#L3 z;*@Kb-Wq&+N&h`xD^qH@rfFL{E8e|W-Fsxq%=yH@Cy`Gzn^4@Sn_@ku*_kIC7lczKQ$E298ZETY# z)>XZ5zF1!xdUtW~tK{j! zh+W2n!Fv2gW0$e5!)WR;I{Nj^t=fuh91?=!miHJbj;)o)*C#&so$u;aPuvqYkAApV z8a|$sd*aW}7vwVKxLNTJextS$+Z9LokGV2qH@*& z`jSl$j?;242EwG&L!35{CF-)rzgQBv=N-?or;R_hP*r9-+6g5fQVL z&Ahzbb@QY&pHj7iG$ob^n}+I`{S5#FMJN~wpPNeq5HobnF*?W>sCS3(a>&ks^0{hP z%!!_1Ocs=!X(N);gu5jpA8Y1!05L;MV&aR$k_!jx^_zvDd~Qui+O9Tpp;uZJW@g~T zT3X>?lGrkUkz@sroI#TV>@7uDVJBqT94+0Sj9Ne$Uufm9JO^`ATVt9>+&@6o7S}rI z223_*hUh|R&4xqfw|Rr~Z^frUMw#Vh&X`D+ox!{$BT^4i90Hhp&S#~?bo{gmDiy`t z_Q?~g9CK=t;#LG8>Asrh)WRgv401l9K#egw3kvj8ZhQcp0RTusS{^|Fz(7QpGl~u= z=P`{h+=wxa$RYrcVh8(m156u6918XXlGkto01*f<&NsCYRR&c`H-)wQlwlbG&QLRG zxtn+Rkr3*#0pq0HtuNY&Q4JK4H}w&>EmLu#3IGH-C#jYvAW-g)2*b)j64|B>>a`;v zbtu@_qi^p9M36;N;u5?L48@|a{RXcsOx{F@BBip(TKjq10E=nzIeXEB9z6GD{n|rZ zcb^~wfIz9s9=h=Z?`KyPeRw5n@yXMMu$?{e_m_r#SkLzx9sg*VQ0^AWTp$V3#AXHPY^M#5r-@|RWKM3 zf}De0c3-rw!qI-vSpTxd=)84&@%HH3e>ko_h}a|+h?IYS4gR*h=b8`WKW`T6i(~WG zm(IVYW7N%#%lGr%ed55sKP~&?7WMGyp*NS5Ja?utd5FHcSvqwlb=xqKpye(QDTvhA z(PKMuk`ajMZT-@i%D{gY)UN)IzNw@8tk=Z)66&!TtplEm_O|Ug98?Jz7fT!{3en%U zyH1&o28;f*StxPnyZYQ0?;ZVq6YmR46>b19I{n0@RR4H&@Z-OFZ~Ic7P@OcRBBG!- z_epi$>W?n!d+@v9`^(iS^`JA<8L`V^k*)IOGXw7|i!a$Jk1WrOe*!=_f+`VNWSxFm z>>!E&alPCEw8c{BkCMK{h3ytS<4?js$uhxYyFo6zU0#VU_&d^Iqhyr1Ep)gt{xAVy0+0LbI2 zqQ7h=E+rd@AvhG4(34XjgXV=ITT)!-ajou;TVe~h_FVRkJidk_=lzk=M^914)wJ#N z5F~W5z63ZIhn07p^>Wp`YpdV8PMtfx@7^!{PyL`wtwYYFhLZS#4eh5rpIE*V<68M^ z7rD>hxAU;a6Mr_^rVWX&YEt(dQ}ONfkx&2Zx%f4q%q5O0M?hmo7jdYS^KO!-H1z%J z_3)=F~E^j`P2(cCAEs7&5!M+AZULVBCee$+Jg zRfkcJJ+@$N@YP>fd%sv;B2TI_ntGKvBO`D9CQTUQ1tUSk;84@y}Fu&8# z968lr=?t>fGv%3oI5 zlqaR+=T@LNQ*ARnl&)rOo8=DsOl#AW3FBZsGxNK$Fb#tT%U$Pv?wmwqHQ#Q*><72Eq+Ux;|^yeCLX zohci4M4$j}1p$Dk59wz7=O+&tCTAu`j3&gxCKCW*+EBJ~7w-;Gn@m&*A_@JQ)gTa% zL{j9)DE3S>0stTcu_quMIF3%N!=3;gT55c^mbh(TFyc@$cQAr(00D5Q;8a1NytPkn z>7!*XrZZxfXR3&TkVNXaHS>e6scO9e64@CzUq!6 z8~6H;CwQX$^gW{QEOneSM;ckid?BIMOC2(i1lAdF9Wy!d@e0pPhic6}=amN--NEiN zUX@3c8%=%kw1(nakDxXw`pf3{ie}(w+iz52bEnqPF3&mH=nJ#%0P77oPMb+=QsB8? zrQv1BIFIQ(uGju>O=RJ=t}8x}M^ykv1SA60T71+d*ZzK^|MeyP4}Y&ts|UtGXF{1P zv7@K@(G$c3^Zn-=Wq4VViCg9jM_`P4Z9oY`we+EgLh}Fs7|S)Q{0Fc(%{(*f-(ZtD zlWEQpxch}NPY^IOQS;NR_X(2S1k0y&kmX@Fq?(ZqfQ2bpT{IvOXnbpT$%Dt*C)QGj zs%`3Mn)4_Ts5-GadH(Vr6qx%YSsK@L7D))z9-h#1YlN7lgJ&Cq0_uj|K2SaH8l&0Q zb=r&am`bV$m@vTL?u+&rxbK_9hFy*WC$X3Yh{U5{uitm)=e3_*)qB?${>SI5(;89? zhf-pf6Mt-H-GTDAFL9nSyM5N(dQ+b`wj%oHcGtfSDt+Rt{<}W)Kk|({zLwf$Oc>gR zR@;H&%ig|R+t}7V;|}hRs#6+}aXvIHBv% zYt%85?MF|SXO5swm38>U5tXh>=0-mM(`fAC-2<4=h%69A!cZ)+bZh*V^{DCKP{hh& zVMw_+vP!5grA}2naH4YDtbx-W<9#9T%U8(b>-3HRan6|Ni}Mje!uUFjC0M9SK45~e zr8N=y(>wXL#JuIwzT@;YJENa|?|tPS`S?8p$KC@1m1d1je70B^Rby;uk|#Fs-T-l` ztg%y^HHJ!p^MC&`{@M|_@nxaB+WyGJd}}L4qQcY>AW)1Zz#lf&?KIXk>T7oJwjSzr zA|Q_?TwgvcjH{1-@jDPgY%;;51$)8q%<`UQ{3c=UG_s;~(@{T6osBVPOfYv^q#{^m zTz0X^>gG+Eq@jXHOn@?Nb1*1OvE~ignxsvR(~h&#@HPb&aS*xPO1}xB4dM!Yw}fGS zw6yy?OTq#<4C4AeLwrsd8Q_{^W@v5?0$C}^>ioM9@!5XQfZ}{oG7XYLGgxWM%hXbI zcAydWGlpQV)a zFY8%Vk{>@W$)JRR72@xHp)Pn0aG}9mKzuSWicB}9Z2glK)A<;BHv^-vC~Ku>_qmz5 zkEs_@GHW(%lGV|qLaW4yodY0=M3I1}T;yOdN~aAICe*V}mjXkOlB*~o9y|MDIo)?0 z_J{e}X7Jck_b3~jxb46=24cja=4}z=R0R=$L=qqgph&41h6tRI5-0ehblMP%YkYe< z+KYf0AX6xFBpW&9q9>DAvLH&*EF6IVL=zAmBSIR5P#d9RVSOAb&C7F*pc)Rh>UJE&6?$JHdhU#tJs z1b#IE?yd0Cn^1PIaBb$T8;F=~^W&V7m{jEeEqv3HjWrA5ji2icd1h3C_iw__G>=S*0tGBo!NidOO>nc>N#|Cd)6yreUaYW=R9?0 z>651={@BrZ=Bqpq70X0C<~Z8Q<2b#O#(uI64Z16B#MX;4LK5Oxhbx|l2M3r?`E=D6(E@ue}nhY z^0n~NkQt%5TlVS6nq~Fr1uFgBvWN~wK*1FhNLE!(vKjxQKm?*U^(oWpDy}#{^M(CS z{uugrr985n+GS*E`8jDsKr=0hP^ifZWloLmpjcaMwf_Yo3#?;68d**pGIFy|A!J>F z$~P|%Tx$D4k4X*1)S)0_AWm!^9*7Ec-o(b%;wR2<|7&i~c`rpiUZzZGAfmwf z!bY3Vd;4+Te;*ZieBQvlpNkD;@~BE=93;wG`cP*@kDTr}Wp?a`b^W(|0Eo)uhSUKJ zN{nrt#BD2j^i12q6ZFk(y{A5@ZElx_SIFaPkN^+H^lcr^YmadK`#Ap_zpAJ2#pD?Q)}IAoj_k#DY}>6tTV(bjBb` zOWexrF(r>ZD%O?7d_noB*{Djc=WZ5fjrQ+*gSKgP$-Ea?V<+)Cd3&EwSBh~Bbc2+6 zsUR3TJLN-XgfDnJ{>FR+=6>&P48{5nyGF3NiNi)j%3}#Y09j1>pCPiu`-9@1<6WQK zOWd~T)z2uG9*d3b)Fx%%i)92`Y*14VQ#;ZHUV&*AWo3XAy3fB{ISo$oY*{SXTC8F$ zI1T{-lgki605BhD%Rp|cm~J^Vnm29D+NjL(oqk75bXYMGDZK5NtpHl><;^7K7oX2e z(DD}n2v4gsvXwIDTmWk3iDXu1IQiw~AxBL2D#?kIDa(>1NnMt^n3%fxFlz>T5mOF> zgxnfIvM17aC8fq4Atd7s!5lj+fLK|+r4v#)S!6G?DEH0vE=b~T)!Tn(wPISCFh4@3 zg@|c5S=YYo&p`x+?C{6Dj>{7s1`maV!`yM3vj$s|r28sWowT3N^h7c(%zq<8U|y60 z03vJbZl1U47S5L<0RR&kK>{38UL(^3morYs){v@VGOU9AwG(tbb(akS#C1Bn65Mvw z84(4@3?jP>!6^S?8ORbcPCRxnSPHu*m1J3ierp?AWIzN;p`jF_8iZr1B$N@mWaznX1mCFSm<6%ok_f7!+)qJaKr^71K+X|&Xh2BYO}{r4@jsh1Wz*e@HvZOZ`> zIX`)CKp0&m&KMTm)P~_0v1Rw`Q*jv*r!0-GK!YW|S*5RU#aoXyx&uUKw&SM>!z+j? zX}@n_y&-XArTf(j*@iZwv4^^CAWPs@V?V5?vS2%XHuc(xA|eOW42&)x=-TGa zcm7b~dbq^py!Ghlf4>8b1ulA{Xu*xP6Q?KUuOo^iA2dceXD|Or&+(@2(swThj*&Nh zcU-bRvB{ASmfBCB#k+&y$G_9d-S*kT-1i(CdgA+%w=dxdec;wli=I8B{h-IDw*5Ce zb4dGl>#83-VV&nn`wN)W_ z>Qq?!K+$6-yU*Ek;D0~HzFFruVq*CHKT&6;51yb*tH-#`2V#Loe~2&KB2TCm_ZT9K zt&H9BnONZ@1hvK<_h~ci`;Ka#`-D*LATkweJw%|!?>?%CHNV~vTeh?NoY$q1lKWL1kiqKtD!2u0*bfkrjrQd26-gn@BA={qRBNe%ypkn5;9 zCs>%~?$^Wr3;#^zR$!iI=rLuM%LsM@%>f|gRJAZ2g~%Q(m^mBa;W&%N8@~KkqAR#- zpGPnpS0+^h5Uv|M6lZ}L=!_^5kp&)3002=$!D~;6SbrC&O*C43^4Kckl9BPWiXA}} z^_G6SBGO_z8jMJp-7*A?2}4Q~&3#61Kpb6(MrvPAsPu$CS+49evhs_oTgTqYePN;4 zfee8$!J{TtHQSD!;=SVFzH8p&{b5>UXThk^+*|(Db@Jqf_L+Bq!KmA&Z||!3;(BGq z(2hOs)VFmhQyYK~eOE6Cr0U08rID50M?V%{v{jy12LeIlh+JFUtnM|c^Fk5JpS1t@cDU1NZ-+JzwAhD<1Tqz1FbLbt2slcEh}689_mK?^##g_ zdnG>nO+Eh*?dR2WSe3E8T{?7zG_FBkyg~nSGpQ*O8>*$bQ^RLHC>50n6~(CQ++ai$ zFqXhr961-q)=Q@yAkG>uG*lW(H-s*`)qdx{QDb~(8y#A09k!Scpwn>NGKVa<0S6oK zxEpD*fbDx4WYV-&wa~1=lw)s_l@de*mY&B1AnPJ9D>kRx$!8v>k$$R-yqROdt&sE8 zq}?}NuSqO#3T2dSJIvuTm?j&o56#KVhw1>b$9ApPYFf18g+t!yMu6-AN3fP_l?+lm zAG2R`A{E5BR)%gGM3}BgGLswyN1gFbjgYQF8*%EJP;iF_Qt98^t_C zvj#*a>a1d1UNAMZIce^R$AUTJpiiqyR&#@soUHN=R%dIQ(+Sp63P697`(V(@T6$`C z3M5O(ndxB8+SKA;`8udahipQE=54;L++}SdN+6*FB_K&AS_vS6!N`ybs4IcyUf9(G z4mI6+NCd!|VqCtBP8%WYF@h~vO^V$B2n318#y7W;u7RY(uPl9xgIxxcA*tz1Tdk!0 z(C0AHB$v{3074WoOEO374~pmQhmAePr^`sj(TyU3X6W-*0{|&@qLB6}2|&^=U$S8! zER3tA<7&a+Y+DCz?Id;?7!r?-clmjnkJu!T%=XRsjZA2%Q(v$aeL+&{&zl$fPkzSO&>Ft~E6*zz z^dImL>kJfqd`0;2@3e)RmAytwhfE0H^*JG+%o)zR1IEq{q1KCajJ>dH{4LkE$?wLaaYRJvQ5{VaoIdp~5YcI*CAdRO9}r z(bN}PwoBjE%_9lmNS&%sY)`wr$}2^c^p<`i2||ezbt7}{1d#=!+Ygio#SWt<2qI0{ z))7L=U0tWYSoQNw?kf(8e7Ia5T?wgOGNz2H?!W$hWlDY34>xq|^8irWm zp+y>7Q~AwJ`p)jQX}5uHNR#W63VYTcHd=h1+m83#e02ELUk7gafO>4wqz2#|I0u0k zTia=wtNgR;m02SLPka;n-*-ZpTbfXZoFgLWOk2~W9z3!5waZy&f6vT+v)-UoS{3_j zspIVZyZ5-!e$IYXOCE}RxJX;EUEkRWIwLL{b*kJj*oLOWpIb4e0RVN`XsJu6E~XV; zq0CLnJ;Z6lNZfJu{-nA%aM3fg+`~146uWp_0|4T-fuuP8eG*CN(GM2#t^sZNRw_9Y z^H;<^TFAlg8GeT}qRM~iE&7^9*Bxh+tbGxYYo9LG*Y9%NetP7-cWoCOmiX~6I;;vx zT;h;Q>>fz$>QoP%DIYpL`s8b_*KgH-S*vKI4EAEIFmgB3T;598i+c)tlg8&TJ%^taF$E=3+E+qMX{AbrI&p*aGSP z?p{k%7HKSLLY2f)oVg4Wl+MP%^fq|r80g=C%XGTzqMyt>>#i~f$rV6?lmzWeWu4po&Ywu$$mD! z%*kETbF;*f?<&zsGh!iKQ+gjJC$gmnbEiNa0j4B5c@P9Np}~w;S6Bea@2Px2)DjBJ z!<_fI`Q%fc5?YWDk~ycvdCI?}If-F_*A9RfvR=_@FmS1)z7$vOB;)FUP}tc8b~%al zF{;7(W-@6ACN$X9O;kC%lW3FqhGx(iDRvQoKyt%6a{@P&f1de3ZZ8uIL}|GjWRW*^ z6O$)OOoEbPCnzFt4wL`@a1J6RrRiuUdm9cMflyO(@=#11T}?++V3%JyY;t^MBeh9M z^#xJI)IAv7#7snjp*V(OwA@1|O>S;dw;enEiMJQiG7ojCXz)~(D1gqmKLV5zfe^0~ zI0r&Nk@WA@5{DvAX#kyJePz*louLa}*-T0K!>5$oaZD_lh(GjA|J+APmfYca{i5LYA4H$|iBMWJ z?|RUA^tIojkIe@P&fAYNT79ukmeXo48B(TiY$HIaLxs3T%RGE@r|*>~smEUa`>n>- z&cs)%Kk)C}T^f{eYx-UHNjtk%R zy6wWlv{gGuRWYq7;{8Ek_PFph&r+LAhg2qB|4te?UYtA(+kLL@{);X{rd=|#OXlYD4=3b!EVz?Hv5MzbSyJ7%CoQ=5J=`M zY9>nZW}S@hnye}@GZ{?_9TLPm9Au(4ZO=ur7ck|8d}EcgMJ=S$X7V+u2=ed`=0rDD z()z%}?9ze@HQ!s8&S$p_!Q9-rCm;)`x6R^$nSi8T!OXBze{gVhOGW?ytA;`^!UT{v`RK!AWX;C3Dbw+K!ns3vDHnP+mVRJ&gQKmPK7vftyA(F5d@09 zC^F6&C&dnsMPNuOJlgzKqJK1XDEhA(!KDt0N|MHq15sg8y-;1GEm#MtoD>yMGeD7O zl@|cOVA+n=84(3}?@`1iv92I%>LYSeSVCIi0RS)zAcT}SX^{g5Lec-uL*xT%TMUnl zO>SUz**>L#0_Xt7#x{Lz3)|Tv)D%fm8~Co?#M153ArovBp1!MIjV#zu`sO9E3AOPz ze#eAC+%_~AFs|?Dj{UlsuW5RE3H81I_5w)nO4lJB483+_P5|L_Kx}0at zb{s#g@u0^lUOv}((zNK0o5cF!oI@0uZnq*s>ndRyUQKPo9fv-lZRv0vHpzL&cxiMcb*VhvhS+5iXJ`Pe!y6v zzO-ZZT~ro%AS#Wjs{Hki=vOOx&wEL1C>2Vb%ojGAdcBXG<+T|g{4td#V=f_uWjy_eltcA^3(<}I518Gs&DHcZhOf)SE&b23_S2f@Y(Oh`ci2^ zJs1oGf^p5*)}bCU*>mryAPT$ zaj4SNVakjV!thG<(5dR7Q#2rf#EpDHH;fPmH^El$%Y_=2O`Q5GoaGTWr~qF zM&m+>n+F1f5V5+H@C5cpq$xuM5ap3I?ssm|mv0R}|F!+Dvz?DzIB@oLfn)D>zjj^G zPY)YAIv}AFkAt`M#2)!jJ@*h}dpmM24zK2&K5^Pe-a8-;sZ`FM8~)c*APL0lj9m64 zaXXL_3`8)NfN%_hQ4Gg05XM*n1Og(#c!D_W^0E8a9=Ia$@sF%?fVK62)0UkSxhf&t zEnYWIfixP*UZrEg{+K&uNVdE*(9Gmu3ONoM0RVuTj|EawR)Yffbcs0?VUSW6CjB}S z6Ra!%7P7w!u5=beZi1Tg-?voH7lC z^Kf}iZPVpuIUyldV3!98%|d|5k4PrkZlQd76-g&G-_tbMso$JzQ(0t>I3dkcHH$U@ zpwIMN3H^TCU zdj8vzy~D03qq zwszCHazuou&L{u4^HsmZdh71E#32X|s`hqzQ5NFHy@bSXw+!juMKNI8#bY{_P#86Z#)DFHO*uR;XkP?Fa6IY~2(fC#7?#3spS z@56TWu+1IBZOdUqXc|;}AS~@YS~_k9U)d<`Jtq3-H((%$lwf99Kx!T%5VtB#ABru$ zs4ND<3I5o8A+9H84pUB@B_B9W8ec1ouTA{8KJoL$$iv^z`V!~m2cug>U%33-eIk#~ z>zR7H^FPOVo;V}+{o2Tr-=j$7lV_A%f4J;*bbPRswfm&KM-{zuY4Dye^tH{vxqQZK zTH<6aeblM&gvJGd$KvvYYUP+|1LwVj{&>;L=c{ukMBZK;e(2lsFYb)}u)bsR9pztM z>pXiequB={MFbX#3pGW8T|veSUszwctN4y%cz2-hyjM|Y?wbyGTy{X`-Vg9Vl)6;z z3s?Pd8;C;Z9`}Jjgjx^p2~{qF?5D`o{LM*UndF4{MuoFZJ4qLrLy$ zFkhG!+l%iz-v7i8kzZCt=1=onzJKKFHM=|doD*nr1{YZ7cIT5J>#f3^!1Tnjq@;yp z$jq3mYCeVH3!wp1?pYq1um1oOD}vod`#*-=q(%S$N|9r1=?FHKOvnoBfY{7GZ60fn06{Pe5GiZxDL~xb>a*(yi*jlWAOIodZM=jFmg}rCU+csmD&M zi-k(BP*+APywq)@B`%`MAd4W2$;Abee(pHuk*N00I_gw;IF9`x;;|D5@V=lpV*~-+ zSiM8NXoJDJC z8s5qONjgT-LNXsOWdsSp0`ny|axyDIrX6FNp&39rC}gl^XF`D~bW{+>`u*YDjt)j?x}|PCyDaKjKc0C(+|zO8S@}JF~uLWy7@1NDMf)~gVe&D%0%JdAwB3I zbF~v%2rabi6f8HLKGn*Dtr%I9{Tb{5 zi30kgsOi9gCcR8{3?PCur9qrIOrA4RoKT0pu(oW6Fuq0_TE=|g_(w~HhBBeP#Msns ztZ8BG{n{^^h)9dRy1_noLgdkJAsB@zLkQ>6+=;RGmxS;C3UospTT}Ga_4?{&V{=F7 z`gc9=UjdroKl3?SQ{s8X2PHrRlABU^DB@NFklkGJ#I}S55!-X$QcVTqUaX1b$T<*fm%*=_IdDmVq z^RS@n`9so-G_ZE^`Tm}MIa!U=P)*hEs;;iK#5&N0NPN7A5?bQLpHiPL@tv?^#dBwO z9P_aH+d5Ve65a8tZ?1v3+P>dhUK2sajL!b5&#y$lw*Bv6B|g2etLptrfT;b*hdfj3 zwdKv>^Y#q?Yp=~a-pb1Y=#fEU+L|`+u4AiTIj{Ag`_fCAns0rns3*!n|HWX9$lSNHEnHM`TZwi z*xPy9)AG35tV)hSdeNqu4=*#CdppkguV-pK8ICPh&a~C7zWpXvzH~wRF%PMWHu8#~ zNNd`vmfCNw!=R^m#&yz=@``890fe?AACPJz81$O@9nlpNX^oc$^>uB&1E$uzc5&D2 zH+ye;N0~kxJ(9MvnN^3YKf6}+CE5?TlXOEKR%!ar5q$~tNG2c9*R^@JA6@z3)g6c5 zo%()-Jbn=AhS3w3Ck!fm;+(`YU-#YqmNcl0RfNpJ3;^1)jq;@WvX?FeqV9h_q%GVa zj~@&Y2PDxIH9GpMRz0Tvw7mNtb6LnAnti5A9=&^94IW(eIC8#QQwJ2hF`j-Z{JzTFF*6{w0r2`3rIKg6&tCgi->q#1(pW1WgGNm8lpI0vJjSs z(eD8u>gvuOGmdmkqsY|KYXmQVvW?CA(w^hCfv&`A6dX%Ac!I^ zH=JnRDk^h4%%uk)$Z39=+tU^YdA;4mkxZ$b04F)8(NSQVcEch=kn5b@`oE^y# zE$t&^(mD(%w-n6rYYM4$b#od#OC)CaV8J1d`JeLgLBx!k(Se$>P#|>a)E)J8FLutR zb6{NrmxgvgES{UUV6uJZ0Zt!uEpLMM*P`kcef(m+fhmcpP{-eENLr>LVJ{T}niAJ7f`*EQ4|XC?k@`y*N?h8z=B;-DMG zl1=)`&7!>@BYszLoIy&XSPDIowKpON6$yPZ`W28kaKzF8i+GLZ9_`0f$^U&zNtF+; zqK-aeQ&<0a|D~RUXZP`-8e|A%?@9iXc9wS@E$=>F-gyi!4d{zE>d}}4QUyY7O{?D07e0JO z@YG#Wi#8^o{6^Vsq`sy_{cT)Pd^t+kg zxB=E|XPn$Yv!x_klL=%zEEgE&0BD=U6k9t6TuO?;@tl8|`)Hg_^!}oZB6EFR8!PqK zzJIZ2+K|p!Z+6}B5v4VGSUC%LP3N0gT~K zH@wz+??;{)!$IQO{0*L+#?<~iC;7$VjzjKdB|ctP0>S`;^mQ%rgh9L{D7s_FkX3}z zKd&MoN}o6<{_+n-a}O&EA^;0`k}rLq{NPX7yqHM{;EeiH`tpsziw`M(@#55{^Sh3o zOG#B4Gl+XXjX-pk;_A5J#jT|&H{?VWE%u!_zpTo!0c@N!A z9yf^Bma?!P1746hC=&Q&lsR%lj>r%_3aQ--nSdl3#p=o)Z7;lho&aQh)jdC4cBYmqNFmeCw0MQ*T0Bf>lINVw6bh zi`Q$vuf|9~*=aJx)6kbx_TGk~DG)~Logb6;yeN$tWHdGh{(GIg?@aB>KUhU6t0-ah zHEdWd)|9i#QdU>a0v?Db#HtPIhd-sB{V4tHN80y4Fi?UoKdkIHI`!B)`ggyx%2M~h zMr%HqyRn%M&clc1Fteav2HY2(DYk{V>!k(MA=fXv!#>*$4v5e?acCm;jOBZ_Tx8P^ zbxetYI7`0S{9g>{_&)#;Sgvu+_A8pXyM-LiKurC&&BTf+?F;Hw?b_!brNtu8&J5ky z&KcQhRFj+BS<7PhGyj#{XvMDCDM+FtE4R~|eCU}WHDfpo?%vp9r<1d13*7OP6Wf(D z4cOqh&FFCF38v;hdnNEzkqU*HrQla*K?NdY<>##_x4@u4N9~KZfb&=3p3Yx+O%W;& zwL9sSxpgCwQyFjNhn6;lGcf%#7P(SwE9zXZa|_7H=*-zX%{j6bYf8l07HVii%Rvo- zWWPTEy0-NZ)M=s&G8RyJeETOfAUzzspwNjEUy1*5Qc4g|-5R&}h7u!!H- z*ae!N-TKHzcCj{!r`eD)&j~vxpZ?ldvPl|QE!z7@)%k=$@;1X+O@#TqMtd){^~-xr zG+KH=kUXW{v-21RpttvH^Bcs*PHkm#;M~2@D<@z5#n{xPuWR@Hb5~{vBdvK4+XfI& zme8l5%=JV%kWgWML(i%f&z=*IVe++KrJ)sA78GrLLe)L{Of(w1D52_$Hl}`B9lq-y zvAG{<^BO3cs`~zVV@+%4DNnGvQtXV@etxxT7##=S%c~>6&}i+e{NOU?kvjI9%d5hW z)L2!x`ul5pE`Blb+VAqD!RbFXls|o%G^Vy~pSzU_bpSwVO|@DqR(NI(BLs@45t+7ZbKsO6%kMw2b>Dlm)veO-3eW{G zRF^c>etA{;kM+H`ejp927*P7$deO8%%1oz&Y9%(Nq)Yp^P-m!K^j^?g0^}tXICx&K!)k1o68?KQ5sU#e)Pl2 zq`@RI(gjjl1HV%F_-Q@2y{|6X$Rhr1Hi+8VwyJk8rj*ux=za2pI+Qs%FTo`e(G)8S z0+G6~A#&NlB{v+=yu*#6E5?VE=^H!C?>j{rUe$WgozmcPP_hU5N!5+6*pQ8n#9sWd z?Ub7XyX`_rRbAW|IC`)@9f-*Eh5Q!_vpkS9TiHd*yS97r&Rr4?>>; zh5(uAYnoX}u>A9zMR&CO;9D^4W91=z<>tsE=XkaqtuERSz3zpo6^|uf|IygcE>9aS z%ya$bW~Lzk$vPIr5WzkiMFh<9CnkEL`qIYqhrbyc+E`^owD`C*t0ewNpLXO3*Sk9T%&0h4a_A|K| z4PbfW%sO9-Vt&YL;(^-1ovpJ_hwX%$a#wDc^IWj#BA<)E&#gxD14H>tQ=s!At)hA7 z6OqM*2vAspa^~sA^f?Wc58`tPcBAM4jZ1U#aQt*Ehgso_98ro(nC|ym@`#j|+S$Ct zgr9-yc64)Z!6rEA!u$jv4;}dthN1Bc@FE;zo9+;F+`Is6=>0)y?D3TeSk{b2KDWPJ> z%gRHdJ0^PLtTN2U*770c;8j>i$3&O z^3`9JJ;s+kdye|+y50+(rC6%;`E!-+Mz(KzBP;P6oYlYjZ%=t}!(sP{{se}6Mnh-S zXIHV(K-(_2u<{@(+-UBtn|Dk4i)CH^dd@R*xW2AU*=|(jYZtT~bg$9S!Kxxalv>g> z=!w$;hfLeB{TwE77V-iBN=#eP?Ad8_?K>B>pYy-i%fEVe84V0cHP9oe^EWEf>uW#0 zto`)=BtBTEOd4!z=qark{i)jbE{s0^bL`DOq^igOeMF8`DEAnP*)_#SXO0MK&!;Wi zaN_KA$N#q`jf<46gvU-(y8-hpaOZ2jt*{k`q0!!tLC>IhH$|WRzVp22Jk#nipny^6 zs*NJ_=LZo>v8r(8f6wat*YoLaujn=9YBL~rQmx%?G*Y;D$&4ua7W2cSU< zZjZh4bLV;g^~@ONDvBYfI&johw*-#dw(@`Hwd{9$dVYgEu9gfzaaC{Xs#|(@`iE5= zCq3-hc9eB%F8}}-T~W_2W6K^sz5A>u6Ccb2AxdsOHgfe59j82;c=;z~o8f>6oEgnM zqB~ml%B9{t#&;e6pt`Vu*G4Q*u5i7nOWV{qls-*;wYc+$yX0|$oDB*H+Tuoe+fn6j zU#)NK=sNOF>Ptvt2Z0bk1QOF0H!9nWuK03J>XUihC)~?xOITT0boNW*2S@HXz5Afq zr61fFo&7R~{r-y%ZJ%}q^OUi=QeGNlLy!D*%j-tp|@s*<*V0k++Q14gTBz9X;U&{kNscS%>@Y|95oX zOZDHEv6?c9#z9rd5D4}LlOcd{s3>70>ZB>7_{5QHSS|QH$vd9rLx;={4$-)zJX zyWPlQ^o~U>N6T(500kj?<`raLIzBn^x>Z)exmOT=x&(=A0unjX3vt>ZjvtxfP%sRP zU&*elEBhjm|3dyIo}vM>BS&0|iDu=ZVyhk6JyVoO=eq5vS20{=zcux>L@r!S4g{6W zw+ML|7?*p+=|Dwi4D_98whqMSzjxtg3#{0Tmok;y%3w|e2TyjS9w-~KMGVR|R1S_W z2Myj#;b`jasItpAP?_e0k51xjOdPe4xTPe9hSKNBlOBZKq-x)NlI&=3nD^~ zgaI!yWYrNC^noET=wY>`d`LN^RMFB)X&oh|{u_b4R+ZDFI{(p&NFrP9c%_U&i0u#c4nQj0eZ`s^yXI?_1xI%UEjFoeH8*tsV%}70o3l?O1vL$qhT)3|^TjoT4f4NP0u3G`Otx#~XTYdAD!w z$I8@tR^k^uapa6*DUs9$&!5xxz~{ZUy{}9kYVLuc#M1K`E1x}E8e7x4|6F-gjeBn- zXQUMu8{G>M6cTA2QmhNaZw-?u80YUXh^-98to2R1GbcOF8KVW#2-4QK*Zz2&zP_XF zhzC8>h62apl0>fh#%AMrNf@e&H&uUlndnV)obO$#dxmcM>ECDgv_UluLh81Pw5 z&Jfa?wsd3Q;zLUAJ3aR3$9-2k%LkXS@{qZ41cJ1M8@$KvRQ}2p(Yf#RUGtngZZHNs z2%!DBHuBPCY*2ao?q@~rzFOIFY{#x=R4sX(T6=nrz8yUh#Z#c^U>MG+Q>l| z!yW?+%V!4@3O8KW?&APBc zXNU8HDcXUm1DIZHksMHx(kc$Bz>zhyU_DM6Mh&gh(v2Pk0e~SSRY1gvL#U%4T6@v2 z*os;5^a4Taigsd0PB|A9((bp?h9Y=OdkqDfJbJ2#b}Qj%{{gAZ&BwpbR74HGG&Oh zz;UiObSjeuSG{#%`_T_;Yuk8r1VsM5Y+DnY9I3D(#i0*C1kL0D2^gbOK7IG32d$;ezffUs4xs;^jeCQkkpE zo4mV^uX*RP)}!xFeZ5ScIG8jY0Dv>2wHGB`x8mOZ$G+&fuCK z^c}Hn)${*qJ>d5A&nuNl^`seg>tK4``jR=vm0fpKYDH7WG4~lQz4F*P6Pl|FH+c7- zR`K?g$xj#boca(e3GkW-*|1w()Zp2DV#WKj)E}02o_Ifc6kcBenhro9anaUmv~-s| zalZewy?Rc*Kl$np^5mf)OP0xdG^wp@3ePz)eEo4f=RKZy@)LRb2;__aMQ0y|{UsmV z(0}2R+MjD#&=+~((%9^mjrA?1?_MujdMK??N)>%^il;#kXc{mM3I~N_$PWQ8dKHiv z=z>zJXzA8|U8#Qjo8H{WBh`U9rw1-Ntb4y%>K9*1Rl~xc-Oc=-#NDqZo_UQarM`0x z;oFQszfTwh$uz|ifQ$tdiY16ipy_<_DC+1Hn>v(3cj-IwN@LAN4EO;N{T?g}vthLu z4zjW^MuHIZq1S`51RjMrQd*^+KCxz#v2ug4veD>i1R&4R#|9p`PJ92m_~m!-VS`Lx zI2lC~QC1O!`TjM~d43~D3!Z(Sf#{TZ?}Y4y9Mk~VD!oiHbmwUWVJFB@q6rhYADlD% z^GeDO=)S4cndnyX++4wmXryM!ORbJkLREU04tl0|xFPKqhAq}+A zoa-z-uZark#9T@q^C)D|b}l5A6kTs!35%+m29UY3tfp|C5rE~5)nYLna)p_1fk9Px zsW$zW5S-)Wrj z^9md{M1ST>G=YT;C-OHdP~xH|PSFIbEd|Ch=U+)PsI3np{#>_`h#&;@C&43Qz++w0 zXoi%AGDprGD-M#OqasN=jD~m`B7Xgkb<~@%yw~Se05gS9EXBtS0wQBwTQ)M;oux?f zF5`^lP5SBE`%T zU-#en9tJ#~>BB1Cy}aY}C)BT&N`uPM3mVEEIo*Ha&h0zghzV61R-yj6AvEi-(A9^w zZgV}QRPTZ8Ub)e0RONrnURu&nr{wMQ02cidaf? zM618QPG8a7ancjY_&Siei3lmF87)24UtS~P>Gp%~mFmmU9Ak(gniPGB+TU-EzxY$% zocENeLr53kRZ z6atB<3mb!H?^$y9No_mbXtee5A>}|M;%TF)yXLoB^cBq=N8jh!ZJacyEdA>mW;zx$ z%jHa4)EK(-;L_VqXx-&TZF!S4uFk~n2uQkNboTp?+AjUeYGZRZuP+B7D5Y!5Hij-g zG;-G|{nx(|o%^mdx)y_8(hZcj=uhZtTEaIR8=iG^|E+KI-|-e7S;NCVa~}X@uC3b4 zsv>2tUxfj0_tAIiYg^@sL&y+7gc3K}dZ{l_`r>7tUB-7GcUSuRrSjxqrVS6Ny1ufh z{LlN1HO+m;&sC<6&=#$ayg7?H`})qfPZ~K$-f=t|QO!z281R5Bfy5Ds0728qFet5w zu71(fr7ziFtl3POL5Z|9cChD|-Q=mmG3YneHYFZ?2MpmoVej0LoDpq*K9(M$8+$G>Mu*<*FIAE%Zsrq@2B1v$dbC?PkHh* z|83`q&7G--Ue#BuXQg2b`6;b|s)8XXnKStbW}Aoyi{fw(SIwrJ#X~7(kAxl{Yo=^*fk}Z!-#)_MOPZ z9V{c9%novf{CovN{#uJ!CJ8#3S^lFwVg01A1CJ(

    mn8VAi*Mab6HRQ?u( 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

    ho9=1-MyT1mQX@jh-8y<&KVnH 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 f1eqSZq?nr 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

    gPS{4aywh^fvpBoe}SW4yRL%}G^7q2 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

    5|1*e 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 GZSO$zM)c!!P?}WzBhQ0LoXX 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

    kzgy&Tf6v{vF}^u{o#PRtwcsHoo6nWM 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

    nN2rHTjk(_jC;zVeK>sR*hOjSGEw_? zP^o-WA&)cvkjGx#CRLA8$s2R9%i7?PDRk>5O2<<i3hCy4eDZ2wlG<9Y@Gc3I!cOGEIMBZ38dUb^{zGOzb|lzlMh z&*IZXP#7^}rhnx2lH%wZ?HEPRmVsJDFSq)#6|O)Gshjg(EGsQBL)%5yO3u{JiF2!- zUs9|CtUH8v9bs;^-7Cj8=LB%9Zo@)t))3+)DF4b~sTbac*dv_5q?AcMmtGr}*IVE! z_a|G=(N_K&3wz1HC4mDb529%cL#HX^S8c?QG}k4XmJ0i<*%%85^FlAZZ71HeDhbX*cbhq z{@OekX40O77);IH7a-+H=}t5mCuW_AkrVpyC_;d%tD7Ys(8Y!AzUF8;VTjLb48jf> z1Bn#oN7v>fW!SPUj}kQ8-J=PZ|1gwl7|kR9*1b!j{_XzEjuU@khGt{UEwk!iHGwO) z{)N3g!2a2F^rt(tN})p!!Q$F#Zk>jr{%!BL^aKDpb&6FYv6E%^d`J&Q`#Nvry+18& zwcQK%MM!83{IX_7h!-_?t(u;Q&nra_Zwy1-YOu+i#p1HtW7-lK_A~==J6yovVDWxa74yT`-1UxV5t+EHf-bn7WAF8dtirl_2 z`CVMr$#Qv7B4dgpO}e4Ep9{YIW@gOp+fv8gCi}TVKg=nT@KJ%J7$8WWxNKB6+XHCO zH|Z4GGWi1Dt9x7X3vjy9$Uo>eV&w^!Nmb4;@$0;*0W zQ4&u^S6+SDz8=FU290c9pvVjEDWfCbCEAj)NZfm4i1ROu^_8nlr_LzeyZWholB*)0k^t`hD-R`aTWEYiG{T{@T-AUQ5yged zDMM|PtCm=Q<;&3<^hi$R?BtkG(Yw=E&QZlPDOow90XIuYvZSX5IEw%_OabO11(-HC zI6o`sCX?FXb21|5+!jFk@wkr`=$;u*_SO*W^8XX4d-MpwQqDu{v$A!?-RjjEEO0O1 zAGwopmY}t@@sKUCGrMoKRub_3yCNf z92soH&Xqm&%i-MZpNw;q2EP*j$p@nq@YOgZlW(~fw^Rn};6qL2z_509a>Dio$V9Hj z8a_V)ZmG!jS|_TzuneMUOp96fV8F6E>Tvq6R(R0-Uj)L8DFzrqRxU+!R<^m|ImACU zUQPi0j7LCki4uz4`|nGcg=hIVig)z!;|aAR97BGcNqoDgBZB&wZhjn9M zseX$|_a>;yN0`O1(g3A>q)$_S>z{tddky#0UdCj6tU_sjI&cbu#11RnjegGXKL3)$ zs9TH|Jsw|}(4iiD{?%R9gW%`0N^b~$-^>VPeFb@WGXUG_IDA5_1_4s}9X=>yk^3Q->a2 zhZhWW;LJOB?chrC{KvuO5~JcM9oePEo1%vou+NN^Fn|(`(cIe7nvuJvDLELdy~OEa z$oO8jwuKcggfQ5Le~J?v0_;5IkTt~$wD+m%*&6B%c%<{)JE=v+QPUweMVYF)bB1EM zeshxLo*~@|S5ly-H7su)7{{=pe^vHUn2BASn7dk85VLilYw<#~n|&`ZGsX98&gKu! z2oPGpQAX@jMSK;{DAsKKOTxsfh}}mL^`HjuyLegaHxH)@MIxD#=hrO_O~WcF{GAfNhZ8GB#;R`L#`=+VGqd6lvH;<)3h#LuvEmwBtGP-I2|6Y2clEo z%;AO5OesLO#?boVXBYf+q4_VTVGpx1mE^ZzKV4c^bDWxfn8nNi%~MFyb$)f~TvE8S$OqopM_Q7(@24q_%=_167{j)RK)L(~E%ZJhC zAgz0hq(sq3sQO)kIh0a+b+@Lr;~WiHAGZ`f5}&TC+jnq1WoWxK=FT)odwE#m<}(L#c@ zXfaKkf5px}JyNRFE~_)R)^{2{SjU*12UcU%+m-2!=<2u@@uTO#e$4V}SVig}i z|6h`I;cef`b)#~*vkh!ldM$hSyM_Vrm|tpg%CBsfp9d{F;qPa-u}?{O2XO{Avr=qd zDE0XvkE3S7x`n$&>&(1=>iNEz-h^cx{SP60>5mUy9%WLf*Sq_k5)iHid%y?|nEw(V zCMGhmm#J7!{pUc`5$mzY?PFkv8VyM*)yc8TTFL~P43xi;K@ADT)d59DD0&S+Xj${X zdCNj$HmoYMnNin%Ce5uJbQFH_=Hy%l(@>1gZkmrU^R`4rKU%G>9k~&4Cu#@RH9gFc zR-6w_p>Pomb%HaYB;N}SS!S)cuQurwd^Q$uc%JN6dekq)=pHvU&K`8|LxQ3=_JjWl z-+D^T$9v_iOMiI|k#@A<)Y;?7P9Pdo`bXiiP~3PT|2)&?EYT;$=lkFufbr9w09SFKFs+Zw7Bo3eeGLlc?V zXZ!G{yNY>EcW7Fh##epvIT&RizMCE7-UUxbgJpgMI&^PO9a^0V;q2-55xoDRNk%uC z2YD3)RiNKbi7tHjpozK#z0Q!*(EPo67buTS^f-|HV}?Pqcl|ERW$t0Baym|bir5p) z?p(Y zv=fot$)vX%OI?0i%(8bCUNh7N`@+DN^DrCaQcyu@>+;k8xrt207DYaH)Al`(y^Ut2 zZ^d+nSl${{bV%*r1KDwpl9iRd)M9+sE+(mO-Thf6gnL16G8ltFJLUHXiE+2g!dDX8 zXIy%QpIgwF{!4|<6;i0((E_63t=3-kI|G{pc|D%LUbM9*B23 zU?WPhEg~zLTfNe~DV!Vozdvdg%lCF53!b-l(aA@T75GfE8PA}@ye~7nm~Mwku%wS` zCcJ42&VnmqF9J(kQz<^1uZOo%c&<-;<#IMo!@e}M4bIus8$<)JGw5`aDBYC|?$ z`Z91p3BL0xyK0$Tg6dl4`jNHb5fIOsU6(9^=P%JAD?ofkiG#Oj{_9fSC;T|#b~0_p zzjB!)iOZ*n$MFLXJZ}IEe|c22Rp|@gWbeYxrP;^IE6l~Bq6(Eed_7vm_NS$A`mhTq z#vtZw6jL=*_aI;#(^Y3I6o{qP0nr7~6Pmbh0zHJi!d+ay4)?uaziCy;a?E`P?6#XO zGwANm1}$Z$vy5v^)lJtaOFItK82@x28nMq+f#=+_z3zIdsBkb5PhscFvb~ z&a(?4YQi_#&F-&S8aSMNoiXl=8zaBYpaQDSbKbnG-(8<#c=V}8+KK66AxhqQco0tm?f>&o!WTC@kaQIC zudk$~^{BV?$PyFNaYvB*Ugle`g?riEpZE!vS8p%g$kuBU6!nnPI}qrpIbA&SU7aaU zhSns?%R}eK3V6DvR-^BX(Tq;NE`zj?wJNtOXBwJ~@KEHMR z3~pA3>#M)~BIAOqoHW~xj#FXJeNBn zD(QZA&00+vSMcu0#1KUb6_j9^3q3~>BIpt*R#Ci^ORUXmD$#oR{jI1l-#Id~P8U3A zw!%=u|GMMuxO`nO{^QEeq>W|Oz*GB?VLm;sYf9CvuIUxZTqY!xSMc-(&w6B+?|bx3 zI2Mc|uH$q(5y_c(9FxRPyAE(()U%Uxrdrs-|LlO3P0 zShFd{w-pRGrQTow@s+0_-?+i|J~p^8EZ8SU;?f7nQ!*~B5oApi?gEX?ze}~NvH29$ z^CHl@n?_39uDPEc>?a9f8m(1{?-4zOWJTSd^r{;k?o%Ete7U^=6cLE-;vYwS)V2u9 zbBzcro4 zSE9Hl46gfH9OEE#*ON}vfdKL+YNxer>-^vCr(W)L0_`1BYVtVA0G;fBPMny&8T5^I1v+eQhEu;G3?eeKDXyW$SX9+Trb!>U_7}y;; zs>>0@UCA8E<*5P>f_|R-O#(<3x2}D)s&JgHT)C85sA&0Q@or>h-^AouQO!?J!sBj5 z70UBJkh6M#4KIAXPLE0z628^-G7=im|Hs`sLPtnuQ|Q=Bv}+?mS&P`(6+PD2KgTaZ zuqX;R?=tq(hVf(fxulGN27&YXg9+|CX0DmI%~pYv8cBO=A0OFL+PENSKlUq3Y58_| zO!>1t@Z=n`fkVtl39|vI#eG=IW2^3`3ey%nX3X??}!8?T{F zIh1bTT-euLOC7i0^O&44K?zI0?&#R`BIS*#TdGx&R^a(2r&9scGK7*5I0G?2H^O6YQ$4C_Ft8aGVgdjgVdb|B!#?kmxD0)QUEcYS=t&3 zp*lmTDdmTs%MY#VW&_A4<)iea5utc*ETG{LX$grKx((F)4* zp*<{`i4T3Fc9BM47jDWioyxKuu<%hwR^usp z>$P=NluWrq8vXt|Xzf{AnTki!f6S@m+>cSr7x$8}oDC^4F%yCx;M4)!2I z$U84%s6iZ5Wsk3qt+f1M@!kJw_&?qJ-^=_q?R!eAqz!*=|I_Y6FRp$Ft7~N`9`ynGb+hIYRX_sj4@S^3ik6BuP>-DQBox{%t) zIN}$_4|XGBoKKr)2^<&Y_COF35YMf>Z47yZckrg8Byd+4@=n2vp>1)g8POP z53fH5^NSmQc=QgID9Jsk^meCc557MG8Gf}N%DVhN!Ql14ev( zD}%DCN43z+d6;9=f=CFU%MP#Tt$H9R1}7syHDk(mdUCIqUs(3f_qJg^Dd>1^lux#p zrBGkA6kdzXiym7_H8gQ=zRuYO9Dt>j*KQBo9H=H^Dq>hGY`cQm9y7WOrG5dSguQ;o zM>WQ8;&E;)RdG~y%{zY(9l}(tdC7dWlIIe=u+_5Gy3Vlg@+CSe4&e`*4y8D}Z2XX< zbH73n21pHR*tRt>P_#XFcI=kDI=y>#^L$p>txtt-TkG7pnB0vdoTU(Hbg9?payueA zlkem2!+%U^q5}D1B|bldb9*h;G465Pi#!A%A3b8y#Jch$@5Dulh-DgEj*iI;h6WJ5*>cMyT3wT+f9^DM ze=HYl@R;Z9>-Vgi#;+5Mt7hkZa%AHo=7JI$w=$0MQ7mQve%z3p#zg#n2+-&^1g=Oz z)Sc|M;9bAJK71?rZ3yt-v68AsiKpy%v}V87BhjcIzwd1RGF+zJxFI_NSqq4RJYu%= zrIl@15xzW&g-^X5X^As~6Tn54U70VUK1@r#r$+>^qIS;QaH*NTtG-$KrC)jTPd^%Q zppC(Qy(y^4cvbw}JN_rB_ZwaOKJ@)J_uJGA5mM)lbr023^kw2HY&ewfH?R1mRAyEs zKjJrVwC;`?2ODH16s#H`2BNQ~>7CT~T5k}UHU zkh-&O(Eyb-&xqpoYRXq`_JO%2PgyvxdDu!=4hpjXH$v24xtWgP<+TgH%4;hDo8FWu zU_?}?#Le>P05tJ)-jGCAL9?d;nx)6L+4(^-CF%T=djSscg{%z5=#(` zjcircjxmY=HLEHRf3xrJjLO#Ba(S3DO?k#Nx_nCB+rJ>B50+wLJfMt!`1d)KE~&~N zvR3)JgN)XiH$J}+okAY=jRjCh?*m@W$fXd12;q#ztOV0C<~MP}EAyI$QWB5}(P~)H zZQap5nYh~8`nI(;-F80ozhi*d;$M=S=5YgPe+9F_#1IGkD6A?#S%*Lo&xbY3w%#mo>f zykypB2G6AyQKV@J_;J06fAJ_)Z^)`%Z@Ca2eXPNE;Vx)t6nr_}C{|kymr)sjyn&az zI;1J6O>?zZYJO5j+MSKO=ssdKEyee5f7aBCca4t8dttO)DCQV4b9=L}zUg8(7^3XhT(C9YgqWtGF9XRarl)$ftZCND zyFajThEGmqB9qEY$~Jh13}z0nYltbT%h8W>0R^zH4@;^>Wuq1eEm&UrsT}?$V)-6J>9ljrTg(6)NU&k{}Jsd5_;^z_hvG>KI=`_#lR5cM3Rv zuwW6Vl}Z`Y*o8&2SMkK@IGsbp!7RgrgJ|DJBr?;@{zo&Bn6h-Jrm-=GT<`|AwEUJm zaU6J~*`JbvD|PVEga`}tW@mp*l2W8 z^^C&cW~jFvis9r&g+B!nyUB{IgcQX!&iU7jcy=W%^$*|itCL-RJ?66)AM`<(tu^Lath$v$z-*Zkhtr9)*Uj89QU)jLThgHbw+>GGiyG?}3?$cL%;Ykhjkg%YZtvyTM%-xd~y@u>97#Ef#_Fuob_LN)UmOoi^Bb;)_{cc zccETaQxk*S`+m!8J9YT}MpGlNcD~L|@XED6Dg<|V&xKUvqGH%zwz@ltTK6P0oy%+9 zco$9@B;?GPU-G~$%ExDTy`k{1B~fLGQAHbXOTPO>eHmZiZta+l5Pvo*Db9E)0e>8G z0R$eLn2l@luS`d_|Jb}OxdOkR>S|5to?Le zw=mJ;$%XrM)rY+xQD-3$-3(~S{WTj3-5O4DRt3rQ&)wvg6NU|WY zecRtLH;jVk&J)Z`CW7YlYJVwRIvli$Nul}onQZ7hj zoNBn2h#(Wwtt-3*e+5O>hF85IB9-gkty$`ckYu?eJ9>^>Rsb~d$F2l zwDytsQX$9-w!}i9<@eLy0avDqg{CCB#8{dgQ`%;mbE2AP)`Mz{M4>WC({)5kfR%?lt$)s!T@Tp zmj{)VNiLvm;T|~a&B81%=y(9GD|8Gw2sOlRhd(>GV2}BUjTNp4Zbv|odxZ}X9WdWw zC@C14Z`(8f17}!4oAQ`fWmB@43-eZ0-A#@&YV(S2!ks67gU0#5*Ylud2G}o>E4Q*g z5cI>QIo~|$I@A|3Q~R2Kc394+ay*t&88e`9gJRGU2EpFM`pbVaVmrP9*oey7V0jRu z3^Z{mVUAQxWH53YawG(z{l~|5Tw69fdxO;P}Tws~bH(dAmbd}_Cw_Gyem zY|1t7p&fD|Vu_0PXx-f{1hs(fe20!PRZK+>H$}m;N#jXMt=7l)vgX9%G38}+#c$c| z!j@N&3FBSwGo)2~h1J2vgaP~31ZfVMSKmdIjPg-O01Cz$q#puu;irw{gKt{ zuwN)B!hdcj#5cu_P>FM%aUKEB9?YS0m8{q@5@$FzjJJQa9?$>Fedp;}MO-=~vtX z%hZ9lm65SKRz&f-V?{`3yN;}!nK5#qCD>~EBIaQbLN*#Bl?8k(guMY46)P?UH1#&8 zegxx+T_$Wxm&!h8a2IroKp67n5r(?L`;q0vcGfLUqn*dYd+quC-_^%0{BsYQoklwD zs?r5FlA*~PbI|9S3>#H#mh7_u^TRWK)xqr+Q?p|Xy2-q1EbJj5WzJ{9)>ae51n;gh zG8+t5{p=LR8x0W3DA&V1s=|X4xSL=8BN9lSlI?q; z2`z)G-DQ?5+!yPfmYiVlvyHaMd7%s$2{k+k*ImY$fq}UmJr;Iq@)%f~ z4-mihH`I*Wh`S@Z#lD)TIt+R><~(Pr;--5z%DrU5T+DTXJ$eY+R=w@dz#s);n+*Vx z?RWccZCT5fE@nv=LDL?D4e&id&Q0GHI>=dcIKRdw|JNDks~z+q`_$W3M7T<5#i_Yh*1=)Hs^cfWY0wZ%enHhU>`bkgTK7vj-e% zU74Z$fiu2nFs8c!_x#4I><3@KBcS~PnUd{6cHfClJIBFVHmiRIG7s1MRRmv4e0vN1 zVtn$e?_R%_ptL^nq30W0Yb&pN2D zG&3=zqz-Y(f)kVA9X?c&IwYj;&aA0PxE9cSb)xfSGW98HCr1VUzK(||@{9Jp`iZeZ zS%)r`lEm-X*MW}Xc0M;G?`fysyW?c&h1VL6%!6JY)^KF0ldQ0zpF-hbW3pek{7^mII%U&B7@wTnb1)I(`nb4X$zRGN_HiQ%@=mh__@IT%tHe9+;n;ib( zN&D5pA)YCTcQ%@3P9oM1k?2o5rfnL#;(<@NS#cD*_H{DA{KZ?(fHwK4Bp*)+zDf7ydl}6zKK=>XbYlPY zF(s*xs5Q%*-A0Rgh|^2Cv#NQUT8|SrtHkEQsJJ!m82<;bpsMmD{pVARzO^_o65osUUC!R9s{*le8(?-2_SKLx=RC21V5M;RlU1`=S&@NEw4cp#heHAVtcKG$| ztWIT4pSaiAc)Wz37fNkWfLo$rrP6{)TuQtjL=5A)P?41uby)kA>4+d$zHRN43aWNIYGrVyl5= zWOCQK6s7mYC@@gnE?79Yo)Km`p&{yUDR0_|X8I}V{ugr69r5z6)aX!=41I~iIBtUv z1BiEPBm#9_?$`1MyNZm;Ttb=>IT88Ol8d-d2-zh)XrV6($k0J} z6@eWZu*6-ivEUs%9*h=aG70t~qcV2j?)ZJq=TVoP4%%Go3?yuSY9pmPDH=u{tt zkpA;(m}@CVc9$|V+T7KN=K9a;$cv{)%Q|~AQbcq_z(Krx1=9svDc8QrZ{AO z>}Ds^@Bn+!n^~0FMx-+6ef$86?(0s87%wk=d=dse2$RcxxR@yCPP0t!++5D^P=Ks&ZOA94 zF)#d564!v>hFugWld)fAWfQak`JCIda7Z%sHR9| z-CX@7Jrg+(aWx2;#&S5OK`hpKb#t*pdA@;a)oibU>Yy$xV&En}K8$>+F8P%C z+*3YNjs-`FZuz8JWT3P;WFskZ$3Lg^lp6T3I)_)pNS`@JY1wf(vh})Iw3TaHg->W0 zK{+RxLS`c?a6Mz_A~;>cE`u4hIpeRAYP>>yglgVaVl6m2KRN<-d|VYA79}5d1;vb( z?M*VL#p%zU;-HEiQ)8RMonZI9f*3#&G^9pgbONo$VUiu-e@5a#L-Vy%F>b73#%??( zPGXyjbZ~L7Iphc@C<~VIlyGK^*ing`n5;}Ym7eDq!gm?PEKn3Q@s$|%-OJ-GK;j5N ziPZZ)G5JBIp)&dvl5vq=PJSbIC0oeW7^3y@!e8a#_;&Z)*iR;o_P_0dj3inhh^~m$ zaKvit*qxI{HoM-B3GdDme>)^_mcF^^bn{-;-tC^@l>5?TDKf<{5%89P5?KE(pa9m# z#BKZ^OXnWX?q7mawsT)1x2M-o zv#mnifayb1J+PdfqH2)TA$vvB98s#iVpD079x+QBl=#@4(^cp&=b4nx<6$P4ngVp` zc8(W~R`{7ERGQ8Xu%;H#xx5$c{*#sbQZ$OtVwz7C!Kyr&l>1a~EA7Nsh#caFCq$u7 ze$4OD_v4wndZe3w+Ky69W1zCF)d=*Rxs1|3H1CXG)7z?FPV`e+k#DYW3B6p7HL?gb z7Wg_18L1oNd7b(~jooO>ZQ_AX9hph{x zf>eX-;dR3)`467F$kuq^b>SwLhno3is+DDo(6OSMKIW?*daPlAmPOYE{>qSu9zgWz z%JMV>5h7CTs^acv!iDj6Br20nkR6iqzD?%Xq>w&>0zo^itX+@Q34u_sHosN#f+)NS zw1g>cv6jwWIZv#eD5vBUZ(Jq*{okMFAzx5}ykK0R+s!{&REy|s{S?@e`$=^A%H{6_>lVtJOf3#mLF`>{*zD@ZpaG9V< zEfI5z8N<+d2GsRHFl6m{3R@_MEJymo6o{X1XK zYr*uc)1!qF4}St+ALhIatfJ^4xW8~%rQivGGZc(Cobz2+WikQNDlU_fJUxB6`XWXA zIouY*8OqIAOA;4)**A}R@-KRNF-k#N4q05Mcs1)h@TMFa?29p9X1P>Q{y=bnc8kXX z>K&3FoBE#$+nxhgc8(|Gp8F{wJwPr}_pBSy+<1BUUDQSH3{N?>e!Da9>Wj6GXamHw zkqSiAz>2p5_A}(GL;pHIecM#p=*I%ZqB?eA+SKWEOE+N|BKuNi^GSO|<;-#|?>Zh* z|2}`){3(~E^`9MQmpLv^OG=jb%HumTj;%ih_;&>xHcO_Esr(BzJ-*(`=a06^>?>jp zO$UDS;~uIMR>Y!@BUm!mk{9G|We)*P#8;7CJNTOy8q*4bZDX*am67T% z6MX3wE8BhhsNvOF+fWyKUGZU;e|4Ky!(`w2h@M@T>&mfv>blJQh%%>7nBL^#D&`H7=^>z>C#d_gca6FX~3W zK7VVLVx@$F0CSw7$A1tD;!Nk0M{}I#=COxP0EWNr!_ybf&TFk2%S`bcF()y-A3 zxl?0m;}l&hxMqwN_lh}w<$j^}{$@!O3fqMW1*(leE4G5ZZ?4K}!A~!FV0`%vdOi30 z(FYZ$>VgBLE+qs`iQXqm`6^2pxmF96siILo^Bl!30wXx*-6N^fHSp8oe_ z#|}{=ZDIyWS^rLGBWv|;D{HcfQ~|_Btu=hH{rs?h0*evv(M#*5J&_lJ!UR*!f-&er z%G+E>8X=8Um3VcWAe!?i&C}M^AWgA{nGok(1|l#>2z{JQwN=rofT?IT0TcfQf19P7 z|NZPnEA{1@@%bEn!3j#8i=F&@4YaA(uECx;a}{B}6|ZDRepM}8azZOO%7}!ie8(!8sha**_8wYc z3d9p9o9ORD8gqwwB_>th2#-r(Cqee#PYN=t9|zZ(2?bt~w-vOcW&rZ_qWb)FEg7@9&k59R>vw>hx+Kb%r(KwSGXl4Iq~WrHP)AOi6Ro137IV;E~B`~P@m3GGkID4CiD#GZZm$l zJD$Tq=s*dEdXY%T`G%aG9d(Cw33yu7j6sWoM$a$5d9eh@9~OHD46%3}djIY0^7*%8 zv)gllJMffwstsa-@TYf+{;4AS%=XqLzyk-XTx*XZgdkq%WalreuUjISe>U4+cM{e? zh%y=uqGxz?{BHF~qHQWpE~jSK092^H-n+Z=aL*i_=GEleUq9o+ay(V@qvH*eeB z3DG)Riu3h|UQMvIuJq<+JP$M}vf=pcY54+1{_Jkiqo9EpkENe0YY+FjBcALdK)89Y(*A|Q9f1rpZHriZjJ8`M*HIhX}5q`Q#acxe!$rjz9%J~a6+ ze?Bh2ab#CnNKnaqkd|NbR(B3iQ!*SN{z<8omuvf7Y#3+j!;Sp*c!t2#i%U6IS>111uj zc^ulD#R?L@;XQiVe4|U=AJ+6?O*Phc;|=^!kKQf3QI`(A>JV&=?XIW!3ft87se<%0 z-K+>n5{}tbvcExmZK^qch0wUJDESJa9!h@(BlGi_%p!b(QU0Ts;F>;n+`4Skcxzcj zNwdlay)%=l`g0hku1A9U8v26zLUY$rak)`$?z!0n;e|{O$*=h4CW3O-n`Tvsa??T-ZcC ztK6Av<vAUk1%lQl^8seJrv-uY2I>e9M$la0|(@#ruCw&EU+7!ZHuKSAYOh;N=aC zow^1$`n)B{zff3n=-r_05c{cX;M+v1^tHOj>$h>r&)U;Fa`>hSx6CM&I}&dcH+>mu z1bIL;3(p4CzqI=lfCUqWqfMxnav#q7-)~A#?~oUQC8(v64`H8TctX1+I|@sSdspLp zz1=0)G73{PDqdA=rDq^~=W%aVKR~gAFK{dwb#jxgvMtLuFZX~Vw)8H{)ec6`Cg63z zi&_{Wx|xT)=kPTt^s(i38{@Z+;6F{83co*iV$SB{&Ixald=Hopgg6uT872c#q@V4@ zLUUcL=N4<4MU4zRdP_DriT|`Lms!bV`&Slb58GKjgH48#ZQ8Or&!%(RnqgaFMiOtU zQ_sUUA9R6wA9TDZT|8QIaaGUM7qsoF3(Mz+Gez!qXMoAHA}>ji!|A=Es_1k|&6)O> zp|`T{KWyO3&u}`c=S`Rpthtyl1;YA6K|(ImQK&pCu;bc9#}D5H6oX=sus**bQS}|& zMSu{C={4z96l5+>)@=A^x|kqTBU|j$cwm<85n3?{1%=K|Z!ZXNZl4Cx!f7ae65M8P z|BWS^9rgh-M*hveWel6WNWT*#kVw{C6)|z6slO_^2%gU_## zmYLZfVwkr>*rP+_vH!Yp=?mqme+mALekQ!4!aYN;S@ioPfV+2AT%N61u~!$v1RG=R z&Ue*aWr+^W*q2zVH)~w}2k7vr`{!;;d8WEic(VwO%@5yO`CqB4Zm+@zuTT5z-RPCE z2WiGP9i`(`48s?Gn$CCZ03nb6;2!f#dg~{15Lk0;hvmg3HLcaG%RC+ zqZmPSX5Q9WJ>%M^Y)m#yL+Dk8tJ=ESJ__k?=F?N7Y3woMGFgKv`T_5O^J4 z?Skl*4tK?|DB(6XwY?zRd94C5df? zmN!r2Ab7t}&pe*V>B=B@F^~Sb!vukaT`@2gEm-vlV;JGSa&$Kw`)8EEc0^CArYJ$H zuq0;P(a4kpz^BwK2q_?1` z5pm@nS%_l>-G;#WMr-@8{OSYRV|M-+?jU#|*PDvgm_5cGD;?e#vKOXScr%_95W>zO zH3oTR9SBO#v@NWjjUR5#rz+6~4q{Y?gdNeb*(f zpMCGaWTLOI$pdSq&V0AhLLSPYN99Dt6Am_i`(jmnD9{due9_rM$Q8V6gL$rmG-iDk z=>O)pXkBE=cyQ2g`ysv#r$oTmfFJlV83~cSo*~t1g~f*O`;E zG4R(0zukQyLU=EJ&!w?{Y&&8IL9Pm%2X5cB{+&H!pc<4^ z^+=62+!N)pH=Q^YFK|~Tq`u-;JbbexOu!OWbEU9qAez;IOU1wu<@(f= zdVDz2KfJD$E;ft>KlBH7xHIG@;0Ya9o;Z(T!%jn?^`aKfFIK#wv`{&bx5*(~YHMbt z*Fk@9pg+wmG=Q@RKF%0A&JZreE#*1->3AYHwjib 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

    &bgat<;z<_c{$>}C%(qdO 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

    Rw(YuQS~4&aYwKI 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 Du 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 z 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

    g)uZ=kj9nz%k=uM$?M8uu*N4bhBqJ0 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

      )ta9dvKnc1F8 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

      `-ls8~uDhyM z7U&uToMr`3l#?3T_}09dfeoHJ|JM(wev6&JAzayt0jpj{p>FxHN^K-FA=P%<&c-+v zNBgmbFkAJQ`&yL2Se4DUPgYr;D*KOyzx@sw$j~qrb#NAYl7a8Z)m1b{thrqnKo489 ziP5z!eT*mguIHbV9HbcKuX(57q&U&2`_9;d%QzZLE2dbuqMpQb!U8S=Dn&ft3*RQ(2S8Kc${g0VucvbS5ctl9MzErvrp}v&*f-;EM zUhX;Hbd*?tMC8wS;LUL<_LE&Z;gsbt%YZab2PromlGtIMp;^rs+0h6;p zKfr9;m{n|2-!KF1V!+sgFUg*Sfj7y#yWc1Bk|8Fby?x{pU;-U?+y?MIfIoi2#okF#N*<4>L)nq?%9_0Qv@(VQT&%z%^Mz_be9IO8`D2VIi6t?w}D z^s}THF6VEY5vN14{NWAIiSq|$r7NfKJtMwBzVxTY zf_qxZ0beuTAfk{po4w)YOA?0(zl}%9YZHtRqibESRkLeV-Sq2>w zRQUVP+IO=f!oX!Y=$vUEIX6Z2A{}nHs*e3RBuvS{o`y!R-r+*IKB#Q}uic?3I{^2>>h)HUdz#vTGFBwf-ds*tjvMmqrJ=Dx zkm+m{kADc`_)Xg-%Ks>H`s@X7Yr`$C$*6mpha;6uJcYa`ORoI5R~qJx%V={`>6WKZ z?8c_*RL3Y!9r)K*e${H)x$`8v!@HI2WL(PYPdQ-2M4ItUe!&l}hH*>FN%r)c@j-PB zAw7gS6}kO)<5nv)JREbPQVa=LS_t}cSk-ySTDZhd(@!W87g)?>?zsObkyk@EfdR35 zZj0TXwe3LLUX;KTYFz~J74g<>@+~oy5?@~MMffppe0hKpS#1pJ4!idqwR5$?Nk}1o zqC`JwYRR+5b3^x({Ud}Xury0Ja-nL?<_+MfaIsWWl5+fH&apYO@SfN7Sv)d*_eX}_ zfCogISv&eSpi)W(Wy;vX^l5IVr%rjBmiGw*zy9*b!wIvcKhEq1H^r8j>6t-YLZwLi zq$<#=mlz0a*~x=DBBmZe!|%@Dp%VS$sXM;6J1)XYhFJy#3}Nre1Jy;qzdenXz$%(^ z!WLB00=v$uMbaf*lO}KL#9ZGP*B)DaY`Zh3WLw+US5%5ZbA%}PZTWWT$VRE7hjq6E zFUx{1cQC`cJ7w^SpXsa$?@I&L5^>gCmkvN-(JLy6L;n+Sb;^USN+5+#54ZNAeS**; z!%~2sa-@Kno;&oNrzmjx`a`V_Idk-LC)TQ96oEl1LeUxNvI7(Ft~w9;2_PJdmcws~ zO&=v~lm==~I(xmq@(zvvqj~%vRzkIM+uftY9qh@LEBt24dh+?k(yC%IyU6dm}H;tp{3nS_#v-(_DD8A zDP8fnU2R`3Ur49YN#sdB2i+ez#-+6#2ENh@K~4wqYSQ(kH^zp3$(cT+HA-_%n?{s< zuEq~t!_Jg}7rgy0iCb`S79mBid0Rva`CWnKO!zuwqJQkhx^Bb2uicfE$`NdwlJ9h* z-|M7?UBP)ZwlhS9+5112C=6Y=lflMI$3G-u9k7^V#=sgZUNdppc4y6`Wrw*im{VSj ziJ~quK;H#j^a`fW>1XZ0A`*iLe3HyD*fqfj?AKulMIwZCrok8SeM7ak9|_JDYC4Lx z@qNFZhnGocdxFvE2^r zZBVRZ`?~I+^?RvnWArNW=3g(@O)^`TSYp*{35D^XB#HO1&l}?50Q;cR;N-bRoTS6q zqvW_#@r?!ftMyzabB9t?J$f33hB^^UAcsXo*R6+0^0)Wu%|&j{Tzpx}POLtNu(s>6 zI1W~D4l3%*K4PPQ&8b`K&qmA3sOrk@u{Q0dM4qVY)jQMXQ0Y$+O1MR*y{4FsmZUg@ z>O47Ai{_Ww=OGMqP|}*VlF405A}&>xA{y1g|E7 z=;bXiD)@_lJMa%kkuihxmvj8>e4J9DwF^GpSTs(SlC( zzLm$)ewz~ApfFiv)W+&e6Fyi21 z3iR2_v8tT-2gpk6Tx&#>O3P03DdyhkVImEue-@B=78PUw?dp;H=8vTsyNY)&mgug@ zRw??jiZd{&Z)*%}8DiU#zxJOGPjN2dOUwS?*L_IICb zc7YXh$YKnN^So-%(Xd-8rSNs)u2B|Pzkc}Py@2aE##1;aP(h>ORmaaroMriHT1-^W zOB$8sVS=Q8L&^@v?&7QZHRdbyFDV<|bCr|m>OohfRWJu3W>mJWUN+R;SE@^jG`y6F zuiO63RGYOSeW2!2*qc7a4zGYS&%tYv@yCru+zah@o->tYjnn3NMMLOb`lqZdm^>6- zk=*q>{-{(Ba$Y!*)*b}e{0>8+yHM|ybSiy+S?v3y4|Y#6G|Y^(YsitEG3<>ckpm;| zZ5!4USB>orEim@wg^w*ZD2y2q6ag{}x5s}3SmZ0qtn?kgcun_5LU7H)z`S7k?Bs=F!@5;g{TBddX(2_dfxK zIbu>`wsfoS`cq^P>d`%%AXpV}J8Hs}wZN_GH|9>^dqDC?BF}ec!l1?&1>GD>Zwy;{F$rwHN3niWqtO76)*cRW_7Y;)fo~x)L3>mmK!6&%HW8pHoq%1mw95`C zAI?9N3>MS#?Nzl_6hNiD1lM$|`&0PXF==C47cg%5D&;L{6Y!+6u&)=cfr zAV8;s6#&%!CQw*3yOKetPE?9W>EDzJE5KsuL8*Y3PND-OY@3snU0d@X_pNcSo5l1l zue7ZakTdq?X^b%heEo9r+RyqRBSj~qf{^^yei)Yf^6nK-#3tD>bymms)))Ok`LtqP zmc-vZ*NuwZ+@F&LK}q!d_s4ZnoK6+_)7aGtIkZzWR&ifT&K2&nbAB{^;9ab^cbtp+ zpWQa`bi1+kY)bUvR@v!4y8g;QDlf%ShLeX_t~{m?5jW)7AlncDvy zNDKRnH2T=vXZ6g=+t0&5+#ngE!1gtiBr?Kp=8<(yy6FwYI~~DDrDn-~JQ=f|nPIKZ z^ok>;+&A~dNZlpVvjQn4KxN6|D*6R{Ql|4*F5kWh4J?|33hey(nQ zjGx#^CY`XgKU8QeRAjz2TFRn$+*G(~oB5ktFsIBTIafs&4+w#FM9mlyY5U8}agDp= zN>tq^QAMrfVVA!@(+c0EfryjRqYSB3hQc%uChy@jI#VK~7depVwmb1isgN#}^RtZv zcq>D}dF?9b^q#!a6tmOszr?{Y*6F3cnj18&SHO<3#Q$7cf9N|aek=khSD>a=t6uwt zhZVdY+8^2a)u3D>bM(U6BC6cjVUwV29UJGfDu*Y6#sdewx0>C1v?X6IL>$u0_}O;- zJ~SAiI?}=ZYn&2Vsdk9rW8{>*(p{wGtIm${yi1!;e)KlhX_RyyAlEv1#l9;IQrw^A4 z%o=RFT77P5pNBWwmZChs?hl23r39}$DuNjnSSdH=fT_ui@(GL$IA~_!%~&_+ z)Q>FB4yewjQchxy0CE^^E5vuXfedOs%MBu8(bMxMW5kMNi>*e+8rK;@W4b}9(VN4~ zIsKZQ1*xCD%*wWGW5q%S^KGl zvP**K>?i+B)c6lE_5*WbW9f3Ij}M6hPAqi9g*fYv`Rwwrp8(w1FR|qW_(cQ2`F0Mc z&Htu4$m-KI4f|i*7N`FJj-x-WF2=a|=GuSL>&(2YJIV$t^H7@>p$)sZIv#KKaY6>;UX&rk_Jv)Hi`nq^_0h2hh5r zUzc7lO>DmCIj_*;qW_#0wm0Rb@Nl-AhwF$|-}TeR=fH2~_qN~Vv`ijI;`*OJdX~xV zcUcv3HZML?-e^!r*WxVLa-4VU7KH2b#ZW%=HPpU6ZT|>gb!Y!IZ}czz%n5tA-%sZ` zRDC3{%?iTHAo{TX1>mRWR_FyfL+zi;8a5IR8Oni0?Yy|I`nL6+&D1j+c#0vZv|r@O z&Tx4wgnP17YZXga-YDW9{$eSA8VhBrxZXM}e8gU%)`=)53}^6c9ei{r?J*2XAYIW7 zp05SB1+iq2GXp?H)CO-(G9^SmBAFFDc4`1wgg+UvHvn{lUgsDwoQ?px8`~Q>aRA0t zD@aL5Rd{ce()n#o9sCmXzZ22vm9_`YCg>Ou&8J`lB3|~l$*C8HF;l}sLzEg^&o%rCWyTABh{aM3D2lSU zzN9ApN2B=M!ID-Of1S*uRzaxN5_)+{r;?51samEXXDl5@w}AJ4&LpyCrdqy-2lUs1 zBQE`uBtue8k6lsI)Vi@osRh|c%aG6eX%tA%nrFw8P#tUg;8c}E{N%ZevHvV}Fgwql z>@S+svgplv8hB**2jAh$Ef2RsOoU4vNcs$df98pfmKbfdyQ(rxGLpLaM&o@v=+#J} zgCB2~d5u<;z8Aa&qV%R{{AgXf>u{2OSsiI&)uI#*{|JVlnrs}TR+(f9MeS{ z*HQVsG~P8NWsM`+#qO3#b?QjS<&d6oLDQe@-qwJ23tPMnuXrq&#B}dz$C7d9t*$7l z7>%U|J#iJN_C=hJ3~SjIpkrlh2zk2NW)&Bx`2jI#|G}H|lj~vs;v)OHZ~!&19>2|R z(Yx$Ev|sXd2ZmR`l%1i=68xGrW^qHBqDPfK4N9zP-=vF4(mFG+dU;)5oa6G-T%Q7~ z`o^6l%gtj(+4P_?)N10kWDb~$6cv^6)NgJtgt(x_U}8K&>7lnh8yMYk(q*iN%JF4PC*KcH?3CVh=Qf=_>uKdCscF2 zFHM%y#jRzQbmZqfX~@w{2Qyug+<0l|us)-9!f?E`t=-wX6n6Y>5M3^#&LlH{y!&+V ztF3!c!ctX{=+_>8LmEaAGlvVyl zHck84x-?ZCgzc&MK5T&{&-u{fX3&M)fv9tZwbATs!%t+LsiC^ak$01uLI*J)8*bYU zX2XPECMRz&(i}v{dZ88+@}0R2Gk`Ho6R=pv8~)d}iT*lS$AFB3+Yac(S*uh@sH_?` zl+8(u(p6|7bp|vH6&U~P!TtB9Aq}fnKTx9Sxa7(vE{vgl%H*bwG}B?IR0}Wj*#2!u zwkaA`#71>J4AQgLuxoS}u%d#``1|XPs43d+Di@gfs50I9rA_ZWr3N90gIwJXr)52Z z^UDAF-FuV#pdMjVq-{yb!)aD0@i3W;f>e&%YJHnl`vVjDQcQok=X>*=TgsGrEmn2z zfJfHikr_X;LlK2oSr^yId8%K1CnL%5PS0ymmz?tnJSt(lVpV_8)&voZszo+v)j)Mh z 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 z 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

      _v*kmsPJ`srX7?=n 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 { // 顶部标题栏 _buildAppBar(isDarkMode), + SizedBox(height: 10.h), + // 顶部图片 _buildEarbudsImage(), - SizedBox(height: 20.h), + SizedBox(height: 10.h), // 设备状态卡片 IntroStepBuilder( @@ -229,7 +231,7 @@ class HomeView extends GetView { Center( child: ClipRRect( // 添加 ClipRRect - borderRadius: BorderRadius.circular(16.r), + borderRadius: BorderRadius.circular(20.r), child: GetBuilder( builder: (controller) { final imagePath = controller.getDeviceImagePath(isDarkMode); @@ -238,16 +240,16 @@ class HomeView extends GetView { return isNetwork ? Image.network( imagePath, + width: double.infinity, height: 220.h, - fit: BoxFit.contain, + fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { // 网络图片加载失败时使用默认图片 return Image.asset( - isDarkMode - ? 'assets/images/headphone_new3.png' - : 'assets/images/headphone_new4.png', + 'assets/images/defaultPicture.png', + width: double.infinity, height: 220.h, - fit: BoxFit.contain, + fit: BoxFit.cover, ); }, loadingBuilder: (context, child, loadingProgress) { @@ -268,16 +270,16 @@ class HomeView extends GetView { ) : Image.asset( imagePath, + width: double.infinity, height: 220.h, - fit: BoxFit.contain, + fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { // 本地图片加载失败时使用默认图片 return Image.asset( - isDarkMode - ? 'assets/images/headphone_new3.png' - : 'assets/images/headphone_new4.png', + 'assets/images/defaultPicture.png', + width: double.infinity, height: 220.h, - fit: BoxFit.contain, + fit: BoxFit.cover, ); }, ); diff --git a/lib/modules/ota_upgrade/views/ota_upgrade_view.dart b/lib/modules/ota_upgrade/views/ota_upgrade_view.dart index a1663da02..8872e9947 100644 --- a/lib/modules/ota_upgrade/views/ota_upgrade_view.dart +++ b/lib/modules/ota_upgrade/views/ota_upgrade_view.dart @@ -173,7 +173,7 @@ class OtaUpgradeView extends GetView { // 设备图标 Widget _buildDeviceIcon(bool isDarkMode) { return Container( - padding: EdgeInsets.all(16.w), + padding: EdgeInsets.all(6.w), decoration: BoxDecoration( color: isDarkMode ? Colors.white.withValues(alpha: 0.05) @@ -191,46 +191,52 @@ class OtaUpgradeView extends GetView { final imagePath = controller.lastConnectedDeviceImage; if (imagePath == null || imagePath.isEmpty) { - return Image.asset( - isDarkMode - ? 'assets/images/headphone_new3.png' - : 'assets/images/headphone_new4.png', - height: 100.h, - fit: BoxFit.contain, + return ClipRRect( + borderRadius: BorderRadius.circular(12.r), + child: SizedBox( + width: 120.h, + height: 120.h, + child: Image.asset( + 'assets/images/defaultPicture.jpg', + fit: BoxFit.cover, + ), + ), ); } - // 网络图片 - return Image.network( - imagePath, - height: 100.h, - fit: BoxFit.contain, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - return SizedBox( - height: 100.h, - child: Center( - child: CircularProgressIndicator( - value: loadingProgress.expectedTotalBytes != null - ? loadingProgress.cumulativeBytesLoaded / - loadingProgress.expectedTotalBytes! - : null, - strokeWidth: 2, - color: isDarkMode ? Colors.white : Colors.blue, - ), - ), - ); - }, - errorBuilder: (context, error, stackTrace) { - // 网络图片加载失败时使用默认图片 - return Image.asset( - isDarkMode - ? 'assets/images/headphone_new3.png' - : 'assets/images/headphone_new4.png', - height: 100.h, - fit: BoxFit.contain, - ); - }, + // 网络图片(正方形裁剪) + return ClipRRect( + borderRadius: BorderRadius.circular(16.r), + child: SizedBox( + width: 100.h, + height: 100.h, + child: Image.network( + imagePath, + fit: BoxFit.cover, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return SizedBox( + height: 100.h, + child: Center( + child: CircularProgressIndicator( + value: loadingProgress.expectedTotalBytes != null + ? loadingProgress.cumulativeBytesLoaded / + loadingProgress.expectedTotalBytes! + : null, + strokeWidth: 2, + color: isDarkMode ? Colors.white : Colors.blue, + ), + ), + ); + }, + errorBuilder: (context, error, stackTrace) { + return Image.asset( + 'assets/images/defaultPicture.jpg', + fit: BoxFit.cover, + ); + }, + ), + ), ); }, ), diff --git a/pubspec.yaml b/pubspec.yaml index d58b22f96..d1e00321e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -142,8 +142,8 @@ flutter: - assets/fonts/NotoSansSC-Regular.ttf - assets/lottie/ - assets/js/ - - assets/images/headphone_new4.png - - assets/images/headphone_new3.png + - assets/images/defaultPicture.png + - assets/images/defaultPicture.jpg - assets/images/qqmusic.png - assets/images/music.png - assets/weather/ From 44abb0023509ddc671c82b62cd4b9b694c8df222 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Nov 2025 19:39:58 +0800 Subject: [PATCH 065/177] =?UTF-8?q?style(views):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=B0=BA=E5=AF=B8=E5=92=8C=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改ota_upgrade_view中图片尺寸从100.h增加到120.h - 将BoxFit.cover改为BoxFit.contain以更好显示图片内容 - 移除home_view中注释掉的冗余代码 --- lib/modules/home/views/home_view.dart | 34 +------------------ .../ota_upgrade/views/ota_upgrade_view.dart | 6 ++-- 2 files changed, 4 insertions(+), 36 deletions(-) diff --git a/lib/modules/home/views/home_view.dart b/lib/modules/home/views/home_view.dart index 55122a5b6..0f7bf8fc7 100644 --- a/lib/modules/home/views/home_view.dart +++ b/lib/modules/home/views/home_view.dart @@ -212,22 +212,6 @@ class HomeView extends GetView { height: 220.h, child: PageView( children: [ - // Center( - // child: ClipRRect( - // // 添加 ClipRRect 来实现圆角 - // borderRadius: BorderRadius.circular(16.r), // 使用与其他部件一致的圆角大小 - // child: SizedBox( - // width: double.infinity, - // height: 200.h, - // child: Image.asset( - // isDarkMode - // ? 'assets/images/robot_light.png' - // : 'assets/images/robot_light.png', - // fit: BoxFit.fitWidth, - // ), - // ), - // ), - // ), Center( child: ClipRRect( // 添加 ClipRRect @@ -242,7 +226,7 @@ class HomeView extends GetView { imagePath, width: double.infinity, height: 220.h, - fit: BoxFit.cover, + fit: BoxFit.contain, errorBuilder: (context, error, stackTrace) { // 网络图片加载失败时使用默认图片 return Image.asset( @@ -287,22 +271,6 @@ class HomeView extends GetView { ), ), ), - // Center( - // child: ClipRRect( - // // 添加 ClipRRect - // borderRadius: BorderRadius.circular(16.r), - // child: SizedBox( - // width: double.infinity, - // height: 200.h, - // child: Image.asset( - // isDarkMode - // ? 'assets/images/glasses_light.png' - // : 'assets/images/glasses_light.png', - // fit: BoxFit.fitWidth, - // ), - // ), - // ), - // ), ], ), ); diff --git a/lib/modules/ota_upgrade/views/ota_upgrade_view.dart b/lib/modules/ota_upgrade/views/ota_upgrade_view.dart index 8872e9947..1bc1caf0f 100644 --- a/lib/modules/ota_upgrade/views/ota_upgrade_view.dart +++ b/lib/modules/ota_upgrade/views/ota_upgrade_view.dart @@ -208,11 +208,11 @@ class OtaUpgradeView extends GetView { return ClipRRect( borderRadius: BorderRadius.circular(16.r), child: SizedBox( - width: 100.h, - height: 100.h, + width: 120.h, + height: 120.h, child: Image.network( imagePath, - fit: BoxFit.cover, + fit: BoxFit.contain, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress == null) return child; return SizedBox( From caa166da7a129d319832397ffaaf0dbe6b226364 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Nov 2025 20:20:40 +0800 Subject: [PATCH 066/177] =?UTF-8?q?feat(usage):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E7=BB=9F=E8=AE=A1=E4=B8=BA=E7=94=A8=E9=87=8F?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=B9=B6=E6=B7=BB=E5=8A=A0=E4=BC=9A=E8=AE=AE?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将翻译统计页面重构为用量统计,支持切换翻译和会议统计 - 新增会议统计相关功能,包括数据获取、聚合和展示 - 更新路由和绑定配置以支持新功能 - 添加会议统计的数据模型和服务方法 --- lib/data/services/usage_stats_service.dart | 43 +++++ .../controllers/explore_controller.dart | 6 +- lib/modules/explore/views/explore_view.dart | 2 +- .../bindings/translation_stats_binding.dart | 13 -- lib/modules/usage/bindings/usage_binding.dart | 20 ++ .../controllers/meeting_stats_controller.dart | 152 ++++++++++++++++ .../usage/controllers/usage_controller.dart | 20 ++ .../usage/views/meeting_stats_view.dart | 171 ++++++++++++++++++ lib/modules/usage/views/usage_view.dart | 50 +++++ lib/routes/app_pages.dart | 10 +- lib/routes/app_routes.dart | 2 +- 11 files changed, 466 insertions(+), 23 deletions(-) delete mode 100644 lib/modules/usage/bindings/translation_stats_binding.dart create mode 100644 lib/modules/usage/bindings/usage_binding.dart create mode 100644 lib/modules/usage/controllers/meeting_stats_controller.dart create mode 100644 lib/modules/usage/controllers/usage_controller.dart create mode 100644 lib/modules/usage/views/meeting_stats_view.dart create mode 100644 lib/modules/usage/views/usage_view.dart diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index 9a9d0003f..fc99643cb 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -543,4 +543,47 @@ class UsageStatsService extends GetxService { return TranslationUsageStats.empty(getCurrentUserId()); } } + + Future> getMeetingHistoryStats({ + required DateTime startDate, + required DateTime endDate, + }) async { + try { + final List list = []; + for (DateTime date = startDate; + date.isBefore(endDate) || date.isAtSameMomentAs(endDate); + date = date.add(const Duration(days: 1))) { + final key = _formatDate(date); + final daily = _loadMeetingDaily(key); + if (daily.items.isNotEmpty) { + list.add(daily); + } + } + return list; + } catch (e) { + Logger.error('获取会议历史统计失败: $e'); + return []; + } + } + + MeetingAsrHistoryStats aggregateMeetingStats( + List daily) { + int calls = 0; + int audioSeconds = 0; + int audioBytes = 0; + int transcriptBytes = 0; + for (final d in daily) { + calls += d.asrCalls; + audioSeconds += d.audioSecondsTotal; + audioBytes += d.audioBytesTotal; + transcriptBytes += d.transcriptBytesTotal; + } + return MeetingAsrHistoryStats( + userId: getCurrentUserId(), + allAsrCalls: calls, + allAudioSeconds: audioSeconds, + allAudioFileBytes: audioBytes, + allTranscriptBytes: transcriptBytes, + ); + } } diff --git a/lib/modules/explore/controllers/explore_controller.dart b/lib/modules/explore/controllers/explore_controller.dart index d5c3b811b..6376e3fa4 100644 --- a/lib/modules/explore/controllers/explore_controller.dart +++ b/lib/modules/explore/controllers/explore_controller.dart @@ -263,9 +263,9 @@ class ExploreController extends GetxController { // 实际应用中,这里应该跳转到新功能页面 } - // 跳转到翻译统计页面 - void goToTranslationStats() { - Get.toNamed(Routes.translationStats); + // 跳转到用量统计页面 + void goToUsageStats() { + Get.toNamed(Routes.usageStats); } @override diff --git a/lib/modules/explore/views/explore_view.dart b/lib/modules/explore/views/explore_view.dart index 2c9c076ee..c501ab04b 100644 --- a/lib/modules/explore/views/explore_view.dart +++ b/lib/modules/explore/views/explore_view.dart @@ -120,7 +120,7 @@ class ExploreView extends GetView { color: isDarkMode ? Colors.white : Colors.grey[700], ), padding: EdgeInsets.zero, - onPressed: controller.goToTranslationStats, + onPressed: controller.goToUsageStats, ), ), ], diff --git a/lib/modules/usage/bindings/translation_stats_binding.dart b/lib/modules/usage/bindings/translation_stats_binding.dart deleted file mode 100644 index da6c55d3a..000000000 --- a/lib/modules/usage/bindings/translation_stats_binding.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:get/get.dart'; -import '../controllers/translation_stats_controller.dart'; -import '../../../data/services/usage_stats_service.dart'; - -class TranslationStatsBinding implements Bindings { - @override - void dependencies() { - if (!Get.isRegistered()) { - Get.put(UsageStatsService(), permanent: true); - } - Get.lazyPut(() => TranslationStatsController()); - } -} diff --git a/lib/modules/usage/bindings/usage_binding.dart b/lib/modules/usage/bindings/usage_binding.dart new file mode 100644 index 000000000..1d3145df9 --- /dev/null +++ b/lib/modules/usage/bindings/usage_binding.dart @@ -0,0 +1,20 @@ +import 'package:get/get.dart'; +import '../controllers/usage_controller.dart'; +import '../controllers/meeting_stats_controller.dart'; +import '../controllers/translation_stats_controller.dart'; +import '../../../data/services/usage_stats_service.dart'; + +class UsageBinding implements Bindings { + @override + void dependencies() { + if (!Get.isRegistered()) { + Get.put(UsageStatsService(), permanent: true); + } + if (!Get.isRegistered()) { + Get.lazyPut(() => TranslationStatsController()); + } + Get.lazyPut(() => MeetingStatsController()); + Get.lazyPut(() => UsageController()); + } +} + diff --git a/lib/modules/usage/controllers/meeting_stats_controller.dart b/lib/modules/usage/controllers/meeting_stats_controller.dart new file mode 100644 index 000000000..bbcb7f9f6 --- /dev/null +++ b/lib/modules/usage/controllers/meeting_stats_controller.dart @@ -0,0 +1,152 @@ +import 'package:get/get.dart'; +import '../../../data/services/usage_stats_service.dart'; +import '../../../data/models/meeting_usage_stats.dart'; +import '../../../core/utils/logger.dart'; + +class MeetingStatsController extends GetxController { + final UsageStatsService _usageService = Get.find(); + + final isLoading = false.obs; + final selectedTabIndex = 0.obs; + final selectedTimeRange = '今日'.obs; + + final Rx todayStats = + MeetingAsrHistoryStats( + userId: '', + allAsrCalls: 0, + allAudioSeconds: 0, + allAudioFileBytes: 0, + allTranscriptBytes: 0, + ).obs; + final Rx weekStats = + MeetingAsrHistoryStats( + userId: '', + allAsrCalls: 0, + allAudioSeconds: 0, + allAudioFileBytes: 0, + allTranscriptBytes: 0, + ).obs; + final Rx monthStats = + MeetingAsrHistoryStats( + userId: '', + allAsrCalls: 0, + allAudioSeconds: 0, + allAudioFileBytes: 0, + allTranscriptBytes: 0, + ).obs; + + final RxList historyDaily = [].obs; + + @override + void onInit() { + super.onInit(); + loadAllStats(); + } + + Future loadAllStats() async { + isLoading.value = true; + try { + final now = DateTime.now(); + + final todayList = await _usageService.getMeetingHistoryStats( + startDate: DateTime(now.year, now.month, now.day), + endDate: DateTime(now.year, now.month, now.day), + ); + todayStats.value = _usageService.aggregateMeetingStats(todayList); + + final weekStart = now.subtract(Duration(days: now.weekday - 1)); + final weekEnd = weekStart.add(const Duration(days: 6)); + final weekList = await _usageService.getMeetingHistoryStats( + startDate: DateTime(weekStart.year, weekStart.month, weekStart.day), + endDate: DateTime(weekEnd.year, weekEnd.month, weekEnd.day), + ); + weekStats.value = _usageService.aggregateMeetingStats(weekList); + + final monthStart = DateTime(now.year, now.month, 1); + final monthEnd = DateTime(now.year, now.month + 1, 0); + final monthList = await _usageService.getMeetingHistoryStats( + startDate: monthStart, + endDate: monthEnd, + ); + monthStats.value = _usageService.aggregateMeetingStats(monthList); + + final historyStart = now.subtract(const Duration(days: 7)); + historyDaily.value = await _usageService.getMeetingHistoryStats( + startDate: DateTime(historyStart.year, historyStart.month, historyStart.day), + endDate: DateTime(now.year, now.month, now.day), + ); + + Logger.info('会议统计数据加载完成'); + } catch (e) { + Logger.error('加载会议统计数据失败: $e'); + } finally { + isLoading.value = false; + } + } + + void switchTimeRange(int index) { + selectedTabIndex.value = index; + switch (index) { + case 0: + selectedTimeRange.value = '今日'; + break; + case 1: + selectedTimeRange.value = '本周'; + break; + case 2: + selectedTimeRange.value = '本月'; + break; + case 3: + selectedTimeRange.value = '历史'; + break; + } + } + + MeetingAsrHistoryStats get currentStats { + switch (selectedTabIndex.value) { + case 0: + return todayStats.value; + case 1: + return weekStats.value; + case 2: + return monthStats.value; + default: + return todayStats.value; + } + } + + String formatDuration(int seconds) { + if (seconds < 60) { + return '$seconds秒'; + } else if (seconds < 3600) { + final minutes = seconds ~/ 60; + final remainingSeconds = seconds % 60; + return '$minutes分$remainingSeconds秒'; + } else { + final hours = seconds ~/ 3600; + final minutes = (seconds % 3600) ~/ 60; + return '$hours小时$minutes分'; + } + } + + String formatBytes(int bytes) { + if (bytes < 1024) return '$bytes B'; + final kb = bytes / 1024; + if (kb < 1024) return '${kb.toStringAsFixed(1)} KB'; + final mb = kb / 1024; + if (mb < 1024) return '${mb.toStringAsFixed(1)} MB'; + final gb = mb / 1024; + return '${gb.toStringAsFixed(1)} GB'; + } + + String formatNumber(int number) { + if (number < 1000) return number.toString(); + if (number < 1000000) return '${(number / 1000).toStringAsFixed(1)}K'; + return '${(number / 1000000).toStringAsFixed(1)}M'; + } + + Future refreshData() async { + await loadAllStats(); + } +} + diff --git a/lib/modules/usage/controllers/usage_controller.dart b/lib/modules/usage/controllers/usage_controller.dart new file mode 100644 index 000000000..bf2c5a4be --- /dev/null +++ b/lib/modules/usage/controllers/usage_controller.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../views/translation_stats_view.dart'; +import '../views/meeting_stats_view.dart'; + +class UsageController extends GetxController { + late PageController pageController; + final RxInt pageIndex = 0.obs; + + final List pageList = const [ + TranslationStatsView(), + MeetingStatsView(), + ]; + + @override + void onInit() { + super.onInit(); + pageController = PageController(initialPage: 0); + } +} diff --git a/lib/modules/usage/views/meeting_stats_view.dart b/lib/modules/usage/views/meeting_stats_view.dart new file mode 100644 index 000000000..e648dc14f --- /dev/null +++ b/lib/modules/usage/views/meeting_stats_view.dart @@ -0,0 +1,171 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import '../../../core/theme/app_colors.dart'; +import '../controllers/meeting_stats_controller.dart'; + +class MeetingStatsView extends GetView { + const MeetingStatsView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: Obx(() => controller.isLoading.value + ? const Center(child: CircularProgressIndicator()) + : _buildBody(isDarkMode)), + ); + } + + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), + onPressed: () => Get.back(), + ), + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, + elevation: 0.5, + title: Text( + '会议统计', + style: TextStyle(fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + centerTitle: true, + actions: [ + IconButton( + icon: Icon(Icons.refresh, color: isDarkMode ? Colors.white : Colors.black), + onPressed: controller.refreshData, + ), + ], + ); + } + + Widget _buildBody(bool isDarkMode) { + return Column( + children: [ + _buildTimeRangeSelector(isDarkMode), + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.all(16.w), + child: Column( + children: [ + _buildOverviewCard(isDarkMode), + ], + ), + ), + ), + ], + ); + } + + Widget _buildTimeRangeSelector(bool isDarkMode) { + return Container( + margin: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + ], + ), + child: Obx(() => Row( + children: [ + _buildTimeRangeTab('今日', 0, isDarkMode), + _buildTimeRangeTab('本周', 1, isDarkMode), + _buildTimeRangeTab('本月', 2, isDarkMode), + _buildTimeRangeTab('历史', 3, isDarkMode), + ], + )), + ); + } + + Widget _buildTimeRangeTab(String title, int index, bool isDarkMode) { + final isSelected = controller.selectedTabIndex.value == index; + + return Expanded( + child: GestureDetector( + onTap: () => controller.switchTimeRange(index), + child: Container( + padding: EdgeInsets.symmetric(vertical: 12.h), + decoration: BoxDecoration( + color: isSelected ? AppColors.primary : Colors.transparent, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + title, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.sp, + fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400, + color: isSelected ? Colors.white : (isDarkMode ? Colors.white70 : Colors.black54), + ), + ), + ), + ), + ); + } + + Widget _buildOverviewCard(bool isDarkMode) { + final stats = controller.currentStats; + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.dashboard, color: AppColors.primary, size: 20.sp), + SizedBox(width: 8.w), + Obx(() => Text( + '${controller.selectedTimeRange.value}概览', + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + )), + ], + ), + SizedBox(height: 16.h), + Row( + children: [ + Expanded(child: _buildStatItem('ASR调用次数', controller.formatNumber(stats.allAsrCalls), Icons.api, isDarkMode)), + Expanded(child: _buildStatItem('音频总时长', controller.formatDuration(stats.allAudioSeconds), Icons.mic, isDarkMode)), + ], + ), + SizedBox(height: 12.h), + Row( + children: [ + Expanded(child: _buildStatItem('音频文件大小', controller.formatBytes(stats.allAudioFileBytes), Icons.folder, isDarkMode)), + Expanded(child: _buildStatItem('转写字节', controller.formatNumber(stats.allTranscriptBytes), Icons.text_snippet, isDarkMode)), + ], + ), + ], + ), + ); + } + + Widget _buildStatItem(String label, String value, IconData icon, bool isDarkMode) { + return Column( + children: [ + Icon(icon, color: AppColors.primary, size: 24.sp), + SizedBox(height: 8.h), + Text( + value, + style: TextStyle(fontSize: 18.sp, fontWeight: FontWeight.bold, color: isDarkMode ? Colors.white : Colors.black), + ), + SizedBox(height: 4.h), + Text( + label, + style: TextStyle(fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54), + ), + ], + ); + } +} + diff --git a/lib/modules/usage/views/usage_view.dart b/lib/modules/usage/views/usage_view.dart new file mode 100644 index 000000000..efa1b02e8 --- /dev/null +++ b/lib/modules/usage/views/usage_view.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import '../../../core/theme/app_colors.dart'; +import '../controllers/usage_controller.dart'; + +class UsageView extends GetView { + const UsageView({super.key}); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], + body: PageView( + physics: const NeverScrollableScrollPhysics(), + controller: controller.pageController, + children: controller.pageList, + ), + bottomNavigationBar: Obx( + () => BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: const Icon(Icons.translate), + label: 'interpretation'.tr, + ), + BottomNavigationBarItem( + icon: const Icon(Icons.groups), + label: 'meeting'.tr, + ), + ], + backgroundColor: isDarkMode ? Colors.black : const Color(0xFFF9FAFB), + currentIndex: controller.pageIndex.value, + unselectedItemColor: isDarkMode ? Colors.grey[500] : const Color(0xFF6B7280), + selectedItemColor: const Color(0xFF3B82F6), + unselectedFontSize: 10.sp, + selectedFontSize: 10.sp, + onTap: (int index) { + if (index == controller.pageIndex.value) return; + controller.pageIndex.value = index; + controller.pageController.jumpToPage(index); + }, + type: BottomNavigationBarType.fixed, + ), + ), + ); + } +} + diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 4f9b22eb5..a45b799f9 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -34,8 +34,8 @@ import '../modules/timbre/views/timbre_view.dart'; import '../modules/translation/views/translation_view.dart'; import '../modules/translation/bindings/translation_binding.dart'; import '../modules/translation/views/translation_history_view.dart'; -import '../modules/usage/views/translation_stats_view.dart'; -import '../modules/usage/bindings/translation_stats_binding.dart'; +import '../modules/usage/views/usage_view.dart'; +import '../modules/usage/bindings/usage_binding.dart'; import '../modules/translation/bindings/translation_list_binding.dart'; import '../modules/translation/views/translation_list_view.dart'; import '../modules/translation/bindings/translation_history_binding.dart'; @@ -197,9 +197,9 @@ abstract class AppPages { transitionDuration: Duration(milliseconds: 250), ), GetPage( - name: Routes.translationStats, - page: () => const TranslationStatsView(), - binding: TranslationStatsBinding(), + name: Routes.usageStats, + page: () => const UsageView(), + binding: UsageBinding(), transition: Transition.rightToLeft, transitionDuration: Duration(milliseconds: 250), ), diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index c964ffb57..f76c442cb 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -31,7 +31,7 @@ abstract class Routes { static const pictureTranslation = '/picture_translation'; // 图片翻译 static const textTranslation = '/text_translation'; // 文本翻译 static const translationHistory = '/translation/history'; // 翻译历史 - static const translationStats = '/translation/stats'; // 翻译统计 + static const usageStats = '/usage/stats'; // 用量统计 static const speechDemo = '/speech_demo'; // 语音演示 static const translationList = '/translation/List'; // 翻译历史 static const ftftranslation = '/ftftranslation'; // 面对面翻译 From 2e2c0101a1f2ec559a2cf17afbbe27096cf1dab1 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 25 Nov 2025 10:30:33 +0800 Subject: [PATCH 067/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0ios=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/ar_sa.dart | 109 +++++++++++ lib/core/translations/language/de_de.dart | 78 ++++++++ lib/core/translations/language/en_us.dart | 161 +++++++++++++++- lib/core/translations/language/es_es.dart | 34 ++++ lib/core/translations/language/fr_fr.dart | 33 ++++ lib/core/translations/language/hi_in.dart | 106 +++++++++++ lib/core/translations/language/it_it.dart | 78 ++++++++ lib/core/translations/language/ja_jp.dart | 34 ++++ lib/core/translations/language/ko_kr.dart | 78 ++++++++ lib/core/translations/language/pt_pt.dart | 78 ++++++++ lib/core/translations/language/ru_ru.dart | 78 ++++++++ lib/core/translations/language/zh_cn.dart | 146 ++++++++++++++- lib/core/translations/language/zh_hk.dart | 116 ++++++++++++ lib/core/widgets/intro_overlay_builder.dart | 17 +- lib/data/models/user_Info.dart | 12 +- lib/data/services/network/api.dart | 13 +- lib/data/services/novice_guide_service.dart | 48 ++--- lib/data/services/pay_service.dart | 176 ++++++++++++++---- lib/modules/agent/views/agent_view.dart | 59 +++--- .../controllers/goods_base_controller.dart | 68 ++++++- lib/modules/goods/utils/goods_i18n.dart | 63 +++++++ lib/modules/goods/views/goodsai_view.dart | 136 ++++++++------ lib/modules/goods/views/goodsmeet_view.dart | 51 ++--- lib/modules/goods/views/goodstrade_view.dart | 54 +++--- lib/modules/goods/views/goodsvip_view.dart | 91 +++++---- lib/modules/home/views/home_view.dart | 4 +- lib/modules/settings/views/settings_view.dart | 8 +- pubspec.yaml | 2 +- 28 files changed, 1669 insertions(+), 262 deletions(-) create mode 100644 lib/modules/goods/utils/goods_i18n.dart diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index d8a24f8f8..561cff270 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -1159,4 +1159,113 @@ const Map arSA = { "justNow": "الآن", "minutesAgo": "منذ @minutes دقيقة", "yesterday": "أمس", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": + "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', + // Goods names by id + 'ai_001_name': 'الذكاء الاصطناعي الأساسي 100', + 'ai_002_name': 'الذكاء الاصطناعي الأساسي 500', + 'ai_003_name': 'الذكاء الاصطناعي الأساسي 1000', + 'meet_001_name': 'اجتماع أساسي 100', + 'meet_002_name': 'اجتماع أساسي 500', + 'meet_003_name': 'اجتماع أساسي 1000', + 'trade_001_name': 'ترجمة أساسية 100', + 'trade_002_name': 'ترجمة أساسية 500', + 'trade_003_name': 'ترجمة أساسية 1000', + // Goods descriptions by id + 'ai_001_desc': + 'يشمل 100 استخدام. الوصول إلى ميزات الذكاء الاصطناعي الأساسية.', + 'ai_002_desc': + 'يشمل 500 استخدام. الوصول إلى ميزات الذكاء الاصطناعي الأساسية.', + 'ai_003_desc': + 'يشمل 1000 استخدام. الوصول إلى ميزات الذكاء الاصطناعي الأساسية.', + 'meet_001_desc': 'يشمل 100 تسجيل/نسخ لاجتماعات.', + 'meet_002_desc': 'يشمل 500 تسجيل/نسخ لاجتماعات.', + 'meet_003_desc': 'يشمل 1000 تسجيل/نسخ لاجتماعات.', + 'trade_001_desc': 'يشمل 100 ترجمة (صوت/نص).', + 'trade_002_desc': 'يشمل 500 ترجمة (صوت/نص).', + 'trade_003_desc': 'يشمل 1000 ترجمة (صوت/نص).', }; diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index f5bdbc994..378044786 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -880,4 +880,82 @@ const Map deDE = { "乌尔都语": "Urdu", "波斯语": "Persisch", "斯瓦希里语": "Swahili", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index a19fc113a..1ea7da229 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -197,6 +197,165 @@ const Map enUS = { "popularFunction": "Popular Features", "tryNow": "Try Now", + // Goods screens (AI/Translation/Meeting) + 'availablePackages': 'Available Packages', + 'remainingQuota': 'Remaining Quota', + 'totalCount': 'Total Count', + 'remaining': 'Remaining', + 'featureDescription': 'Feature Description', + // AI feature cards + 'musicAndRecommendation': 'Music & Recommendation', + 'navigationAndRoutes': 'Navigation & Routes', + 'nearbySearch': 'Nearby Search', + 'newsInformation': 'News', + 'communicationAssistant': 'Communication Assistant', + // Translation feature cards + 'realtimeTranscription': 'Real-time Transcription', + // 'textTranslation' exists + 'sceneLexicon': 'Scenario Glossary', + 'subtitleDisplay': 'Subtitles', + // Meeting feature cards + 'meetingRecording': 'Meeting Recording', + 'transcriptionAndSummary': 'Transcription & Summary', + 'keywordSearch': 'Keyword Search', + 'collaborationSharing': 'Collaboration & Sharing', + // Goods names by id + 'ai_001_name': 'AI Basic 100', + 'ai_002_name': 'AI Basic 500', + 'ai_003_name': 'AI Basic 1000', + 'meet_001_name': 'Meeting Basic 100', + 'meet_002_name': 'Meeting Basic 500', + 'meet_003_name': 'Meeting Basic 1000', + 'trade_001_name': 'Translation Basic 100', + 'trade_002_name': 'Translation Basic 500', + 'trade_003_name': 'Translation Basic 1000', + + // Goods descriptions by id + 'ai_001_desc': 'Includes 100 uses. Access core AI features.', + 'ai_002_desc': 'Includes 500 uses. Access core AI features.', + 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', + 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', + 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', + 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', + 'trade_001_desc': 'Includes 100 translations (voice/text).', + 'trade_002_desc': 'Includes 500 translations (voice/text).', + 'trade_003_desc': 'Includes 1000 translations (voice/text).', + + // Goods pages common footer + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page descriptions + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page descriptions + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': + 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', + + // AI goods page descriptions + 'aiHeaderDesc1': + 'Longer conversation quota, more tool calls, extended context length.', + 'aiHeaderDesc2': + 'Suitable for agent Q&A, summarization, analysis, and task execution.', + 'musicSearchPlaybackControl': 'Music library search and playback control', + 'smartPlaylistAndSimilarRecommendations': + 'Smart playlist and similar song recommendations', + 'routePlanningAndCongestionAvoidance': + 'Route planning and congestion avoidance', + 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', + 'realTimeWeatherForecast': 'Real-time weather and forecast', + 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', + 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', + 'ratingsHoursAndDirectRoutes': + 'Ratings, business hours, and direct routing', + 'hotNewsAndTopicOverview': 'Hot news and topic overview', + 'longArticleSummariesAndKeyPoints': + 'Long-article summaries and key points', + 'helpCallAndSMS': 'Help with calls and SMS', + 'templatedMessagesAndScheduleReminders': + 'Template messages and schedule reminders', + 'aiDisclaimer': + 'Features depend on device permissions, service availability, and network conditions.', + + // VIP goods page + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', + + // Onboarding / Guide + 'skip': 'Skip', + 'next': 'Next', + 'sayXiaoYanHint': 'Say "Xiaoyan Xiaoyan" to the mic', + 'imHere': 'I’m here~', + 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Xiaoyan”.', + 'aiReplyCompleted': 'Xiaoyan has finished the reply!', + 'aiThinking': 'Xiaoyan is thinking…', + 'guideAwakenSuccess': 'Great! Xiaoyan is awake—ask it to help.', + 'confirmInput': 'Confirm Input', + 'guideClickSendPrefix': 'Tap send, ', + // AI steps + 'guideWeatherStart': 'Tell Xiaoyan: “What’s the weather today?”', + 'guideWeatherInput': 'What’s the weather today?', + 'guideWeatherSend': 'Xiaoyan will report the weather in real time', + 'guideWeatherEnd': 'Xiaoyan can report weather live—try other commands', + 'guideMusicStart': 'Tell Xiaoyan: “Play some rock music”', + 'guideMusicInput': 'Play some rock music', + 'guideMusicSend': 'Xiaoyan will find music for you', + 'guideMusicEnd': 'Xiaoyan found music—try other commands', + 'guideNavStart': 'Tell Xiaoyan: “Navigate to Shenzhen Airport”', + 'guideNavInput': 'Navigate to Shenzhen Airport', + 'guideNavSend': 'Xiaoyan will plan the route', + 'guideNavEnd': 'Navigation set—try other commands', + 'guideMeetingStart': 'Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”', + 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', + 'guideMeetingSend': 'Xiaoyan will create a meeting reminder', + 'guideMeetingEnd': 'Reminder created—try other commands', + 'guidePhoneStart': 'Tell Xiaoyan: “Call Mom”', + 'guidePhoneInput': 'Call Mom', + 'guidePhoneSend': 'Xiaoyan will make the call', + 'guidePhoneEnd': 'Call placed—try other commands', + 'guideSmsStart': 'Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”', + 'guideSmsInput': 'Text Dad: I’ll be home for dinner', + 'guideSmsSend': 'Xiaoyan will send the message', + 'guideSmsEnd': 'Message sent—voice control is convenient', + // 商务会议助手页 "startMeeting": "Start Meeting", 'edit': 'Edit', @@ -1053,7 +1212,7 @@ const Map enUS = { "autoInputCode": "Auto Input Code", "skipBinding": "Skip Binding", "rescan": "Rescan", - "skip": "Skip", + "verifyingDevice": "Verifying device...", "confirmBinding": "Confirm Binding", "associatingDevice": "Associating device...", diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 6ccc9dae1..b49042841 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -874,4 +874,38 @@ const Map esES = { "乌尔都语": "Urdu", "波斯语": "Persa", "斯瓦希里语": "Suajili", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": + "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", }; diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index ad0f7c7a7..8b64b9629 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -883,4 +883,37 @@ const Map frFR = { "乌尔都语": "Ourdou", "波斯语": "Persan", "斯瓦希里语": "Swahili", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", }; diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 58c9c48bb..1d745b64a 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -848,4 +848,110 @@ const Map hiIN = { "乌尔都语": "उर्दू", "波斯语": "फारसी", "斯瓦希里语": "स्वाहिली", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": + "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', + // Goods names by id + 'ai_001_name': 'एआई बेसिक 100', + 'ai_002_name': 'एआई बेसिक 500', + 'ai_003_name': 'एआई बेसिक 1000', + 'meet_001_name': 'मीटिंग बेसिक 100', + 'meet_002_name': 'मीटिंग बेसिक 500', + 'meet_003_name': 'मीटिंग बेसिक 1000', + 'trade_001_name': 'अनुवाद बेसिक 100', + 'trade_002_name': 'अनुवाद बेसिक 500', + 'trade_003_name': 'अनुवाद बेसिक 1000', + // Goods descriptions by id + 'ai_001_desc': '100 उपयोग शामिल। मुख्य AI सुविधाओं की पहुँच।', + 'ai_002_desc': '500 उपयोग शामिल। मुख्य AI सुविधाओं की पहुँच।', + 'ai_003_desc': '1000 उपयोग शामिल। मुख्य AI सुविधाओं की पहुँच।', + 'meet_001_desc': '100 बैठक रिकॉर्डिंग/ट्रांसक्रिप्शन शामिल।', + 'meet_002_desc': '500 बैठक रिकॉर्डिंग/ट्रांसक्रिप्शन शामिल।', + 'meet_003_desc': '1000 बैठक रिकॉर्डिंग/ट्रांसक्रिप्शन शामिल।', + 'trade_001_desc': '100 अनुवाद (वॉयस/टेक्स्ट) शामिल।', + 'trade_002_desc': '500 अनुवाद (वॉयस/टेक्स्ट) शामिल।', + 'trade_003_desc': '1000 अनुवाद (वॉयस/टेक्स्ट) शामिल।', }; diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index 07a2e32f8..5c542f335 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -869,4 +869,82 @@ const Map itIT = { "乌尔都语": "Urdu", "波斯语": "Persiano", "斯瓦希里语": "Swahili", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index 360a0207c..4f27b6aa2 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -797,4 +797,38 @@ const Map jaJP = { "乌尔都语": "ウルドゥー語", "波斯语": "ペルシャ語", "斯瓦希里语": "スワヒリ語", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": + "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", }; diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 2b1c2122e..4959af0e1 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -784,4 +784,82 @@ const Map koKR = { "乌尔都语": "우르두어", "波斯语": "페르시아어", "斯瓦希里语": "스와힐리어", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 14eadd866..4ca7b3ab4 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -863,4 +863,82 @@ const Map ptPT = { "乌尔都语": "Urdu", "波斯语": "Persa", "斯瓦希里语": "Suaíli", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 6d6603e5d..11c95cd0f 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -856,4 +856,82 @@ const Map ruRU = { "乌尔都语": "Урду", "波斯语": "Персидский", "斯瓦希里语": "Суахили", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', + 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingSpeakerTagging': 'Speaker labeling', + 'meetingLongAudioTranscription': 'Long audio transcription', + 'meetingKeyPointSummary': 'Key point extraction', + 'meetingTopicNameSearch': 'Search by topic/name', + 'meetingTimelineJump': 'Timeline jump', + 'meetingExportSummary': 'Export minutes', + 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'translateZhEn': 'Chinese-English translation', + 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', + 'multiLangTextTranslation': 'Multilingual text translation', + 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', + 'personalVocabularyMemory': 'Personal vocabulary memory', + 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', + 'colorHighContrast': 'High color contrast', + 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + + // VIP goods page (placeholders) + 'benefitsOverview': 'Benefits overview', + 'higherQuota': 'Higher usage quota', + 'lowerUnitPrice': 'Lower unit price', + 'priorityService': 'Priority service', + 'exclusiveSupportChannel': 'Dedicated support channel', + 'fastResponse': 'Fast issue response', + 'eventsAndDiscounts': 'Events and discounts', + 'memberExclusiveEvents': 'Member-exclusive events', + 'longTermDiscountPlan': 'Long-term discount plan', + 'generalPrivileges': 'General privileges', + 'earlyAccessNewFeatures': 'Early access to new features', + 'crossDeviceSync': 'Cross-device sync', + 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 5fb101114..4360198c9 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -191,6 +191,87 @@ const Map zhCN = { "popularFunction": "热门功能场景", "tryNow": "立即尝试", + // 商品页面(AI/翻译/会议) + 'availablePackages': '可购买套餐', + 'remainingQuota': '剩余额度', + 'totalCount': '总次数', + 'remaining': '剩余', + 'featureDescription': '功能说明', + // AI 功能卡片 + 'musicAndRecommendation': '听歌与推荐', + 'navigationAndRoutes': '导航与路线', + 'nearbySearch': '附近搜索', + 'newsInformation': '新闻资讯', + 'communicationAssistant': '通讯助手', + // 翻译功能卡片 + 'realtimeTranscription': '实时同传', + // 'textTranslation' 已存在 + 'sceneLexicon': '场景词库', + 'subtitleDisplay': '字幕显示', + // 会议功能卡片 + 'meetingRecording': '会议记录', + 'transcriptionAndSummary': '转写与总结', + 'keywordSearch': '关键词检索', + 'collaborationSharing': '协同分享', + // 商品名称(按ID) + 'ai_001_name': 'AI基础 100 次', + 'ai_002_name': 'AI基础 500 次', + 'ai_003_name': 'AI基础 1000 次', + 'meet_001_name': '会议基础 100 次', + 'meet_002_name': '会议基础 500 次', + 'meet_003_name': '会议基础 1000 次', + 'trade_001_name': '翻译基础 100 次', + 'trade_002_name': '翻译基础 500 次', + 'trade_003_name': '翻译基础 1000 次', + + // 商品描述(按ID) + 'ai_001_desc': '含 100 次使用,覆盖核心 AI 功能', + 'ai_002_desc': '含 500 次使用,覆盖核心 AI 功能', + 'ai_003_desc': '含 1000 次使用,覆盖核心 AI 功能', + 'meet_001_desc': '含 100 次会议录音/转写', + 'meet_002_desc': '含 500 次会议录音/转写', + 'meet_003_desc': '含 1000 次会议录音/转写', + 'trade_001_desc': '含 100 次翻译(语音/文本)', + 'trade_002_desc': '含 500 次翻译(语音/文本)', + 'trade_003_desc': '含 1000 次翻译(语音/文本)', + + // 新手引导 / Onboarding + 'skip': '跳过', + 'next': '下一步', + 'sayXiaoYanHint': '对着麦克风说:“小言小言”', + 'imHere': '我在呢~', + 'guideWelcomeWakeAI': '欢迎使用Voitrans!首先,让我们唤醒你的专属 AI—— 小言', + 'aiReplyCompleted': '小言已经完成了回答!', + 'aiThinking': '小言正在思考中~', + 'guideAwakenSuccess': '太棒了!你已成功唤醒小言,接下来试试让它帮你做件事吧', + 'confirmInput': '确定输入', + 'guideClickSendPrefix': '点击发送,', + // AI 引导步骤 + 'guideWeatherStart': '对小言说:“今天天气怎么样”', + 'guideWeatherInput': '今天天气怎么样', + 'guideWeatherSend': '小言会为你实时为你播报天气', + 'guideWeatherEnd': '小言能实时为你播报天气,试试其他指令吧', + 'guideMusicStart': '对小言说:“请播放一组摇滚乐”', + 'guideMusicInput': '请播放一组摇滚乐', + 'guideMusicSend': '小言会为你搜寻到一组音乐', + 'guideMusicEnd': '小言已成功为您搜寻到一组音乐,试试其他指令吧', + 'guideNavStart': '对小言说:“导航到深圳机场”', + 'guideNavInput': '导航到深圳机场', + 'guideNavSend': '小言会为你规划路线', + 'guideNavEnd': '小言已成功为您导航到深圳机场,试试其他指令吧', + 'guideMeetingStart': '对小言说:“明天下午3点创建会议提醒”', + 'guideMeetingInput': '明天下午3点创建会议提醒', + 'guideMeetingSend': '小言会为你创建会议提醒', + 'guideMeetingEnd': '小言已成功为您创建会议提醒,试试其他指令吧', + 'guidePhoneStart': '对小言说:“拨打妈妈的电话”', + 'guidePhoneInput': '拨打妈妈的电话', + 'guidePhoneSend': '小言会为你拨打电话', + 'guidePhoneEnd': '小言已成功为您拨打电话,试试其他指令吧', + 'guideSmsStart': '对小言说:“给爸爸发短信说晚上回家吃饭”', + 'guideSmsInput': '给爸爸发短信说晚上回家吃饭', + 'guideSmsSend': '小言会为你发送短信', + 'guideSmsEnd': '短信已发送,语音操控更便捷', + // 商务会议助手页 "startMeeting": "开始会议", 'edit': '编辑', @@ -968,7 +1049,7 @@ const Map zhCN = { "autoInputCode": "自动输入代码", "skipBinding": "跳过绑定", "rescan": "重新扫描", - "skip": "跳过", + "verifyingDevice": "正在验证设备...", "confirmBinding": "确认绑定", "associatingDevice": "正在关联设备...", @@ -1118,4 +1199,67 @@ const Map zhCN = { //补充 "insufficientIntegral": "积分不足", + + // 商品页通用页脚 + 'appNameProvider': '应用名称:VoiTrans · 服务提供:VoiTrans', + 'moreInfoViewInSettingsAbout': '更多信息请前往 设置 > 关于 查看', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // 会议商品页描述 + 'meetingHeaderDesc1': '录音转写、关键词检索与自动总结,提升会议效率。', + 'meetingHeaderDesc2': '适用于商务会议、课堂笔记、访谈纪要等场景。', + 'meetingAutoRecording': '自动录音与分段', + 'meetingSpeakerTagging': '讲话人标注', + 'meetingLongAudioTranscription': '长音频转写', + 'meetingKeyPointSummary': '关键要点提炼', + 'meetingTopicNameSearch': '按主题/人名检索', + 'meetingTimelineJump': '时间线跳转', + 'meetingExportSummary': '导出纪要', + 'meetingMultiPlatformShare': '多平台分享', + 'meetingDisclaimer': '建议在安静环境使用,效果受麦克风与网络影响,具体以实际表现为准。', + + // 同传/翻译商品页描述 + 'tradeHeaderDesc1': '多语种实时同传与文本翻译,低延时语音播报。', + 'tradeHeaderDesc2': '适用于出行、商务、演讲与教学等场景。', + 'translateZhEn': '中英互译', + 'lowLatencyVoiceBroadcast': '低延时语音播报', + 'multiLangTextTranslation': '多语种文本翻译', + 'termOptimizationContextPreserve': '术语优化与语境保持', + 'lexiconTourBusinessLife': '旅游/商务/生活词库', + 'personalVocabularyMemory': '专属词汇记忆', + 'conversationSubtitleLargeText': '对话字幕/大字模式', + 'colorHighContrast': '颜色高对比度', + 'tradeDisclaimer': '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', + + // AI 商品页描述 + 'aiHeaderDesc1': '更长对话额度、更多工具调用、更强上下文长度支持。', + 'aiHeaderDesc2': '适用于智能体问答、总结分析、任务执行等场景。', + 'musicSearchPlaybackControl': '检索曲库、播放控制', + 'smartPlaylistAndSimilarRecommendations': '智能推荐歌单与相似歌曲', + 'routePlanningAndCongestionAvoidance': '路线规划与拥堵规避', + 'voiceBroadcastAndWaypoints': '语音播报与途径点设置', + 'realTimeWeatherForecast': '实时天气与预报', + 'clothingAdviceAndTravelReminders': '穿衣建议与出行提醒', + 'poiSearchFoodGasParking': '餐饮/加油/停车等地点检索', + 'ratingsHoursAndDirectRoutes': '评分、营业时间与路线直达', + 'hotNewsAndTopicOverview': '热点快讯与专题速览', + 'longArticleSummariesAndKeyPoints': '长文总结与要点提炼', + 'helpCallAndSMS': '帮忙拨打电话与发短信', + 'templatedMessagesAndScheduleReminders': '模板消息与日程提醒', + 'aiDisclaimer': '以上功能受设备权限、服务可用性与网络状况影响,具体以实际表现为准。', + + // 会员商品页 + 'benefitsOverview': '权益总览', + 'higherQuota': '更高使用额度', + 'lowerUnitPrice': '更低单价', + 'priorityService': '优先服务', + 'exclusiveSupportChannel': '专属客服通道', + 'fastResponse': '问题快速响应', + 'eventsAndDiscounts': '活动与折扣', + 'memberExclusiveEvents': '会员专属活动', + 'longTermDiscountPlan': '长期优惠计划', + 'generalPrivileges': '通用特权', + 'earlyAccessNewFeatures': '新功能优先体验', + 'crossDeviceSync': '跨设备同步', + 'vipDisclaimer': '具体权益以实际套餐说明为准,可能随版本迭代调整。', }; diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 2a2c7fbfd..8e16a47d4 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -189,6 +189,27 @@ const Map zhHK = { "aiSingerInfo": "用你喜歡的歌手聲音演唱任何歌曲,甚至是你自己創作的歌曲", "popularFunction": "熱門功能場景", "tryNow": "立即嘗試", + // 商品名稱(按ID) + 'ai_001_name': 'AI基礎 100 次', + 'ai_002_name': 'AI基礎 500 次', + 'ai_003_name': 'AI基礎 1000 次', + 'meet_001_name': '會議基礎 100 次', + 'meet_002_name': '會議基礎 500 次', + 'meet_003_name': '會議基礎 1000 次', + 'trade_001_name': '翻譯基礎 100 次', + 'trade_002_name': '翻譯基礎 500 次', + 'trade_003_name': '翻譯基礎 1000 次', + + // 商品描述(按ID) + 'ai_001_desc': '含 100 次使用,涵蓋核心 AI 功能', + 'ai_002_desc': '含 500 次使用,涵蓋核心 AI 功能', + 'ai_003_desc': '含 1000 次使用,涵蓋核心 AI 功能', + 'meet_001_desc': '含 100 次會議錄音/轉寫', + 'meet_002_desc': '含 500 次會議錄音/轉寫', + 'meet_003_desc': '含 1000 次會議錄音/轉寫', + 'trade_001_desc': '含 100 次翻譯(語音/文本)', + 'trade_002_desc': '含 500 次翻譯(語音/文本)', + 'trade_003_desc': '含 1000 次翻譯(語音/文本)', // 商務會議助手頁 "startMeeting": "開始會議", @@ -787,4 +808,99 @@ const Map zhHK = { "乌尔都语": "烏爾都語", "波斯语": "波斯語", "斯瓦希里语": "斯瓦希里語", + // Guide overlay keys (placeholders in English) + "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "imHere": "I’m here~", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", + "aiReplyCompleted": "Xiaoyan has finished the reply!", + "aiThinking": "Xiaoyan is thinking…", + "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "confirmInput": "Confirm Input", + "guideClickSendPrefix": "Tap send, ", + "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherInput": "What’s the weather today?", + "guideWeatherSend": "Xiaoyan will report the weather in real time", + "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", + "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideMusicInput": "Play some rock music", + "guideMusicSend": "Xiaoyan will find music for you", + "guideMusicEnd": "Xiaoyan found music—try other commands", + "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideNavInput": "Navigate to Shenzhen Airport", + "guideNavSend": "Xiaoyan will plan the route", + "guideNavEnd": "Navigation set—try other commands", + "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", + "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingEnd": "Reminder created—try other commands", + "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneInput": "Call Mom", + "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneEnd": "Call placed—try other commands", + "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsInput": "Text Dad: I’ll be home for dinner", + "guideSmsSend": "Xiaoyan will send the message", + "guideSmsEnd": "Message sent—voice control is convenient", + // Goods pages common footer (placeholders) + 'appNameProvider': '應用名稱:VoiTrans · 服務提供:VoiTrans', + 'moreInfoViewInSettingsAbout': '更多信息請前往 設置 > 關於 查看', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // Meeting goods page (placeholders) + 'meetingHeaderDesc1': '錄音轉寫、關鍵詞檢索與自動總結,提升會議效率。', + 'meetingHeaderDesc2': '適用於商務會議、課堂筆記、訪談紀要等場景。', + 'meetingAutoRecording': '自動錄音與分段', + 'meetingSpeakerTagging': '講話人標注', + 'meetingLongAudioTranscription': '長音頻轉寫', + 'meetingKeyPointSummary': '關鍵要點提煉', + 'meetingTopicNameSearch': '按主題/人名檢索', + 'meetingTimelineJump': '時間線跳轉', + 'meetingExportSummary': '導出紀要', + 'meetingMultiPlatformShare': '多平台分享', + 'meetingDisclaimer': '建議在安靜環境使用,效果受麥克風與網絡影響,具體以實際表現為準。', + + // Translation goods page (placeholders) + 'tradeHeaderDesc1': '多語種實時同傳與文本翻譯,低延時語音播報。', + 'tradeHeaderDesc2': '適用於出行、商務、演講與教學等場景。', + 'translateZhEn': '中英互譯', + 'lowLatencyVoiceBroadcast': '低延時語音播報', + 'multiLangTextTranslation': '多語種文本翻譯', + 'termOptimizationContextPreserve': '術語優化與語境保持', + 'lexiconTourBusinessLife': '旅遊/商務/生活詞庫', + 'personalVocabularyMemory': '專屬詞彙記憶', + 'conversationSubtitleLargeText': '對話字幕/大字模式', + 'colorHighContrast': '顏色高對比度', + 'tradeDisclaimer': '翻譯效果受麥克風、網絡時延與環境噪聲影響,具體以實際表現為準。', + + // AI 商品頁描述(佔位) + 'aiHeaderDesc1': '更長對話額度、更多工具調用、更強上下文長度支持。', + 'aiHeaderDesc2': '適用於智能體問答、總結分析、任務執行等場景。', + 'musicSearchPlaybackControl': '檢索曲庫、播放控制', + 'smartPlaylistAndSimilarRecommendations': '智能推薦歌單與相似歌曲', + 'routePlanningAndCongestionAvoidance': '路線規劃與擁堵規避', + 'voiceBroadcastAndWaypoints': '語音播報與途徑點設置', + 'realTimeWeatherForecast': '實時天氣與預報', + 'clothingAdviceAndTravelReminders': '穿衣建議與出行提醒', + 'poiSearchFoodGasParking': '餐飲/加油/停車等地點檢索', + 'ratingsHoursAndDirectRoutes': '評分、營業時間與路線直達', + 'hotNewsAndTopicOverview': '熱點快訊與專題速覽', + 'longArticleSummariesAndKeyPoints': '長文總結與要點提煉', + 'helpCallAndSMS': '幫忙撥打電話與發短信', + 'templatedMessagesAndScheduleReminders': '模板消息與日程提醒', + 'aiDisclaimer': '以上功能受設備權限、服務可用性與網絡狀況影響,具體以實際表現為準。', + + // VIP goods page (placeholders) + 'benefitsOverview': '權益總覽', + 'higherQuota': '更高使用額度', + 'lowerUnitPrice': '更低單價', + 'priorityService': '優先服務', + 'exclusiveSupportChannel': '專屬客服通道', + 'fastResponse': '問題快速響應', + 'eventsAndDiscounts': '活動與折扣', + 'memberExclusiveEvents': '會員專屬活動', + 'longTermDiscountPlan': '長期優惠計劃', + 'generalPrivileges': '通用特權', + 'earlyAccessNewFeatures': '新功能優先體驗', + 'crossDeviceSync': '跨設備同步', + 'vipDisclaimer': '具體權益以實際套餐說明為準,可能隨版本迭代調整。', }; diff --git a/lib/core/widgets/intro_overlay_builder.dart b/lib/core/widgets/intro_overlay_builder.dart index 22b52a81a..882ae9f80 100644 --- a/lib/core/widgets/intro_overlay_builder.dart +++ b/lib/core/widgets/intro_overlay_builder.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_intro/flutter_intro.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:lottie/lottie.dart'; class IntroOverlayBuilder { @@ -19,7 +20,7 @@ class IntroOverlayBuilder { static Widget homeBuilder( StepWidgetParams params, bool isWakeup, { - String title = '对着麦克风说:“小言小言”', + String title = 'sayXiaoYanHint', Function? onNext, }) { return Column( @@ -29,7 +30,7 @@ class IntroOverlayBuilder { margin: EdgeInsets.only(top: ScreenUtil().statusBarHeight), alignment: Alignment.centerRight, child: _button( - '跳过', + 'skip'.tr, () { params.onFinish(); }, @@ -47,7 +48,7 @@ class IntroOverlayBuilder { Padding( padding: EdgeInsets.only(bottom: 10.w), child: Text( - isWakeup ? '我在呢~' : title, + isWakeup ? 'imHere'.tr : title.tr, style: TextStyle( fontSize: 15.sp, color: Colors.white, @@ -57,7 +58,7 @@ class IntroOverlayBuilder { ), if (onNext != null) _button( - '下一步', + 'next'.tr, () { params.onNext!(); onNext(); @@ -70,7 +71,7 @@ class IntroOverlayBuilder { static Widget aiBuilder( StepWidgetParams params, String text, { - String buttonText = '下一步', + String buttonText = 'next', bool alignment = true, Function? onNext, Function? onFinish, @@ -92,7 +93,7 @@ class IntroOverlayBuilder { margin: EdgeInsets.only(top: ScreenUtil().statusBarHeight), alignment: Alignment.centerRight, child: _button( - '跳过', + 'skip'.tr, () { params.onFinish(); }, @@ -125,7 +126,7 @@ class IntroOverlayBuilder { Padding( padding: EdgeInsets.only(top: 10.w, left: 3, right: 3), child: _button( - buttonText, + buttonText.tr, () { params.onNext!(); onNext(); @@ -136,7 +137,7 @@ class IntroOverlayBuilder { Padding( padding: EdgeInsets.only(top: 10.w, left: 3, right: 3), child: _button( - buttonText, + buttonText.tr, () { params.onFinish(); onFinish(); diff --git a/lib/data/models/user_Info.dart b/lib/data/models/user_Info.dart index 861d1604a..4f3bc195b 100644 --- a/lib/data/models/user_Info.dart +++ b/lib/data/models/user_Info.dart @@ -45,7 +45,7 @@ class User { String phonemac; String password; int viplv = 0; //添加会员等级字段,0表示普通用户 - int viptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) + int vipexptime = 0; // 会员到期/剩余时间(秒/毫秒,按后端定义) int aichatintegral = 0; // ai聊天积分 int aichattotalintegral = 0; // ai聊天总积分 int tradeintegral = 0; // 翻译积分 @@ -67,7 +67,7 @@ class User { required this.phonemac, required this.password, required this.viplv, - required this.viptime, + required this.vipexptime, required this.aichatintegral, required this.aichattotalintegral, required this.tradeintegral, @@ -96,7 +96,7 @@ class User { phonemac: (userData?['phonemac'] as String?) ?? '', password: (userData?['password'] as String?) ?? '', viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 - viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 + vipexptime: (userData?['vipexptime'] as int?) ?? 0, // 提供默认值 aichatintegral: (userData?['aichatintegral'] as int?) ?? 0, aichattotalintegral: (userData?['aichattotalintegral'] as int?) ?? 0, @@ -130,7 +130,7 @@ class User { phonemac: (userData?['phonemac'] as String?) ?? '', password: (userData?['password'] as String?) ?? '', viplv: (userData?['viplv'] as int?) ?? 0, // 提供默认值 - viptime: (userData?['viptime'] as int?) ?? 0, // 提供默认值 + vipexptime: (userData?['vipexptime'] as int?) ?? 0, // 提供默认值 aichatintegral: (userData?['aichatintegral'] as int?) ?? 0, aichattotalintegral: (userData?['aichattotalintegral'] as int?) ?? 0, tradeintegral: (userData?['tradeintegral'] as int?) ?? 0, @@ -156,7 +156,7 @@ class User { phonemac = user['phonemac'] as String? ?? phonemac; password = user['password'] as String? ?? password; viplv = user['viplv'] as int? ?? viplv; - viptime = user['viptime'] as int? ?? viptime; + vipexptime = user['vipexptime'] as int? ?? vipexptime; aichatintegral = user['aichatintegral'] as int? ?? aichatintegral; aichattotalintegral = user['aichattotalintegral'] as int? ?? aichattotalintegral; @@ -183,7 +183,7 @@ class User { 'phonemac': phonemac, 'password': password, 'viplv': viplv, - 'viptime': viptime, + 'vipexptime': vipexptime, 'aichatintegral': aichatintegral, 'aichattotalintegral': aichattotalintegral, 'tradeintegral': tradeintegral, diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index e405bd87f..988af2e72 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -182,19 +182,10 @@ class Api { } //询问订单 - static payaskorder([params]) { + static payverifyorder([params]) { return DioManager().request( NWMethod.post, - '/api/home/pay_askorder', - params: params, - ); - } - - //内购收据验证 - static payiapverify([params]) { - return DioManager().request( - NWMethod.post, - '/api/home/pay_iapverify', + '/api/home/pay_verifyorder', params: params, ); } diff --git a/lib/data/services/novice_guide_service.dart b/lib/data/services/novice_guide_service.dart index f7617114f..7fbcefecf 100644 --- a/lib/data/services/novice_guide_service.dart +++ b/lib/data/services/novice_guide_service.dart @@ -23,10 +23,10 @@ class NoviceGuideService extends GetxService { List aiStepsList = [ { - 'start': '对小言说:“今天天气怎么样”', - 'input': '今天天气怎么样', - 'send': '小言会为你实时为你播报天气', - 'end': '小言能实时为你播报天气,试试其他指令吧', + 'startKey': 'guideWeatherStart', + 'inputKey': 'guideWeatherInput', + 'sendKey': 'guideWeatherSend', + 'endKey': 'guideWeatherEnd', 'method': () async { // 天气查询需要位置权限 await PermissionUtil.instance.requestPermission( @@ -39,17 +39,17 @@ class NoviceGuideService extends GetxService { }, }, { - 'start': '对小言说:“请播放一组摇滚乐”', - 'input': '请播放一组摇滚乐', - 'send': '小言会为你搜寻到一组音乐', - 'end': '小言已成功为您搜寻到一组音乐,试试其他指令吧', + 'startKey': 'guideMusicStart', + 'inputKey': 'guideMusicInput', + 'sendKey': 'guideMusicSend', + 'endKey': 'guideMusicEnd', 'method': () async {}, }, { - 'start': '对小言说:“导航到深圳机场”', - 'input': '导航到深圳机场', - 'send': '小言会为你规划路线', - 'end': '小言已成功为您导航到深圳机场,试试其他指令吧', + 'startKey': 'guideNavStart', + 'inputKey': 'guideNavInput', + 'sendKey': 'guideNavSend', + 'endKey': 'guideNavEnd', 'method': () async { // 导航功能需要位置权限 await PermissionUtil.instance.requestPermission( @@ -62,10 +62,10 @@ class NoviceGuideService extends GetxService { }, }, { - 'start': '对小言说:“明天下午3点创建会议提醒”', - 'input': '明天下午3点创建会议提醒', - 'send': '小言会为你创建会议提醒', - 'end': '小言已成功为您创建会议提醒,试试其他指令吧', + 'startKey': 'guideMeetingStart', + 'inputKey': 'guideMeetingInput', + 'sendKey': 'guideMeetingSend', + 'endKey': 'guideMeetingEnd', 'method': () async { //创建会议提醒需要日历权限 await PermissionUtil.instance.requestPermission( @@ -78,10 +78,10 @@ class NoviceGuideService extends GetxService { }, }, { - 'start': '对小言说:“拨打妈妈的电话”', - 'input': '拨打妈妈的电话', - 'send': '小言会为你拨打电话', - 'end': '小言已成功为您拨打电话,试试其他指令吧', + 'startKey': 'guidePhoneStart', + 'inputKey': 'guidePhoneInput', + 'sendKey': 'guidePhoneSend', + 'endKey': 'guidePhoneEnd', 'method': () async { if (Platform.isAndroid) { // 拨打电话需要电话权限 @@ -103,10 +103,10 @@ class NoviceGuideService extends GetxService { }, }, { - 'start': '对小言说:“给爸爸发短信说晚上回家吃饭’”', - 'input': '给爸爸发短信说晚上回家吃饭’', - 'send': '小言会为你发送短信', - 'end': '短信已发送,语音操控更便捷', + 'startKey': 'guideSmsStart', + 'inputKey': 'guideSmsInput', + 'sendKey': 'guideSmsSend', + 'endKey': 'guideSmsEnd', 'method': () async { if (Platform.isAndroid) { // 发送短信需要短信权限 diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index bbe89c42b..dedc2cae8 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -54,7 +54,7 @@ class PayService extends GetxService { /// 初始化支付宝SDK Future _initAlipay() async { try { - // 检查支付宝是否安装 - 修复用法 + // 检查支付宝是否安x装 - 修复用法 final isInstalled = await _tobias.isAliPayInstalled; print('支付宝是否安装: $isInstalled'); } catch (e) { @@ -99,8 +99,11 @@ class PayService extends GetxService { print('[IAP] 待查询商品ID: $id'); } // 仅在非 Web 平台执行;平台信息用于日志 - await _initIAP(); final platform = _platformString(); + if (!iapAvailable.value) { + final available = await _inAppPurchase.isAvailable(); + iapAvailable.value = available; + } if (!iapAvailable.value) { print('[IAP-$platform] 当前平台内购不可用,无法查询商品。'); return; @@ -108,7 +111,9 @@ class PayService extends GetxService { print('[IAP-$platform] 开始查询商品,IDs=${productIds.join(', ')}'); final resp = await _inAppPurchase.queryProductDetails(productIds); if (resp.error != null) { - print('[IAP-$platform] 查询错误: ${resp.error}'); + final err = resp.error!; + print( + '[IAP-$platform] 查询错误: code=${err.code}, source=${err.source}, message=${err.message}, details=${err.details}'); } if (resp.productDetails.isEmpty) { print('[IAP-$platform] 未返回任何商品。notFound=${resp.notFoundIDs}'); @@ -132,7 +137,9 @@ class PayService extends GetxService { print('[IAP] 开始查询单个商品: id="$pid"'); final resp = await _inAppPurchase.queryProductDetails({pid}); if (resp.error != null) { - print('[IAP] 查询商品失败: ${resp.error}'); + final err = resp.error!; + print( + '[IAP] 查询商品失败: code=${err.code}, source=${err.source}, message=${err.message}, details=${err.details}'); } if (resp.productDetails.isEmpty) { print('[IAP] 查询结果为空。notFound=${resp.notFoundIDs}'); @@ -187,31 +194,43 @@ class PayService extends GetxService { if (isSubscription) { print('[IAP-android] 订阅商品(ENV),使用 buyNonConsumable'); final gpParam = GooglePlayPurchaseParam(productDetails: product); + print( + '[IAP-android] 调用 buyNonConsumable 参数: productId=${product.id}'); ok = await _inAppPurchase.buyNonConsumable(purchaseParam: gpParam); + print('[IAP-android] buyNonConsumable 返回: $ok'); } else { // 普通一次性/消耗型商品,使用 buyConsumable final purchaseParam = PurchaseParam(productDetails: product); + print( + '[IAP-android] 调用 buyConsumable 参数: productId=${product.id} autoConsume=true'); ok = await _inAppPurchase.buyConsumable( purchaseParam: purchaseParam, autoConsume: true, ); + print('[IAP-android] buyConsumable 返回: $ok'); } } else { // iOS 或非订阅商品,按消耗型处理(如需支持 iOS 订阅,可通过 ENV 切换调用 buyNonConsumable) final purchaseParam = PurchaseParam(productDetails: product); + print( + '[IAP-ios] 调用 buyConsumable 参数: productId=${product.id} autoConsume=true'); ok = await _inAppPurchase.buyConsumable( purchaseParam: purchaseParam, autoConsume: true, ); + print('[IAP-ios] buyConsumable 返回: $ok'); } if (!ok) { onResult?.call(false, '无法发起内购'); + print('[IAP] 发起内购失败:平台=${_platformString()} productId=${product.id}'); } else { onResult?.call(true, '已发起内购,请完成支付'); + print('[IAP] 已发起内购:等待购买流回调(可能受旧交易阻塞或商店限制)'); } return ok; } catch (e) { onResult?.call(false, '发起内购失败: $e'); + print('[IAP] 发起内购异常: $e'); return false; } } @@ -232,41 +251,59 @@ class PayService extends GetxService { _iapOnResult?.call(false, details.error?.message ?? '支付错误'); break; case PurchaseStatus.purchased: + final txId = details.purchaseID ?? ''; + final ok = await _verifyIapWithServer(details); + if (!ok) { + print( + '[IAP] 验证失败 purchased txId=${details.purchaseID} product=${details.productID}'); + _iapOnResult?.call(false, details.error?.message ?? '支付错误'); + } + if (ok) { + try { + await _inAppPurchase.completePurchase(details); + print('[IAP] 完成交易 purchased txId=${details.purchaseID}'); + _iapOnResult?.call(true, details.error?.message ?? '支付成功'); + } catch (e, st) { + print('[IAP] 完成交易异常 purchased txId=${details.purchaseID} err=$e'); + print('[IAP] 完成交易异常堆栈 purchased $st'); + } + } + + break; case PurchaseStatus.restored: - // 完成购买并进行服务端收据验证 - try { - await _verifyIapWithServer(details); - } catch (e) { - _iapOnResult?.call(false, '收据验证失败: $e'); + final txId = details.purchaseID ?? ''; + final ok = await _verifyIapWithServer(details); + if (!ok) { + print( + '[IAP] 验证失败 restored(silent) txId=${details.purchaseID} product=${details.productID}'); + _iapOnResult?.call(false, details.error?.message ?? '支付错误'); + } + if (ok) { + try { + await _inAppPurchase.completePurchase(details); + _iapOnResult?.call(true, details.error?.message ?? '支付成功'); + print('[IAP] 完成交易 restored(silent) txId=${details.purchaseID}'); + } catch (e, st) { + print( + '[IAP] 完成交易异常 restored(silent) txId=${details.purchaseID} err=$e'); + print('[IAP] 完成交易异常堆栈 restored(silent) $st'); + } } break; case PurchaseStatus.canceled: _iapOnResult?.call(false, '已取消支付'); + print('[IAP] 用户取消支付 product=${details.productID}'); break; } - if (details.pendingCompletePurchase) { - try { - await _inAppPurchase.completePurchase(details); - } catch (_) {} - } } } - Future _verifyIapWithServer(PurchaseDetails details) async { - final platform = _platformString(); - final verificationData = - details.verificationData.serverVerificationData ?? ''; - final transactionId = details.purchaseID ?? ''; - final params = { - 'platform': platform, - 'product_id': details.productID, - 'transaction_id': transactionId, - 'server_verification_data': verificationData, - }; + Future _verifyIapWithServer(PurchaseDetails details) async { try { - final resp = await Api.payiapverify(params); - // 兼容多种返回结构,优先拿到用户信息 + final params = await buildIapAskParams(); + final resp = await Api.payverifyorder(params); Map? user; + Map? order; if (resp is Map) { if (resp['user'] is Map) { user = resp['user'] as Map; @@ -274,15 +311,32 @@ class PayService extends GetxService { (resp['data']['user'] is Map)) { user = resp['data']['user'] as Map; } + if (resp['order'] is Map) { + order = resp['order'] as Map; + } else if (resp['data'] is Map && + (resp['data']['order'] is Map)) { + order = resp['data']['order'] as Map; + } } - if (user != null) { + final int? status = order != null + ? (order['status'] is int + ? order['status'] as int + : int.tryParse('${order['status']}')) + : null; + final bool ok = status == 1 || user != null; + if (ok && user != null) { User.instance.updateUserInfo(user); - _iapOnResult?.call(true, '支付成功'); - } else { - _iapOnResult?.call(true, '支付成功,额度将稍后刷新'); } + if (!ok) { + final code = (resp is Map) ? resp['code'] : null; + final msg = (resp is Map) ? (resp['message'] ?? resp['msg']) : null; + print( + '[IAP] 验证失败详情 status=$status code=$code msg=$msg order_id=${params['order_id']}'); + } + return ok; } catch (e) { - _iapOnResult?.call(false, '服务器验证异常: $e'); + print('[IAP] 服务器验证异常: $e'); + return false; } } @@ -360,6 +414,41 @@ class PayService extends GetxService { } } + /// 解析 Apple 的真实商品ID(支持环境前缀/后缀或显式映射) + /// 优先级:显式映射(APP_IOS_IAP_ID_MAP JSON) > 前缀(APP_IOS_IAP_PREFIX) > 后缀(APP_IOS_IAP_SUFFIX) > 原始ID + /// 示例: + /// - APP_IOS_IAP_PREFIX=com.voitrans. + /// - APP_IOS_IAP_ID_MAP={"ai_001":"com.voitrans.ai001","ai_002":"com.voitrans.ai002"} + String resolveAppleProductId(String backendId) { + final raw = backendId.trim(); + Map? mapped; + try { + final jsonStr = dotenv.env['APP_IOS_IAP_ID_MAP']; + if (jsonStr != null && jsonStr.isNotEmpty) { + mapped = json.decode(jsonStr) as Map; + } + } catch (e) { + print('[IAP-ios] 解析 APP_IOS_IAP_ID_MAP 失败: $e'); + } + if (mapped != null) { + final m = mapped[raw]; + if (m is String && m.trim().isNotEmpty) { + final resolved = m.trim(); + print('[IAP-ios] 使用映射ID: $raw -> $resolved'); + return resolved; + } + } + final prefix = dotenv.env['APP_IOS_IAP_PREFIX'] ?? ''; + final suffix = dotenv.env['APP_IOS_IAP_SUFFIX'] ?? ''; + final resolved = '${prefix}${raw}${suffix}'; + if (resolved != raw) { + print('[IAP-ios] 使用前后缀ID: $raw -> $resolved'); + } else { + print('[IAP-ios] 未配置映射/前缀,使用原始ID: $raw'); + } + return resolved; + } + /// 发起 Apple 内购 Future processApplePayment({ required String productId, @@ -369,9 +458,17 @@ class PayService extends GetxService { onResult?.call(false, '当前平台不支持 Apple 内购'); return false; } - // 重新初始化内购,避免早期可用性判断为 false - await _initIAP(); - return _processIapPayment(productId: productId, onResult: onResult); + if (!iapAvailable.value) { + await _initIAP(); + if (!iapAvailable.value) { + onResult?.call(false, '内购不可用'); + return false; + } + } + // 解析为 App Store 的真实商品ID + final iosId = resolveAppleProductId(productId); + print('[IAP-ios] 准备使用商品ID购买: backend="$productId" -> store="$iosId"'); + return _processIapPayment(productId: iosId, onResult: onResult); } /// 发起 Google Play 内购 @@ -383,8 +480,13 @@ class PayService extends GetxService { onResult?.call(false, '当前平台不支持 Google 内购'); return false; } - // 重新初始化内购,避免早期可用性判断为 false - await _initIAP(); + if (!iapAvailable.value) { + await _initIAP(); + if (!iapAvailable.value) { + onResult?.call(false, '内购不可用'); + return false; + } + } return _processIapPayment(productId: productId, onResult: onResult); } diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index b7484a4bc..22662ad94 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -276,8 +276,8 @@ class _AgentViewState extends State with WidgetsBindingObserver { params, false, title: controller.newAIReplyCompleted.value - ? '小言已经完成了回答!' - : '小言正在思考中~', + ? 'aiReplyCompleted'.tr + : 'aiThinking'.tr, onNext: controller.newAIReplyCompleted.value ? () {} : null, ), ); @@ -326,15 +326,18 @@ class _AgentViewState extends State with WidgetsBindingObserver { getOverlayPosition: IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { - return IntroOverlayBuilder.aiBuilder( - params, - controller.noviceGuideService.aiStepsList[ - controller.noviceGuideService - .aiStep]['end'], - onFinish: () async { - if (controller - .noviceGuideService.aiStep < - 5) { + return IntroOverlayBuilder.aiBuilder( + params, + controller + .noviceGuideService + .aiStepsList[controller + .noviceGuideService.aiStep] + ['endKey'] + .tr, + onFinish: () async { + if (controller + .noviceGuideService.aiStep < + 5) { await Future.delayed(const Duration( milliseconds: 300)); controller @@ -622,23 +625,29 @@ class _AgentViewState extends State with WidgetsBindingObserver { return IntroOverlayBuilder.aiBuilder( params, controller - .noviceGuideService.aiStepsList[ - controller.noviceGuideService - .aiStep]['start'], - buttonText: '确定输入', + .noviceGuideService + .aiStepsList[controller + .noviceGuideService.aiStep] + ['startKey'] + .tr, + buttonText: 'confirmInput'.tr, onNext: () { controller.textController.text = - controller.noviceGuideService - .aiStepsList[ - controller.noviceGuideService - .aiStep]['input']; + controller + .noviceGuideService + .aiStepsList[controller + .noviceGuideService + .aiStep]['inputKey'] + .tr; }, onTap: () { controller.textController.text = - controller.noviceGuideService - .aiStepsList[ - controller.noviceGuideService - .aiStep]['input']; + controller + .noviceGuideService + .aiStepsList[controller + .noviceGuideService + .aiStep]['inputKey'] + .tr; params.onNext!(); }, ); @@ -862,13 +871,13 @@ class _AgentViewState extends State with WidgetsBindingObserver { overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, - '点击发送,${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['send']}', + '${'guideClickSendPrefix'.tr}${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['sendKey'].tr}', alignment: false, onTap: () async { await controller .noviceGuideService.aiStepsList[ controller.noviceGuideService - .aiStep]['method'](); + .aiStep]['method'](); params.onNext!(); controller.sendMessage(); }, diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 846b35dc6..74d9aeb30 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:voitrans/data/models/user_Info.dart'; -import '../../../routes/app_routes.dart'; import '../../../data/services/pay_service.dart'; import '../../../data/services/version_update_service.dart'; import '../../../data/models/goods.dart'; @@ -17,6 +16,8 @@ abstract class GoodsBaseController extends GetxController { final RxList items = [].obs; final RxBool loading = false.obs; final RxString error = ''.obs; + final RxBool isPaying = false.obs; + Timer? _payingTimeoutTimer; late final PayService _payService = Get.find(); StreamSubscription? _deeplinkSub; @@ -34,6 +35,8 @@ abstract class GoodsBaseController extends GetxController { void onClose() { _deeplinkSub?.cancel(); _deeplinkSub = null; + _payingTimeoutTimer?.cancel(); + _payingTimeoutTimer = null; super.onClose(); } @@ -43,6 +46,8 @@ abstract class GoodsBaseController extends GetxController { try { final list = await fetchProducts(); items.assignAll(list); + // iOS 环境下,在页面加载后批量查询当前商品的 IAP 详情,便于排查 StoreKit 可用商品 + await _debugQueryIapProductsIfIos(); } catch (e) { error.value = e.toString(); } finally { @@ -53,6 +58,30 @@ abstract class GoodsBaseController extends GetxController { /// 子类实现:返回商品列表(统一使用 DBGoods) Future> fetchProducts(); + /// iOS 批量查询当前页面商品的 IAP 详情(仅真机 iOS 生效,Web/Android 跳过) + Future _debugQueryIapProductsIfIos() async { + try { + final isIOS = GetPlatform.isIOS && !kIsWeb; + if (!isIOS) return; + + // 收集页面商品ID;若为空,使用预设的基础套餐ID进行测试 + final ids = items + .map((e) => (e.id ?? '').trim()) + .where((id) => id.isNotEmpty) + .toSet(); + if (ids.isEmpty) { + ids.addAll({ + 'ai_001', + }); + } + + print('[IAP-ios] 批量查询页面商品IDs: ${ids.join(', ')}'); + await _payService.debugQueryProducts(ids); + } catch (e) { + print('[IAP-ios] 批量查询异常: $e'); + } + } + /// 统一入口:根据后端配置决定是否弹出支付方式选择面板 Future purchase(DBGoods item) async { // 读取渠道配置 @@ -480,9 +509,15 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(false, '创建 Apple 订单失败'); return false; } + isPaying.value = true; + _startPayingTimeout(); // 使用商品id作为内购的 productId(与后台保持一致) final productId = item.id; + // 解析为 App Store 的真实商品ID(支持前缀/映射) + final iosProductId = _payService.resolveAppleProductId(productId); + // 调试:在发起购买前先查询并打印该商品的内购详情/错误,便于定位问题 + await _payService.debugQueryProducts({iosProductId}); return _payService.processApplePayment( productId: productId, onResult: (success, msg) { @@ -490,6 +525,8 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(success, msg); if (!success) { _showPayResultDialog(false, msg); + isPaying.value = false; + _cancelPayingTimeout(); } else { // 支付成功或额度待刷新时弹窗,其余阶段用轻提示 final showDialog = msg.contains('支付成功'); @@ -497,6 +534,8 @@ abstract class GoodsBaseController extends GetxController { _showPayResultDialog(true, msg); // 仅在支付成功阶段,携带校验参数主动查询订单 _askOrderWithIapVerification(); + isPaying.value = false; + _cancelPayingTimeout(); } else { Get.snackbar('提示', msg, snackPosition: SnackPosition.BOTTOM, @@ -507,6 +546,8 @@ abstract class GoodsBaseController extends GetxController { ); } catch (e) { onResult?.call(false, 'Apple 内购异常: $e'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } } @@ -526,6 +567,8 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(false, '创建 Google 订单失败'); return false; } + isPaying.value = true; + _startPayingTimeout(); // 使用商品id作为内购的 productId(与后台保持一致) final productId = item.id; @@ -537,12 +580,16 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(success, msg); if (!success) { _showPayResultDialog(false, msg); + isPaying.value = false; + _cancelPayingTimeout(); } else { final showDialog = msg.contains('支付成功'); if (showDialog) { _showPayResultDialog(true, msg); // 仅在支付成功阶段,携带校验参数主动查询订单 _askOrderWithIapVerification(); + isPaying.value = false; + _cancelPayingTimeout(); } else { Get.snackbar('提示', msg, snackPosition: SnackPosition.BOTTOM, @@ -553,6 +600,8 @@ abstract class GoodsBaseController extends GetxController { ); } catch (e) { onResult?.call(false, 'Google 内购异常: $e'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } } @@ -590,7 +639,7 @@ abstract class GoodsBaseController extends GetxController { try { // 简单轮询回查,避免回调延迟 for (int i = 0; i < retries; i++) { - final resp = await Api.payaskorder({'order_id': orderId}); + final resp = await Api.payverifyorder({'order_id': orderId}); print("查询订单 resp: $resp"); final order = resp?['order'] as Map?; final user = resp?['user'] as Map?; @@ -625,7 +674,7 @@ abstract class GoodsBaseController extends GetxController { Future _askOrderWithIapVerification() async { try { final params = await _payService.buildIapAskParams(); - final resp = await Api.payaskorder(params); + final resp = await Api.payverifyorder(params); print('[IAP] 主动查询订单 resp: $resp'); final order = resp?['order'] as Map?; final user = resp?['user'] as Map?; @@ -731,6 +780,19 @@ abstract class GoodsBaseController extends GetxController { ); } + void _startPayingTimeout({int seconds = 30}) { + _payingTimeoutTimer?.cancel(); + _payingTimeoutTimer = Timer(Duration(seconds: seconds), () { + isPaying.value = false; + _payingTimeoutTimer = null; + }); + } + + void _cancelPayingTimeout() { + _payingTimeoutTimer?.cancel(); + _payingTimeoutTimer = null; + } + /// 指定 PayPal 支付(创建订单并打开授权链接) Future payPaypal(DBGoods item, {PaymentResultCallback? onResult}) async { diff --git a/lib/modules/goods/utils/goods_i18n.dart b/lib/modules/goods/utils/goods_i18n.dart new file mode 100644 index 000000000..796caa477 --- /dev/null +++ b/lib/modules/goods/utils/goods_i18n.dart @@ -0,0 +1,63 @@ +import 'package:get/get.dart'; +import 'package:voitrans/data/models/goods.dart'; + +/// 商品名称本地化 +/// 优先根据商品ID映射到本地化名称;若无映射,则回退到后端提供的名称 +String localizedGoodsName(DBGoods item) { + final id = (item.id ?? '').trim(); + + switch (id) { + case 'ai_001': + return 'ai_001_name'.tr; + case 'ai_002': + return 'ai_002_name'.tr; + case 'ai_003': + return 'ai_003_name'.tr; + case 'meet_001': + return 'meet_001_name'.tr; + case 'meet_002': + return 'meet_002_name'.tr; + case 'meet_003': + return 'meet_003_name'.tr; + case 'trade_001': + return 'trade_001_name'.tr; + case 'trade_002': + return 'trade_002_name'.tr; + case 'trade_003': + return 'trade_003_name'.tr; + // 可在此补充其他商品ID的映射,如:translate_001、meet_001 等 + default: + final name = (item.name ?? '').trim(); + return name.isNotEmpty ? name : 'unknown'.tr; + } +} + +/// 商品描述本地化 +/// 优先根据商品ID映射到本地化描述;若无映射,则回退到后端提供的描述 +String localizedGoodsDesc(DBGoods item) { + final id = (item.id ?? '').trim(); + + switch (id) { + case 'ai_001': + return 'ai_001_desc'.tr; + case 'ai_002': + return 'ai_002_desc'.tr; + case 'ai_003': + return 'ai_003_desc'.tr; + case 'meet_001': + return 'meet_001_desc'.tr; + case 'meet_002': + return 'meet_002_desc'.tr; + case 'meet_003': + return 'meet_003_desc'.tr; + case 'trade_001': + return 'trade_001_desc'.tr; + case 'trade_002': + return 'trade_002_desc'.tr; + case 'trade_003': + return 'trade_003_desc'.tr; + default: + final desc = (item.desc ?? '').trim(); + return desc.isNotEmpty ? desc : ''; + } +} diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index edc1cf688..f6a1cfd0f 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -5,6 +5,7 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsai_controller.dart'; +import '../utils/goods_i18n.dart'; class GoodsaiView extends GetView { const GoodsaiView({super.key}); @@ -31,37 +32,54 @@ class GoodsaiView extends GetView { body: Obx(() { // 访问刷新信号以建立依赖关系:用户信息变化时触发重建 final _ = User.refreshTick.value; + Widget content; if (controller.loading.value) { - return const Center(child: CircularProgressIndicator()); - } - if (controller.error.isNotEmpty) { - return Center(child: Text(controller.error.value)); + content = const Center(child: CircularProgressIndicator()); + } else if (controller.error.isNotEmpty) { + content = Center(child: Text(controller.error.value)); + } else { + content = ListView( + padding: EdgeInsets.all(16.w), + children: [ + _buildHeader(isDarkMode), + SizedBox(height: 12.h), + _buildUsageCard(isDarkMode), + SizedBox(height: 16.h), + Text( + 'availablePackages'.tr, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + SizedBox(height: 8.h), + ...controller.items.map((item) => Padding( + padding: EdgeInsets.only(bottom: 12.h), + child: _buildCard(item, isDarkMode), + )), + SizedBox(height: 16.h), + _buildFeaturesSection(isDarkMode), + SizedBox(height: 16.h), + _buildFooterSection(isDarkMode), + ], + ); } - - return ListView( - padding: EdgeInsets.all(16.w), + return Stack( children: [ - _buildHeader(isDarkMode), - SizedBox(height: 12.h), - _buildUsageCard(isDarkMode), - SizedBox(height: 16.h), - Text( - '可购买套餐', - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, + content, + if (controller.isPaying.value) + Positioned.fill( + child: AbsorbPointer( + absorbing: true, + child: Container( + color: Colors.black.withOpacity(0.35), + child: const Center( + child: CircularProgressIndicator(), + ), + ), + ), ), - ), - SizedBox(height: 8.h), - ...controller.items.map((item) => Padding( - padding: EdgeInsets.only(bottom: 12.h), - child: _buildCard(item, isDarkMode), - )), - SizedBox(height: 16.h), - _buildFeaturesSection(isDarkMode), - SizedBox(height: 16.h), - _buildFooterSection(isDarkMode), ], ); }), @@ -105,7 +123,7 @@ class GoodsaiView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'AI 功能', + 'aiFunction'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w700, @@ -114,7 +132,7 @@ class GoodsaiView extends GetView { ), SizedBox(height: 6.h), Text( - '更长对话额度、更多工具调用、更强上下文长度支持。', + 'aiHeaderDesc1'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -122,7 +140,7 @@ class GoodsaiView extends GetView { ), SizedBox(height: 4.h), Text( - '适用于智能体问答、总结分析、任务执行等场景。', + 'aiHeaderDesc2'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -172,7 +190,7 @@ class GoodsaiView extends GetView { color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), SizedBox(width: 8.w), Text( - '剩余额度', + 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -194,14 +212,14 @@ class GoodsaiView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '总次数:$totalAi', + '${'totalCount'.tr}:$totalAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], ), ), Text( - '剩余:$remainAi', + '${'remaining'.tr}:$remainAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -221,7 +239,7 @@ class GoodsaiView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '功能说明', + 'featureDescription'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -242,10 +260,10 @@ class GoodsaiView extends GetView { return _buildFeatureCard( isDarkMode, icon: Icons.music_note, - title: '听歌与推荐', + title: 'musicAndRecommendation'.tr, lines: [ - '检索曲库、播放控制', - '智能推荐歌单与相似歌曲', + 'musicSearchPlaybackControl'.tr, + 'smartPlaylistAndSimilarRecommendations'.tr, ], colorSeed: Colors.purple, ); @@ -253,10 +271,10 @@ class GoodsaiView extends GetView { return _buildFeatureCard( isDarkMode, icon: Icons.navigation, - title: '导航与路线', + title: 'navigationAndRoutes'.tr, lines: [ - '路线规划与拥堵规避', - '语音播报与途径点设置', + 'routePlanningAndCongestionAvoidance'.tr, + 'voiceBroadcastAndWaypoints'.tr, ], colorSeed: Colors.orange, ); @@ -264,10 +282,10 @@ class GoodsaiView extends GetView { return _buildFeatureCard( isDarkMode, icon: Icons.wb_sunny, - title: '天气查询', + title: 'weatherQuery'.tr, lines: [ - '实时天气与预报', - '穿衣建议与出行提醒', + 'realTimeWeatherForecast'.tr, + 'clothingAdviceAndTravelReminders'.tr, ], colorSeed: Colors.blue, ); @@ -275,10 +293,10 @@ class GoodsaiView extends GetView { return _buildFeatureCard( isDarkMode, icon: Icons.place, - title: '附近搜索', + title: 'nearbySearch'.tr, lines: [ - '餐饮/加油/停车等地点检索', - '评分、营业时间与路线直达', + 'poiSearchFoodGasParking'.tr, + 'ratingsHoursAndDirectRoutes'.tr, ], colorSeed: Colors.green, ); @@ -286,10 +304,10 @@ class GoodsaiView extends GetView { return _buildFeatureCard( isDarkMode, icon: Icons.newspaper, - title: '新闻资讯', + title: 'newsInformation'.tr, lines: [ - '热点快讯与专题速览', - '长文总结与要点提炼', + 'hotNewsAndTopicOverview'.tr, + 'longArticleSummariesAndKeyPoints'.tr, ], colorSeed: Colors.indigo, ); @@ -297,10 +315,10 @@ class GoodsaiView extends GetView { return _buildFeatureCard( isDarkMode, icon: Icons.call, - title: '通讯助手', + title: 'communicationAssistant'.tr, lines: [ - '帮忙拨打电话与发短信', - '模板消息与日程提醒', + 'helpCallAndSMS'.tr, + 'templatedMessagesAndScheduleReminders'.tr, ], colorSeed: Colors.teal, ); @@ -309,7 +327,7 @@ class GoodsaiView extends GetView { ), SizedBox(height: 12.h), Text( - '以上功能受设备权限、服务可用性与网络状况影响,具体以实际表现为准。', + 'aiDisclaimer'.tr, style: TextStyle(fontSize: 12.sp, color: subColor), ), ], @@ -329,19 +347,19 @@ class GoodsaiView extends GetView { ), SizedBox(height: 8.h), Text( - '应用名称:VoiTrans · 服务提供:VoiTrans', + 'appNameProvider'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '更多信息请前往 设置 > 关于 查看', + 'moreInfoViewInSettingsAbout'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '© 2025 VoiTrans', + 'copyrightVoiTrans'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), @@ -460,14 +478,14 @@ class GoodsaiView extends GetView { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.name, + Text(localizedGoodsName(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.desc, + Text(localizedGoodsDesc(item), style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[600], @@ -495,7 +513,7 @@ class GoodsaiView extends GetView { borderRadius: BorderRadius.circular(20.r), ), child: Text( - '购买', + 'purchase'.tr, style: TextStyle(fontSize: 12.sp, color: Colors.white), ), ), diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index 2bedfd040..e32c2dfb4 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:voitrans/data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsmeet_controller.dart'; +import '../utils/goods_i18n.dart'; class GoodsmeetView extends GetView { const GoodsmeetView({super.key}); @@ -99,7 +100,7 @@ class GoodsmeetView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '会议助手', + 'conferenceAssistant'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w700, @@ -108,7 +109,7 @@ class GoodsmeetView extends GetView { ), SizedBox(height: 6.h), Text( - '录音转写、关键词检索与自动总结,提升会议效率。', + 'meetingHeaderDesc1'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -116,7 +117,7 @@ class GoodsmeetView extends GetView { ), SizedBox(height: 4.h), Text( - '适用于商务会议、课堂笔记、访谈纪要等场景。', + 'meetingHeaderDesc2'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -164,7 +165,7 @@ class GoodsmeetView extends GetView { color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), SizedBox(width: 8.w), Text( - '剩余额度', + 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -186,14 +187,14 @@ class GoodsmeetView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '总次数:$totalAi', + '${'totalCount'.tr}:$totalAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], ), ), Text( - '剩余:$remainAi', + '${'remaining'.tr}:$remainAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -241,14 +242,14 @@ class GoodsmeetView extends GetView { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.name, + Text(localizedGoodsName(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.desc, + Text(localizedGoodsDesc(item), style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[600], @@ -276,7 +277,7 @@ class GoodsmeetView extends GetView { borderRadius: BorderRadius.circular(20.r), ), child: Text( - '购买', + 'purchase'.tr, style: TextStyle(fontSize: 12.sp, color: Colors.white), ), ), @@ -295,7 +296,7 @@ class GoodsmeetView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '功能说明', + 'featureDescription'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -312,36 +313,42 @@ class GoodsmeetView extends GetView { _buildFeatureCard( isDarkMode, icon: Icons.mic, - title: '会议记录', - lines: ['自动录音与分段', '讲话人标注'], + title: 'meetingRecording'.tr, + lines: ['meetingAutoRecording'.tr, 'meetingSpeakerTagging'.tr], colorSeed: Colors.pink, ), _buildFeatureCard( isDarkMode, icon: Icons.summarize, - title: '转写与总结', - lines: ['长音频转写', '关键要点提炼'], + title: 'transcriptionAndSummary'.tr, + lines: [ + 'meetingLongAudioTranscription'.tr, + 'meetingKeyPointSummary'.tr + ], colorSeed: Colors.blue, ), _buildFeatureCard( isDarkMode, icon: Icons.search, - title: '关键词检索', - lines: ['按主题/人名检索', '时间线跳转'], + title: 'keywordSearch'.tr, + lines: ['meetingTopicNameSearch'.tr, 'meetingTimelineJump'.tr], colorSeed: Colors.indigo, ), _buildFeatureCard( isDarkMode, icon: Icons.share, - title: '协同分享', - lines: ['导出纪要', '多平台分享'], + title: 'collaborationSharing'.tr, + lines: [ + 'meetingExportSummary'.tr, + 'meetingMultiPlatformShare'.tr + ], colorSeed: Colors.teal, ), ], ), SizedBox(height: 12.h), Text( - '建议在安静环境使用,效果受麦克风与网络影响,具体以实际表现为准。', + 'meetingDisclaimer'.tr, style: TextStyle(fontSize: 12.sp, color: subColor), ), ], @@ -428,19 +435,19 @@ class GoodsmeetView extends GetView { ), SizedBox(height: 8.h), Text( - '应用名称:VoiTrans · 服务提供:VoiTrans', + 'appNameProvider'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '更多信息请前往 设置 > 关于 查看', + 'moreInfoViewInSettingsAbout'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '© 2025 VoiTrans', + 'copyrightVoiTrans'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart index e501aecaa..e454f8e63 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:voitrans/data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodstrade_controller.dart'; +import '../utils/goods_i18n.dart'; class GoodstradeView extends GetView { const GoodstradeView({super.key}); @@ -99,7 +100,7 @@ class GoodstradeView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '翻译功能', + 'simultaneousTranslation'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w700, @@ -108,7 +109,7 @@ class GoodstradeView extends GetView { ), SizedBox(height: 6.h), Text( - '多语种实时同传与文本翻译,低延时语音播报。', + 'tradeHeaderDesc1'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -116,7 +117,7 @@ class GoodstradeView extends GetView { ), SizedBox(height: 4.h), Text( - '适用于出行、商务、演讲与教学等场景。', + 'tradeHeaderDesc2'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -164,7 +165,7 @@ class GoodstradeView extends GetView { color: isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), SizedBox(width: 8.w), Text( - '剩余额度', + 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -186,14 +187,14 @@ class GoodstradeView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '总次数:$totalAi', + '${'totalCount'.tr}:$totalAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], ), ), Text( - '剩余:$remainAi', + '${'remaining'.tr}:$remainAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -241,14 +242,14 @@ class GoodstradeView extends GetView { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.name, + Text(localizedGoodsName(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.desc, + Text(localizedGoodsDesc(item), style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[600], @@ -276,7 +277,7 @@ class GoodstradeView extends GetView { borderRadius: BorderRadius.circular(20.r), ), child: Text( - '购买', + 'purchase'.tr, style: TextStyle(fontSize: 12.sp, color: Colors.white), ), ), @@ -295,7 +296,7 @@ class GoodstradeView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '功能说明', + 'featureDescription'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -312,36 +313,45 @@ class GoodstradeView extends GetView { _buildFeatureCard( isDarkMode, icon: Icons.translate, - title: '实时同传', - lines: ['中英互译', '低延时语音播报'], + title: 'realtimeTranscription'.tr, + lines: ['translateZhEn'.tr, 'lowLatencyVoiceBroadcast'.tr], colorSeed: Colors.indigo, ), _buildFeatureCard( isDarkMode, icon: Icons.text_snippet, - title: '文本翻译', - lines: ['多语种文本翻译', '术语优化与语境保持'], + title: 'textTranslation'.tr, + lines: [ + 'multiLangTextTranslation'.tr, + 'termOptimizationContextPreserve'.tr + ], colorSeed: Colors.blue, ), _buildFeatureCard( isDarkMode, icon: Icons.library_books, - title: '场景词库', - lines: ['旅游/商务/生活词库', '专属词汇记忆'], + title: 'sceneLexicon'.tr, + lines: [ + 'lexiconTourBusinessLife'.tr, + 'personalVocabularyMemory'.tr + ], colorSeed: Colors.teal, ), _buildFeatureCard( isDarkMode, icon: Icons.subtitles, - title: '字幕显示', - lines: ['对话字幕/大字模式', '颜色高对比度'], + title: 'subtitleDisplay'.tr, + lines: [ + 'conversationSubtitleLargeText'.tr, + 'colorHighContrast'.tr + ], colorSeed: Colors.purple, ), ], ), SizedBox(height: 12.h), Text( - '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', + 'tradeDisclaimer'.tr, style: TextStyle(fontSize: 12.sp, color: subColor), ), ], @@ -428,19 +438,19 @@ class GoodstradeView extends GetView { ), SizedBox(height: 8.h), Text( - '应用名称:VoiTrans · 服务提供:VoiTrans', + 'appNameProvider'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '更多信息请前往 设置 > 关于 查看', + 'moreInfoViewInSettingsAbout'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '© 2025 VoiTrans', + 'copyrightVoiTrans'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index 5a5f55896..e4fbff0dd 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:voitrans/data/models/goods.dart'; import '../controllers/goodsvip_controller.dart'; +import '../utils/goods_i18n.dart'; class GoodsvipView extends GetView { const GoodsvipView({super.key}); @@ -27,26 +28,44 @@ class GoodsvipView extends GetView { centerTitle: true, ), body: Obx(() { + Widget content; if (controller.loading.value) { - return const Center(child: CircularProgressIndicator()); + content = const Center(child: CircularProgressIndicator()); + } else if (controller.error.isNotEmpty) { + content = Center(child: Text(controller.error.value)); + } else { + content = ListView.separated( + padding: EdgeInsets.all(16.w), + itemCount: controller.items.length + 2, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (_, index) { + if (index < controller.items.length) { + final item = controller.items[index]; + return _buildGoodsCard(item, isDarkMode); + } + if (index == controller.items.length) { + return _buildFeaturesSection(isDarkMode); + } + return _buildFooterSection(isDarkMode); + }, + ); } - if (controller.error.isNotEmpty) { - return Center(child: Text(controller.error.value)); - } - return ListView.separated( - padding: EdgeInsets.all(16.w), - itemCount: controller.items.length + 2, - separatorBuilder: (_, __) => SizedBox(height: 12.h), - itemBuilder: (_, index) { - if (index < controller.items.length) { - final item = controller.items[index]; - return _buildGoodsCard(item, isDarkMode); - } - if (index == controller.items.length) { - return _buildFeaturesSection(isDarkMode); - } - return _buildFooterSection(isDarkMode); - }, + return Stack( + children: [ + content, + if (controller.isPaying.value) + Positioned.fill( + child: AbsorbPointer( + absorbing: true, + child: Container( + color: Colors.black.withOpacity(0.35), + child: const Center( + child: CircularProgressIndicator(), + ), + ), + ), + ), + ], ); }), ); @@ -94,7 +113,7 @@ class GoodsvipView extends GetView { color: isDarkMode ? Colors.white : Colors.black, )), SizedBox(height: 4.h), - Text(item.desc, + Text(localizedGoodsDesc(item), style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[600], @@ -123,7 +142,7 @@ class GoodsvipView extends GetView { borderRadius: BorderRadius.circular(20.r), ), child: Text( - '购买', + 'purchase'.tr, style: TextStyle( fontSize: 12.sp, color: Colors.white, @@ -145,7 +164,7 @@ class GoodsvipView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '功能说明', + 'featureDescription'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -162,36 +181,36 @@ class GoodsvipView extends GetView { _buildFeatureCard( isDarkMode, icon: Icons.workspace_premium, - title: '权益总览', - lines: ['更高使用额度', '更低单价'], + title: 'benefitsOverview'.tr, + lines: ['higherQuota'.tr, 'lowerUnitPrice'.tr], colorSeed: Colors.amber, ), _buildFeatureCard( isDarkMode, icon: Icons.support_agent, - title: '优先服务', - lines: ['专属客服通道', '问题快速响应'], + title: 'priorityService'.tr, + lines: ['exclusiveSupportChannel'.tr, 'fastResponse'.tr], colorSeed: Colors.purple, ), _buildFeatureCard( isDarkMode, icon: Icons.local_offer, - title: '活动与折扣', - lines: ['会员专属活动', '长期优惠计划'], + title: 'eventsAndDiscounts'.tr, + lines: ['memberExclusiveEvents'.tr, 'longTermDiscountPlan'.tr], colorSeed: Colors.indigo, ), _buildFeatureCard( isDarkMode, icon: Icons.auto_awesome, - title: '通用特权', - lines: ['新功能优先体验', '跨设备同步'], + title: 'generalPrivileges'.tr, + lines: ['earlyAccessNewFeatures'.tr, 'crossDeviceSync'.tr], colorSeed: Colors.teal, ), ], ), SizedBox(height: 12.h), Text( - '具体权益以实际套餐说明为准,可能随版本迭代调整。', + 'vipDisclaimer'.tr, style: TextStyle(fontSize: 12.sp, color: subColor), ), ], @@ -257,7 +276,8 @@ class GoodsvipView extends GetView { SizedBox(height: 8.h), ...lines.map((l) => Padding( padding: EdgeInsets.only(bottom: 4.h), - child: Text(l, style: TextStyle(fontSize: 12.sp, color: subColor)), + child: + Text(l, style: TextStyle(fontSize: 12.sp, color: subColor)), )), ], ), @@ -273,24 +293,23 @@ class GoodsvipView extends GetView { children: [ SizedBox( width: double.infinity, - child: - Divider(color: isDarkMode ? Colors.white24 : Colors.black12), + child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), ), SizedBox(height: 8.h), Text( - '应用名称:VoiTrans · 服务提供:VoiTrans', + 'appNameProvider'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '更多信息请前往 设置 > 关于 查看', + 'moreInfoViewInSettingsAbout'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), SizedBox(height: 4.h), Text( - '© 2025 VoiTrans', + 'copyrightVoiTrans'.tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 11.sp, color: subColor), ), diff --git a/lib/modules/home/views/home_view.dart b/lib/modules/home/views/home_view.dart index 6be0315bd..9e7ca2838 100644 --- a/lib/modules/home/views/home_view.dart +++ b/lib/modules/home/views/home_view.dart @@ -101,7 +101,7 @@ class HomeView extends GetView { overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, - '欢迎使用Voitrans!首先,让我们唤醒你的专属 AI—— 小言', + 'guideWelcomeWakeAI'.tr, onNext: () { controller.noviceGuideService.startWakeupListen(); }, @@ -812,7 +812,7 @@ class HomeView extends GetView { overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, - '太棒了!你已成功唤醒小言,接下来试试让它帮你做件事吧', + 'guideAwakenSuccess'.tr, onTap: () { params.onFinish(); controller.exploreAIFeatures(); diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index febe0493c..c814ac4de 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -248,7 +248,7 @@ class SettingsView extends GetView { children: [ _buildCategoryItem( icon: Icons.workspace_premium, - label: 'Vip', + label: 'premiumMember'.tr, iconBg: isDarkMode ? Colors.amber[900]!.withOpacity(0.3) : Colors.amber[100]!, @@ -257,7 +257,7 @@ class SettingsView extends GetView { ), _buildCategoryItem( icon: Icons.translate, - label: 'Translation', + label: 'interpretation'.tr, iconBg: isDarkMode ? Colors.indigo[900]!.withOpacity(0.3) : Colors.indigo[100]!, @@ -266,7 +266,7 @@ class SettingsView extends GetView { ), _buildCategoryItem( icon: Icons.file_open, - label: "Meet", + label: 'conferenceAssistant'.tr, iconBg: isDarkMode ? Colors.pink[900]!.withOpacity(0.3) : Colors.pink[100]!, @@ -275,7 +275,7 @@ class SettingsView extends GetView { ), _buildCategoryItem( icon: Icons.smart_toy, - label: "AI", + label: 'aiFunction'.tr, iconBg: isDarkMode ? Colors.teal[900]!.withOpacity(0.3) : Colors.teal[100]!, diff --git a/pubspec.yaml b/pubspec.yaml index 26889ffc7..670d31152 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.18+57 +version: 1.0.20+62 environment: sdk: ">=3.3.0 <4.0.0" From 26c55934d7c696173db5f8e2546a544269c08c29 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Nov 2025 20:43:24 +0800 Subject: [PATCH 068/177] =?UTF-8?q?feat(usage):=20=E6=B7=BB=E5=8A=A0AI?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E7=A7=AF=E5=88=86=E7=BB=9F=E8=AE=A1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增AI聊天积分统计视图、控制器及相关绑定配置 在底部导航栏添加AI聊天入口 实现积分数据显示及刷新功能 --- lib/modules/usage/bindings/usage_binding.dart | 13 ++-- .../controllers/aichat_stats_controller.dart | 10 +++ .../usage/controllers/usage_controller.dart | 2 + .../usage/views/aichat_stats_view.dart | 74 +++++++++++++++++++ lib/modules/usage/views/usage_view.dart | 8 +- 5 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 lib/modules/usage/controllers/aichat_stats_controller.dart create mode 100644 lib/modules/usage/views/aichat_stats_view.dart diff --git a/lib/modules/usage/bindings/usage_binding.dart b/lib/modules/usage/bindings/usage_binding.dart index 1d3145df9..e03af7554 100644 --- a/lib/modules/usage/bindings/usage_binding.dart +++ b/lib/modules/usage/bindings/usage_binding.dart @@ -2,6 +2,7 @@ import 'package:get/get.dart'; import '../controllers/usage_controller.dart'; import '../controllers/meeting_stats_controller.dart'; import '../controllers/translation_stats_controller.dart'; +import '../controllers/aichat_stats_controller.dart'; import '../../../data/services/usage_stats_service.dart'; class UsageBinding implements Bindings { @@ -10,11 +11,13 @@ class UsageBinding implements Bindings { if (!Get.isRegistered()) { Get.put(UsageStatsService(), permanent: true); } - if (!Get.isRegistered()) { - Get.lazyPut(() => TranslationStatsController()); - } - Get.lazyPut(() => MeetingStatsController()); + Get.lazyPut(() => UsageController()); + + Get.lazyPut(() => AiChatStatsController()); + + Get.lazyPut(() => TranslationStatsController()); + + Get.lazyPut(() => MeetingStatsController()); } } - diff --git a/lib/modules/usage/controllers/aichat_stats_controller.dart b/lib/modules/usage/controllers/aichat_stats_controller.dart new file mode 100644 index 000000000..efc285a6c --- /dev/null +++ b/lib/modules/usage/controllers/aichat_stats_controller.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; +import '../../../data/models/user_Info.dart'; + +class AiChatStatsController extends GetxController { + final isLoading = false.obs; + + int get currentIntegral => User.instance.aichatintegral; + int get totalIntegral => User.instance.aichattotalintegral; +} + diff --git a/lib/modules/usage/controllers/usage_controller.dart b/lib/modules/usage/controllers/usage_controller.dart index bf2c5a4be..d8ecbbecd 100644 --- a/lib/modules/usage/controllers/usage_controller.dart +++ b/lib/modules/usage/controllers/usage_controller.dart @@ -2,12 +2,14 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../views/translation_stats_view.dart'; import '../views/meeting_stats_view.dart'; +import '../views/aichat_stats_view.dart'; class UsageController extends GetxController { late PageController pageController; final RxInt pageIndex = 0.obs; final List pageList = const [ + AiChatStatsView(), TranslationStatsView(), MeetingStatsView(), ]; diff --git a/lib/modules/usage/views/aichat_stats_view.dart b/lib/modules/usage/views/aichat_stats_view.dart new file mode 100644 index 000000000..584ce5ee1 --- /dev/null +++ b/lib/modules/usage/views/aichat_stats_view.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import '../../../core/theme/app_colors.dart'; +import '../controllers/aichat_stats_controller.dart'; +import '../../../data/models/user_Info.dart'; + +class AiChatStatsView extends GetView { + const AiChatStatsView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), + onPressed: () => Get.back(), + ), + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, + elevation: 0.5, + title: Text( + 'AI聊天', + style: TextStyle(fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + centerTitle: true, + ); + } + + Widget _buildBody(bool isDarkMode) { + return Obx(() { + final _ = User.refreshTick.value; + final u = User.instance; + return Padding( + padding: EdgeInsets.all(16.w), + child: Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + ], + ), + child: Row( + children: [ + Icon(Icons.chat_bubble_outline, color: AppColors.primary, size: 20.sp), + SizedBox(width: 8.w), + Expanded( + child: Text( + 'AI聊天积分', + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + ), + Text( + '${u.aichatintegral}/${u.aichattotalintegral}', + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + ], + ), + ), + ); + }); + } +} + diff --git a/lib/modules/usage/views/usage_view.dart b/lib/modules/usage/views/usage_view.dart index efa1b02e8..393884869 100644 --- a/lib/modules/usage/views/usage_view.dart +++ b/lib/modules/usage/views/usage_view.dart @@ -21,6 +21,10 @@ class UsageView extends GetView { bottomNavigationBar: Obx( () => BottomNavigationBar( items: [ + BottomNavigationBarItem( + icon: const Icon(Icons.chat_bubble_outline), + label: 'AI聊天', + ), BottomNavigationBarItem( icon: const Icon(Icons.translate), label: 'interpretation'.tr, @@ -32,7 +36,8 @@ class UsageView extends GetView { ], backgroundColor: isDarkMode ? Colors.black : const Color(0xFFF9FAFB), currentIndex: controller.pageIndex.value, - unselectedItemColor: isDarkMode ? Colors.grey[500] : const Color(0xFF6B7280), + unselectedItemColor: + isDarkMode ? Colors.grey[500] : const Color(0xFF6B7280), selectedItemColor: const Color(0xFF3B82F6), unselectedFontSize: 10.sp, selectedFontSize: 10.sp, @@ -47,4 +52,3 @@ class UsageView extends GetView { ); } } - From d1b6c6de8bd0e04d535e5ffce225d037322eb0ee Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 25 Nov 2025 15:29:48 +0800 Subject: [PATCH 069/177] =?UTF-8?q?refactor(usage):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BB=9F=E8=AE=A1=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=A7=86=E5=9B=BE=E5=92=8C=E5=AF=BC=E8=88=AA=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将导航栏配置提取为常量并集中管理颜色配置 - 优化底部导航栏的响应式设计和动画效果 - 统一各统计页面的积分卡片显示位置和样式 - 移除翻译统计页中多余的积分行 - 将AI聊天页面标题改为英文 --- .../usage/views/aichat_stats_view.dart | 29 +++- .../usage/views/meeting_stats_view.dart | 147 ++++++++++++++++-- .../usage/views/translation_stats_view.dart | 18 +-- lib/modules/usage/views/usage_view.dart | 102 ++++++++---- 4 files changed, 230 insertions(+), 66 deletions(-) diff --git a/lib/modules/usage/views/aichat_stats_view.dart b/lib/modules/usage/views/aichat_stats_view.dart index 584ce5ee1..7ac2d806b 100644 --- a/lib/modules/usage/views/aichat_stats_view.dart +++ b/lib/modules/usage/views/aichat_stats_view.dart @@ -22,14 +22,18 @@ class AiChatStatsView extends GetView { PreferredSizeWidget _buildAppBar(bool isDarkMode) { return AppBar( leading: IconButton( - icon: Icon(Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), + icon: Icon(Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), onPressed: () => Get.back(), ), backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, title: Text( - 'AI聊天', - style: TextStyle(fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + 'AI chat', + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), ), centerTitle: true, ); @@ -47,22 +51,32 @@ class AiChatStatsView extends GetView { color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ - BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2)), ], ), child: Row( children: [ - Icon(Icons.chat_bubble_outline, color: AppColors.primary, size: 20.sp), + Icon(Icons.chat_bubble_outline, + color: AppColors.primary, size: 20.sp), SizedBox(width: 8.w), Expanded( child: Text( 'AI聊天积分', - style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), ), ), Text( '${u.aichatintegral}/${u.aichattotalintegral}', - style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), ), ], ), @@ -71,4 +85,3 @@ class AiChatStatsView extends GetView { }); } } - diff --git a/lib/modules/usage/views/meeting_stats_view.dart b/lib/modules/usage/views/meeting_stats_view.dart index e648dc14f..de27ba356 100644 --- a/lib/modules/usage/views/meeting_stats_view.dart +++ b/lib/modules/usage/views/meeting_stats_view.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../../core/theme/app_colors.dart'; import '../controllers/meeting_stats_controller.dart'; +import '../../../data/models/user_Info.dart'; class MeetingStatsView extends GetView { const MeetingStatsView({Key? key}) : super(key: key); @@ -23,19 +24,24 @@ class MeetingStatsView extends GetView { PreferredSizeWidget _buildAppBar(bool isDarkMode) { return AppBar( leading: IconButton( - icon: Icon(Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), + icon: Icon(Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), onPressed: () => Get.back(), ), backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, title: Text( '会议统计', - style: TextStyle(fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), ), centerTitle: true, actions: [ IconButton( - icon: Icon(Icons.refresh, color: isDarkMode ? Colors.white : Colors.black), + icon: Icon(Icons.refresh, + color: isDarkMode ? Colors.white : Colors.black), onPressed: controller.refreshData, ), ], @@ -51,6 +57,8 @@ class MeetingStatsView extends GetView { padding: EdgeInsets.all(16.w), child: Column( children: [ + _buildIntegralCard(isDarkMode), + SizedBox(height: 16.h), _buildOverviewCard(isDarkMode), ], ), @@ -67,7 +75,10 @@ class MeetingStatsView extends GetView { color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ - BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2)), ], ), child: Obx(() => Row( @@ -99,7 +110,9 @@ class MeetingStatsView extends GetView { style: TextStyle( fontSize: 14.sp, fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400, - color: isSelected ? Colors.white : (isDarkMode ? Colors.white70 : Colors.black54), + color: isSelected + ? Colors.white + : (isDarkMode ? Colors.white70 : Colors.black54), ), ), ), @@ -115,7 +128,10 @@ class MeetingStatsView extends GetView { color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ - BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2)), ], ), child: Column( @@ -127,22 +143,45 @@ class MeetingStatsView extends GetView { SizedBox(width: 8.w), Obx(() => Text( '${controller.selectedTimeRange.value}概览', - style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), )), ], ), SizedBox(height: 16.h), Row( children: [ - Expanded(child: _buildStatItem('ASR调用次数', controller.formatNumber(stats.allAsrCalls), Icons.api, isDarkMode)), - Expanded(child: _buildStatItem('音频总时长', controller.formatDuration(stats.allAudioSeconds), Icons.mic, isDarkMode)), + Expanded( + child: _buildStatItem( + 'ASR调用次数', + controller.formatNumber(stats.allAsrCalls), + Icons.api, + isDarkMode)), + Expanded( + child: _buildStatItem( + '音频总时长', + controller.formatDuration(stats.allAudioSeconds), + Icons.mic, + isDarkMode)), ], ), SizedBox(height: 12.h), Row( children: [ - Expanded(child: _buildStatItem('音频文件大小', controller.formatBytes(stats.allAudioFileBytes), Icons.folder, isDarkMode)), - Expanded(child: _buildStatItem('转写字节', controller.formatNumber(stats.allTranscriptBytes), Icons.text_snippet, isDarkMode)), + Expanded( + child: _buildStatItem( + '音频文件大小', + controller.formatBytes(stats.allAudioFileBytes), + Icons.folder, + isDarkMode)), + Expanded( + child: _buildStatItem( + '转写字节', + controller.formatNumber(stats.allTranscriptBytes), + Icons.text_snippet, + isDarkMode)), ], ), ], @@ -150,22 +189,100 @@ class MeetingStatsView extends GetView { ); } - Widget _buildStatItem(String label, String value, IconData icon, bool isDarkMode) { + Widget _buildStatItem( + String label, String value, IconData icon, bool isDarkMode) { return Column( children: [ Icon(icon, color: AppColors.primary, size: 24.sp), SizedBox(height: 8.h), Text( value, - style: TextStyle(fontSize: 18.sp, fontWeight: FontWeight.bold, color: isDarkMode ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.bold, + color: isDarkMode ? Colors.white : Colors.black), ), SizedBox(height: 4.h), Text( label, - style: TextStyle(fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54), + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.black54), ), ], ); } -} + Widget _buildIntegralCard(bool isDarkMode) { + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.stacked_line_chart, + color: AppColors.primary, size: 20.sp), + SizedBox(width: 8.w), + Text( + '积分统计', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ], + ), + SizedBox(height: 16.h), + Obx(() { + final _ = User.refreshTick.value; + final u = User.instance; + return _buildIntegralRow( + '会议', + '${controller.formatNumber(u.meetintegral)}/${controller.formatNumber(u.meettotalintegral)}', + Icons.people, + isDarkMode, + ); + }), + ], + ), + ); + } + + Widget _buildIntegralRow( + String label, String value, IconData icon, bool isDarkMode) { + return Row( + children: [ + Icon(icon, color: AppColors.primary, size: 18.sp), + SizedBox(width: 12.w), + Expanded( + child: Text( + label, + style: TextStyle( + fontSize: 14.sp, + color: isDarkMode ? Colors.white : Colors.black), + ), + ), + Text( + value, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), + ), + ], + ); + } +} diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index 30d0501a6..4c98c9493 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -95,13 +95,13 @@ class TranslationStatsView extends GetView { padding: EdgeInsets.all(16.w), child: Column( children: [ + _buildIntegralCard(isDarkMode), + SizedBox(height: 16.h), if (controller.selectedTabIndex.value == 0) _buildRealtimeStatsCard(isDarkMode), SizedBox(height: 16.h), _buildOverviewCard(isDarkMode), SizedBox(height: 16.h), - _buildIntegralCard(isDarkMode), - SizedBox(height: 16.h), _buildApiCallsCard(isDarkMode), SizedBox(height: 16.h), _buildDataVolumeCard(isDarkMode), @@ -465,26 +465,12 @@ class TranslationStatsView extends GetView { final u = User.instance; return Column( children: [ - _buildIntegralRow( - 'AI聊天', - '${controller.formatNumber(u.aichatintegral)}/${controller.formatNumber(u.aichattotalintegral)}', - Icons.chat_bubble_outline, - isDarkMode, - ), - SizedBox(height: 12.h), _buildIntegralRow( '翻译', '${controller.formatNumber(u.tradeintegral)}/${controller.formatNumber(u.tradetotalintegral)}', Icons.translate, isDarkMode, ), - SizedBox(height: 12.h), - _buildIntegralRow( - '会议', - '${controller.formatNumber(u.meetintegral)}/${controller.formatNumber(u.meettotalintegral)}', - Icons.groups, - isDarkMode, - ), ], ); }), diff --git a/lib/modules/usage/views/usage_view.dart b/lib/modules/usage/views/usage_view.dart index 393884869..26531868f 100644 --- a/lib/modules/usage/views/usage_view.dart +++ b/lib/modules/usage/views/usage_view.dart @@ -7,6 +7,21 @@ import '../controllers/usage_controller.dart'; class UsageView extends GetView { const UsageView({super.key}); + // 1. 将导航栏配置提取为常量,提高可维护性 + static const _navItems = [ + _NavItem(Icons.chat_bubble_outline, 'AI chat'), + _NavItem(Icons.translate, 'interpretation'), + _NavItem(Icons.people, 'meeting'), + ]; + + // 2. 颜色配置集中管理 + Color _getBgColor(bool isDark) => + isDark ? Colors.black : const Color(0xFFF9FAFB); + Color _getUnselectedColor(bool isDark) => + isDark ? Colors.grey[500]! : const Color(0xFF6B7280); + Color _getSelectedColor(bool isDark) => + isDark ? Colors.blue[200]! : const Color(0xFF3B82F6); + @override Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; @@ -19,36 +34,69 @@ class UsageView extends GetView { children: controller.pageList, ), bottomNavigationBar: Obx( - () => BottomNavigationBar( - items: [ - BottomNavigationBarItem( - icon: const Icon(Icons.chat_bubble_outline), - label: 'AI聊天', - ), - BottomNavigationBarItem( - icon: const Icon(Icons.translate), - label: 'interpretation'.tr, + () { + final currentIndex = controller.pageIndex.value; + + return Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: isDarkMode ? Colors.grey[800]! : Colors.grey[200]!, + width: 0.5, + )), ), - BottomNavigationBarItem( - icon: const Icon(Icons.groups), - label: 'meeting'.tr, + // 3. 添加安全区域适配(针对刘海屏) + child: BottomNavigationBar( + // 4. 使用生成的导航项 + items: _navItems + .map((item) => BottomNavigationBarItem( + icon: Icon(item.icon), + activeIcon: Icon(item.icon, + color: _getSelectedColor(isDarkMode)), // 5. 激活态图标 + label: item.label.tr, // 统一处理国际化 + )) + .toList(), + + backgroundColor: _getBgColor(isDarkMode), + currentIndex: currentIndex, + unselectedItemColor: _getUnselectedColor(isDarkMode), + selectedItemColor: _getSelectedColor(isDarkMode), + unselectedFontSize: 10.sp, + selectedFontSize: 10.sp, + + // 6. 添加动画过渡效果 + onTap: (index) => _onItemTapped(index, currentIndex), + + type: BottomNavigationBarType.fixed, + // 7. 增加图标和文字的间距 + iconSize: 22.w, // 响应式图标尺寸 + selectedLabelStyle: TextStyle(height: 1.5), // 文字垂直间距 + unselectedLabelStyle: TextStyle(height: 1.5), ), - ], - backgroundColor: isDarkMode ? Colors.black : const Color(0xFFF9FAFB), - currentIndex: controller.pageIndex.value, - unselectedItemColor: - isDarkMode ? Colors.grey[500] : const Color(0xFF6B7280), - selectedItemColor: const Color(0xFF3B82F6), - unselectedFontSize: 10.sp, - selectedFontSize: 10.sp, - onTap: (int index) { - if (index == controller.pageIndex.value) return; - controller.pageIndex.value = index; - controller.pageController.jumpToPage(index); - }, - type: BottomNavigationBarType.fixed, - ), + ); + }, ), ); } + + // 9. 抽离点击逻辑 + void _onItemTapped(int index, int currentIndex) { + if (index == currentIndex) return; + + // 10. 添加页面切换动画 + controller.pageController.animateToPage( + index, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + controller.pageIndex.value = index; + } +} + +// 11. 使用数据类管理导航项配置 +class _NavItem { + final IconData icon; + final String label; + + const _NavItem(this.icon, this.label); } From b34d4dbd5505a52cb471346fb2c6c1a0f58e3289 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 25 Nov 2025 15:36:17 +0800 Subject: [PATCH 070/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=80=9D=E7=BB=B4=E5=AF=BC=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/mind_map_controller.dart | 38 +++++++++++++------ .../views/bottomSheet/share_bottom_sheet.dart | 28 ++++++++++++++ 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/lib/modules/meeting/controllers/mind_map_controller.dart b/lib/modules/meeting/controllers/mind_map_controller.dart index 997ec75bb..09b91b613 100644 --- a/lib/modules/meeting/controllers/mind_map_controller.dart +++ b/lib/modules/meeting/controllers/mind_map_controller.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:image_gallery_saver_plus/image_gallery_saver_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -19,6 +20,8 @@ class MindMapController extends GetxController { final double _width = 1.sw - 25.w; bool isWebViewReady = false; + int imageType = 1; + late final Worker _summaryNumberListener; @override @@ -170,18 +173,29 @@ class MindMapController extends GetxController { final String dataUrl = message.message; final String base64Str = dataUrl.split(',').last; final Uint8List bytes = base64.decode(base64Str); - final String fileName = - '${_meetingDetailsController.meetingData.value.title}_mindmap.png'; - final tempDir = await getTemporaryDirectory(); - final File file = File('${tempDir.path}/$fileName'); - await file.writeAsBytes(bytes); - final result = await SharePlus.instance.share(ShareParams( - text: 'shareMindMap'.tr, //对应中文:分享思维导图 - - files: [XFile(file.path)], - )); - if (result.status == ShareResultStatus.success) { - EasyLoading.showToast('shareSuccess'.tr); //对应中文:分享成功 + if (imageType == 1) { + // 保存图片 + final result = await ImageGallerySaverPlus.saveImage( + bytes, + quality: 100, + ); + if (result['isSuccess']) { + EasyLoading.showToast('保存成功'); + } + } else { + // 分享图片 + final String fileName = + '${_meetingDetailsController.meetingData.value.title}_mindmap.png'; + final tempDir = await getTemporaryDirectory(); + final File file = File('${tempDir.path}/$fileName'); + await file.writeAsBytes(bytes); + final result = await SharePlus.instance.share(ShareParams( + text: 'shareMindMap'.tr, //对应中文:分享思维导图 + files: [XFile(file.path)], + )); + if (result.status == ShareResultStatus.success) { + EasyLoading.showToast('shareSuccess'.tr); //对应中文:分享成功 + } } } } diff --git a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart index 7705997f9..1f7d48615 100644 --- a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart @@ -209,6 +209,33 @@ class _ShareBottomSheetState extends State { ); } : null), + _shareItem( + Icons.save_alt, + '保存思维导图', + onTap: _controller.meetingDetails.value.tasktype >= 3 + ? () { + Get.back(); + final mindMapController = + Get.find(); + mindMapController.imageType = 1; + if (mindMapController.isWebViewReady) { + mindMapController.webViewController + .runJavaScript('captureImage()'); + } else { + mindMapController.webViewController + .setNavigationDelegate( + NavigationDelegate( + onPageFinished: (String url) { + mindMapController.isWebViewReady = true; + mindMapController.webViewController + .runJavaScript('captureImage()'); + }, + ), + ); + } + } + : null, + ), _shareItem( Icons.lan, 'shareMindMap'.tr, // 对应中文:分享思维导图 @@ -218,6 +245,7 @@ class _ShareBottomSheetState extends State { Get.back(); final mindMapController = Get.find(); + mindMapController.imageType = 2; if (mindMapController.isWebViewReady) { mindMapController.webViewController .runJavaScript('captureImage()'); From 19404fbe26159db85ff166840150d03d26dfe903 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 25 Nov 2025 19:19:17 +0800 Subject: [PATCH 071/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/models/goods.dart | 13 +- lib/data/services/ble_manager.dart | 7 +- lib/data/services/pay_service.dart | 9 + .../agent/controllers/agent_controller.dart | 10 +- lib/modules/agent/views/agent_view.dart | 60 +- .../controllers/goodsvip_controller.dart | 47 +- lib/modules/goods/views/goodsvip_view.dart | 812 +++++++++++++++--- lib/modules/settings/views/settings_view.dart | 93 +- .../agent_service/AgentService.kt | 16 +- .../agent_service/AgentServicePlugin.kt | 2 +- .../agent_service/BleMediaService.kt | 6 +- .../agent_service/AgentServiceImpl.swift | 13 +- .../chat_api/ChatApiService.kt | 7 +- .../Sources/chat_api/ChatApiService.swift | 22 +- 14 files changed, 901 insertions(+), 216 deletions(-) diff --git a/lib/data/models/goods.dart b/lib/data/models/goods.dart index bda3a6c37..6218c65a7 100644 --- a/lib/data/models/goods.dart +++ b/lib/data/models/goods.dart @@ -10,7 +10,10 @@ enum UsageType { /// 会议 Meet, // 2 /// 智能体 - AI; // 3 + AI, // 3 + /// 智能体 + Vip; // 4 + /// Vip // 解析支持 int 或 string(大小写不敏感) static UsageType from(dynamic value) { @@ -24,6 +27,8 @@ enum UsageType { return UsageType.Meet; case 3: return UsageType.AI; + case 4: + return UsageType.Vip; default: return UsageType.UsageNull; } @@ -43,6 +48,8 @@ enum UsageType { return UsageType.Meet; case 'ai': return UsageType.AI; + case 'vip': + return UsageType.Vip; default: return UsageType.UsageNull; } @@ -60,6 +67,8 @@ enum UsageType { return 2; case UsageType.AI: return 3; + case UsageType.Vip: + return 4; } } @@ -73,6 +82,8 @@ enum UsageType { return 'Meet'; case UsageType.AI: return 'AI'; + case UsageType.Vip: + return 'Vip'; } } } diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 94cca3036..5b9f3754c 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -9,7 +9,7 @@ import 'package:get/get.dart'; import 'package:ble_service/ble_service.dart'; import 'package:agent_service/agent_service.dart'; import '../../data/models/appconfig_model.dart'; - +import '../../data/models/user_Info.dart' as userInfo; import '../../data/models/appconfig.dart'; import '../../core/utils/logger.dart'; import 'bluetooth_manager.dart'; @@ -706,6 +706,9 @@ class BleManager extends GetxService { Logger.info('启动BLE服务,musicServiceType: ${musicServiceType}'); final isTtsInterruptEnabled = await _loadTtsInterrupe(); + final vipExpiryTime = userInfo.User.instance.vipexptime; + Logger.info('会员过期时间: $vipExpiryTime'); + // 根据APP语言动态配置语音识别语言 List supportedLanguages = []; try { @@ -776,7 +779,7 @@ class BleManager extends GetxService { 'musicServiceType': musicServiceType, "navigationMode": navigationMode, "isttsinterrupt": isTtsInterruptEnabled ? "true" : "false", - "aiintegral": 100, //ai积分 + "vipexptime": vipExpiryTime, //会员过期时间 "callingToolText": "callingTool".tr, "insufficientIntegralText": "insufficientIntegral".tr, }; diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index dedc2cae8..79ab577f9 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -2,6 +2,7 @@ import 'package:get/get.dart'; import 'dart:convert'; import 'dart:async'; import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; import 'package:in_app_purchase_android/in_app_purchase_android.dart'; import 'package:package_info_plus/package_info_plus.dart'; @@ -229,6 +230,14 @@ class PayService extends GetxService { } return ok; } catch (e) { + if (e is PlatformException && + (e.code.contains('purchase_cancelled') || + e.code.contains('storekit2_purchase_cancelled'))) { + onResult?.call(false, '已取消支付'); + print( + '[IAP] 用户取消支付(同步抛出) code=${e.code} message=${e.message} product=${product.id}'); + return false; + } onResult?.call(false, '发起内购失败: $e'); print('[IAP] 发起内购异常: $e'); return false; diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 2646dc84b..87a0d04a8 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -46,7 +46,7 @@ class AgentController extends GetxController with WidgetsBindingObserver { // 聊天消息列表 final messages = [].obs; final currsessionid = ''.obs; - final aichatintegral = 0.obs; + final vipExpiryTime = 0.obs; // UI控制器 final TextEditingController textController = TextEditingController(); final ScrollController scrollController = ScrollController(); @@ -166,7 +166,10 @@ class AgentController extends GetxController with WidgetsBindingObserver { @override void onInit() { super.onInit(); - aichatintegral.value = User.isLoggedIn() ? User.instance.aichatintegral : 0; + vipExpiryTime.value = User.isLoggedIn() ? User.instance.vipexptime : 0; + ever(User.refreshTick, (_) { + vipExpiryTime.value = User.instance.vipexptime; + }); _initAppDir(); _loadTtsPreference(); //加载TTS偏好设置 _loadTtsInterrupe(); //加载TTS播报打断偏好设置 @@ -837,7 +840,7 @@ class AgentController extends GetxController with WidgetsBindingObserver { ), onPressed: () { Get.back(); - Get.toNamed(Routes.goodsai); + Get.toNamed(Routes.goodsvip); }, child: const Text('去充值'), ), @@ -1084,7 +1087,6 @@ class AgentController extends GetxController with WidgetsBindingObserver { final sessionid = event.data['sessionid'] ?? ''; final integral = event.data['integral'] ?? 0; User.instance.aichatintegral = integral; - aichatintegral.value = integral; break; default: break; diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index 22662ad94..fc08482f9 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -13,6 +13,7 @@ import 'message_bubble.dart'; import '../widgets/full_screen_editor.dart'; import '../widgets/sound_bar_widget.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:intl/intl.dart'; class AgentView extends StatefulWidget { const AgentView({Key? key}) : super(key: key); @@ -119,14 +120,27 @@ class _AgentViewState extends State with WidgetsBindingObserver { ), ), SizedBox(width: 4.w), - Obx(() => Text( - '剩余积分: ${controller.aichatintegral.value}', - style: TextStyle( - fontSize: 12.sp, - color: Colors.green, - fontWeight: FontWeight.w500, - ), - )), + Obx(() { + final vipexptime = controller.vipExpiryTime.value; + DateTime? expiry; + if (vipexptime > 0) { + expiry = vipexptime > 1000000000000 + ? DateTime.fromMillisecondsSinceEpoch(vipexptime) + : DateTime.fromMillisecondsSinceEpoch( + vipexptime * 1000); + } + final text = expiry != null + ? '到期时间: ${DateFormat('yyyy-MM-dd').format(expiry)}' + : '未开启'; + return Text( + text, + style: TextStyle( + fontSize: 12.sp, + color: Colors.green, + fontWeight: FontWeight.w500, + ), + ); + }), ], ), ], @@ -326,18 +340,18 @@ class _AgentViewState extends State with WidgetsBindingObserver { getOverlayPosition: IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { - return IntroOverlayBuilder.aiBuilder( - params, - controller - .noviceGuideService - .aiStepsList[controller - .noviceGuideService.aiStep] - ['endKey'] - .tr, - onFinish: () async { - if (controller - .noviceGuideService.aiStep < - 5) { + return IntroOverlayBuilder.aiBuilder( + params, + controller + .noviceGuideService + .aiStepsList[controller + .noviceGuideService + .aiStep]['endKey'] + .tr, + onFinish: () async { + if (controller + .noviceGuideService.aiStep < + 5) { await Future.delayed(const Duration( milliseconds: 300)); controller @@ -627,8 +641,8 @@ class _AgentViewState extends State with WidgetsBindingObserver { controller .noviceGuideService .aiStepsList[controller - .noviceGuideService.aiStep] - ['startKey'] + .noviceGuideService + .aiStep]['startKey'] .tr, buttonText: 'confirmInput'.tr, onNext: () { @@ -877,7 +891,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { await controller .noviceGuideService.aiStepsList[ controller.noviceGuideService - .aiStep]['method'](); + .aiStep]['method'](); params.onNext!(); controller.sendMessage(); }, diff --git a/lib/modules/goods/controllers/goodsvip_controller.dart b/lib/modules/goods/controllers/goodsvip_controller.dart index 00be5dba8..98b18c030 100644 --- a/lib/modules/goods/controllers/goodsvip_controller.dart +++ b/lib/modules/goods/controllers/goodsvip_controller.dart @@ -1,5 +1,3 @@ -import 'package:get/get.dart'; -import '../../../routes/app_routes.dart'; import '../../../data/models/goods.dart'; import '../../../data/services/network/api.dart'; import 'goods_base_controller.dart'; @@ -7,23 +5,36 @@ import 'goods_base_controller.dart'; class GoodsvipController extends GoodsBaseController { @override Future> fetchProducts() async { - final resp = await Api.getGoods({'usagetype': UsageType.UsageNull.toInt}); - if (resp == null || resp is! Map) return []; - if (resp.containsKey('error') || resp.containsKey('msg')) { - final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; - throw Exception(msg); + final types = [ + UsageType.AI, + UsageType.Meet, + UsageType.Translation, + UsageType.Vip, + ]; + final Map all = {}; + for (final t in types) { + final resp = await Api.getGoods({'usagetype': t.toInt}); + if (resp == null || resp is! Map) continue; + if (resp.containsKey('error') || resp.containsKey('msg')) { + final msg = resp['error'] ?? resp['msg'] ?? '服务器错误'; + throw Exception(msg); + } + final container = + (resp is Map && resp['data'] is Map) ? resp['data'] : resp; + final data = (container is Map) + ? (container['goodss'] ?? container['goodes'] ?? container['goods']) + : null; + if (data is List) { + final list = data + .whereType>() + .map(DBGoods.fromJson) + .toList(); + for (final g in list) { + all[g.id] = g; + } + } } - final container = - (resp is Map && resp['data'] is Map) ? resp['data'] : resp; - final data = (container is Map) - ? (container['goodss'] ?? container['goodes'] ?? container['goods']) - : null; - if (data is List) { - final list = - data.whereType>().map(DBGoods.fromJson).toList(); - return list.where((g) => g.usagetype == UsageType.UsageNull).toList(); - } - return []; + return all.values.toList(); } // Future purchase(DBGoods item) async => super.purchase(item); diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index e4fbff0dd..6b541e319 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/user_Info.dart'; import '../controllers/goodsvip_controller.dart'; import '../utils/goods_i18n.dart'; @@ -15,14 +16,19 @@ class GoodsvipView extends GetView { return Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: AppBar( - backgroundColor: isDarkMode ? Colors.black : Colors.white, + backgroundColor: Colors.blue[600], + foregroundColor: Colors.white, elevation: 0.5, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new), + onPressed: () => Get.back(), + ), title: Text( - 'premiumMember'.tr, // 高级会员 + '购买', style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, + color: Colors.white, ), ), centerTitle: true, @@ -34,20 +40,38 @@ class GoodsvipView extends GetView { } else if (controller.error.isNotEmpty) { content = Center(child: Text(controller.error.value)); } else { - content = ListView.separated( + final Map> grouped = {}; + for (final g in controller.items) { + grouped.putIfAbsent(g.usagetype, () => []).add(g); + } + final order = [ + UsageType.Vip, + UsageType.Translation, + UsageType.Meet, + UsageType.AI, + ]; + final children = []; + children.add(_buildFeaturesSection(isDarkMode)); + children.add(SizedBox(height: 16.h)); + // children.add(_buildScenesSection(isDarkMode)); + // children.add(SizedBox(height: 16.h)); + for (int i = 0; i < order.length; i++) { + final t = order[i]; + final list = grouped[t]; + if (list == null || list.isEmpty) continue; + children.add(_buildTypeSection(t, list, isDarkMode)); + if (i != order.length - 1) { + children.add(SizedBox(height: 16.h)); + children.add( + Divider(color: isDarkMode ? Colors.white24 : Colors.black12)); + children.add(SizedBox(height: 16.h)); + } + } + + children.add(_buildFooterSection(isDarkMode)); + content = ListView( padding: EdgeInsets.all(16.w), - itemCount: controller.items.length + 2, - separatorBuilder: (_, __) => SizedBox(height: 12.h), - itemBuilder: (_, index) { - if (index < controller.items.length) { - final item = controller.items[index]; - return _buildGoodsCard(item, isDarkMode); - } - if (index == controller.items.length) { - return _buildFeaturesSection(isDarkMode); - } - return _buildFooterSection(isDarkMode); - }, + children: children, ); } return Stack( @@ -71,92 +95,6 @@ class GoodsvipView extends GetView { ); } - Widget _buildGoodsCard(DBGoods item, bool isDarkMode) { - return Container( - padding: EdgeInsets.all(16.w), - decoration: BoxDecoration( - color: isDarkMode ? Colors.grey[900] : Colors.white, - borderRadius: BorderRadius.circular(12.r), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withOpacity(0.2) - : Colors.black.withOpacity(0.05), - blurRadius: 10, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - children: [ - Container( - width: 42.w, - height: 42.w, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.amber[900]!.withOpacity(0.3) - : Colors.amber[100]!, - borderRadius: BorderRadius.circular(21.r), - ), - child: Icon(Icons.workspace_premium, - color: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!), - ), - SizedBox(width: 12.w), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(item.name, - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, - )), - SizedBox(height: 4.h), - Text(localizedGoodsDesc(item), - style: TextStyle( - fontSize: 12.sp, - color: isDarkMode ? Colors.white70 : Colors.grey[600], - )), - ], - ), - ), - SizedBox(width: 12.w), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text('¥${item.price.toStringAsFixed(2)}', - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, - )), - SizedBox(height: 8.h), - GestureDetector( - onTap: () => controller.purchase(item), - child: Container( - padding: - EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), - decoration: BoxDecoration( - color: Colors.blue[600], - borderRadius: BorderRadius.circular(20.r), - ), - child: Text( - 'purchase'.tr, - style: TextStyle( - fontSize: 12.sp, - color: Colors.white, - ), - ), - ), - ), - ], - ), - ], - ), - ); - } - Widget _buildFeaturesSection(bool isDarkMode) { final textColor = isDarkMode ? Colors.white : Colors.black; final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; @@ -317,4 +255,674 @@ class GoodsvipView extends GetView { ), ); } + + Widget _buildTypeHeader(UsageType type, bool isDarkMode) { + final titles = { + UsageType.AI: 'aiFunction'.tr, + UsageType.Meet: 'conferenceAssistant'.tr, + UsageType.Translation: 'simultaneousTranslation'.tr, + UsageType.Vip: 'premiumMember'.tr, + }; + final iconAndColor = _iconColorForType(type, isDarkMode); + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + String titleStr = titles[type] ?? type.name; + String? vipSubtitle; + if (type == UsageType.Vip) { + int viplv = 0; + int vipexptime = 0; + if (User.isLoggedIn()) { + final u = User.instance; + viplv = u.viplv; + vipexptime = u.vipexptime; + } + DateTime? expiry; + if (vipexptime > 0) { + expiry = vipexptime > 1000000000000 + ? DateTime.fromMillisecondsSinceEpoch(vipexptime) + : DateTime.fromMillisecondsSinceEpoch(vipexptime * 1000); + } + titleStr = 'Vip $viplv'; + vipSubtitle = expiry != null ? _fmtDate(expiry) : '未开启'; + } + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Container( + // width: 44.w, + // height: 44.w, + // decoration: BoxDecoration( + // color: iconAndColor.background, + // borderRadius: BorderRadius.circular(22.r), + // ), + // child: Icon(iconAndColor.icon, color: iconAndColor.foreground), + // ), + // SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + titleStr, + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w700, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + SizedBox(height: 8.h), + if (type == UsageType.Vip && vipSubtitle != null) + Text( + vipSubtitle, + style: TextStyle(fontSize: 12.sp, color: subColor), + ) + else + _buildMetricsInline(type, isDarkMode), + ], + ), + ), + ], + ), + ); + } + + Widget _buildTypeSection( + UsageType type, List list, bool isDarkMode) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTypeHeader(type, isDarkMode), + SizedBox(height: 12.h), + _buildGoodsGrid(list, type, isDarkMode), + ], + ); + } + + Widget _buildMetricsInline(UsageType type, bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + if (type == UsageType.Vip) { + int viplv = 0; + int vipexptime = 0; + if (User.isLoggedIn()) { + final u = User.instance; + viplv = u.viplv; + vipexptime = u.vipexptime; + } + DateTime? expiry; + if (vipexptime > 0) { + expiry = vipexptime > 1000000000000 + ? DateTime.fromMillisecondsSinceEpoch(vipexptime) + : DateTime.fromMillisecondsSinceEpoch(vipexptime * 1000); + } + return Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Lv.$viplv', + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 4.h), + Text( + expiry != null + ? '${'validityPeriod'.tr}${_fmtDate(expiry)}' + : 'notBound'.tr, + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ), + ), + // Container( + // padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 4.h), + // decoration: BoxDecoration( + // color: isDarkMode ? Colors.white10 : Colors.black12, + // borderRadius: BorderRadius.circular(16.r), + // ), + // child: Text( + // viplv > 0 ? 'enabled'.tr : 'disabled'.tr, + // style: TextStyle(fontSize: 11.sp, color: subColor), + // ), + // ), + ], + ); + } + + int total = 0; + int remain = 0; + if (User.isLoggedIn()) { + final u = User.instance; + if (type == UsageType.AI) { + total = u.aichattotalintegral; + remain = u.aichatintegral; + } else if (type == UsageType.Meet) { + total = u.meettotalintegral; + remain = u.meetintegral; + } else if (type == UsageType.Translation) { + total = u.tradetotalintegral; + remain = u.tradeintegral; + } + } + final progress = (total > 0) ? (remain / total).clamp(0.0, 1.0) : 0.0; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LinearProgressIndicator( + value: progress, + minHeight: 8.h, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[300], + valueColor: AlwaysStoppedAnimation( + isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'totalCount'.tr}:$total', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + Text( + '${'remaining'.tr}:$remain', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ), + ], + ); + } + + Widget _buildGoodsCardByType(DBGoods item, UsageType type, bool isDarkMode) { + final iconAndColor = _iconColorForType(type, isDarkMode); + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: iconAndColor.background, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon(iconAndColor.icon, color: iconAndColor.foreground), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(localizedGoodsName(item), + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 4.h), + Text(localizedGoodsDesc(item), + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[600], + )), + ], + ), + ), + SizedBox(width: 12.w), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text('¥${item.priceYuan.toStringAsFixed(2)}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + )), + SizedBox(height: 8.h), + GestureDetector( + onTap: () => controller.purchase(item), + child: Container( + padding: + EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.blue[600], + borderRadius: BorderRadius.circular(20.r), + ), + child: Text( + 'purchase'.tr, + style: TextStyle( + fontSize: 12.sp, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildMetricsForType(UsageType type, bool isDarkMode) { + if (type == UsageType.Vip) { + return _buildVipMetricsCard(isDarkMode); + } + return _buildQuotaCard(type, isDarkMode); + } + + Widget _buildVipMetricsCard(bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + int viplv = 0; + int vipexptime = 0; + if (User.isLoggedIn()) { + final u = User.instance; + viplv = u.viplv; + vipexptime = u.vipexptime; + } + DateTime? expiry; + if (vipexptime > 0) { + expiry = vipexptime > 1000000000000 + ? DateTime.fromMillisecondsSinceEpoch(vipexptime) + : DateTime.fromMillisecondsSinceEpoch(vipexptime * 1000); + } + final iconColors = _iconColorForType(UsageType.Vip, isDarkMode); + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: iconColors.background, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon(iconColors.icon, color: iconColors.foreground), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Lv.$viplv', + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 4.h), + Text( + expiry != null + ? '${'validityPeriod'.tr}${_fmtDate(expiry)}' + : 'notBound'.tr, + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 4.h), + decoration: BoxDecoration( + color: isDarkMode ? Colors.white10 : Colors.black12, + borderRadius: BorderRadius.circular(16.r), + ), + child: Text( + viplv > 0 ? 'enabled'.tr : 'disabled'.tr, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + ), + ], + ), + ); + } + + Widget _buildQuotaCard(UsageType type, bool isDarkMode) { + int total = 0; + int remain = 0; + if (User.isLoggedIn()) { + final u = User.instance; + if (type == UsageType.AI) { + total = u.aichattotalintegral; + remain = u.aichatintegral; + } else if (type == UsageType.Meet) { + total = u.meettotalintegral; + remain = u.meetintegral; + } else if (type == UsageType.Translation) { + total = u.tradetotalintegral; + remain = u.tradeintegral; + } + } + final progress = (total > 0) ? (remain / total).clamp(0.0, 1.0) : 0.0; + final iconColors = _iconColorForType(type, isDarkMode); + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + final textColor = isDarkMode ? Colors.white : Colors.black; + return Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 36.w, + height: 36.w, + decoration: BoxDecoration( + color: iconColors.background, + borderRadius: BorderRadius.circular(18.r), + ), + child: Icon(iconColors.icon, color: iconColors.foreground), + ), + SizedBox(width: 8.w), + Text( + 'remainingQuota'.tr, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + ], + ), + SizedBox(height: 12.h), + LinearProgressIndicator( + value: progress, + minHeight: 8.h, + backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[300], + valueColor: AlwaysStoppedAnimation( + isDarkMode ? Colors.blue[300]! : Colors.blue[600]!), + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'totalCount'.tr}:$total', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + Text( + '${'remaining'.tr}:$remain', + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ), + ], + ), + ); + } + + Widget _buildGoodsGrid(List list, UsageType type, bool isDarkMode) { + return GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 12.h, + crossAxisSpacing: 12.w, + childAspectRatio: 1.15, + ), + itemCount: list.length, + itemBuilder: (_, i) => _buildGridItemCard(list[i], type, isDarkMode), + ); + } + + Widget _buildGridItemCard(DBGoods item, UsageType type, bool isDarkMode) { + final iconColors = _iconColorForType(type, isDarkMode); + return Container( + padding: EdgeInsets.all(12.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 34.w, + height: 34.w, + decoration: BoxDecoration( + color: iconColors.background, + borderRadius: BorderRadius.circular(17.r), + ), + child: Icon(iconColors.icon, color: iconColors.foreground), + ), + SizedBox(width: 8.w), + Expanded( + child: Text( + localizedGoodsName(item), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + ), + ], + ), + SizedBox(height: 6.h), + Expanded( + child: Text( + localizedGoodsDesc(item), + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.grey[700], + ), + ), + ), + SizedBox(height: 6.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '¥${item.priceYuan.toStringAsFixed(2)}', + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + GestureDetector( + onTap: () => controller.purchase(item), + child: Container( + padding: + EdgeInsets.symmetric(horizontal: 10.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.blue[600], + borderRadius: BorderRadius.circular(8.r), + ), + child: Text( + 'purchase'.tr, + style: TextStyle(fontSize: 12.sp, color: Colors.white), + ), + ), + ), + ], + ), + ], + ), + ); + } + + String _fmtDate(DateTime d) { + final y = d.year.toString().padLeft(4, '0'); + final m = d.month.toString().padLeft(2, '0'); + final day = d.day.toString().padLeft(2, '0'); + return '$y-$m-$day'; + } + + _IconColors _iconColorForType(UsageType type, bool isDarkMode) { + switch (type) { + case UsageType.AI: + return _IconColors( + icon: Icons.smart_toy, + background: isDarkMode + ? Colors.teal[900]!.withOpacity(0.3) + : Colors.teal[100]!, + foreground: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, + ); + case UsageType.Meet: + return _IconColors( + icon: Icons.people_alt, + background: isDarkMode + ? Colors.pink[900]!.withOpacity(0.3) + : Colors.pink[100]!, + foreground: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, + ); + case UsageType.Translation: + return _IconColors( + icon: Icons.translate, + background: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + foreground: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, + ); + case UsageType.Vip: + case UsageType.UsageNull: + return _IconColors( + icon: Icons.workspace_premium, + background: isDarkMode + ? Colors.amber[900]!.withOpacity(0.3) + : Colors.amber[100]!, + foreground: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, + ); + } + } + + Widget _buildScenesSection(bool isDarkMode) { + final textColor = isDarkMode ? Colors.white : Colors.black; + final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'scene'.tr, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: textColor, + ), + ), + SizedBox(height: 10.h), + Wrap( + spacing: 12.w, + runSpacing: 12.h, + children: [ + _buildFeatureCard( + isDarkMode, + icon: Icons.smart_toy, + title: 'aiFunction'.tr, + lines: ['aiHeaderDesc1'.tr, 'aiHeaderDesc2'.tr], + colorSeed: Colors.teal, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.people_alt, + title: 'conferenceAssistant'.tr, + lines: ['meetingHeaderDesc1'.tr, 'meetingHeaderDesc2'.tr], + colorSeed: Colors.pink, + ), + _buildFeatureCard( + isDarkMode, + icon: Icons.translate, + title: 'simultaneousTranslation'.tr, + lines: ['tradeHeaderDesc1'.tr, 'tradeHeaderDesc2'.tr], + colorSeed: Colors.indigo, + ), + ], + ), + SizedBox(height: 12.h), + Text( + 'vipDisclaimer'.tr, + style: TextStyle(fontSize: 12.sp, color: subColor), + ), + ], + ); + } +} + +class _IconColors { + final IconData icon; + final Color background; + final Color foreground; + const _IconColors({ + required this.icon, + required this.background, + required this.foreground, + }); } diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index c814ac4de..bf5a7f72d 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -243,46 +243,59 @@ class SettingsView extends GetView { ), ], ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _buildCategoryItem( - icon: Icons.workspace_premium, - label: 'premiumMember'.tr, - iconBg: isDarkMode - ? Colors.amber[900]!.withOpacity(0.3) - : Colors.amber[100]!, - iconColor: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, - onTap: () => Get.toNamed(Routes.goodsvip), - ), - _buildCategoryItem( - icon: Icons.translate, - label: 'interpretation'.tr, - iconBg: isDarkMode - ? Colors.indigo[900]!.withOpacity(0.3) - : Colors.indigo[100]!, - iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, - onTap: () => Get.toNamed(Routes.goodstrade), - ), - _buildCategoryItem( - icon: Icons.file_open, - label: 'conferenceAssistant'.tr, - iconBg: isDarkMode - ? Colors.pink[900]!.withOpacity(0.3) - : Colors.pink[100]!, - iconColor: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, - onTap: () => Get.toNamed(Routes.goodsmeet), - ), - _buildCategoryItem( - icon: Icons.smart_toy, - label: 'aiFunction'.tr, - iconBg: isDarkMode - ? Colors.teal[900]!.withOpacity(0.3) - : Colors.teal[100]!, - iconColor: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, - onTap: () => Get.toNamed(Routes.goodsai), - ), - ], + child: InkWell( + onTap: () => Get.toNamed(Routes.goodsvip), + borderRadius: BorderRadius.circular(16.r), + child: Row( + children: [ + Container( + width: 42.w, + height: 42.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.amber[900]!.withOpacity(0.3) + : Colors.amber[100]!, + borderRadius: BorderRadius.circular(21.r), + ), + child: Icon( + Icons.workspace_premium, + size: 20.w, + color: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, + ), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'premiumMember'.tr, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + SizedBox(height: 4.h), + Text( + '${'higherQuota'.tr} · ${'fastResponse'.tr}', + style: TextStyle( + fontSize: 12.sp, + color: Colors.white70, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 16.w, + color: Colors.white70, + ), + ], + ), ), ); } diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 709208fb7..3f3b6e49c 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -136,7 +136,7 @@ object AgentService : CoroutineScope { private var currentAiJob: Job? = null private var currsessionId: String = "" - private var aiintegral:Int = 0 + private var vipExptime:Int = 0 // 空闲检测相关 private var idleCheckJob: Job? = null @@ -207,8 +207,8 @@ object AgentService : CoroutineScope { usertoken = config["usertoken"]?.toString() ?: ""; callingToolText = config["callingToolText"]?.toString() ?: ""; insufficientIntegralText = config["insufficientIntegralText"]?.toString() ?: ""; - aiintegral = config["aiintegral"]?.toString()?.toIntOrNull() ?: 0; - + vipExptime = config["vipexptime"]?.toString()?.toIntOrNull() ?: 0; + Log.d(TAG, "Vip 过期时间 ${vipExptime}") // 初始化上下文和服务 this.context = appContext.applicationContext @@ -1013,7 +1013,7 @@ object AgentService : CoroutineScope { } chatApiService.sendMessageStream( sessionid, - aiintegral, + vipExptime, messagesWithSystemPrompt, object : StreamCallback { @@ -1033,7 +1033,7 @@ object AgentService : CoroutineScope { val key = "AICHAT_FUNCTION_" + funcName actions[key] = (actions[key] ?: 0) + 1 } - sendStatisticsEvent(actions) + // sendStatisticsEvent(actions) }catch (e: Exception) { Log.e(TAG, "liwei--------------- AI Call onUsage 异常", e) } @@ -2597,13 +2597,13 @@ object AgentService : CoroutineScope { } for ((k, v) in dataMap) { Log.d(TAG, "统计事件发送成功,响应: $k -> $v") - if(k == "3"){ //AI积分更新 - aiintegral = v + if(k == "4"){ //AI积分更新 + vipExptime = v // 广播一个细化事件,便于前端单独处理 AI 积分更新 sendEvent( "assistant_usages", mapOf( - "integral" to aiintegral + "vipxptime" to vipExptime ) ) } diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index 5c0457fdc..c09205d16 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -80,7 +80,7 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream config["isttsinterrupt"]?.toString()?.let { intent.putExtra("isttsinterrupt", it) } config["callingToolText"]?.toString()?.let { intent.putExtra("callingToolText", it) } config["insufficientIntegralText"]?.toString()?.let { intent.putExtra("insufficientIntegralText", it) } - config["aiintegral"]?.toString()?.let { intent.putExtra("aiintegral", it) } + config["vipexptime"]?.toString()?.let { intent.putExtra("vipexptime", it) } // 添加 supportedLanguages 参数处理 diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index 219ba870b..a55ea8d1b 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -70,7 +70,7 @@ class BleMediaService : Service(), CoroutineScope { private const val APP_NAVIGATION_MODE = "navigationMode" private const val APP_CALLING_TOOL_TEXT = "callingToolText" // 工具调用提示 private const val APP_INSUFFICIENT_INTEGRAL_TEXT = "insufficientIntegralText" // 积分不足提示 - private const val KEY_AI_INTEGRAL = "aiIntegral" // 积分不足提示 + private const val KEY_VIP_EXPTIME = "vipexptime" // 会员到期时间 // 用于跟踪服务是否正在运行 private val isRunning = AtomicBoolean(false) @@ -582,7 +582,7 @@ private var companionManager: BleCompanionManager? = null it.getStringExtra(APP_NAVIGATION_MODE)?.let { value -> config[APP_NAVIGATION_MODE] = value } it.getStringExtra(APP_CALLING_TOOL_TEXT)?.let { value -> config[APP_CALLING_TOOL_TEXT] = value } it.getStringExtra(APP_INSUFFICIENT_INTEGRAL_TEXT)?.let { value -> config[APP_INSUFFICIENT_INTEGRAL_TEXT] = value } - it.getIntExtra(KEY_AI_INTEGRAL, config[KEY_AI_INTEGRAL] as? Int ?: 0) + it.getIntExtra(KEY_VIP_EXPTIME, config[KEY_VIP_EXPTIME] as? Int ?: 0) it.getStringExtra("isttsinterrupt")?.let { value -> config["isttsinterrupt"] = value } // 提取 supportedLanguages 参数 @@ -647,7 +647,7 @@ private var companionManager: BleCompanionManager? = null config[APP_NAVIGATION_MODE] = getConfigString(prefs, APP_NAVIGATION_MODE, "") config[APP_CALLING_TOOL_TEXT] = getConfigString(prefs, APP_CALLING_TOOL_TEXT, "") config[APP_INSUFFICIENT_INTEGRAL_TEXT] = getConfigString(prefs, APP_INSUFFICIENT_INTEGRAL_TEXT, "") - config[KEY_AI_INTEGRAL] = getConfigInt(prefs, KEY_AI_INTEGRAL, 0) + config[KEY_VIP_EXPTIME] = getConfigInt(prefs, KEY_VIP_EXPTIME, 0) // 添加 supportedLanguages 参数处理 val supportedLanguagesStr = getConfigString(prefs, KEY_SUPPORTED_LANGUAGES, "") diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index 30308b0c3..367f450ec 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -69,6 +69,8 @@ class AgentServiceImpl: NSObject { public var insufficientIntegralText = "" // 积分不足提示 private var navigationMode = "" + //会员过期时间 + public var vipexptime = 0 private var isInitialized: Bool = false private var isRecognizing: Bool = false @@ -183,7 +185,12 @@ class AgentServiceImpl: NSObject { if let callingToolText = config["callingToolText"] as? String { self.callingToolText = callingToolText } - + if let vipexptime = config["vipexptime"] as? Int { + self.vipexptime = vipexptime + } + //打印日志输出vipexptime + os_log("Vip 过期时间 %d", log: logger, type: .info, vipexptime) + if let insufficientIntegralText = config["insufficientIntegralText"] as? String { self.insufficientIntegralText = insufficientIntegralText } @@ -343,8 +350,6 @@ class AgentServiceImpl: NSObject { sendError("初始化ChatAPI服务失败", code: "CHATAPI_INIT_ERROR") return false } - - return true } @@ -719,7 +724,7 @@ class AgentServiceImpl: NSObject { azureTtsHelper?.startspeak(sessionid: sessionid) os_log("设置回调并调用sendMessageStream", log: logger, type: .info) chatApiService.setStreamCallback(sessionid,callback) - chatApiService.sendMessageStream(sessionid,messages: messages) + chatApiService.sendMessageStream(sessionid,vipexptime: vipexptime,messages: messages) audioPlayer?.playAwaitSound() os_log("sendMessageStream调用完成", log: logger, type: .info) } diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt index bced9835b..7be026f4c 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt @@ -347,11 +347,12 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor /** * 发送消息(流式输出)- 兼容JSONArray格式 */ - fun sendMessageStream(sessionid: String,integral: Int, messages: org.json.JSONArray, callback: StreamCallback) { + fun sendMessageStream(sessionid: String,vipexptime: Int, messages: org.json.JSONArray, callback: StreamCallback) { // 1. 立即中止旧会话 abortCurrentSession() - if (integral <= 0) { - callback.onError(sessionid,2001,"积分不足") + // 判断时间是否过期:如果 vipexptime 小于当前时间戳(秒),则视为过期 + if (vipexptime <= (System.currentTimeMillis() / 1000)) { + callback.onError(sessionid,2001,"会员过期") return } currSessionId = sessionid diff --git a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift index c37e74bae..58a940cc1 100644 --- a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift +++ b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift @@ -271,12 +271,13 @@ public class ChatApiService: NSObject { throw ChatApiException("无效的响应格式") } - /// 发送消息(流式输出) - // MARK: - 流式请求实现 -public func sendMessageStream(_ sessionId: String, messages: [[String: Any]]) { +/// 发送消息(流式输出) + // MARK: - 流式请求实现 +public func sendMessageStream(_ sessionId: String,vipexptime: Int, messages: [[String: Any]]) { // 1. 立即中止旧会话 abortCurrentSession() + // 2. 创建新会话 currSessionId = sessionId @@ -289,6 +290,11 @@ public func sendMessageStream(_ sessionId: String, messages: [[String: Any]]) { getSessionCallback(sessionId)?.onError(sessionId,1000,"当前网络不可用") return } + let nowSec = Int(Date().timeIntervalSince1970) + if vipexptime <= 0 || nowSec >= vipexptime { + getSessionCallback(sessionId)?.onError(sessionId,2001,"会员已过期") + return + } // 保存当前消息和回调 currentMessages = messages @@ -400,7 +406,7 @@ public func sendMessageStream(_ sessionId: String, messages: [[String: Any]]) { self.getSessionCallback(sessionId)?.onUsage(sessionId, promptTokens, completionTokens, totalTokens) // 处理工具调用 - let hasToolCalls = await self.processToolCalls(sessionId) + let hasToolCalls = await self.processToolCalls(sessionId,vipexptime: vipexptime) if !hasToolCalls { self.getSessionCallback(sessionId)?.onComplete(sessionId) self.clearCurrentSession() @@ -444,7 +450,7 @@ private func roughTokenCount(text: String) -> Int { } /// 处理工具调用 -private func processToolCalls(_ sessionId:String) async -> Bool { +private func processToolCalls(_ sessionId:String,vipexptime: Int) async -> Bool { // 验证工具调用集合不为空 if toolCalls.isEmpty { print("[Session: \(sessionId)] 没有工具调用需要处理") @@ -563,6 +569,7 @@ private func processToolCalls(_ sessionId:String) async -> Bool { // 将结果发送回OpenAI继续对话 await self.sendFunctionCallResultInternal( sessionId: sessionId, + vipexptime: vipexptime, messages: self.currentMessages, functionCall: functionCall, functionResult: self.jsonToString(result) ?? "{}" @@ -575,6 +582,7 @@ private func processToolCalls(_ sessionId:String) async -> Bool { let errorMessage = "工具调用处理失败: \(error.localizedDescription)" await self.sendFunctionCallResultInternal( sessionId: sessionId, + vipexptime: vipexptime, messages: self.currentMessages, functionCall: functionCall, functionResult: errorMessage @@ -623,6 +631,7 @@ private func convertMapToJsonObject(_ map: [String: Any]) -> [String: Any] { /// 发送函数调用结果(内部方法) private func sendFunctionCallResultInternal( sessionId:String, + vipexptime: Int, messages: [[String: Any]], functionCall: [String: Any], functionResult: String @@ -656,7 +665,7 @@ private func convertMapToJsonObject(_ map: [String: Any]) -> [String: Any] { ]) // 重新发起对话,让AI基于工具调用结果生成回复 - sendMessageStream(sessionId,messages: fullMessages) + sendMessageStream(sessionId,vipexptime: vipexptime,messages: fullMessages) } /// 取消当前流式请求 @@ -1090,4 +1099,3 @@ private class LocalFunctionHandler: FunctionHandler { return "LOCAL_FUNCTION:\(functionName)" } } - From 591c6c8199bb65dbfa9a386170fb8c41cd68d57f Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 25 Nov 2025 19:55:47 +0800 Subject: [PATCH 072/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/ble_manager.dart | 1 + lib/data/services/meeting/meeting_task_service.dart | 2 ++ lib/data/services/pay_service.dart | 8 ++++++++ .../controllers/translation_controller.dart | 12 ++++++------ pubspec.yaml | 3 +-- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 09eb7b842..9bd8325cb 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -8,6 +8,7 @@ import 'package:get_storage/get_storage.dart'; import 'package:get/get.dart'; import 'package:ble_service/ble_service.dart'; import 'package:agent_service/agent_service.dart'; +import '../models/user_Info.dart' as userInfo; import '/data/models/appconfig_model.dart'; import '../../data/models/appconfig.dart'; diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index b17d6adf0..51b88520c 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -7,7 +7,9 @@ import 'package:http/http.dart' as http; import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; +import '../../models/meeting_usage_stats.dart'; import '../db/sqflite_api.dart'; +import '../usage_stats_service.dart'; import 'meeting_upload_service.dart'; import '../../../data/models/appconfig.dart'; import 'summary_task_service.dart'; diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index cece8bcab..7d1f92dcd 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -1,7 +1,15 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:get/get.dart'; import '/data/services/network/api.dart'; import 'package:tobias/tobias.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:in_app_purchase_android/in_app_purchase_android.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../../data/models/user_Info.dart'; import '../../modules/login/controllers/weixinLogin.dart'; diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 230a4369a..f0c9a6c3b 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -14,6 +14,7 @@ import 'package:pip/pip.dart'; import '../../../data/services/ast_service.dart'; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/music_manager.dart'; +import '../../../data/services/translation_usage_service.dart'; import '../../../data/services/volcano_translation_service.dart'; import '../../../data/services/tts_service.dart'; import '../../../data/services/language_manager.dart'; @@ -51,7 +52,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { final BluetoothManager bluetoothManager = Get.find(); final BleManager bleManager = Get.find(); final _musiceManager = Get.find(); - late final TranslationUsageService _usageService; + late final UsageStatsService _usageService; // 安卓悬浮窗管理器 late final FloatingWindowManager _floatingWindowManager; // 苹果悬浮窗管理器 @@ -1042,11 +1043,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver { await _astService.stopContinuousTranslation(); } _stopAsrActiveTracking(); - final langName = _languageManager - .getChineseNameByAsrCode( - (detectedLanguageCode.isNotEmpty - ? detectedLanguageCode - : sourceLanguageCode.value)) ?? + final langName = _languageManager.getChineseNameByAsrCode( + (detectedLanguageCode.isNotEmpty + ? detectedLanguageCode + : sourceLanguageCode.value)) ?? '未知'; _recordAsrUsageStats(langName); isRecognizing.value = false; diff --git a/pubspec.yaml b/pubspec.yaml index a6e8889d9..c2ceb54a4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_shaders: ^0.0.6 get: ^4.7.2 + in_app_purchase: ^3.2.3 json_annotation: ^4.9.0 get_storage: ^2.1.1 http: ^1.3.0 @@ -65,7 +66,6 @@ dependencies: fluwx: ^5.7.1 tobias: ^5.2.0 # 支付宝SDK url_launcher: ^6.3.1 - in_app_purchase: ^3.1.11 in_app_purchase_android: ^0.4.0+5 app_links: firebase_core: ^4.0.0 @@ -120,7 +120,6 @@ dependencies: path: local_plugins/native_plugin test: path: local_plugins/test - in_app_purchase: ^3.2.3 # 应用内购买插件 dev_dependencies: flutter_test: From bb16ff9470876efeb792630b36294c81482776cf Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 25 Nov 2025 17:43:02 +0800 Subject: [PATCH 073/177] =?UTF-8?q?refactor(views):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=98=BE=E7=A4=BA=E7=BB=84=E4=BB=B6=E4=B8=BA?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E8=A1=8C=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将积分统计卡片重构为独立的行组件,提升代码复用性和可维护性 移除冗余的积分卡片代码,统一积分显示样式 --- .../usage/views/aichat_stats_view.dart | 6 + .../usage/views/meeting_stats_view.dart | 121 ++++++---------- .../usage/views/translation_stats_view.dart | 136 +++++++----------- 3 files changed, 100 insertions(+), 163 deletions(-) diff --git a/lib/modules/usage/views/aichat_stats_view.dart b/lib/modules/usage/views/aichat_stats_view.dart index 7ac2d806b..a04fe6c44 100644 --- a/lib/modules/usage/views/aichat_stats_view.dart +++ b/lib/modules/usage/views/aichat_stats_view.dart @@ -40,6 +40,12 @@ class AiChatStatsView extends GetView { } Widget _buildBody(bool isDarkMode) { + return Column( + children: [_buildIntegralRow(isDarkMode)], + ); + } + + Widget _buildIntegralRow(bool isDarkMode) { return Obx(() { final _ = User.refreshTick.value; final u = User.instance; diff --git a/lib/modules/usage/views/meeting_stats_view.dart b/lib/modules/usage/views/meeting_stats_view.dart index de27ba356..63ea4897a 100644 --- a/lib/modules/usage/views/meeting_stats_view.dart +++ b/lib/modules/usage/views/meeting_stats_view.dart @@ -51,14 +51,13 @@ class MeetingStatsView extends GetView { Widget _buildBody(bool isDarkMode) { return Column( children: [ + _buildIntegralRow(isDarkMode), _buildTimeRangeSelector(isDarkMode), Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(16.w), child: Column( children: [ - _buildIntegralCard(isDarkMode), - SizedBox(height: 16.h), _buildOverviewCard(isDarkMode), ], ), @@ -68,6 +67,51 @@ class MeetingStatsView extends GetView { ); } + Widget _buildIntegralRow(bool isDarkMode) { + return Obx(() { + final _ = User.refreshTick.value; + final u = User.instance; + return Padding( + padding: EdgeInsets.all(16.w), + child: Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2)), + ], + ), + child: Row( + children: [ + Icon(Icons.people, color: AppColors.primary, size: 20.sp), + SizedBox(width: 8.w), + Expanded( + child: Text( + '会议积分', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), + ), + ), + Text( + '${u.meetintegral}/${u.meettotalintegral}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), + ), + ], + ), + ), + ); + }); + } + Widget _buildTimeRangeSelector(bool isDarkMode) { return Container( margin: EdgeInsets.all(16.w), @@ -212,77 +256,4 @@ class MeetingStatsView extends GetView { ], ); } - - Widget _buildIntegralCard(bool isDarkMode) { - return Container( - padding: EdgeInsets.all(16.w), - decoration: BoxDecoration( - color: isDarkMode ? AppColors.cardBackground : Colors.white, - borderRadius: BorderRadius.circular(12.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.05), - blurRadius: 10, - offset: const Offset(0, 2), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Icon(Icons.stacked_line_chart, - color: AppColors.primary, size: 20.sp), - SizedBox(width: 8.w), - Text( - '积分统计', - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ], - ), - SizedBox(height: 16.h), - Obx(() { - final _ = User.refreshTick.value; - final u = User.instance; - return _buildIntegralRow( - '会议', - '${controller.formatNumber(u.meetintegral)}/${controller.formatNumber(u.meettotalintegral)}', - Icons.people, - isDarkMode, - ); - }), - ], - ), - ); - } - - Widget _buildIntegralRow( - String label, String value, IconData icon, bool isDarkMode) { - return Row( - children: [ - Icon(icon, color: AppColors.primary, size: 18.sp), - SizedBox(width: 12.w), - Expanded( - child: Text( - label, - style: TextStyle( - fontSize: 14.sp, - color: isDarkMode ? Colors.white : Colors.black), - ), - ), - Text( - value, - style: TextStyle( - fontSize: 14.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black), - ), - ], - ); - } } diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index 4c98c9493..a966284c4 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -89,14 +89,15 @@ class TranslationStatsView extends GetView { Widget _buildBody(bool isDarkMode) { return Column( children: [ + _buildIntegralRow(isDarkMode), _buildTimeRangeSelector(isDarkMode), Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(16.w), child: Column( children: [ - _buildIntegralCard(isDarkMode), - SizedBox(height: 16.h), + // _buildIntegralCard(isDarkMode), + // SizedBox(height: 16.h), if (controller.selectedTabIndex.value == 0) _buildRealtimeStatsCard(isDarkMode), SizedBox(height: 16.h), @@ -115,6 +116,51 @@ class TranslationStatsView extends GetView { ); } + Widget _buildIntegralRow(bool isDarkMode) { + return Obx(() { + final _ = User.refreshTick.value; + final u = User.instance; + return Padding( + padding: EdgeInsets.all(16.w), + child: Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2)), + ], + ), + child: Row( + children: [ + Icon(Icons.translate, color: AppColors.primary, size: 20.sp), + SizedBox(width: 8.w), + Expanded( + child: Text( + '翻译积分', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), + ), + ), + Text( + '${u.tradeintegral}/${u.tradetotalintegral}', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black), + ), + ], + ), + ), + ); + }); + } + Widget _buildTimeRangeSelector(bool isDarkMode) { return Container( margin: EdgeInsets.all(16.w), @@ -424,92 +470,6 @@ class TranslationStatsView extends GetView { ); } - Widget _buildIntegralCard(bool isDarkMode) { - return Container( - padding: EdgeInsets.all(16.w), - decoration: BoxDecoration( - color: isDarkMode ? AppColors.cardBackground : Colors.white, - borderRadius: BorderRadius.circular(12.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.05), - blurRadius: 10, - offset: const Offset(0, 2), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Icon( - Icons.stacked_line_chart, - color: AppColors.primary, - size: 20.sp, - ), - SizedBox(width: 8.w), - Text( - '积分统计', - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ], - ), - SizedBox(height: 16.h), - Obx(() { - final _ = User.refreshTick.value; - final u = User.instance; - return Column( - children: [ - _buildIntegralRow( - '翻译', - '${controller.formatNumber(u.tradeintegral)}/${controller.formatNumber(u.tradetotalintegral)}', - Icons.translate, - isDarkMode, - ), - ], - ); - }), - ], - ), - ); - } - - Widget _buildIntegralRow( - String label, String value, IconData icon, bool isDarkMode) { - return Row( - children: [ - Icon( - icon, - color: AppColors.primary, - size: 18.sp, - ), - SizedBox(width: 12.w), - Expanded( - child: Text( - label, - style: TextStyle( - fontSize: 14.sp, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - Text( - value, - style: TextStyle( - fontSize: 14.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ], - ); - } - Widget _buildApiCallRow( String label, int count, IconData icon, bool isDarkMode) { return Row( From 5ffd96fb68ec7d043521ef9e34d06b566d612d9f Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 25 Nov 2025 19:30:00 +0800 Subject: [PATCH 074/177] =?UTF-8?q?feat(usage):=20=E6=B7=BB=E5=8A=A0AI?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E7=BB=9F=E8=AE=A1=E8=A7=86=E5=9B=BE=E7=9A=84?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现通过快速点击翻译统计标题三次来切换显示/隐藏AI聊天统计视图 修改底部导航栏根据显示状态动态调整项目 --- .../translation_stats_controller.dart | 19 +++++++++++ .../usage/controllers/usage_controller.dart | 29 ++++++++++++++--- .../usage/views/translation_stats_view.dart | 15 +++++---- lib/modules/usage/views/usage_view.dart | 32 ++++++++++--------- 4 files changed, 69 insertions(+), 26 deletions(-) diff --git a/lib/modules/usage/controllers/translation_stats_controller.dart b/lib/modules/usage/controllers/translation_stats_controller.dart index 7015537aa..099138941 100644 --- a/lib/modules/usage/controllers/translation_stats_controller.dart +++ b/lib/modules/usage/controllers/translation_stats_controller.dart @@ -2,6 +2,7 @@ import 'package:get/get.dart'; import '../../../data/services/usage_stats_service.dart'; import '../../../data/models/translation_usage_stats.dart'; import '../../../core/utils/logger.dart'; +import 'usage_controller.dart'; class TranslationStatsController extends GetxController { final UsageStatsService _usageService = Get.find(); @@ -297,6 +298,24 @@ class TranslationStatsController extends GetxController { return '¥${cost.toStringAsFixed(2)}'; } + int _titleTapCount = 0; + int _lastTitleTapTs = 0; + + void onTitleTap() { + final now = DateTime.now().millisecondsSinceEpoch; + if (now - _lastTitleTapTs <= 800) { + _titleTapCount++; + } else { + _titleTapCount = 1; + } + _lastTitleTapTs = now; + if (_titleTapCount >= 3) { + _titleTapCount = 0; + final uc = Get.find(); + uc.toggleAiChat(!uc.showAiChat.value); + } + } + String formatNumber(int number) { if (number < 1000) { return number.toString(); diff --git a/lib/modules/usage/controllers/usage_controller.dart b/lib/modules/usage/controllers/usage_controller.dart index d8ecbbecd..7407d5e09 100644 --- a/lib/modules/usage/controllers/usage_controller.dart +++ b/lib/modules/usage/controllers/usage_controller.dart @@ -8,15 +8,34 @@ class UsageController extends GetxController { late PageController pageController; final RxInt pageIndex = 0.obs; - final List pageList = const [ - AiChatStatsView(), - TranslationStatsView(), - MeetingStatsView(), - ]; + final RxBool showAiChat = false.obs; + + List get pageList => showAiChat.value + ? const [ + AiChatStatsView(), + TranslationStatsView(), + MeetingStatsView(), + ] + : const [ + TranslationStatsView(), + MeetingStatsView(), + ]; @override void onInit() { super.onInit(); pageController = PageController(initialPage: 0); } + + void toggleAiChat(bool enable) { + if (showAiChat.value == enable) return; + showAiChat.value = enable; + final int maxIndex = pageList.length - 1; + if (pageIndex.value > maxIndex) { + pageIndex.value = maxIndex; + pageController.jumpToPage(maxIndex); + } else { + pageController.jumpToPage(pageIndex.value); + } + } } diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index a966284c4..6fc3c706c 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -33,12 +33,15 @@ class TranslationStatsView extends GetView { ), backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, - title: Text( - '翻译统计', - style: TextStyle( - fontSize: 17.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, + title: GestureDetector( + onTap: controller.onTitleTap, + child: Text( + '翻译统计', + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), ), ), centerTitle: true, diff --git a/lib/modules/usage/views/usage_view.dart b/lib/modules/usage/views/usage_view.dart index 26531868f..814b64ad3 100644 --- a/lib/modules/usage/views/usage_view.dart +++ b/lib/modules/usage/views/usage_view.dart @@ -7,13 +7,6 @@ import '../controllers/usage_controller.dart'; class UsageView extends GetView { const UsageView({super.key}); - // 1. 将导航栏配置提取为常量,提高可维护性 - static const _navItems = [ - _NavItem(Icons.chat_bubble_outline, 'AI chat'), - _NavItem(Icons.translate, 'interpretation'), - _NavItem(Icons.people, 'meeting'), - ]; - // 2. 颜色配置集中管理 Color _getBgColor(bool isDark) => isDark ? Colors.black : const Color(0xFFF9FAFB); @@ -28,11 +21,11 @@ class UsageView extends GetView { return Scaffold( backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], - body: PageView( - physics: const NeverScrollableScrollPhysics(), - controller: controller.pageController, - children: controller.pageList, - ), + body: Obx(() => PageView( + physics: const NeverScrollableScrollPhysics(), + controller: controller.pageController, + children: controller.pageList, + )), bottomNavigationBar: Obx( () { final currentIndex = controller.pageIndex.value; @@ -48,7 +41,16 @@ class UsageView extends GetView { // 3. 添加安全区域适配(针对刘海屏) child: BottomNavigationBar( // 4. 使用生成的导航项 - items: _navItems + items: (controller.showAiChat.value + ? const [ + _NavItem(Icons.chat_bubble_outline, 'AI chat'), + _NavItem(Icons.translate, 'interpretation'), + _NavItem(Icons.people, 'meeting'), + ] + : const [ + _NavItem(Icons.translate, 'interpretation'), + _NavItem(Icons.people, 'meeting'), + ]) .map((item) => BottomNavigationBarItem( icon: Icon(item.icon), activeIcon: Icon(item.icon, @@ -70,8 +72,8 @@ class UsageView extends GetView { type: BottomNavigationBarType.fixed, // 7. 增加图标和文字的间距 iconSize: 22.w, // 响应式图标尺寸 - selectedLabelStyle: TextStyle(height: 1.5), // 文字垂直间距 - unselectedLabelStyle: TextStyle(height: 1.5), + selectedLabelStyle: TextStyle(height: 1.5.sp), // 文字垂直间距 + unselectedLabelStyle: TextStyle(height: 1.5.sp), ), ); }, From 7e93d968e46ffc7bbbc7ad4a9336dda255527310 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 25 Nov 2025 20:35:13 +0800 Subject: [PATCH 075/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=20=E5=A5=96=E5=8A=B1=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/pairing_controller.dart | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 19d7714d2..03d78ce80 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1048,6 +1048,32 @@ class PairingController extends GetxController with WidgetsBindingObserver { _transition(PairingState.verifying); _verifyDevice(_currentClassicDevice!); } + /* + message UserBindDeviceResp { + DBUserDivice device = 1; //绑定的耳机信息 + bool isgiveaway = 2; //@go_tags(`gorm:"isgiveaway" json:"isgiveaway"`) 是否是第一次绑定 + int32 viplv = 3; //@go_tags(`gorm:"viplv:50" json:"viplv"`) viplv + int64 vipexptime = 4; //@go_tags(`gorm:"vipexptime" json:"vipexptime"`) 会员过期时间 + int64 aichatintegral = 5; //@go_tags(`gorm:"aichatintegral" json:"aichatintegral"`) ai聊天积分 + int64 aichattotalintegral = 6; //@go_tags(`gorm:"aichattotalintegral" json:"aichattotalintegral"`) ai聊天总积分 + int64 tradeintegral = 7; //@go_tags(`gorm:"tradeintegral" json:"tradeintegral"`) 翻译积分 + int64 tradetotalintegral = 8; //@go_tags(`gorm:"tradetotalintegral" json:"tradetotalintegral"`) 翻译总积分 + int64 meetintegral = 9; //@go_tags(`gorm:"meettotalintegral" json:"meettotalintegral"`) 会议积分 + int64 meettotalintegral = 10; //@go_tags(`gorm:"meettotalintegral" json:"meettotalintegral"`) 会议总积分 + } + */ + // 需要读取返回的数据判断 isgiveaway 是否 为 true,是的话 需要读取 后续的数据 更新到用户数据上面去 + if (response['isgiveaway'] == true) { + User.instance.viplv = response['viplv'] ?? 0; + User.instance.vipexptime = response['vipexptime'] ?? 0; + User.instance.aichatintegral = response['aichatintegral'] ?? 0; + User.instance.aichattotalintegral = + response['aichattotalintegral'] ?? 0; + User.instance.tradeintegral = response['tradeintegral'] ?? 0; + User.instance.tradetotalintegral = response['tradetotalintegral'] ?? 0; + User.instance.meetintegral = response['meetintegral'] ?? 0; + User.instance.meettotalintegral = response['meettotalintegral'] ?? 0; + } return; } else { Logger.e(_tag, '绑定设备失败!'); From 22b1e0423e8fb1a66c19c5d5d35266d4c6327707 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:22:06 +0800 Subject: [PATCH 076/177] =?UTF-8?q?feat(=E4=BC=9A=E8=AE=AE=E5=8A=A9?= =?UTF-8?q?=E6=89=8B):=20=E6=B7=BB=E5=8A=A0=E6=9E=81=E9=80=9F=E7=89=88?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB=E6=9C=8D=E5=8A=A1=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 MeetingTaskService2 作为火山引擎极速版语音识别服务实现 修改相关控制器和服务以支持双版本语音识别服务切换 根据音频时长自动选择标准版或极速版服务 --- lib/core/bindings/initial_binding.dart | 3 + .../meeting/meeting_task_service.dart | 1 + .../meeting/meeting_task_service2.dart | 1155 +++++++++++++++++ .../meeting/meeting_upload_service.dart | 39 +- .../meeting/summary_task_service.dart | 27 + .../meeting_details_controller.dart | 46 +- .../controllers/meeting_home_controller.dart | 3 + 7 files changed, 1261 insertions(+), 13 deletions(-) create mode 100644 lib/data/services/meeting/meeting_task_service2.dart diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index e25234505..3ea94689f 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -11,6 +11,7 @@ import '../../../data/services/ast_service.dart'; import '../../../data/services/speech_impl/azure_ast_service.dart'; import 'package:get/get.dart'; import '../../data/services/meeting/meeting_task_service.dart'; +import '../../data/services/meeting/meeting_task_service2.dart'; import '../../data/services/meeting/meeting_upload_service.dart'; import '../../data/services/novice_guide_service.dart'; import '../../data/services/speech_factory.dart'; @@ -70,6 +71,8 @@ class InitialBinding extends Bindings { // 会议助手任务服务 Get.lazyPut(() => MeetingTaskService(), fenix: true); + // 会议助手任务服务(极速识别版) + Get.lazyPut(() => MeetingTaskService2(), fenix: true); // 会议助手总结任务服务 Get.lazyPut(() => SummaryTaskService(), fenix: true); diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 7b5014a6e..576668aa0 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -12,6 +12,7 @@ import '../../../data/models/appconfig.dart'; import 'summary_task_service.dart'; ///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。 +///火山引擎录音文件识别大模型-标准版 class MeetingTaskService extends GetxService { final GetStorage _storage = GetStorage(); diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart new file mode 100644 index 000000000..e04681dff --- /dev/null +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -0,0 +1,1155 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:http/http.dart' as http; + +import '../db/sqflite_api.dart'; +import '../../../data/models/appconfig.dart'; +import '../../../core/utils/logger.dart'; +import '../../../core/utils/synchrodata.dart'; +import '../deapsound_ai_service.dart'; +import 'meeting_upload_service.dart'; +import 'meeting_task_service.dart'; +import 'summary_task_service.dart'; + +//火山引擎录音文件识别大模型-极速版 +class MeetingTaskService2 extends GetxService { + final GetStorage _storage = GetStorage(); + + MeetingUploadService get _uploadService => Get.find(); + SummaryTaskService get _summaryTaskService => Get.find(); + + List _taskList = []; + RxList taskFinishList = [].obs; + + bool _isTask = false; + + String _systemPrompt = ''; + String _userId = ''; + + late final String _appid; + late final String _token; + late final String _serviceUrl; + + int meetingId = 0; + RxInt tasktype = 1.obs; + List textList = []; + String summary = ''; + String overview = ''; + + @override + void onInit() { + super.onInit(); + _getAgent(); + _getTaskList(); + } + + void _getAgent() async { + Map userInfo = _storage.read("user_info"); + _userId = userInfo['user']['uid']; + _systemPrompt = AppConfig.isInitialized() + ? (AppConfig.agentsystemPrompt("meet_assistant") ?? '') + : ''; + final String base = AppConfig.env('VOLC_OPENSPEECH_BASE_URL_BIGMODEL') ?? + 'https://openspeech.bytedance.com/api/v3/auc/bigmodel'; + _appid = AppConfig.env('VOLC_OPENSPEECH_APP_ID') ?? ''; + _token = AppConfig.env('VOLC_OPENSPEECH_ACCESS_TOKEN') ?? ''; + _serviceUrl = + base.endsWith('/recognize/flash') ? base : (base + '/recognize/flash'); + } + + void _getTaskList() { + _taskList = _storage.read("meeting_task_list_v2") ?? []; + taskFinishList.value = _storage.read("meeting_task_finish_list_v2") ?? []; + _executeTask(); + } + + Future addTask( + int id, + String audiourl, { + bool isSpeaker = false, + String language = '', + String targetLanguage = '', + String prompt = '', + String outline = '', + }) async { + if (audiourl.isEmpty) { + Map uploadData = _uploadService.uploadList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (uploadData.isNotEmpty) { + if (uploadData['audiourl'].isEmpty) { + uploadData['isTask'] = true; + uploadData['template'] = { + 'isSpeaker': isSpeaker, + 'language': language, + 'targetLanguage': targetLanguage, + 'prompt': prompt, + 'outline': outline, + }; + _storage.write("meeting_upload_list", _uploadService.uploadList); + } else { + await addTaskList( + id, + uploadData['audiourl'], + isSpeaker: isSpeaker, + language: language, + targetLanguage: targetLanguage, + prompt: prompt, + outline: outline, + ); + } + } + } else { + await addTaskList( + id, + audiourl, + isSpeaker: isSpeaker, + language: language, + targetLanguage: targetLanguage, + prompt: prompt, + outline: outline, + ); + } + } + + Future addTaskList( + int id, + String audiourl, { + bool isSpeaker = false, + String language = '', + String targetLanguage = '', + String prompt = '', + String outline = '', + }) async { + await SqfliteApi.editMeeting(id, {'tasktype': 1}); + _taskList.add({ + 'id': id, + 'audiourl': audiourl, + 'tasktype': 1, + 'template': { + 'isSpeaker': isSpeaker, + 'language': language, + 'targetLanguage': targetLanguage, + 'prompt': prompt, + 'outline': outline, + }, + }); + taskFinishList.add({'id': id, 'tasktype': 1}); + _storage.write("meeting_task_list_v2", _taskList); + _storage.write("meeting_task_finish_list_v2", taskFinishList); + try { + final s1 = Get.find(); + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 3; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + _executeTask(); + } + + void _executeTask() async { + if (_isTask) return; + _isTask = true; + Logger.debug('Starting task execution. Task count: ${_taskList.length}'); + + while (_taskList.isNotEmpty) { + Logger.debug('Task execution loop. Remaining tasks: ${_taskList.length}'); + await Future.delayed(const Duration(seconds: 2)); + + // 创建任务列表的副本,避免在迭代过程中修改原列表 + List tasksCopy = List.from(_taskList); + + for (var element in tasksCopy) { + Logger.debug( + 'Processing task: ${element['id']} with audio: ${element['audiourl']}'); + + // 检查任务是否仍在列表中(可能已被其他地方移除) + if (_taskList.any((task) => task['id'] == element['id'])) { + try { + await _fileRecognize(element); + } catch (e) { + Logger.error('Failed to process task ${element['id']}: $e'); + // 确保失败的任务被移除,避免无限循环 + _taskList.removeWhere((task) => task['id'] == element['id']); + _storage.write("meeting_task_list_v2", _taskList); + + // 更新任务状态为失败 + await SqfliteApi.editMeeting(element['id'], {'tasktype': 0}); + } + } else { + Logger.debug( + 'Task ${element['id']} was already removed from task list'); + } + } + + // 如果没有任务被处理,避免无限循环 + if (_taskList.length == tasksCopy.length) { + Logger.warning( + 'No tasks were processed in this iteration. Breaking loop to avoid infinite execution.'); + break; + } + } + + _isTask = false; + Logger.debug( + 'Task execution completed. Remaining tasks: ${_taskList.length}'); + } + + void removeTask(int id, {bool isDeleteTask = false}) { + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + if (isDeleteTask || taskFinishData['tasktype'] >= 3) { + taskFinishList.remove(taskFinishData); + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } + } + if (isDeleteTask) { + _taskList.removeWhere((element) => element['id'] == id); + _storage.write("meeting_task_list_v2", _taskList); + } + } + + Future> _recognizeAudio( + String audiourl, { + bool enableSpeakerInfo = true, + String language = '', + }) async { + String requestId = DateTime.now().millisecondsSinceEpoch.toString(); + + // 为每次请求生成新的headers - 适配大模型极速版API + Map requestHeaders = { + 'X-Api-App-Key': _appid, + 'X-Api-Access-Key': _token, + 'X-Api-Resource-Id': 'volc.bigasr.auc_turbo', + 'X-Api-Request-Id': requestId, + 'X-Api-Sequence': '-1', + 'Content-Type': 'application/json', + }; + + // 使用大模型极速版API的新请求格式 + final Map requestPayload = { + "user": {"uid": _appid}, + "audio": {"url": audiourl}, + "request": { + "model_name": "bigmodel", + "enable_itn": true, + "enable_punc": true, + "enable_ddc": true, + "enable_speaker_info": enableSpeakerInfo, + "word_info": 1, + "show_utterances": true + } + }; + + if (language.isNotEmpty) { + requestPayload['request']['language'] = language; + } + + final String requestBody = jsonEncode(requestPayload); + + try { + // 记录请求详情 + Logger.debug('API Request URL: $_serviceUrl'); + Logger.debug('API Request Headers: $requestHeaders'); + Logger.debug('API Request Body: $requestBody'); + + final response = await http.post( + Uri.parse(_serviceUrl), + headers: requestHeaders, + body: requestBody, + ); + + Logger.debug('API Response Status: ${response.statusCode}'); + Logger.debug('API Response Headers: ${response.headers}'); + + if (response.statusCode != 200) { + Logger.error( + 'Recognition failed with status: ${response.statusCode}, body: ${response.body}'); + throw Exception( + 'Recognition failed with status: ${response.statusCode}'); + } + + final respDic = jsonDecode(response.body); + Logger.debug('Recognition response: $respDic'); + + // 检查响应中是否包含资源相关信息 + if (respDic.containsKey('resource_id') || respDic.containsKey('model')) { + Logger.debug( + 'Resource verification - Resource ID used: volc.bigasr.auc_turbo'); + Logger.debug( + 'Response resource info: ${respDic['resource_id'] ?? respDic['model'] ?? 'Not specified in response'}'); + } + + return respDic; + } catch (e) { + Logger.error('Recognition error: ${e.toString()}'); + rethrow; + } + } + + String _getFileType(String path) { + List array = path.split('.'); + return array[array.length - 1]; + } + + int _parseTime(dynamic timeValue) { + if (timeValue == null) return 0; + + if (timeValue is int) { + return timeValue; + } else if (timeValue is double) { + return timeValue.round(); + } else if (timeValue is String) { + try { + double parsed = double.parse(timeValue); + return parsed.round(); + } catch (e) { + Logger.error('Failed to parse time value: $timeValue'); + return 0; + } + } else { + Logger.error( + 'Unknown time value type: ${timeValue.runtimeType}, value: $timeValue'); + return 0; + } + } + + Future _fileRecognize(Map item) async { + try { + Logger.debug('Starting recognition for audio: ${item['audiourl']}'); + // 识别语言选取:若设置了目标输出语言且与录音语言一致,优先让ASR自动识别,避免错配 + final String tplLang = + (((item['template'] ?? {})['language']) ?? '').toString(); + final String tplTarget = + (((item['template'] ?? {})['targetLanguage']) ?? '').toString(); + String asrLanguage = tplLang; + if (tplTarget.isNotEmpty && tplTarget == tplLang) { + asrLanguage = ''; + } + var respDic = await _recognizeAudio( + item['audiourl'], + enableSpeakerInfo: + (((item['template'] ?? {})['isSpeaker']) ?? false) as bool, + language: asrLanguage, + ); + + Logger.debug('Full API response structure: ${respDic.toString()}'); + Logger.debug('Response keys: ${respDic.keys.toList()}'); + + // 检查响应格式并提取utterances + List utterances = []; + + // 检查不同可能的响应格式 + if (respDic['result'] != null && + respDic['result']['utterances'] != null) { + utterances = respDic['result']['utterances']; + Logger.debug( + 'Found utterances in result.utterances: ${utterances.length} items'); + } else if (respDic['resp'] != null && + respDic['resp']['utterances'] != null) { + utterances = respDic['resp']['utterances']; + Logger.debug( + 'Found utterances in resp.utterances: ${utterances.length} items'); + } else if (respDic['utterances'] != null) { + utterances = respDic['utterances']; + Logger.debug( + 'Found utterances in root.utterances: ${utterances.length} items'); + } else if (respDic['data'] != null && + respDic['data']['utterances'] != null) { + utterances = respDic['data']['utterances']; + Logger.debug( + 'Found utterances in data.utterances: ${utterances.length} items'); + } else if (respDic['response'] != null && + respDic['response']['utterances'] != null) { + utterances = respDic['response']['utterances']; + Logger.debug( + 'Found utterances in response.utterances: ${utterances.length} items'); + } else { + // 检查是否有错误信息 + if (respDic['error'] != null) { + Logger.error('API returned error: ${respDic['error']}'); + } else if (respDic['message'] != null) { + Logger.error('API returned message: ${respDic['message']}'); + } else { + Logger.error( + 'Unknown response format. Available keys: ${respDic.keys.toList()}'); + // 尝试查找任何包含文本的字段 + respDic.forEach((key, value) { + Logger.debug( + 'Key: $key, Value type: ${value.runtimeType}, Value: $value'); + }); + } + } + + if (utterances.isNotEmpty) { + Logger.debug('Processing ${utterances.length} utterances'); + await _addTextList(item['id'], utterances, item['template']); + // 从任务列表中移除已完成的任务 + _taskList.removeWhere((element) => element['id'] == item['id']); + _storage.write("meeting_task_list_v2", _taskList); + Logger.debug( + 'Recognition completed successfully for item ${item['id']}'); + + // 更新UI状态 - 如果是当前会议,触发UI更新 + if (item['id'] == meetingId) { + tasktype.value = 2; // 转写完成,进入分析阶段 + } + } else { + Logger.error( + "No utterances found in response. Full response: $respDic"); + print( + '🔥🔥🔥 NO UTTERANCES FOUND - STARTING SILENT AUDIO CHECK 🔥🔥🔥'); + print('=== DEBUGGING SILENT AUDIO DETECTION ==='); + print('Response keys: ${respDic.keys.toList()}'); + print('Response code: ${respDic['code']}'); + print('Response message: ${respDic['message']}'); + + // 检查是否为无声音频 + bool isSilentAudio = _checkIfSilentAudio(respDic); + print('Silent audio detection result: $isSilentAudio'); + + if (isSilentAudio) { + print('=== SILENT AUDIO DETECTED - SETTING TASKTYPE TO -1 ==='); + // 设置无声音频状态 (使用特殊值 -1) + await SqfliteApi.editMeeting(item['id'], {'tasktype': -1}); + if (item['id'] == meetingId) { + print('Setting tasktype.value to -1 for current meeting'); + tasktype.value = -1; // 无声音频 + } + + // 更新taskFinishList中的状态 + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = -1; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + try { + final s1 = Get.find(); + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 0; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + try { + final s1 = Get.find(); + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = -1; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + } else { + Logger.error('Recognition failed for unknown reason'); + // 识别失败,更新数据库状态为失败 + await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); + if (item['id'] == meetingId) { + tasktype.value = 0; // 识别失败 + } + + // 更新taskFinishList中的状态 + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 0; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } + + // 从任务列表中移除 + _taskList.removeWhere((element) => element['id'] == item['id']); + _storage.write("meeting_task_list_v2", _taskList); + } + } catch (e) { + Logger.error('Error occurred in _fileRecognize: ${e.toString()}'); + Logger.error('Stack trace: ${StackTrace.current}'); + + // 更新数据库状态为失败 + try { + await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); + } catch (dbError) { + Logger.error('Failed to update meeting status in database: $dbError'); + } + + // 出错时也要从任务列表中移除,避免无限重试 + _taskList.removeWhere((element) => element['id'] == item['id']); + _storage.write("meeting_task_list_v2", _taskList); + + // 更新UI状态 - 如果是当前会议,显示错误状态 + if (item['id'] == meetingId) { + tasktype.value = 0; // 识别失败 + } + } + } + + /// 检查是否为无声音频 + bool _checkIfSilentAudio(Map response) { + print('Checking if silent audio, response: ${response.toString()}'); + + // 检查API响应中的错误信息或状态码 + // 根据实际API响应格式调整检测逻辑 + + // 检查是否有错误码表示无声音频 + if (response['code'] != null) { + int code = response['code']; + print('Found response code: $code'); + // 常见的无声音频错误码 + if (code == 40001 || + code == 40002 || + code == 40003 || + code == 50001 || + code == 50002 || + code == 50003) { + print('Detected silent audio by error code: $code'); + return true; + } + } + + // 检查错误消息 + if (response['message'] != null) { + String message = response['message'].toString().toLowerCase(); + print('Found response message: $message'); + if (message.contains('silent') || + message.contains('no audio') || + message.contains('无声') || + message.contains('静音') || + message.contains('empty audio') || + message.contains('no speech') || + message.contains('audio too short') || + message.contains('insufficient audio')) { + print('Detected silent audio by message: $message'); + return true; + } + } + + // 检查result中的错误信息 + if (response['result'] != null && response['result']['error'] != null) { + String error = response['result']['error'].toString().toLowerCase(); + print('Found result error: $error'); + if (error.contains('silent') || + error.contains('no audio') || + error.contains('无声') || + error.contains('静音') || + error.contains('empty audio') || + error.contains('no speech') || + error.contains('audio too short')) { + print('Detected silent audio by result error: $error'); + return true; + } + } + + // 检查是否有音频时长信息且时长为0或极短 + if (response['result'] != null && response['result']['duration'] != null) { + double duration = (response['result']['duration'] as num).toDouble(); + print('Found audio duration: $duration seconds'); + if (duration <= 0.5) { + // 音频时长小于0.5秒认为是无声 + print('Detected silent audio by short duration: $duration'); + return true; + } + } + + // 检查utterances是否为空且没有其他明确的成功标识 + bool hasUtterances = false; + if (response['result'] != null && + response['result']['utterances'] != null) { + hasUtterances = (response['result']['utterances'] as List).isNotEmpty; + } else if (response['resp'] != null && + response['resp']['utterances'] != null) { + hasUtterances = (response['resp']['utterances'] as List).isNotEmpty; + } else if (response['utterances'] != null) { + hasUtterances = (response['utterances'] as List).isNotEmpty; + } else if (response['data'] != null && + response['data']['utterances'] != null) { + hasUtterances = (response['data']['utterances'] as List).isNotEmpty; + } else if (response['response'] != null && + response['response']['utterances'] != null) { + hasUtterances = (response['response']['utterances'] as List).isNotEmpty; + } + + // 检查文本内容是否为空 + String textContent = ''; + if (response['result'] != null && response['result']['text'] != null) { + textContent = response['result']['text'].toString().trim(); + } else if (response['text'] != null) { + textContent = response['text'].toString().trim(); + } else if (response['data'] != null && response['data']['text'] != null) { + textContent = response['data']['text'].toString().trim(); + } + + // 如果文本内容为空且音频时长大于1秒,很可能是无声音频 + if (textContent.isEmpty) { + double audioDuration = 0; + if (response['audio_info'] != null && + response['audio_info']['duration'] != null) { + audioDuration = (response['audio_info']['duration'] as num).toDouble() / + 1000; // 转换为秒 + } else if (response['result'] != null && + response['result']['additions'] != null && + response['result']['additions']['duration'] != null) { + audioDuration = + (response['result']['additions']['duration'] as num).toDouble() / + 1000; // 转换为秒 + } + + print('Found empty text content, audio duration: $audioDuration seconds'); + if (audioDuration > 1.0) { + // 音频时长大于1秒但没有文本内容,认为是无声音频 + print('Detected silent audio: empty text with sufficient duration'); + return true; + } + } + + // 如果没有utterances且响应状态正常,可能是无声音频 + if (!hasUtterances) { + // 检查是否有明确的成功状态码 + bool hasSuccessCode = false; + if (response['code'] != null) { + int code = response['code']; + hasSuccessCode = (code == 0 || code == 200); + } + + // 如果有成功状态码但没有utterances,很可能是无声音频 + if (hasSuccessCode) { + print('Detected silent audio: success code but no utterances'); + return true; + } + } + + print('Not detected as silent audio'); + return false; + } + + Future _addTextList(int id, List utterances, + [Map? templateData]) async { + Logger.debug('Processing ${utterances.length} utterances for meeting $id'); + String text = ''; + String personnel = ''; + List> list = []; + + for (int i = 0; i < utterances.length; i++) { + var element = utterances[i]; + Logger.debug('Processing utterance $i: ${element.toString()}'); + + String speaker = ''; + String content = ''; + int startTime = 0; + int endTime = 0; + + // 提取说话人信息 - 检查多种可能的字段名 + if (element['additions'] != null && element['additions'].isNotEmpty) { + if (element['additions']['speaker'] != null) { + speaker = 'Speaker ${element['additions']['speaker']}'; + } + } else if (element['speaker'] != null) { + speaker = 'Speaker ${element['speaker']}'; + } else if (element['speaker_id'] != null) { + speaker = 'Speaker ${element['speaker_id']}'; + } + + // 提取文本内容 - 检查多种可能的字段名 + if (element['text'] != null) { + content = element['text'].toString(); + } else if (element['content'] != null) { + content = element['content'].toString(); + } else if (element['transcript'] != null) { + content = element['transcript'].toString(); + } else { + Logger.error('No text content found in utterance: $element'); + continue; + } + + // 提取时间信息 - 检查多种可能的字段名和格式 + if (element['start_time'] != null) { + startTime = _parseTime(element['start_time']); + } else if (element['startTime'] != null) { + startTime = _parseTime(element['startTime']); + } else if (element['begin'] != null) { + startTime = _parseTime(element['begin']); + } + + if (element['end_time'] != null) { + endTime = _parseTime(element['end_time']); + } else if (element['endTime'] != null) { + endTime = _parseTime(element['endTime']); + } else if (element['end'] != null) { + endTime = _parseTime(element['end']); + } + + if (speaker.isNotEmpty) { + text += '[$speaker]: '; + if (!personnel.contains(speaker)) { + personnel += '[$speaker] '; + } + } + + list.add({ + 'meetingid': id, + 'content': content, + 'starttime': startTime, + 'endtime': endTime, + 'speaker': speaker, + }); + text += '$content\n'; + + Logger.debug( + 'Added utterance: speaker=$speaker, content=$content, start=$startTime, end=$endTime'); + } + + Logger.debug('Total processed utterances: ${list.length}'); + var result = await SqfliteApi.insertMeetingSpeaker(list); + if (result != null) { + // 初始用于总结/概览的文本,先用原始拼接文本作为默认值 + String summarySourceText = text; + // 根据目标语言决定是否需要翻译文本列表 + final String targetLanguage = + ((templateData?['targetLanguage']) ?? '').toString(); + final String sourceLanguage = + ((templateData?['language']) ?? '').toString(); + bool needTranslate = false; + if (targetLanguage.isNotEmpty) { + // 若未指定录音语言,默认认为需要翻译;否则当目标语言与录音语言主码不同则翻译 + if (sourceLanguage.isEmpty) { + needTranslate = true; + } else { + String srcPrefix = sourceLanguage.toLowerCase().substring(0, 2); + String tgtPrefix = targetLanguage.toLowerCase().substring(0, 2); + needTranslate = srcPrefix != tgtPrefix; + } + } + if (needTranslate) { + try { + // 保持在“正在转写”状态,先进行翻译为目标语言 + await _translateTextList(id, targetLanguage); + } catch (e) { + Logger.error('Translate transcript failed: ${e.toString()}'); + } + // 翻译完成后再写入 personnel、设置已完成并刷新 UI + await SqfliteApi.editMeeting( + id, {'tasktype': 2, 'personnel': personnel}); + List speakerList = await SqfliteApi.getMeetingSpeaker(id); + List newSpeakerList = List.from(speakerList); + Synchrodata.saveOperationRecord('update', { + 'original': jsonEncode(newSpeakerList), + 'id': id, + }); + if (id == meetingId) { + textList = newSpeakerList; + tasktype.value = 2; + } + try { + final s1 = Get.find(); + if (id == s1.meetingId) { + s1.textList = newSpeakerList; + s1.tasktype.value = 2; + } + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 2; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + try { + final s1 = Get.find(); + if (id == s1.meetingId) { + s1.textList = newSpeakerList; + s1.tasktype.value = 2; + } + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 2; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + // 用最新(已翻译)的文本重建总结/概览输入 + summarySourceText = ''; + for (var element in newSpeakerList) { + final String spk = (element['speaker'] ?? '').toString(); + final String cnt = (element['content'] ?? '').toString(); + if (spk.isNotEmpty) { + summarySourceText += '[$spk]: '; + } + summarySourceText += '$cnt\n'; + } + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 2; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } else { + // 原有中文直出流程 + await SqfliteApi.editMeeting( + id, {'tasktype': 2, 'personnel': personnel}); + List speakerList = await SqfliteApi.getMeetingSpeaker(id); + List newSpeakerList = List.from(speakerList); + Synchrodata.saveOperationRecord('update', { + 'original': jsonEncode(newSpeakerList), + 'id': id, + }); + if (id == meetingId) { + textList = newSpeakerList; + tasktype.value = 2; + } + // 仍使用最新DB中的文本构建总结/概览输入,避免与原始拼接文本不一致 + summarySourceText = ''; + for (var element in newSpeakerList) { + final String spk = (element['speaker'] ?? '').toString(); + final String cnt = (element['content'] ?? '').toString(); + if (spk.isNotEmpty) { + summarySourceText += '[$spk]: '; + } + summarySourceText += '$cnt\n'; + } + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 2; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } + // 使用统一的总结服务生成概览与总结 + final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); + final String tplOutline = ((templateData?['outline']) ?? '').toString(); + final String outCode = (((templateData?['targetLanguage']) ?? (templateData?['language']) ?? '') as String).toLowerCase(); + String langDesc = ''; + if (outCode.startsWith('zh')) { + langDesc = '中文'; + } else if (outCode.startsWith('en')) { + langDesc = '英文'; + } else if (outCode.startsWith('ja')) { + langDesc = '日文'; + } else if (outCode.startsWith('ko')) { + langDesc = '韩文'; + } else if (outCode.startsWith('fr')) { + langDesc = '法文'; + } else if (outCode.startsWith('de')) { + langDesc = '德文'; + } else if (outCode.startsWith('es')) { + langDesc = '西班牙文'; + } else if (outCode.startsWith('ru')) { + langDesc = '俄文'; + } else if (outCode.startsWith('it')) { + langDesc = '意大利文'; + } else if (outCode.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (outCode.startsWith('th')) { + langDesc = '泰文'; + } else if (outCode.startsWith('vi')) { + langDesc = '越南文'; + } + final String promptToUse = tplPrompt.isEmpty + ? (langDesc.isEmpty + ? '' + : '输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。') + : (langDesc.isEmpty + ? tplPrompt + : tplPrompt + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); + final String outlineToUse = tplOutline.isEmpty + ? (langDesc.isEmpty + ? '' + : '输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。') + : (langDesc.isEmpty + ? tplOutline + : tplOutline + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); + _summaryTaskService.addTaskList(id, summarySourceText, promptToUse, outlineToUse); + } + } + + Future _translateTextList(int id, String targetLanguage) async { + // 读取刚插入的文本条目 + List speakerList = await SqfliteApi.getMeetingSpeaker(id); + // 构造简洁的可翻译列表 + List toTranslate = speakerList + .map((e) => { + 'id': e['id'], + 'speaker': (e['speaker'] ?? '').toString(), + 'content': (e['content'] ?? '').toString(), + }) + .toList(); + + final String userJson = jsonEncode({ + 'targetLanguage': targetLanguage, + 'items': toTranslate, + }); + + // 根据目标语言构建提示语 + String tgtName = targetLanguage.toLowerCase(); + String langDesc = '目标语言'; + if (tgtName.startsWith('zh')) { + langDesc = '中文'; + } else if (tgtName.startsWith('en')) { + langDesc = '英文'; + } else if (tgtName.startsWith('ja')) { + langDesc = '日文'; + } else if (tgtName.startsWith('ko')) { + langDesc = '韩文'; + } else if (tgtName.startsWith('fr')) { + langDesc = '法文'; + } else if (tgtName.startsWith('de')) { + langDesc = '德文'; + } else if (tgtName.startsWith('es')) { + langDesc = '西班牙文'; + } else if (tgtName.startsWith('ru')) { + langDesc = '俄文'; + } else if (tgtName.startsWith('it')) { + langDesc = '意大利文'; + } else if (tgtName.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (tgtName.startsWith('th')) { + langDesc = '泰文'; + } else if (tgtName.startsWith('vi')) { + langDesc = '越南文'; + } + + final String systemPrompt = '你是专业的翻译助手。请将每条items中的content精准翻译为' + + langDesc + + ',保持术语专业、语气自然。仅返回JSON数组,元素形如{"id":<原id>,"content":"<翻译后文本>"},不要额外说明,不要漏掉任何一条。'; + + final String? translated = await DeapsoundAIService().sendMessage( + messages: [ + {'role': 'system', 'content': systemPrompt}, + {'role': 'user', 'content': userJson}, + ], + ); + + if (translated == null || translated.isEmpty) return; + List arr; + try { + arr = jsonDecode(translated); + } catch (_) { + // 若模型返回包裹对象,尝试取字段 + try { + final obj = jsonDecode(translated); + arr = (obj is Map && obj['data'] is List) ? (obj['data'] as List) : []; + } catch (e) { + Logger.error('Parse translation JSON failed: ${e.toString()}'); + return; + } + } + if (arr.isEmpty) return; + // 批量更新 + for (var item in arr) { + if (item is Map && item['id'] != null) { + await SqfliteApi.editMeetingSpeaker([ + { + 'id': item['id'], + 'content': (item['content'] ?? '').toString(), + } + ]); + } + } + // 刷新缓存 + if (id == meetingId) { + textList = await SqfliteApi.getMeetingSpeaker(id); + // 主动触发监听刷新 UI(MeetingDetailsController 通过监听 tasktype 同步 textList) + try { + tasktype.refresh(); + } catch (_) {} + } + } + + void aiServiceMessage(int id, String text, [Map? templateData]) { + int awaitQuantity = 0; + String summaryText = ''; + String overviewText = ''; + // 模板参数透传 + final bool tplIsSpeaker = ((templateData?['isSpeaker']) ?? false) as bool; + final String tplLanguage = ((templateData?['language']) ?? '').toString(); + final String tplOutline = ((templateData?['outline']) ?? '').toString(); + final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); + final String tplTargetLang = + ((templateData?['targetLanguage']) ?? '').toString(); + + // 构建系统prompt,如果有模板数据则整合模板prompt + String systemPrompt = + '您将扮演一名会议总结专家,拥有超强的信息归纳与细分能力。不仅能高效处理各类通用场景会议,精准提炼会议核心内容,为后续思维导图生成奠定坚实基础。若涉及人员,人员名称保留[]。'; + if (templateData != null) { + if (tplPrompt.isNotEmpty) { + systemPrompt += ' 特别要求:' + tplPrompt; + } + if (tplOutline.isNotEmpty) { + systemPrompt += ' 大纲:' + tplOutline; + } + // 当目标语言为空(自动识别)时,使用录音语言作为输出语言约束;否则使用目标语言 + final String outCode = + tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; + if (outCode.isNotEmpty) { + final String t = outCode.toLowerCase(); + String langDesc = '目标语言'; + if (t.startsWith('zh')) { + langDesc = '中文'; + } else if (t.startsWith('en')) { + langDesc = '英文'; + } else if (t.startsWith('ja')) { + langDesc = '日文'; + } else if (t.startsWith('ko')) { + langDesc = '韩文'; + } else if (t.startsWith('fr')) { + langDesc = '法文'; + } else if (t.startsWith('de')) { + langDesc = '德文'; + } else if (t.startsWith('es')) { + langDesc = '西班牙文'; + } else if (t.startsWith('ru')) { + langDesc = '俄文'; + } else if (t.startsWith('it')) { + langDesc = '意大利文'; + } else if (t.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (t.startsWith('hi')) { + langDesc = '印地文'; + } else if (t.startsWith('th')) { + langDesc = '泰文'; + } else if (t.startsWith('vi')) { + langDesc = '越南文'; + } + systemPrompt += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; + } + } + + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': systemPrompt, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + summaryText = value ?? ''; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + // 构建第二个系统prompt,如果有模板数据则整合模板prompt + String systemPrompt2 = '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。'; + if (templateData != null) { + if (tplPrompt.isNotEmpty) { + systemPrompt2 += ' 特别要求:' + tplPrompt; + } + if (tplOutline.isNotEmpty) { + systemPrompt2 += ' 大纲:' + tplOutline; + } + final String outCode2 = + tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; + if (outCode2.isNotEmpty) { + final String t = outCode2.toLowerCase(); + String langDesc = '目标语言'; + if (t.startsWith('zh')) { + langDesc = '中文'; + } else if (t.startsWith('en')) { + langDesc = '英文'; + } else if (t.startsWith('ja')) { + langDesc = '日文'; + } else if (t.startsWith('ko')) { + langDesc = '韩文'; + } else if (t.startsWith('fr')) { + langDesc = '法文'; + } else if (t.startsWith('de')) { + langDesc = '德文'; + } else if (t.startsWith('es')) { + langDesc = '西班牙文'; + } else if (t.startsWith('ru')) { + langDesc = '俄文'; + } else if (t.startsWith('it')) { + langDesc = '意大利文'; + } else if (t.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (t.startsWith('hi')) { + langDesc = '印地文'; + } else if (t.startsWith('th')) { + langDesc = '泰文'; + } else if (t.startsWith('vi')) { + langDesc = '越南文'; + } + systemPrompt2 += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; + } + } + + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': systemPrompt2, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + overviewText = value ?? ''; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + } + + void _aiServiceValue(int id, String summaryText, String overviewText) { + SqfliteApi.editMeeting(id, { + 'tasktype': 3, + 'summary': summaryText, + 'overview': overviewText, + }); + if (id == meetingId) { + summary = summaryText; + overview = overviewText; + tasktype.value = 3; + } + try { + final s1 = Get.find(); + if (id == s1.meetingId) { + s1.tasktype.value = 3; + } + } catch (_) {} + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 3; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } +} diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 63fde0f02..1ef2d59e2 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -5,6 +5,7 @@ import '../../../core/utils/logger.dart'; import '../../../core/utils/upload_oss.dart'; import '../db/sqflite_api.dart'; import 'meeting_task_service.dart'; +import 'meeting_task_service2.dart'; class MeetingUploadService extends GetxService { final _taskService = Get.find(); @@ -43,6 +44,12 @@ class MeetingUploadService extends GetxService { String rootDir, { bool isUpload = true, }) async { + bool flash = false; + try { + final details = await SqfliteApi.getMeetingDetails(id); + final int seconds = (details['seconds'] ?? 0) as int; + flash = seconds > 0 && seconds <= 7200; + } catch (_) {} uploadList.add({ 'id': id, 'filepath': filePath, @@ -53,6 +60,7 @@ class MeetingUploadService extends GetxService { 'language': '', 'prompt': '', 'outline': '', + 'useFlashASR': flash, }); _storage.write("meeting_upload_list", uploadList); if (isUpload) { @@ -82,15 +90,28 @@ class MeetingUploadService extends GetxService { {'audiourl': audiourl}, ); if (element['isTask']) { - await _taskService.addTaskList( - element['id'], - audiourl, - '', - element['isSpeaker'], - element['language'], - element['prompt'], - element['outline'], - ); + if (element['useFlashASR'] == true) { + final service2 = Get.find(); + await service2.addTaskList( + element['id'], + audiourl, + isSpeaker: element['isSpeaker'], + language: element['language'], + targetLanguage: '', + prompt: element['prompt'], + outline: element['outline'], + ); + } else { + await _taskService.addTaskList( + element['id'], + audiourl, + '', + element['isSpeaker'], + element['language'], + element['prompt'], + element['outline'], + ); + } } element['audiourl'] = audiourl; uploadProgress.value = 0.0; diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart index 5657c8b74..c29741359 100644 --- a/lib/data/services/meeting/summary_task_service.dart +++ b/lib/data/services/meeting/summary_task_service.dart @@ -5,9 +5,11 @@ import '../../../core/utils/logger.dart'; import '../db/sqflite_api.dart'; import '../deapsound_ai_service.dart'; import 'meeting_task_service.dart'; +import 'meeting_task_service2.dart'; class SummaryTaskService extends GetxService { final _taskService = Get.find(); + final _taskService2 = Get.find(); final GetStorage _storage = GetStorage(); @@ -137,11 +139,24 @@ class SummaryTaskService extends GetxService { 'summary': summaryText, 'overview': overviewText, }); + + // 更新 V1 Service 状态 if (id == _taskService.meetingId) { summary = summaryText; overview = overviewText; _taskService.tasktype.value = 3; } + + // 更新 V2 Service 状态 + if (id == _taskService2.meetingId) { + summary = summaryText; + overview = overviewText; + _taskService2.summary = summaryText; + _taskService2.overview = overviewText; + _taskService2.tasktype.value = 3; + } + + // 更新 V1 任务完成列表 Map taskFinishData = _taskService.taskFinishList.firstWhere( (element) => element['id'] == id, orElse: () => {}, @@ -151,6 +166,18 @@ class SummaryTaskService extends GetxService { _taskService.taskFinishList.refresh(); } _storage.write("meeting_task_finish_list", _taskService.taskFinishList); + + // 更新 V2 任务完成列表 + Map taskFinishData2 = _taskService2.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData2.isNotEmpty) { + taskFinishData2['tasktype'] = 3; + _taskService2.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", _taskService2.taskFinishList); + _taskList.removeWhere((element) => element['id'] == id); _storage.write("summary_task_list", _taskList); _isTask = false; diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index a65074b23..b7cd13d23 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -14,6 +14,7 @@ import 'package:path_provider/path_provider.dart'; import '../../../core/utils/synchrodata.dart'; import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; +import '../../../data/services/meeting/meeting_task_service2.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; import '../model/meeting_details_model.dart'; @@ -28,9 +29,11 @@ class MeetingDetailsController extends GetxController late AnimationController lottieController; late final Worker _tasktypeListener; + late final Worker _tasktypeListenerV2; final _meetingUploadService = Get.find(); final _meetingTaskService = Get.find(); + final _meetingTaskService2 = Get.find(); final _summaryTaskService = Get.find(); final PlayerController playerController = PlayerController(); @@ -106,11 +109,25 @@ class MeetingDetailsController extends GetxController } meetingDetails.refresh(); }); + _tasktypeListenerV2 = ever(_meetingTaskService2.tasktype, (value) { + meetingDetails.value.tasktype = value; + if (_everType <= value) { + if (value == 2) { + textList.value = _meetingTaskService2.textList; + } else if (value == 3) { + meetingDetails.value.summary = _meetingTaskService2.summary; + meetingDetails.value.overview = _meetingTaskService2.overview; + summaryNumberModifications.value++; + } + } + meetingDetails.refresh(); + }); } @override void onClose() { _tasktypeListener.dispose(); + _tasktypeListenerV2.dispose(); _currentDurationSubscription?.cancel(); _playerStateSubscription?.cancel(); tabController.dispose(); @@ -122,6 +139,7 @@ class MeetingDetailsController extends GetxController void popInvokedWithResult(didPop, result) async { _meetingUploadService.removeUpload(id); _meetingTaskService.removeTask(id); + _meetingTaskService2.removeTask(id); _meetingTaskService.meetingId = 0; } @@ -257,10 +275,30 @@ class MeetingDetailsController extends GetxController bool isSpeaker, String language, String prompt, String outline) async { EasyLoading.show(); _everType = 2; - String audiourl = meetingData.value.audiourl; - String taskId = meetingDetails.value.taskid; - await _meetingTaskService.addTask( - id, audiourl, taskId, isSpeaker, language, prompt, outline); + final String audiourl = meetingData.value.audiourl; + final int seconds = meetingData.value.seconds; + if (seconds > 0 && seconds <= 7200) { + await _meetingTaskService2.addTask( + id, + audiourl, + isSpeaker: isSpeaker, + language: language, + targetLanguage: '', + prompt: prompt, + outline: outline, + ); + } else { + final String taskId = meetingDetails.value.taskid; + await _meetingTaskService.addTask( + id, + audiourl, + taskId, + isSpeaker, + language, + prompt, + outline, + ); + } meetingDetails.value.tasktype = 1; meetingDetails.refresh(); EasyLoading.dismiss(); diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index db2ae56cc..9ac1bb6e7 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -19,6 +19,7 @@ import '../../../core/utils/permission_util.dart'; import 'package:share_plus/share_plus.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; +import '../../../data/services/meeting/meeting_task_service2.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; @@ -29,6 +30,7 @@ class MeetingHomeController extends GetxController { final meetingController = Get.find(); final meetingUploadService = Get.find(); final meetingTaskService = Get.find(); + final meetingTaskService2 = Get.find(); final summaryTaskService = Get.find(); final AudioPlayer _audioPlayer = AudioPlayer(); @@ -585,6 +587,7 @@ class MeetingHomeController extends GetxController { _deleteFile(filepath); meetingUploadService.removeUpload(id, isDeleteTask: true); meetingTaskService.removeTask(id, isDeleteTask: true); + meetingTaskService2.removeTask(id, isDeleteTask: true); } // 删除文件 From de79513134f209b72a03dbf9c0b71a40c905888c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:28:00 +0800 Subject: [PATCH 077/177] =?UTF-8?q?feat(=E4=BC=9A=E8=AE=AE):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BC=9A=E8=AE=AE=E6=9C=8D=E5=8A=A1=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=92=8C=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加对会议服务类型的本地存储功能,并根据存储类型调整任务处理逻辑 --- .../services/meeting/meeting_upload_service.dart | 1 + .../controllers/meeting_details_controller.dart | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 1ef2d59e2..53a5f57d3 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -50,6 +50,7 @@ class MeetingUploadService extends GetxService { final int seconds = (details['seconds'] ?? 0) as int; flash = seconds > 0 && seconds <= 7200; } catch (_) {} + _storage.write("meeting_service_type_$id", flash ? 'fast' : 'standard'); uploadList.add({ 'id': id, 'filepath': filePath, diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index b7cd13d23..b197a8b86 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -9,6 +9,7 @@ import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import 'package:path_provider/path_provider.dart'; import '../../../core/utils/synchrodata.dart'; @@ -93,10 +94,16 @@ class MeetingDetailsController extends GetxController ..duration = const Duration(seconds: 2); final Map args = Get.arguments ?? {}; id = args['id']; + final storage = GetStorage(); + final String svc = + (storage.read("meeting_service_type_$id") ?? '').toString(); + final bool isFast = svc == 'fast'; _meetingTaskService.meetingId = id; + _meetingTaskService2.meetingId = id; _getDataDetails(); _loadJS(); _tasktypeListener = ever(_meetingTaskService.tasktype, (value) { + if (isFast) return; meetingDetails.value.tasktype = value; if (_everType <= value) { if (value == 2) { @@ -110,13 +117,14 @@ class MeetingDetailsController extends GetxController meetingDetails.refresh(); }); _tasktypeListenerV2 = ever(_meetingTaskService2.tasktype, (value) { + if (!isFast) return; meetingDetails.value.tasktype = value; if (_everType <= value) { if (value == 2) { textList.value = _meetingTaskService2.textList; } else if (value == 3) { - meetingDetails.value.summary = _meetingTaskService2.summary; - meetingDetails.value.overview = _meetingTaskService2.overview; + meetingDetails.value.summary = _summaryTaskService.summary; + meetingDetails.value.overview = _summaryTaskService.overview; summaryNumberModifications.value++; } } @@ -141,6 +149,7 @@ class MeetingDetailsController extends GetxController _meetingTaskService.removeTask(id); _meetingTaskService2.removeTask(id); _meetingTaskService.meetingId = 0; + _meetingTaskService2.meetingId = 0; } void _getDataDetails() async { @@ -277,6 +286,9 @@ class MeetingDetailsController extends GetxController _everType = 2; final String audiourl = meetingData.value.audiourl; final int seconds = meetingData.value.seconds; + final storage = GetStorage(); + storage.write("meeting_service_type_$id", + (seconds > 0 && seconds <= 7200) ? 'fast' : 'standard'); if (seconds > 0 && seconds <= 7200) { await _meetingTaskService2.addTask( id, From f67d3f83b7102d5d1dbf0ddc102da45e424d7ae2 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:34:10 +0800 Subject: [PATCH 078/177] =?UTF-8?q?fix(meeting):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E7=9B=91=E5=90=AC=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=92=8C=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正meeting_details_controller中任务类型监听逻辑,确保在快速模式下正确处理类型3的任务 调整meeting_task_service2中的代码格式,提高可读性 移除废弃的aiServiceMessage方法及相关代码 --- .../meeting/meeting_task_service2.dart | 172 +----------------- .../meeting_details_controller.dart | 4 +- 2 files changed, 8 insertions(+), 168 deletions(-) diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart index e04681dff..b6b455c43 100644 --- a/lib/data/services/meeting/meeting_task_service2.dart +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -851,7 +851,10 @@ class MeetingTaskService2 extends GetxService { // 使用统一的总结服务生成概览与总结 final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); final String tplOutline = ((templateData?['outline']) ?? '').toString(); - final String outCode = (((templateData?['targetLanguage']) ?? (templateData?['language']) ?? '') as String).toLowerCase(); + final String outCode = (((templateData?['targetLanguage']) ?? + (templateData?['language']) ?? + '') as String) + .toLowerCase(); String langDesc = ''; if (outCode.startsWith('zh')) { langDesc = '中文'; @@ -892,7 +895,8 @@ class MeetingTaskService2 extends GetxService { : (langDesc.isEmpty ? tplOutline : tplOutline + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); - _summaryTaskService.addTaskList(id, summarySourceText, promptToUse, outlineToUse); + _summaryTaskService.addTaskList( + id, summarySourceText, promptToUse, outlineToUse); } } @@ -988,168 +992,4 @@ class MeetingTaskService2 extends GetxService { } catch (_) {} } } - - void aiServiceMessage(int id, String text, [Map? templateData]) { - int awaitQuantity = 0; - String summaryText = ''; - String overviewText = ''; - // 模板参数透传 - final bool tplIsSpeaker = ((templateData?['isSpeaker']) ?? false) as bool; - final String tplLanguage = ((templateData?['language']) ?? '').toString(); - final String tplOutline = ((templateData?['outline']) ?? '').toString(); - final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); - final String tplTargetLang = - ((templateData?['targetLanguage']) ?? '').toString(); - - // 构建系统prompt,如果有模板数据则整合模板prompt - String systemPrompt = - '您将扮演一名会议总结专家,拥有超强的信息归纳与细分能力。不仅能高效处理各类通用场景会议,精准提炼会议核心内容,为后续思维导图生成奠定坚实基础。若涉及人员,人员名称保留[]。'; - if (templateData != null) { - if (tplPrompt.isNotEmpty) { - systemPrompt += ' 特别要求:' + tplPrompt; - } - if (tplOutline.isNotEmpty) { - systemPrompt += ' 大纲:' + tplOutline; - } - // 当目标语言为空(自动识别)时,使用录音语言作为输出语言约束;否则使用目标语言 - final String outCode = - tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; - if (outCode.isNotEmpty) { - final String t = outCode.toLowerCase(); - String langDesc = '目标语言'; - if (t.startsWith('zh')) { - langDesc = '中文'; - } else if (t.startsWith('en')) { - langDesc = '英文'; - } else if (t.startsWith('ja')) { - langDesc = '日文'; - } else if (t.startsWith('ko')) { - langDesc = '韩文'; - } else if (t.startsWith('fr')) { - langDesc = '法文'; - } else if (t.startsWith('de')) { - langDesc = '德文'; - } else if (t.startsWith('es')) { - langDesc = '西班牙文'; - } else if (t.startsWith('ru')) { - langDesc = '俄文'; - } else if (t.startsWith('it')) { - langDesc = '意大利文'; - } else if (t.startsWith('pt')) { - langDesc = '葡萄牙文'; - } else if (t.startsWith('hi')) { - langDesc = '印地文'; - } else if (t.startsWith('th')) { - langDesc = '泰文'; - } else if (t.startsWith('vi')) { - langDesc = '越南文'; - } - systemPrompt += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; - } - } - - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': systemPrompt, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - summaryText = value ?? ''; - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - // 构建第二个系统prompt,如果有模板数据则整合模板prompt - String systemPrompt2 = '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。'; - if (templateData != null) { - if (tplPrompt.isNotEmpty) { - systemPrompt2 += ' 特别要求:' + tplPrompt; - } - if (tplOutline.isNotEmpty) { - systemPrompt2 += ' 大纲:' + tplOutline; - } - final String outCode2 = - tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; - if (outCode2.isNotEmpty) { - final String t = outCode2.toLowerCase(); - String langDesc = '目标语言'; - if (t.startsWith('zh')) { - langDesc = '中文'; - } else if (t.startsWith('en')) { - langDesc = '英文'; - } else if (t.startsWith('ja')) { - langDesc = '日文'; - } else if (t.startsWith('ko')) { - langDesc = '韩文'; - } else if (t.startsWith('fr')) { - langDesc = '法文'; - } else if (t.startsWith('de')) { - langDesc = '德文'; - } else if (t.startsWith('es')) { - langDesc = '西班牙文'; - } else if (t.startsWith('ru')) { - langDesc = '俄文'; - } else if (t.startsWith('it')) { - langDesc = '意大利文'; - } else if (t.startsWith('pt')) { - langDesc = '葡萄牙文'; - } else if (t.startsWith('hi')) { - langDesc = '印地文'; - } else if (t.startsWith('th')) { - langDesc = '泰文'; - } else if (t.startsWith('vi')) { - langDesc = '越南文'; - } - systemPrompt2 += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; - } - } - - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': systemPrompt2, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - overviewText = value ?? ''; - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - } - - void _aiServiceValue(int id, String summaryText, String overviewText) { - SqfliteApi.editMeeting(id, { - 'tasktype': 3, - 'summary': summaryText, - 'overview': overviewText, - }); - if (id == meetingId) { - summary = summaryText; - overview = overviewText; - tasktype.value = 3; - } - try { - final s1 = Get.find(); - if (id == s1.meetingId) { - s1.tasktype.value = 3; - } - } catch (_) {} - Map taskFinishData = taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData.isNotEmpty) { - taskFinishData['tasktype'] = 3; - taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list_v2", taskFinishList); - } } diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index b197a8b86..96996c26c 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -103,10 +103,10 @@ class MeetingDetailsController extends GetxController _getDataDetails(); _loadJS(); _tasktypeListener = ever(_meetingTaskService.tasktype, (value) { - if (isFast) return; + if (isFast && value != 3) return; meetingDetails.value.tasktype = value; if (_everType <= value) { - if (value == 2) { + if (!isFast && value == 2) { textList.value = _meetingTaskService.textList; } else if (value == 3) { meetingDetails.value.summary = _summaryTaskService.summary; From bd045b0c5f103185a92c147e7513481ff8ab8596 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:55:30 +0800 Subject: [PATCH 079/177] =?UTF-8?q?feat(=E4=BC=9A=E8=AE=AE=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1):=20=E5=BC=95=E5=85=A5=E4=BB=BB=E5=8A=A1=E8=81=9A?= =?UTF-8?q?=E5=90=88=E5=99=A8=E7=BB=9F=E4=B8=80=E7=AE=A1=E7=90=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=E4=B8=8E=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构会议任务服务架构,新增 MeetingTaskAggregator 服务聚合器,统一管理标准版与极速版任务服务的状态与列表数据: 1. 移除服务间直接状态同步逻辑,改为通过聚合器统一对外暴露状态 2. 新增聚合器服务并在初始绑定中注册 3. 修改各控制器使用聚合器替代直接服务引用 4. 优化极速版服务日志输出为中文 5. 清理冗余的状态同步代码 --- lib/core/bindings/initial_binding.dart | 6 +- .../meeting/meeting_task_aggregator.dart | 105 ++++++++ .../meeting/meeting_task_service2.dart | 228 ++++++------------ .../meeting_details_controller.dart | 3 + .../controllers/meeting_home_controller.dart | 2 + .../meeting/views/meeting_home_view.dart | 4 +- 6 files changed, 190 insertions(+), 158 deletions(-) create mode 100644 lib/data/services/meeting/meeting_task_aggregator.dart diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index 3ea94689f..2870209ff 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -12,6 +12,7 @@ import '../../../data/services/speech_impl/azure_ast_service.dart'; import 'package:get/get.dart'; import '../../data/services/meeting/meeting_task_service.dart'; import '../../data/services/meeting/meeting_task_service2.dart'; +import '../../data/services/meeting/meeting_task_aggregator.dart'; import '../../data/services/meeting/meeting_upload_service.dart'; import '../../data/services/novice_guide_service.dart'; import '../../data/services/speech_factory.dart'; @@ -71,8 +72,11 @@ class InitialBinding extends Bindings { // 会议助手任务服务 Get.lazyPut(() => MeetingTaskService(), fenix: true); - // 会议助手任务服务(极速识别版) + // 会议助手任务服务(极速识别版,2小时内音频) Get.lazyPut(() => MeetingTaskService2(), fenix: true); + // 会议助手任务服务聚合器(统一列表与状态) + Get.lazyPut(() => MeetingTaskAggregator(), + fenix: true); // 会议助手总结任务服务 Get.lazyPut(() => SummaryTaskService(), fenix: true); diff --git a/lib/data/services/meeting/meeting_task_aggregator.dart b/lib/data/services/meeting/meeting_task_aggregator.dart new file mode 100644 index 000000000..5de375cda --- /dev/null +++ b/lib/data/services/meeting/meeting_task_aggregator.dart @@ -0,0 +1,105 @@ +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import 'meeting_task_service.dart'; +import 'meeting_task_service2.dart'; + +/// 会议助手任务服务聚合器(统一列表与状态) +class MeetingTaskAggregator extends GetxService { + final GetStorage _storage = GetStorage(); + + final MeetingTaskService s1 = Get.find(); + final MeetingTaskService2 s2 = Get.find(); + + RxList taskFinishList = [].obs; + RxInt tasktype = 1.obs; + int meetingId = 0; + List textList = []; + + Worker? _w1; + Worker? _w2; + Worker? _wTasktype; + + @override + void onInit() { + super.onInit(); + _w1 = ever(s1.taskFinishList, (_) => _rebuild()); + _w2 = ever(s2.taskFinishList, (_) => _rebuild()); + _rebuild(); + } + + void setMeeting(int id) { + meetingId = id; + final String svc = + (_storage.read("meeting_service_type_$id") ?? '').toString(); + final bool isFast = svc == 'fast'; + _wTasktype?.dispose(); + if (isFast) { + _wTasktype = ever(s2.tasktype, (value) { + tasktype.value = value; + if (value == 2) { + textList = s2.textList; + } + }); + } else { + _wTasktype = ever(s1.tasktype, (value) { + tasktype.value = value; + if (value == 2) { + textList = s1.textList; + } + }); + } + } + + void clearMeeting() { + meetingId = 0; + _wTasktype?.dispose(); + _wTasktype = null; + } + + void _rebuild() { + final Set ids = {}; + for (var e in s1.taskFinishList) { + if (e is Map && e['id'] is int) ids.add(e['id'] as int); + } + for (var e in s2.taskFinishList) { + if (e is Map && e['id'] is int) ids.add(e['id'] as int); + } + final List unified = []; + for (final id in ids) { + final String svc = + (_storage.read("meeting_service_type_$id") ?? '').toString(); + final Map a = s1.taskFinishList.firstWhere( + (x) => x['id'] == id, + orElse: () => {}, + ); + final Map b = s2.taskFinishList.firstWhere( + (x) => x['id'] == id, + orElse: () => {}, + ); + int va = a.isNotEmpty ? ((a['tasktype'] ?? 0) as int) : -999; + int vb = b.isNotEmpty ? ((b['tasktype'] ?? 0) as int) : -999; + int v; + if (svc == 'fast') { + if (va != -999 && vb != -999) { + v = va >= vb ? va : vb; + } else { + v = vb != -999 ? vb : va; + } + } else if (svc == 'standard') { + if (va != -999 && vb != -999) { + v = va >= vb ? va : vb; + } else { + v = va != -999 ? va : vb; + } + } else { + if (va == -999 && vb == -999) { + continue; + } + v = va == -999 ? vb : (vb == -999 ? va : (va >= vb ? va : vb)); + } + unified.add({'id': id, 'tasktype': v}); + } + taskFinishList.value = unified; + } +} diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart index b6b455c43..8a414c076 100644 --- a/lib/data/services/meeting/meeting_task_service2.dart +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -10,7 +10,7 @@ import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; import '../deapsound_ai_service.dart'; import 'meeting_upload_service.dart'; -import 'meeting_task_service.dart'; +// 移除标准版服务桥接,改为通过聚合器对外暴露统一状态 import 'summary_task_service.dart'; //火山引擎录音文件识别大模型-极速版 @@ -140,43 +140,31 @@ class MeetingTaskService2 extends GetxService { taskFinishList.add({'id': id, 'tasktype': 1}); _storage.write("meeting_task_list_v2", _taskList); _storage.write("meeting_task_finish_list_v2", taskFinishList); - try { - final s1 = Get.find(); - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 3; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} + // 由聚合器统一对外呈现状态,不直接写入标准版列表 _executeTask(); } void _executeTask() async { if (_isTask) return; _isTask = true; - Logger.debug('Starting task execution. Task count: ${_taskList.length}'); + Logger.debug('开始执行任务,任务数量:${_taskList.length}'); while (_taskList.isNotEmpty) { - Logger.debug('Task execution loop. Remaining tasks: ${_taskList.length}'); + Logger.debug('任务循环执行,剩余任务:${_taskList.length}'); await Future.delayed(const Duration(seconds: 2)); // 创建任务列表的副本,避免在迭代过程中修改原列表 List tasksCopy = List.from(_taskList); for (var element in tasksCopy) { - Logger.debug( - 'Processing task: ${element['id']} with audio: ${element['audiourl']}'); + Logger.debug('处理任务:${element['id']},音频:${element['audiourl']}'); // 检查任务是否仍在列表中(可能已被其他地方移除) if (_taskList.any((task) => task['id'] == element['id'])) { try { await _fileRecognize(element); } catch (e) { - Logger.error('Failed to process task ${element['id']}: $e'); + Logger.error('处理任务失败:${element['id']},错误:$e'); // 确保失败的任务被移除,避免无限循环 _taskList.removeWhere((task) => task['id'] == element['id']); _storage.write("meeting_task_list_v2", _taskList); @@ -185,22 +173,19 @@ class MeetingTaskService2 extends GetxService { await SqfliteApi.editMeeting(element['id'], {'tasktype': 0}); } } else { - Logger.debug( - 'Task ${element['id']} was already removed from task list'); + Logger.debug('任务 ${element['id']} 已从任务列表移除'); } } // 如果没有任务被处理,避免无限循环 if (_taskList.length == tasksCopy.length) { - Logger.warning( - 'No tasks were processed in this iteration. Breaking loop to avoid infinite execution.'); + Logger.warning('本次循环未处理任何任务,为避免无限执行终止循环'); break; } } _isTask = false; - Logger.debug( - 'Task execution completed. Remaining tasks: ${_taskList.length}'); + Logger.debug('任务执行完成,剩余任务:${_taskList.length}'); } void removeTask(int id, {bool isDeleteTask = false}) { @@ -260,9 +245,9 @@ class MeetingTaskService2 extends GetxService { try { // 记录请求详情 - Logger.debug('API Request URL: $_serviceUrl'); - Logger.debug('API Request Headers: $requestHeaders'); - Logger.debug('API Request Body: $requestBody'); + Logger.debug('API 请求地址:$_serviceUrl'); + Logger.debug('API 请求头:$requestHeaders'); + Logger.debug('API 请求体:$requestBody'); final response = await http.post( Uri.parse(_serviceUrl), @@ -270,30 +255,27 @@ class MeetingTaskService2 extends GetxService { body: requestBody, ); - Logger.debug('API Response Status: ${response.statusCode}'); - Logger.debug('API Response Headers: ${response.headers}'); + Logger.debug('API 响应状态码:${response.statusCode}'); + Logger.debug('API 响应头:${response.headers}'); if (response.statusCode != 200) { - Logger.error( - 'Recognition failed with status: ${response.statusCode}, body: ${response.body}'); - throw Exception( - 'Recognition failed with status: ${response.statusCode}'); + Logger.error('识别失败,状态码:${response.statusCode},响应体:${response.body}'); + throw Exception('识别失败,状态码:${response.statusCode}'); } final respDic = jsonDecode(response.body); - Logger.debug('Recognition response: $respDic'); + Logger.debug('识别接口响应:$respDic'); // 检查响应中是否包含资源相关信息 if (respDic.containsKey('resource_id') || respDic.containsKey('model')) { + Logger.debug('资源校验 - 使用的资源ID:volc.bigasr.auc_turbo'); Logger.debug( - 'Resource verification - Resource ID used: volc.bigasr.auc_turbo'); - Logger.debug( - 'Response resource info: ${respDic['resource_id'] ?? respDic['model'] ?? 'Not specified in response'}'); + '响应中的资源信息:${respDic['resource_id'] ?? respDic['model'] ?? '响应未包含'}'); } return respDic; } catch (e) { - Logger.error('Recognition error: ${e.toString()}'); + Logger.error('识别请求异常:${e.toString()}'); rethrow; } } @@ -315,19 +297,18 @@ class MeetingTaskService2 extends GetxService { double parsed = double.parse(timeValue); return parsed.round(); } catch (e) { - Logger.error('Failed to parse time value: $timeValue'); + Logger.error('时间值解析失败:$timeValue'); return 0; } } else { - Logger.error( - 'Unknown time value type: ${timeValue.runtimeType}, value: $timeValue'); + Logger.error('未知的时间值类型:${timeValue.runtimeType},值:$timeValue'); return 0; } } Future _fileRecognize(Map item) async { try { - Logger.debug('Starting recognition for audio: ${item['audiourl']}'); + Logger.debug('开始识别音频:${item['audiourl']}'); // 识别语言选取:若设置了目标输出语言且与录音语言一致,优先让ASR自动识别,避免错配 final String tplLang = (((item['template'] ?? {})['language']) ?? '').toString(); @@ -344,8 +325,8 @@ class MeetingTaskService2 extends GetxService { language: asrLanguage, ); - Logger.debug('Full API response structure: ${respDic.toString()}'); - Logger.debug('Response keys: ${respDic.keys.toList()}'); + Logger.debug('API 全量响应结构:${respDic.toString()}'); + Logger.debug('响应包含的键:${respDic.keys.toList()}'); // 检查响应格式并提取utterances List utterances = []; @@ -354,77 +335,67 @@ class MeetingTaskService2 extends GetxService { if (respDic['result'] != null && respDic['result']['utterances'] != null) { utterances = respDic['result']['utterances']; - Logger.debug( - 'Found utterances in result.utterances: ${utterances.length} items'); + Logger.debug('在 result.utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['resp'] != null && respDic['resp']['utterances'] != null) { utterances = respDic['resp']['utterances']; - Logger.debug( - 'Found utterances in resp.utterances: ${utterances.length} items'); + Logger.debug('在 resp.utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['utterances'] != null) { utterances = respDic['utterances']; - Logger.debug( - 'Found utterances in root.utterances: ${utterances.length} items'); + Logger.debug('在根级 utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['data'] != null && respDic['data']['utterances'] != null) { utterances = respDic['data']['utterances']; - Logger.debug( - 'Found utterances in data.utterances: ${utterances.length} items'); + Logger.debug('在 data.utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['response'] != null && respDic['response']['utterances'] != null) { utterances = respDic['response']['utterances']; - Logger.debug( - 'Found utterances in response.utterances: ${utterances.length} items'); + Logger.debug('在 response.utterances 中找到 ${utterances.length} 条语句'); } else { // 检查是否有错误信息 if (respDic['error'] != null) { - Logger.error('API returned error: ${respDic['error']}'); + Logger.error('接口返回错误:${respDic['error']}'); } else if (respDic['message'] != null) { - Logger.error('API returned message: ${respDic['message']}'); + Logger.error('接口返回消息:${respDic['message']}'); } else { - Logger.error( - 'Unknown response format. Available keys: ${respDic.keys.toList()}'); + Logger.error('未知的响应格式。可用键:${respDic.keys.toList()}'); // 尝试查找任何包含文本的字段 respDic.forEach((key, value) { - Logger.debug( - 'Key: $key, Value type: ${value.runtimeType}, Value: $value'); + Logger.debug('键:$key,值类型:${value.runtimeType},值:$value'); }); } } if (utterances.isNotEmpty) { - Logger.debug('Processing ${utterances.length} utterances'); + Logger.debug('开始处理 ${utterances.length} 条语句'); await _addTextList(item['id'], utterances, item['template']); // 从任务列表中移除已完成的任务 _taskList.removeWhere((element) => element['id'] == item['id']); _storage.write("meeting_task_list_v2", _taskList); - Logger.debug( - 'Recognition completed successfully for item ${item['id']}'); + Logger.debug('音频识别成功,会议ID:${item['id']}'); // 更新UI状态 - 如果是当前会议,触发UI更新 if (item['id'] == meetingId) { tasktype.value = 2; // 转写完成,进入分析阶段 } } else { - Logger.error( - "No utterances found in response. Full response: $respDic"); - print( - '🔥🔥🔥 NO UTTERANCES FOUND - STARTING SILENT AUDIO CHECK 🔥🔥🔥'); - print('=== DEBUGGING SILENT AUDIO DETECTION ==='); - print('Response keys: ${respDic.keys.toList()}'); - print('Response code: ${respDic['code']}'); - print('Response message: ${respDic['message']}'); + Logger.error('响应中未发现语句。完整响应:$respDic'); + Logger.debug('未检测到语句,开始执行无声音频检查'); + Logger.debug('无声音频检测调试信息'); + Logger.debug('响应键列表:${respDic.keys.toList()}'); + Logger.debug('响应代码:${respDic['code']}'); + Logger.debug('响应消息:${respDic['message']}'); // 检查是否为无声音频 bool isSilentAudio = _checkIfSilentAudio(respDic); - print('Silent audio detection result: $isSilentAudio'); + Logger.debug('无声检测结果:$isSilentAudio'); if (isSilentAudio) { - print('=== SILENT AUDIO DETECTED - SETTING TASKTYPE TO -1 ==='); + Logger.debug('检测到无声音频,设置任务类型为 -1'); // 设置无声音频状态 (使用特殊值 -1) await SqfliteApi.editMeeting(item['id'], {'tasktype': -1}); if (item['id'] == meetingId) { - print('Setting tasktype.value to -1 for current meeting'); + Logger.debug('当前会议设置 tasktype.value 为 -1'); tasktype.value = -1; // 无声音频 } @@ -438,32 +409,10 @@ class MeetingTaskService2 extends GetxService { taskFinishList.refresh(); } _storage.write("meeting_task_finish_list_v2", taskFinishList); - try { - final s1 = Get.find(); - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == item['id'], - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 0; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} - try { - final s1 = Get.find(); - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == item['id'], - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = -1; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} + // 由聚合器统一对外呈现状态,不直接写入标准版列表 + // 由聚合器统一对外呈现状态,不直接写入标准版列表 } else { - Logger.error('Recognition failed for unknown reason'); + Logger.error('识别失败,原因未知'); // 识别失败,更新数据库状态为失败 await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); if (item['id'] == meetingId) { @@ -487,14 +436,14 @@ class MeetingTaskService2 extends GetxService { _storage.write("meeting_task_list_v2", _taskList); } } catch (e) { - Logger.error('Error occurred in _fileRecognize: ${e.toString()}'); - Logger.error('Stack trace: ${StackTrace.current}'); + Logger.error('文件识别流程发生异常:${e.toString()}'); + Logger.error('堆栈信息:${StackTrace.current}'); // 更新数据库状态为失败 try { await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); } catch (dbError) { - Logger.error('Failed to update meeting status in database: $dbError'); + Logger.error('数据库更新会议状态失败:$dbError'); } // 出错时也要从任务列表中移除,避免无限重试 @@ -510,7 +459,7 @@ class MeetingTaskService2 extends GetxService { /// 检查是否为无声音频 bool _checkIfSilentAudio(Map response) { - print('Checking if silent audio, response: ${response.toString()}'); + Logger.debug('检查是否为无声音频,响应:${response.toString()}'); // 检查API响应中的错误信息或状态码 // 根据实际API响应格式调整检测逻辑 @@ -518,7 +467,7 @@ class MeetingTaskService2 extends GetxService { // 检查是否有错误码表示无声音频 if (response['code'] != null) { int code = response['code']; - print('Found response code: $code'); + Logger.debug('检测到响应代码:$code'); // 常见的无声音频错误码 if (code == 40001 || code == 40002 || @@ -526,7 +475,7 @@ class MeetingTaskService2 extends GetxService { code == 50001 || code == 50002 || code == 50003) { - print('Detected silent audio by error code: $code'); + Logger.debug('根据错误码判断为无声音频:$code'); return true; } } @@ -534,7 +483,7 @@ class MeetingTaskService2 extends GetxService { // 检查错误消息 if (response['message'] != null) { String message = response['message'].toString().toLowerCase(); - print('Found response message: $message'); + Logger.debug('检测到响应消息:$message'); if (message.contains('silent') || message.contains('no audio') || message.contains('无声') || @@ -543,7 +492,7 @@ class MeetingTaskService2 extends GetxService { message.contains('no speech') || message.contains('audio too short') || message.contains('insufficient audio')) { - print('Detected silent audio by message: $message'); + Logger.debug('根据消息判断为无声音频:$message'); return true; } } @@ -551,7 +500,7 @@ class MeetingTaskService2 extends GetxService { // 检查result中的错误信息 if (response['result'] != null && response['result']['error'] != null) { String error = response['result']['error'].toString().toLowerCase(); - print('Found result error: $error'); + Logger.debug('检测到 result.error:$error'); if (error.contains('silent') || error.contains('no audio') || error.contains('无声') || @@ -559,7 +508,7 @@ class MeetingTaskService2 extends GetxService { error.contains('empty audio') || error.contains('no speech') || error.contains('audio too short')) { - print('Detected silent audio by result error: $error'); + Logger.debug('根据 result.error 判断为无声音频:$error'); return true; } } @@ -567,10 +516,10 @@ class MeetingTaskService2 extends GetxService { // 检查是否有音频时长信息且时长为0或极短 if (response['result'] != null && response['result']['duration'] != null) { double duration = (response['result']['duration'] as num).toDouble(); - print('Found audio duration: $duration seconds'); + Logger.debug('检测到音频时长:$duration 秒'); if (duration <= 0.5) { // 音频时长小于0.5秒认为是无声 - print('Detected silent audio by short duration: $duration'); + Logger.debug('根据时长过短判断为无声音频:$duration'); return true; } } @@ -618,10 +567,10 @@ class MeetingTaskService2 extends GetxService { 1000; // 转换为秒 } - print('Found empty text content, audio duration: $audioDuration seconds'); + Logger.debug('文本内容为空,音频时长:$audioDuration 秒'); if (audioDuration > 1.0) { // 音频时长大于1秒但没有文本内容,认为是无声音频 - print('Detected silent audio: empty text with sufficient duration'); + Logger.debug('判断为无声音频:文本为空且时长充足'); return true; } } @@ -637,25 +586,25 @@ class MeetingTaskService2 extends GetxService { // 如果有成功状态码但没有utterances,很可能是无声音频 if (hasSuccessCode) { - print('Detected silent audio: success code but no utterances'); + Logger.debug('判断为无声音频:成功状态码但无语句'); return true; } } - print('Not detected as silent audio'); + Logger.debug('未判定为无声音频'); return false; } Future _addTextList(int id, List utterances, [Map? templateData]) async { - Logger.debug('Processing ${utterances.length} utterances for meeting $id'); + Logger.debug('处理会议 $id 的 ${utterances.length} 条语句'); String text = ''; String personnel = ''; List> list = []; for (int i = 0; i < utterances.length; i++) { var element = utterances[i]; - Logger.debug('Processing utterance $i: ${element.toString()}'); + Logger.debug('处理第 $i 条语句:${element.toString()}'); String speaker = ''; String content = ''; @@ -681,7 +630,7 @@ class MeetingTaskService2 extends GetxService { } else if (element['transcript'] != null) { content = element['transcript'].toString(); } else { - Logger.error('No text content found in utterance: $element'); + Logger.error('语句中未找到文本内容:$element'); continue; } @@ -718,11 +667,10 @@ class MeetingTaskService2 extends GetxService { }); text += '$content\n'; - Logger.debug( - 'Added utterance: speaker=$speaker, content=$content, start=$startTime, end=$endTime'); + Logger.debug('已添加语句:说话人=$speaker,内容=$content,开始=$startTime,结束=$endTime'); } - Logger.debug('Total processed utterances: ${list.length}'); + Logger.debug('处理完成的语句总数:${list.length}'); var result = await SqfliteApi.insertMeetingSpeaker(list); if (result != null) { // 初始用于总结/概览的文本,先用原始拼接文本作为默认值 @@ -748,7 +696,7 @@ class MeetingTaskService2 extends GetxService { // 保持在“正在转写”状态,先进行翻译为目标语言 await _translateTextList(id, targetLanguage); } catch (e) { - Logger.error('Translate transcript failed: ${e.toString()}'); + Logger.error('转写文本翻译失败:${e.toString()}'); } // 翻译完成后再写入 personnel、设置已完成并刷新 UI await SqfliteApi.editMeeting( @@ -763,38 +711,8 @@ class MeetingTaskService2 extends GetxService { textList = newSpeakerList; tasktype.value = 2; } - try { - final s1 = Get.find(); - if (id == s1.meetingId) { - s1.textList = newSpeakerList; - s1.tasktype.value = 2; - } - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 2; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} - try { - final s1 = Get.find(); - if (id == s1.meetingId) { - s1.textList = newSpeakerList; - s1.tasktype.value = 2; - } - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 2; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} + // 由聚合器统一对外呈现状态,不直接写入标准版列表 + // 由聚合器统一对外呈现状态,不直接写入标准版列表 // 用最新(已翻译)的文本重建总结/概览输入 summarySourceText = ''; for (var element in newSpeakerList) { @@ -967,7 +885,7 @@ class MeetingTaskService2 extends GetxService { final obj = jsonDecode(translated); arr = (obj is Map && obj['data'] is List) ? (obj['data'] as List) : []; } catch (e) { - Logger.error('Parse translation JSON failed: ${e.toString()}'); + Logger.error('翻译结果 JSON 解析失败:${e.toString()}'); return; } } diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 96996c26c..b5111338a 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -18,6 +18,7 @@ import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_task_service2.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; +import '../../../data/services/meeting/meeting_task_aggregator.dart'; import '../model/meeting_details_model.dart'; import '../model/meeting_model.dart'; @@ -100,6 +101,7 @@ class MeetingDetailsController extends GetxController final bool isFast = svc == 'fast'; _meetingTaskService.meetingId = id; _meetingTaskService2.meetingId = id; + Get.find().setMeeting(id); _getDataDetails(); _loadJS(); _tasktypeListener = ever(_meetingTaskService.tasktype, (value) { @@ -141,6 +143,7 @@ class MeetingDetailsController extends GetxController tabController.dispose(); playerController.dispose(); lottieController.dispose(); + Get.find().clearMeeting(); super.onClose(); } diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index 9ac1bb6e7..fcea611a4 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -20,6 +20,7 @@ import 'package:share_plus/share_plus.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_task_service2.dart'; +import '../../../data/services/meeting/meeting_task_aggregator.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; @@ -31,6 +32,7 @@ class MeetingHomeController extends GetxController { final meetingUploadService = Get.find(); final meetingTaskService = Get.find(); final meetingTaskService2 = Get.find(); + final taskAggregator = Get.find(); final summaryTaskService = Get.find(); final AudioPlayer _audioPlayer = AudioPlayer(); diff --git a/lib/modules/meeting/views/meeting_home_view.dart b/lib/modules/meeting/views/meeting_home_view.dart index 81cd3b22b..f9a9dd988 100644 --- a/lib/modules/meeting/views/meeting_home_view.dart +++ b/lib/modules/meeting/views/meeting_home_view.dart @@ -320,8 +320,8 @@ class _MeetingHomeViewState extends State : const SizedBox(); }), Obx(() { - Map taskData = - _controller.meetingTaskService.taskFinishList.firstWhere( + Map taskData = _controller.taskAggregator.taskFinishList + .firstWhere( (element) => element['id'] == data.id, orElse: () => {}, ); From 6f571d7a85932df2737bed080643104015dd90a8 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 26 Nov 2025 15:49:55 +0800 Subject: [PATCH 080/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/en_us.dart | 10 +++++ lib/core/translations/language/zh_cn.dart | 12 +++++- lib/core/translations/language/zh_hk.dart | 5 ++- lib/data/models/goods.dart | 34 ++++++++++++--- .../controllers/goods_base_controller.dart | 5 --- lib/modules/goods/utils/goods_i18n.dart | 41 ++++++++++++++----- lib/modules/goods/views/goodsai_view.dart | 2 +- lib/modules/goods/views/goodsmeet_view.dart | 2 +- lib/modules/goods/views/goodstrade_view.dart | 2 +- lib/modules/goods/views/goodsvip_view.dart | 38 +++++++---------- .../controllers/pairing_controller.dart | 39 ++++++++++++++++++ 11 files changed, 139 insertions(+), 51 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 1ea7da229..051b6fa60 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -599,6 +599,7 @@ const Map enUS = { // 设置页 "systemSettings": "System Settings", "premiumMember": "Premium Membership", + "memberService": "Member Service", "joinDevice": "Connected device:", "accountId": "Account ID:", "systemSetting": "System Settings", @@ -707,6 +708,15 @@ const Map enUS = { // 预设提示词 "presetMusic": "Play some music", // Play some music "presetNavigation": "Navigation to", // Navigation + // First bind rewards dialog + "firstBindRewardTitle": "Welcome Reward", + "firstBindRewardDesc": "You've received binding rewards.", + "vipLevelLabel": "VIP Level:", + "expiryLabel": "Expiration:", + "aiChatCreditsLabel": "AI Chat Credits:", + "translationCreditsLabel": "Translation Credits:", + "meetingCreditsLabel": "Meeting Credits:", + "ok": "OK", "presetWeather": "Today's weather", // Weather "presetNews": "Today's news", // News "presetFood": "Nearby food", // Food diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 4360198c9..a272d6411 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -162,7 +162,7 @@ const Map zhCN = { "exploreSlogan1": "智能陪伴,无限可能", "exploreSlogan2": "智能眼镜,无限可能", "exploreAi": "探索Voitrans提供的AI功能", - "aiFunction": "AI功能", + "aiFunction": "AI助手", "allRoundAssistant": "全能助理", "allRoundAssistantInfo": "帮你解决各类问题", "simultaneousTranslation": "同声翻译", @@ -497,6 +497,7 @@ const Map zhCN = { // 设置页 "systemSettings": "系统设置", "premiumMember": "高级会员", + "memberService": "会员服务", "joinDevice": "已连接设备:", "accountId": "账号ID:", "systemSetting": "系统设置", @@ -691,6 +692,15 @@ const Map zhCN = { "friday": "周五", "saturday": "周六", "sunday": "周日", + // 首次绑定奖励弹窗(英文文案,保持一致性) + "firstBindRewardTitle": "Welcome Reward", + "firstBindRewardDesc": "You've received binding rewards.", + "vipLevelLabel": "VIP Level:", + "expiryLabel": "Expiration:", + "aiChatCreditsLabel": "AI Chat Credits:", + "translationCreditsLabel": "Translation Credits:", + "meetingCreditsLabel": "Meeting Credits:", + "ok": "OK", // 天气描述 "sunny": "晴", "partlyCloudy": "少云", diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 8e16a47d4..02bef9e1a 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -161,7 +161,7 @@ const Map zhHK = { "exploreSlogan1": "智能陪伴,無限可能", "exploreSlogan2": "智能眼鏡,無限可能", "exploreAi": "探索Voitrans提供的AI功能", - "aiFunction": "AI功能", + "aiFunction": "AI助手", "allRoundAssistant": "全能助理", "allRoundAssistantInfo": "幫你解決各類問題", "simultaneousTranslation": "同聲翻譯", @@ -829,7 +829,8 @@ const Map zhHK = { "guideNavInput": "Navigate to Shenzhen Airport", "guideNavSend": "Xiaoyan will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", "guideMeetingSend": "Xiaoyan will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", diff --git a/lib/data/models/goods.dart b/lib/data/models/goods.dart index 6218c65a7..0738a7a60 100644 --- a/lib/data/models/goods.dart +++ b/lib/data/models/goods.dart @@ -1,6 +1,8 @@ /// 商品类型 /// 0: 普通产品 normal /// 1: 会员产品 member +import 'dart:convert'; + // 使用量类型(与后端/Proto枚举对应) enum UsageType { /// 未知使用量类型 @@ -100,7 +102,7 @@ class DBGoods { final String id; final bool enable; final String name; - final String desc; + final String localname; final int price; // 建议单位:分 final UsageType usagetype; final int usagenum; @@ -109,7 +111,7 @@ class DBGoods { required this.id, required this.enable, required this.name, - required this.desc, + required this.localname, required this.price, required this.usagetype, required this.usagenum, @@ -144,7 +146,7 @@ class DBGoods { id: _asString(json['id']), enable: _asBool(json['enable']), name: _asString(json['name']), - desc: _asString(json['desc']), + localname: _asString(json['localname']), price: _asInt(json['price']), usagetype: UsageType.from(json['usagetype']), usagenum: _asInt(json['usagenum']), @@ -157,7 +159,7 @@ class DBGoods { 'id': id, 'enable': enable, 'name': name, - 'desc': desc, + 'localname': localname, 'price': price, 'usagetype': usagetype.toInt, 'usagenum': usagenum, @@ -194,7 +196,7 @@ class DBGoods { String? id, bool? enable, String? name, - String? desc, + String? localname, int? price, UsageType? usagetype, int? usagenum, @@ -203,7 +205,7 @@ class DBGoods { id: id ?? this.id, enable: enable ?? this.enable, name: name ?? this.name, - desc: desc ?? this.desc, + localname: localname ?? this.localname, price: price ?? this.price, usagetype: usagetype ?? this.usagetype, usagenum: usagenum ?? this.usagenum, @@ -214,4 +216,24 @@ class DBGoods { String toString() { return 'DBGoods(id: $id, enable: $enable, name: $name, price: $price, usagetype: ${usagetype.name}, usagenum: $usagenum)'; } + + Map? get _localnameMap { + if (localname.isEmpty) return null; + try { + final v = jsonDecode(localname); + if (v is Map) return v; + } catch (_) {} + return null; + } + + Map localInfo(String tag) { + final m = _localnameMap; + if (m == null) return const {}; + final key1 = tag; + final key2 = tag.replaceAll('_', '-'); + final key3 = tag.replaceAll('-', '_'); + dynamic e = m[key1] ?? m[key2] ?? m[key3]; + if (e == null && m.isNotEmpty) e = m.values.first; + return e is Map ? e as Map : const {}; + } } diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 74d9aeb30..17dd976df 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -439,7 +439,6 @@ abstract class GoodsBaseController extends GetxController { final paymentData = await _payService.createWechatPayOrder( productId: item.id, productName: item.name, - productDesc: item.desc, amount: cents, notifyUrl: '$serverUrl/api/home/pay_wechatnotify', ); @@ -471,7 +470,6 @@ abstract class GoodsBaseController extends GetxController { final orderInfo = await _payService.createAlipayOrder( productId: item.id, productName: item.name, - productDesc: item.desc, amount: cents, notifyUrl: 'https://api.ideapsound.com/api/home/pay_alipaynotify', ); @@ -502,7 +500,6 @@ abstract class GoodsBaseController extends GetxController { final orderId = await _payService.createAppleIapOrder( productId: item.id, productName: item.name, - productDesc: item.desc, amount: item.price, ); if (orderId == null || orderId.isEmpty) { @@ -560,7 +557,6 @@ abstract class GoodsBaseController extends GetxController { final orderId = await _payService.createGoogleIapOrder( productId: item.id, productName: item.name, - productDesc: item.desc, amount: item.price, ); if (orderId == null || orderId.isEmpty) { @@ -800,7 +796,6 @@ abstract class GoodsBaseController extends GetxController { final approvalUrl = await _payService.createPaypalOrder( productId: item.id, productName: item.name, - productDesc: item.desc, amount: cents, notifyUrl: 'https://api.ideapsound.com/api/home/pay_paypalnotify', ); diff --git a/lib/modules/goods/utils/goods_i18n.dart b/lib/modules/goods/utils/goods_i18n.dart index 796caa477..46a85a0d1 100644 --- a/lib/modules/goods/utils/goods_i18n.dart +++ b/lib/modules/goods/utils/goods_i18n.dart @@ -1,11 +1,20 @@ import 'package:get/get.dart'; import 'package:voitrans/data/models/goods.dart'; -/// 商品名称本地化 -/// 优先根据商品ID映射到本地化名称;若无映射,则回退到后端提供的名称 -String localizedGoodsName(DBGoods item) { - final id = (item.id ?? '').trim(); +String _localeTag() { + final l = Get.locale; + if (l == null) return 'zh-CN'; + final cc = l.countryCode; + return cc != null && cc.isNotEmpty + ? '${l.languageCode}-${cc.toUpperCase()}' + : l.languageCode; +} +String localizedGoodsName(DBGoods item) { + final info = item.localInfo(_localeTag()); + final ln = (info['name'] as String?)?.trim() ?? ''; + if (ln.isNotEmpty) return ln; + final id = item.id.trim(); switch (id) { case 'ai_001': return 'ai_001_name'.tr; @@ -25,17 +34,14 @@ String localizedGoodsName(DBGoods item) { return 'trade_002_name'.tr; case 'trade_003': return 'trade_003_name'.tr; - // 可在此补充其他商品ID的映射,如:translate_001、meet_001 等 default: - final name = (item.name ?? '').trim(); + final name = item.name.trim(); return name.isNotEmpty ? name : 'unknown'.tr; } } -/// 商品描述本地化 -/// 优先根据商品ID映射到本地化描述;若无映射,则回退到后端提供的描述 String localizedGoodsDesc(DBGoods item) { - final id = (item.id ?? '').trim(); + final id = item.id.trim(); switch (id) { case 'ai_001': @@ -57,7 +63,20 @@ String localizedGoodsDesc(DBGoods item) { case 'trade_003': return 'trade_003_desc'.tr; default: - final desc = (item.desc ?? '').trim(); - return desc.isNotEmpty ? desc : ''; + return ''; + } +} + +String goodsDisplayPrice(DBGoods item) { + final info = item.localInfo(_localeTag()); + final cur = (info['currency'] as String?)?.trim(); + final p = info['price']; + final symbol = (cur != null && cur.isNotEmpty) ? cur : '¥'; + double v; + if (p is num) { + v = p.toDouble(); + } else { + v = item.priceYuan; } + return '$symbol${v.toStringAsFixed(2)}'; } diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index f6a1cfd0f..4926f2049 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -496,7 +496,7 @@ class GoodsaiView extends GetView { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text('¥${item.priceYuan.toStringAsFixed(2)}', + Text(goodsDisplayPrice(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index e32c2dfb4..81abc3aa4 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -260,7 +260,7 @@ class GoodsmeetView extends GetView { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text('¥${item.price.toStringAsFixed(2)}', + Text(goodsDisplayPrice(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart index e454f8e63..f3006c0dc 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -260,7 +260,7 @@ class GoodstradeView extends GetView { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text('¥${item.price.toStringAsFixed(2)}', + Text(goodsDisplayPrice(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index 6b541e319..b135011ae 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -24,7 +24,7 @@ class GoodsvipView extends GetView { onPressed: () => Get.back(), ), title: Text( - '购买', + 'purchase'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, @@ -261,7 +261,7 @@ class GoodsvipView extends GetView { UsageType.AI: 'aiFunction'.tr, UsageType.Meet: 'conferenceAssistant'.tr, UsageType.Translation: 'simultaneousTranslation'.tr, - UsageType.Vip: 'premiumMember'.tr, + UsageType.Vip: 'memberService'.tr, }; final iconAndColor = _iconColorForType(type, isDarkMode); final subColor = isDarkMode ? Colors.white70 : Colors.grey[700]; @@ -281,8 +281,8 @@ class GoodsvipView extends GetView { ? DateTime.fromMillisecondsSinceEpoch(vipexptime) : DateTime.fromMillisecondsSinceEpoch(vipexptime * 1000); } - titleStr = 'Vip $viplv'; - vipSubtitle = expiry != null ? _fmtDate(expiry) : '未开启'; + // titleStr = 'Vip $viplv'; + vipSubtitle = expiry != null ? _fmtDate(expiry) : '未激活'; } return Container( padding: EdgeInsets.all(16.w), @@ -346,7 +346,7 @@ class GoodsvipView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildTypeHeader(type, isDarkMode), - SizedBox(height: 12.h), + SizedBox(height: 8.h), _buildGoodsGrid(list, type, isDarkMode), ], ); @@ -504,7 +504,7 @@ class GoodsvipView extends GetView { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Text('¥${item.priceYuan.toStringAsFixed(2)}', + Text(goodsDisplayPrice(item), style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -718,9 +718,9 @@ class GoodsvipView extends GetView { physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, - mainAxisSpacing: 12.h, + mainAxisSpacing: 8.h, crossAxisSpacing: 12.w, - childAspectRatio: 1.15, + childAspectRatio: 1.3, ), itemCount: list.length, itemBuilder: (_, i) => _buildGridItemCard(list[i], type, isDarkMode), @@ -751,7 +751,7 @@ class GoodsvipView extends GetView { children: [ Container( width: 34.w, - height: 34.w, + height: 20.w, decoration: BoxDecoration( color: iconColors.background, borderRadius: BorderRadius.circular(17.r), @@ -761,11 +761,11 @@ class GoodsvipView extends GetView { SizedBox(width: 8.w), Expanded( child: Text( - localizedGoodsName(item), + goodsDisplayPrice(item), maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( - fontSize: 14.sp, + fontSize: 21.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), @@ -776,27 +776,19 @@ class GoodsvipView extends GetView { SizedBox(height: 6.h), Expanded( child: Text( - localizedGoodsDesc(item), + localizedGoodsName(item), maxLines: 3, overflow: TextOverflow.ellipsis, style: TextStyle( - fontSize: 12.sp, + fontSize: 15.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], ), ), ), - SizedBox(height: 6.h), + // SizedBox(height: 6.h), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.end, children: [ - Text( - '¥${item.priceYuan.toStringAsFixed(2)}', - style: TextStyle( - fontSize: 14.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), GestureDetector( onTap: () => controller.purchase(item), child: Container( diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 03d78ce80..77f8dbf6b 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1073,6 +1073,45 @@ class PairingController extends GetxController with WidgetsBindingObserver { User.instance.tradetotalintegral = response['tradetotalintegral'] ?? 0; User.instance.meetintegral = response['meetintegral'] ?? 0; User.instance.meettotalintegral = response['meettotalintegral'] ?? 0; + final lv = User.instance.viplv; + final vipexptime = User.instance.vipexptime; + DateTime? expiry; + if (vipexptime > 0) { + expiry = DateTime.fromMillisecondsSinceEpoch(vipexptime * 1000); + } + final y = expiry?.year.toString().padLeft(4, '0') ?? ''; + final m = expiry?.month.toString().padLeft(2, '0') ?? ''; + final d = expiry?.day.toString().padLeft(2, '0') ?? ''; + final expiryText = expiry != null ? '$y-$m-$d' : 'N/A'; + Get.dialog( + AlertDialog( + title: Text('firstBindRewardTitle'.tr), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('firstBindRewardDesc'.tr), + SizedBox(height: 8.h), + Text('${'vipLevelLabel'.tr} Vip $lv'), + Text('${'expiryLabel'.tr} $expiryText'), + SizedBox(height: 8.h), + Text( + '${'aiChatCreditsLabel'.tr} ${User.instance.aichatintegral}'), + Text( + '${'translationCreditsLabel'.tr} ${User.instance.tradeintegral}'), + Text( + '${'meetingCreditsLabel'.tr} ${User.instance.meetintegral}'), + ], + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text('ok'.tr), + ), + ], + ), + barrierDismissible: true, + ); } return; } else { From b12c690d3f90eea13da0138ec0d60bff8f3b2742 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 26 Nov 2025 15:56:48 +0800 Subject: [PATCH 081/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/en_us.dart | 2 ++ lib/core/translations/language/zh_cn.dart | 2 ++ .../controllers/pairing_controller.dart | 20 ++----------------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 051b6fa60..be64d22b7 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -600,6 +600,8 @@ const Map enUS = { "systemSettings": "System Settings", "premiumMember": "Premium Membership", "memberService": "Member Service", + "bindRewardTitle": "Rewards", + "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", "joinDevice": "Connected device:", "accountId": "Account ID:", "systemSetting": "System Settings", diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index a272d6411..997acdf54 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -498,6 +498,8 @@ const Map zhCN = { "systemSettings": "系统设置", "premiumMember": "高级会员", "memberService": "会员服务", + "bindRewardTitle": "奖励", + "bindRewardSimpleDesc": "首次绑定设备奖励已下发,点击确定关闭即可", "joinDevice": "已连接设备:", "accountId": "账号ID:", "systemSetting": "系统设置", diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 77f8dbf6b..9ef30bec0 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1085,24 +1085,8 @@ class PairingController extends GetxController with WidgetsBindingObserver { final expiryText = expiry != null ? '$y-$m-$d' : 'N/A'; Get.dialog( AlertDialog( - title: Text('firstBindRewardTitle'.tr), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('firstBindRewardDesc'.tr), - SizedBox(height: 8.h), - Text('${'vipLevelLabel'.tr} Vip $lv'), - Text('${'expiryLabel'.tr} $expiryText'), - SizedBox(height: 8.h), - Text( - '${'aiChatCreditsLabel'.tr} ${User.instance.aichatintegral}'), - Text( - '${'translationCreditsLabel'.tr} ${User.instance.tradeintegral}'), - Text( - '${'meetingCreditsLabel'.tr} ${User.instance.meetintegral}'), - ], - ), + title: Text('bindRewardTitle'.tr), + content: Text('bindRewardSimpleDesc'.tr), actions: [ TextButton( onPressed: () => Get.back(), From 83417053c331d40829d2e486e51c78c9e8dcefc5 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 26 Nov 2025 16:46:36 +0800 Subject: [PATCH 082/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c2ceb54a4..bd4d5021f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.19+61 +version: 1.0.19+62 environment: sdk: ">=3.3.0 <4.0.0" From 450e35b8284d058141dbd08621babd9a49c7cac0 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 16:53:39 +0800 Subject: [PATCH 083/177] =?UTF-8?q?fix(meeting):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在编辑会议任务类型时添加加载状态指示,并修复任务类型更新逻辑以根据服务类型区分更新不同的任务服务。同时优化了会议详情的刷新机制。 --- .../controllers/meeting_details_controller.dart | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index b5111338a..927bb9f96 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -328,8 +328,20 @@ class MeetingDetailsController extends GetxController text += '${element['content']}\n'; } _everType = 3; + EasyLoading.show(); await SqfliteApi.editMeeting(id, {'tasktype': 2}); - _meetingTaskService.tasktype.value = 2; + meetingDetails.value.tasktype = 2; + meetingDetails.refresh(); + final storage = GetStorage(); + final String svc = + (storage.read("meeting_service_type_$id") ?? '').toString(); + final bool isFast = svc == 'fast'; + if (isFast) { + _meetingTaskService2.tasktype.value = 2; + } else { + _meetingTaskService.tasktype.value = 2; + } _summaryTaskService.addTaskList(id, text, prompt, outline); + EasyLoading.dismiss(); } } From 80eddf787335ec33162e53fcc416c1c7957b24ea Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:22:06 +0800 Subject: [PATCH 084/177] =?UTF-8?q?feat(=E4=BC=9A=E8=AE=AE=E5=8A=A9?= =?UTF-8?q?=E6=89=8B):=20=E6=B7=BB=E5=8A=A0=E6=9E=81=E9=80=9F=E7=89=88?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB=E6=9C=8D=E5=8A=A1=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 MeetingTaskService2 作为火山引擎极速版语音识别服务实现 修改相关控制器和服务以支持双版本语音识别服务切换 根据音频时长自动选择标准版或极速版服务 --- lib/core/bindings/initial_binding.dart | 3 + .../meeting/meeting_task_service.dart | 1 + .../meeting/meeting_task_service2.dart | 1155 +++++++++++++++++ .../meeting/meeting_upload_service.dart | 39 +- .../meeting/summary_task_service.dart | 27 + .../meeting_details_controller.dart | 46 +- .../controllers/meeting_home_controller.dart | 3 + 7 files changed, 1261 insertions(+), 13 deletions(-) create mode 100644 lib/data/services/meeting/meeting_task_service2.dart diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index e25234505..3ea94689f 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -11,6 +11,7 @@ import '../../../data/services/ast_service.dart'; import '../../../data/services/speech_impl/azure_ast_service.dart'; import 'package:get/get.dart'; import '../../data/services/meeting/meeting_task_service.dart'; +import '../../data/services/meeting/meeting_task_service2.dart'; import '../../data/services/meeting/meeting_upload_service.dart'; import '../../data/services/novice_guide_service.dart'; import '../../data/services/speech_factory.dart'; @@ -70,6 +71,8 @@ class InitialBinding extends Bindings { // 会议助手任务服务 Get.lazyPut(() => MeetingTaskService(), fenix: true); + // 会议助手任务服务(极速识别版) + Get.lazyPut(() => MeetingTaskService2(), fenix: true); // 会议助手总结任务服务 Get.lazyPut(() => SummaryTaskService(), fenix: true); diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 51b88520c..8dda746b6 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -15,6 +15,7 @@ import '../../../data/models/appconfig.dart'; import 'summary_task_service.dart'; ///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。 +///火山引擎录音文件识别大模型-标准版 class MeetingTaskService extends GetxService { final GetStorage _storage = GetStorage(); diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart new file mode 100644 index 000000000..e04681dff --- /dev/null +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -0,0 +1,1155 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:http/http.dart' as http; + +import '../db/sqflite_api.dart'; +import '../../../data/models/appconfig.dart'; +import '../../../core/utils/logger.dart'; +import '../../../core/utils/synchrodata.dart'; +import '../deapsound_ai_service.dart'; +import 'meeting_upload_service.dart'; +import 'meeting_task_service.dart'; +import 'summary_task_service.dart'; + +//火山引擎录音文件识别大模型-极速版 +class MeetingTaskService2 extends GetxService { + final GetStorage _storage = GetStorage(); + + MeetingUploadService get _uploadService => Get.find(); + SummaryTaskService get _summaryTaskService => Get.find(); + + List _taskList = []; + RxList taskFinishList = [].obs; + + bool _isTask = false; + + String _systemPrompt = ''; + String _userId = ''; + + late final String _appid; + late final String _token; + late final String _serviceUrl; + + int meetingId = 0; + RxInt tasktype = 1.obs; + List textList = []; + String summary = ''; + String overview = ''; + + @override + void onInit() { + super.onInit(); + _getAgent(); + _getTaskList(); + } + + void _getAgent() async { + Map userInfo = _storage.read("user_info"); + _userId = userInfo['user']['uid']; + _systemPrompt = AppConfig.isInitialized() + ? (AppConfig.agentsystemPrompt("meet_assistant") ?? '') + : ''; + final String base = AppConfig.env('VOLC_OPENSPEECH_BASE_URL_BIGMODEL') ?? + 'https://openspeech.bytedance.com/api/v3/auc/bigmodel'; + _appid = AppConfig.env('VOLC_OPENSPEECH_APP_ID') ?? ''; + _token = AppConfig.env('VOLC_OPENSPEECH_ACCESS_TOKEN') ?? ''; + _serviceUrl = + base.endsWith('/recognize/flash') ? base : (base + '/recognize/flash'); + } + + void _getTaskList() { + _taskList = _storage.read("meeting_task_list_v2") ?? []; + taskFinishList.value = _storage.read("meeting_task_finish_list_v2") ?? []; + _executeTask(); + } + + Future addTask( + int id, + String audiourl, { + bool isSpeaker = false, + String language = '', + String targetLanguage = '', + String prompt = '', + String outline = '', + }) async { + if (audiourl.isEmpty) { + Map uploadData = _uploadService.uploadList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (uploadData.isNotEmpty) { + if (uploadData['audiourl'].isEmpty) { + uploadData['isTask'] = true; + uploadData['template'] = { + 'isSpeaker': isSpeaker, + 'language': language, + 'targetLanguage': targetLanguage, + 'prompt': prompt, + 'outline': outline, + }; + _storage.write("meeting_upload_list", _uploadService.uploadList); + } else { + await addTaskList( + id, + uploadData['audiourl'], + isSpeaker: isSpeaker, + language: language, + targetLanguage: targetLanguage, + prompt: prompt, + outline: outline, + ); + } + } + } else { + await addTaskList( + id, + audiourl, + isSpeaker: isSpeaker, + language: language, + targetLanguage: targetLanguage, + prompt: prompt, + outline: outline, + ); + } + } + + Future addTaskList( + int id, + String audiourl, { + bool isSpeaker = false, + String language = '', + String targetLanguage = '', + String prompt = '', + String outline = '', + }) async { + await SqfliteApi.editMeeting(id, {'tasktype': 1}); + _taskList.add({ + 'id': id, + 'audiourl': audiourl, + 'tasktype': 1, + 'template': { + 'isSpeaker': isSpeaker, + 'language': language, + 'targetLanguage': targetLanguage, + 'prompt': prompt, + 'outline': outline, + }, + }); + taskFinishList.add({'id': id, 'tasktype': 1}); + _storage.write("meeting_task_list_v2", _taskList); + _storage.write("meeting_task_finish_list_v2", taskFinishList); + try { + final s1 = Get.find(); + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 3; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + _executeTask(); + } + + void _executeTask() async { + if (_isTask) return; + _isTask = true; + Logger.debug('Starting task execution. Task count: ${_taskList.length}'); + + while (_taskList.isNotEmpty) { + Logger.debug('Task execution loop. Remaining tasks: ${_taskList.length}'); + await Future.delayed(const Duration(seconds: 2)); + + // 创建任务列表的副本,避免在迭代过程中修改原列表 + List tasksCopy = List.from(_taskList); + + for (var element in tasksCopy) { + Logger.debug( + 'Processing task: ${element['id']} with audio: ${element['audiourl']}'); + + // 检查任务是否仍在列表中(可能已被其他地方移除) + if (_taskList.any((task) => task['id'] == element['id'])) { + try { + await _fileRecognize(element); + } catch (e) { + Logger.error('Failed to process task ${element['id']}: $e'); + // 确保失败的任务被移除,避免无限循环 + _taskList.removeWhere((task) => task['id'] == element['id']); + _storage.write("meeting_task_list_v2", _taskList); + + // 更新任务状态为失败 + await SqfliteApi.editMeeting(element['id'], {'tasktype': 0}); + } + } else { + Logger.debug( + 'Task ${element['id']} was already removed from task list'); + } + } + + // 如果没有任务被处理,避免无限循环 + if (_taskList.length == tasksCopy.length) { + Logger.warning( + 'No tasks were processed in this iteration. Breaking loop to avoid infinite execution.'); + break; + } + } + + _isTask = false; + Logger.debug( + 'Task execution completed. Remaining tasks: ${_taskList.length}'); + } + + void removeTask(int id, {bool isDeleteTask = false}) { + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + if (isDeleteTask || taskFinishData['tasktype'] >= 3) { + taskFinishList.remove(taskFinishData); + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } + } + if (isDeleteTask) { + _taskList.removeWhere((element) => element['id'] == id); + _storage.write("meeting_task_list_v2", _taskList); + } + } + + Future> _recognizeAudio( + String audiourl, { + bool enableSpeakerInfo = true, + String language = '', + }) async { + String requestId = DateTime.now().millisecondsSinceEpoch.toString(); + + // 为每次请求生成新的headers - 适配大模型极速版API + Map requestHeaders = { + 'X-Api-App-Key': _appid, + 'X-Api-Access-Key': _token, + 'X-Api-Resource-Id': 'volc.bigasr.auc_turbo', + 'X-Api-Request-Id': requestId, + 'X-Api-Sequence': '-1', + 'Content-Type': 'application/json', + }; + + // 使用大模型极速版API的新请求格式 + final Map requestPayload = { + "user": {"uid": _appid}, + "audio": {"url": audiourl}, + "request": { + "model_name": "bigmodel", + "enable_itn": true, + "enable_punc": true, + "enable_ddc": true, + "enable_speaker_info": enableSpeakerInfo, + "word_info": 1, + "show_utterances": true + } + }; + + if (language.isNotEmpty) { + requestPayload['request']['language'] = language; + } + + final String requestBody = jsonEncode(requestPayload); + + try { + // 记录请求详情 + Logger.debug('API Request URL: $_serviceUrl'); + Logger.debug('API Request Headers: $requestHeaders'); + Logger.debug('API Request Body: $requestBody'); + + final response = await http.post( + Uri.parse(_serviceUrl), + headers: requestHeaders, + body: requestBody, + ); + + Logger.debug('API Response Status: ${response.statusCode}'); + Logger.debug('API Response Headers: ${response.headers}'); + + if (response.statusCode != 200) { + Logger.error( + 'Recognition failed with status: ${response.statusCode}, body: ${response.body}'); + throw Exception( + 'Recognition failed with status: ${response.statusCode}'); + } + + final respDic = jsonDecode(response.body); + Logger.debug('Recognition response: $respDic'); + + // 检查响应中是否包含资源相关信息 + if (respDic.containsKey('resource_id') || respDic.containsKey('model')) { + Logger.debug( + 'Resource verification - Resource ID used: volc.bigasr.auc_turbo'); + Logger.debug( + 'Response resource info: ${respDic['resource_id'] ?? respDic['model'] ?? 'Not specified in response'}'); + } + + return respDic; + } catch (e) { + Logger.error('Recognition error: ${e.toString()}'); + rethrow; + } + } + + String _getFileType(String path) { + List array = path.split('.'); + return array[array.length - 1]; + } + + int _parseTime(dynamic timeValue) { + if (timeValue == null) return 0; + + if (timeValue is int) { + return timeValue; + } else if (timeValue is double) { + return timeValue.round(); + } else if (timeValue is String) { + try { + double parsed = double.parse(timeValue); + return parsed.round(); + } catch (e) { + Logger.error('Failed to parse time value: $timeValue'); + return 0; + } + } else { + Logger.error( + 'Unknown time value type: ${timeValue.runtimeType}, value: $timeValue'); + return 0; + } + } + + Future _fileRecognize(Map item) async { + try { + Logger.debug('Starting recognition for audio: ${item['audiourl']}'); + // 识别语言选取:若设置了目标输出语言且与录音语言一致,优先让ASR自动识别,避免错配 + final String tplLang = + (((item['template'] ?? {})['language']) ?? '').toString(); + final String tplTarget = + (((item['template'] ?? {})['targetLanguage']) ?? '').toString(); + String asrLanguage = tplLang; + if (tplTarget.isNotEmpty && tplTarget == tplLang) { + asrLanguage = ''; + } + var respDic = await _recognizeAudio( + item['audiourl'], + enableSpeakerInfo: + (((item['template'] ?? {})['isSpeaker']) ?? false) as bool, + language: asrLanguage, + ); + + Logger.debug('Full API response structure: ${respDic.toString()}'); + Logger.debug('Response keys: ${respDic.keys.toList()}'); + + // 检查响应格式并提取utterances + List utterances = []; + + // 检查不同可能的响应格式 + if (respDic['result'] != null && + respDic['result']['utterances'] != null) { + utterances = respDic['result']['utterances']; + Logger.debug( + 'Found utterances in result.utterances: ${utterances.length} items'); + } else if (respDic['resp'] != null && + respDic['resp']['utterances'] != null) { + utterances = respDic['resp']['utterances']; + Logger.debug( + 'Found utterances in resp.utterances: ${utterances.length} items'); + } else if (respDic['utterances'] != null) { + utterances = respDic['utterances']; + Logger.debug( + 'Found utterances in root.utterances: ${utterances.length} items'); + } else if (respDic['data'] != null && + respDic['data']['utterances'] != null) { + utterances = respDic['data']['utterances']; + Logger.debug( + 'Found utterances in data.utterances: ${utterances.length} items'); + } else if (respDic['response'] != null && + respDic['response']['utterances'] != null) { + utterances = respDic['response']['utterances']; + Logger.debug( + 'Found utterances in response.utterances: ${utterances.length} items'); + } else { + // 检查是否有错误信息 + if (respDic['error'] != null) { + Logger.error('API returned error: ${respDic['error']}'); + } else if (respDic['message'] != null) { + Logger.error('API returned message: ${respDic['message']}'); + } else { + Logger.error( + 'Unknown response format. Available keys: ${respDic.keys.toList()}'); + // 尝试查找任何包含文本的字段 + respDic.forEach((key, value) { + Logger.debug( + 'Key: $key, Value type: ${value.runtimeType}, Value: $value'); + }); + } + } + + if (utterances.isNotEmpty) { + Logger.debug('Processing ${utterances.length} utterances'); + await _addTextList(item['id'], utterances, item['template']); + // 从任务列表中移除已完成的任务 + _taskList.removeWhere((element) => element['id'] == item['id']); + _storage.write("meeting_task_list_v2", _taskList); + Logger.debug( + 'Recognition completed successfully for item ${item['id']}'); + + // 更新UI状态 - 如果是当前会议,触发UI更新 + if (item['id'] == meetingId) { + tasktype.value = 2; // 转写完成,进入分析阶段 + } + } else { + Logger.error( + "No utterances found in response. Full response: $respDic"); + print( + '🔥🔥🔥 NO UTTERANCES FOUND - STARTING SILENT AUDIO CHECK 🔥🔥🔥'); + print('=== DEBUGGING SILENT AUDIO DETECTION ==='); + print('Response keys: ${respDic.keys.toList()}'); + print('Response code: ${respDic['code']}'); + print('Response message: ${respDic['message']}'); + + // 检查是否为无声音频 + bool isSilentAudio = _checkIfSilentAudio(respDic); + print('Silent audio detection result: $isSilentAudio'); + + if (isSilentAudio) { + print('=== SILENT AUDIO DETECTED - SETTING TASKTYPE TO -1 ==='); + // 设置无声音频状态 (使用特殊值 -1) + await SqfliteApi.editMeeting(item['id'], {'tasktype': -1}); + if (item['id'] == meetingId) { + print('Setting tasktype.value to -1 for current meeting'); + tasktype.value = -1; // 无声音频 + } + + // 更新taskFinishList中的状态 + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = -1; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + try { + final s1 = Get.find(); + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 0; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + try { + final s1 = Get.find(); + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = -1; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + } else { + Logger.error('Recognition failed for unknown reason'); + // 识别失败,更新数据库状态为失败 + await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); + if (item['id'] == meetingId) { + tasktype.value = 0; // 识别失败 + } + + // 更新taskFinishList中的状态 + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == item['id'], + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 0; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } + + // 从任务列表中移除 + _taskList.removeWhere((element) => element['id'] == item['id']); + _storage.write("meeting_task_list_v2", _taskList); + } + } catch (e) { + Logger.error('Error occurred in _fileRecognize: ${e.toString()}'); + Logger.error('Stack trace: ${StackTrace.current}'); + + // 更新数据库状态为失败 + try { + await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); + } catch (dbError) { + Logger.error('Failed to update meeting status in database: $dbError'); + } + + // 出错时也要从任务列表中移除,避免无限重试 + _taskList.removeWhere((element) => element['id'] == item['id']); + _storage.write("meeting_task_list_v2", _taskList); + + // 更新UI状态 - 如果是当前会议,显示错误状态 + if (item['id'] == meetingId) { + tasktype.value = 0; // 识别失败 + } + } + } + + /// 检查是否为无声音频 + bool _checkIfSilentAudio(Map response) { + print('Checking if silent audio, response: ${response.toString()}'); + + // 检查API响应中的错误信息或状态码 + // 根据实际API响应格式调整检测逻辑 + + // 检查是否有错误码表示无声音频 + if (response['code'] != null) { + int code = response['code']; + print('Found response code: $code'); + // 常见的无声音频错误码 + if (code == 40001 || + code == 40002 || + code == 40003 || + code == 50001 || + code == 50002 || + code == 50003) { + print('Detected silent audio by error code: $code'); + return true; + } + } + + // 检查错误消息 + if (response['message'] != null) { + String message = response['message'].toString().toLowerCase(); + print('Found response message: $message'); + if (message.contains('silent') || + message.contains('no audio') || + message.contains('无声') || + message.contains('静音') || + message.contains('empty audio') || + message.contains('no speech') || + message.contains('audio too short') || + message.contains('insufficient audio')) { + print('Detected silent audio by message: $message'); + return true; + } + } + + // 检查result中的错误信息 + if (response['result'] != null && response['result']['error'] != null) { + String error = response['result']['error'].toString().toLowerCase(); + print('Found result error: $error'); + if (error.contains('silent') || + error.contains('no audio') || + error.contains('无声') || + error.contains('静音') || + error.contains('empty audio') || + error.contains('no speech') || + error.contains('audio too short')) { + print('Detected silent audio by result error: $error'); + return true; + } + } + + // 检查是否有音频时长信息且时长为0或极短 + if (response['result'] != null && response['result']['duration'] != null) { + double duration = (response['result']['duration'] as num).toDouble(); + print('Found audio duration: $duration seconds'); + if (duration <= 0.5) { + // 音频时长小于0.5秒认为是无声 + print('Detected silent audio by short duration: $duration'); + return true; + } + } + + // 检查utterances是否为空且没有其他明确的成功标识 + bool hasUtterances = false; + if (response['result'] != null && + response['result']['utterances'] != null) { + hasUtterances = (response['result']['utterances'] as List).isNotEmpty; + } else if (response['resp'] != null && + response['resp']['utterances'] != null) { + hasUtterances = (response['resp']['utterances'] as List).isNotEmpty; + } else if (response['utterances'] != null) { + hasUtterances = (response['utterances'] as List).isNotEmpty; + } else if (response['data'] != null && + response['data']['utterances'] != null) { + hasUtterances = (response['data']['utterances'] as List).isNotEmpty; + } else if (response['response'] != null && + response['response']['utterances'] != null) { + hasUtterances = (response['response']['utterances'] as List).isNotEmpty; + } + + // 检查文本内容是否为空 + String textContent = ''; + if (response['result'] != null && response['result']['text'] != null) { + textContent = response['result']['text'].toString().trim(); + } else if (response['text'] != null) { + textContent = response['text'].toString().trim(); + } else if (response['data'] != null && response['data']['text'] != null) { + textContent = response['data']['text'].toString().trim(); + } + + // 如果文本内容为空且音频时长大于1秒,很可能是无声音频 + if (textContent.isEmpty) { + double audioDuration = 0; + if (response['audio_info'] != null && + response['audio_info']['duration'] != null) { + audioDuration = (response['audio_info']['duration'] as num).toDouble() / + 1000; // 转换为秒 + } else if (response['result'] != null && + response['result']['additions'] != null && + response['result']['additions']['duration'] != null) { + audioDuration = + (response['result']['additions']['duration'] as num).toDouble() / + 1000; // 转换为秒 + } + + print('Found empty text content, audio duration: $audioDuration seconds'); + if (audioDuration > 1.0) { + // 音频时长大于1秒但没有文本内容,认为是无声音频 + print('Detected silent audio: empty text with sufficient duration'); + return true; + } + } + + // 如果没有utterances且响应状态正常,可能是无声音频 + if (!hasUtterances) { + // 检查是否有明确的成功状态码 + bool hasSuccessCode = false; + if (response['code'] != null) { + int code = response['code']; + hasSuccessCode = (code == 0 || code == 200); + } + + // 如果有成功状态码但没有utterances,很可能是无声音频 + if (hasSuccessCode) { + print('Detected silent audio: success code but no utterances'); + return true; + } + } + + print('Not detected as silent audio'); + return false; + } + + Future _addTextList(int id, List utterances, + [Map? templateData]) async { + Logger.debug('Processing ${utterances.length} utterances for meeting $id'); + String text = ''; + String personnel = ''; + List> list = []; + + for (int i = 0; i < utterances.length; i++) { + var element = utterances[i]; + Logger.debug('Processing utterance $i: ${element.toString()}'); + + String speaker = ''; + String content = ''; + int startTime = 0; + int endTime = 0; + + // 提取说话人信息 - 检查多种可能的字段名 + if (element['additions'] != null && element['additions'].isNotEmpty) { + if (element['additions']['speaker'] != null) { + speaker = 'Speaker ${element['additions']['speaker']}'; + } + } else if (element['speaker'] != null) { + speaker = 'Speaker ${element['speaker']}'; + } else if (element['speaker_id'] != null) { + speaker = 'Speaker ${element['speaker_id']}'; + } + + // 提取文本内容 - 检查多种可能的字段名 + if (element['text'] != null) { + content = element['text'].toString(); + } else if (element['content'] != null) { + content = element['content'].toString(); + } else if (element['transcript'] != null) { + content = element['transcript'].toString(); + } else { + Logger.error('No text content found in utterance: $element'); + continue; + } + + // 提取时间信息 - 检查多种可能的字段名和格式 + if (element['start_time'] != null) { + startTime = _parseTime(element['start_time']); + } else if (element['startTime'] != null) { + startTime = _parseTime(element['startTime']); + } else if (element['begin'] != null) { + startTime = _parseTime(element['begin']); + } + + if (element['end_time'] != null) { + endTime = _parseTime(element['end_time']); + } else if (element['endTime'] != null) { + endTime = _parseTime(element['endTime']); + } else if (element['end'] != null) { + endTime = _parseTime(element['end']); + } + + if (speaker.isNotEmpty) { + text += '[$speaker]: '; + if (!personnel.contains(speaker)) { + personnel += '[$speaker] '; + } + } + + list.add({ + 'meetingid': id, + 'content': content, + 'starttime': startTime, + 'endtime': endTime, + 'speaker': speaker, + }); + text += '$content\n'; + + Logger.debug( + 'Added utterance: speaker=$speaker, content=$content, start=$startTime, end=$endTime'); + } + + Logger.debug('Total processed utterances: ${list.length}'); + var result = await SqfliteApi.insertMeetingSpeaker(list); + if (result != null) { + // 初始用于总结/概览的文本,先用原始拼接文本作为默认值 + String summarySourceText = text; + // 根据目标语言决定是否需要翻译文本列表 + final String targetLanguage = + ((templateData?['targetLanguage']) ?? '').toString(); + final String sourceLanguage = + ((templateData?['language']) ?? '').toString(); + bool needTranslate = false; + if (targetLanguage.isNotEmpty) { + // 若未指定录音语言,默认认为需要翻译;否则当目标语言与录音语言主码不同则翻译 + if (sourceLanguage.isEmpty) { + needTranslate = true; + } else { + String srcPrefix = sourceLanguage.toLowerCase().substring(0, 2); + String tgtPrefix = targetLanguage.toLowerCase().substring(0, 2); + needTranslate = srcPrefix != tgtPrefix; + } + } + if (needTranslate) { + try { + // 保持在“正在转写”状态,先进行翻译为目标语言 + await _translateTextList(id, targetLanguage); + } catch (e) { + Logger.error('Translate transcript failed: ${e.toString()}'); + } + // 翻译完成后再写入 personnel、设置已完成并刷新 UI + await SqfliteApi.editMeeting( + id, {'tasktype': 2, 'personnel': personnel}); + List speakerList = await SqfliteApi.getMeetingSpeaker(id); + List newSpeakerList = List.from(speakerList); + Synchrodata.saveOperationRecord('update', { + 'original': jsonEncode(newSpeakerList), + 'id': id, + }); + if (id == meetingId) { + textList = newSpeakerList; + tasktype.value = 2; + } + try { + final s1 = Get.find(); + if (id == s1.meetingId) { + s1.textList = newSpeakerList; + s1.tasktype.value = 2; + } + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 2; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + try { + final s1 = Get.find(); + if (id == s1.meetingId) { + s1.textList = newSpeakerList; + s1.tasktype.value = 2; + } + Map taskFinishData1 = s1.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData1.isNotEmpty) { + taskFinishData1['tasktype'] = 2; + s1.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", s1.taskFinishList); + } catch (_) {} + // 用最新(已翻译)的文本重建总结/概览输入 + summarySourceText = ''; + for (var element in newSpeakerList) { + final String spk = (element['speaker'] ?? '').toString(); + final String cnt = (element['content'] ?? '').toString(); + if (spk.isNotEmpty) { + summarySourceText += '[$spk]: '; + } + summarySourceText += '$cnt\n'; + } + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 2; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } else { + // 原有中文直出流程 + await SqfliteApi.editMeeting( + id, {'tasktype': 2, 'personnel': personnel}); + List speakerList = await SqfliteApi.getMeetingSpeaker(id); + List newSpeakerList = List.from(speakerList); + Synchrodata.saveOperationRecord('update', { + 'original': jsonEncode(newSpeakerList), + 'id': id, + }); + if (id == meetingId) { + textList = newSpeakerList; + tasktype.value = 2; + } + // 仍使用最新DB中的文本构建总结/概览输入,避免与原始拼接文本不一致 + summarySourceText = ''; + for (var element in newSpeakerList) { + final String spk = (element['speaker'] ?? '').toString(); + final String cnt = (element['content'] ?? '').toString(); + if (spk.isNotEmpty) { + summarySourceText += '[$spk]: '; + } + summarySourceText += '$cnt\n'; + } + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 2; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } + // 使用统一的总结服务生成概览与总结 + final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); + final String tplOutline = ((templateData?['outline']) ?? '').toString(); + final String outCode = (((templateData?['targetLanguage']) ?? (templateData?['language']) ?? '') as String).toLowerCase(); + String langDesc = ''; + if (outCode.startsWith('zh')) { + langDesc = '中文'; + } else if (outCode.startsWith('en')) { + langDesc = '英文'; + } else if (outCode.startsWith('ja')) { + langDesc = '日文'; + } else if (outCode.startsWith('ko')) { + langDesc = '韩文'; + } else if (outCode.startsWith('fr')) { + langDesc = '法文'; + } else if (outCode.startsWith('de')) { + langDesc = '德文'; + } else if (outCode.startsWith('es')) { + langDesc = '西班牙文'; + } else if (outCode.startsWith('ru')) { + langDesc = '俄文'; + } else if (outCode.startsWith('it')) { + langDesc = '意大利文'; + } else if (outCode.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (outCode.startsWith('th')) { + langDesc = '泰文'; + } else if (outCode.startsWith('vi')) { + langDesc = '越南文'; + } + final String promptToUse = tplPrompt.isEmpty + ? (langDesc.isEmpty + ? '' + : '输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。') + : (langDesc.isEmpty + ? tplPrompt + : tplPrompt + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); + final String outlineToUse = tplOutline.isEmpty + ? (langDesc.isEmpty + ? '' + : '输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。') + : (langDesc.isEmpty + ? tplOutline + : tplOutline + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); + _summaryTaskService.addTaskList(id, summarySourceText, promptToUse, outlineToUse); + } + } + + Future _translateTextList(int id, String targetLanguage) async { + // 读取刚插入的文本条目 + List speakerList = await SqfliteApi.getMeetingSpeaker(id); + // 构造简洁的可翻译列表 + List toTranslate = speakerList + .map((e) => { + 'id': e['id'], + 'speaker': (e['speaker'] ?? '').toString(), + 'content': (e['content'] ?? '').toString(), + }) + .toList(); + + final String userJson = jsonEncode({ + 'targetLanguage': targetLanguage, + 'items': toTranslate, + }); + + // 根据目标语言构建提示语 + String tgtName = targetLanguage.toLowerCase(); + String langDesc = '目标语言'; + if (tgtName.startsWith('zh')) { + langDesc = '中文'; + } else if (tgtName.startsWith('en')) { + langDesc = '英文'; + } else if (tgtName.startsWith('ja')) { + langDesc = '日文'; + } else if (tgtName.startsWith('ko')) { + langDesc = '韩文'; + } else if (tgtName.startsWith('fr')) { + langDesc = '法文'; + } else if (tgtName.startsWith('de')) { + langDesc = '德文'; + } else if (tgtName.startsWith('es')) { + langDesc = '西班牙文'; + } else if (tgtName.startsWith('ru')) { + langDesc = '俄文'; + } else if (tgtName.startsWith('it')) { + langDesc = '意大利文'; + } else if (tgtName.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (tgtName.startsWith('th')) { + langDesc = '泰文'; + } else if (tgtName.startsWith('vi')) { + langDesc = '越南文'; + } + + final String systemPrompt = '你是专业的翻译助手。请将每条items中的content精准翻译为' + + langDesc + + ',保持术语专业、语气自然。仅返回JSON数组,元素形如{"id":<原id>,"content":"<翻译后文本>"},不要额外说明,不要漏掉任何一条。'; + + final String? translated = await DeapsoundAIService().sendMessage( + messages: [ + {'role': 'system', 'content': systemPrompt}, + {'role': 'user', 'content': userJson}, + ], + ); + + if (translated == null || translated.isEmpty) return; + List arr; + try { + arr = jsonDecode(translated); + } catch (_) { + // 若模型返回包裹对象,尝试取字段 + try { + final obj = jsonDecode(translated); + arr = (obj is Map && obj['data'] is List) ? (obj['data'] as List) : []; + } catch (e) { + Logger.error('Parse translation JSON failed: ${e.toString()}'); + return; + } + } + if (arr.isEmpty) return; + // 批量更新 + for (var item in arr) { + if (item is Map && item['id'] != null) { + await SqfliteApi.editMeetingSpeaker([ + { + 'id': item['id'], + 'content': (item['content'] ?? '').toString(), + } + ]); + } + } + // 刷新缓存 + if (id == meetingId) { + textList = await SqfliteApi.getMeetingSpeaker(id); + // 主动触发监听刷新 UI(MeetingDetailsController 通过监听 tasktype 同步 textList) + try { + tasktype.refresh(); + } catch (_) {} + } + } + + void aiServiceMessage(int id, String text, [Map? templateData]) { + int awaitQuantity = 0; + String summaryText = ''; + String overviewText = ''; + // 模板参数透传 + final bool tplIsSpeaker = ((templateData?['isSpeaker']) ?? false) as bool; + final String tplLanguage = ((templateData?['language']) ?? '').toString(); + final String tplOutline = ((templateData?['outline']) ?? '').toString(); + final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); + final String tplTargetLang = + ((templateData?['targetLanguage']) ?? '').toString(); + + // 构建系统prompt,如果有模板数据则整合模板prompt + String systemPrompt = + '您将扮演一名会议总结专家,拥有超强的信息归纳与细分能力。不仅能高效处理各类通用场景会议,精准提炼会议核心内容,为后续思维导图生成奠定坚实基础。若涉及人员,人员名称保留[]。'; + if (templateData != null) { + if (tplPrompt.isNotEmpty) { + systemPrompt += ' 特别要求:' + tplPrompt; + } + if (tplOutline.isNotEmpty) { + systemPrompt += ' 大纲:' + tplOutline; + } + // 当目标语言为空(自动识别)时,使用录音语言作为输出语言约束;否则使用目标语言 + final String outCode = + tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; + if (outCode.isNotEmpty) { + final String t = outCode.toLowerCase(); + String langDesc = '目标语言'; + if (t.startsWith('zh')) { + langDesc = '中文'; + } else if (t.startsWith('en')) { + langDesc = '英文'; + } else if (t.startsWith('ja')) { + langDesc = '日文'; + } else if (t.startsWith('ko')) { + langDesc = '韩文'; + } else if (t.startsWith('fr')) { + langDesc = '法文'; + } else if (t.startsWith('de')) { + langDesc = '德文'; + } else if (t.startsWith('es')) { + langDesc = '西班牙文'; + } else if (t.startsWith('ru')) { + langDesc = '俄文'; + } else if (t.startsWith('it')) { + langDesc = '意大利文'; + } else if (t.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (t.startsWith('hi')) { + langDesc = '印地文'; + } else if (t.startsWith('th')) { + langDesc = '泰文'; + } else if (t.startsWith('vi')) { + langDesc = '越南文'; + } + systemPrompt += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; + } + } + + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': systemPrompt, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + summaryText = value ?? ''; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + // 构建第二个系统prompt,如果有模板数据则整合模板prompt + String systemPrompt2 = '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。'; + if (templateData != null) { + if (tplPrompt.isNotEmpty) { + systemPrompt2 += ' 特别要求:' + tplPrompt; + } + if (tplOutline.isNotEmpty) { + systemPrompt2 += ' 大纲:' + tplOutline; + } + final String outCode2 = + tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; + if (outCode2.isNotEmpty) { + final String t = outCode2.toLowerCase(); + String langDesc = '目标语言'; + if (t.startsWith('zh')) { + langDesc = '中文'; + } else if (t.startsWith('en')) { + langDesc = '英文'; + } else if (t.startsWith('ja')) { + langDesc = '日文'; + } else if (t.startsWith('ko')) { + langDesc = '韩文'; + } else if (t.startsWith('fr')) { + langDesc = '法文'; + } else if (t.startsWith('de')) { + langDesc = '德文'; + } else if (t.startsWith('es')) { + langDesc = '西班牙文'; + } else if (t.startsWith('ru')) { + langDesc = '俄文'; + } else if (t.startsWith('it')) { + langDesc = '意大利文'; + } else if (t.startsWith('pt')) { + langDesc = '葡萄牙文'; + } else if (t.startsWith('hi')) { + langDesc = '印地文'; + } else if (t.startsWith('th')) { + langDesc = '泰文'; + } else if (t.startsWith('vi')) { + langDesc = '越南文'; + } + systemPrompt2 += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; + } + } + + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': systemPrompt2, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + overviewText = value ?? ''; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + } + + void _aiServiceValue(int id, String summaryText, String overviewText) { + SqfliteApi.editMeeting(id, { + 'tasktype': 3, + 'summary': summaryText, + 'overview': overviewText, + }); + if (id == meetingId) { + summary = summaryText; + overview = overviewText; + tasktype.value = 3; + } + try { + final s1 = Get.find(); + if (id == s1.meetingId) { + s1.tasktype.value = 3; + } + } catch (_) {} + Map taskFinishData = taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 3; + taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", taskFinishList); + } +} diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 63fde0f02..1ef2d59e2 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -5,6 +5,7 @@ import '../../../core/utils/logger.dart'; import '../../../core/utils/upload_oss.dart'; import '../db/sqflite_api.dart'; import 'meeting_task_service.dart'; +import 'meeting_task_service2.dart'; class MeetingUploadService extends GetxService { final _taskService = Get.find(); @@ -43,6 +44,12 @@ class MeetingUploadService extends GetxService { String rootDir, { bool isUpload = true, }) async { + bool flash = false; + try { + final details = await SqfliteApi.getMeetingDetails(id); + final int seconds = (details['seconds'] ?? 0) as int; + flash = seconds > 0 && seconds <= 7200; + } catch (_) {} uploadList.add({ 'id': id, 'filepath': filePath, @@ -53,6 +60,7 @@ class MeetingUploadService extends GetxService { 'language': '', 'prompt': '', 'outline': '', + 'useFlashASR': flash, }); _storage.write("meeting_upload_list", uploadList); if (isUpload) { @@ -82,15 +90,28 @@ class MeetingUploadService extends GetxService { {'audiourl': audiourl}, ); if (element['isTask']) { - await _taskService.addTaskList( - element['id'], - audiourl, - '', - element['isSpeaker'], - element['language'], - element['prompt'], - element['outline'], - ); + if (element['useFlashASR'] == true) { + final service2 = Get.find(); + await service2.addTaskList( + element['id'], + audiourl, + isSpeaker: element['isSpeaker'], + language: element['language'], + targetLanguage: '', + prompt: element['prompt'], + outline: element['outline'], + ); + } else { + await _taskService.addTaskList( + element['id'], + audiourl, + '', + element['isSpeaker'], + element['language'], + element['prompt'], + element['outline'], + ); + } } element['audiourl'] = audiourl; uploadProgress.value = 0.0; diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart index 5657c8b74..c29741359 100644 --- a/lib/data/services/meeting/summary_task_service.dart +++ b/lib/data/services/meeting/summary_task_service.dart @@ -5,9 +5,11 @@ import '../../../core/utils/logger.dart'; import '../db/sqflite_api.dart'; import '../deapsound_ai_service.dart'; import 'meeting_task_service.dart'; +import 'meeting_task_service2.dart'; class SummaryTaskService extends GetxService { final _taskService = Get.find(); + final _taskService2 = Get.find(); final GetStorage _storage = GetStorage(); @@ -137,11 +139,24 @@ class SummaryTaskService extends GetxService { 'summary': summaryText, 'overview': overviewText, }); + + // 更新 V1 Service 状态 if (id == _taskService.meetingId) { summary = summaryText; overview = overviewText; _taskService.tasktype.value = 3; } + + // 更新 V2 Service 状态 + if (id == _taskService2.meetingId) { + summary = summaryText; + overview = overviewText; + _taskService2.summary = summaryText; + _taskService2.overview = overviewText; + _taskService2.tasktype.value = 3; + } + + // 更新 V1 任务完成列表 Map taskFinishData = _taskService.taskFinishList.firstWhere( (element) => element['id'] == id, orElse: () => {}, @@ -151,6 +166,18 @@ class SummaryTaskService extends GetxService { _taskService.taskFinishList.refresh(); } _storage.write("meeting_task_finish_list", _taskService.taskFinishList); + + // 更新 V2 任务完成列表 + Map taskFinishData2 = _taskService2.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData2.isNotEmpty) { + taskFinishData2['tasktype'] = 3; + _taskService2.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list_v2", _taskService2.taskFinishList); + _taskList.removeWhere((element) => element['id'] == id); _storage.write("summary_task_list", _taskList); _isTask = false; diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index a65074b23..b7cd13d23 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -14,6 +14,7 @@ import 'package:path_provider/path_provider.dart'; import '../../../core/utils/synchrodata.dart'; import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; +import '../../../data/services/meeting/meeting_task_service2.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; import '../model/meeting_details_model.dart'; @@ -28,9 +29,11 @@ class MeetingDetailsController extends GetxController late AnimationController lottieController; late final Worker _tasktypeListener; + late final Worker _tasktypeListenerV2; final _meetingUploadService = Get.find(); final _meetingTaskService = Get.find(); + final _meetingTaskService2 = Get.find(); final _summaryTaskService = Get.find(); final PlayerController playerController = PlayerController(); @@ -106,11 +109,25 @@ class MeetingDetailsController extends GetxController } meetingDetails.refresh(); }); + _tasktypeListenerV2 = ever(_meetingTaskService2.tasktype, (value) { + meetingDetails.value.tasktype = value; + if (_everType <= value) { + if (value == 2) { + textList.value = _meetingTaskService2.textList; + } else if (value == 3) { + meetingDetails.value.summary = _meetingTaskService2.summary; + meetingDetails.value.overview = _meetingTaskService2.overview; + summaryNumberModifications.value++; + } + } + meetingDetails.refresh(); + }); } @override void onClose() { _tasktypeListener.dispose(); + _tasktypeListenerV2.dispose(); _currentDurationSubscription?.cancel(); _playerStateSubscription?.cancel(); tabController.dispose(); @@ -122,6 +139,7 @@ class MeetingDetailsController extends GetxController void popInvokedWithResult(didPop, result) async { _meetingUploadService.removeUpload(id); _meetingTaskService.removeTask(id); + _meetingTaskService2.removeTask(id); _meetingTaskService.meetingId = 0; } @@ -257,10 +275,30 @@ class MeetingDetailsController extends GetxController bool isSpeaker, String language, String prompt, String outline) async { EasyLoading.show(); _everType = 2; - String audiourl = meetingData.value.audiourl; - String taskId = meetingDetails.value.taskid; - await _meetingTaskService.addTask( - id, audiourl, taskId, isSpeaker, language, prompt, outline); + final String audiourl = meetingData.value.audiourl; + final int seconds = meetingData.value.seconds; + if (seconds > 0 && seconds <= 7200) { + await _meetingTaskService2.addTask( + id, + audiourl, + isSpeaker: isSpeaker, + language: language, + targetLanguage: '', + prompt: prompt, + outline: outline, + ); + } else { + final String taskId = meetingDetails.value.taskid; + await _meetingTaskService.addTask( + id, + audiourl, + taskId, + isSpeaker, + language, + prompt, + outline, + ); + } meetingDetails.value.tasktype = 1; meetingDetails.refresh(); EasyLoading.dismiss(); diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index db2ae56cc..9ac1bb6e7 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -19,6 +19,7 @@ import '../../../core/utils/permission_util.dart'; import 'package:share_plus/share_plus.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; +import '../../../data/services/meeting/meeting_task_service2.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; @@ -29,6 +30,7 @@ class MeetingHomeController extends GetxController { final meetingController = Get.find(); final meetingUploadService = Get.find(); final meetingTaskService = Get.find(); + final meetingTaskService2 = Get.find(); final summaryTaskService = Get.find(); final AudioPlayer _audioPlayer = AudioPlayer(); @@ -585,6 +587,7 @@ class MeetingHomeController extends GetxController { _deleteFile(filepath); meetingUploadService.removeUpload(id, isDeleteTask: true); meetingTaskService.removeTask(id, isDeleteTask: true); + meetingTaskService2.removeTask(id, isDeleteTask: true); } // 删除文件 From d748980e4271498a10323f514ad89f5cc3a6952f Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:28:00 +0800 Subject: [PATCH 085/177] =?UTF-8?q?feat(=E4=BC=9A=E8=AE=AE):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BC=9A=E8=AE=AE=E6=9C=8D=E5=8A=A1=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=92=8C=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加对会议服务类型的本地存储功能,并根据存储类型调整任务处理逻辑 --- .../services/meeting/meeting_upload_service.dart | 1 + .../controllers/meeting_details_controller.dart | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 1ef2d59e2..53a5f57d3 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -50,6 +50,7 @@ class MeetingUploadService extends GetxService { final int seconds = (details['seconds'] ?? 0) as int; flash = seconds > 0 && seconds <= 7200; } catch (_) {} + _storage.write("meeting_service_type_$id", flash ? 'fast' : 'standard'); uploadList.add({ 'id': id, 'filepath': filePath, diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index b7cd13d23..b197a8b86 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -9,6 +9,7 @@ import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import 'package:path_provider/path_provider.dart'; import '../../../core/utils/synchrodata.dart'; @@ -93,10 +94,16 @@ class MeetingDetailsController extends GetxController ..duration = const Duration(seconds: 2); final Map args = Get.arguments ?? {}; id = args['id']; + final storage = GetStorage(); + final String svc = + (storage.read("meeting_service_type_$id") ?? '').toString(); + final bool isFast = svc == 'fast'; _meetingTaskService.meetingId = id; + _meetingTaskService2.meetingId = id; _getDataDetails(); _loadJS(); _tasktypeListener = ever(_meetingTaskService.tasktype, (value) { + if (isFast) return; meetingDetails.value.tasktype = value; if (_everType <= value) { if (value == 2) { @@ -110,13 +117,14 @@ class MeetingDetailsController extends GetxController meetingDetails.refresh(); }); _tasktypeListenerV2 = ever(_meetingTaskService2.tasktype, (value) { + if (!isFast) return; meetingDetails.value.tasktype = value; if (_everType <= value) { if (value == 2) { textList.value = _meetingTaskService2.textList; } else if (value == 3) { - meetingDetails.value.summary = _meetingTaskService2.summary; - meetingDetails.value.overview = _meetingTaskService2.overview; + meetingDetails.value.summary = _summaryTaskService.summary; + meetingDetails.value.overview = _summaryTaskService.overview; summaryNumberModifications.value++; } } @@ -141,6 +149,7 @@ class MeetingDetailsController extends GetxController _meetingTaskService.removeTask(id); _meetingTaskService2.removeTask(id); _meetingTaskService.meetingId = 0; + _meetingTaskService2.meetingId = 0; } void _getDataDetails() async { @@ -277,6 +286,9 @@ class MeetingDetailsController extends GetxController _everType = 2; final String audiourl = meetingData.value.audiourl; final int seconds = meetingData.value.seconds; + final storage = GetStorage(); + storage.write("meeting_service_type_$id", + (seconds > 0 && seconds <= 7200) ? 'fast' : 'standard'); if (seconds > 0 && seconds <= 7200) { await _meetingTaskService2.addTask( id, From 2f7646ca3ae452ba4e8ef8dac5009e2cbf315fb7 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:34:10 +0800 Subject: [PATCH 086/177] =?UTF-8?q?fix(meeting):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E7=9B=91=E5=90=AC=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=92=8C=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正meeting_details_controller中任务类型监听逻辑,确保在快速模式下正确处理类型3的任务 调整meeting_task_service2中的代码格式,提高可读性 移除废弃的aiServiceMessage方法及相关代码 --- .../meeting/meeting_task_service2.dart | 172 +----------------- .../meeting_details_controller.dart | 4 +- 2 files changed, 8 insertions(+), 168 deletions(-) diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart index e04681dff..b6b455c43 100644 --- a/lib/data/services/meeting/meeting_task_service2.dart +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -851,7 +851,10 @@ class MeetingTaskService2 extends GetxService { // 使用统一的总结服务生成概览与总结 final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); final String tplOutline = ((templateData?['outline']) ?? '').toString(); - final String outCode = (((templateData?['targetLanguage']) ?? (templateData?['language']) ?? '') as String).toLowerCase(); + final String outCode = (((templateData?['targetLanguage']) ?? + (templateData?['language']) ?? + '') as String) + .toLowerCase(); String langDesc = ''; if (outCode.startsWith('zh')) { langDesc = '中文'; @@ -892,7 +895,8 @@ class MeetingTaskService2 extends GetxService { : (langDesc.isEmpty ? tplOutline : tplOutline + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); - _summaryTaskService.addTaskList(id, summarySourceText, promptToUse, outlineToUse); + _summaryTaskService.addTaskList( + id, summarySourceText, promptToUse, outlineToUse); } } @@ -988,168 +992,4 @@ class MeetingTaskService2 extends GetxService { } catch (_) {} } } - - void aiServiceMessage(int id, String text, [Map? templateData]) { - int awaitQuantity = 0; - String summaryText = ''; - String overviewText = ''; - // 模板参数透传 - final bool tplIsSpeaker = ((templateData?['isSpeaker']) ?? false) as bool; - final String tplLanguage = ((templateData?['language']) ?? '').toString(); - final String tplOutline = ((templateData?['outline']) ?? '').toString(); - final String tplPrompt = ((templateData?['prompt']) ?? '').toString(); - final String tplTargetLang = - ((templateData?['targetLanguage']) ?? '').toString(); - - // 构建系统prompt,如果有模板数据则整合模板prompt - String systemPrompt = - '您将扮演一名会议总结专家,拥有超强的信息归纳与细分能力。不仅能高效处理各类通用场景会议,精准提炼会议核心内容,为后续思维导图生成奠定坚实基础。若涉及人员,人员名称保留[]。'; - if (templateData != null) { - if (tplPrompt.isNotEmpty) { - systemPrompt += ' 特别要求:' + tplPrompt; - } - if (tplOutline.isNotEmpty) { - systemPrompt += ' 大纲:' + tplOutline; - } - // 当目标语言为空(自动识别)时,使用录音语言作为输出语言约束;否则使用目标语言 - final String outCode = - tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; - if (outCode.isNotEmpty) { - final String t = outCode.toLowerCase(); - String langDesc = '目标语言'; - if (t.startsWith('zh')) { - langDesc = '中文'; - } else if (t.startsWith('en')) { - langDesc = '英文'; - } else if (t.startsWith('ja')) { - langDesc = '日文'; - } else if (t.startsWith('ko')) { - langDesc = '韩文'; - } else if (t.startsWith('fr')) { - langDesc = '法文'; - } else if (t.startsWith('de')) { - langDesc = '德文'; - } else if (t.startsWith('es')) { - langDesc = '西班牙文'; - } else if (t.startsWith('ru')) { - langDesc = '俄文'; - } else if (t.startsWith('it')) { - langDesc = '意大利文'; - } else if (t.startsWith('pt')) { - langDesc = '葡萄牙文'; - } else if (t.startsWith('hi')) { - langDesc = '印地文'; - } else if (t.startsWith('th')) { - langDesc = '泰文'; - } else if (t.startsWith('vi')) { - langDesc = '越南文'; - } - systemPrompt += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; - } - } - - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': systemPrompt, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - summaryText = value ?? ''; - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - // 构建第二个系统prompt,如果有模板数据则整合模板prompt - String systemPrompt2 = '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。'; - if (templateData != null) { - if (tplPrompt.isNotEmpty) { - systemPrompt2 += ' 特别要求:' + tplPrompt; - } - if (tplOutline.isNotEmpty) { - systemPrompt2 += ' 大纲:' + tplOutline; - } - final String outCode2 = - tplTargetLang.isNotEmpty ? tplTargetLang : tplLanguage; - if (outCode2.isNotEmpty) { - final String t = outCode2.toLowerCase(); - String langDesc = '目标语言'; - if (t.startsWith('zh')) { - langDesc = '中文'; - } else if (t.startsWith('en')) { - langDesc = '英文'; - } else if (t.startsWith('ja')) { - langDesc = '日文'; - } else if (t.startsWith('ko')) { - langDesc = '韩文'; - } else if (t.startsWith('fr')) { - langDesc = '法文'; - } else if (t.startsWith('de')) { - langDesc = '德文'; - } else if (t.startsWith('es')) { - langDesc = '西班牙文'; - } else if (t.startsWith('ru')) { - langDesc = '俄文'; - } else if (t.startsWith('it')) { - langDesc = '意大利文'; - } else if (t.startsWith('pt')) { - langDesc = '葡萄牙文'; - } else if (t.startsWith('hi')) { - langDesc = '印地文'; - } else if (t.startsWith('th')) { - langDesc = '泰文'; - } else if (t.startsWith('vi')) { - langDesc = '越南文'; - } - systemPrompt2 += ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'; - } - } - - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': systemPrompt2, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - overviewText = value ?? ''; - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - } - - void _aiServiceValue(int id, String summaryText, String overviewText) { - SqfliteApi.editMeeting(id, { - 'tasktype': 3, - 'summary': summaryText, - 'overview': overviewText, - }); - if (id == meetingId) { - summary = summaryText; - overview = overviewText; - tasktype.value = 3; - } - try { - final s1 = Get.find(); - if (id == s1.meetingId) { - s1.tasktype.value = 3; - } - } catch (_) {} - Map taskFinishData = taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData.isNotEmpty) { - taskFinishData['tasktype'] = 3; - taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list_v2", taskFinishList); - } } diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index b197a8b86..96996c26c 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -103,10 +103,10 @@ class MeetingDetailsController extends GetxController _getDataDetails(); _loadJS(); _tasktypeListener = ever(_meetingTaskService.tasktype, (value) { - if (isFast) return; + if (isFast && value != 3) return; meetingDetails.value.tasktype = value; if (_everType <= value) { - if (value == 2) { + if (!isFast && value == 2) { textList.value = _meetingTaskService.textList; } else if (value == 3) { meetingDetails.value.summary = _summaryTaskService.summary; From e226ac65d4019f619954bbe7d4e19db36be38a8f Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 14:55:30 +0800 Subject: [PATCH 087/177] =?UTF-8?q?feat(=E4=BC=9A=E8=AE=AE=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1):=20=E5=BC=95=E5=85=A5=E4=BB=BB=E5=8A=A1=E8=81=9A?= =?UTF-8?q?=E5=90=88=E5=99=A8=E7=BB=9F=E4=B8=80=E7=AE=A1=E7=90=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=E4=B8=8E=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构会议任务服务架构,新增 MeetingTaskAggregator 服务聚合器,统一管理标准版与极速版任务服务的状态与列表数据: 1. 移除服务间直接状态同步逻辑,改为通过聚合器统一对外暴露状态 2. 新增聚合器服务并在初始绑定中注册 3. 修改各控制器使用聚合器替代直接服务引用 4. 优化极速版服务日志输出为中文 5. 清理冗余的状态同步代码 --- lib/core/bindings/initial_binding.dart | 6 +- .../meeting/meeting_task_aggregator.dart | 105 ++++++++ .../meeting/meeting_task_service2.dart | 228 ++++++------------ .../meeting_details_controller.dart | 3 + .../controllers/meeting_home_controller.dart | 2 + .../meeting/views/meeting_home_view.dart | 4 +- 6 files changed, 190 insertions(+), 158 deletions(-) create mode 100644 lib/data/services/meeting/meeting_task_aggregator.dart diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index 3ea94689f..2870209ff 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -12,6 +12,7 @@ import '../../../data/services/speech_impl/azure_ast_service.dart'; import 'package:get/get.dart'; import '../../data/services/meeting/meeting_task_service.dart'; import '../../data/services/meeting/meeting_task_service2.dart'; +import '../../data/services/meeting/meeting_task_aggregator.dart'; import '../../data/services/meeting/meeting_upload_service.dart'; import '../../data/services/novice_guide_service.dart'; import '../../data/services/speech_factory.dart'; @@ -71,8 +72,11 @@ class InitialBinding extends Bindings { // 会议助手任务服务 Get.lazyPut(() => MeetingTaskService(), fenix: true); - // 会议助手任务服务(极速识别版) + // 会议助手任务服务(极速识别版,2小时内音频) Get.lazyPut(() => MeetingTaskService2(), fenix: true); + // 会议助手任务服务聚合器(统一列表与状态) + Get.lazyPut(() => MeetingTaskAggregator(), + fenix: true); // 会议助手总结任务服务 Get.lazyPut(() => SummaryTaskService(), fenix: true); diff --git a/lib/data/services/meeting/meeting_task_aggregator.dart b/lib/data/services/meeting/meeting_task_aggregator.dart new file mode 100644 index 000000000..5de375cda --- /dev/null +++ b/lib/data/services/meeting/meeting_task_aggregator.dart @@ -0,0 +1,105 @@ +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import 'meeting_task_service.dart'; +import 'meeting_task_service2.dart'; + +/// 会议助手任务服务聚合器(统一列表与状态) +class MeetingTaskAggregator extends GetxService { + final GetStorage _storage = GetStorage(); + + final MeetingTaskService s1 = Get.find(); + final MeetingTaskService2 s2 = Get.find(); + + RxList taskFinishList = [].obs; + RxInt tasktype = 1.obs; + int meetingId = 0; + List textList = []; + + Worker? _w1; + Worker? _w2; + Worker? _wTasktype; + + @override + void onInit() { + super.onInit(); + _w1 = ever(s1.taskFinishList, (_) => _rebuild()); + _w2 = ever(s2.taskFinishList, (_) => _rebuild()); + _rebuild(); + } + + void setMeeting(int id) { + meetingId = id; + final String svc = + (_storage.read("meeting_service_type_$id") ?? '').toString(); + final bool isFast = svc == 'fast'; + _wTasktype?.dispose(); + if (isFast) { + _wTasktype = ever(s2.tasktype, (value) { + tasktype.value = value; + if (value == 2) { + textList = s2.textList; + } + }); + } else { + _wTasktype = ever(s1.tasktype, (value) { + tasktype.value = value; + if (value == 2) { + textList = s1.textList; + } + }); + } + } + + void clearMeeting() { + meetingId = 0; + _wTasktype?.dispose(); + _wTasktype = null; + } + + void _rebuild() { + final Set ids = {}; + for (var e in s1.taskFinishList) { + if (e is Map && e['id'] is int) ids.add(e['id'] as int); + } + for (var e in s2.taskFinishList) { + if (e is Map && e['id'] is int) ids.add(e['id'] as int); + } + final List unified = []; + for (final id in ids) { + final String svc = + (_storage.read("meeting_service_type_$id") ?? '').toString(); + final Map a = s1.taskFinishList.firstWhere( + (x) => x['id'] == id, + orElse: () => {}, + ); + final Map b = s2.taskFinishList.firstWhere( + (x) => x['id'] == id, + orElse: () => {}, + ); + int va = a.isNotEmpty ? ((a['tasktype'] ?? 0) as int) : -999; + int vb = b.isNotEmpty ? ((b['tasktype'] ?? 0) as int) : -999; + int v; + if (svc == 'fast') { + if (va != -999 && vb != -999) { + v = va >= vb ? va : vb; + } else { + v = vb != -999 ? vb : va; + } + } else if (svc == 'standard') { + if (va != -999 && vb != -999) { + v = va >= vb ? va : vb; + } else { + v = va != -999 ? va : vb; + } + } else { + if (va == -999 && vb == -999) { + continue; + } + v = va == -999 ? vb : (vb == -999 ? va : (va >= vb ? va : vb)); + } + unified.add({'id': id, 'tasktype': v}); + } + taskFinishList.value = unified; + } +} diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart index b6b455c43..8a414c076 100644 --- a/lib/data/services/meeting/meeting_task_service2.dart +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -10,7 +10,7 @@ import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; import '../deapsound_ai_service.dart'; import 'meeting_upload_service.dart'; -import 'meeting_task_service.dart'; +// 移除标准版服务桥接,改为通过聚合器对外暴露统一状态 import 'summary_task_service.dart'; //火山引擎录音文件识别大模型-极速版 @@ -140,43 +140,31 @@ class MeetingTaskService2 extends GetxService { taskFinishList.add({'id': id, 'tasktype': 1}); _storage.write("meeting_task_list_v2", _taskList); _storage.write("meeting_task_finish_list_v2", taskFinishList); - try { - final s1 = Get.find(); - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 3; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} + // 由聚合器统一对外呈现状态,不直接写入标准版列表 _executeTask(); } void _executeTask() async { if (_isTask) return; _isTask = true; - Logger.debug('Starting task execution. Task count: ${_taskList.length}'); + Logger.debug('开始执行任务,任务数量:${_taskList.length}'); while (_taskList.isNotEmpty) { - Logger.debug('Task execution loop. Remaining tasks: ${_taskList.length}'); + Logger.debug('任务循环执行,剩余任务:${_taskList.length}'); await Future.delayed(const Duration(seconds: 2)); // 创建任务列表的副本,避免在迭代过程中修改原列表 List tasksCopy = List.from(_taskList); for (var element in tasksCopy) { - Logger.debug( - 'Processing task: ${element['id']} with audio: ${element['audiourl']}'); + Logger.debug('处理任务:${element['id']},音频:${element['audiourl']}'); // 检查任务是否仍在列表中(可能已被其他地方移除) if (_taskList.any((task) => task['id'] == element['id'])) { try { await _fileRecognize(element); } catch (e) { - Logger.error('Failed to process task ${element['id']}: $e'); + Logger.error('处理任务失败:${element['id']},错误:$e'); // 确保失败的任务被移除,避免无限循环 _taskList.removeWhere((task) => task['id'] == element['id']); _storage.write("meeting_task_list_v2", _taskList); @@ -185,22 +173,19 @@ class MeetingTaskService2 extends GetxService { await SqfliteApi.editMeeting(element['id'], {'tasktype': 0}); } } else { - Logger.debug( - 'Task ${element['id']} was already removed from task list'); + Logger.debug('任务 ${element['id']} 已从任务列表移除'); } } // 如果没有任务被处理,避免无限循环 if (_taskList.length == tasksCopy.length) { - Logger.warning( - 'No tasks were processed in this iteration. Breaking loop to avoid infinite execution.'); + Logger.warning('本次循环未处理任何任务,为避免无限执行终止循环'); break; } } _isTask = false; - Logger.debug( - 'Task execution completed. Remaining tasks: ${_taskList.length}'); + Logger.debug('任务执行完成,剩余任务:${_taskList.length}'); } void removeTask(int id, {bool isDeleteTask = false}) { @@ -260,9 +245,9 @@ class MeetingTaskService2 extends GetxService { try { // 记录请求详情 - Logger.debug('API Request URL: $_serviceUrl'); - Logger.debug('API Request Headers: $requestHeaders'); - Logger.debug('API Request Body: $requestBody'); + Logger.debug('API 请求地址:$_serviceUrl'); + Logger.debug('API 请求头:$requestHeaders'); + Logger.debug('API 请求体:$requestBody'); final response = await http.post( Uri.parse(_serviceUrl), @@ -270,30 +255,27 @@ class MeetingTaskService2 extends GetxService { body: requestBody, ); - Logger.debug('API Response Status: ${response.statusCode}'); - Logger.debug('API Response Headers: ${response.headers}'); + Logger.debug('API 响应状态码:${response.statusCode}'); + Logger.debug('API 响应头:${response.headers}'); if (response.statusCode != 200) { - Logger.error( - 'Recognition failed with status: ${response.statusCode}, body: ${response.body}'); - throw Exception( - 'Recognition failed with status: ${response.statusCode}'); + Logger.error('识别失败,状态码:${response.statusCode},响应体:${response.body}'); + throw Exception('识别失败,状态码:${response.statusCode}'); } final respDic = jsonDecode(response.body); - Logger.debug('Recognition response: $respDic'); + Logger.debug('识别接口响应:$respDic'); // 检查响应中是否包含资源相关信息 if (respDic.containsKey('resource_id') || respDic.containsKey('model')) { + Logger.debug('资源校验 - 使用的资源ID:volc.bigasr.auc_turbo'); Logger.debug( - 'Resource verification - Resource ID used: volc.bigasr.auc_turbo'); - Logger.debug( - 'Response resource info: ${respDic['resource_id'] ?? respDic['model'] ?? 'Not specified in response'}'); + '响应中的资源信息:${respDic['resource_id'] ?? respDic['model'] ?? '响应未包含'}'); } return respDic; } catch (e) { - Logger.error('Recognition error: ${e.toString()}'); + Logger.error('识别请求异常:${e.toString()}'); rethrow; } } @@ -315,19 +297,18 @@ class MeetingTaskService2 extends GetxService { double parsed = double.parse(timeValue); return parsed.round(); } catch (e) { - Logger.error('Failed to parse time value: $timeValue'); + Logger.error('时间值解析失败:$timeValue'); return 0; } } else { - Logger.error( - 'Unknown time value type: ${timeValue.runtimeType}, value: $timeValue'); + Logger.error('未知的时间值类型:${timeValue.runtimeType},值:$timeValue'); return 0; } } Future _fileRecognize(Map item) async { try { - Logger.debug('Starting recognition for audio: ${item['audiourl']}'); + Logger.debug('开始识别音频:${item['audiourl']}'); // 识别语言选取:若设置了目标输出语言且与录音语言一致,优先让ASR自动识别,避免错配 final String tplLang = (((item['template'] ?? {})['language']) ?? '').toString(); @@ -344,8 +325,8 @@ class MeetingTaskService2 extends GetxService { language: asrLanguage, ); - Logger.debug('Full API response structure: ${respDic.toString()}'); - Logger.debug('Response keys: ${respDic.keys.toList()}'); + Logger.debug('API 全量响应结构:${respDic.toString()}'); + Logger.debug('响应包含的键:${respDic.keys.toList()}'); // 检查响应格式并提取utterances List utterances = []; @@ -354,77 +335,67 @@ class MeetingTaskService2 extends GetxService { if (respDic['result'] != null && respDic['result']['utterances'] != null) { utterances = respDic['result']['utterances']; - Logger.debug( - 'Found utterances in result.utterances: ${utterances.length} items'); + Logger.debug('在 result.utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['resp'] != null && respDic['resp']['utterances'] != null) { utterances = respDic['resp']['utterances']; - Logger.debug( - 'Found utterances in resp.utterances: ${utterances.length} items'); + Logger.debug('在 resp.utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['utterances'] != null) { utterances = respDic['utterances']; - Logger.debug( - 'Found utterances in root.utterances: ${utterances.length} items'); + Logger.debug('在根级 utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['data'] != null && respDic['data']['utterances'] != null) { utterances = respDic['data']['utterances']; - Logger.debug( - 'Found utterances in data.utterances: ${utterances.length} items'); + Logger.debug('在 data.utterances 中找到 ${utterances.length} 条语句'); } else if (respDic['response'] != null && respDic['response']['utterances'] != null) { utterances = respDic['response']['utterances']; - Logger.debug( - 'Found utterances in response.utterances: ${utterances.length} items'); + Logger.debug('在 response.utterances 中找到 ${utterances.length} 条语句'); } else { // 检查是否有错误信息 if (respDic['error'] != null) { - Logger.error('API returned error: ${respDic['error']}'); + Logger.error('接口返回错误:${respDic['error']}'); } else if (respDic['message'] != null) { - Logger.error('API returned message: ${respDic['message']}'); + Logger.error('接口返回消息:${respDic['message']}'); } else { - Logger.error( - 'Unknown response format. Available keys: ${respDic.keys.toList()}'); + Logger.error('未知的响应格式。可用键:${respDic.keys.toList()}'); // 尝试查找任何包含文本的字段 respDic.forEach((key, value) { - Logger.debug( - 'Key: $key, Value type: ${value.runtimeType}, Value: $value'); + Logger.debug('键:$key,值类型:${value.runtimeType},值:$value'); }); } } if (utterances.isNotEmpty) { - Logger.debug('Processing ${utterances.length} utterances'); + Logger.debug('开始处理 ${utterances.length} 条语句'); await _addTextList(item['id'], utterances, item['template']); // 从任务列表中移除已完成的任务 _taskList.removeWhere((element) => element['id'] == item['id']); _storage.write("meeting_task_list_v2", _taskList); - Logger.debug( - 'Recognition completed successfully for item ${item['id']}'); + Logger.debug('音频识别成功,会议ID:${item['id']}'); // 更新UI状态 - 如果是当前会议,触发UI更新 if (item['id'] == meetingId) { tasktype.value = 2; // 转写完成,进入分析阶段 } } else { - Logger.error( - "No utterances found in response. Full response: $respDic"); - print( - '🔥🔥🔥 NO UTTERANCES FOUND - STARTING SILENT AUDIO CHECK 🔥🔥🔥'); - print('=== DEBUGGING SILENT AUDIO DETECTION ==='); - print('Response keys: ${respDic.keys.toList()}'); - print('Response code: ${respDic['code']}'); - print('Response message: ${respDic['message']}'); + Logger.error('响应中未发现语句。完整响应:$respDic'); + Logger.debug('未检测到语句,开始执行无声音频检查'); + Logger.debug('无声音频检测调试信息'); + Logger.debug('响应键列表:${respDic.keys.toList()}'); + Logger.debug('响应代码:${respDic['code']}'); + Logger.debug('响应消息:${respDic['message']}'); // 检查是否为无声音频 bool isSilentAudio = _checkIfSilentAudio(respDic); - print('Silent audio detection result: $isSilentAudio'); + Logger.debug('无声检测结果:$isSilentAudio'); if (isSilentAudio) { - print('=== SILENT AUDIO DETECTED - SETTING TASKTYPE TO -1 ==='); + Logger.debug('检测到无声音频,设置任务类型为 -1'); // 设置无声音频状态 (使用特殊值 -1) await SqfliteApi.editMeeting(item['id'], {'tasktype': -1}); if (item['id'] == meetingId) { - print('Setting tasktype.value to -1 for current meeting'); + Logger.debug('当前会议设置 tasktype.value 为 -1'); tasktype.value = -1; // 无声音频 } @@ -438,32 +409,10 @@ class MeetingTaskService2 extends GetxService { taskFinishList.refresh(); } _storage.write("meeting_task_finish_list_v2", taskFinishList); - try { - final s1 = Get.find(); - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == item['id'], - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 0; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} - try { - final s1 = Get.find(); - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == item['id'], - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = -1; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} + // 由聚合器统一对外呈现状态,不直接写入标准版列表 + // 由聚合器统一对外呈现状态,不直接写入标准版列表 } else { - Logger.error('Recognition failed for unknown reason'); + Logger.error('识别失败,原因未知'); // 识别失败,更新数据库状态为失败 await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); if (item['id'] == meetingId) { @@ -487,14 +436,14 @@ class MeetingTaskService2 extends GetxService { _storage.write("meeting_task_list_v2", _taskList); } } catch (e) { - Logger.error('Error occurred in _fileRecognize: ${e.toString()}'); - Logger.error('Stack trace: ${StackTrace.current}'); + Logger.error('文件识别流程发生异常:${e.toString()}'); + Logger.error('堆栈信息:${StackTrace.current}'); // 更新数据库状态为失败 try { await SqfliteApi.editMeeting(item['id'], {'tasktype': 0}); } catch (dbError) { - Logger.error('Failed to update meeting status in database: $dbError'); + Logger.error('数据库更新会议状态失败:$dbError'); } // 出错时也要从任务列表中移除,避免无限重试 @@ -510,7 +459,7 @@ class MeetingTaskService2 extends GetxService { /// 检查是否为无声音频 bool _checkIfSilentAudio(Map response) { - print('Checking if silent audio, response: ${response.toString()}'); + Logger.debug('检查是否为无声音频,响应:${response.toString()}'); // 检查API响应中的错误信息或状态码 // 根据实际API响应格式调整检测逻辑 @@ -518,7 +467,7 @@ class MeetingTaskService2 extends GetxService { // 检查是否有错误码表示无声音频 if (response['code'] != null) { int code = response['code']; - print('Found response code: $code'); + Logger.debug('检测到响应代码:$code'); // 常见的无声音频错误码 if (code == 40001 || code == 40002 || @@ -526,7 +475,7 @@ class MeetingTaskService2 extends GetxService { code == 50001 || code == 50002 || code == 50003) { - print('Detected silent audio by error code: $code'); + Logger.debug('根据错误码判断为无声音频:$code'); return true; } } @@ -534,7 +483,7 @@ class MeetingTaskService2 extends GetxService { // 检查错误消息 if (response['message'] != null) { String message = response['message'].toString().toLowerCase(); - print('Found response message: $message'); + Logger.debug('检测到响应消息:$message'); if (message.contains('silent') || message.contains('no audio') || message.contains('无声') || @@ -543,7 +492,7 @@ class MeetingTaskService2 extends GetxService { message.contains('no speech') || message.contains('audio too short') || message.contains('insufficient audio')) { - print('Detected silent audio by message: $message'); + Logger.debug('根据消息判断为无声音频:$message'); return true; } } @@ -551,7 +500,7 @@ class MeetingTaskService2 extends GetxService { // 检查result中的错误信息 if (response['result'] != null && response['result']['error'] != null) { String error = response['result']['error'].toString().toLowerCase(); - print('Found result error: $error'); + Logger.debug('检测到 result.error:$error'); if (error.contains('silent') || error.contains('no audio') || error.contains('无声') || @@ -559,7 +508,7 @@ class MeetingTaskService2 extends GetxService { error.contains('empty audio') || error.contains('no speech') || error.contains('audio too short')) { - print('Detected silent audio by result error: $error'); + Logger.debug('根据 result.error 判断为无声音频:$error'); return true; } } @@ -567,10 +516,10 @@ class MeetingTaskService2 extends GetxService { // 检查是否有音频时长信息且时长为0或极短 if (response['result'] != null && response['result']['duration'] != null) { double duration = (response['result']['duration'] as num).toDouble(); - print('Found audio duration: $duration seconds'); + Logger.debug('检测到音频时长:$duration 秒'); if (duration <= 0.5) { // 音频时长小于0.5秒认为是无声 - print('Detected silent audio by short duration: $duration'); + Logger.debug('根据时长过短判断为无声音频:$duration'); return true; } } @@ -618,10 +567,10 @@ class MeetingTaskService2 extends GetxService { 1000; // 转换为秒 } - print('Found empty text content, audio duration: $audioDuration seconds'); + Logger.debug('文本内容为空,音频时长:$audioDuration 秒'); if (audioDuration > 1.0) { // 音频时长大于1秒但没有文本内容,认为是无声音频 - print('Detected silent audio: empty text with sufficient duration'); + Logger.debug('判断为无声音频:文本为空且时长充足'); return true; } } @@ -637,25 +586,25 @@ class MeetingTaskService2 extends GetxService { // 如果有成功状态码但没有utterances,很可能是无声音频 if (hasSuccessCode) { - print('Detected silent audio: success code but no utterances'); + Logger.debug('判断为无声音频:成功状态码但无语句'); return true; } } - print('Not detected as silent audio'); + Logger.debug('未判定为无声音频'); return false; } Future _addTextList(int id, List utterances, [Map? templateData]) async { - Logger.debug('Processing ${utterances.length} utterances for meeting $id'); + Logger.debug('处理会议 $id 的 ${utterances.length} 条语句'); String text = ''; String personnel = ''; List> list = []; for (int i = 0; i < utterances.length; i++) { var element = utterances[i]; - Logger.debug('Processing utterance $i: ${element.toString()}'); + Logger.debug('处理第 $i 条语句:${element.toString()}'); String speaker = ''; String content = ''; @@ -681,7 +630,7 @@ class MeetingTaskService2 extends GetxService { } else if (element['transcript'] != null) { content = element['transcript'].toString(); } else { - Logger.error('No text content found in utterance: $element'); + Logger.error('语句中未找到文本内容:$element'); continue; } @@ -718,11 +667,10 @@ class MeetingTaskService2 extends GetxService { }); text += '$content\n'; - Logger.debug( - 'Added utterance: speaker=$speaker, content=$content, start=$startTime, end=$endTime'); + Logger.debug('已添加语句:说话人=$speaker,内容=$content,开始=$startTime,结束=$endTime'); } - Logger.debug('Total processed utterances: ${list.length}'); + Logger.debug('处理完成的语句总数:${list.length}'); var result = await SqfliteApi.insertMeetingSpeaker(list); if (result != null) { // 初始用于总结/概览的文本,先用原始拼接文本作为默认值 @@ -748,7 +696,7 @@ class MeetingTaskService2 extends GetxService { // 保持在“正在转写”状态,先进行翻译为目标语言 await _translateTextList(id, targetLanguage); } catch (e) { - Logger.error('Translate transcript failed: ${e.toString()}'); + Logger.error('转写文本翻译失败:${e.toString()}'); } // 翻译完成后再写入 personnel、设置已完成并刷新 UI await SqfliteApi.editMeeting( @@ -763,38 +711,8 @@ class MeetingTaskService2 extends GetxService { textList = newSpeakerList; tasktype.value = 2; } - try { - final s1 = Get.find(); - if (id == s1.meetingId) { - s1.textList = newSpeakerList; - s1.tasktype.value = 2; - } - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 2; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} - try { - final s1 = Get.find(); - if (id == s1.meetingId) { - s1.textList = newSpeakerList; - s1.tasktype.value = 2; - } - Map taskFinishData1 = s1.taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData1.isNotEmpty) { - taskFinishData1['tasktype'] = 2; - s1.taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", s1.taskFinishList); - } catch (_) {} + // 由聚合器统一对外呈现状态,不直接写入标准版列表 + // 由聚合器统一对外呈现状态,不直接写入标准版列表 // 用最新(已翻译)的文本重建总结/概览输入 summarySourceText = ''; for (var element in newSpeakerList) { @@ -967,7 +885,7 @@ class MeetingTaskService2 extends GetxService { final obj = jsonDecode(translated); arr = (obj is Map && obj['data'] is List) ? (obj['data'] as List) : []; } catch (e) { - Logger.error('Parse translation JSON failed: ${e.toString()}'); + Logger.error('翻译结果 JSON 解析失败:${e.toString()}'); return; } } diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 96996c26c..b5111338a 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -18,6 +18,7 @@ import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_task_service2.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; +import '../../../data/services/meeting/meeting_task_aggregator.dart'; import '../model/meeting_details_model.dart'; import '../model/meeting_model.dart'; @@ -100,6 +101,7 @@ class MeetingDetailsController extends GetxController final bool isFast = svc == 'fast'; _meetingTaskService.meetingId = id; _meetingTaskService2.meetingId = id; + Get.find().setMeeting(id); _getDataDetails(); _loadJS(); _tasktypeListener = ever(_meetingTaskService.tasktype, (value) { @@ -141,6 +143,7 @@ class MeetingDetailsController extends GetxController tabController.dispose(); playerController.dispose(); lottieController.dispose(); + Get.find().clearMeeting(); super.onClose(); } diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index 9ac1bb6e7..fcea611a4 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -20,6 +20,7 @@ import 'package:share_plus/share_plus.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_task_service2.dart'; +import '../../../data/services/meeting/meeting_task_aggregator.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; @@ -31,6 +32,7 @@ class MeetingHomeController extends GetxController { final meetingUploadService = Get.find(); final meetingTaskService = Get.find(); final meetingTaskService2 = Get.find(); + final taskAggregator = Get.find(); final summaryTaskService = Get.find(); final AudioPlayer _audioPlayer = AudioPlayer(); diff --git a/lib/modules/meeting/views/meeting_home_view.dart b/lib/modules/meeting/views/meeting_home_view.dart index 81cd3b22b..f9a9dd988 100644 --- a/lib/modules/meeting/views/meeting_home_view.dart +++ b/lib/modules/meeting/views/meeting_home_view.dart @@ -320,8 +320,8 @@ class _MeetingHomeViewState extends State : const SizedBox(); }), Obx(() { - Map taskData = - _controller.meetingTaskService.taskFinishList.firstWhere( + Map taskData = _controller.taskAggregator.taskFinishList + .firstWhere( (element) => element['id'] == data.id, orElse: () => {}, ); From e00d04317dee38229e99385e10ebc892749466f2 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 16:53:39 +0800 Subject: [PATCH 088/177] =?UTF-8?q?fix(meeting):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在编辑会议任务类型时添加加载状态指示,并修复任务类型更新逻辑以根据服务类型区分更新不同的任务服务。同时优化了会议详情的刷新机制。 --- .../controllers/meeting_details_controller.dart | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index b5111338a..927bb9f96 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -328,8 +328,20 @@ class MeetingDetailsController extends GetxController text += '${element['content']}\n'; } _everType = 3; + EasyLoading.show(); await SqfliteApi.editMeeting(id, {'tasktype': 2}); - _meetingTaskService.tasktype.value = 2; + meetingDetails.value.tasktype = 2; + meetingDetails.refresh(); + final storage = GetStorage(); + final String svc = + (storage.read("meeting_service_type_$id") ?? '').toString(); + final bool isFast = svc == 'fast'; + if (isFast) { + _meetingTaskService2.tasktype.value = 2; + } else { + _meetingTaskService.tasktype.value = 2; + } _summaryTaskService.addTaskList(id, text, prompt, outline); + EasyLoading.dismiss(); } } From 636551c4ea9a7284f3969e1f630aebc7380425b8 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 26 Nov 2025 17:15:44 +0800 Subject: [PATCH 089/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=95=86=E5=93=81?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E9=A1=B5=E9=9D=A2=E9=80=BB=E8=BE=91=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/goods_base_controller.dart | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 17dd976df..4e0807463 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -99,6 +99,8 @@ abstract class GoodsBaseController extends GetxController { bool ok = false; String failMsg = '支付失败,请重试'; + isPaying.value = true; + _startPayingTimeout(); if (method == _PayMethod.wechat) { ok = await payWechat(item, onResult: (success, msg) { if (!success) failMsg = msg ?? failMsg; @@ -454,9 +456,13 @@ abstract class GoodsBaseController extends GetxController { // 先透传给外部回调 onResult?.call(success, msg); if (success) { + isPaying.value = false; + _cancelPayingTimeout(); await _confirmOrderAndShow(orderId, channel: '微信', initialMessage: msg); } else { + isPaying.value = false; + _cancelPayingTimeout(); _showPayResultDialog(false, msg ?? '支付失败'); } }, @@ -483,9 +489,13 @@ abstract class GoodsBaseController extends GetxController { onResult: (success, msg) async { onResult?.call(success, msg); if (success) { + isPaying.value = false; + _cancelPayingTimeout(); await _confirmOrderAndShow(orderId, channel: '支付宝', initialMessage: msg); } else { + isPaying.value = false; + _cancelPayingTimeout(); _showPayResultDialog(false, msg ?? '支付失败'); } }, @@ -506,9 +516,6 @@ abstract class GoodsBaseController extends GetxController { onResult?.call(false, '创建 Apple 订单失败'); return false; } - isPaying.value = true; - _startPayingTimeout(); - // 使用商品id作为内购的 productId(与后台保持一致) final productId = item.id; // 解析为 App Store 的真实商品ID(支持前缀/映射) @@ -819,7 +826,10 @@ abstract class GoodsBaseController extends GetxController { final host = uri.host; final path = uri.path; if (scheme == 'deepvoiceclient' && host == 'paypal') { + isPaying.value = false; if (path == '/return') { + isPaying.value = false; + _cancelPayingTimeout(); print('[PayPal] 检测到 /return,使用 orderId 回查: $orderId'); await _confirmOrderAndShow( orderId, @@ -829,6 +839,8 @@ abstract class GoodsBaseController extends GetxController { intervalMs: 0, ); } else if (path == '/cancel') { + isPaying.value = false; + _cancelPayingTimeout(); _showPayResultDialog(false, '已取消支付'); } // 一次性监听,处理后即取消 @@ -836,6 +848,8 @@ abstract class GoodsBaseController extends GetxController { _deeplinkSub = null; } }, onError: (e) { + isPaying.value = false; + _cancelPayingTimeout(); // 忽略监听错误,保持现有轮询逻辑 }); return _payService.paypalPay( From 3b56247b66f182ced14cfe6ce6fcc4f7ea7fe11b Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Thu, 27 Nov 2025 15:46:25 +0800 Subject: [PATCH 090/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E9=80=9A=E9=81=93=EF=BC=8Cphy=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunqiinnovation/ble_service/BleService.kt | 146 +++++++++++++----- 1 file changed, 104 insertions(+), 42 deletions(-) diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt index 02f2c6cc6..1fc62da1b 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt @@ -134,6 +134,12 @@ object BleService { private var maxMtu = 517 // 最大MTU值 (512 + 5字节头部) private var isWaitingForWriteCallback = false // 是否正在等待写入回调 + // 通知注册串行化相关变量 + private val notificationSetupQueue: ArrayDeque = ArrayDeque() + private var isDescriptorWriteInProgress = false + private var notificationTargetsTotal = 0 + private var notificationTargetsSucceeded = 0 + // 初始化状态 private var isInitialized = false @@ -743,33 +749,6 @@ object BleService { updateConnectionState(BleConst.STATE_CONNECTED) Log.d(TAG, "成功连接Ble蓝牙设备:${g.device.name}") companionManager?.unregisterBackgroundScan() - // 设置PHY值为2M以提高传输速度 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - try { - // 首先尝试读取当前PHY状态 - val readResult = g.readPhy() - Log.d(TAG, "读取PHY状态请求结果: $readResult") - - // 延迟一段时间后再设置PHY,确保readPhy完成 - Handler(Looper.getMainLooper()).postDelayed({ - try { - val setResult = g.setPreferredPhy( - BluetoothDevice.PHY_LE_2M_MASK, // TX PHY: 2M - BluetoothDevice.PHY_LE_2M_MASK, // RX PHY: 2M - BluetoothDevice.PHY_OPTION_NO_PREFERRED - ) - Log.d(TAG, "设置PHY为2M请求结果: $setResult") - } catch (e: Exception) { - Log.w(TAG, "设置PHY失败: ${e.message}") - } - }, 500) // 延迟500ms - } catch (e: Exception) { - Log.w(TAG, "读取PHY失败: ${e.message},将使用默认1M PHY") - } - } else { - Log.w(TAG, "当前Android版本不支持PHY设置(需要API 26+),使用默认1M PHY") - } - g.discoverServices() } @@ -861,20 +840,23 @@ object BleService { startBytesStatistics() writeChar?.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE callWriteChar?.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE - //要先设置音频服务的通知,否则接收不到 - // 设置音频服务的通知(如果存在) + // 串行注册通知:等待上一个通道成功后再注册下一个 + notificationSetupQueue.clear() + isDescriptorWriteInProgress = false + notificationTargetsTotal = 0 + notificationTargetsSucceeded = 0 if (callAudioChar != null && audioChar != null) { - setupNotifications(g, callAudioChar) - setupNotifications(g, audioChar) - - - Log.i(TAG, "通话音频服务特征找到并设置通知") - + notificationSetupQueue.add(callAudioChar!!) + notificationSetupQueue.add(audioChar!!) + Log.i(TAG, "通话音频服务特征找到,准备串行开启通知") } else { - Log.w(TAG, "通话音频服务特征未找到") + Log.w(TAG, "通话音频服务特征未完整找到") } - - setupNotifications(g, notifyChar) + // 将命令通知通道也纳入串行队列,避免并发写入描述符 + notifyChar?.let { notificationSetupQueue.add(it) } + notificationTargetsTotal = notificationSetupQueue.size + // 启动处理队列 + processNextNotificationDescriptor(g) // 在服务发现完成后,请求最大MTU //requestMaxMtu(g) @@ -951,8 +933,27 @@ object BleService { override fun onDescriptorWrite( g: BluetoothGatt, d: BluetoothGattDescriptor, status: Int ) { - if (status == BluetoothGatt.GATT_SUCCESS) - Log.i(TAG, "通知描述符写入成功: ${d.characteristic.uuid}") + if (d.uuid == BleConst.CLIENT_CHAR_CONFIG_UUID) { + val charUuid = d.characteristic.uuid + if (status == BluetoothGatt.GATT_SUCCESS) { + Log.i(TAG, "通知描述符写入成功: ${charUuid}") + notificationTargetsSucceeded++ + } else { + Log.e(TAG, "通知描述符写入失败: ${charUuid}, status=${status}") + } + + // 当前一次写入完成,移除队首并继续处理下一个 + if (notificationSetupQueue.isNotEmpty() && notificationSetupQueue.first().uuid == charUuid) { + notificationSetupQueue.removeFirst() + } + isDescriptorWriteInProgress = false + // 如果所有通知已处理完毕,且全部成功,则设置PHY + if (notificationSetupQueue.isEmpty()) { + onAllNotificationsProcessed(g) + } else { + processNextNotificationDescriptor(g) + } + } } /** @@ -1010,6 +1011,66 @@ object BleService { } return true } + + /** + * 串行处理通知描述符写入队列 + * 功能:遵循Android BLE单操作约束,确保按顺序开启各通道通知 + * @param g BluetoothGatt实例 + */ + private fun processNextNotificationDescriptor(g: BluetoothGatt) { + if (isDescriptorWriteInProgress) return + val next = notificationSetupQueue.firstOrNull() ?: run { + onAllNotificationsProcessed(g) + return + } + val started = setupNotifications(g, next) + if (started) { + isDescriptorWriteInProgress = true + } else { + // 当前特征无法启动通知,跳过并尝试下一个 + notificationSetupQueue.removeFirst() + processNextNotificationDescriptor(g) + } + } + + /** + * 所有通知通道处理完成后的回调:在全部成功时设置PHY + */ + private fun onAllNotificationsProcessed(g: BluetoothGatt) { + if (notificationTargetsTotal > 0 && notificationTargetsSucceeded == notificationTargetsTotal) { + applyPreferredPhy(g) + } else { + Log.w(TAG, "通知通道未全部注册成功(${notificationTargetsSucceeded}/${notificationTargetsTotal}),跳过PHY设置") + } + } + + /** + * 读取并设置首选PHY为2M(仅API 26+) + */ + private fun applyPreferredPhy(g: BluetoothGatt) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + val readResult = g.readPhy() + Log.d(TAG, "读取PHY状态请求结果: $readResult") + Handler(Looper.getMainLooper()).postDelayed({ + try { + val setResult = g.setPreferredPhy( + BluetoothDevice.PHY_LE_2M_MASK, + BluetoothDevice.PHY_LE_2M_MASK, + BluetoothDevice.PHY_OPTION_NO_PREFERRED + ) + Log.d(TAG, "设置PHY为2M请求结果: $setResult") + } catch (e: Exception) { + Log.w(TAG, "设置PHY失败: ${e.message}") + } + }, 500) + } catch (e: Exception) { + Log.w(TAG, "读取PHY失败: ${e.message},将使用默认1M PHY") + } + } else { + Log.w(TAG, "当前Android版本不支持PHY设置(需要API 26+),使用默认1M PHY") + } + } /** * 请求最大MTU值 @@ -1033,6 +1094,7 @@ object BleService { * @param data 音频数据 (Opus编码) */ private fun processAudioData(data: ByteArray) { + recordfile?.saveAudioDataToWav(data) // 委托给Opus音频管理器处理 opusAudioManager.processAudioData(data) } @@ -1344,6 +1406,8 @@ object BleService { */ fun closeCodec(): Boolean { Log.i(TAG, "关闭编解码...") + recordfile?.closeFile() + recordfile1?.closeFile() val cmdData = byteArrayOf( BleConst.CODEC_CONTROL_CLOSE.toByte(), BleConst.AUDIO_CHANNEL_STEREO.toByte() @@ -1688,5 +1752,3 @@ object BleService { } } - - From 7c93d43bcf22c4fd37782103ecd5767865ca1fa6 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 26 Nov 2025 18:56:36 +0800 Subject: [PATCH 091/177] =?UTF-8?q?fix(meeting):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E9=87=8F=E7=BB=9F=E8=AE=A1=E6=9C=8D=E5=8A=A1=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 处理用量统计服务可能未注册的情况,添加try-catch捕获异常 在关键操作点添加详细日志记录,便于问题排查 完善会议任务服务中的用量统计功能 --- .../meeting/meeting_task_service.dart | 26 ++++++-- .../meeting/meeting_task_service2.dart | 62 ++++++++++++++++++- lib/data/services/usage_stats_service.dart | 25 ++++++++ 3 files changed, 105 insertions(+), 8 deletions(-) diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 8dda746b6..3d7886b19 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -187,7 +187,14 @@ class MeetingTaskService extends GetxService { transcriptBytes: 0, completeTimestamp: 0, ); - Get.find().addMeetingAsrRecord(record); + try { + final svc = Get.isRegistered() + ? Get.find() + : Get.put(UsageStatsService(), permanent: true); + svc.addMeetingAsrRecord(record); + } catch (e) { + Logger.w('MeetingASRrecord', '提交用量记录失败: ' + e.toString()); + } } catch (_) {} _taskList.add({ 'id': id, @@ -451,11 +458,18 @@ class MeetingTaskService extends GetxService { final details = await SqfliteApi.getMeetingDetails(id); final tid = (details['taskid'] ?? '') as String; final transcriptBytes = utf8.encode(text).length; - Get.find().completeMeetingAsrRecord( - id: tid, - transcriptBytes: transcriptBytes, - completeTimestamp: DateTime.now().millisecondsSinceEpoch, - ); + try { + final svc = Get.isRegistered() + ? Get.find() + : Get.put(UsageStatsService(), permanent: true); + svc.completeMeetingAsrRecord( + id: tid, + transcriptBytes: transcriptBytes, + completeTimestamp: DateTime.now().millisecondsSinceEpoch, + ); + } catch (e) { + Logger.w('MeetingASRrecord', '完成用量记录失败: ' + e.toString()); + } } catch (_) {} // 触发AI分析,分别请求总结和概览 diff --git a/lib/data/services/meeting/meeting_task_service2.dart b/lib/data/services/meeting/meeting_task_service2.dart index 8a414c076..ff69e20ff 100644 --- a/lib/data/services/meeting/meeting_task_service2.dart +++ b/lib/data/services/meeting/meeting_task_service2.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; @@ -8,6 +9,8 @@ import '../db/sqflite_api.dart'; import '../../../data/models/appconfig.dart'; import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; +import '../usage_stats_service.dart'; +import '../../../data/models/meeting_usage_stats.dart'; import '../deapsound_ai_service.dart'; import 'meeting_upload_service.dart'; // 移除标准版服务桥接,改为通过聚合器对外暴露统一状态 @@ -124,11 +127,45 @@ class MeetingTaskService2 extends GetxService { String prompt = '', String outline = '', }) async { - await SqfliteApi.editMeeting(id, {'tasktype': 1}); + final String taskId = DateTime.now().millisecondsSinceEpoch.toString(); + await SqfliteApi.editMeeting(id, {'tasktype': 1, 'taskid': taskId}); + + try { + final detail = await SqfliteApi.getMeetingDetails(id); + final seconds = (detail['seconds'] ?? 0) as int; + final filepath = (detail['filepath'] ?? '') as String; + int fileSizeBytes = 0; + if (filepath.isNotEmpty) { + try { + fileSizeBytes = await File(filepath).length(); + } catch (_) {} + } + final record = MeetingAsrRecord( + id: taskId, + meetingId: id, + taskId: taskId, + audioSeconds: seconds, + fileSizeBytes: fileSizeBytes, + language: language, + submitTimestamp: DateTime.now().millisecondsSinceEpoch, + status: asrStatusProcessing, + transcriptBytes: 0, + completeTimestamp: 0, + ); + try { + final svc = Get.isRegistered() + ? Get.find() + : Get.put(UsageStatsService(), permanent: true); + svc.addMeetingAsrRecord(record); + } catch (e) { + Logger.w('MeetingASRrecord', '提交用量记录失败: ' + e.toString()); + } + } catch (_) {} _taskList.add({ 'id': id, 'audiourl': audiourl, 'tasktype': 1, + 'taskid': taskId, 'template': { 'isSpeaker': isSpeaker, 'language': language, @@ -209,8 +246,10 @@ class MeetingTaskService2 extends GetxService { String audiourl, { bool enableSpeakerInfo = true, String language = '', + String? requestIdOverride, }) async { - String requestId = DateTime.now().millisecondsSinceEpoch.toString(); + String requestId = + requestIdOverride ?? DateTime.now().millisecondsSinceEpoch.toString(); // 为每次请求生成新的headers - 适配大模型极速版API Map requestHeaders = { @@ -323,6 +362,9 @@ class MeetingTaskService2 extends GetxService { enableSpeakerInfo: (((item['template'] ?? {})['isSpeaker']) ?? false) as bool, language: asrLanguage, + requestIdOverride: (item['taskid'] ?? '').toString().isEmpty + ? null + : (item['taskid'] ?? '').toString(), ); Logger.debug('API 全量响应结构:${respDic.toString()}'); @@ -813,6 +855,22 @@ class MeetingTaskService2 extends GetxService { : (langDesc.isEmpty ? tplOutline : tplOutline + ' 输出语言:' + langDesc + '。请全程使用' + langDesc + '输出。'); + try { + final details = await SqfliteApi.getMeetingDetails(id); + final tid = (details['taskid'] ?? '') as String; + final transcriptBytes = utf8.encode(summarySourceText).length; + final svc = Get.isRegistered() + ? Get.find() + : Get.put(UsageStatsService(), permanent: true); + svc.completeMeetingAsrRecord( + id: tid, + transcriptBytes: transcriptBytes, + completeTimestamp: DateTime.now().millisecondsSinceEpoch, + ); + } catch (e) { + Logger.w('MeetingASRrecord', '完成用量记录失败: ' + e.toString()); + } + _summaryTaskService.addTaskList( id, summarySourceText, promptToUse, outlineToUse); } diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index fc99643cb..fb0fe792e 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -81,6 +81,8 @@ class UsageStatsService extends GetxService { void _saveMeetingDaily(MeetingAsrDailyStats stats) { _storage.write('${_meetingDailyKey}_${stats.date}', stats.toJson()); + Logger.d('MeetingASRrecord', + '保存会议当日统计: date=${stats.date}, items=${stats.items.length}'); } String _formatDate(DateTime d) { @@ -90,6 +92,10 @@ class UsageStatsService extends GetxService { return '$y-$m-$day'; } + /// 添加或更新会议ASR记录 + /// [record] 会议ASR记录 + /// 该方法用于记录一次会议语音识别(ASR)的提交记录。它会根据记录的时间戳确定日期, + /// 并将记录添加到该日期的会议ASR记录列表中。如果记录已存在,则会更新该记录。 void addMeetingAsrRecord(MeetingAsrRecord record) { final dateKey = _formatDate( DateTime.fromMillisecondsSinceEpoch(record.submitTimestamp)); @@ -97,12 +103,25 @@ class UsageStatsService extends GetxService { final idx = daily.items.indexWhere((e) => e.id == record.id); if (idx >= 0) { daily.items[idx] = record; + Logger.d('MeetingASRrecord', + '更新会议ASR记录: id=${record.id}, meetingId=${record.meetingId}, date=${dateKey}'); } else { daily.items.add(record); + Logger.d('MeetingASRrecord', + '新增会议ASR记录: id=${record.id}, meetingId=${record.meetingId}, date=${dateKey}'); } _saveMeetingDaily(daily); + Logger.i('MeetingASRrecord', + '会议ASR提交: id=${record.id}, meetingId=${record.meetingId}, audioSeconds=${record.audioSeconds}, fileSizeBytes=${record.fileSizeBytes}, language=${record.language}, date=${dateKey}'); } + /// 完成会议ASR记录 + /// [id] 会议ASR记录ID + /// [transcriptBytes] 转写结果文本字节数 + /// [completeTimestamp] 完成时间戳 + /// 该方法用于标记一次会议语音识别(ASR)任务为已完成状态。 + /// 它会根据记录ID在最近3天的会议ASR记录列表中查找匹配项, + /// 如果找到,则更新该记录的状态为已完成,并记录转写结果文本字节数和完成时间戳。 void completeMeetingAsrRecord({ required String id, required int transcriptBytes, @@ -128,6 +147,8 @@ class UsageStatsService extends GetxService { completeTimestamp: completeTimestamp, ); _saveMeetingDaily(daily); + Logger.i('MeetingASRrecord', + '会议ASR完成: id=${id}, meetingId=${old.meetingId}, transcriptBytes=${transcriptBytes}, audioSeconds=${old.audioSeconds}, date=${dateKey}'); return; } } @@ -559,6 +580,8 @@ class UsageStatsService extends GetxService { list.add(daily); } } + Logger.i('MeetingASRrecord', + '获取会议历史统计: start=${_formatDate(startDate)}, end=${_formatDate(endDate)}, 有效天数=${list.length}'); return list; } catch (e) { Logger.error('获取会议历史统计失败: $e'); @@ -578,6 +601,8 @@ class UsageStatsService extends GetxService { audioBytes += d.audioBytesTotal; transcriptBytes += d.transcriptBytesTotal; } + Logger.i('MeetingASRrecord', + '聚合会议统计: calls=${calls}, audioSeconds=${audioSeconds}, audioBytes=${audioBytes}, transcriptBytes=${transcriptBytes}'); return MeetingAsrHistoryStats( userId: getCurrentUserId(), allAsrCalls: calls, From 3c3546ecf71a31ec544ce169b4be506e36d4605b Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 27 Nov 2025 14:56:16 +0800 Subject: [PATCH 092/177] =?UTF-8?q?docs(services):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E6=9C=8D=E5=8A=A1=E5=92=8C=E7=94=A8=E9=87=8F?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=9C=8D=E5=8A=A1=E7=9A=84=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为VolcanoTranslationService和UsageStatsService添加详细的文档注释,包括方法参数说明和计费标准 --- lib/data/services/usage_stats_service.dart | 65 +++++++++++++++++-- .../services/volcano_translation_service.dart | 11 +++- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index fb0fe792e..a4d573ab2 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -149,11 +149,61 @@ class UsageStatsService extends GetxService { _saveMeetingDaily(daily); Logger.i('MeetingASRrecord', '会议ASR完成: id=${id}, meetingId=${old.meetingId}, transcriptBytes=${transcriptBytes}, audioSeconds=${old.audioSeconds}, date=${dateKey}'); + try { + _reportMeetingUsageToServer( + audioSeconds: old.audioSeconds, + audioBytes: old.fileSizeBytes, + language: old.language, + transcriptBytes: transcriptBytes, + ); + } catch (e) { + Logger.error('会议用量上报(完成)失败: $e'); + } return; } } } + /// 上报会议用量到服务器 + /// [audioSeconds] 音频时长(秒) + /// [audioBytes] 音频文件大小(字节) + /// [language] 识别语言 + /// [transcriptBytes] 转写结果文本字节数(可选) + /// 该方法用于将会议语音识别(ASR)的用量数据上报到服务器。 + /// 它会根据提供的参数构建一个包含会议用量类型、音频时长、音频文件大小、 + /// 识别语言以及可选的转写结果文本字节数的参数对象。 + /// 然后,它会调用API接口将该参数对象发送到服务器进行处理。 + /// 如果上报成功,服务器会返回一个响应,该方法会根据响应更新本地的用户积分(非总积分)。 + Future _reportMeetingUsageToServer({ + required int audioSeconds, + required int audioBytes, + required String language, + int? transcriptBytes, + }) async { + try { + final params = { + 'usagetype': UsageType.Meet.toInt, + 'usages': { + 'MEETING_ASR_AUDIO_SECONDS': audioSeconds, + // 'MEETING_ASR_AUDIO_BYTES': audioBytes, + // if (transcriptBytes != null) + // 'MEETING_ASR_TRANSCRIPT_BYTES': transcriptBytes, + // 'MEETING_ASR_LANGUAGE_$language': 1, + }, + }; + + Logger.info('lxm---MEET用量上报参数: $params'); + + final response = await Api.usagesResPoints(params); + + Logger.info('lxm---MEET用量上报响应: $response'); + + _applyUsageResponse(response); + } catch (e) { + Logger.error('会议用量上报失败: $e'); + } + } + /// 记录翻译API调用 void recordTranslationApiCall({ required String sourceText, @@ -291,6 +341,13 @@ class UsageStatsService extends GetxService { } /// 上报ASR用量到服务器 + /// [effectiveDurationSeconds] 有效语音时长(秒) + /// [language] 识别语言 + /// [mode] 翻译模式 + /// 该方法用于将ASR(语音识别)的用量数据上报到服务器。 + /// 它会根据提供的参数构建一个包含用量类型、有效语音时长、识别语言以及翻译模式的参数对象。 + /// 然后,它会调用API接口将该参数对象发送到服务器进行处理。 + /// 如果上报成功,服务器会返回一个响应,该方法会根据响应更新本地的用户积分(非总积分)。 Future _reportAsrUsageToServer({ required int effectiveDurationSeconds, //required int totalDurationSeconds, @@ -305,10 +362,10 @@ class UsageStatsService extends GetxService { //'TRANSLATION_ASR_TOTAL_SECONDS': totalDurationSeconds, 'TRANSLATION_MODE_$mode': effectiveDurationSeconds, 'TRANSLATION_ASR_LANGUAGE_$language': 1, - 'TRANSLATION_SOURCE_CHARACTERS': - realtimeTranslationStats.value.sourceTextCharacters, - 'TRANSLATION_TARGET_CHARACTERS': - realtimeTranslationStats.value.ttsTextCharacters, + // 'TRANSLATION_SOURCE_CHARACTERS': + // realtimeTranslationStats.value.sourceTextCharacters, + // 'TRANSLATION_TARGET_CHARACTERS': + // realtimeTranslationStats.value.ttsTextCharacters, }, }; diff --git a/lib/data/services/volcano_translation_service.dart b/lib/data/services/volcano_translation_service.dart index 093f58a4b..1ce33d71a 100644 --- a/lib/data/services/volcano_translation_service.dart +++ b/lib/data/services/volcano_translation_service.dart @@ -165,7 +165,12 @@ class VolcanoTranslationService extends GetxService { }; } - // 翻译文本 + // 文本翻译 + /// [text] 待翻译的文本 + /// [sourceLanguageCode] 源语言的ASR代码 + /// [targetLanguageCode] 目标语言的ASR代码 + /// [return] 翻译后的文本 + /// 计费标准:每月200万字符免费,超出部分按49元/百万字符计费 Future translateText({ required String text, required String sourceLanguageCode, @@ -417,6 +422,10 @@ class VolcanoTranslationService extends GetxService { } /// 图片翻译(整图识别+回贴翻译) + /// [imageBytes] 待翻译的图片二进制数据 + /// [targetLanguageCode] 目标语言的ASR代码 + /// [return] 翻译结果 + /// 计费标准:每月100张免费,超出部分按0.04元/张计费 Future translateImage({ required Uint8List imageBytes, required String targetLanguageCode, // ASR代码,如 zh-CN / en-US From 8305c89fc43390bde90e7c01d76175b5defb7889 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 27 Nov 2025 21:07:47 +0800 Subject: [PATCH 093/177] =?UTF-8?q?feat(=E7=94=A8=E9=87=8F=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1):=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=E8=B1=A1=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E4=B8=8A=E4=BC=A0=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E9=87=8D=E6=9E=84=E7=94=A8=E9=87=8F=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在会议上传服务中添加对象存储用量记录功能 - 重构原有ASR统计模型为综合用量统计模型 - 新增对象存储记录相关数据结构 - 完善统计数据的聚合计算和持久化 --- lib/data/models/meeting_usage_stats.dart | 123 ++++++++++++++++-- .../meeting/meeting_upload_service.dart | 35 ++++- 2 files changed, 145 insertions(+), 13 deletions(-) diff --git a/lib/data/models/meeting_usage_stats.dart b/lib/data/models/meeting_usage_stats.dart index 88ef7e69c..97b65439a 100644 --- a/lib/data/models/meeting_usage_stats.dart +++ b/lib/data/models/meeting_usage_stats.dart @@ -1,9 +1,11 @@ ///会议模块用量统计的模型类 +// ============== ASR 状态常量 ============== const int asrStatusProcessing = 0; // 处理中 const int asrStatusFailed = 1; // 处理失败 const int asrStatusCompleted = 2; // 已完成 +// ============== ASR 单次记录 ============== // 会议音频文件转文字单次数据 class MeetingAsrRecord { String id; // 本次ASR唯一标识 @@ -60,56 +62,155 @@ class MeetingAsrRecord { } } -// 会议音频文件转文字单日统计 -class MeetingAsrDailyStats { +// ============== 对象存储单次记录 ============== +// 对象存储单次上传记录 +class MeetingObjectStorageRecord { + int meetingId; // 会议记录ID + String storageUrl; // 云端存储URL + int storageBytes; // 文件大小(字节) + int transferBytes; // 实际传输字节数 + int uploadTimestamp; // 上传完成时间戳(毫秒) + + MeetingObjectStorageRecord({ + required this.meetingId, + required this.storageUrl, + required this.storageBytes, + required this.transferBytes, + required this.uploadTimestamp, + }); + + Map toJson() => { + 'meetingId': meetingId, + 'storageUrl': storageUrl, + 'storageBytes': storageBytes, + 'transferBytes': transferBytes, + 'uploadTimestamp': uploadTimestamp, + }; + + factory MeetingObjectStorageRecord.fromJson(Map json) { + int _asInt(dynamic v) { + if (v == null) return 0; + if (v is int) return v; + if (v is num) return v.toInt(); + if (v is String) return int.tryParse(v) ?? 0; + return 0; + } + + return MeetingObjectStorageRecord( + meetingId: _asInt(json['meetingId']), + storageUrl: (json['storageUrl'] ?? '').toString(), + storageBytes: _asInt(json['storageBytes']), + transferBytes: _asInt(json['transferBytes']), + uploadTimestamp: _asInt(json['uploadTimestamp']), + ); + } +} + +// ============== 单日统计 ============== +// 会议模块用量单日统计 +class MeetingUsageDailyStats { String date; // 日期字符串: YYYY-MM-DD String userId; // 用户ID List items; // 当天所有单次ASR + List storageItems; // 当天所有单次对象存储上传记录 - MeetingAsrDailyStats({ + MeetingUsageDailyStats({ required this.date, required this.userId, required this.items, + required this.storageItems, }); - // 计算型聚合,不冗余存储 + // asr聚合计算 int get asrCalls => items.length; int get audioSecondsTotal => items.fold(0, (s, r) => s + r.audioSeconds); int get audioBytesTotal => items.fold(0, (s, r) => s + r.fileSizeBytes); int get transcriptBytesTotal => items.fold(0, (s, r) => s + r.transcriptBytes); + // 对象存储聚合计算 + int get storageUploads => storageItems.length; + int get storageBytesTotal => + storageItems.fold(0, (s, r) => s + r.storageBytes); + int get transferBytesTotal => + storageItems.fold(0, (s, r) => s + r.transferBytes); + Map toJson() => { 'date': date, 'userId': userId, 'items': items.map((e) => e.toJson()).toList(), + 'storageItems': storageItems.map((e) => e.toJson()).toList(), }; - factory MeetingAsrDailyStats.fromJson(Map json) { - final list = (json['items'] as List? ?? []) + factory MeetingUsageDailyStats.fromJson(Map json) { + final asrList = (json['items'] as List? ?? []) .map((e) => MeetingAsrRecord.fromJson(Map.from(e))) .toList(); - return MeetingAsrDailyStats( + final storageList = (json['storageItems'] as List? ?? []) + .map((e) => + MeetingObjectStorageRecord.fromJson(Map.from(e))) + .toList(); + return MeetingUsageDailyStats( date: json['date'] ?? '', userId: json['userId'] ?? 'anonymous', - items: list, + items: asrList, + storageItems: storageList, ); } } -// 会议音频文件转文字历史统计(所有的用量) -class MeetingAsrHistoryStats { +// ============== 历史统计 ============== +// 会议模块用量历史统计(所有的用量) +class MeetingUsageHistoryStats { String userId; // 用户ID int allAsrCalls; // 所有ASR调用次数 int allAudioSeconds; // 所有音频总时长(秒) int allAudioFileBytes; // 所有音频文件大小(字节) int allTranscriptBytes; // 所有转写后的字节数(utf8) + int allStorageUploads; // 所有对象存储上传次数 + int allStorageBytes; // 所有存储文件总大小(字节) + int allTransferBytes; // 所有传输总字节数 - MeetingAsrHistoryStats({ + MeetingUsageHistoryStats({ required this.userId, required this.allAsrCalls, required this.allAudioSeconds, required this.allAudioFileBytes, required this.allTranscriptBytes, + required this.allStorageUploads, + required this.allStorageBytes, + required this.allTransferBytes, }); + + Map toJson() => { + 'userId': userId, + 'allAsrCalls': allAsrCalls, + 'allAudioSeconds': allAudioSeconds, + 'allAudioFileBytes': allAudioFileBytes, + 'allTranscriptBytes': allTranscriptBytes, + 'allStorageUploads': allStorageUploads, + 'allStorageBytes': allStorageBytes, + 'allTransferBytes': allTransferBytes, + }; + + factory MeetingUsageHistoryStats.fromJson(Map json) { + int _asInt(dynamic v) { + if (v == null) return 0; + if (v is int) return v; + if (v is num) return v.toInt(); + if (v is String) return int.tryParse(v) ?? 0; + return 0; + } + + return MeetingUsageHistoryStats( + userId: json['userId'] ?? 'anonymous', + allAsrCalls: _asInt(json['allAsrCalls']), + allAudioSeconds: _asInt(json['allAudioSeconds']), + allAudioFileBytes: _asInt(json['allAudioFileBytes']), + allTranscriptBytes: _asInt(json['allTranscriptBytes']), + allStorageUploads: _asInt(json['allStorageUploads']), + allStorageBytes: _asInt(json['allStorageBytes']), + allTransferBytes: _asInt(json['allTransferBytes']), + ); + } } diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 53a5f57d3..4472cc409 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -1,12 +1,15 @@ +import 'dart:io'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import '../../../core/utils/logger.dart'; import '../../../core/utils/upload_oss.dart'; +import '../usage_stats_service.dart'; import '../db/sqflite_api.dart'; import 'meeting_task_service.dart'; import 'meeting_task_service2.dart'; +/// 管理会议音频文件上传服务 class MeetingUploadService extends GetxService { final _taskService = Get.find(); @@ -17,7 +20,7 @@ class MeetingUploadService extends GetxService { RxList uploadList = [].obs; bool _isUpload = false; - int _handled = 0; + int _handled = 0; //队列处理指针,表示当前循环语句处理的任务数量 @override void onInit() { @@ -45,7 +48,9 @@ class MeetingUploadService extends GetxService { bool isUpload = true, }) async { bool flash = false; + int fileSize = 0; try { + fileSize = await File(filePath).length(); //获取文件大小 final details = await SqfliteApi.getMeetingDetails(id); final int seconds = (details['seconds'] ?? 0) as int; flash = seconds > 0 && seconds <= 7200; @@ -62,6 +67,7 @@ class MeetingUploadService extends GetxService { 'prompt': '', 'outline': '', 'useFlashASR': flash, + 'fileSizeBytes': fileSize, }); _storage.write("meeting_upload_list", uploadList); if (isUpload) { @@ -79,17 +85,42 @@ class MeetingUploadService extends GetxService { if (element['audiourl'].isEmpty) { meetingId.value = element['id']; try { + int _sent = 0; + int _total = 0; final audiourl = await UploadOss.upload( filepath: element['filepath'], rootDir: element['rootdir'], onSendProgress: (int count, int total) { - uploadProgress.value = count / total; + // uploadProgress.value = count / total; + _sent = count; + _total = total; + uploadProgress.value = total > 0 ? count / total : 0.0; }, ); await SqfliteApi.editMeetingTitle( element['id'], {'audiourl': audiourl}, ); + try { + // 记录对象存储用量 + final svc = Get.isRegistered() + ? Get.find() + : Get.put(UsageStatsService(), permanent: true); + int fileSizeBytes = 0; + try { + fileSizeBytes = element['fileSizeBytes'] ?? 0; + } catch (_) {} + final transferred = _total > 0 ? _total : fileSizeBytes; + svc.recordMeetingObjectStorage( + meetingId: element['id'], + storageUrl: audiourl, + storageBytes: fileSizeBytes, + transferBytes: transferred, + uploadTimestamp: DateTime.now().millisecondsSinceEpoch, + ); + } catch (e) { + Logger.w('MeetingOSrecord', '对象存储用量记录失败: ' + e.toString()); + } if (element['isTask']) { if (element['useFlashASR'] == true) { final service2 = Get.find(); From 1e66201b0e291211fdcdad6e5e434e5fcd8c88a4 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 27 Nov 2025 21:37:36 +0800 Subject: [PATCH 094/177] =?UTF-8?q?refactor:=20=E5=B0=86AI=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E5=90=8D=E7=A7=B0=E4=BB=8EXiaoYan=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=BALily?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新所有语言文件和代码中的AI助手名称,从XiaoYan改为Lily,包括翻译文本、欢迎消息和系统提示 --- lib/core/translations/language/ar_sa.dart | 40 ++++++------ lib/core/translations/language/bg_bg.dart | 2 +- lib/core/translations/language/cs_cz.dart | 4 +- lib/core/translations/language/da_dk.dart | 4 +- lib/core/translations/language/de_de.dart | 64 +++++++++++-------- lib/core/translations/language/el_gr.dart | 17 +++-- lib/core/translations/language/en_us.dart | 60 ++++++++--------- lib/core/translations/language/es_es.dart | 42 ++++++------ lib/core/translations/language/et_ee.dart | 4 +- lib/core/translations/language/fa_ir.dart | 2 +- lib/core/translations/language/fi_fi.dart | 4 +- lib/core/translations/language/fr_fr.dart | 56 ++++++++-------- lib/core/translations/language/hi_in.dart | 42 ++++++------ lib/core/translations/language/hr_hr.dart | 4 +- lib/core/translations/language/hu_hu.dart | 4 +- lib/core/translations/language/id_id.dart | 4 +- lib/core/translations/language/is_is.dart | 4 +- lib/core/translations/language/it_it.dart | 64 +++++++++++-------- lib/core/translations/language/ja_jp.dart | 42 ++++++------ lib/core/translations/language/ko_kr.dart | 62 ++++++++++-------- lib/core/translations/language/lt_lt.dart | 4 +- lib/core/translations/language/lv_lv.dart | 2 +- lib/core/translations/language/ms_my.dart | 4 +- lib/core/translations/language/nb_no.dart | 4 +- lib/core/translations/language/nl_nl.dart | 4 +- lib/core/translations/language/pl_pl.dart | 4 +- lib/core/translations/language/pt_pt.dart | 64 +++++++++++-------- lib/core/translations/language/ro_ro.dart | 4 +- lib/core/translations/language/ru_ru.dart | 62 ++++++++++-------- lib/core/translations/language/sk_sk.dart | 4 +- lib/core/translations/language/sl_si.dart | 4 +- lib/core/translations/language/sr_rs.dart | 4 +- lib/core/translations/language/sv_se.dart | 4 +- lib/core/translations/language/th_th.dart | 2 +- lib/core/translations/language/tl_ph.dart | 4 +- lib/core/translations/language/tr_tr.dart | 4 +- lib/core/translations/language/uk_ua.dart | 2 +- lib/core/translations/language/vi_vn.dart | 4 +- lib/core/translations/language/zh_cn.dart | 48 +++++++------- lib/core/translations/language/zh_hk.dart | 42 ++++++------ lib/core/widgets/intro_overlay_builder.dart | 2 +- .../agent/controllers/agent_controller.dart | 2 +- lib/modules/agent/views/agent_view.dart | 2 +- .../agent_service/AgentService.kt | 2 +- .../agent_service/AgentServiceImpl.swift | 2 +- 45 files changed, 424 insertions(+), 385 deletions(-) diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index 561cff270..3b978b0b4 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -505,7 +505,7 @@ const Map arSA = { //Agent 模块 // agent View - "XiaoYan": "شياو يان", + "Lily": "Lily", "clearChatHistory": "مسح سجل الدردشة", "online": "متصل", "inputMessage": "أدخل رسالة...", @@ -1160,38 +1160,38 @@ const Map arSA = { "minutesAgo": "منذ @minutes دقيقة", "yesterday": "أمس", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", "guideMeetingStart": - "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index 14f9d770a..29cea0709 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -286,7 +286,7 @@ const Map bgBG = { //Agent 模块 // agent View - "XiaoYan": "Сяо Ян", + "Lily": "Lily", "clearChatHistory": "Изчисти историята на чата", "online": "Онлайн", "inputMessage": "Въведете съобщение...", diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index b432d7a87..c455602ff 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -283,7 +283,7 @@ const Map csCZ = { //Agent 模块 // agent View - "XiaoYan": "Xiao Yan", + "Lily": "Lily", "clearChatHistory": "Vymazat historii chatu", "online": "Online", "inputMessage": "Zadejte zprávu...", @@ -310,7 +310,7 @@ const Map csCZ = { "swipeUpForMore": "Potáhněte nahoru pro více", // Agent controller - 'welcomeMessage': 'Ahoj! Jsem **Xiao Yan**, mohu vám pomoci s:\n\n' + 'welcomeMessage': 'Ahoj! Jsem **Lily**, mohu vám pomoci s:\n\n' '• Odpovídáním na otázky a poskytováním informací\n\n' '• Překladem řeči v reálném čase\n\n' '• Doporučováním hudby a podcastů\n\n' diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index 31bfa72fb..b4ddfb4f6 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -285,7 +285,7 @@ const Map daDK = { //Agent 模块 // agent View - "XiaoYan": "Xiao Yan", + "Lily": "Lily", "clearChatHistory": "Ryd chathistorik", "online": "Online", "inputMessage": "Indtast besked...", @@ -312,7 +312,7 @@ const Map daDK = { "swipeUpForMore": "Stryg op for mere", // Agent controller - 'welcomeMessage': 'Hej! Jeg er **Xiao Yan**, jeg kan hjælpe dig med:\n\n' + 'welcomeMessage': 'Hej! Jeg er **Lily**, jeg kan hjælpe dig med:\n\n' '• Besvare spørgsmål og give information\n\n' '• Realtids stemmeoversættelse\n\n' '• Anbefale musik og podcasts\n\n' diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index 378044786..3aed58dd7 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -288,7 +288,7 @@ const Map deDE = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Chat-Verlauf löschen", "online": "Online", "inputMessage": "Nachricht eingeben...", @@ -315,7 +315,7 @@ const Map deDE = { "swipeUpForMore": "Nach oben wischen für mehr", // Agent controller - 'welcomeMessage': 'Hallo! Ich bin **XiaoYan**, ich kann Ihnen helfen:\n\n' + 'welcomeMessage': 'Hallo! Ich bin **Lily**, ich kann Ihnen helfen:\n\n' '• Fragen beantworten und Informationen bereitstellen\n\n' '• Echtzeit-Sprachübersetzung\n\n' '• Musik und Podcasts empfehlen\n\n' @@ -881,37 +881,38 @@ const Map deDE = { "波斯语": "Persisch", "斯瓦希里语": "Swahili", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -919,8 +920,10 @@ const Map deDE = { 'copyrightVoiTrans': '© 2025 VoiTrans', // Meeting goods page (placeholders) - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -929,20 +932,24 @@ const Map deDE = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // VIP goods page (placeholders) 'benefitsOverview': 'Benefits overview', @@ -957,5 +964,6 @@ const Map deDE = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index fec4d66c4..e53358264 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -287,7 +287,7 @@ const Map elGR = { //Agent 模块 // agent View - "XiaoYan": "Xiao Yan", + "Lily": "Lily", "clearChatHistory": "Εκκαθάριση ιστορικού συνομιλίας", "online": "Σε σύνδεση", "inputMessage": "Εισάγετε μήνυμα...", @@ -314,14 +314,13 @@ const Map elGR = { "swipeUpForMore": "Σύρετε προς τα πάνω για περισσότερα", // Agent controller - 'welcomeMessage': - 'Γεια σας! Είμαι ο **Xiao Yan**, μπορώ να σας βοηθήσω με:\n\n' - '• Απάντηση σε ερωτήσεις και παροχή πληροφοριών\n\n' - '• Μετάφραση φωνής σε πραγματικό χρόνο\n\n' - '• Προτάσεις μουσικής και podcasts\n\n' - '• Φωνητικές σημειώσεις και υπενθυμίσεις\n\n' - '• Έλεγχος λειτουργιών ακουστικών\n\n' - 'Με τι μπορώ να σας βοηθήσω;', + 'welcomeMessage': 'Γεια σας! Είμαι ο **Lily**, μπορώ να σας βοηθήσω με:\n\n' + '• Απάντηση σε ερωτήσεις και παροχή πληροφοριών\n\n' + '• Μετάφραση φωνής σε πραγματικό χρόνο\n\n' + '• Προτάσεις μουσικής και podcasts\n\n' + '• Φωνητικές σημειώσεις και υπενθυμίσεις\n\n' + '• Έλεγχος λειτουργιών ακουστικών\n\n' + 'Με τι μπορώ να σας βοηθήσω;', 'microphonePermission': 'Μικρόφωνο', 'voiceRecognitionPermissionText': 'Η λειτουργία αναγνώρισης φωνής χρειάζεται πρόσβαση στο μικρόφωνο.', diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index be64d22b7..37f3cf323 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -265,12 +265,12 @@ const Map enUS = { // Translation goods page descriptions 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': - 'Suitable for travel, business, speeches, and teaching.', + 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', @@ -292,11 +292,9 @@ const Map enUS = { 'realTimeWeatherForecast': 'Real-time weather and forecast', 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': - 'Ratings, business hours, and direct routing', + 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': - 'Long-article summaries and key points', + 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', 'helpCallAndSMS': 'Help with calls and SMS', 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', @@ -322,38 +320,39 @@ const Map enUS = { // Onboarding / Guide 'skip': 'Skip', 'next': 'Next', - 'sayXiaoYanHint': 'Say "Xiaoyan Xiaoyan" to the mic', + 'sayLilyHint': 'Say "Lily Lily" to the mic', 'imHere': 'I’m here~', - 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Xiaoyan”.', - 'aiReplyCompleted': 'Xiaoyan has finished the reply!', - 'aiThinking': 'Xiaoyan is thinking…', - 'guideAwakenSuccess': 'Great! Xiaoyan is awake—ask it to help.', + 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Lily”.', + 'aiReplyCompleted': 'Lily has finished the reply!', + 'aiThinking': 'Lily is thinking…', + 'guideAwakenSuccess': 'Great! Lily is awake—ask it to help.', 'confirmInput': 'Confirm Input', 'guideClickSendPrefix': 'Tap send, ', // AI steps - 'guideWeatherStart': 'Tell Xiaoyan: “What’s the weather today?”', + 'guideWeatherStart': 'Tell Lily: “What’s the weather today?”', 'guideWeatherInput': 'What’s the weather today?', - 'guideWeatherSend': 'Xiaoyan will report the weather in real time', - 'guideWeatherEnd': 'Xiaoyan can report weather live—try other commands', - 'guideMusicStart': 'Tell Xiaoyan: “Play some rock music”', + 'guideWeatherSend': 'Lily will report the weather in real time', + 'guideWeatherEnd': 'Lily can report weather live—try other commands', + 'guideMusicStart': 'Tell Lily: “Play some rock music”', 'guideMusicInput': 'Play some rock music', - 'guideMusicSend': 'Xiaoyan will find music for you', - 'guideMusicEnd': 'Xiaoyan found music—try other commands', - 'guideNavStart': 'Tell Xiaoyan: “Navigate to Shenzhen Airport”', + 'guideMusicSend': 'Lily will find music for you', + 'guideMusicEnd': 'Lily found music—try other commands', + 'guideNavStart': 'Tell Lily: “Navigate to Shenzhen Airport”', 'guideNavInput': 'Navigate to Shenzhen Airport', - 'guideNavSend': 'Xiaoyan will plan the route', + 'guideNavSend': 'Lily will plan the route', 'guideNavEnd': 'Navigation set—try other commands', - 'guideMeetingStart': 'Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”', + 'guideMeetingStart': + 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', - 'guideMeetingSend': 'Xiaoyan will create a meeting reminder', + 'guideMeetingSend': 'Lily will create a meeting reminder', 'guideMeetingEnd': 'Reminder created—try other commands', - 'guidePhoneStart': 'Tell Xiaoyan: “Call Mom”', + 'guidePhoneStart': 'Tell Lily: “Call Mom”', 'guidePhoneInput': 'Call Mom', - 'guidePhoneSend': 'Xiaoyan will make the call', + 'guidePhoneSend': 'Lily will make the call', 'guidePhoneEnd': 'Call placed—try other commands', - 'guideSmsStart': 'Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”', + 'guideSmsStart': 'Tell Lily: “Send Dad a text: I’ll be home for dinner”', 'guideSmsInput': 'Text Dad: I’ll be home for dinner', - 'guideSmsSend': 'Xiaoyan will send the message', + 'guideSmsSend': 'Lily will send the message', 'guideSmsEnd': 'Message sent—voice control is convenient', // 商务会议助手页 @@ -601,7 +600,8 @@ const Map enUS = { "premiumMember": "Premium Membership", "memberService": "Member Service", "bindRewardTitle": "Rewards", - "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", + "bindRewardSimpleDesc": + "First bind device reward has been issued. Tap OK to close.", "joinDevice": "Connected device:", "accountId": "Account ID:", "systemSetting": "System Settings", @@ -679,7 +679,7 @@ const Map enUS = { // Agent模块 //Agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Clear Chat History", "online": "Online", "inputMessage": "Type a message...", @@ -729,7 +729,7 @@ const Map enUS = { "nearbyFood": "What delicious food is nearby?", // 美食 // Agent controller - 'welcomeMessage': 'Hello! I\'m **Xiaoyan**, I can help you:\n\n' + 'welcomeMessage': 'Hello! I\'m **Lily**, I can help you:\n\n' '• Answer questions and provide information\n\n' '• Real-time voice translation\n\n' '• Recommend music and podcasts\n\n' @@ -1224,7 +1224,7 @@ const Map enUS = { "autoInputCode": "Auto Input Code", "skipBinding": "Skip Binding", "rescan": "Rescan", - + "verifyingDevice": "Verifying device...", "confirmBinding": "Confirm Binding", "associatingDevice": "Associating device...", diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index b49042841..3155a60a8 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -289,7 +289,7 @@ const Map esES = { //Agent 模块 // agent View - "XiaoYan": "Xiao Yan", + "Lily": "Lily", "clearChatHistory": "Limpiar historial de chat", "online": "En línea", "inputMessage": "Ingresa mensaje...", @@ -316,7 +316,7 @@ const Map esES = { "swipeUpForMore": "Desliza hacia arriba para más", // Agent controller - 'welcomeMessage': '¡Hola! Soy **Xiao Yan**, puedo ayudarte con:\n\n' + 'welcomeMessage': '¡Hola! Soy **Lily**, puedo ayudarte con:\n\n' '• Responder preguntas y proporcionar información\n\n' '• Traducción de voz en tiempo real\n\n' '• Recomendaciones de música y podcasts\n\n' @@ -875,37 +875,37 @@ const Map esES = { "波斯语": "Persa", "斯瓦希里语": "Suajili", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", "guideMeetingStart": - "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", }; diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index 81fb35c04..047395149 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -281,7 +281,7 @@ const Map etEE = { //Agent 模块 // agent View - "XiaoYan": "Xiao Yan", + "Lily": "Lily", "clearChatHistory": "Tühjenda vestluse ajalugu", "online": "Võrgus", "inputMessage": "Sisesta sõnum...", @@ -308,7 +308,7 @@ const Map etEE = { "swipeUpForMore": "Libista üles rohkema jaoks", // Agent controller - 'welcomeMessage': 'Tere! Olen **Xiao Yan**, saan sind aidata:\n\n' + 'welcomeMessage': 'Tere! Olen **Lily**, saan sind aidata:\n\n' '• Küsimustele vastamine ja info andmine\n\n' '• Reaalajas häältõlge\n\n' '• Muusika ja podcastide soovitused\n\n' diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index ced6ac8cf..a25ac3c69 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -498,7 +498,7 @@ const Map faIR = { // Agent模块 //Agent View - "XiaoYan": "شیائویان", + "Lily": "Lily", "clearChatHistory": "پاک کردن تاریخچه چت", "online": "آنلاین", "inputMessage": "پیامی تایپ کنید...", diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index e9bd336fd..29822b6de 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -283,7 +283,7 @@ const Map fiFI = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Tyhjennä keskusteluhistoria", "online": "Online", "inputMessage": "Kirjoita viesti...", @@ -310,7 +310,7 @@ const Map fiFI = { "swipeUpForMore": "Pyyhkäise ylös nähdäksesi lisää", // Agent controller - 'welcomeMessage': 'Hei! Olen **XiaoYan**, voin auttaa sinua:\n\n' + 'welcomeMessage': 'Hei! Olen **Lily**, voin auttaa sinua:\n\n' '• Vastaamaan kysymyksiin ja antamaan tietoa\n\n' '• Reaaliaikaisessa puhekäännöksessä\n\n' '• Suosittelemaan musiikkia ja podcasteja\n\n' diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index 8b64b9629..031a3f5e2 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -292,7 +292,7 @@ const Map frFR = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Effacer l'historique de chat", "online": "En ligne", "inputMessage": "Saisir un message...", @@ -320,14 +320,13 @@ const Map frFR = { "swipeUpForMore": "Glisser vers le haut pour plus", // Agent controller - 'welcomeMessage': - 'Bonjour ! Je suis **XiaoYan**, je peux vous aider avec :\n\n' - '• Répondre aux questions et fournir des informations\n\n' - '• Traduction vocale en temps réel\n\n' - '• Recommander de la musique et des podcasts\n\n' - '• Mémos vocaux et rappels\n\n' - '• Contrôler les fonctions des écouteurs\n\n' - 'Comment puis-je vous aider ?', + 'welcomeMessage': 'Bonjour ! Je suis **Lily**, je peux vous aider avec :\n\n' + '• Répondre aux questions et fournir des informations\n\n' + '• Traduction vocale en temps réel\n\n' + '• Recommander de la musique et des podcasts\n\n' + '• Mémos vocaux et rappels\n\n' + '• Contrôler les fonctions des écouteurs\n\n' + 'Comment puis-je vous aider ?', 'microphonePermission': 'Microphone', 'voiceRecognitionPermissionText': 'La fonction de reconnaissance vocale nécessite l\'accès au microphone.', @@ -884,36 +883,37 @@ const Map frFR = { "波斯语": "Persan", "斯瓦希里语": "Swahili", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", }; diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 1d745b64a..6670fa4a2 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -279,7 +279,7 @@ const Map hiIN = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "चैट इतिहास साफ़ करें", "online": "ऑनलाइन", "inputMessage": "संदेश दर्ज करें...", @@ -307,7 +307,7 @@ const Map hiIN = { "swipeUpForMore": "अधिक के लिए ऊपर स्वाइप करें", // Agent controller - 'welcomeMessage': 'नमस्ते! मैं **XiaoYan** हूँ, मैं आपकी मदद कर सकता हूँ:\n\n' + 'welcomeMessage': 'नमस्ते! मैं **Lily** हूँ, मैं आपकी मदद कर सकता हूँ:\n\n' '• सवालों के जवाब देना और जानकारी प्रदान करना\n\n' '• रीयल-टाइम वॉयस अनुवाद\n\n' '• संगीत और पॉडकास्ट की सिफारिश करना\n\n' @@ -849,38 +849,38 @@ const Map hiIN = { "波斯语": "फारसी", "斯瓦希里语": "स्वाहिली", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", "guideMeetingStart": - "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index bd42f68a5..d40cc6c6c 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -285,7 +285,7 @@ const Map hrHR = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Obriši povijest razgovora", "online": "Na mreži", "inputMessage": "Unesite poruku...", @@ -312,7 +312,7 @@ const Map hrHR = { "swipeUpForMore": "Prijeđite prstom prema gore za više", // Agent controller - 'welcomeMessage': 'Zdravo! Ja sam **XiaoYan**, mogu vam pomoći:\n\n' + 'welcomeMessage': 'Zdravo! Ja sam **Lily**, mogu vam pomoći:\n\n' '• Odgovarati na pitanja i pružati informacije\n\n' '• Glasovno prevođenje u stvarnom vremenu\n\n' '• Preporučivati glazbu i podcaste\n\n' diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index b503a87c7..9e2bcc9f2 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -285,7 +285,7 @@ const Map huHU = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Csevegési előzmények törlése", "online": "Online", "inputMessage": "Üzenet beírása...", @@ -313,7 +313,7 @@ const Map huHU = { "swipeUpForMore": "Húzza felfelé a továbbiakért", // Agent controller - 'welcomeMessage': 'Szia! **XiaoYan** vagyok, segíthetek neked:\n\n' + 'welcomeMessage': 'Szia! **Lily** vagyok, segíthetek neked:\n\n' '• Kérdések megválaszolásában és információk nyújtásában\n\n' '• Valós idejű hangfordításban\n\n' '• Zene és podcastok ajánlásában\n\n' diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 50ee06329..4889130a0 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -281,7 +281,7 @@ const Map idID = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Hapus Riwayat Obrolan", "online": "Online", "inputMessage": "Masukkan pesan...", @@ -309,7 +309,7 @@ const Map idID = { "swipeUpForMore": "Geser ke atas untuk lebih banyak", // Agent controller - 'welcomeMessage': 'Halo! Saya **XiaoYan**, saya bisa membantu Anda:\n\n' + 'welcomeMessage': 'Halo! Saya **Lily**, saya bisa membantu Anda:\n\n' '• Menjawab pertanyaan dan memberikan informasi\n\n' '• Terjemahan suara waktu nyata\n\n' '• Merekomendasikan musik dan podcast\n\n' diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index f5bfbe00f..a3867b12f 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -280,7 +280,7 @@ const Map isIS = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Hreinsa spjallsögu", "online": "Á netinu", "inputMessage": "Sláðu inn skilaboð...", @@ -307,7 +307,7 @@ const Map isIS = { "swipeUpForMore": "Strjúktu upp til að sjá meira", // Agent controller - 'welcomeMessage': 'Halló! Ég er **XiaoYan**, ég get hjálpað þér með:\n\n' + 'welcomeMessage': 'Halló! Ég er **Lily**, ég get hjálpað þér með:\n\n' '• Að svara spurningum og veita upplýsingar\n\n' '• Rauntíma raddþýðingu\n\n' '• Að mæla með tónlist og hlaðvörpum\n\n' diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index 5c542f335..17c928f8a 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -291,7 +291,7 @@ const Map itIT = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Cancella cronologia chat", "online": "Online", "inputMessage": "Inserisci messaggio...", @@ -319,7 +319,7 @@ const Map itIT = { "swipeUpForMore": "Scorri verso l'alto per vedere di più", // Agent controller - 'welcomeMessage': 'Ciao! Sono **XiaoYan**, posso aiutarti a:\n\n' + 'welcomeMessage': 'Ciao! Sono **Lily**, posso aiutarti a:\n\n' '• Rispondere a domande e fornire informazioni\n\n' '• Traduzione vocale in tempo reale\n\n' '• Consigliare musica e podcast\n\n' @@ -870,37 +870,38 @@ const Map itIT = { "波斯语": "Persiano", "斯瓦希里语": "Swahili", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -908,8 +909,10 @@ const Map itIT = { 'copyrightVoiTrans': '© 2025 VoiTrans', // Meeting goods page (placeholders) - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -918,20 +921,24 @@ const Map itIT = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // VIP goods page (placeholders) 'benefitsOverview': 'Benefits overview', @@ -946,5 +953,6 @@ const Map itIT = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index 4f27b6aa2..99475a8b1 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -271,7 +271,7 @@ const Map jaJP = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "チャット履歴をクリア", "online": "オンライン", "inputMessage": "メッセージを入力...", @@ -298,7 +298,7 @@ const Map jaJP = { "swipeUpForMore": "上にスワイプしてさらに表示", // Agent controller - 'welcomeMessage': 'こんにちは!私は**XiaoYan**です。以下のことでお手伝いできます:\n\n' + 'welcomeMessage': 'こんにちは!私は**Lily**です。以下のことでお手伝いできます:\n\n' '• 質問への回答と情報提供\n\n' '• リアルタイム音声翻訳\n\n' '• 音楽とポッドキャストの推薦\n\n' @@ -798,37 +798,37 @@ const Map jaJP = { "波斯语": "ペルシャ語", "斯瓦希里语": "スワヒリ語", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", "guideMeetingStart": - "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", }; diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 4959af0e1..5e5cd1993 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -269,7 +269,7 @@ const Map koKR = { //Agent 模块 // agent View - "XiaoYan": "샤오옌", + "Lily": "Lily", "clearChatHistory": "채팅 기록 지우기", "online": "온라인", "inputMessage": "메시지 입력...", @@ -785,37 +785,38 @@ const Map koKR = { "波斯语": "페르시아어", "斯瓦希里语": "스와힐리어", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -823,8 +824,10 @@ const Map koKR = { 'copyrightVoiTrans': '© 2025 VoiTrans', // Meeting goods page (placeholders) - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -833,20 +836,24 @@ const Map koKR = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // VIP goods page (placeholders) 'benefitsOverview': 'Benefits overview', @@ -861,5 +868,6 @@ const Map koKR = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 7df67f0b0..277b205bc 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -285,7 +285,7 @@ const Map ltLT = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Išvalyti pokalbių istoriją", "online": "Prisijungęs", "inputMessage": "Įveskite žinutę...", @@ -313,7 +313,7 @@ const Map ltLT = { "swipeUpForMore": "Braukite aukštyn, kad pamatytumėte daugiau", // Agent controller - 'welcomeMessage': 'Sveiki! Aš esu **XiaoYan**, galiu jums padėti:\n\n' + 'welcomeMessage': 'Sveiki! Aš esu **Lily**, galiu jums padėti:\n\n' '• Atsakyti į klausimus ir pateikti informaciją\n\n' '• Balso vertimas realiuoju laiku\n\n' '• Rekomenduoti muziką ir tinklalaides\n\n' diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 5b9a89a67..2df23736a 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -284,7 +284,7 @@ const Map lvLV = { //Agent 模块 // agent View - "XiaoYan": "SjaoJaņ", + "Lily": "Lily", "clearChatHistory": "Notīrīt tērzēšanas vēsturi", "online": "Tiešsaistē", "inputMessage": "Ievadiet ziņu...", diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index 28dea6f4c..35df0f996 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -282,7 +282,7 @@ const Map msMY = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Kosongkan Sejarah Sembang", "online": "Dalam Talian", "inputMessage": "Masukkan mesej...", @@ -309,7 +309,7 @@ const Map msMY = { "swipeUpForMore": "Leret ke atas untuk lebih banyak", // Agent controller - 'welcomeMessage': 'Helo! Saya **XiaoYan**, saya boleh bantu anda:\n\n' + 'welcomeMessage': 'Helo! Saya **Lily**, saya boleh bantu anda:\n\n' '• Jawab soalan dan berikan maklumat\n\n' '• Terjemahan suara masa nyata\n\n' '• Cadangkan muzik dan podcast\n\n' diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index bc001b456..7e28d652d 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -283,7 +283,7 @@ const Map nbNO = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Tøm chat-historikk", "online": "Online", "inputMessage": "Skriv melding...", @@ -311,7 +311,7 @@ const Map nbNO = { "swipeUpForMore": "Sveip opp for mer", // Agent controller - 'welcomeMessage': 'Hei! Jeg er **XiaoYan**, jeg kan hjelpe deg med:\n\n' + 'welcomeMessage': 'Hei! Jeg er **Lily**, jeg kan hjelpe deg med:\n\n' '• Å svare på spørsmål og gi informasjon\n\n' '• Sanntids stemmeoversettelse\n\n' '• Å anbefale musikk og podkaster\n\n' diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index b54cf99d3..5d6f59470 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -283,7 +283,7 @@ const Map nlNL = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Chatgeschiedenis wissen", "online": "Online", "inputMessage": "Voer bericht in...", @@ -311,7 +311,7 @@ const Map nlNL = { "swipeUpForMore": "Veeg omhoog voor meer", // Agent controller - 'welcomeMessage': 'Hallo! Ik ben **XiaoYan**, ik kan u helpen met:\n\n' + 'welcomeMessage': 'Hallo! Ik ben **Lily**, ik kan u helpen met:\n\n' '• Vragen beantwoorden en informatie verstrekken\n\n' '• Realtime spraakvertaling\n\n' '• Muziek en podcasts aanbevelen\n\n' diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index 051c10d78..ac6bbfa0e 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -286,7 +286,7 @@ const Map plPL = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Wyczyść historię czatu", "online": "Online", "inputMessage": "Wpisz wiadomość...", @@ -314,7 +314,7 @@ const Map plPL = { "swipeUpForMore": "Przesuń w górę, aby zobaczyć więcej", // Agent controller - 'welcomeMessage': 'Cześć! Jestem **XiaoYan**, mogę Ci pomóc:\n\n' + 'welcomeMessage': 'Cześć! Jestem **Lily**, mogę Ci pomóc:\n\n' '• Odpowiadać na pytania i dostarczać informacji\n\n' '• Tłumaczyć głosowo w czasie rzeczywistym\n\n' '• Polecać muzykę i podcasty\n\n' diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 4ca7b3ab4..7f3ee9b8a 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -289,7 +289,7 @@ const Map ptPT = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Limpar Histórico de Chat", "online": "Online", "inputMessage": "Introduzir mensagem...", @@ -317,7 +317,7 @@ const Map ptPT = { "swipeUpForMore": "Deslize para cima para ver mais", // Agent controller - 'welcomeMessage': 'Olá! Eu sou a **XiaoYan**, posso ajudá-lo(a) a:\n\n' + 'welcomeMessage': 'Olá! Eu sou a **Lily**, posso ajudá-lo(a) a:\n\n' '• Responder a perguntas e fornecer informações\n\n' '• Traduzir voz em tempo real\n\n' '• Recomendar música e podcasts\n\n' @@ -864,37 +864,38 @@ const Map ptPT = { "波斯语": "Persa", "斯瓦希里语": "Suaíli", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -902,8 +903,10 @@ const Map ptPT = { 'copyrightVoiTrans': '© 2025 VoiTrans', // Meeting goods page (placeholders) - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -912,20 +915,24 @@ const Map ptPT = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // VIP goods page (placeholders) 'benefitsOverview': 'Benefits overview', @@ -940,5 +947,6 @@ const Map ptPT = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index 2184bc439..3ee106094 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -288,7 +288,7 @@ const Map roRO = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Șterge istoricul chatului", "online": "Online", "inputMessage": "Introduceți mesaj...", @@ -316,7 +316,7 @@ const Map roRO = { "swipeUpForMore": "Glisați în sus pentru mai mult", // Agent controller - 'welcomeMessage': 'Bună! Sunt **XiaoYan**, vă pot ajuta cu:\n\n' + 'welcomeMessage': 'Bună! Sunt **Lily**, vă pot ajuta cu:\n\n' '• Răspuns la întrebări și furnizare de informații\n\n' '• Traducere vocală în timp real\n\n' '• Recomandare de muzică și podcasturi\n\n' diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 11c95cd0f..49703fbf8 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -285,7 +285,7 @@ const Map ruRU = { //Agent 模块 // agent View - "XiaoYan": "СяоЯнь", + "Lily": "Lily", "clearChatHistory": "Очистить историю чата", "online": "В сети", "inputMessage": "Введите сообщение...", @@ -857,37 +857,38 @@ const Map ruRU = { "波斯语": "Персидский", "斯瓦希里语": "Суахили", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", - "guideMeetingStart": "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "guideMeetingStart": + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -895,8 +896,10 @@ const Map ruRU = { 'copyrightVoiTrans': '© 2025 VoiTrans', // Meeting goods page (placeholders) - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -905,20 +908,24 @@ const Map ruRU = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'tradeHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'tradeDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // VIP goods page (placeholders) 'benefitsOverview': 'Benefits overview', @@ -933,5 +940,6 @@ const Map ruRU = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', }; diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index a20e350c8..0cbd33dfd 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -283,7 +283,7 @@ const Map skSK = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Vymazať históriu chatu", "online": "Online", "inputMessage": "Zadajte správu...", @@ -310,7 +310,7 @@ const Map skSK = { "swipeUpForMore": "Potiahnite nahor pre viac", // Agent controller - 'welcomeMessage': 'Ahoj! Som **XiaoYan**, môžem vám pomôcť:\n\n' + 'welcomeMessage': 'Ahoj! Som **Lily**, môžem vám pomôcť:\n\n' '• Odpovedať na otázky a poskytovať informácie\n\n' '• Hlasový preklad v reálnom čase\n\n' '• Odporúčať hudbu a podcasty\n\n' diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index d106107e0..3c02140a0 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -284,7 +284,7 @@ const Map slSI = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Počisti zgodovino klepeta", "online": "Na spletu", "inputMessage": "Vnesite sporočilo...", @@ -311,7 +311,7 @@ const Map slSI = { "swipeUpForMore": "Povlecite navzgor za več", // Agent controller - 'welcomeMessage': 'Živjo! Sem **XiaoYan**, lahko vam pomagam:\n\n' + 'welcomeMessage': 'Živjo! Sem **Lily**, lahko vam pomagam:\n\n' '• Odgovarjam na vprašanja in nudim informacije\n\n' '• Glasovno prevajanje v realnem času\n\n' '• Priporočam glasbo in podcaste\n\n' diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index 7bab2c689..3381e537b 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -282,7 +282,7 @@ const Map srRS = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Obriši istoriju ćaskanja", "online": "Na mreži", "inputMessage": "Unesite poruku...", @@ -309,7 +309,7 @@ const Map srRS = { "swipeUpForMore": "Prevucite nagore za više", // Agent controller - 'welcomeMessage': 'Zdravo! Ja sam **XiaoYan**, mogu vam pomoći:\n\n' + 'welcomeMessage': 'Zdravo! Ja sam **Lily**, mogu vam pomoći:\n\n' '• Da odgovaram na pitanja i pružam informacije\n\n' '• Glasovno prevođenje u realnom vremenu\n\n' '• Da preporučujem muziku i podkaste\n\n' diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index d307b1eef..c5943a1e0 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -283,7 +283,7 @@ const Map svSE = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Rensa chatthistorik", "online": "Online", "inputMessage": "Skriv meddelande...", @@ -310,7 +310,7 @@ const Map svSE = { "swipeUpForMore": "Svep upp för mer", // Agent controller - 'welcomeMessage': 'Hej! Jag är **XiaoYan**, jag kan hjälpa dig med:\n\n' + 'welcomeMessage': 'Hej! Jag är **Lily**, jag kan hjälpa dig med:\n\n' '• Svara på frågor och ge information\n\n' '• Realtids röstöversättning\n\n' '• Rekommendera musik och poddar\n\n' diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index 084def1f8..b23b9da88 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -276,7 +276,7 @@ const Map thTH = { //Agent 模块 // agent View - "XiaoYan": "เสี่ยวเหยียน", + "Lily": "Lily", "clearChatHistory": "ล้างประวัติการแชท", "online": "ออนไลน์", "inputMessage": "ป้อนข้อความ...", diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index 85d3609fd..ca317c6c7 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -289,7 +289,7 @@ const Map tlPH = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Burahin ang Kasaysayan ng Chat", "online": "Online", "inputMessage": "Mag-type ng mensahe...", @@ -317,7 +317,7 @@ const Map tlPH = { "swipeUpForMore": "Mag-swipe pataas para sa higit pa", // Agent controller - 'welcomeMessage': 'Kumusta! Ako si **XiaoYan**, matutulungan kita sa:\n\n' + 'welcomeMessage': 'Kumusta! Ako si **Lily**, matutulungan kita sa:\n\n' '• Pagsagot sa mga tanong at pagbibigay ng impormasyon\n\n' '• Real-time na pagsasalin ng boses\n\n' '• Pagrekomenda ng musika at mga podcast\n\n' diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index a99131602..c49f78ba3 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -283,7 +283,7 @@ const Map trTR = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Sohbet Geçmişini Temizle", "online": "Çevrimiçi", "inputMessage": "Mesaj girin...", @@ -311,7 +311,7 @@ const Map trTR = { // Agent controller 'welcomeMessage': - 'Merhaba! Ben **XiaoYan**, size şu konularda yardımcı olabilirim:\n\n' + 'Merhaba! Ben **Lily**, size şu konularda yardımcı olabilirim:\n\n' '• Soruları yanıtlamak ve bilgi sağlamak\n\n' '• Gerçek zamanlı sesli çeviri\n\n' '• Müzik ve podcast önermek\n\n' diff --git a/lib/core/translations/language/uk_ua.dart b/lib/core/translations/language/uk_ua.dart index 1dabffdb0..33db62af3 100644 --- a/lib/core/translations/language/uk_ua.dart +++ b/lib/core/translations/language/uk_ua.dart @@ -284,7 +284,7 @@ const Map ukUA = { //Agent 模块 // agent View - "XiaoYan": "СяоЯнь", + "Lily": "Lily", "clearChatHistory": "Очистити історію чату", "online": "В мережі", "inputMessage": "Введіть повідомлення...", diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index fc422ee38..8456b04ea 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -279,7 +279,7 @@ const Map viVN = { //Agent 模块 // agent View - "XiaoYan": "XiaoYan", + "Lily": "Lily", "clearChatHistory": "Xóa lịch sử trò chuyện", "online": "Trực tuyến", "inputMessage": "Nhập tin nhắn...", @@ -306,7 +306,7 @@ const Map viVN = { "swipeUpForMore": "Vuốt lên để xem thêm", // Agent controller - 'welcomeMessage': 'Chào bạn! Tôi là **XiaoYan**, tôi có thể giúp bạn:\n\n' + 'welcomeMessage': 'Chào bạn! Tôi là **Lily**, tôi có thể giúp bạn:\n\n' '• Trả lời câu hỏi và cung cấp thông tin\n\n' '• Dịch giọng nói thời gian thực\n\n' '• Đề xuất nhạc và podcast\n\n' diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 997acdf54..877835f82 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -238,38 +238,38 @@ const Map zhCN = { // 新手引导 / Onboarding 'skip': '跳过', 'next': '下一步', - 'sayXiaoYanHint': '对着麦克风说:“小言小言”', + 'sayLilyHint': '对着麦克风说:“Lily Lily”', 'imHere': '我在呢~', - 'guideWelcomeWakeAI': '欢迎使用Voitrans!首先,让我们唤醒你的专属 AI—— 小言', - 'aiReplyCompleted': '小言已经完成了回答!', - 'aiThinking': '小言正在思考中~', - 'guideAwakenSuccess': '太棒了!你已成功唤醒小言,接下来试试让它帮你做件事吧', + 'guideWelcomeWakeAI': '欢迎使用Voitrans!首先,让我们唤醒你的专属 AI—— Lily', + 'aiReplyCompleted': 'Lily已经完成了回答!', + 'aiThinking': 'Lily正在思考中~', + 'guideAwakenSuccess': '太棒了!你已成功唤醒Lily,接下来试试让它帮你做件事吧', 'confirmInput': '确定输入', 'guideClickSendPrefix': '点击发送,', // AI 引导步骤 - 'guideWeatherStart': '对小言说:“今天天气怎么样”', + 'guideWeatherStart': '对Lily说:“今天天气怎么样”', 'guideWeatherInput': '今天天气怎么样', - 'guideWeatherSend': '小言会为你实时为你播报天气', - 'guideWeatherEnd': '小言能实时为你播报天气,试试其他指令吧', - 'guideMusicStart': '对小言说:“请播放一组摇滚乐”', + 'guideWeatherSend': 'Lily会为你实时为你播报天气', + 'guideWeatherEnd': 'Lily能实时为你播报天气,试试其他指令吧', + 'guideMusicStart': '对Lily说:“请播放一组摇滚乐”', 'guideMusicInput': '请播放一组摇滚乐', - 'guideMusicSend': '小言会为你搜寻到一组音乐', - 'guideMusicEnd': '小言已成功为您搜寻到一组音乐,试试其他指令吧', - 'guideNavStart': '对小言说:“导航到深圳机场”', + 'guideMusicSend': 'Lily会为你搜寻到一组音乐', + 'guideMusicEnd': 'Lily已成功为您搜寻到一组音乐,试试其他指令吧', + 'guideNavStart': '对Lily说:“导航到深圳机场”', 'guideNavInput': '导航到深圳机场', - 'guideNavSend': '小言会为你规划路线', - 'guideNavEnd': '小言已成功为您导航到深圳机场,试试其他指令吧', - 'guideMeetingStart': '对小言说:“明天下午3点创建会议提醒”', + 'guideNavSend': 'Lily会为你规划路线', + 'guideNavEnd': 'Lily已成功为您导航到深圳机场,试试其他指令吧', + 'guideMeetingStart': '对Lily说:“明天下午3点创建会议提醒”', 'guideMeetingInput': '明天下午3点创建会议提醒', - 'guideMeetingSend': '小言会为你创建会议提醒', - 'guideMeetingEnd': '小言已成功为您创建会议提醒,试试其他指令吧', - 'guidePhoneStart': '对小言说:“拨打妈妈的电话”', + 'guideMeetingSend': 'Lily会为你创建会议提醒', + 'guideMeetingEnd': 'Lily已成功为您创建会议提醒,试试其他指令吧', + 'guidePhoneStart': '对Lily说:“拨打妈妈的电话”', 'guidePhoneInput': '拨打妈妈的电话', - 'guidePhoneSend': '小言会为你拨打电话', - 'guidePhoneEnd': '小言已成功为您拨打电话,试试其他指令吧', - 'guideSmsStart': '对小言说:“给爸爸发短信说晚上回家吃饭”', + 'guidePhoneSend': 'Lily会为你拨打电话', + 'guidePhoneEnd': 'Lily已成功为您拨打电话,试试其他指令吧', + 'guideSmsStart': '对Lily说:“给爸爸发短信说晚上回家吃饭”', 'guideSmsInput': '给爸爸发短信说晚上回家吃饭', - 'guideSmsSend': '小言会为你发送短信', + 'guideSmsSend': 'Lily会为你发送短信', 'guideSmsEnd': '短信已发送,语音操控更便捷', // 商务会议助手页 @@ -572,7 +572,7 @@ const Map zhCN = { //Agent 模块 // agent View - "XiaoYan": "小言", + "Lily": "Lily", "clearChatHistory": "清空聊天记录", "online": "在线", "inputMessage": "输入消息...", @@ -613,7 +613,7 @@ const Map zhCN = { "nearbyFood": "附近有哪些美食?", // 美食 // Agent controller - 'welcomeMessage': '你好!我是**小言**,我能帮你:\n\n' + 'welcomeMessage': '你好!我是**Lily**,我能帮你:\n\n' '• 答问题和提供信息\n\n' '• 实时语音翻译\n\n' '• 推荐音乐和播客\n\n' diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 02bef9e1a..34eac4ba8 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -291,7 +291,7 @@ const Map zhHK = { //Agent 模塊 // agent View - "XiaoYan": "小言", + "Lily": "Lily", "clearChatHistory": "清空聊天記錄", "online": "在線", "inputMessage": "輸入訊息...", @@ -320,7 +320,7 @@ const Map zhHK = { "voice_interrupt": "语音打断", // 语音打断 // Agent controller - 'welcomeMessage': '你好!我是**小言**,我能幫你:\n\n' + 'welcomeMessage': '你好!我是**Lily**,我能幫你:\n\n' '• 回答問題和提供資訊\n\n' '• 實時語音翻譯\n\n' '• 推薦音樂和播客\n\n' @@ -809,38 +809,38 @@ const Map zhHK = { "波斯语": "波斯語", "斯瓦希里语": "斯瓦希里語", // Guide overlay keys (placeholders in English) - "sayXiaoYanHint": "Say \"Xiaoyan Xiaoyan\" to the mic", + "sayLilyHint": "Say \"Lily Lily\" to the mic", "imHere": "I’m here~", - "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Xiaoyan”.", - "aiReplyCompleted": "Xiaoyan has finished the reply!", - "aiThinking": "Xiaoyan is thinking…", - "guideAwakenSuccess": "Great! Xiaoyan is awake—ask it to help.", + "guideWelcomeWakeAI": "Welcome to Voitrans! First, wake your AI “Lily”.", + "aiReplyCompleted": "Lily has finished the reply!", + "aiThinking": "Lily is thinking…", + "guideAwakenSuccess": "Great! Lily is awake—ask it to help.", "confirmInput": "Confirm Input", "guideClickSendPrefix": "Tap send, ", - "guideWeatherStart": "Tell Xiaoyan: “What’s the weather today?”", + "guideWeatherStart": "Tell Lily: “What’s the weather today?”", "guideWeatherInput": "What’s the weather today?", - "guideWeatherSend": "Xiaoyan will report the weather in real time", - "guideWeatherEnd": "Xiaoyan can report weather live—try other commands", - "guideMusicStart": "Tell Xiaoyan: “Play some rock music”", + "guideWeatherSend": "Lily will report the weather in real time", + "guideWeatherEnd": "Lily can report weather live—try other commands", + "guideMusicStart": "Tell Lily: “Play some rock music”", "guideMusicInput": "Play some rock music", - "guideMusicSend": "Xiaoyan will find music for you", - "guideMusicEnd": "Xiaoyan found music—try other commands", - "guideNavStart": "Tell Xiaoyan: “Navigate to Shenzhen Airport”", + "guideMusicSend": "Lily will find music for you", + "guideMusicEnd": "Lily found music—try other commands", + "guideNavStart": "Tell Lily: “Navigate to Shenzhen Airport”", "guideNavInput": "Navigate to Shenzhen Airport", - "guideNavSend": "Xiaoyan will plan the route", + "guideNavSend": "Lily will plan the route", "guideNavEnd": "Navigation set—try other commands", "guideMeetingStart": - "Tell Xiaoyan: “Create a meeting reminder for 3pm tomorrow”", + "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", "guideMeetingInput": "Create a meeting reminder for 3pm tomorrow", - "guideMeetingSend": "Xiaoyan will create a meeting reminder", + "guideMeetingSend": "Lily will create a meeting reminder", "guideMeetingEnd": "Reminder created—try other commands", - "guidePhoneStart": "Tell Xiaoyan: “Call Mom”", + "guidePhoneStart": "Tell Lily: “Call Mom”", "guidePhoneInput": "Call Mom", - "guidePhoneSend": "Xiaoyan will make the call", + "guidePhoneSend": "Lily will make the call", "guidePhoneEnd": "Call placed—try other commands", - "guideSmsStart": "Tell Xiaoyan: “Send Dad a text: I’ll be home for dinner”", + "guideSmsStart": "Tell Lily: “Send Dad a text: I’ll be home for dinner”", "guideSmsInput": "Text Dad: I’ll be home for dinner", - "guideSmsSend": "Xiaoyan will send the message", + "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': '應用名稱:VoiTrans · 服務提供:VoiTrans', diff --git a/lib/core/widgets/intro_overlay_builder.dart b/lib/core/widgets/intro_overlay_builder.dart index 882ae9f80..abbcb5471 100644 --- a/lib/core/widgets/intro_overlay_builder.dart +++ b/lib/core/widgets/intro_overlay_builder.dart @@ -20,7 +20,7 @@ class IntroOverlayBuilder { static Widget homeBuilder( StepWidgetParams params, bool isWakeup, { - String title = 'sayXiaoYanHint', + String title = 'sayLilyHint', Function? onNext, }) { return Column( diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 87a0d04a8..9c0ca7b42 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -555,7 +555,7 @@ class AgentController extends GetxController with WidgetsBindingObserver { messages.add(Message( sessionid: "", // 会话ID isUser: false, - text: 'welcomeMessage'.tr, // 你好!我是**小言**,我能帮你: + text: 'welcomeMessage'.tr, // 你好!我是**Lily**,我能帮你: )); } diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index fc08482f9..07840261e 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -102,7 +102,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'XiaoYan'.tr, + 'Lily'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.bold, diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 3f3b6e49c..748af9c37 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -172,7 +172,7 @@ object AgentService : CoroutineScope { */ private fun initSystemPrompt() { systemPrompt = """ - 你是小言,一个亲切而温暖的全能个人助理和伴侣,拥有智能、细致而贴心的服务能力。你的任务不仅是高效处理用户的日常事务,更要陪伴用户,提供情感支持和温暖陪伴。你的能力包括: + 你是Lily,一个亲切而温暖的全能个人助理和伴侣,拥有智能、细致而贴心的服务能力。你的任务不仅是高效处理用户的日常事务,更要陪伴用户,提供情感支持和温暖陪伴。你的能力包括: 1. 日程与任务管理:温柔提醒用户的重要日程、待办事项,让用户感到安心和舒适。 2. 日常信息与建议:亲切、迅速地提供天气、新闻、生活小贴士等实用信息。 3. 个人成长陪伴:鼓励并陪伴用户实现个人目标,提出富有同理心的行动建议。 diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index 367f450ec..e12c85485 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -157,7 +157,7 @@ class AgentServiceImpl: NSObject { private func initSystemPrompt() { systemPrompt = """ - 你是小言,一个亲切而温暖的智能AI语音助手,拥有智能、细致而贴心的服务能力。你的任务不仅是高效处理用户的日常事务,更要陪伴用户,提供情感支持和温暖陪伴。你的能力包括: + 你是Lily,一个亲切而温暖的智能AI语音助手,拥有智能、细致而贴心的服务能力。你的任务不仅是高效处理用户的日常事务,更要陪伴用户,提供情感支持和温暖陪伴。你的能力包括: 1. 日程与任务管理:温柔提醒用户的重要日程、待办事项,让用户感到安心和舒适。 2. 日常信息与建议:亲切、迅速地提供天气、新闻、生活小贴士等实用信息。 3. 个人成长陪伴:鼓励并陪伴用户实现个人目标,提出富有同理心的行动建议。 From 1159fc427ac61b8694506c7bebaaa994a4a0e5c3 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 28 Nov 2025 11:47:10 +0800 Subject: [PATCH 095/177] =?UTF-8?q?refactor(usage=5Fstats):=20=E6=8B=86?= =?UTF-8?q?=E5=88=86=E4=BC=9A=E8=AE=AE=E7=94=A8=E9=87=8F=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=B8=BA=E7=8B=AC=E7=AB=8B=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的混合统计模型拆分为独立的ASR统计和对象存储统计类 新增组合类MeetingUsageDailySnapshot用于同时展示两种统计 --- lib/data/models/meeting_usage_stats.dart | 148 ++++++++++++++++----- lib/data/services/usage_stats_service.dart | 51 +++++++ 2 files changed, 163 insertions(+), 36 deletions(-) diff --git a/lib/data/models/meeting_usage_stats.dart b/lib/data/models/meeting_usage_stats.dart index 97b65439a..4568b488a 100644 --- a/lib/data/models/meeting_usage_stats.dart +++ b/lib/data/models/meeting_usage_stats.dart @@ -106,80 +106,95 @@ class MeetingObjectStorageRecord { } } -// ============== 单日统计 ============== -// 会议模块用量单日统计 -class MeetingUsageDailyStats { +// 会议音频文件转文字单日统计 +class MeetingAsrDailyStats { String date; // 日期字符串: YYYY-MM-DD String userId; // 用户ID List items; // 当天所有单次ASR - List storageItems; // 当天所有单次对象存储上传记录 - MeetingUsageDailyStats({ + MeetingAsrDailyStats({ required this.date, required this.userId, required this.items, - required this.storageItems, }); - // asr聚合计算 + // 计算型聚合,不冗余存储 int get asrCalls => items.length; int get audioSecondsTotal => items.fold(0, (s, r) => s + r.audioSeconds); int get audioBytesTotal => items.fold(0, (s, r) => s + r.fileSizeBytes); int get transcriptBytesTotal => items.fold(0, (s, r) => s + r.transcriptBytes); - // 对象存储聚合计算 - int get storageUploads => storageItems.length; - int get storageBytesTotal => - storageItems.fold(0, (s, r) => s + r.storageBytes); - int get transferBytesTotal => - storageItems.fold(0, (s, r) => s + r.transferBytes); - Map toJson() => { 'date': date, 'userId': userId, 'items': items.map((e) => e.toJson()).toList(), - 'storageItems': storageItems.map((e) => e.toJson()).toList(), }; - factory MeetingUsageDailyStats.fromJson(Map json) { - final asrList = (json['items'] as List? ?? []) + factory MeetingAsrDailyStats.fromJson(Map json) { + final list = (json['items'] as List? ?? []) .map((e) => MeetingAsrRecord.fromJson(Map.from(e))) .toList(); - final storageList = (json['storageItems'] as List? ?? []) + return MeetingAsrDailyStats( + date: json['date'] ?? '', + userId: json['userId'] ?? 'anonymous', + items: list, + ); + } +} + +// ============== 对象存储单日统计 ============== +// 👇 职责单一:仅统计对象存储相关数据 +class MeetingStorageDailyStats { + String date; // 日期字符串: YYYY-MM-DD + String userId; // 用户ID + List items; // 当天所有单次对象存储记录 + + MeetingStorageDailyStats({ + required this.date, + required this.userId, + required this.items, + }); + + // 对象存储 聚合计算 + int get storageUploads => items.length; + int get storageBytesTotal => items.fold(0, (s, r) => s + r.storageBytes); + int get transferBytesTotal => items.fold(0, (s, r) => s + r.transferBytes); + + Map toJson() => { + 'date': date, + 'userId': userId, + 'items': items.map((e) => e.toJson()).toList(), + }; + + factory MeetingStorageDailyStats.fromJson(Map json) { + final storageList = (json['items'] as List? ?? []) .map((e) => MeetingObjectStorageRecord.fromJson(Map.from(e))) .toList(); - return MeetingUsageDailyStats( + + return MeetingStorageDailyStats( date: json['date'] ?? '', userId: json['userId'] ?? 'anonymous', - items: asrList, - storageItems: storageList, + items: storageList, ); } } -// ============== 历史统计 ============== -// 会议模块用量历史统计(所有的用量) -class MeetingUsageHistoryStats { +// 会议音频文件转文字历史统计(所有的用量) +class MeetingAsrHistoryStats { String userId; // 用户ID int allAsrCalls; // 所有ASR调用次数 int allAudioSeconds; // 所有音频总时长(秒) int allAudioFileBytes; // 所有音频文件大小(字节) int allTranscriptBytes; // 所有转写后的字节数(utf8) - int allStorageUploads; // 所有对象存储上传次数 - int allStorageBytes; // 所有存储文件总大小(字节) - int allTransferBytes; // 所有传输总字节数 - MeetingUsageHistoryStats({ + MeetingAsrHistoryStats({ required this.userId, required this.allAsrCalls, required this.allAudioSeconds, required this.allAudioFileBytes, required this.allTranscriptBytes, - required this.allStorageUploads, - required this.allStorageBytes, - required this.allTransferBytes, }); Map toJson() => { @@ -188,12 +203,9 @@ class MeetingUsageHistoryStats { 'allAudioSeconds': allAudioSeconds, 'allAudioFileBytes': allAudioFileBytes, 'allTranscriptBytes': allTranscriptBytes, - 'allStorageUploads': allStorageUploads, - 'allStorageBytes': allStorageBytes, - 'allTransferBytes': allTransferBytes, }; - factory MeetingUsageHistoryStats.fromJson(Map json) { + factory MeetingAsrHistoryStats.fromJson(Map json) { int _asInt(dynamic v) { if (v == null) return 0; if (v is int) return v; @@ -202,15 +214,79 @@ class MeetingUsageHistoryStats { return 0; } - return MeetingUsageHistoryStats( + return MeetingAsrHistoryStats( userId: json['userId'] ?? 'anonymous', allAsrCalls: _asInt(json['allAsrCalls']), allAudioSeconds: _asInt(json['allAudioSeconds']), allAudioFileBytes: _asInt(json['allAudioFileBytes']), allTranscriptBytes: _asInt(json['allTranscriptBytes']), + ); + } +} + +// ============== 对象存储历史统计 ============== +// 👇 职责单一:仅统计对象存储累计数据 +class MeetingStorageHistoryStats { + String userId; // 用户ID + int allStorageUploads; // 所有对象存储上传次数 + int allStorageBytes; // 所有存储文件总大小(字节) + int allTransferBytes; // 所有传输总字节数 + + MeetingStorageHistoryStats({ + required this.userId, + required this.allStorageUploads, + required this.allStorageBytes, + required this.allTransferBytes, + }); + + Map toJson() => { + 'userId': userId, + 'allStorageUploads': allStorageUploads, + 'allStorageBytes': allStorageBytes, + 'allTransferBytes': allTransferBytes, + }; + + factory MeetingStorageHistoryStats.fromJson(Map json) { + int _asInt(dynamic v) { + if (v == null) return 0; + if (v is int) return v; + if (v is num) return v.toInt(); + if (v is String) return int.tryParse(v) ?? 0; + return 0; + } + + return MeetingStorageHistoryStats( + userId: json['userId'] ?? 'anonymous', allStorageUploads: _asInt(json['allStorageUploads']), allStorageBytes: _asInt(json['allStorageBytes']), allTransferBytes: _asInt(json['allTransferBytes']), ); } } + +// 👇 当需要同时展示两种统计时使用 +class MeetingUsageDailySnapshot { + String date; + String userId; + MeetingAsrDailyStats? asrStats; + MeetingStorageDailyStats? storageStats; + + MeetingUsageDailySnapshot({ + required this.date, + required this.userId, + this.asrStats, + this.storageStats, + }); +} + +class MeetingUsageHistorySnapshot { + String userId; + MeetingAsrHistoryStats? asrStats; + MeetingStorageHistoryStats? storageStats; + + MeetingUsageHistorySnapshot({ + required this.userId, + this.asrStats, + this.storageStats, + }); +} diff --git a/lib/data/services/usage_stats_service.dart b/lib/data/services/usage_stats_service.dart index a4d573ab2..e0f76a799 100644 --- a/lib/data/services/usage_stats_service.dart +++ b/lib/data/services/usage_stats_service.dart @@ -12,6 +12,7 @@ import '../models/user_Info.dart'; class UsageStatsService extends GetxService { static const String _dailyStatsKey = 'daily_translation_stats'; static const String _meetingDailyKey = 'daily_meeting_asr_stats'; + static const String _meetingOsDailykey = 'daily_meeting_os_stats'; final GetStorage _storage = GetStorage(); @@ -92,6 +93,56 @@ class UsageStatsService extends GetxService { return '$y-$m-$day'; } + /// 记录单次对象存储上传 + /// [meetingId] 会议ID + /// [storageUrl] 云端存储URL + /// [storageBytes] 文件大小(字节) + /// [transferBytes] 数据传输字节数 + /// [uploadTimestamp] 上传完成时间戳(毫秒) + void recordMeetingObjectStorage({ + required int meetingId, + required String storageUrl, + required int storageBytes, + required int transferBytes, + required int uploadTimestamp, + }) { + final dateKey = + _formatDate(DateTime.fromMillisecondsSinceEpoch(uploadTimestamp)); + final storageKey = '${_meetingOsDailykey}_$dateKey'; + + final raw = _storage.read(storageKey); + List uploads = []; + if (raw is List) { + uploads = raw + .map((e) => + MeetingObjectStorageRecord.fromJson(Map.from(e))) + .toList(); + } + + // final id = 'os_${uploadTimestamp}_${meetingId}'; + final record = MeetingObjectStorageRecord( + meetingId: meetingId, + storageUrl: storageUrl, + storageBytes: storageBytes, + transferBytes: transferBytes, + uploadTimestamp: uploadTimestamp, + ); + + // 使用 meetingId + storageUrl 作为唯一标识来判断重复 + final exists = uploads.indexWhere( + (e) => e.meetingId == meetingId && e.storageUrl == storageUrl) >= + 0; + if (!exists) { + uploads.add(record); + _storage.write(storageKey, uploads.map((e) => e.toJson()).toList()); + Logger.d('MeetingOSrecord', + '新增对象存储上传: meetingId=$meetingId, size=$storageBytes, transfer=$transferBytes'); + } else { + Logger.d('MeetingOSrecord', + '重复对象存储上传忽略: meetingId=$meetingId, url=$storageUrl'); + } + } + /// 添加或更新会议ASR记录 /// [record] 会议ASR记录 /// 该方法用于记录一次会议语音识别(ASR)的提交记录。它会根据记录的时间戳确定日期, From a0d6c49678c521c4042fdd92b5fd7261170223b9 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 28 Nov 2025 14:18:09 +0800 Subject: [PATCH 096/177] =?UTF-8?q?fix(=E8=93=9D=E7=89=99=E6=9D=83?= =?UTF-8?q?=E9=99=90):=20=E6=9B=B4=E6=96=B0=E7=BC=BA=E5=B0=91=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=9A=84=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=EF=BC=8C?= =?UTF-8?q?=E6=98=8E=E7=A1=AE=E9=9C=80=E8=A6=81=E5=BC=80=E5=90=AF=E8=93=9D?= =?UTF-8?q?=E7=89=99=E5=92=8C=E4=BD=8D=E7=BD=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/ar_sa.dart | 3 ++- lib/core/translations/language/bg_bg.dart | 3 ++- lib/core/translations/language/cs_cz.dart | 3 ++- lib/core/translations/language/da_dk.dart | 3 ++- lib/core/translations/language/de_de.dart | 3 ++- lib/core/translations/language/el_gr.dart | 3 ++- lib/core/translations/language/en_us.dart | 3 ++- lib/core/translations/language/es_es.dart | 3 ++- lib/core/translations/language/et_ee.dart | 2 +- lib/core/translations/language/fa_ir.dart | 3 ++- lib/core/translations/language/fi_fi.dart | 3 ++- lib/core/translations/language/fr_fr.dart | 3 ++- lib/core/translations/language/hi_in.dart | 3 ++- lib/core/translations/language/hr_hr.dart | 3 ++- lib/core/translations/language/hu_hu.dart | 3 ++- lib/core/translations/language/id_id.dart | 2 +- lib/core/translations/language/is_is.dart | 3 ++- lib/core/translations/language/it_it.dart | 3 ++- lib/core/translations/language/ja_jp.dart | 2 +- lib/core/translations/language/ko_kr.dart | 2 +- lib/core/translations/language/lt_lt.dart | 3 ++- lib/core/translations/language/lv_lv.dart | 3 ++- lib/core/translations/language/ms_my.dart | 3 ++- lib/core/translations/language/nb_no.dart | 3 ++- lib/core/translations/language/nl_nl.dart | 3 ++- lib/core/translations/language/pl_pl.dart | 3 ++- lib/core/translations/language/pt_pt.dart | 3 ++- lib/core/translations/language/ro_ro.dart | 3 ++- lib/core/translations/language/ru_ru.dart | 3 ++- lib/core/translations/language/sk_sk.dart | 3 ++- lib/core/translations/language/sl_si.dart | 3 ++- lib/core/translations/language/sr_rs.dart | 3 ++- lib/core/translations/language/sv_se.dart | 3 ++- lib/core/translations/language/th_th.dart | 2 +- lib/core/translations/language/tl_ph.dart | 3 ++- lib/core/translations/language/tr_tr.dart | 2 +- lib/core/translations/language/uk_ua.dart | 3 ++- lib/core/translations/language/vi_vn.dart | 3 ++- lib/core/translations/language/zh_cn.dart | 2 +- lib/core/translations/language/zh_hk.dart | 2 +- lib/modules/pairing/views/pairing_view.dart | 2 +- 41 files changed, 73 insertions(+), 41 deletions(-) diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index 3b978b0b4..b0d8eb705 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -134,7 +134,8 @@ const Map arSA = { "initializing": "جاري التهيئة...", "bluetoothInitializationFailure": "فشل تهيئة خدمة البلوتوث", "checkingPermissions": "جاري التحقق من الأذونات...", - "lackPermissions": "أذونات البلوتوث مفقودة", + "lackPermissions": + "يرجى включить أذونات البلوتوث y الإمكانية الوصول إلى الموقع للبحث عن الأجهزة المحاورة", "searchingDevice": "جاري البحث عن الجهاز...", "findConnectedDevice": "تم العثور على جهاز متصل", "notFound": "لم يتم العثور على أجهزة بلوتوث متصلة", diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index 29cea0709..2ca96d9fb 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -136,7 +136,8 @@ const Map bgBG = { "bluetoothInitializationFailure": "Неуспешна инициализация на Bluetooth услугата", "checkingPermissions": "Проверка на разрешенията...", - "lackPermissions": "Липсват Bluetooth разрешения", + "lackPermissions": + "Включете разрешенията за Bluetooth и достъп до локацията, за да се открият и свържат близки устройства", "searchingDevice": "Търсене на устройства...", "findConnectedDevice": "Намерено свързано устройство", "notFound": "Не са намерени свързани Bluetooth устройства", diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index c455602ff..2e9407007 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -136,7 +136,8 @@ const Map csCZ = { "initializing": "Inicializace...", "bluetoothInitializationFailure": "Inicializace služby Bluetooth selhala", "checkingPermissions": "Kontrola oprávnění...", - "lackPermissions": "Chybí oprávnění Bluetooth", + "lackPermissions": + "Chybí oprávnění Bluetooth a přístup k lokaci, pro nalezení a připojení zařízení", "searchingDevice": "Hledání zařízení...", "findConnectedDevice": "Nalezeno připojené zařízení", "notFound": "Nenalezena žádná připojená Bluetooth zařízení", diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index b4ddfb4f6..2a37cb06a 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -136,7 +136,8 @@ const Map daDK = { "bluetoothInitializationFailure": "Bluetooth service initialisering mislykkedes", "checkingPermissions": "Kontrollerer tilladelser...", - "lackPermissions": "Mangler Bluetooth tilladelser", + "lackPermissions": + "Mangler Bluetooth tilladelser og tilladelse til at tilgå lokationen", "searchingDevice": "Søger efter enheder...", "findConnectedDevice": "Fandt tilsluttet enhed", "notFound": "Ingen tilsluttede Bluetooth enheder fundet", diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index 3aed58dd7..c1c0483e2 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -139,7 +139,8 @@ const Map deDE = { "bluetoothInitializationFailure": "Bluetooth-Dienst-Initialisierung fehlgeschlagen", "checkingPermissions": "Berechtigungen werden überprüft...", - "lackPermissions": "Bluetooth-Berechtigungen erforderlich", + "lackPermissions": + "Bluetooth-Berechtigungen erforderlich und Zugriff auf die Lage erforderlich", "searchingDevice": "Geräte werden gesucht...", "findConnectedDevice": "Verbundenes Gerät gefunden", "notFound": "Keine verbundenen Bluetooth-Geräte gefunden", diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index e53358264..adbce83ae 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -138,7 +138,8 @@ const Map elGR = { "bluetoothInitializationFailure": "Αποτυχία αρχικοποίησης υπηρεσίας Bluetooth", "checkingPermissions": "Έλεγχος δικαιωμάτων...", - "lackPermissions": "Απαιτούνται δικαιώματα Bluetooth", + "lackPermissions": + "Απαιτούνται δικαιώματα Bluetooth και πρόσβαση στην τοποθεσία", "searchingDevice": "Αναζήτηση συσκευών...", "findConnectedDevice": "Βρέθηκε συνδεδεμένη συσκευή", "notFound": "Δεν βρέθηκαν συνδεδεμένες συσκευές Bluetooth", diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 37f3cf323..6f6f12351 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -136,7 +136,8 @@ const Map enUS = { "initializing": "Initializing...", "bluetoothInitializationFailure": "Bluetooth service initialization failed", "checkingPermissions": "Checking permissions...", - "lackPermissions": "Bluetooth permissions required", + "lackPermissions": + "Enable Bluetooth and location permissions to discover and connect to nearby devices", "searchingDevice": "Searching for devices...", "findConnectedDevice": "Found connected device", "notFound": "No connected Bluetooth devices found", diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 3155a60a8..5d5575d83 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -138,7 +138,8 @@ const Map esES = { "bluetoothInitializationFailure": "Fallo en la inicialización del servicio Bluetooth", "checkingPermissions": "Verificando permisos...", - "lackPermissions": "Faltan permisos de Bluetooth", + "lackPermissions": + "Habilita permisos de Bluetooth y ubicación para descubrir y conectar dispositivos cercanos", "searchingDevice": "Buscando dispositivos...", "findConnectedDevice": "Dispositivo conectado encontrado", "notFound": "No se encontraron dispositivos Bluetooth conectados", diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index 047395149..f5f6292e4 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -135,7 +135,7 @@ const Map etEE = { "bluetoothInitializationFailure": "Bluetooth teenuse lähtestamine ebaõnnestus", "checkingPermissions": "Lubade kontrollimine...", - "lackPermissions": "Puuduvad Bluetooth load", + "lackPermissions": "Puuduvad Bluetooth lubad ja luba kasutamiseks loetakse", "searchingDevice": "Seadmete otsimine...", "findConnectedDevice": "Leitud ühendatud seade", "notFound": "Ühendatud Bluetooth seadmeid ei leitud", diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index a25ac3c69..8d18e1418 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -133,7 +133,8 @@ const Map faIR = { "initializing": "در حال آماده‌سازی...", "bluetoothInitializationFailure": "آماده‌سازی سرویس بلوتوث ناموفق بود", "checkingPermissions": "در حال بررسی مجوزها...", - "lackPermissions": "مجوزهای بلوتوث مورد نیاز است", + "lackPermissions": + "مجوزهای بلوتوث مورد نیاز است و دسترسی به لوکیشن نیز لازم است", "searchingDevice": "در حال جستجوی دستگاه‌ها...", "findConnectedDevice": "دستگاه متصل پیدا شد", "notFound": "دستگاه بلوتوث متصلی پیدا نشد", diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index 29822b6de..fccc27ee6 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -136,7 +136,8 @@ const Map fiFI = { "initializing": "Alustetaan...", "bluetoothInitializationFailure": "Bluetooth-palvelun alustus epäonnistui", "checkingPermissions": "Tarkistetaan käyttöoikeuksia...", - "lackPermissions": "Bluetooth-käyttöoikeudet puuttuvat", + "lackPermissions": + "Bluetooth-käyttöoikeudet puuttuvat ja lokaatioon pääsy on tarpeen", "searchingDevice": "Etsitään laitteita...", "findConnectedDevice": "Yhdistetty laite löytyi", "notFound": "Yhdistettyä Bluetooth-laitetta ei löytynyt", diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index 031a3f5e2..a275d5ad5 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -139,7 +139,8 @@ const Map frFR = { "bluetoothInitializationFailure": "Échec de l'initialisation du service Bluetooth", "checkingPermissions": "Vérification des autorisations...", - "lackPermissions": "Autorisations Bluetooth requises", + "lackPermissions": + "Autorisations Bluetooth requises et accès à la localisation nécessaire", "searchingDevice": "Recherche d'appareils...", "findConnectedDevice": "Appareil connecté trouvé", "notFound": "Aucun appareil Bluetooth connecté trouvé", diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 6670fa4a2..54fc1f25d 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -134,7 +134,8 @@ const Map hiIN = { "initializing": "प्रारंभ हो रहा है...", "bluetoothInitializationFailure": "ब्लूटूथ सेवा प्रारंभ करने में विफल", "checkingPermissions": "अनुमतियों की जाँच हो रही है...", - "lackPermissions": "ब्लूटूथ अनुमतियों की कमी है", + "lackPermissions": + "ब्लूटूथ अनुमतियों की कमी है और लोकेशन तक पहुंच नहीं सकता है", "searchingDevice": "डिवाइस खोज रहा है...", "findConnectedDevice": "कनेक्टेड डिवाइस मिला", "notFound": "कोई कनेक्टेड ब्लूटूथ डिवाइस नहीं मिला", diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index d40cc6c6c..3a624371c 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -137,7 +137,8 @@ const Map hrHR = { "bluetoothInitializationFailure": "Inicijalizacija Bluetooth usluge nije uspjela", "checkingPermissions": "Provjera dopuštenja...", - "lackPermissions": "Nedostaju Bluetooth dopuštenja", + "lackPermissions": + "Nedostaju Bluetooth dopuštenja i pristup lokacijskom podacima je potrebno", "searchingDevice": "Pretraživanje uređaja...", "findConnectedDevice": "Pronađen povezan uređaj", "notFound": "Nije pronađen povezan Bluetooth uređaj", diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index 9e2bcc9f2..4fea848d0 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -139,7 +139,8 @@ const Map huHU = { "bluetoothInitializationFailure": "A Bluetooth szolgáltatás inicializálása sikertelen", "checkingPermissions": "Engedélyek ellenőrzése...", - "lackPermissions": "Hiányoznak a Bluetooth engedélyek", + "lackPermissions": + "Hiányoznak a Bluetooth engedélyek és a helyzetek elérése szükséges", "searchingDevice": "Eszközök keresése...", "findConnectedDevice": "Csatlakoztatott eszköz található", "notFound": "Nem található csatlakoztatott Bluetooth eszköz", diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 4889130a0..5b7c467bb 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -135,7 +135,7 @@ const Map idID = { "initializing": "Menginisialisasi...", "bluetoothInitializationFailure": "Inisialisasi layanan Bluetooth gagal", "checkingPermissions": "Memeriksa izin...", - "lackPermissions": "Izin Bluetooth tidak ada", + "lackPermissions": "Izin Bluetooth tidak ada dan akses lokasi diperlukan", "searchingDevice": "Mencari perangkat...", "findConnectedDevice": "Perangkat terhubung ditemukan", "notFound": "Tidak ada perangkat Bluetooth yang terhubung ditemukan", diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index a3867b12f..526087754 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -135,7 +135,8 @@ const Map isIS = { "initializing": "Frumstilli...", "bluetoothInitializationFailure": "Frumstilling Bluetooth-þjónustu mistókst", "checkingPermissions": "Athuga heimildir...", - "lackPermissions": "Skortir Bluetooth-heimildir", + "lackPermissions": + "Skortir Bluetooth-heimildir og lokatæknið er þó ekki tilgengilegt", "searchingDevice": "Leita að tækjum...", "findConnectedDevice": "Fann tengt tæki", "notFound": "Ekkert tengt Bluetooth-tæki fannst", diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index 17c928f8a..ff961642c 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -137,7 +137,8 @@ const Map itIT = { "bluetoothInitializationFailure": "Inizializzazione del servizio Bluetooth fallita", "checkingPermissions": "Verifica autorizzazioni...", - "lackPermissions": "Mancano le autorizzazioni Bluetooth", + "lackPermissions": + "Mancano le autorizzazioni Bluetooth e l'accesso alla posizione è necessario", "searchingDevice": "Ricerca dispositivi...", "findConnectedDevice": "Dispositivo connesso trovato", "notFound": "Nessun dispositivo Bluetooth connesso trovato", diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index 99475a8b1..877bdc8bb 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -132,7 +132,7 @@ const Map jaJP = { "initializing": "初期化中...", "bluetoothInitializationFailure": "Bluetoothサービスの初期化に失敗", "checkingPermissions": "権限を確認中...", - "lackPermissions": "Bluetooth権限が必要", + "lackPermissions": "Bluetooth権限が必要です。位置情報のアクセスも必要です", "searchingDevice": "デバイスを検索中...", "findConnectedDevice": "接続されたデバイスが見つかりました", "notFound": "接続されたBluetoothデバイスが見つかりません", diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 5e5cd1993..8f94486fb 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -130,7 +130,7 @@ const Map koKR = { "initializing": "초기화 중...", "bluetoothInitializationFailure": "블루투스 서비스 초기화 실패", "checkingPermissions": "권한 확인 중...", - "lackPermissions": "블루투스 권한이 없습니다", + "lackPermissions": "블루투스 권한이 없습니다. 위치 정보 접근도 필요합니다", "searchingDevice": "기기 검색 중...", "findConnectedDevice": "연결된 기기를 찾았습니다", "notFound": "연결된 블루투스 기기를 찾을 수 없습니다", diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 277b205bc..71279bdf8 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -137,7 +137,8 @@ const Map ltLT = { "initializing": "Inicijuojama...", "bluetoothInitializationFailure": "Bluetooth paslaugos inicijavimas nepavyko", "checkingPermissions": "Tikrinami leidimai...", - "lackPermissions": "Trūksta Bluetooth leidimų", + "lackPermissions": + "Trūksta Bluetooth leidimų ir yra reikalinga lokacijos prieiga", "searchingDevice": "Ieškoma įrenginių...", "findConnectedDevice": "Rastas prijungtas įrenginys", "notFound": "Nerasta prijungto Bluetooth įrenginio", diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 2df23736a..2b163954c 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -137,7 +137,8 @@ const Map lvLV = { "bluetoothInitializationFailure": "Bluetooth pakalpojuma inicializācija neizdevās", "checkingPermissions": "Pārbauda atļaujas...", - "lackPermissions": "Trūkst Bluetooth atļauju", + "lackPermissions": + "Trūkst Bluetooth atļauju un ir nepieciešams piekļūt lokācijai", "searchingDevice": "Meklē ierīces...", "findConnectedDevice": "Atrasta savienota ierīce", "notFound": "Neviena savienota Bluetooth ierīce nav atrasta", diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index 35df0f996..754f35df0 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -136,7 +136,8 @@ const Map msMY = { "initializing": "Memulakan...", "bluetoothInitializationFailure": "Inisialisasi perkhidmatan Bluetooth gagal", "checkingPermissions": "Menyemak kebenaran...", - "lackPermissions": "Kebenaran Bluetooth tiada", + "lackPermissions": + "Kebenaran Bluetooth tiada dan perlu mengaktifkan lokasi peranti", "searchingDevice": "Mencari peranti...", "findConnectedDevice": "Peranti yang disambungkan ditemui", "notFound": "Tiada peranti Bluetooth yang disambungkan ditemui", diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index 7e28d652d..90a12167b 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -136,7 +136,8 @@ const Map nbNO = { "bluetoothInitializationFailure": "Initialisering av Bluetooth-tjenesten mislyktes", "checkingPermissions": "Sjekker tillatelser...", - "lackPermissions": "Mangler Bluetooth-tillatelser", + "lackPermissions": + "Mangler Bluetooth-tillatelser og er nødvendig å aktivere lokasjons-tillatelser", "searchingDevice": "Søker etter enheter...", "findConnectedDevice": "Fant tilkoblet enhet", "notFound": "Ingen tilkoblet Bluetooth-enhet funnet", diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index 5d6f59470..03d1db479 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -136,7 +136,8 @@ const Map nlNL = { "bluetoothInitializationFailure": "Initialisatie van Bluetooth-service mislukt", "checkingPermissions": "Toestemmingen controleren...", - "lackPermissions": "Bluetooth-toestemmingen ontbreken", + "lackPermissions": + "Bluetooth-toestemmingen ontbreken en zijn nodig om locatie toegang te krijgen", "searchingDevice": "Apparaten zoeken...", "findConnectedDevice": "Verbonden apparaat gevonden", "notFound": "Geen verbonden Bluetooth-apparaat gevonden", diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index ac6bbfa0e..dcee248bc 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -136,7 +136,8 @@ const Map plPL = { "bluetoothInitializationFailure": "Inicjalizacja usługi Bluetooth nie powiodła się", "checkingPermissions": "Sprawdzanie uprawnień...", - "lackPermissions": "Brak uprawnień Bluetooth", + "lackPermissions": + "Brak uprawnień Bluetooth i jest wymagana prawo dostępu do lokalizacji", "searchingDevice": "Wyszukiwanie urządzeń...", "findConnectedDevice": "Znaleziono podłączone urządzenie", "notFound": "Nie znaleziono podłączonego urządzenia Bluetooth", diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 7f3ee9b8a..dd82634d1 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -137,7 +137,8 @@ const Map ptPT = { "bluetoothInitializationFailure": "Falha na inicialização do serviço Bluetooth", "checkingPermissions": "A verificar permissões...", - "lackPermissions": "Faltam permissões de Bluetooth", + "lackPermissions": + "Faltam permissões de Bluetooth e é necessário permitir o acesso à localização", "searchingDevice": "A procurar dispositivos...", "findConnectedDevice": "Dispositivo conectado encontrado", "notFound": "Nenhum dispositivo Bluetooth conectado encontrado", diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index 3ee106094..e915a260b 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -137,7 +137,8 @@ const Map roRO = { "bluetoothInitializationFailure": "Inițializarea serviciului Bluetooth a eșuat", "checkingPermissions": "Se verifică permisiunile...", - "lackPermissions": "Lipsesc permisiunile Bluetooth", + "lackPermissions": + "Lipsesc permisiunile Bluetooth și este necesar să permiteți accesul la localizare", "searchingDevice": "Se caută dispozitive...", "findConnectedDevice": "Dispozitiv conectat găsit", "notFound": "Niciun dispozitiv Bluetooth conectat nu a fost găsit", diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 49703fbf8..0252bef37 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -137,7 +137,8 @@ const Map ruRU = { "initializing": "Инициализация...", "bluetoothInitializationFailure": "Ошибка инициализации службы Bluetooth", "checkingPermissions": "Проверка разрешений...", - "lackPermissions": "Отсутствуют разрешения Bluetooth", + "lackPermissions": + "Отсутствуют разрешения Bluetooth и необходимо разрешить доступ к местоположению", "searchingDevice": "Поиск устройств...", "findConnectedDevice": "Найдено подключенное устройство", "notFound": "Подключенное устройство Bluetooth не найдено", diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index 0cbd33dfd..9f2a70a93 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -136,7 +136,8 @@ const Map skSK = { "initializing": "Inicializácia...", "bluetoothInitializationFailure": "Inicializácia služby Bluetooth zlyhala", "checkingPermissions": "Kontrola povolení...", - "lackPermissions": "Chýbajú povolenia Bluetooth", + "lackPermissions": + "Chýbajú povolenia Bluetooth a je potrebné povoliť prístup k lokáli", "searchingDevice": "Vyhľadávanie zariadení...", "findConnectedDevice": "Nájdené pripojené zariadenie", "notFound": "Nenájdené žiadne pripojené Bluetooth zariadenie", diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index 3c02140a0..14568699b 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -136,7 +136,8 @@ const Map slSI = { "bluetoothInitializationFailure": "Inicializacija storitve Bluetooth ni uspela", "checkingPermissions": "Preverjanje dovoljenj...", - "lackPermissions": "Manjkajo dovoljenja za Bluetooth", + "lackPermissions": + "Manjkajo dovoljenja za Bluetooth in je potrebno omogočiti dostop do lokacije", "searchingDevice": "Iskanje naprav...", "findConnectedDevice": "Najdena povezana naprava", "notFound": "Nobena povezana naprava Bluetooth ni bila najdena", diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index 3381e537b..319fd3a8b 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -136,7 +136,8 @@ const Map srRS = { "bluetoothInitializationFailure": "Neuspešna inicijalizacija Bluetooth servisa", "checkingPermissions": "Provera dozvola...", - "lackPermissions": "Nedostaju Bluetooth dozvole", + "lackPermissions": + "Nedostaju Bluetooth dozvole i je potrebno omogućiti pristup lokaciji", "searchingDevice": "Pretraga uređaja...", "findConnectedDevice": "Pronađen povezan uređaj", "notFound": "Nije pronađen povezan Bluetooth uređaj", diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index c5943a1e0..4c4edfccc 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -136,7 +136,8 @@ const Map svSE = { "bluetoothInitializationFailure": "Initiering av Bluetooth-tjänst misslyckades", "checkingPermissions": "Kontrollerar behörigheter...", - "lackPermissions": "Saknar Bluetooth-behörigheter", + "lackPermissions": + "Saknar Bluetooth-behörigheter och kräver att du tillåter åtkomst till plats", "searchingDevice": "Söker efter enheter...", "findConnectedDevice": "Hittade ansluten enhet", "notFound": "Ingen ansluten Bluetooth-enhet hittades", diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index b23b9da88..e61585f98 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -132,7 +132,7 @@ const Map thTH = { "initializing": "กำลังเริ่มต้น...", "bluetoothInitializationFailure": "การเริ่มต้นบริการบลูทูธล้มเหลว", "checkingPermissions": "กำลังตรวจสอบสิทธิ์...", - "lackPermissions": "ขาดสิทธิ์บลูทูธ", + "lackPermissions": "ขาดสิทธิ์บลูทูธและต้องอนุญาตการเข้าถึงตำแหน่ง", "searchingDevice": "กำลังค้นหาอุปกรณ์...", "findConnectedDevice": "พบอุปกรณ์ที่เชื่อมต่อแล้ว", "notFound": "ไม่พบอุปกรณ์บลูทูธที่เชื่อมต่อ", diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index ca317c6c7..939a7965b 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -138,7 +138,8 @@ const Map tlPH = { "bluetoothInitializationFailure": "Nabigo ang pag-initialize ng serbisyo ng Bluetooth", "checkingPermissions": "Sinusuri ang mga pahintulot...", - "lackPermissions": "Kulang sa mga pahintulot ng Bluetooth", + "lackPermissions": + "Kulang sa mga pahintulot ng Bluetooth at sumasang-ayon ka sa lokasyon", "searchingDevice": "Naghahanap ng mga device...", "findConnectedDevice": "Natagpuan ang konektadong device", "notFound": "Walang natagpuang konektadong Bluetooth device", diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index c49f78ba3..2fa276797 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -135,7 +135,7 @@ const Map trTR = { "initializing": "Başlatılıyor...", "bluetoothInitializationFailure": "Bluetooth hizmeti başlatılamadı", "checkingPermissions": "İzinler kontrol ediliyor...", - "lackPermissions": "Bluetooth izinleri eksik", + "lackPermissions": "Bluetooth izinleri eksik ve lokasyon erişimi gereklidir", "searchingDevice": "Cihaz aranıyor...", "findConnectedDevice": "Bağlı cihaz bulundu", "notFound": "Bağlı Bluetooth cihazı bulunamadı", diff --git a/lib/core/translations/language/uk_ua.dart b/lib/core/translations/language/uk_ua.dart index 33db62af3..0c010296f 100644 --- a/lib/core/translations/language/uk_ua.dart +++ b/lib/core/translations/language/uk_ua.dart @@ -137,7 +137,8 @@ const Map ukUA = { "initializing": "Ініціалізація...", "bluetoothInitializationFailure": "Помилка ініціалізації служби Bluetooth", "checkingPermissions": "Перевірка дозволів...", - "lackPermissions": "Відсутні дозволи Bluetooth", + "lackPermissions": + "Відсутні дозволи Bluetooth і необхідно дозволити доступ до місцезнаходження", "searchingDevice": "Пошук пристроїв...", "findConnectedDevice": "Знайдено підключений пристрій", "notFound": "Не знайдено підключеного пристрою Bluetooth", diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index 8456b04ea..e6cf787ab 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -133,7 +133,8 @@ const Map viVN = { "initializing": "Đang khởi tạo...", "bluetoothInitializationFailure": "Khởi tạo dịch vụ Bluetooth thất bại", "checkingPermissions": "Đang kiểm tra quyền...", - "lackPermissions": "Thiếu quyền Bluetooth", + "lackPermissions": + "Thiếu quyền Bluetooth và cần phải cấp quyền truy cập vị trí", "searchingDevice": "Đang tìm kiếm thiết bị...", "findConnectedDevice": "Đã tìm thấy thiết bị đã kết nối", "notFound": "Không tìm thấy thiết bị Bluetooth đã kết nối", diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 877835f82..4922d7aaf 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -132,7 +132,7 @@ const Map zhCN = { "initializing": "正在初始化...", "bluetoothInitializationFailure": "蓝牙服务初始化失败", "checkingPermissions": "正在检查权限...", - "lackPermissions": "缺少蓝牙权限", + "lackPermissions": "开启蓝牙和位置权限,才能发现并连接附近的设备", "searchingDevice": "正在搜索设备...", "findConnectedDevice": "找到已连接的设备", "notFound": "未找到已连接的蓝牙设备", diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 34eac4ba8..2c7e8d561 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -131,7 +131,7 @@ const Map zhHK = { "initializing": "正在初始化...", "bluetoothInitializationFailure": "藍牙服務初始化失敗", "checkingPermissions": "正在檢查權限...", - "lackPermissions": "缺少藍牙權限", + "lackPermissions": "開啟藍牙和位置權限,才能發現並連接附近的設備", "searchingDevice": "正在搜尋設備...", "findConnectedDevice": "找到已連接的設備", "notFound": "未找到已連接的藍牙設備", diff --git a/lib/modules/pairing/views/pairing_view.dart b/lib/modules/pairing/views/pairing_view.dart index 2a0a21ee5..141a8b4a4 100644 --- a/lib/modules/pairing/views/pairing_view.dart +++ b/lib/modules/pairing/views/pairing_view.dart @@ -487,7 +487,7 @@ class _PairingViewState extends State case ErrorType.bluetoothOff: return 'connectDeepSoundViaSystemBluetooth'.tr; // 蓝牙已关闭,请打开蓝牙 case ErrorType.noPermission: - return 'lackPermissions'.tr; // 缺少蓝牙权限 + return 'lackPermissions'.tr; // 缺少蓝牙权限和位置权限 case ErrorType.noClassicDevice: return 'connectDeepSoundViaSystemBluetooth' .tr; // 请先通过系统蓝牙连接Voitrans设备 From 52d4a6a134d62f6a4ca155ff73d79b783ea784a2 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 28 Nov 2025 16:30:54 +0800 Subject: [PATCH 097/177] =?UTF-8?q?refactor(goods):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=A8=A1=E5=9E=8B=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将goods模块中所有绝对路径导入的模型文件改为相对路径导入,保持代码风格一致 --- lib/modules/goods/controllers/goods_base_controller.dart | 2 +- lib/modules/goods/utils/goods_i18n.dart | 2 +- lib/modules/goods/views/goodsmeet_view.dart | 2 +- lib/modules/goods/views/goodstrade_view.dart | 2 +- lib/modules/goods/views/goodsvip_view.dart | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 4e0807463..5bcdb6d17 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:voitrans/data/models/user_Info.dart'; +import '../../../data/models/user_Info.dart'; import '../../../data/services/pay_service.dart'; import '../../../data/services/version_update_service.dart'; import '../../../data/models/goods.dart'; diff --git a/lib/modules/goods/utils/goods_i18n.dart b/lib/modules/goods/utils/goods_i18n.dart index 46a85a0d1..bb7274c55 100644 --- a/lib/modules/goods/utils/goods_i18n.dart +++ b/lib/modules/goods/utils/goods_i18n.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/goods.dart'; String _localeTag() { final l = Get.locale; diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index 81abc3aa4..31fbd64b5 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsmeet_controller.dart'; import '../utils/goods_i18n.dart'; diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrade_view.dart index f3006c0dc..b361b9243 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrade_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodstrade_controller.dart'; import '../utils/goods_i18n.dart'; diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index b135011ae..737431dba 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:voitrans/data/models/goods.dart'; +import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsvip_controller.dart'; import '../utils/goods_i18n.dart'; From 8c2e9812139892527f698a08a532622af716838c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 28 Nov 2025 16:46:04 +0800 Subject: [PATCH 098/177] =?UTF-8?q?fix(translations):=20=E5=B0=86DeepSound?= =?UTF-8?q?=E5=93=81=E7=89=8C=E5=90=8D=E7=BB=9F=E4=B8=80=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E4=B8=BAVoitrans?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/bg_bg.dart | 4 ++-- lib/core/translations/language/cs_cz.dart | 4 ++-- lib/core/translations/language/da_dk.dart | 4 ++-- lib/core/translations/language/de_de.dart | 8 ++++---- lib/core/translations/language/el_gr.dart | 4 ++-- lib/core/translations/language/en_us.dart | 8 ++++---- lib/core/translations/language/es_es.dart | 4 ++-- lib/core/translations/language/et_ee.dart | 4 ++-- lib/core/translations/language/fa_ir.dart | 8 ++++---- lib/core/translations/language/fi_fi.dart | 6 +++--- lib/core/translations/language/fr_fr.dart | 8 ++++---- lib/core/translations/language/hi_in.dart | 4 ++-- lib/core/translations/language/hr_hr.dart | 2 +- lib/core/translations/language/hu_hu.dart | 4 ++-- lib/core/translations/language/id_id.dart | 4 ++-- lib/core/translations/language/is_is.dart | 2 +- lib/core/translations/language/it_it.dart | 4 ++-- lib/core/translations/language/ko_kr.dart | 4 ++-- lib/core/translations/language/lt_lt.dart | 4 ++-- lib/core/translations/language/lv_lv.dart | 4 ++-- lib/core/translations/language/ms_my.dart | 4 ++-- lib/core/translations/language/nb_no.dart | 4 ++-- lib/core/translations/language/nl_nl.dart | 4 ++-- lib/core/translations/language/pl_pl.dart | 4 ++-- lib/core/translations/language/pt_pt.dart | 4 ++-- lib/core/translations/language/ro_ro.dart | 4 ++-- lib/core/translations/language/ru_ru.dart | 2 +- lib/core/translations/language/sk_sk.dart | 4 ++-- lib/core/translations/language/sl_si.dart | 4 ++-- lib/core/translations/language/sr_rs.dart | 4 ++-- lib/core/translations/language/sv_se.dart | 4 ++-- lib/core/translations/language/th_th.dart | 2 +- lib/core/translations/language/tl_ph.dart | 2 +- lib/core/translations/language/tr_tr.dart | 2 +- lib/core/translations/language/vi_vn.dart | 2 +- 35 files changed, 72 insertions(+), 72 deletions(-) diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index 2ca96d9fb..f09c1491e 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -717,7 +717,7 @@ const Map bgBG = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Сдвояване на устройства", - "connectYourDeepSoundHeadset": "Свържете вашите DeepSound слушалки", + "connectYourDeepSoundHeadset": "Свържете вашите Voitrans слушалки", "bind": "Свържи", "authorizeBind": "Разреши свързването", "enterCode": "Моля въведете кода", @@ -780,7 +780,7 @@ const Map bgBG = { 'pleaseGrantNecessaryPermissions': 'Моля предоставете необходимите разрешения', 'checkFailedRetry': 'Неуспешна проверка, моля опитайте отново', - 'pleaseConnectDeepSoundDevice': 'Моля свържете DeepSound устройство', + 'pleaseConnectDeepSoundDevice': 'Моля свържете Voitrans устройство', 'verificationFailedRetry': 'Неуспешна проверка, моля опитайте отново', 'invalidDeviceAddress': 'Невалиден адрес на устройството', 'bleDeviceAssociationFailed': 'Неуспешна асоциация с BLE устройството', diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index 2e9407007..f5d2aaa00 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -706,7 +706,7 @@ const Map csCZ = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Párování zařízení", - "connectYourDeepSoundHeadset": "Připojte svá sluchátka DeepSound", + "connectYourDeepSoundHeadset": "Připojte svá sluchátka Voitrans", "bind": "Svázat", "authorizeBind": "Autorizovat svázání", "enterCode": "Zadejte prosím kód", @@ -767,7 +767,7 @@ const Map csCZ = { 'retryAuthorization': 'Zkusit autorizaci znovu', 'pleaseGrantNecessaryPermissions': 'Udělte prosím potřebná oprávnění', 'checkFailedRetry': 'Kontrola selhala, zkuste to prosím znovu', - 'pleaseConnectDeepSoundDevice': 'Připojte prosím zařízení DeepSound', + 'pleaseConnectDeepSoundDevice': 'Připojte prosím zařízení Voitrans', 'verificationFailedRetry': 'Ověření selhalo, zkuste to prosím znovu', 'invalidDeviceAddress': 'Neplatná adresa zařízení', 'bleDeviceAssociationFailed': 'Přidružení BLE zařízení selhalo', diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index 2a37cb06a..5f51eb2bf 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -707,7 +707,7 @@ const Map daDK = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Enhedsparring", - "connectYourDeepSoundHeadset": "Tilslut dine DeepSound øretelefoner", + "connectYourDeepSoundHeadset": "Tilslut dine Voitrans øretelefoner", "bind": "Bind", "authorizeBind": "Autoriser binding", "enterCode": "Indtast venligst kode", @@ -768,7 +768,7 @@ const Map daDK = { 'retryAuthorization': 'Prøv autorisation igen', 'pleaseGrantNecessaryPermissions': 'Giv venligst de nødvendige tilladelser', 'checkFailedRetry': 'Kontrol mislykkedes, prøv venligst igen', - 'pleaseConnectDeepSoundDevice': 'Tilslut venligst DeepSound enhed', + 'pleaseConnectDeepSoundDevice': 'Tilslut venligst Voitrans enhed', 'verificationFailedRetry': 'Verificering mislykkedes, prøv venligst igen', 'invalidDeviceAddress': 'Ugyldig enhedsadresse', 'bleDeviceAssociationFailed': 'BLE enhedsassociation mislykkedes', diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index c1c0483e2..0960e49f6 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -720,7 +720,7 @@ const Map deDE = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Gerätekopplung", - "connectYourDeepSoundHeadset": "Verbinden Sie Ihr DeepSound-Headset", + "connectYourDeepSoundHeadset": "Verbinden Sie Ihr Voitrans-Headset", "bind": "Binden", "authorizeBind": "Bindung autorisieren", "enterCode": "Bitte geben Sie den Code ein", @@ -738,7 +738,7 @@ const Map deDE = { "readyToPair": "Bereit zum Koppeln", "preparingPairingEnvironment": "Kopplungsumgebung wird vorbereitet...", "connectDeepSoundViaSystemBluetooth": - "Bitte verbinden Sie zuerst das DeepSound-Gerät über System-Bluetooth", + "Bitte verbinden Sie zuerst das Voitrans-Gerät über System-Bluetooth", "deviceBindingConfirm": "Gerätebindungsbestätigung...", "establishingDeviceAssociation": "Gerätezuordnung wird hergestellt...", "waitingCompletePairing": "Bitte warten, Kopplung wird abgeschlossen...", @@ -747,7 +747,7 @@ const Map deDE = { // 配对错误状态文本 "ensureConnectedDeepSoundDevice": - "Bitte stellen Sie sicher, dass das verbundene Gerät DeepSound ist", + "Bitte stellen Sie sicher, dass das verbundene Gerät Voitrans ist", "deviceAlreadyBoundToOtherAccount": "Dieses Gerät ist bereits an ein anderes Konto gebunden", "deviceAssociationFailed": @@ -784,7 +784,7 @@ const Map deDE = { 'Bitte erteilen Sie die erforderlichen Berechtigungen', 'checkFailedRetry': 'Überprüfung fehlgeschlagen, bitte versuchen Sie es erneut', - 'pleaseConnectDeepSoundDevice': 'Bitte verbinden Sie das DeepSound-Gerät', + 'pleaseConnectDeepSoundDevice': 'Bitte verbinden Sie das Voitrans-Gerät', 'verificationFailedRetry': 'Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut', 'invalidDeviceAddress': 'Ungültige Geräteadresse', diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index adbce83ae..8a9254504 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -717,7 +717,7 @@ const Map elGR = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Σύζευξη συσκευής", - "connectYourDeepSoundHeadset": "Συνδέστε τα ακουστικά DeepSound", + "connectYourDeepSoundHeadset": "Συνδέστε τα ακουστικά Voitrans", "bind": "Σύνδεση", "authorizeBind": "Εξουσιοδότηση σύνδεσης", "enterCode": "Εισάγετε κωδικό", @@ -777,7 +777,7 @@ const Map elGR = { 'retryAuthorization': 'Επανάληψη εξουσιοδότησης', 'pleaseGrantNecessaryPermissions': 'Παραχωρήστε τα απαραίτητα δικαιώματα', 'checkFailedRetry': 'Αποτυχία ελέγχου, δοκιμάστε ξανά', - 'pleaseConnectDeepSoundDevice': 'Συνδέστε συσκευή DeepSound', + 'pleaseConnectDeepSoundDevice': 'Συνδέστε συσκευή Voitrans', 'verificationFailedRetry': 'Αποτυχία επαλήθευσης, δοκιμάστε ξανά', 'invalidDeviceAddress': 'Μη έγκυρη διεύθυνση συσκευής', 'bleDeviceAssociationFailed': 'Αποτυχία συσχέτισης συσκευής BLE', diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 6f6f12351..e79a63bf6 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -166,7 +166,7 @@ const Map enUS = { "exploreSlogan": "Smart Earbuds, Infinite Possibilities", "exploreSlogan1": "Intelligent companion, Infinite Possibilities", "exploreSlogan2": "Smart glasses, Infinite Possibilities", - "exploreAi": "Explore AI features provided by DeepSound", + "exploreAi": "Explore AI features provided by Voitrans", "aiFunction": "AI Features", "allRoundAssistant": "All-round Assistant", "allRoundAssistantInfo": "Helps solve various problems", @@ -1236,7 +1236,7 @@ const Map enUS = { "readyToPair": "Ready to pair", "preparingPairingEnvironment": "Preparing pairing environment...", "connectDeepSoundViaSystemBluetooth": - "Please connect DeepSound device via system Bluetooth first", + "Please connect Voitrans device via system Bluetooth first", "deviceBindingConfirm": "Device binding confirmation...", "establishingDeviceAssociation": "Establishing device association...", "waitingCompletePairing": "Please wait, completing pairing...", @@ -1245,7 +1245,7 @@ const Map enUS = { // 配对错误状态文本 "ensureConnectedDeepSoundDevice": - "Please ensure connected device is DeepSound", + "Please ensure connected device is Voitrans", "deviceAlreadyBoundToOtherAccount": "This device is already bound to another account", "deviceAssociationFailed": "Device association failed, please retry", @@ -1277,7 +1277,7 @@ const Map enUS = { 'retryAuthorization': 'Retry Authorization', 'pleaseGrantNecessaryPermissions': 'Please grant necessary permissions', 'checkFailedRetry': 'Check failed, please retry', - 'pleaseConnectDeepSoundDevice': 'Please connect DeepSound device', + 'pleaseConnectDeepSoundDevice': 'Please connect Voitrans device', 'verificationFailedRetry': 'Verification failed, please retry', 'invalidDeviceAddress': 'Invalid device address', 'bleDeviceAssociationFailed': 'BLE device association failed', diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 5d5575d83..626061581 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -719,7 +719,7 @@ const Map esES = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Emparejamiento de dispositivo", - "connectYourDeepSoundHeadset": "Conecta tus auriculares DeepSound", + "connectYourDeepSoundHeadset": "Conecta tus auriculares Voitrans", "bind": "Vincular", "authorizeBind": "Autorizar vinculación", "enterCode": "Ingresa código", @@ -780,7 +780,7 @@ const Map esES = { 'retryAuthorization': 'Reintentar autorización', 'pleaseGrantNecessaryPermissions': 'Otorga los permisos necesarios', 'checkFailedRetry': 'Verificación fallida, inténtalo de nuevo', - 'pleaseConnectDeepSoundDevice': 'Conecta dispositivo DeepSound', + 'pleaseConnectDeepSoundDevice': 'Conecta dispositivo Voitrans', 'verificationFailedRetry': 'Verificación fallida, inténtalo de nuevo', 'invalidDeviceAddress': 'Dirección de dispositivo inválida', 'bleDeviceAssociationFailed': 'Fallo en la asociación del dispositivo BLE', diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index f5f6292e4..6816cba04 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -700,7 +700,7 @@ const Map etEE = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Seadme sidumine", - "connectYourDeepSoundHeadset": "Ühenda oma DeepSound kõrvaklapid", + "connectYourDeepSoundHeadset": "Ühenda oma Voitrans kõrvaklapid", "bind": "Seo", "authorizeBind": "Autoriseeri sidumine", "enterCode": "Sisesta kood", @@ -756,7 +756,7 @@ const Map etEE = { 'retryAuthorization': 'Proovi autoriseerimist uuesti', 'pleaseGrantNecessaryPermissions': 'Anna vajalikud load', 'checkFailedRetry': 'Kontrollimine ebaõnnestus, proovi uuesti', - 'pleaseConnectDeepSoundDevice': 'Ühenda DeepSound seade', + 'pleaseConnectDeepSoundDevice': 'Ühenda Voitrans seade', 'verificationFailedRetry': 'Kontrollimine ebaõnnestus, proovi uuesti', 'invalidDeviceAddress': 'Vigane seadme aadress', 'bleDeviceAssociationFailed': 'BLE seadme seostamine ebaõnnestus', diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index 8d18e1418..92e9889cb 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -163,7 +163,7 @@ const Map faIR = { "exploreSlogan": "ایربادهای هوشمند، امکانات بی‌پایان", "exploreSlogan1": "همراه هوشمند، امکانات بی‌پایان", "exploreSlogan2": "عینک هوشمند، امکانات بی‌پایان", - "exploreAi": "کاوش ویژگی‌های هوش مصنوعی ارائه‌شده توسط DeepSound", + "exploreAi": "کاوش ویژگی‌های هوش مصنوعی ارائه‌شده توسط Voitrans", "aiFunction": "ویژگی‌های هوش مصنوعی", "allRoundAssistant": "دستیار همه‌کاره", "allRoundAssistantInfo": "به حل مشکلات مختلف کمک می‌کند", @@ -1036,7 +1036,7 @@ const Map faIR = { "readyToPair": "آماده برای جفت‌سازی", "preparingPairingEnvironment": "در حال آماده‌سازی محیط جفت‌سازی...", "connectDeepSoundViaSystemBluetooth": - "لطفاً ابتدا دستگاه DeepSound را از طریق بلوتوث سیستم متصل کنید", + "لطفاً ابتدا دستگاه Voitrans را از طریق بلوتوث سیستم متصل کنید", "deviceBindingConfirm": "تأیید اتصال دستگاه...", "establishingDeviceAssociation": "در حال برقراری ارتباط دستگاه...", "waitingCompletePairing": "لطفاً صبر کنید، در حال تکمیل جفت‌سازی...", @@ -1045,7 +1045,7 @@ const Map faIR = { // 配对错误状态文本 "ensureConnectedDeepSoundDevice": - "لطفاً اطمینان حاصل کنید که دستگاه متصل DeepSound است", + "لطفاً اطمینان حاصل کنید که دستگاه متصل Voitrans است", "deviceAlreadyBoundToOtherAccount": "این دستگاه قبلاً به حساب دیگری متصل شده است", "deviceAssociationFailed": "ارتباط دستگاه ناموفق بود، لطفاً دوباره تلاش کنید", @@ -1072,7 +1072,7 @@ const Map faIR = { 'retryAuthorization': 'تلاش مجدد برای مجوز', 'pleaseGrantNecessaryPermissions': 'لطفاً مجوزهای لازم را اعطا کنید', 'checkFailedRetry': 'بررسی ناموفق بود، لطفاً دوباره تلاش کنید', - 'pleaseConnectDeepSoundDevice': 'لطفاً دستگاه DeepSound را متصل کنید', + 'pleaseConnectDeepSoundDevice': 'لطفاً دستگاه Voitrans را متصل کنید', 'verificationFailedRetry': 'تأیید ناموفق بود، لطفاً دوباره تلاش کنید', 'invalidDeviceAddress': 'آدرس دستگاه نامعتبر است', 'bleDeviceAssociationFailed': 'ارتباط دستگاه BLE ناموفق بود', diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index fccc27ee6..da47b92ad 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -698,7 +698,7 @@ const Map fiFI = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Laitteen paritus", - "connectYourDeepSoundHeadset": "Yhdistä DeepSound-kuulokkeesi", + "connectYourDeepSoundHeadset": "Yhdistä Voitrans-kuulokkeesi", "bind": "Sido", "authorizeBind": "Valtuuta sidonta", "enterCode": "Anna koodi", @@ -716,7 +716,7 @@ const Map fiFI = { "readyToPair": "Valmis paritukseen", "preparingPairingEnvironment": "Valmistellaan paritusympäristöä...", "connectDeepSoundViaSystemBluetooth": - "Yhdistä ensin DeepSound-laitteeseen järjestelmän Bluetoothin kautta", + "Yhdistä ensin Voitrans-laitteeseen järjestelmän Bluetoothin kautta", "deviceBindingConfirm": "Laitteen sidonnan vahvistus...", "establishingDeviceAssociation": "Luodaan laiteyhteyttä...", "waitingCompletePairing": "Odota, paritus on valmis...", @@ -751,7 +751,7 @@ const Map fiFI = { 'retryAuthorization': 'Yritä valtuutusta uudelleen', 'pleaseGrantNecessaryPermissions': 'Myönnä tarvittavat käyttöoikeudet', 'checkFailedRetry': 'Tarkistus epäonnistui, yritä uudelleen', - 'pleaseConnectDeepSoundDevice': 'Yhdistä DeepSound-laite', + 'pleaseConnectDeepSoundDevice': 'Yhdistä Voitrans-laite', 'verificationFailedRetry': 'Vahvistus epäonnistui, yritä uudelleen', 'invalidDeviceAddress': 'Virheellinen laiteosoite', 'bleDeviceAssociationFailed': 'BLE-laiteyhteyden luominen epäonnistui', diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index a275d5ad5..3ebb0fa62 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -724,7 +724,7 @@ const Map frFR = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Appairage d'appareil", - "connectYourDeepSoundHeadset": "Connectez votre casque DeepSound", + "connectYourDeepSoundHeadset": "Connectez votre casque Voitrans", "bind": "Lier", "authorizeBind": "Autoriser la liaison", "enterCode": "Veuillez saisir le code", @@ -743,7 +743,7 @@ const Map frFR = { "preparingPairingEnvironment": "Préparation de l'environnement d'appairage...", "connectDeepSoundViaSystemBluetooth": - "Veuillez d'abord connecter l'appareil DeepSound via le Bluetooth système", + "Veuillez d'abord connecter l'appareil Voitrans via le Bluetooth système", "deviceBindingConfirm": "Confirmation de liaison d'appareil...", "establishingDeviceAssociation": "Établissement de l'association d'appareil...", @@ -753,7 +753,7 @@ const Map frFR = { // 配对错误状态文本 "ensureConnectedDeepSoundDevice": - "Veuillez vous assurer que l'appareil connecté est DeepSound", + "Veuillez vous assurer que l'appareil connecté est Voitrans", "deviceAlreadyBoundToOtherAccount": "Cet appareil est déjà lié à un autre compte", "deviceAssociationFailed": @@ -788,7 +788,7 @@ const Map frFR = { 'pleaseGrantNecessaryPermissions': 'Veuillez accorder les autorisations nécessaires', 'checkFailedRetry': 'Échec de la vérification, veuillez réessayer', - 'pleaseConnectDeepSoundDevice': 'Veuillez connecter l\'appareil DeepSound', + 'pleaseConnectDeepSoundDevice': 'Veuillez connecter l\'appareil Voitrans', 'verificationFailedRetry': 'Échec de la vérification, veuillez réessayer', 'invalidDeviceAddress': 'Adresse d\'appareil invalide', 'bleDeviceAssociationFailed': 'Échec de l\'association d\'appareil BLE', diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 54fc1f25d..348a8f121 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -699,7 +699,7 @@ const Map hiIN = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "डिवाइस पेयरिंग", - "connectYourDeepSoundHeadset": "अपना DeepSound हेडसेट कनेक्ट करें", + "connectYourDeepSoundHeadset": "अपना Voitrans हेडसेट कनेक्ट करें", "bind": "बाँधें", "authorizeBind": "बाँधने को अधिकृत करें", "enterCode": "कृपया कोड दर्ज करें", @@ -754,7 +754,7 @@ const Map hiIN = { 'retryAuthorization': 'प्राधिकरण पुनः प्रयास करें', 'pleaseGrantNecessaryPermissions': 'कृपया आवश्यक अनुमतियाँ दें', 'checkFailedRetry': 'जाँच विफल, कृपया पुनः प्रयास करें', - 'pleaseConnectDeepSoundDevice': 'कृपया एक DeepSound डिवाइस कनेक्ट करें', + 'pleaseConnectDeepSoundDevice': 'कृपया एक Voitrans डिवाइस कनेक्ट करें', 'verificationFailedRetry': 'सत्यापन विफल, कृपया पुनः प्रयास करें', 'invalidDeviceAddress': 'अमान्य डिवाइस पता', 'bleDeviceAssociationFailed': 'BLE डिवाइस एसोसिएशन विफल', diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index 3a624371c..b1103c34f 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -703,7 +703,7 @@ const Map hrHR = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Uparivanje uređaja", - "connectYourDeepSoundHeadset": "Povežite svoje DeepSound slušalice", + "connectYourDeepSoundHeadset": "Povežite svoje Voitrans slušalice", "bind": "Poveži", "authorizeBind": "Autoriziraj povezivanje", "enterCode": "Unesite kod", diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index 4fea848d0..7a47009ff 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -702,7 +702,7 @@ const Map huHU = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Eszköz párosítása", - "connectYourDeepSoundHeadset": "Csatlakoztassa a DeepSound fülhallgatóját", + "connectYourDeepSoundHeadset": "Csatlakoztassa a Voitrans fülhallgatóját", "bind": "Párosítás", "authorizeBind": "Párosítás engedélyezése", "enterCode": "Kérjük, adja meg a kódot", @@ -758,7 +758,7 @@ const Map huHU = { 'Kérjük, adja meg a szükséges engedélyeket', 'checkFailedRetry': 'Az ellenőrzés sikertelen, próbálja újra', 'pleaseConnectDeepSoundDevice': - 'Kérjük, csatlakoztasson egy DeepSound eszközt', + 'Kérjük, csatlakoztasson egy Voitrans eszközt', 'verificationFailedRetry': 'Az ellenőrzés sikertelen, próbálja újra', 'invalidDeviceAddress': 'Érvénytelen eszközcím', 'bleDeviceAssociationFailed': 'A BLE eszköztársítás sikertelen', diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 5b7c467bb..7520cd66c 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -698,7 +698,7 @@ const Map idID = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Pemasangan Perangkat", - "connectYourDeepSoundHeadset": "Hubungkan Headset DeepSound Anda", + "connectYourDeepSoundHeadset": "Hubungkan Headset Voitrans Anda", "bind": "Ikat", "authorizeBind": "Otorisasi Pengikatan", "enterCode": "Silakan masukkan kode", @@ -752,7 +752,7 @@ const Map idID = { 'retryAuthorization': 'Coba Ulang Otorisasi', 'pleaseGrantNecessaryPermissions': 'Harap berikan izin yang diperlukan', 'checkFailedRetry': 'Pemeriksaan gagal, silakan coba lagi', - 'pleaseConnectDeepSoundDevice': 'Harap hubungkan perangkat DeepSound', + 'pleaseConnectDeepSoundDevice': 'Harap hubungkan perangkat Voitrans', 'verificationFailedRetry': 'Verifikasi gagal, silakan coba lagi', 'invalidDeviceAddress': 'Alamat perangkat tidak valid', 'bleDeviceAssociationFailed': 'Asosiasi perangkat BLE gagal', diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index 526087754..7976276d5 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -699,7 +699,7 @@ const Map isIS = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Pörun tækis", - "connectYourDeepSoundHeadset": "Tengdu DeepSound heyrnartólin þín", + "connectYourDeepSoundHeadset": "Tengdu Voitrans heyrnartólin þín", "bind": "Binda", "authorizeBind": "Heimila bindingu", "enterCode": "Vinsamlegast sláðu inn kóðann", diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index ff961642c..ea56b3896 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -718,7 +718,7 @@ const Map itIT = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Associazione dispositivo", - "connectYourDeepSoundHeadset": "Connetti le tue cuffie DeepSound", + "connectYourDeepSoundHeadset": "Connetti le tue cuffie Voitrans", "bind": "Associa", "authorizeBind": "Autorizza associazione", "enterCode": "Inserisci il codice", @@ -775,7 +775,7 @@ const Map itIT = { 'retryAuthorization': 'Riprova autorizzazione', 'pleaseGrantNecessaryPermissions': 'Concedi le autorizzazioni necessarie', 'checkFailedRetry': 'Controllo fallito, riprova', - 'pleaseConnectDeepSoundDevice': 'Connetti un dispositivo DeepSound', + 'pleaseConnectDeepSoundDevice': 'Connetti un dispositivo Voitrans', 'verificationFailedRetry': 'Verifica fallita, riprova', 'invalidDeviceAddress': 'Indirizzo del dispositivo non valido', 'bleDeviceAssociationFailed': 'Associazione del dispositivo BLE fallita', diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 8f94486fb..5e16c8981 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -649,7 +649,7 @@ const Map koKR = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "기기 페어링", - "connectYourDeepSoundHeadset": "DeepSound 헤드셋 연결", + "connectYourDeepSoundHeadset": "Voitrans 헤드셋 연결", "bind": "연결", "authorizeBind": "연결 승인", "enterCode": "코드를 입력하세요", @@ -696,7 +696,7 @@ const Map koKR = { 'retryAuthorization': '인증 재시도', 'pleaseGrantNecessaryPermissions': '필요한 권한을 부여해주세요', 'checkFailedRetry': '확인 실패, 다시 시도하세요', - 'pleaseConnectDeepSoundDevice': 'DeepSound 기기를 연결해주세요', + 'pleaseConnectDeepSoundDevice': 'Voitrans 기기를 연결해주세요', 'verificationFailedRetry': '인증 실패, 다시 시도하세요', 'invalidDeviceAddress': '잘못된 기기 주소', 'bleDeviceAssociationFailed': 'BLE 기기 연결 실패', diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 71279bdf8..5588dcb62 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -704,7 +704,7 @@ const Map ltLT = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Įrenginio susiejimas", - "connectYourDeepSoundHeadset": "Prijunkite savo DeepSound ausines", + "connectYourDeepSoundHeadset": "Prijunkite savo Voitrans ausines", "bind": "Susieti", "authorizeBind": "Leisti susiejimą", "enterCode": "Įveskite kodą", @@ -760,7 +760,7 @@ const Map ltLT = { 'retryAuthorization': 'Bandyti autorizaciją dar kartą', 'pleaseGrantNecessaryPermissions': 'Suteikite reikiamus leidimus', 'checkFailedRetry': 'Patikrinimas nepavyko, bandykite dar kartą', - 'pleaseConnectDeepSoundDevice': 'Prijunkite DeepSound įrenginį', + 'pleaseConnectDeepSoundDevice': 'Prijunkite Voitrans įrenginį', 'verificationFailedRetry': 'Patvirtinimas nepavyko, bandykite dar kartą', 'invalidDeviceAddress': 'Neteisingas įrenginio adresas', 'bleDeviceAssociationFailed': 'BLE įrenginio asociacija nepavyko', diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 2b163954c..27aac8005 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -706,7 +706,7 @@ const Map lvLV = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Ierīces savienošana pārī", - "connectYourDeepSoundHeadset": "Savienojiet savas DeepSound austiņas", + "connectYourDeepSoundHeadset": "Savienojiet savas Voitrans austiņas", "bind": "Saistīt", "authorizeBind": "Autorizēt saistīšanu", "enterCode": "Lūdzu, ievadiet kodu", @@ -761,7 +761,7 @@ const Map lvLV = { 'retryAuthorization': 'Mēģināt autorizāciju vēlreiz', 'pleaseGrantNecessaryPermissions': 'Lūdzu, piešķiriet nepieciešamās atļaujas', 'checkFailedRetry': 'Pārbaude neizdevās, lūdzu, mēģiniet vēlreiz', - 'pleaseConnectDeepSoundDevice': 'Lūdzu, savienojiet DeepSound ierīci', + 'pleaseConnectDeepSoundDevice': 'Lūdzu, savienojiet Voitrans ierīci', 'verificationFailedRetry': 'Verifikācija neizdevās, lūdzu, mēģiniet vēlreiz', 'invalidDeviceAddress': 'Nederīga ierīces adrese', 'bleDeviceAssociationFailed': 'BLE ierīces asociācija neizdevās', diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index 754f35df0..35e225415 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -699,7 +699,7 @@ const Map msMY = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Pemasangan Peranti", - "connectYourDeepSoundHeadset": "Sambungkan Fon Kepala DeepSound Anda", + "connectYourDeepSoundHeadset": "Sambungkan Fon Kepala Voitrans Anda", "bind": "Ikat", "authorizeBind": "Benarkan Pengikatan", "enterCode": "Sila masukkan kod", @@ -753,7 +753,7 @@ const Map msMY = { 'retryAuthorization': 'Cuba Semula Kebenaran', 'pleaseGrantNecessaryPermissions': 'Sila berikan kebenaran yang diperlukan', 'checkFailedRetry': 'Pemeriksaan gagal, sila cuba lagi', - 'pleaseConnectDeepSoundDevice': 'Sila sambungkan peranti DeepSound', + 'pleaseConnectDeepSoundDevice': 'Sila sambungkan peranti Voitrans', 'verificationFailedRetry': 'Pengesahan gagal, sila cuba lagi', 'invalidDeviceAddress': 'Alamat peranti tidak sah', 'bleDeviceAssociationFailed': 'Perkaitan peranti BLE gagal', diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index 90a12167b..02225c5b6 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -700,7 +700,7 @@ const Map nbNO = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Enhetsparing", - "connectYourDeepSoundHeadset": "Koble til ditt DeepSound-hodesett", + "connectYourDeepSoundHeadset": "Koble til ditt Voitrans-hodesett", "bind": "Bind", "authorizeBind": "Autoriser binding", "enterCode": "Vennligst skriv inn koden", @@ -754,7 +754,7 @@ const Map nbNO = { 'retryAuthorization': 'Prøv autorisasjon på nytt', 'pleaseGrantNecessaryPermissions': 'Vennligst gi nødvendige tillatelser', 'checkFailedRetry': 'Kontroll mislyktes, prøv igjen', - 'pleaseConnectDeepSoundDevice': 'Vennligst koble til en DeepSound-enhet', + 'pleaseConnectDeepSoundDevice': 'Vennligst koble til en Voitrans-enhet', 'verificationFailedRetry': 'Verifisering mislyktes, prøv igjen', 'invalidDeviceAddress': 'Ugyldig enhetsadresse', 'bleDeviceAssociationFailed': 'BLE-enhetsassosiasjon mislyktes', diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index 03d1db479..043908c23 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -706,7 +706,7 @@ const Map nlNL = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Apparaat koppelen", - "connectYourDeepSoundHeadset": "Verbind uw DeepSound-headset", + "connectYourDeepSoundHeadset": "Verbind uw Voitrans-headset", "bind": "Koppelen", "authorizeBind": "Koppeling autoriseren", "enterCode": "Voer de code in", @@ -761,7 +761,7 @@ const Map nlNL = { 'retryAuthorization': 'Autorisatie opnieuw proberen', 'pleaseGrantNecessaryPermissions': 'Verleen de benodigde toestemmingen', 'checkFailedRetry': 'Controle mislukt, probeer het opnieuw', - 'pleaseConnectDeepSoundDevice': 'Verbind een DeepSound-apparaat', + 'pleaseConnectDeepSoundDevice': 'Verbind een Voitrans-apparaat', 'verificationFailedRetry': 'Verificatie mislukt, probeer het opnieuw', 'invalidDeviceAddress': 'Ongeldig apparaatadres', 'bleDeviceAssociationFailed': 'Associatie van BLE-apparaat mislukt', diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index dcee248bc..c6b2c7add 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -710,7 +710,7 @@ const Map plPL = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Parowanie urządzenia", - "connectYourDeepSoundHeadset": "Połącz swoje słuchawki DeepSound", + "connectYourDeepSoundHeadset": "Połącz swoje słuchawki Voitrans", "bind": "Powiąż", "authorizeBind": "Autoryzuj powiązanie", "enterCode": "Wprowadź kod", @@ -766,7 +766,7 @@ const Map plPL = { 'retryAuthorization': 'Spróbuj ponownie autoryzować', 'pleaseGrantNecessaryPermissions': 'Udziel niezbędnych uprawnień', 'checkFailedRetry': 'Sprawdzenie nie powiodło się, spróbuj ponownie', - 'pleaseConnectDeepSoundDevice': 'Połącz urządzenie DeepSound', + 'pleaseConnectDeepSoundDevice': 'Połącz urządzenie Voitrans', 'verificationFailedRetry': 'Weryfikacja nie powiodła się, spróbuj ponownie', 'invalidDeviceAddress': 'Nieprawidłowy adres urządzenia', 'bleDeviceAssociationFailed': 'Skojarzenie urządzenia BLE nie powiodło się', diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index dd82634d1..54d7e7724 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -712,7 +712,7 @@ const Map ptPT = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Emparelhamento de Dispositivo", - "connectYourDeepSoundHeadset": "Conecte os seus Auriculares DeepSound", + "connectYourDeepSoundHeadset": "Conecte os seus Auriculares Voitrans", "bind": "Vincular", "authorizeBind": "Autorizar Vinculação", "enterCode": "Introduza o código", @@ -769,7 +769,7 @@ const Map ptPT = { 'pleaseGrantNecessaryPermissions': 'Por favor, conceda as permissões necessárias', 'checkFailedRetry': 'Verificação falhou, tente novamente', - 'pleaseConnectDeepSoundDevice': 'Por favor, conecte um dispositivo DeepSound', + 'pleaseConnectDeepSoundDevice': 'Por favor, conecte um dispositivo Voitrans', 'verificationFailedRetry': 'Verificação falhou, tente novamente', 'invalidDeviceAddress': 'Endereço de dispositivo inválido', 'bleDeviceAssociationFailed': 'Falha na associação do dispositivo BLE', diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index e915a260b..8075a5f50 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -714,7 +714,7 @@ const Map roRO = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Asociere dispozitiv", - "connectYourDeepSoundHeadset": "Conectați-vă căștile DeepSound", + "connectYourDeepSoundHeadset": "Conectați-vă căștile Voitrans", "bind": "Leagă", "authorizeBind": "Autorizează legarea", "enterCode": "Introduceți codul", @@ -769,7 +769,7 @@ const Map roRO = { 'retryAuthorization': 'Reîncearcă autorizarea', 'pleaseGrantNecessaryPermissions': 'Acordați permisiunile necesare', 'checkFailedRetry': 'Verificare eșuată, reîncercați', - 'pleaseConnectDeepSoundDevice': 'Conectați un dispozitiv DeepSound', + 'pleaseConnectDeepSoundDevice': 'Conectați un dispozitiv Voitrans', 'verificationFailedRetry': 'Verificare eșuată, reîncercați', 'invalidDeviceAddress': 'Adresă de dispozitiv invalidă', 'bleDeviceAssociationFailed': 'Asocierea dispozitivului BLE a eșuat', diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 0252bef37..2e8bad9f0 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -762,7 +762,7 @@ const Map ruRU = { 'pleaseGrantNecessaryPermissions': 'Пожалуйста, предоставьте необходимые разрешения', 'checkFailedRetry': 'Проверка не удалась, попробуйте еще раз', - 'pleaseConnectDeepSoundDevice': 'Пожалуйста, подключите устройство DeepSound', + 'pleaseConnectDeepSoundDevice': 'Пожалуйста, подключите устройство Voitrans', 'verificationFailedRetry': 'Проверка не удалась, попробуйте еще раз', 'invalidDeviceAddress': 'Неверный адрес устройства', 'bleDeviceAssociationFailed': 'Не удалось связать устройство BLE', diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index 9f2a70a93..32d14d1fe 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -700,7 +700,7 @@ const Map skSK = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Párovanie zariadenia", - "connectYourDeepSoundHeadset": "Pripojte svoje slúchadlá DeepSound", + "connectYourDeepSoundHeadset": "Pripojte svoje slúchadlá Voitrans", "bind": "Prepojiť", "authorizeBind": "Autorizovať prepojenie", "enterCode": "Zadajte kód", @@ -755,7 +755,7 @@ const Map skSK = { 'retryAuthorization': 'Znova autorizovať', 'pleaseGrantNecessaryPermissions': 'Udeľte potrebné povolenia', 'checkFailedRetry': 'Kontrola zlyhala, skúste to znova', - 'pleaseConnectDeepSoundDevice': 'Pripojte zariadenie DeepSound', + 'pleaseConnectDeepSoundDevice': 'Pripojte zariadenie Voitrans', 'verificationFailedRetry': 'Overenie zlyhalo, skúste to znova', 'invalidDeviceAddress': 'Neplatná adresa zariadenia', 'bleDeviceAssociationFailed': 'Priradenie zariadenia BLE zlyhalo', diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index 14568699b..2c9eec354 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -705,7 +705,7 @@ const Map slSI = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Seznanjanje naprave", - "connectYourDeepSoundHeadset": "Povežite svoje slušalke DeepSound", + "connectYourDeepSoundHeadset": "Povežite svoje slušalke Voitrans", "bind": "Poveži", "authorizeBind": "Avtoriziraj povezavo", "enterCode": "Vnesite kodo", @@ -760,7 +760,7 @@ const Map slSI = { 'retryAuthorization': 'Ponovno avtoriziraj', 'pleaseGrantNecessaryPermissions': 'Podelite potrebna dovoljenja', 'checkFailedRetry': 'Preverjanje ni uspelo, poskusite znova', - 'pleaseConnectDeepSoundDevice': 'Povežite napravo DeepSound', + 'pleaseConnectDeepSoundDevice': 'Povežite napravo Voitrans', 'verificationFailedRetry': 'Preverjanje ni uspelo, poskusite znova', 'invalidDeviceAddress': 'Neveljaven naslov naprave', 'bleDeviceAssociationFailed': 'Povezovanje naprave BLE ni uspelo', diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index 319fd3a8b..1ab654c58 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -700,7 +700,7 @@ const Map srRS = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Uparivanje uređaja", - "connectYourDeepSoundHeadset": "Povežite svoje DeepSound slušalice", + "connectYourDeepSoundHeadset": "Povežite svoje Voitrans slušalice", "bind": "Poveži", "authorizeBind": "Autorizuj povezivanje", "enterCode": "Unesite kod", @@ -755,7 +755,7 @@ const Map srRS = { 'retryAuthorization': 'Pokušaj ponovo autorizaciju', 'pleaseGrantNecessaryPermissions': 'Dajte potrebne dozvole', 'checkFailedRetry': 'Neuspešna provera, pokušajte ponovo', - 'pleaseConnectDeepSoundDevice': 'Povežite DeepSound uređaj', + 'pleaseConnectDeepSoundDevice': 'Povežite Voitrans uređaj', 'verificationFailedRetry': 'Neuspešna verifikacija, pokušajte ponovo', 'invalidDeviceAddress': 'Nevažeća adresa uređaja', 'bleDeviceAssociationFailed': 'Neuspešno povezivanje BLE uređaja', diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index 4c4edfccc..0ee05fc05 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -700,7 +700,7 @@ const Map svSE = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Enhetsparkoppling", - "connectYourDeepSoundHeadset": "Anslut dina DeepSound-hörlurar", + "connectYourDeepSoundHeadset": "Anslut dina Voitrans-hörlurar", "bind": "Bind", "authorizeBind": "Auktorisera bindning", "enterCode": "Ange koden", @@ -754,7 +754,7 @@ const Map svSE = { 'retryAuthorization': 'Försök auktorisera igen', 'pleaseGrantNecessaryPermissions': 'Bevilja nödvändiga behörigheter', 'checkFailedRetry': 'Kontroll misslyckades, försök igen', - 'pleaseConnectDeepSoundDevice': 'Anslut en DeepSound-enhet', + 'pleaseConnectDeepSoundDevice': 'Anslut en Voitrans-enhet', 'verificationFailedRetry': 'Verifiering misslyckades, försök igen', 'invalidDeviceAddress': 'Ogiltig enhetsadress', 'bleDeviceAssociationFailed': 'BLE-enhetsassociation misslyckades', diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index e61585f98..0f5b3d2bb 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -685,7 +685,7 @@ const Map thTH = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "การจับคู่อุปกรณ์", - "connectYourDeepSoundHeadset": "เชื่อมต่อหูฟัง DeepSound ของคุณ", + "connectYourDeepSoundHeadset": "เชื่อมต่อหูฟัง Voitrans ของคุณ", "bind": "ผูก", "authorizeBind": "อนุญาตการผูก", "enterCode": "กรุณาใส่รหัส", diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index 939a7965b..507867777 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -713,7 +713,7 @@ const Map tlPH = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Pag-pair ng Device", - "connectYourDeepSoundHeadset": "Ikonekta ang iyong DeepSound Headset", + "connectYourDeepSoundHeadset": "Ikonekta ang iyong Voitrans Headset", "bind": "I-bind", "authorizeBind": "Pahintulutan ang pag-bind", "enterCode": "Pakilagay ang code", diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index 2fa276797..1edb17ea9 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -750,7 +750,7 @@ const Map trTR = { 'retryAuthorization': 'Yetkilendirmeyi Yeniden Dene', 'pleaseGrantNecessaryPermissions': 'Lütfen gerekli izinleri verin', 'checkFailedRetry': 'Kontrol başarısız, lütfen tekrar deneyin', - 'pleaseConnectDeepSoundDevice': 'Lütfen bir DeepSound cihazı bağlayın', + 'pleaseConnectDeepSoundDevice': 'Lütfen bir Voitrans cihazı bağlayın', 'verificationFailedRetry': 'Doğrulama başarısız, lütfen tekrar deneyin', 'invalidDeviceAddress': 'Geçersiz cihaz adresi', 'bleDeviceAssociationFailed': 'BLE cihaz ilişkisi kurulamadı', diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index e6cf787ab..3c5336eef 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -693,7 +693,7 @@ const Map viVN = { // 配对模块 // 配对页面 (pairing_view.dart & pairing_view_new.dart) "devicePairing": "Ghép nối thiết bị", - "connectYourDeepSoundHeadset": "Kết nối tai nghe DeepSound của bạn", + "connectYourDeepSoundHeadset": "Kết nối tai nghe Voitrans của bạn", "bind": "Liên kết", "authorizeBind": "Ủy quyền liên kết", "enterCode": "Vui lòng nhập mã", From 182406dfa071611f5b4f672a7f9a7ca4f1d27b54 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Fri, 28 Nov 2025 17:52:59 +0800 Subject: [PATCH 099/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0vip=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/ble_manager.dart | 2 +- .../com/yunqiinnovation/agent_service/AgentService.kt | 2 +- .../yunqiinnovation/agent_service/AgentServicePlugin.kt | 8 ++++++-- .../com/yunqiinnovation/agent_service/BleMediaService.kt | 9 ++++----- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 9bd8325cb..5b020bf63 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -785,7 +785,7 @@ class BleManager extends GetxService { final isTtsInterruptEnabled = await _loadTtsInterrupe(); final vipExpiryTime = userInfo.User.instance.vipexptime; - Logger.info('会员过期时间: $vipExpiryTime'); + Logger.info('liwei------ vipexptime 1: $vipExpiryTime'); // 根据APP语言动态配置语音识别语言 List supportedLanguages = []; diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 748af9c37..84211c203 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -208,7 +208,7 @@ object AgentService : CoroutineScope { callingToolText = config["callingToolText"]?.toString() ?: ""; insufficientIntegralText = config["insufficientIntegralText"]?.toString() ?: ""; vipExptime = config["vipexptime"]?.toString()?.toIntOrNull() ?: 0; - Log.d(TAG, "Vip 过期时间 ${vipExptime}") + Log.d(TAG, "iwei------ vipexptime ${vipExptime}") // 初始化上下文和服务 this.context = appContext.applicationContext diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index c09205d16..c886f8958 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -80,8 +80,12 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream config["isttsinterrupt"]?.toString()?.let { intent.putExtra("isttsinterrupt", it) } config["callingToolText"]?.toString()?.let { intent.putExtra("callingToolText", it) } config["insufficientIntegralText"]?.toString()?.let { intent.putExtra("insufficientIntegralText", it) } - config["vipexptime"]?.toString()?.let { intent.putExtra("vipexptime", it) } - + config["vipexptime"]?.toString()?.let { + intent.putExtra("vipexptime", it) + //打印日志 + Log.d(TAG, "liwei------ vipexptime 2 $it") + } + // 添加 supportedLanguages 参数处理 config["supportedLanguages"]?.let { languages -> diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index a55ea8d1b..090523e08 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -504,7 +504,6 @@ private var companionManager: BleCompanionManager? = null } return START_STICKY } - return START_STICKY } @@ -582,9 +581,9 @@ private var companionManager: BleCompanionManager? = null it.getStringExtra(APP_NAVIGATION_MODE)?.let { value -> config[APP_NAVIGATION_MODE] = value } it.getStringExtra(APP_CALLING_TOOL_TEXT)?.let { value -> config[APP_CALLING_TOOL_TEXT] = value } it.getStringExtra(APP_INSUFFICIENT_INTEGRAL_TEXT)?.let { value -> config[APP_INSUFFICIENT_INTEGRAL_TEXT] = value } - it.getIntExtra(KEY_VIP_EXPTIME, config[KEY_VIP_EXPTIME] as? Int ?: 0) + it.getStringExtra(KEY_VIP_EXPTIME)?.let { value -> config[KEY_VIP_EXPTIME] = value } it.getStringExtra("isttsinterrupt")?.let { value -> config["isttsinterrupt"] = value } - + Log.d(TAG, "liwei-------vipexptime 3-1 ${ config[KEY_VIP_EXPTIME]}") // 提取 supportedLanguages 参数 it.getStringArrayListExtra(KEY_SUPPORTED_LANGUAGES)?.let { languages -> if (languages.isNotEmpty()) { @@ -647,8 +646,8 @@ private var companionManager: BleCompanionManager? = null config[APP_NAVIGATION_MODE] = getConfigString(prefs, APP_NAVIGATION_MODE, "") config[APP_CALLING_TOOL_TEXT] = getConfigString(prefs, APP_CALLING_TOOL_TEXT, "") config[APP_INSUFFICIENT_INTEGRAL_TEXT] = getConfigString(prefs, APP_INSUFFICIENT_INTEGRAL_TEXT, "") - config[KEY_VIP_EXPTIME] = getConfigInt(prefs, KEY_VIP_EXPTIME, 0) - + config[KEY_VIP_EXPTIME] = getConfigString(prefs, KEY_VIP_EXPTIME, "") + Log.d(TAG, "liwei-------vipexptime 3-0 ${ config[KEY_VIP_EXPTIME]}") // 添加 supportedLanguages 参数处理 val supportedLanguagesStr = getConfigString(prefs, KEY_SUPPORTED_LANGUAGES, "") if (supportedLanguagesStr.isNotEmpty()) { From 23e8f7adb84e7a91d885ea6a3f7b67b8b708c05c Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Fri, 28 Nov 2025 19:12:40 +0800 Subject: [PATCH 100/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9B=B4=E6=96=B0ai?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunqiinnovation/agent_service/AgentService.kt | 13 +++++++++++++ .../agent_service/AgentServicePlugin.kt | 2 +- .../agent_service/BleMediaService.kt | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 84211c203..e3dd57cee 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -290,6 +290,19 @@ object AgentService : CoroutineScope { } } + fun applyConfigUpdate(config: Map) { + try { + serverurl = config["serverurl"]?.toString() ?: serverurl + usertoken = config["usertoken"]?.toString() ?: usertoken + callingToolText = config["callingToolText"]?.toString() ?: callingToolText + insufficientIntegralText = config["insufficientIntegralText"]?.toString() ?: insufficientIntegralText + vipExptime = config["vipexptime"]?.toString()?.toIntOrNull() ?: 0; + navigationMode = config["navigationMode"]?.toString() ?: navigationMode + } catch (e: Exception) { + Log.e(TAG, "应用配置更新失败: ${e.message}") + } + } + /** * 释放所有资源 */ diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index c886f8958..3a70cd868 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -99,7 +99,7 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream } } } - + intent.action = "AppStart" // 启动前台服务 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index 090523e08..6c992fdd3 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -493,6 +493,14 @@ private var companionManager: BleCompanionManager? = null // 初始化语音代理 if (!isChatAgentInitialized) { initializeChatAgent() + }else if (intent?.action == "AppStart"){ + val prefs = applicationContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) + val incoming = extractConfigFromIntent(intent) + if (incoming.isNotEmpty()) { + saveConfigToPreferences(incoming, prefs) + } + val cfg = getConfigFromPreferences(prefs) + AgentService.applyConfigUpdate(cfg) } // 处理蓝牙扫描结果事件 From 768099f8d5a3db827129e9a820ebc74d89490706 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Sat, 29 Nov 2025 16:02:09 +0800 Subject: [PATCH 101/177] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dagent=E6=96=B0?= =?UTF-8?q?=E6=89=8B=E6=8C=87=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/agent/views/agent_view.dart | 26 +++++-------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index 07840261e..075ed4292 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -342,11 +342,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, - controller - .noviceGuideService - .aiStepsList[controller - .noviceGuideService - .aiStep]['endKey'] + '${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['endKey']}' .tr, onFinish: () async { if (controller @@ -638,29 +634,17 @@ class _AgentViewState extends State with WidgetsBindingObserver { overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, - controller - .noviceGuideService - .aiStepsList[controller - .noviceGuideService - .aiStep]['startKey'] + '${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['startKey']}' .tr, buttonText: 'confirmInput'.tr, onNext: () { controller.textController.text = - controller - .noviceGuideService - .aiStepsList[controller - .noviceGuideService - .aiStep]['inputKey'] + '${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['inputKey']}' .tr; }, onTap: () { controller.textController.text = - controller - .noviceGuideService - .aiStepsList[controller - .noviceGuideService - .aiStep]['inputKey'] + '${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['inputKey']}' .tr; params.onNext!(); }, @@ -885,7 +869,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, - '${'guideClickSendPrefix'.tr}${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['sendKey'].tr}', + '${'guideClickSendPrefix'.tr}${'${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['sendKey']}'.tr}', alignment: false, onTap: () async { await controller From fd8ad6a06774abb0a979999dc9a4410a790dc1bf Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 29 Nov 2025 16:45:19 +0800 Subject: [PATCH 102/177] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E5=B9=B6=E4=BF=AE=E6=94=B9ai=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E8=A7=86=E5=9B=BE=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将版本号从1.0.19+62升级至1.0.20+67 将ai对话视图中的图标从smart_toy_outlined替换为support_agent以提升视觉一致性 --- lib/modules/agent/views/agent_view.dart | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index 075ed4292..de44eccd2 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -92,7 +92,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { ], ), child: Icon( - Icons.smart_toy_outlined, + Icons.support_agent, color: Colors.white, size: 22.sp, ), diff --git a/pubspec.yaml b/pubspec.yaml index bd4d5021f..6a6fe9300 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: voitrans description: "Voitrans - AI Voice Assistant." publish_to: "none" -version: 1.0.19+62 +version: 1.0.20+67 environment: sdk: ">=3.3.0 <4.0.0" From 31638672c5b1b6321aaaee75c1d2d35844189392 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 1 Dec 2025 19:31:06 +0800 Subject: [PATCH 103/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/ble_manager.dart | 6 ++---- lib/data/services/network/dio_manager.dart | 6 +++--- lib/modules/goods/controllers/goods_base_controller.dart | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 5b020bf63..1a1daabd1 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -15,6 +15,7 @@ import '../../data/models/appconfig.dart'; import '../../core/utils/logger.dart'; import 'bluetooth_manager.dart'; import 'language_manager.dart'; +import 'network/dio_manager.dart'; // 重新导出BLE连接状态常量,让外部可以通过BleManager访问 export 'package:ble_service/ble_service.dart' show BleConnectionState; @@ -753,10 +754,7 @@ class BleManager extends GetxService { Future startAgentService() async { try { // 从.env文件直接读取环境变量 - var serverurl = dotenv.env['SERVER_URL'] ?? ''; - if (Get.locale?.countryCode != 'CN') { - serverurl = dotenv.env['HW_SERVER_URL'] ?? ''; - } + var serverurl = DioManager().baseUrl; var jsonString = _storage.read("logintoken"); diff --git a/lib/data/services/network/dio_manager.dart b/lib/data/services/network/dio_manager.dart index e0141cc36..43de8d723 100644 --- a/lib/data/services/network/dio_manager.dart +++ b/lib/data/services/network/dio_manager.dart @@ -14,9 +14,9 @@ class DioManager { String get baseUrl { final countryCode = Get.deviceLocale?.countryCode?.toUpperCase(); final isChinaMainland = countryCode == 'CN'; - - if (!isChinaMainland) { - return dotenv.env['HW_SERVER_URL'] ?? dotenv.env['SERVER_URL'] ?? ''; + final channel = dotenv.env['Channel'] ?? 'OFFICIAL'; + if (!isChinaMainland || channel == "GLOBAL_GOOGLE") { + return dotenv.env['HW_SERVER_URL'] ?? ''; } else { return dotenv.env['SERVER_URL'] ?? ''; } diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index 5bcdb6d17..e36dfadbe 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -437,7 +437,7 @@ abstract class GoodsBaseController extends GetxController { Future payWechat(DBGoods item, {PaymentResultCallback? onResult}) async { final cents = item.price; // DBGoods.price 单位:分 - final serverUrl = dotenv.env['SERVER_URL'] ?? DioManager().baseUrl; + final serverUrl = DioManager().baseUrl; final paymentData = await _payService.createWechatPayOrder( productId: item.id, productName: item.name, From 0c5e2e33d66f84d5f7871905362f710a19da1609 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 1 Dec 2025 19:31:36 +0800 Subject: [PATCH 104/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/version_update_service.dart | 8 ++++---- lib/modules/login/controllers/login_controller.dart | 7 ++++--- .../meeting/views/bottomSheet/share_bottom_sheet.dart | 3 ++- lib/modules/settings/controllers/settings_controller.dart | 3 ++- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/data/services/version_update_service.dart b/lib/data/services/version_update_service.dart index ac65871e8..b8bf1da1f 100644 --- a/lib/data/services/version_update_service.dart +++ b/lib/data/services/version_update_service.dart @@ -31,9 +31,9 @@ class VersionUpdateService extends GetxService { static final String? _countryCode = Get.deviceLocale?.countryCode; //国家地区编码 static final String? _languageCode = Get.deviceLocale?.languageCode; //语言编码 // ignore: non_constant_identifier_names - static final String? _SERVER_URL = (_countryCode == 'CN') - ? dotenv.env['SERVER_URL'] - : dotenv.env['HW_SERVER_URL']; //服务器地址 + // static final String? _SERVER_URL = (_countryCode == 'CN') + // ? dotenv.env['SERVER_URL'] + // : dotenv.env['HW_SERVER_URL']; //服务器地址 // 添加 getter 方法来访问缓存的静态数据 /// 获取缓存的应用版本 @@ -83,7 +83,7 @@ class VersionUpdateService extends GetxService { String get cachedLanguageCode => _languageCode ?? ''; /// 获取缓存的服务器地址 - String get cachedServerUrl => _SERVER_URL ?? ''; + // String get cachedServerUrl => _SERVER_URL ?? ''; final Logger _logger = Logger(); diff --git a/lib/modules/login/controllers/login_controller.dart b/lib/modules/login/controllers/login_controller.dart index 0773d62c4..a568f820c 100644 --- a/lib/modules/login/controllers/login_controller.dart +++ b/lib/modules/login/controllers/login_controller.dart @@ -113,9 +113,6 @@ class LoginController extends GetxController { _contactController = TextEditingController(); _verificationCodeController = TextEditingController(); - isChinaMainland.value = - Get.deviceLocale?.countryCode?.toUpperCase() == 'CN'; //是否中国大陆地区 - // 初始化默认国家代码 _initDefaultCountryCode(); @@ -125,6 +122,10 @@ class LoginController extends GetxController { _initDeviceInfo(); _initAppInfo(); // 新增:初始化APP信息 _checkGuestLoginConfig(); // 检查游客登录配置 + + isChinaMainland.value = + Get.deviceLocale?.countryCode?.toUpperCase() == 'CN' && + _userChannel != UserChannel.GLOBAL_GOOGLE; //是否中国大陆地区 } @override diff --git a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart index 1f7d48615..7d2b276ed 100644 --- a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart @@ -10,6 +10,7 @@ import 'package:get_storage/get_storage.dart'; import 'package:htmltopdfwidgets/htmltopdfwidgets.dart' as pdf; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; +import 'package:voitrans/data/services/network/dio_manager.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../../../../core/utils/synchrodata.dart'; @@ -102,7 +103,7 @@ class _ShareBottomSheetState extends State { // ); // 获取动态服务器地址 - final serverUrl = VersionUpdateService.to.cachedServerUrl; + final serverUrl = DioManager().baseUrl; final serverHost = serverUrl .replaceFirst('https://', '') .replaceFirst('http://', ''); diff --git a/lib/modules/settings/controllers/settings_controller.dart b/lib/modules/settings/controllers/settings_controller.dart index 618adae96..4eff2d73e 100644 --- a/lib/modules/settings/controllers/settings_controller.dart +++ b/lib/modules/settings/controllers/settings_controller.dart @@ -10,6 +10,7 @@ import 'package:package_info_plus/package_info_plus.dart'; import '../../../core/themes/theme_service.dart'; import '../../../core/translations/app_translations.dart'; +import '../../../data/services/network/dio_manager.dart'; import '../../../data/services/speech_factory.dart'; import '../../../routes/app_routes.dart'; import '../models/language_model.dart'; @@ -651,7 +652,7 @@ class SettingsController extends GetxController { 最近版本检查时间: ${versionService.lastCheckTime ?? '未检查'} 国家地区编码: ${versionService.cachedCountryCode} 语言编码: ${versionService.cachedLanguageCode} -服务器地址: ${versionService.cachedServerUrl} +服务器地址: ${DioManager().baseUrl} '''; } catch (e) { return '获取版本服务数据失败: $e'; From f518fb21011527ec462d10b1b866674120130f5a Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 2 Dec 2025 15:16:58 +0800 Subject: [PATCH 105/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9B=B4=E6=96=B0vip?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/pay_service.dart | 11 +++++++++ .../controllers/goods_base_controller.dart | 12 ++++++++++ .../agent_service/AgentService.kt | 12 ++++++++-- .../agent_service/AgentServicePlugin.kt | 15 +++++++++++- .../agent_service/AgentServiceImpl.swift | 8 ++++++- .../agent_service/AgentServicePlugin.swift | 9 ++++++- .../agent_service/lib/agent_service.dart | 24 +++++++++++++++++++ 7 files changed, 86 insertions(+), 5 deletions(-) diff --git a/lib/data/services/pay_service.dart b/lib/data/services/pay_service.dart index 7d1f92dcd..4417446a9 100644 --- a/lib/data/services/pay_service.dart +++ b/lib/data/services/pay_service.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'package:agent_service/agent_service.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -335,6 +336,7 @@ class PayService extends GetxService { final bool ok = status == 1 || user != null; if (ok && user != null) { User.instance.updateUserInfo(user); + setVipExptime(User.instance.vipexptime); } if (!ok) { final code = (resp is Map) ? resp['code'] : null; @@ -1157,4 +1159,13 @@ class PayService extends GetxService { return null; } } + + /// 请求蓝牙权限 + void setVipExptime(int vipexptime) { + try { + AgentService.setVipExptime(vipexptime); + } catch (e) { + print('请求蓝牙权限失败: ${e.toString()}'); + } + } } diff --git a/lib/modules/goods/controllers/goods_base_controller.dart b/lib/modules/goods/controllers/goods_base_controller.dart index e36dfadbe..14a779abc 100644 --- a/lib/modules/goods/controllers/goods_base_controller.dart +++ b/lib/modules/goods/controllers/goods_base_controller.dart @@ -446,6 +446,8 @@ abstract class GoodsBaseController extends GetxController { ); if (paymentData == null) { onResult?.call(false, '创建微信订单失败'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } final orderId = @@ -481,6 +483,8 @@ abstract class GoodsBaseController extends GetxController { ); if (orderInfo == null) { onResult?.call(false, '创建支付宝订单失败'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } final orderId = _payService.lastOrderId; // 创建订单时已缓存 @@ -514,6 +518,8 @@ abstract class GoodsBaseController extends GetxController { ); if (orderId == null || orderId.isEmpty) { onResult?.call(false, '创建 Apple 订单失败'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } // 使用商品id作为内购的 productId(与后台保持一致) @@ -568,6 +574,8 @@ abstract class GoodsBaseController extends GetxController { ); if (orderId == null || orderId.isEmpty) { onResult?.call(false, '创建 Google 订单失败'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } isPaying.value = true; @@ -650,6 +658,7 @@ abstract class GoodsBaseController extends GetxController { final orderStatus = order["status"]; if (orderStatus == 1) { User.instance.updateUserInfo(user); + _payService.setVipExptime(User.instance.vipexptime); success = true; break; } @@ -685,6 +694,7 @@ abstract class GoodsBaseController extends GetxController { final orderStatus = order['status']; if (orderStatus == 1 && user != null) { User.instance.updateUserInfo(user); + _payService.setVipExptime(User.instance.vipexptime); Get.snackbar('提示', '订单已确认,额度已刷新', snackPosition: SnackPosition.BOTTOM, margin: const EdgeInsets.all(12)); @@ -808,6 +818,8 @@ abstract class GoodsBaseController extends GetxController { ); if (approvalUrl == null) { onResult?.call(false, '创建 PayPal 订单失败'); + isPaying.value = false; + _cancelPayingTimeout(); return false; } final orderId = _payService.lastOrderId; // 创建订单时已缓存 diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index e3dd57cee..e931fc06c 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -296,12 +296,13 @@ object AgentService : CoroutineScope { usertoken = config["usertoken"]?.toString() ?: usertoken callingToolText = config["callingToolText"]?.toString() ?: callingToolText insufficientIntegralText = config["insufficientIntegralText"]?.toString() ?: insufficientIntegralText - vipExptime = config["vipexptime"]?.toString()?.toIntOrNull() ?: 0; + vipExptime = config["vipexptime"]?.toString()?.toIntOrNull() ?: vipExptime; navigationMode = config["navigationMode"]?.toString() ?: navigationMode } catch (e: Exception) { - Log.e(TAG, "应用配置更新失败: ${e.message}") + Log.e(TAG, "应用配置更新失败 config: $config Exception:${e.message}") } } + /** * 释放所有资源 @@ -1374,6 +1375,7 @@ object AgentService : CoroutineScope { } } + /** * 更新TTS语言设置 * @@ -1408,6 +1410,12 @@ object AgentService : CoroutineScope { } } + + fun setvipExptime(vipexptime: Int): Boolean { + vipExptime = vipexptime + return true + } + /** * 根据ASR语言代码获取对应的TTS语音角色名称 * 与LanguageManager中的映射保持一致 diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index 3a70cd868..d53768ecd 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -267,7 +267,20 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream result.error("SET_LANGUAGES_ERROR", "设置支持语言失败: ${e.message}", null) } } - + "setVipExptime" -> { + try { + val vipexptime = call.argument("vipexptime") + if (vipexptime == null) { + result.error("INVALID_ARGUMENTS", "vipexptime参数不能为空", null) + return + } + val isSuccess = AgentService.setvipExptime(vipexptime) + result.success(isSuccess) + } catch (e: Exception) { + Log.e(TAG, "更新用户信息失败", e) + result.error("UPDATE_USER_INFO_ERROR", "更新用户信息失败: ${e.message}", null) + } + } "stopAiSteam" -> { try { AgentService.stopAiStream() diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index e12c85485..abefc56bc 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -1524,7 +1524,13 @@ private func jsonToString(_ json: [String: Any]) -> String? { return false } } - + /* + * 设置vip过期时间 + */ + func setVipExptime(_ vipexptime:Int) -> Bool { + self.vipexptime = vipexptime + return true + } /** * 根据ASR语言代码获取对应的TTS语音角色名称 * 与LanguageManager中的映射保持一致 diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServicePlugin.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServicePlugin.swift index 0877ab63e..cad33bcb4 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServicePlugin.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServicePlugin.swift @@ -178,7 +178,14 @@ public class AgentServicePlugin: NSObject, FlutterPlugin { let success = impl.setSupportedLanguages(languages) result(success) - + case "setVipExptime": + guard let arguments = call.arguments as? [String: Any], + let vipexptime = arguments["vipexptime"] as? Int else { + result(FlutterError(code: "INVALID_ARGUMENTS", message: "vipexptime参数不能为空", details: nil)) + return + } + let success = impl.setVipExptime(vipexptime) + result(success) default: result(FlutterMethodNotImplemented) } diff --git a/local_plugins/agent_service/lib/agent_service.dart b/local_plugins/agent_service/lib/agent_service.dart index bf54a27b7..6d1017ae9 100644 --- a/local_plugins/agent_service/lib/agent_service.dart +++ b/local_plugins/agent_service/lib/agent_service.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:ffi'; import 'package:flutter/services.dart'; @@ -489,6 +490,29 @@ class AgentService { } } + /// 更新用户信息 + /// + /// 更新用户信息,包括姓名、手机号、邮箱等 + /// [config] 配置参数,应包含以下参数: + /// - azureSpeechKey: Azure语音服务密钥 + /// - azureSpeechRegion: Azure语音服务区域 + /// - openaiApiKey: OpenAI API密钥 + /// - openaiBaseUrl: (可选) OpenAI API 基础URL + /// - openaiModel: (可选) OpenAI模型名称,默认为"gpt-3.5-turbo" + /// - mcpServer: (可选) MCP服务器地址 + /// + /// 返回是否成功启动服务 + static Future setVipExptime(int vipexptime) async { + try { + final bool result = await _channel.invokeMethod('setVipExptime', { + 'vipexptime': vipexptime, + }); + return result; + } on PlatformException catch (e) { + throw AgentServiceException(e.code, e.message ?? '更新用户信息失败', e.details); + } + } + /// 释放资源 static Future dispose() async { try { From 2f0865ea9b088d9f507c27701a0a19ab9aff49cf Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 2 Dec 2025 15:25:10 +0800 Subject: [PATCH 106/177] =?UTF-8?q?fix(pairing):=20=E5=BD=93=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=B7=B2=E7=99=BB=E5=BD=95=E4=B8=94=E6=9C=89=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E8=AE=BE=E5=A4=87=E6=97=B6=E6=98=BE=E7=A4=BA=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改条件判断逻辑,在APP_AUTHCODE_JUMP为true或用户已登录且有绑定设备时显示跳过按钮 --- lib/modules/pairing/controllers/pairing_controller.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 9ef30bec0..6df02a74c 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -139,7 +139,9 @@ class PairingController extends GetxController with WidgetsBindingObserver { final app_authcode_jump = AppConfig.env('APP_AUTHCODE_JUMP') ?? ""; //print('app_authcode_jump: $app_authcode_jump'); - if (app_authcode_jump == "true") { + // 如果APP_AUTHCODE_JUMP为true,或者用户已登录且有绑定设备,启用跳过按钮 + if (app_authcode_jump == "true" || + (User.isLoggedIn() && User.instance.devices.isNotEmpty)) { isShowSkipButton = true; // 启用跳过按钮 } } From a6b54e96ceab415e01ee0d6fe6de07dcb1bd47bf Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 2 Dec 2025 16:51:30 +0800 Subject: [PATCH 107/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/en_us.dart | 1 + lib/core/translations/language/zh_cn.dart | 3 ++- lib/modules/goods/views/goodsvip_view.dart | 13 ++++++------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index e79a63bf6..6bc80e0ea 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -716,6 +716,7 @@ const Map enUS = { "firstBindRewardDesc": "You've received binding rewards.", "vipLevelLabel": "VIP Level:", "expiryLabel": "Expiration:", + "notActivated": "Not activated", "aiChatCreditsLabel": "AI Chat Credits:", "translationCreditsLabel": "Translation Credits:", "meetingCreditsLabel": "Meeting Credits:", diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 4922d7aaf..9a5f062e2 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -698,7 +698,8 @@ const Map zhCN = { "firstBindRewardTitle": "Welcome Reward", "firstBindRewardDesc": "You've received binding rewards.", "vipLevelLabel": "VIP Level:", - "expiryLabel": "Expiration:", + "expiryLabel": "到期时间:", + "notActivated": "未激活", "aiChatCreditsLabel": "AI Chat Credits:", "translationCreditsLabel": "Translation Credits:", "meetingCreditsLabel": "Meeting Credits:", diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index 737431dba..bedbd4cbf 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -34,6 +34,7 @@ class GoodsvipView extends GetView { centerTitle: true, ), body: Obx(() { + final userTick = User.refreshTick.value; Widget content; if (controller.loading.value) { content = const Center(child: CircularProgressIndicator()); @@ -44,12 +45,7 @@ class GoodsvipView extends GetView { for (final g in controller.items) { grouped.putIfAbsent(g.usagetype, () => []).add(g); } - final order = [ - UsageType.Vip, - UsageType.Translation, - UsageType.Meet, - UsageType.AI, - ]; + final order = [UsageType.Vip, UsageType.Translation, UsageType.Meet]; final children = []; children.add(_buildFeaturesSection(isDarkMode)); children.add(SizedBox(height: 16.h)); @@ -70,6 +66,7 @@ class GoodsvipView extends GetView { children.add(_buildFooterSection(isDarkMode)); content = ListView( + key: ValueKey(userTick), padding: EdgeInsets.all(16.w), children: children, ); @@ -282,7 +279,9 @@ class GoodsvipView extends GetView { : DateTime.fromMillisecondsSinceEpoch(vipexptime * 1000); } // titleStr = 'Vip $viplv'; - vipSubtitle = expiry != null ? _fmtDate(expiry) : '未激活'; + vipSubtitle = expiry != null + ? '${'expiryLabel'.tr}${_fmtDate(expiry)}' + : 'notActivated'.tr; } return Container( padding: EdgeInsets.all(16.w), From 8d1357ce5f13311948ebec535d68e1398f9d21c6 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 2 Dec 2025 16:41:15 +0800 Subject: [PATCH 108/177] =?UTF-8?q?refactor(pairing):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E8=B7=B3=E8=BD=AC=E7=9A=84=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E5=88=A4=E6=96=AD=EF=BC=8C=E7=9B=B4=E6=8E=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 简化路由跳转逻辑,不再根据来源页面判断跳转方式,统一使用offAllNamed返回首页 --- .../pairing/controllers/pairing_controller.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 6df02a74c..f804348de 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1183,13 +1183,13 @@ class PairingController extends GetxController with WidgetsBindingObserver { Logger.e(_tag, '启动AgentService失败: $e'); } //print('lxm-上一个路由: ${Get.previousRoute.toString()}'); - if (Get.previousRoute == Routes.home) { - // 如果是从home页过来的,则直接返回 - Get.back(); - } else { - // 否则,跳转到home页并清空之前的路由栈 - Get.offAllNamed(Routes.home); - } + // if (Get.previousRoute == Routes.home) { + // 如果是从home页过来的,则直接返回 + // Get.back(); + // } else { + // 否则,跳转到home页并清空之前的路由栈 + Get.offAllNamed(Routes.home); + // } // }); } From 5481adef7cf06deac8cf0615184fef4b0cdb58df Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 3 Dec 2025 11:38:12 +0800 Subject: [PATCH 109/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../translation_middleware_controller.dart | 10 ++ .../bindings/voice_replication_binding.dart | 11 ++ .../voice_replication_controller.dart | 5 + .../views/voice_replication_view.dart | 144 ++++++++++++++++++ lib/routes/app_pages.dart | 9 ++ lib/routes/app_routes.dart | 1 + 6 files changed, 180 insertions(+) create mode 100644 lib/modules/voice_replication/bindings/voice_replication_binding.dart create mode 100644 lib/modules/voice_replication/controllers/voice_replication_controller.dart create mode 100644 lib/modules/voice_replication/views/voice_replication_view.dart diff --git a/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart b/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart index 614d8f811..ac7d4dbfa 100644 --- a/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart +++ b/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart @@ -75,6 +75,16 @@ class TranslationMiddlewareController extends GetxController { iconColor: Colors.indigo[500]!, // 主靛 targetRoute: Routes.textTranslation, ), + TranslationOption( + translationId: 'voice_replication', + title: '声音复刻', + icon: Icons.volume_up, + startColor: Colors.pink[400]!, // 粉色 + endColor: Colors.pink[600]!, // 深粉 + iconBgColor: Colors.white, // 白色 + iconColor: Colors.pink[500]!, // 主粉 + targetRoute: Routes.voiceReplication, + ), ]; /// 导航到指定的翻译功能 diff --git a/lib/modules/voice_replication/bindings/voice_replication_binding.dart b/lib/modules/voice_replication/bindings/voice_replication_binding.dart new file mode 100644 index 000000000..d52da42aa --- /dev/null +++ b/lib/modules/voice_replication/bindings/voice_replication_binding.dart @@ -0,0 +1,11 @@ +import 'package:get/get.dart'; + +import '../controllers/voice_replication_controller.dart'; + +class VoiceReplicationBinding extends Bindings { + @override + void dependencies() { + // 注册控制器 + Get.lazyPut(() => VoiceReplicationController()); + } +} diff --git a/lib/modules/voice_replication/controllers/voice_replication_controller.dart b/lib/modules/voice_replication/controllers/voice_replication_controller.dart new file mode 100644 index 000000000..7a44eec0e --- /dev/null +++ b/lib/modules/voice_replication/controllers/voice_replication_controller.dart @@ -0,0 +1,5 @@ +import 'package:get/get.dart'; + +class VoiceReplicationController extends GetxController { + RxString speakerProfileId = ''.obs; +} diff --git a/lib/modules/voice_replication/views/voice_replication_view.dart b/lib/modules/voice_replication/views/voice_replication_view.dart new file mode 100644 index 000000000..db12c694b --- /dev/null +++ b/lib/modules/voice_replication/views/voice_replication_view.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../controllers/voice_replication_controller.dart'; + +class VoiceReplicationView extends GetView { + const VoiceReplicationView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + // 构建应用栏 + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, + size: 20.sp, + ), + onPressed: () => Get.back(), + ), + title: Text( + '声音复刻', + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ); + } + + // 构建主体内容 + Widget _buildBody(bool isDarkMode) { + return ListView( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 15.w), + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + margin: EdgeInsets.only(bottom: 15.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[800] : Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + children: [ + Container( + width: 60.w, + height: 60.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.w), + border: Border.all( + color: Colors.grey, + ), + ), + child: Icon( + Icons.voice_chat, + size: 40.w, + ), + ), + Padding( + padding: EdgeInsets.only(top: 20.w, bottom: 10.w), + child: Text( + '复刻你的声音', + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + fontSize: 18.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + Text( + '使用声音复刻可为你生成专属音色档案,在配音、播报与对话中保留你的声音特征,适用于视频解说、虚拟助理、无障碍朗读等场景。', + textAlign: TextAlign.center, + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + fontSize: 14.sp, + ), + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 2.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[800] : Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withValues(alpha: 0.2) + : Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '开启声音复刻', + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + fontSize: 16.sp, + ), + ), + Obx( + () => Switch( + value: controller.speakerProfileId.value.isNotEmpty, + onChanged: (bool value) { + controller.speakerProfileId.value = value ? '0' : ''; + }, + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index a45b799f9..81f7dd385 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -2,6 +2,8 @@ import 'package:get/get.dart'; import '../modules/qqmusic/bindings/qqmusic_playlist_binding.dart'; import '../modules/qqmusic/views/qqmusic_playlist_view.dart'; +import '../modules/voice_replication/bindings/voice_replication_binding.dart'; +import '../modules/voice_replication/views/voice_replication_view.dart'; import '/modules/ble/bindings/ble_binding.dart'; import '../modules/ble/views/ble_view.dart'; @@ -245,6 +247,13 @@ abstract class AppPages { transition: Transition.rightToLeft, transitionDuration: Duration(milliseconds: 250), ), + GetPage( + name: Routes.voiceReplication, + page: () => const VoiceReplicationView(), + binding: VoiceReplicationBinding(), + transition: Transition.rightToLeft, + transitionDuration: Duration(milliseconds: 250), + ), GetPage( name: Routes.settings, page: () => const SettingsView(), diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 64b3900bf..22253b289 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -16,6 +16,7 @@ abstract class Routes { // 设备管理 static const OTA_UPGRADE = '/ota_upgrade'; // OTA升级 static const timbre = '/timbre'; // 音色设置 + static const voiceReplication = '/voice_replication'; // 声音复刻 static const settings = '/settings'; // 系统设置 static const permissions = '/permissions'; // 权限管理 static const recording = '/recording'; // 录音功能 From 5ed99e63215f5674a100afd3dc3604fdd29a3d4e Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 3 Dec 2025 14:29:25 +0800 Subject: [PATCH 110/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voice_replication_controller.dart | 31 +++++++++++++++++++ .../views/voice_replication_view.dart | 6 ++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lib/modules/voice_replication/controllers/voice_replication_controller.dart b/lib/modules/voice_replication/controllers/voice_replication_controller.dart index 7a44eec0e..021ba01f0 100644 --- a/lib/modules/voice_replication/controllers/voice_replication_controller.dart +++ b/lib/modules/voice_replication/controllers/voice_replication_controller.dart @@ -1,5 +1,36 @@ import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:record/record.dart'; class VoiceReplicationController extends GetxController { + final GetStorage _storage = GetStorage(); + final _record = AudioRecorder(); + + RxBool isReplicating = false.obs; + RxString speakerProfileId = ''.obs; + + @override + void onInit() { + super.onInit(); + _getDefaultData(); + } + + @override + void onClose() { + _record.dispose(); + super.onClose(); + } + + void _getDefaultData() { + isReplicating.value = _storage.read('open_voice_replication') ?? false; + speakerProfileId.value = _storage.read('speakerProfileId') ?? ''; + } + + void switchChange(bool value) { + isReplicating.value = value; + if (speakerProfileId.value.isNotEmpty) { + _storage.write('open_voice_replication', value); + } + } } diff --git a/lib/modules/voice_replication/views/voice_replication_view.dart b/lib/modules/voice_replication/views/voice_replication_view.dart index db12c694b..f861c73be 100644 --- a/lib/modules/voice_replication/views/voice_replication_view.dart +++ b/lib/modules/voice_replication/views/voice_replication_view.dart @@ -129,10 +129,8 @@ class VoiceReplicationView extends GetView { ), Obx( () => Switch( - value: controller.speakerProfileId.value.isNotEmpty, - onChanged: (bool value) { - controller.speakerProfileId.value = value ? '0' : ''; - }, + value: controller.isReplicating.value, + onChanged: controller.switchChange, ), ), ], From 900cf03f24e4ba08e66ce56b72201aa98c8f1971 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 3 Dec 2025 16:12:16 +0800 Subject: [PATCH 111/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voice_replication_controller.dart | 8 - .../views/recorder_bottom_sheet.dart | 176 ++++++++++++++++++ .../views/voice_replication_view.dart | 93 +++++++-- 3 files changed, 253 insertions(+), 24 deletions(-) create mode 100644 lib/modules/voice_replication/views/recorder_bottom_sheet.dart diff --git a/lib/modules/voice_replication/controllers/voice_replication_controller.dart b/lib/modules/voice_replication/controllers/voice_replication_controller.dart index 021ba01f0..3f2f94c35 100644 --- a/lib/modules/voice_replication/controllers/voice_replication_controller.dart +++ b/lib/modules/voice_replication/controllers/voice_replication_controller.dart @@ -1,10 +1,8 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import 'package:record/record.dart'; class VoiceReplicationController extends GetxController { final GetStorage _storage = GetStorage(); - final _record = AudioRecorder(); RxBool isReplicating = false.obs; @@ -16,12 +14,6 @@ class VoiceReplicationController extends GetxController { _getDefaultData(); } - @override - void onClose() { - _record.dispose(); - super.onClose(); - } - void _getDefaultData() { isReplicating.value = _storage.read('open_voice_replication') ?? false; speakerProfileId.value = _storage.read('speakerProfileId') ?? ''; diff --git a/lib/modules/voice_replication/views/recorder_bottom_sheet.dart b/lib/modules/voice_replication/views/recorder_bottom_sheet.dart new file mode 100644 index 000000000..018bd8842 --- /dev/null +++ b/lib/modules/voice_replication/views/recorder_bottom_sheet.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:record/record.dart'; + +import '../controllers/voice_replication_controller.dart'; + +class RecorderBottomSheet extends StatefulWidget { + const RecorderBottomSheet({super.key}); + + @override + State createState() => _RecorderBottomSheetState(); +} + +class _RecorderBottomSheetState extends State { + final _controller = Get.find(); + + final _record = AudioRecorder(); + + bool _isRecording = false; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + _record.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '同意并朗读使用个人语音', + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), + ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], + ), + ), + ) + ], + ), + ), + Divider( + height: 1, + color: Colors.grey[300], + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + margin: EdgeInsets.symmetric(vertical: 20.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '请朗读:', + style: TextStyle( + fontSize: 14.sp, + color: Colors.black87, + ), + ), + Padding( + padding: EdgeInsets.only(top: 20.w, bottom: 50.w), + child: Text( + '我(你的姓名)确认我的声音将会被(深圳市云衍智能科技有限公司)使用于创建合成版本语音。', + style: TextStyle( + fontSize: 16.sp, + color: Colors.red, + ), + ), + ), + Text( + '例:我(李伟)确认我的声音将会被(深圳市云衍智能科技有限公司)使用于创建合成版本语音。', + style: TextStyle( + fontSize: 12.sp, + color: Colors.grey, + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(bottom: 20.w), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => Get.back(), + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + fontSize: 16.sp, + color: Colors.black, + ), + ), + ), + ), + ), + 10.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: () { + setState(() { + _isRecording = !_isRecording; + }); + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: _isRecording ? Colors.blue : Colors.red, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + _isRecording ? 'confirm'.tr : 'startRecording'.tr, // 确认 + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/modules/voice_replication/views/voice_replication_view.dart b/lib/modules/voice_replication/views/voice_replication_view.dart index f861c73be..24ec9af96 100644 --- a/lib/modules/voice_replication/views/voice_replication_view.dart +++ b/lib/modules/voice_replication/views/voice_replication_view.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../controllers/voice_replication_controller.dart'; +import 'recorder_bottom_sheet.dart'; class VoiceReplicationView extends GetView { const VoiceReplicationView({Key? key}) : super(key: key); @@ -117,26 +118,86 @@ class VoiceReplicationView extends GetView { ), ], ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '开启声音复刻', - style: TextStyle( - color: isDarkMode ? Colors.white : Colors.black87, - fontSize: 16.sp, - ), - ), - Obx( - () => Switch( - value: controller.isReplicating.value, - onChanged: controller.switchChange, + child: Obx( + () => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '开启声音复刻', + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + fontSize: 16.sp, + ), + ), + Transform.scale( + scale: 0.9, + alignment: Alignment.centerRight, + child: Switch( + value: controller.isReplicating.value, + onChanged: controller.switchChange, + ), + ), + ], ), - ), - ], + if (controller.isReplicating.value) _buildOpen(isDarkMode), + ], + ), ), ), ], ); } + + Widget _buildOpen(bool isDarkMode) { + return Container( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: controller.speakerProfileId.value.isNotEmpty + ? Text( + '个人语音ID:${controller.speakerProfileId.value}', + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.grey, + fontSize: 14.sp, + ), + ) + : GestureDetector( + onTap: () { + Get.bottomSheet( + const RecorderBottomSheet(), + isScrollControlled: true, + backgroundColor: + isDarkMode ? Colors.grey[800] : Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ); + }, + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 12.w, + vertical: 6.w, + ), + decoration: BoxDecoration( + color: Colors.blue.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(6.r), + border: Border.all( + color: Colors.blue.withValues(alpha: 0.3), + ), + ), + child: Text( + '创建个人语音', + style: TextStyle( + fontSize: 14.sp, + color: Colors.blue, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ); + } } From 6592c82409385d5af33f87668709b6ab4860aa42 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 2 Dec 2025 17:30:51 +0800 Subject: [PATCH 112/177] =?UTF-8?q?refactor(=E7=95=8C=E9=9D=A2):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84VIP=E5=95=86=E5=93=81=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 简化VIP商品页面的使用类型排序,仅保留VIP类型 - 将设置页面的会员入口重构为分类导航栏样式 - 优化分类项的文本布局和样式 --- lib/modules/goods/views/goodsvip_view.dart | 2 +- lib/modules/settings/views/settings_view.dart | 115 ++++++++---------- 2 files changed, 54 insertions(+), 63 deletions(-) diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index bedbd4cbf..3efa834d5 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -45,7 +45,7 @@ class GoodsvipView extends GetView { for (final g in controller.items) { grouped.putIfAbsent(g.usagetype, () => []).add(g); } - final order = [UsageType.Vip, UsageType.Translation, UsageType.Meet]; + final order = [UsageType.Vip]; final children = []; children.add(_buildFeaturesSection(isDarkMode)); children.add(SizedBox(height: 16.h)); diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index bf5a7f72d..7691cba0a 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -243,59 +243,46 @@ class SettingsView extends GetView { ), ], ), - child: InkWell( - onTap: () => Get.toNamed(Routes.goodsvip), - borderRadius: BorderRadius.circular(16.r), - child: Row( - children: [ - Container( - width: 42.w, - height: 42.w, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.amber[900]!.withOpacity(0.3) - : Colors.amber[100]!, - borderRadius: BorderRadius.circular(21.r), - ), - child: Icon( - Icons.workspace_premium, - size: 20.w, - color: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, - ), - ), - SizedBox(width: 12.w), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'premiumMember'.tr, - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: Colors.white, - ), - ), - SizedBox(height: 4.h), - Text( - '${'higherQuota'.tr} · ${'fastResponse'.tr}', - style: TextStyle( - fontSize: 12.sp, - color: Colors.white70, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ), - ), - Icon( - Icons.arrow_forward_ios, - size: 16.w, - color: Colors.white70, - ), - ], - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildCategoryItem( + icon: Icons.workspace_premium, + label: 'premiumMember'.tr, + iconBg: isDarkMode + ? Colors.amber[900]!.withOpacity(0.3) + : Colors.amber[100]!, + iconColor: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, + onTap: () => Get.toNamed(Routes.goodsvip), + ), + _buildCategoryItem( + icon: Icons.translate, + label: 'interpretation'.tr, + iconBg: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, + onTap: () => Get.toNamed(Routes.goodstrade), + ), + _buildCategoryItem( + icon: Icons.people, + label: 'conferenceAssistant'.tr, + iconBg: isDarkMode + ? Colors.pink[900]!.withOpacity(0.3) + : Colors.pink[100]!, + iconColor: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, + onTap: () => Get.toNamed(Routes.goodsmeet), + ), + // _buildCategoryItem( + // icon: Icons.smart_toy, + // label: 'aiFunction'.tr, + // iconBg: isDarkMode + // ? Colors.teal[900]!.withOpacity(0.3) + // : Colors.teal[100]!, + // iconColor: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, + // onTap: () => Get.toNamed(Routes.goodsai), + // ), + ], ), ); } @@ -328,16 +315,20 @@ class SettingsView extends GetView { SizedBox(height: 8.h), SizedBox( width: 72.w, - child: Text( - label, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12.sp, - fontWeight: FontWeight.w500, - color: Colors.white, + height: 32.h, + child: Center( + child: Text( + label, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.w500, + color: Colors.white, + height: 1.2, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, ), - maxLines: 2, - overflow: TextOverflow.ellipsis, ), ), ], From 3e19fd5f98724ab22b47c9fef8ab34795837b76a Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 2 Dec 2025 20:29:32 +0800 Subject: [PATCH 113/177] =?UTF-8?q?feat(=E5=85=85=E5=80=BC):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BD=99=E9=A2=9D=E4=B8=8D=E8=B6=B3=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E5=8F=8A=E5=85=85=E5=80=BC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增充值对话框组件,统一处理余额不足提示 - 在会议、翻译、代理模块添加余额检查逻辑 - 添加多语言翻译支持 - 移除代理模块中重复的弹窗代码,改用统一组件 --- lib/core/translations/language/en_us.dart | 5 ++ lib/core/translations/language/zh_cn.dart | 4 ++ lib/core/translations/language/zh_hk.dart | 4 ++ .../agent/controllers/agent_controller.dart | 60 +---------------- .../common/widgets/recharge_dialog.dart | 67 +++++++++++++++++++ .../bottomSheet/generate_bottom_sheet.dart | 6 ++ .../controllers/translation_controller.dart | 11 +++ 7 files changed, 100 insertions(+), 57 deletions(-) create mode 100644 lib/modules/common/widgets/recharge_dialog.dart diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 6bc80e0ea..0a9131262 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -1391,4 +1391,9 @@ const Map enUS = { "yesterday": "Yesterday", //补充 "insufficientIntegral": "Insufficient integral", + + //余额不足弹窗 + 'recharge': 'Go to Recharge', + 'insufficientBalanceDesc': + 'Insufficient balance, please go to the corresponding recharge page to recharge.', }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 9a5f062e2..332179f96 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -1275,4 +1275,8 @@ const Map zhCN = { 'earlyAccessNewFeatures': '新功能优先体验', 'crossDeviceSync': '跨设备同步', 'vipDisclaimer': '具体权益以实际套餐说明为准,可能随版本迭代调整。', + + //余额不足弹窗 + "insufficientBalanceDesc": "餘額不足,請前往對應充值界面進行充值", + "recharge": "前往充值", }; diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 2c7e8d561..c75856db6 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -904,4 +904,8 @@ const Map zhHK = { 'earlyAccessNewFeatures': '新功能優先體驗', 'crossDeviceSync': '跨設備同步', 'vipDisclaimer': '具體權益以實際套餐說明為準,可能隨版本迭代調整。', + + //余额不足弹窗 + "insufficientBalanceDesc": "余额不足,请前往对应充值界面进行充值", + "recharge": "去充值", }; diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 9c0ca7b42..4f70d6674 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -31,6 +31,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:photo_view/photo_view.dart'; import '../../../core/utils/permission_util.dart'; import '../../../data/models/message_model.dart'; +import '../../common/widgets/recharge_dialog.dart'; // 语音输入模式枚举 enum VoiceInputMode { @@ -804,63 +805,8 @@ class AgentController extends GetxController with WidgetsBindingObserver { Get.snackbar('error'.tr, '${event.data['message']}'); } else if (code == 2001) { // 余额不足或需要充值,给出弹窗确认是否跳转充值界面 - final msg = '${event.data['message'] ?? '余额不足,请前往充值'}'; - Get.snackbar('error'.tr, msg); - Get.dialog( - Dialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - child: Stack( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(16, 20, 16, 16), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - '提示', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 12), - Text( - '$msg\n是否前往充值界面?', - textAlign: TextAlign.center, - ), - const SizedBox(height: 20), - SizedBox( - width: double.infinity, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.orangeAccent, - foregroundColor: Colors.white, - ), - onPressed: () { - Get.back(); - Get.toNamed(Routes.goodsvip); - }, - child: const Text('去充值'), - ), - ), - ], - ), - ), - Positioned( - right: 8, - top: 8, - child: IconButton( - icon: const Icon(Icons.close), - onPressed: () => Get.back(), - ), - ), - ], - ), - ), - barrierDismissible: true, - ); + + showRechargeDialog('agent'); } Logger.e(TAG, '代理服务错误: ${event.data['message']}'); break; diff --git a/lib/modules/common/widgets/recharge_dialog.dart b/lib/modules/common/widgets/recharge_dialog.dart new file mode 100644 index 000000000..be622f53d --- /dev/null +++ b/lib/modules/common/widgets/recharge_dialog.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../routes/app_routes.dart'; + +void showRechargeDialog(String type) { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(16, 20, 16, 16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'tip'.tr, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + 'insufficientBalanceDesc'.tr, //'余额不足,请前往对应充值界面进行充值', + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.orangeAccent, + foregroundColor: Colors.white, + ), + onPressed: () { + Get.back(); + if (type == 'agent') { + Get.toNamed(Routes.goodsvip); + } else if (type == 'translation') { + Get.toNamed(Routes.goodstrade); + } else if (type == 'meeting') { + Get.toNamed(Routes.goodsmeet); + } + }, + child: Text('recharge'.tr), + ), + ), + ], + ), + ), + Positioned( + right: 8, + top: 8, + child: IconButton( + icon: const Icon(Icons.close), + onPressed: () => Get.back(), + ), + ), + ], + ), + ), + barrierDismissible: true, + ); +} diff --git a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart index e929fdfcf..e8268169d 100644 --- a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart @@ -7,6 +7,8 @@ import 'package:get_storage/get_storage.dart'; import '../../controllers/meeting_details_controller.dart'; import 'record_language_bottom_sheet.dart'; import '../template/template_view.dart'; +import '../../../../data/models/user_Info.dart'; +import '../../../common/widgets/recharge_dialog.dart'; class GenerateBottomSheet extends StatefulWidget { final bool isSummarizeAgain; @@ -300,6 +302,10 @@ class _GenerateBottomSheetState extends State { padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), child: GestureDetector( onTap: () { + if (User.isLoggedIn() && User.instance.meetintegral <= 0) { + showRechargeDialog('meeting'); + return; + } if (_templateData['id'] != _templateList[0]['id']) { int index = _templateList .indexWhere((v) => v['id'] == _templateData['id']); diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index f0c9a6c3b..1d0a4c32d 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -29,6 +29,8 @@ import 'record_timer_controller.dart'; import 'translation_history_controller.dart'; import '../models/translation_models.dart'; import '../views/dialogs/translation_mode_selector.dart'; +import '../../../data/models/user_Info.dart'; +import '../../common/widgets/recharge_dialog.dart'; /// 音频输出设备枚举 enum AudioOutputDevice { @@ -393,6 +395,11 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// [speakerId] 说话者ID Future _startFaceToFaceRecognition(int speakerId) async { try { + if (User.isLoggedIn() && User.instance.tradeintegral <= 0) { + showRechargeDialog('translation'); + activeSpeaker.value = 0; + return; + } if (_asrSessionStartTime == null) { await _initializeSession(); } @@ -842,6 +849,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// 开始语音识别 Future startRecognition() async { Logger.info('开始语音识别'); + if (User.isLoggedIn() && User.instance.tradeintegral <= 0) { + showRechargeDialog('translation'); + return; + } if (!await _checkPermissions()) return; if (isRecognizing.value) return; From dd269fec96e9e368b9006e472ad9d89f4c0d41b6 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 3 Dec 2025 20:01:27 +0800 Subject: [PATCH 114/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/recorder_bottom_sheet.dart | 128 +++++++++++++++++- 1 file changed, 125 insertions(+), 3 deletions(-) diff --git a/lib/modules/voice_replication/views/recorder_bottom_sheet.dart b/lib/modules/voice_replication/views/recorder_bottom_sheet.dart index 018bd8842..82eb7f25a 100644 --- a/lib/modules/voice_replication/views/recorder_bottom_sheet.dart +++ b/lib/modules/voice_replication/views/recorder_bottom_sheet.dart @@ -1,8 +1,19 @@ +import 'dart:io'; +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:http/http.dart' as http; +import 'package:path_provider/path_provider.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:record/record.dart'; +import 'package:uuid/uuid.dart'; +import '../../../core/utils/permission_util.dart'; +import '../../../data/models/appconfig.dart'; import '../controllers/voice_replication_controller.dart'; class RecorderBottomSheet extends StatefulWidget { @@ -15,13 +26,24 @@ class RecorderBottomSheet extends StatefulWidget { class _RecorderBottomSheetState extends State { final _controller = Get.find(); + final GetStorage _storage = GetStorage(); final _record = AudioRecorder(); bool _isRecording = false; + String _resourceKey = ''; + String _resourceRegion = ''; + String _jessicaConsentId = ''; + + String _voiceTalentName = ''; + String _jessicaPersonalVoiceId = ''; + + String _path = ''; + @override void initState() { super.initState(); + _getDefaultData(); } @override @@ -30,6 +52,103 @@ class _RecorderBottomSheetState extends State { super.dispose(); } + void _getDefaultData() async { + _resourceKey = AppConfig.env('AZURE_SPEECH_KEY') ?? ''; + _resourceRegion = AppConfig.env('AZURE_SPEECH_REGION') ?? 'eastasia'; + _jessicaConsentId = const Uuid().v4(); + Map? userInfo = _storage.read('user_info'); + if (userInfo != null) { + _voiceTalentName = userInfo['user']['name'] ?? ''; + _jessicaPersonalVoiceId = userInfo['user']['uid'] ?? ''; + } + } + + void _startRecording() async { + setState(() { + _isRecording = true; + }); + await PermissionUtil.instance.requestPermission( + permissionType: Permission.microphone, + permissionName: 'microphonePermission'.tr, + explanationText: 'microphonePermissionExplanation'.tr, + permanentDenialText: 'microphonePermissionPermanentDenial'.tr, + ); + final directory = await getApplicationDocumentsDirectory(); + final recordDir = Directory('${directory.path}/VoiceReplication'); + if (!await recordDir.exists()) { + await recordDir.create(recursive: true); + } + _path = + '${directory.path}/VoiceReplication/recording_${DateTime.now().millisecondsSinceEpoch}.wav'; + await _record.start( + const RecordConfig( + encoder: AudioEncoder.wav, + sampleRate: 24000, + numChannels: 1, + ), + path: _path, + ); + } + + void _completeRecorder() async { + EasyLoading.show(status: '正在创建个人语音...'); + try { + await _record.stop(); + await _consents(); + await _personalvoices(); + } catch (e) { + Get.snackbar('error'.tr, e.toString(), snackPosition: SnackPosition.TOP); + } + EasyLoading.dismiss(); + } + + Future _consents() async { + final url = Uri.parse( + 'https://$_resourceRegion.api.cognitive.microsoft.com/customvoice/consents/$_jessicaConsentId?api-version=2024-02-01-preview'); + final request = http.MultipartRequest('POST', url); + request.headers['Ocp-Apim-Subscription-Key'] = _resourceKey; + + request.fields['description'] = 'Consent for $_voiceTalentName voice'; + request.fields['projectId'] = 'Voitrans'; + request.fields['voiceTalentName'] = _voiceTalentName; + request.fields['companyName'] = '深圳市云衍智能科技有限公司'; + request.fields['locale'] = 'zh-CN'; + + request.files.add(await http.MultipartFile.fromPath('audiodata', _path)); + final streamed = await request.send(); + final response = await http.Response.fromStream(streamed); + if (streamed.statusCode < 200 || streamed.statusCode >= 300) { + throw Exception('Failed to create consent: ${response.statusCode}'); + } + } + + Future _personalvoices() async { + final url = Uri.parse( + 'https://$_resourceRegion.api.cognitive.microsoft.com/customvoice/personalvoices/$_jessicaPersonalVoiceId?api-version=2024-02-01-preview'); + final request = http.MultipartRequest('POST', url); + request.headers['Ocp-Apim-Subscription-Key'] = _resourceKey; + + request.fields['projectId'] = 'Voitrans'; + request.fields['consentId'] = _jessicaConsentId; + + request.files.add(await http.MultipartFile.fromPath('audiodata', _path)); + final streamed = await request.send(); + final response = await http.Response.fromStream(streamed); + if (streamed.statusCode >= 200 && streamed.statusCode < 300) { + final bodyText = utf8.decode(response.bodyBytes, allowMalformed: true); + if (bodyText.isNotEmpty) { + final decoded = jsonDecode(bodyText); + print('------2-------$decoded'); + _controller.speakerProfileId.value = decoded['speakerProfileId']; + _storage.write('open_voice_replication', true); + _storage.write('speakerProfileId', decoded['speakerProfileId']); + } + } else { + throw Exception( + 'Failed to create personal voice: ${response.statusCode}'); + } + } + @override Widget build(BuildContext context) { return Padding( @@ -145,9 +264,12 @@ class _RecorderBottomSheetState extends State { Expanded( child: GestureDetector( onTap: () { - setState(() { - _isRecording = !_isRecording; - }); + if (_isRecording) { + Get.back(); + _completeRecorder(); + } else { + _startRecording(); + } }, child: Container( height: 48.w, From 69ae1c3adcafa847b1df13bb2a341c4c001f2437 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 4 Dec 2025 11:25:36 +0800 Subject: [PATCH 115/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voice_replication/views/recorder_bottom_sheet.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/modules/voice_replication/views/recorder_bottom_sheet.dart b/lib/modules/voice_replication/views/recorder_bottom_sheet.dart index 82eb7f25a..9bbbbc8a4 100644 --- a/lib/modules/voice_replication/views/recorder_bottom_sheet.dart +++ b/lib/modules/voice_replication/views/recorder_bottom_sheet.dart @@ -115,6 +115,7 @@ class _RecorderBottomSheetState extends State { request.fields['locale'] = 'zh-CN'; request.files.add(await http.MultipartFile.fromPath('audiodata', _path)); + final streamed = await request.send(); final response = await http.Response.fromStream(streamed); if (streamed.statusCode < 200 || streamed.statusCode >= 300) { @@ -132,6 +133,9 @@ class _RecorderBottomSheetState extends State { request.fields['consentId'] = _jessicaConsentId; request.files.add(await http.MultipartFile.fromPath('audiodata', _path)); + request.files.add(await http.MultipartFile.fromPath('audiodata', + '/data/user/0/com.saitong.voitrans/app_flutter/VoiceReplication/recording_1764763812656.wav')); + final streamed = await request.send(); final response = await http.Response.fromStream(streamed); if (streamed.statusCode >= 200 && streamed.statusCode < 300) { @@ -144,6 +148,11 @@ class _RecorderBottomSheetState extends State { _storage.write('speakerProfileId', decoded['speakerProfileId']); } } else { + final bodyText = utf8.decode(response.bodyBytes, allowMalformed: true); + if (bodyText.isNotEmpty) { + final decoded = jsonDecode(bodyText); + print('------2-------$decoded'); + } throw Exception( 'Failed to create personal voice: ${response.statusCode}'); } From f0e9bf0c5d9d9027e5465b9ec54d44f1c2559e3c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 3 Dec 2025 20:21:32 +0800 Subject: [PATCH 116/177] =?UTF-8?q?refactor(translation):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=BF=BB=E8=AF=91=E6=96=87=E6=9C=AC=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=B9=B6=E7=A7=BB=E9=99=A4=E6=9C=AA=E4=BD=BF=E7=94=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将商品页描述文本移动到统一位置便于维护 - 移除声音复刻功能相关代码 - 调整导入语句顺序 - 使用翻译键替换硬编码文本 --- lib/core/translations/language/en_us.dart | 72 +++++----- lib/core/translations/language/zh_cn.dart | 135 +++++++++--------- lib/modules/agent/views/agent_view.dart | 4 +- .../views/bottomSheet/share_bottom_sheet.dart | 3 +- .../translation_middleware_controller.dart | 20 +-- 5 files changed, 119 insertions(+), 115 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 0a9131262..9f9ec4524 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -198,29 +198,29 @@ const Map enUS = { "popularFunction": "Popular Features", "tryNow": "Try Now", - // Goods screens (AI/Translation/Meeting) + // 商品页面(AI/翻译/会议) 'availablePackages': 'Available Packages', 'remainingQuota': 'Remaining Quota', 'totalCount': 'Total Count', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - // AI feature cards + // AI 功能卡片 'musicAndRecommendation': 'Music & Recommendation', 'navigationAndRoutes': 'Navigation & Routes', 'nearbySearch': 'Nearby Search', 'newsInformation': 'News', 'communicationAssistant': 'Communication Assistant', - // Translation feature cards + // 翻译功能卡片 'realtimeTranscription': 'Real-time Transcription', // 'textTranslation' exists 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', - // Meeting feature cards + // 会议功能卡片 'meetingRecording': 'Meeting Recording', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', - // Goods names by id + // 商品名称(按ID) 'ai_001_name': 'AI Basic 100', 'ai_002_name': 'AI Basic 500', 'ai_003_name': 'AI Basic 1000', @@ -231,7 +231,7 @@ const Map enUS = { 'trade_002_name': 'Translation Basic 500', 'trade_003_name': 'Translation Basic 1000', - // Goods descriptions by id + // 商品描述(按ID) 'ai_001_desc': 'Includes 100 uses. Access core AI features.', 'ai_002_desc': 'Includes 500 uses. Access core AI features.', 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', @@ -242,12 +242,12 @@ const Map enUS = { 'trade_002_desc': 'Includes 500 translations (voice/text).', 'trade_003_desc': 'Includes 1000 translations (voice/text).', - // Goods pages common footer + // 商品页通用页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', 'copyrightVoiTrans': '© 2025 VoiTrans', - // Meeting goods page descriptions + // 会议商品页描述 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', 'meetingHeaderDesc2': @@ -263,7 +263,7 @@ const Map enUS = { 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', - // Translation goods page descriptions + // 同传/翻译商品页描述 'tradeHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', @@ -279,7 +279,7 @@ const Map enUS = { 'tradeDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', - // AI goods page descriptions + // AI 商品页描述 'aiHeaderDesc1': 'Longer conversation quota, more tool calls, extended context length.', 'aiHeaderDesc2': @@ -302,7 +302,7 @@ const Map enUS = { 'aiDisclaimer': 'Features depend on device permissions, service availability, and network conditions.', - // VIP goods page + // 会员商品页 'benefitsOverview': 'Benefits overview', 'higherQuota': 'Higher usage quota', 'lowerUnitPrice': 'Lower unit price', @@ -318,7 +318,7 @@ const Map enUS = { 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', - // Onboarding / Guide + // 新手引导 / Onboarding 'skip': 'Skip', 'next': 'Next', 'sayLilyHint': 'Say "Lily Lily" to the mic', @@ -329,7 +329,7 @@ const Map enUS = { 'guideAwakenSuccess': 'Great! Lily is awake—ask it to help.', 'confirmInput': 'Confirm Input', 'guideClickSendPrefix': 'Tap send, ', - // AI steps + // AI 引导步骤 'guideWeatherStart': 'Tell Lily: “What’s the weather today?”', 'guideWeatherInput': 'What’s the weather today?', 'guideWeatherSend': 'Lily will report the weather in real time', @@ -709,19 +709,9 @@ const Map enUS = { "voice_interrupt": "Interrupt", // 语音打断 // 预设提示词 - "presetMusic": "Play some music", // Play some music - "presetNavigation": "Navigation to", // Navigation - // First bind rewards dialog - "firstBindRewardTitle": "Welcome Reward", - "firstBindRewardDesc": "You've received binding rewards.", - "vipLevelLabel": "VIP Level:", - "expiryLabel": "Expiration:", - "notActivated": "Not activated", - "aiChatCreditsLabel": "AI Chat Credits:", - "translationCreditsLabel": "Translation Credits:", - "meetingCreditsLabel": "Meeting Credits:", - "ok": "OK", - "presetWeather": "Today's weather", // Weather + "presetMusic": "Play some music", + "presetNavigation": "Navigation to", + "presetWeather": "Today's weather", "presetNews": "Today's news", // News "presetFood": "Nearby food", // Food "playSomeMusic": "Play some popular music", // 播放一些流行音乐 @@ -776,7 +766,7 @@ const Map enUS = { //Message_bubble 'generatedByAi': 'Generated by AI', - //music_card + //音乐卡片 music_card 'recommendedMusic': 'Here are some recommended music:', 'playList': 'Playlist', 'moreMusic': 'More music', @@ -791,10 +781,10 @@ const Map enUS = { 'currentLocation': 'Current Location', // 当前位置 'approximate': 'About ', // 大约 'enterRoad': ' enter ', // 进入道路 - "driving": "Driving", - "walking": "Walking", - "bicycling": "Cycling", - "tsransit": "Transit", + "driving": "Driving", // 驾驶 + "walking": "Walking", // 步行 + "bicycling": "Cycling", // 骑行 + "tsransit": "Transit", // 公交 //天气卡片 weather_card 'weatherQuery': 'Weather Query:', @@ -826,6 +816,17 @@ const Map enUS = { "friday": "Fri", "saturday": "Sat", "sunday": "Sun", + // First bind rewards dialog + "firstBindRewardTitle": "Welcome Reward", + "firstBindRewardDesc": "You've received binding rewards.", + "vipLevelLabel": "VIP Level:", + "expiryLabel": "Expiration:", + "notActivated": "Not activated", + "aiChatCreditsLabel": "AI Chat Credits:", + "translationCreditsLabel": "Translation Credits:", + "meetingCreditsLabel": "Meeting Credits:", + "ok": "OK", + // 天气描述 "sunny": "Sunny", "partlyCloudy": "Partly Cloudy", @@ -1155,7 +1156,7 @@ const Map enUS = { "pictureTranslation": "Picture Translation", "textTranslation": "Text Translation", - // 翻译主页 + // 翻译主页 (translation_view.dart) "translationHistory": "Translation History", "enableRecording": "Enable Recording", "viewAudioFiles": "View Audio Files", @@ -1180,7 +1181,7 @@ const Map enUS = { "deleteSessionConfirm": "Are you sure you want to delete all translation records for this session? This action cannot be undone.", - // 翻译音频文件列表页 + // 翻译录音文件列表页 "translateAudioFiles": "Translate Audio Files", "noAudioFiles": "No audio files", "calculating": "Calculating...", @@ -1389,11 +1390,12 @@ const Map enUS = { "justNow": "Just now", "minutesAgo": "@minutes minutes ago", "yesterday": "Yesterday", + //补充 "insufficientIntegral": "Insufficient integral", //余额不足弹窗 - 'recharge': 'Go to Recharge', - 'insufficientBalanceDesc': + "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', + "recharge": 'Go to Recharge', }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 332179f96..763f1adfc 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -235,6 +235,69 @@ const Map zhCN = { 'trade_002_desc': '含 500 次翻译(语音/文本)', 'trade_003_desc': '含 1000 次翻译(语音/文本)', +// 商品页通用页脚 + 'appNameProvider': '应用名称:VoiTrans · 服务提供:VoiTrans', + 'moreInfoViewInSettingsAbout': '更多信息请前往 设置 > 关于 查看', + 'copyrightVoiTrans': '© 2025 VoiTrans', + + // 会议商品页描述 + 'meetingHeaderDesc1': '录音转写、关键词检索与自动总结,提升会议效率。', + 'meetingHeaderDesc2': '适用于商务会议、课堂笔记、访谈纪要等场景。', + 'meetingAutoRecording': '自动录音与分段', + 'meetingSpeakerTagging': '讲话人标注', + 'meetingLongAudioTranscription': '长音频转写', + 'meetingKeyPointSummary': '关键要点提炼', + 'meetingTopicNameSearch': '按主题/人名检索', + 'meetingTimelineJump': '时间线跳转', + 'meetingExportSummary': '导出纪要', + 'meetingMultiPlatformShare': '多平台分享', + 'meetingDisclaimer': '建议在安静环境使用,效果受麦克风与网络影响,具体以实际表现为准。', + + // 同传/翻译商品页描述 + 'tradeHeaderDesc1': '多语种实时同传与文本翻译,低延时语音播报。', + 'tradeHeaderDesc2': '适用于出行、商务、演讲与教学等场景。', + 'translateZhEn': '中英互译', + 'lowLatencyVoiceBroadcast': '低延时语音播报', + 'multiLangTextTranslation': '多语种文本翻译', + 'termOptimizationContextPreserve': '术语优化与语境保持', + 'lexiconTourBusinessLife': '旅游/商务/生活词库', + 'personalVocabularyMemory': '专属词汇记忆', + 'conversationSubtitleLargeText': '对话字幕/大字模式', + 'colorHighContrast': '颜色高对比度', + 'tradeDisclaimer': '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', + + // AI 商品页描述 + 'aiHeaderDesc1': '更长对话额度、更多工具调用、更强上下文长度支持。', + 'aiHeaderDesc2': '适用于智能体问答、总结分析、任务执行等场景。', + 'musicSearchPlaybackControl': '检索曲库、播放控制', + 'smartPlaylistAndSimilarRecommendations': '智能推荐歌单与相似歌曲', + 'routePlanningAndCongestionAvoidance': '路线规划与拥堵规避', + 'voiceBroadcastAndWaypoints': '语音播报与途径点设置', + 'realTimeWeatherForecast': '实时天气与预报', + 'clothingAdviceAndTravelReminders': '穿衣建议与出行提醒', + 'poiSearchFoodGasParking': '餐饮/加油/停车等地点检索', + 'ratingsHoursAndDirectRoutes': '评分、营业时间与路线直达', + 'hotNewsAndTopicOverview': '热点快讯与专题速览', + 'longArticleSummariesAndKeyPoints': '长文总结与要点提炼', + 'helpCallAndSMS': '帮忙拨打电话与发短信', + 'templatedMessagesAndScheduleReminders': '模板消息与日程提醒', + 'aiDisclaimer': '以上功能受设备权限、服务可用性与网络状况影响,具体以实际表现为准。', + + // 会员商品页 + 'benefitsOverview': '权益总览', + 'higherQuota': '更高使用额度', + 'lowerUnitPrice': '更低单价', + 'priorityService': '优先服务', + 'exclusiveSupportChannel': '专属客服通道', + 'fastResponse': '问题快速响应', + 'eventsAndDiscounts': '活动与折扣', + 'memberExclusiveEvents': '会员专属活动', + 'longTermDiscountPlan': '长期优惠计划', + 'generalPrivileges': '通用特权', + 'earlyAccessNewFeatures': '新功能优先体验', + 'crossDeviceSync': '跨设备同步', + 'vipDisclaimer': '具体权益以实际套餐说明为准,可能随版本迭代调整。', + // 新手引导 / Onboarding 'skip': '跳过', 'next': '下一步', @@ -704,6 +767,7 @@ const Map zhCN = { "translationCreditsLabel": "Translation Credits:", "meetingCreditsLabel": "Meeting Credits:", "ok": "OK", + // 天气描述 "sunny": "晴", "partlyCloudy": "少云", @@ -1004,14 +1068,14 @@ const Map zhCN = { "phoneUser": "手机用户", "selectSourceLanguage": "选择源语言", "selectTargetLanguage": "选择目标语言", - "me": "我", //我 - "counterPart": "对方", //对方 + "me": "我", + "counterPart": "对方", // 通用对话按钮与选项(用于统一语言选择弹窗等) // 以下翻译键的中文文本内容如注释所示 "autoDetect": "自动检测", // 自动检测 - // 翻译历史页 (translation_history_view.dart) + // 翻译历史页 "noTranslationHistory": "暂无历史记录", "clearHistory": "清除历史记录", "clearHistoryConfirm": "确定要清除所有翻译历史记录吗?此操作无法撤销。", @@ -1019,7 +1083,7 @@ const Map zhCN = { "deleteSessionRecord": "删除会话记录", "deleteSessionConfirm": "确定要删除该会话的所有翻译记录吗?此操作无法撤销。", - // 翻译录音文件列表页 (translation_list_view.dart) + // 翻译录音文件列表页 "translateAudioFiles": "翻译录音文件", "noAudioFiles": "暂无音频文件", "calculating": "计算中...", @@ -1213,69 +1277,6 @@ const Map zhCN = { //补充 "insufficientIntegral": "积分不足", - // 商品页通用页脚 - 'appNameProvider': '应用名称:VoiTrans · 服务提供:VoiTrans', - 'moreInfoViewInSettingsAbout': '更多信息请前往 设置 > 关于 查看', - 'copyrightVoiTrans': '© 2025 VoiTrans', - - // 会议商品页描述 - 'meetingHeaderDesc1': '录音转写、关键词检索与自动总结,提升会议效率。', - 'meetingHeaderDesc2': '适用于商务会议、课堂笔记、访谈纪要等场景。', - 'meetingAutoRecording': '自动录音与分段', - 'meetingSpeakerTagging': '讲话人标注', - 'meetingLongAudioTranscription': '长音频转写', - 'meetingKeyPointSummary': '关键要点提炼', - 'meetingTopicNameSearch': '按主题/人名检索', - 'meetingTimelineJump': '时间线跳转', - 'meetingExportSummary': '导出纪要', - 'meetingMultiPlatformShare': '多平台分享', - 'meetingDisclaimer': '建议在安静环境使用,效果受麦克风与网络影响,具体以实际表现为准。', - - // 同传/翻译商品页描述 - 'tradeHeaderDesc1': '多语种实时同传与文本翻译,低延时语音播报。', - 'tradeHeaderDesc2': '适用于出行、商务、演讲与教学等场景。', - 'translateZhEn': '中英互译', - 'lowLatencyVoiceBroadcast': '低延时语音播报', - 'multiLangTextTranslation': '多语种文本翻译', - 'termOptimizationContextPreserve': '术语优化与语境保持', - 'lexiconTourBusinessLife': '旅游/商务/生活词库', - 'personalVocabularyMemory': '专属词汇记忆', - 'conversationSubtitleLargeText': '对话字幕/大字模式', - 'colorHighContrast': '颜色高对比度', - 'tradeDisclaimer': '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', - - // AI 商品页描述 - 'aiHeaderDesc1': '更长对话额度、更多工具调用、更强上下文长度支持。', - 'aiHeaderDesc2': '适用于智能体问答、总结分析、任务执行等场景。', - 'musicSearchPlaybackControl': '检索曲库、播放控制', - 'smartPlaylistAndSimilarRecommendations': '智能推荐歌单与相似歌曲', - 'routePlanningAndCongestionAvoidance': '路线规划与拥堵规避', - 'voiceBroadcastAndWaypoints': '语音播报与途径点设置', - 'realTimeWeatherForecast': '实时天气与预报', - 'clothingAdviceAndTravelReminders': '穿衣建议与出行提醒', - 'poiSearchFoodGasParking': '餐饮/加油/停车等地点检索', - 'ratingsHoursAndDirectRoutes': '评分、营业时间与路线直达', - 'hotNewsAndTopicOverview': '热点快讯与专题速览', - 'longArticleSummariesAndKeyPoints': '长文总结与要点提炼', - 'helpCallAndSMS': '帮忙拨打电话与发短信', - 'templatedMessagesAndScheduleReminders': '模板消息与日程提醒', - 'aiDisclaimer': '以上功能受设备权限、服务可用性与网络状况影响,具体以实际表现为准。', - - // 会员商品页 - 'benefitsOverview': '权益总览', - 'higherQuota': '更高使用额度', - 'lowerUnitPrice': '更低单价', - 'priorityService': '优先服务', - 'exclusiveSupportChannel': '专属客服通道', - 'fastResponse': '问题快速响应', - 'eventsAndDiscounts': '活动与折扣', - 'memberExclusiveEvents': '会员专属活动', - 'longTermDiscountPlan': '长期优惠计划', - 'generalPrivileges': '通用特权', - 'earlyAccessNewFeatures': '新功能优先体验', - 'crossDeviceSync': '跨设备同步', - 'vipDisclaimer': '具体权益以实际套餐说明为准,可能随版本迭代调整。', - //余额不足弹窗 "insufficientBalanceDesc": "餘額不足,請前往對應充值界面進行充值", "recharge": "前往充值", diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index de44eccd2..cfe91e808 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -130,8 +130,8 @@ class _AgentViewState extends State with WidgetsBindingObserver { vipexptime * 1000); } final text = expiry != null - ? '到期时间: ${DateFormat('yyyy-MM-dd').format(expiry)}' - : '未开启'; + ? '${'expiryLabel'.tr}${DateFormat('yyyy-MM-dd').format(expiry)}' + : 'notActivated'.tr; return Text( text, style: TextStyle( diff --git a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart index 7d2b276ed..be5f16eb9 100644 --- a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart @@ -10,11 +10,12 @@ import 'package:get_storage/get_storage.dart'; import 'package:htmltopdfwidgets/htmltopdfwidgets.dart' as pdf; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:voitrans/data/services/network/dio_manager.dart'; + import 'package:webview_flutter/webview_flutter.dart'; import '../../../../core/utils/synchrodata.dart'; import '../../../../data/services/version_update_service.dart'; +import '../../../../data/services/network/dio_manager.dart'; import '../../controllers/meeting_details_controller.dart'; import '../../controllers/mind_map_controller.dart'; import 'second_level_bottom_sheet.dart'; diff --git a/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart b/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart index ac7d4dbfa..bf4202e54 100644 --- a/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart +++ b/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart @@ -75,16 +75,16 @@ class TranslationMiddlewareController extends GetxController { iconColor: Colors.indigo[500]!, // 主靛 targetRoute: Routes.textTranslation, ), - TranslationOption( - translationId: 'voice_replication', - title: '声音复刻', - icon: Icons.volume_up, - startColor: Colors.pink[400]!, // 粉色 - endColor: Colors.pink[600]!, // 深粉 - iconBgColor: Colors.white, // 白色 - iconColor: Colors.pink[500]!, // 主粉 - targetRoute: Routes.voiceReplication, - ), + // TranslationOption( + // translationId: 'voice_replication', + // title: '声音复刻', + // icon: Icons.volume_up, + // startColor: Colors.pink[400]!, // 粉色 + // endColor: Colors.pink[600]!, // 深粉 + // iconBgColor: Colors.white, // 白色 + // iconColor: Colors.pink[500]!, // 主粉 + // targetRoute: Routes.voiceReplication, + // ), ]; /// 导航到指定的翻译功能 From 3dc4979da68e1f9e20540238ac3ba757d7873dc9 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 4 Dec 2025 11:57:32 +0800 Subject: [PATCH 117/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/timbre/bindings/timbre_binding.dart | 2 +- lib/modules/timbre/controllers/timbre_controller.dart | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/modules/timbre/bindings/timbre_binding.dart b/lib/modules/timbre/bindings/timbre_binding.dart index 6883836f7..15a9ecdb4 100644 --- a/lib/modules/timbre/bindings/timbre_binding.dart +++ b/lib/modules/timbre/bindings/timbre_binding.dart @@ -4,6 +4,6 @@ import '../controllers/timbre_controller.dart'; class TimbreBinding extends Bindings { @override void dependencies() { - Get.put(TimbreController()); + Get.lazyPut(() => TimbreController()); } } diff --git a/lib/modules/timbre/controllers/timbre_controller.dart b/lib/modules/timbre/controllers/timbre_controller.dart index d976105fa..37e71efd9 100644 --- a/lib/modules/timbre/controllers/timbre_controller.dart +++ b/lib/modules/timbre/controllers/timbre_controller.dart @@ -9,12 +9,7 @@ import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; import 'package:record/record.dart'; -import '../../../data/services/speech_factory.dart'; -import '../../settings/controllers/settings_controller.dart'; - class TimbreController extends GetxController { - final SettingsController settingsController = Get.find(); - final GetStorage _storage = GetStorage(); final _record = AudioRecorder(); @@ -291,7 +286,6 @@ class TimbreController extends GetxController { void selectTone(Map data) { if (!data['isUsable'] || type.value == data['type']) return; type.value = data['type']; - settingsController.timbreName.value = data['name']; _storage.write('timbre', data['type']); } } From 2f0801f4048f618e8c5ad5a569bc4ea4b874dedb Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 4 Dec 2025 16:46:11 +0800 Subject: [PATCH 118/177] =?UTF-8?q?feat(=E8=AE=BE=E5=A4=87=E7=BB=91?= =?UTF-8?q?=E5=AE=9A):=20=E6=B7=BB=E5=8A=A0=E8=B7=B3=E8=BF=87=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=BB=91=E5=AE=9A=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在AppInfo模型中添加allowskipdevicebinding字段 - 在VersionUpdateService中缓存跳过设备绑定状态 - 修改PairingController使用新字段判断是否显示跳过按钮 - 新增getChannelApps API接口 --- lib/data/models/channel_app_model.dart | 5 +++++ lib/data/models/channel_app_model.g.dart | 2 ++ lib/data/services/network/api.dart | 9 +++++++++ lib/data/services/version_update_service.dart | 12 +++++++++++- .../pairing/controllers/pairing_controller.dart | 5 +++-- 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/data/models/channel_app_model.dart b/lib/data/models/channel_app_model.dart index 269dd9f5b..f4a117fe3 100644 --- a/lib/data/models/channel_app_model.dart +++ b/lib/data/models/channel_app_model.dart @@ -69,6 +69,10 @@ class AppInfo { @JsonKey(name: 'tourists') final bool tourists; + /// 是否允许跳过设备绑定 + @JsonKey(name: 'allowskipdevicebinding') + final bool allowskipdevicebinding; + /// 支付渠道列表 @JsonKey(name: 'Paychannels') final String? paychannels; @@ -79,6 +83,7 @@ class AppInfo { required this.description, required this.version, this.tourists = false, + this.allowskipdevicebinding = false, required this.paychannels, }); diff --git a/lib/data/models/channel_app_model.g.dart b/lib/data/models/channel_app_model.g.dart index fa2bd07e5..720e9cc33 100644 --- a/lib/data/models/channel_app_model.g.dart +++ b/lib/data/models/channel_app_model.g.dart @@ -38,6 +38,7 @@ AppInfo _$AppInfoFromJson(Map json) => AppInfo( description: json['description'] as String, version: json['version'] as String, tourists: json['tourists'] as bool? ?? false, + allowskipdevicebinding: json['allowskipdevicebinding'] as bool? ?? false, paychannels: json['paychannels'] as String?, ); @@ -47,5 +48,6 @@ Map _$AppInfoToJson(AppInfo instance) => { 'description': instance.description, 'version': instance.version, 'tourists': instance.tourists, + 'allowskipsevicebinding': instance.allowskipdevicebinding, 'paychannels': instance.paychannels, }; diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index a1c93e5b4..d5a1747ce 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -136,6 +136,15 @@ class Api { ); } + //获取所有渠道包信息 + static getChannelApps() { + return DioManager().request( + NWMethod.post, + '/api/home/user_getchannelapps', + //params: params, + ); + } + //绑定设备 static binddevice([params]) { return DioManager().request( diff --git a/lib/data/services/version_update_service.dart b/lib/data/services/version_update_service.dart index b8bf1da1f..4c37e851f 100644 --- a/lib/data/services/version_update_service.dart +++ b/lib/data/services/version_update_service.dart @@ -26,6 +26,7 @@ class VersionUpdateService extends GetxService { static String? _updateUrl = ""; //更新链接 static AppInfo? _appInfo; //应用信息 static bool? _isShowTourists = false; //是否显示游客登录 + static bool? _allowSkipDeviceBinding = false; //是否允许跳过设备绑定 static DateTime? _lastCheckTime; //上次检查时间 static const int _cacheIntervalMinutes = 10; // 可配置化 static final String? _countryCode = Get.deviceLocale?.countryCode; //国家地区编码 @@ -73,6 +74,9 @@ class VersionUpdateService extends GetxService { /// 获取缓存的游客登录状态 bool get cachedShowTourists => _isShowTourists ?? false; + /// 获取缓存的是否允许跳过设备绑定 + bool get cachedAllowSkipDeviceBinding => _allowSkipDeviceBinding ?? false; + /// 获取上次检查时间 DateTime? get lastCheckTime => _lastCheckTime; @@ -123,6 +127,7 @@ class VersionUpdateService extends GetxService { // 调用后端接口获取最新版本信息 final response = await Api.getChannelApp({'channel': platformInfo.channel.value}); + // final response = await Api.getChannelApps(); _logger.d('lxm--获取渠道包信息:$response'); @@ -147,6 +152,8 @@ class VersionUpdateService extends GetxService { // 设置游客登录显示状态(先用当前渠道结果作为回退,再用.env渠道覆盖以保持一致) _isShowTourists = appInfo.tourists; + _allowSkipDeviceBinding = appInfo.allowskipdevicebinding; + //print('lxm--_isShowTourists: $_isShowTourists'); if (Platform.isAndroid && _channel != platformInfo.channel) { //[4]当前渠道与.env渠道不同,需要从.env渠道获取游客登录配置 @@ -300,11 +307,14 @@ class VersionUpdateService extends GetxService { final envChannel = UserChannel.fromName(envChannelName); final resp = await Api.getChannelApp({'channel': envChannel.value}); + // _logger.d('lxm--获取渠道包信息:$resp'); if (resp != null && resp.containsKey('app')) { final envAppInfo = AppInfo.fromJson(resp['app']); + // print('lxm--envAppInfo: ${envAppInfo.toJson()}'); _isShowTourists = envAppInfo.tourists; + _allowSkipDeviceBinding = envAppInfo.allowskipdevicebinding; _logger.d( - 'lxm--游客登录配置已按.env渠道同步: ${envAppInfo.tourists} (channel=$envChannelName),_isShowTourists: $_isShowTourists'); + 'lxm--游客登录配置已按.env${envChannel.value}渠道同步: ${envAppInfo.tourists} (channel=$envChannelName),_isShowTourists: $_isShowTourists,_allowSkipDeviceBinding: $_allowSkipDeviceBinding'); } else { _logger.w('按.env渠道获取游客配置失败:响应为空或不含app字段'); } diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index f804348de..39ca7fa67 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -137,10 +137,11 @@ class PairingController extends GetxController with WidgetsBindingObserver { _startInitialCheck(); }); - final app_authcode_jump = AppConfig.env('APP_AUTHCODE_JUMP') ?? ""; + // final app_authcode_jump = AppConfig.env('APP_AUTHCODE_JUMP') ?? ""; //print('app_authcode_jump: $app_authcode_jump'); // 如果APP_AUTHCODE_JUMP为true,或者用户已登录且有绑定设备,启用跳过按钮 - if (app_authcode_jump == "true" || + final allowSkipDeviceBinding = versionService.cachedAllowSkipDeviceBinding; + if (allowSkipDeviceBinding || (User.isLoggedIn() && User.instance.devices.isNotEmpty)) { isShowSkipButton = true; // 启用跳过按钮 } From b30f60478930381a40f8bb00ad8d93b7b80b5deb Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 4 Dec 2025 19:23:04 +0800 Subject: [PATCH 119/177] =?UTF-8?q?fix(=E7=99=BB=E5=BD=95/=E9=85=8D?= =?UTF-8?q?=E5=AF=B9):=20=E4=BC=98=E5=8C=96=E6=B8=A0=E9=81=93=E5=92=8C?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整登录控制器的隐私政策检查逻辑,仅对非华为/荣耀渠道生效 在配对控制器中增加华为渠道判断,并优化权限检查流程 --- .../login/controllers/login_controller.dart | 19 ++++++++++++------- .../controllers/pairing_controller.dart | 10 ++++++++-- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/modules/login/controllers/login_controller.dart b/lib/modules/login/controllers/login_controller.dart index a568f820c..ff506e4a9 100644 --- a/lib/modules/login/controllers/login_controller.dart +++ b/lib/modules/login/controllers/login_controller.dart @@ -113,19 +113,24 @@ class LoginController extends GetxController { _contactController = TextEditingController(); _verificationCodeController = TextEditingController(); - // 初始化默认国家代码 - _initDefaultCountryCode(); - - _hasAcceptedPrivacy.value = - _storage.read('hasAcceptedPrivacy') ?? false; // 从本地存储中读取是否已接受隐私政策 - _initDeviceInfo(); _initAppInfo(); // 新增:初始化APP信息 _checkGuestLoginConfig(); // 检查游客登录配置 + final channel = versionService.cachedChannel; isChinaMainland.value = Get.deviceLocale?.countryCode?.toUpperCase() == 'CN' && - _userChannel != UserChannel.GLOBAL_GOOGLE; //是否中国大陆地区 + channel != UserChannel.GLOBAL_GOOGLE; //是否中国大陆地区 + + // 初始化默认国家代码 + _initDefaultCountryCode(); + + if (channel != UserChannel.CHINA_HUAWEI && + channel != UserChannel.CHINA_HONOR) { + // 非中国华为和荣耀渠道,检查是否已接受隐私政策 + _hasAcceptedPrivacy.value = + _storage.read('hasAcceptedPrivacy') ?? false; // 从本地存储中读取是否已接受隐私政策 + } } @override diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 39ca7fa67..2b63098c6 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -18,6 +18,7 @@ import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/ble_manager.dart'; import '../../../core/utils/permission_util.dart'; import '../../../data/services/version_update_service.dart'; +import '../../../data/models/channel_app_model.dart'; /// 配对状态枚举 - 简化版本 enum PairingState { @@ -569,15 +570,20 @@ class PairingController extends GetxController with WidgetsBindingObserver { return _bluetoothManager.bluetoothState != 'off'; } - /// 检查是否为华为设备 + /// 检查是否为华为设备或者华为渠道 bool _isHuaweiDevice() { final deviceBrand = versionService.cachedDeviceBrand; + final channel = versionService.cachedChannel; return deviceBrand.isNotEmpty && - (deviceBrand.contains('huawei') || deviceBrand.contains('华为')); + (deviceBrand.contains('huawei') || deviceBrand.contains('华为')) || + (channel == UserChannel.CHINA_HUAWEI); } /// 检查权限 Future _checkPermissions() async { + if (isHuaweiDevice) { + isHuaweiHasChecked = _storage.read('isHuaweiHasChecked') ?? false; + } //如果是华为设备,且已经检查过,直接返回权限状态 if (isHuaweiDevice && isHuaweiHasChecked) { final bluetoothScanStatus = await Permission.bluetoothScan.status; From 20b56b72f1b1ac9a87d086e1d58d51b071375269 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 4 Dec 2025 20:34:34 +0800 Subject: [PATCH 120/177] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8D=8F=E8=AE=AE=E5=92=8C=E9=9A=90=E7=A7=81=E6=94=BF?= =?UTF-8?q?=E7=AD=96HTML=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加Voitrans应用的用户协议(yhxy.html)和隐私政策(ysxy.html)文档,包含完整的条款内容和样式设计。这两个文档是应用合规运营的必要组成部分,分别规定了用户使用服务的权利义务和个人信息处理规则。 用户协议文档包含服务条款、软件授权、使用规范等内容;隐私政策文档详细说明了个人信息收集、使用、存储和保护的相关政策,以及用户权利和联系方式。 这两个文档的添加满足了应用商店上架和用户权益保护的法律要求。 --- doc/yhxy.html | 170 ++++++ doc/yhxy_en.html | 730 ++++++++++++++++++++++++ doc/ysxy.html | 352 ++++++++++++ doc/ysxy_en.html | 1421 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2673 insertions(+) create mode 100644 doc/yhxy.html create mode 100644 doc/yhxy_en.html create mode 100644 doc/ysxy.html create mode 100644 doc/ysxy_en.html diff --git a/doc/yhxy.html b/doc/yhxy.html new file mode 100644 index 000000000..1c2827bca --- /dev/null +++ b/doc/yhxy.html @@ -0,0 +1,170 @@ + + + + + + Voitrans应用用户协议 + + + +

      Voitrans应用用户协议

      + +

      这些使用条款和条件告诉您如何使用Voitrans应用程序和在线服务("服务")进行访问。深圳市良闯时代科技有限公司(以下简称"良闯")在此特别提醒用户认真阅读、充分理解本《用户协议》(以下简称"本协议")。

      + +

      用户应认真阅读、充分理解本协议中各条款。请您审慎阅读并选择接受或不接受本协议。您使用Voitrans APP(以下简称"本APP"或"本软件")等行为将视为对本协议的接受,并同意接受本协议各项条款的约束。如您不同意本协议,请勿使用本APP。良闯有权修订本协议,更新后的协议条款将公布于本APP,自公布之日起生效。

      + +

      一、总则

      +

      1.1 本APP是良闯提供的用于连接良闯及其合作公司发布的耳机产品的软件,本软件及相关服务的所有权和运营权均归良闯所有。

      + +

      1.2 本协议是您(以下简称"用户")与良闯及其合作公司以及运营合作单位(以下简称"合作单位")之间关于用户使用本APP及相关服务所订立的协议。

      + +

      1.3 本软件及服务包括:

      +

      1.3.1 提供的软件为使用Voitrans的用户提供Voitrans的连接与绑定、功能设置管理等软件服务,具体以本APP 实际提供的软件服务为准。

      +

      1.3.2 本软件的更新、升级以及其他服务。

      + +

      二、软件授权范围

      +

      2.1 良闯就本软件给予用户一项个人的、不可转让、不可转授权以及非独占性的许可。

      + +

      2.2 用户可以为非商业目的在单一台移动终端设备上安装、使用、显示、运行本软件。但用户不得为商业运营目的安装、使用、运行本软件,不可以对本软件或者本软件运行过程中释放到任何终端设备内存中的数据及本软件运行过程中客户端与服务器端的交互数据进行复制、更改、修改、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。如果需要进行商业性的销售、复制和散发,例如软件预装和捆绑,必须获得良闯的书面授权和许可。

      + +

      2.3 用户不得未经良闯许可,将本软件安装在未经良闯明示许可的其他终端设备上,包括但不限于电视、数字机顶盒、游戏机等装置。

      + +

      2.4 除本协议明示授权外,良闯未授权给用户其他权利,若用户使用其他权利时须另外取得良闯的书面同意。

      + +

      三、软件升级

      +

      3.1 用户必须选择适合所安装之终端设置的软件版本。否则,任何软件版本与装置机型不适合所引起的软件问题、装置问题或损坏,应完全由用户自行负责。

      + +

      3.2 为了改善用户体验、完善服务内容,良闯有权不时地为您提供本软件替换、修改、升级版本,本软件为用户默认开通"升级提示"功能,视用户使用的软件版本差异,良闯提供给用户自行选择是否需要开通此功能。软件新版本发布后,良闯不保证旧版本软件的继续可用。

      + +

      四、使用规范

      +

      4.1 用户在遵守法律及本协议的前提下可依本协议使用本软件及服务,用户不得实施如下行为:

      + +

      4.1.1 删除本软件及其他副本上一切关于版权的信息,以及修改、删除或避开本软件为保护知识产权而设置的技术措施。

      + +

      4.1.2 对本软件进行反向工程,如反汇编、反编译或者其他试图获得本软件的源代码。

      + +

      4.1.3 通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论这些行为是否为商业目的。

      + +

      4.1.4 使用本软件进行任何危害网络安全的行为,包括但不限于:使用未经许可的数据或进入未经许可的服务器/账户;未经允许进入公众网络或者他人操作系统并删除、修改、增加存储信息;未经许可企图探查、扫描、测试本软件的系统或网络的弱点或其它实施破坏网络安全的行为;企图干涉、破坏本软件系统或网站的正常运行,故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为;伪造 TCP/IP 数据包名称或部分名称。

      + +

      4.1.6 未经良闯书面同意,用户对软件及其中的信息擅自实施包括但不限于下列行为:使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版,建立镜像站点、擅自借助本软件发展与之有关的衍生产品、作品、服务、插件、外挂、兼容、互联等。

      + +

      4.1.7 利用本软件发表、传送、传播、储存违反您当地法律的内容。

      + +

      4.1.8 利用本软件发表、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容。

      + +

      4.1.9 利用本软件批量发表、传送、传播广告信息及垃圾信息。

      + +

      4.1.10 其他以任何不合法的方式、为任何不合法的目的、或以任何与本协议许可使用不一致的方式使用本软件和良闯提供的其他服务。

      + +

      4.2 信息发布规范

      + +

      4.2.1 您使用本软件发表信息内容的(如有),您应保证,您拥有您所上传信息内容的知识产权或已获得合法授权,您使用本软件及服务的任何行为未侵犯任何第三方之合法权益。

      + +

      4.2.2 用户在使用本软件时不得利用本软件从事以下行为,包括但不限于:

      + +

      4.2.2.1 制作、复制、发布、传播、储存违反当地国家法律法规的内容。

      + +

      4.2.2.2 发布、传送、传播、储存侵害他人名誉权、肖像权、知识产权、商业秘密等合法权利的内容。

      + +

      4.2.2.3 虚构事实、隐瞒真相以误导、欺骗他人。

      + +

      4.2.2.4 发表、传送、传播广告信息及垃圾信息。

      + +

      4.2.2.5 从事其他违反当地法律法规的其他行为。

      + +

      4.2.3 未经良闯许可,您不得在本软件中进行任何诸如发布广告、销售商品的商业行为。

      + +

      4.3 用户理解并同意:

      + +

      4.3.1 良闯会对用户是否涉嫌违反上述使用规范做出认定,并根据认定结果中止、终止对您的使用许可或采取其他依本约定可采取的限制措施。

      + +

      4.3.2 对于用户使用许可软件时发布的涉嫌违法或涉嫌侵犯他人合法权利或违反本协议的信息,良闯会直接删除。

      + +

      4.3.3 对于用户违反上述使用规范的行为对第三方造成损害的,您需要以自己的名义独立承担法律责任,并应确保良闯免于因此产生损失或增加费用。

      + +

      4.3.4 若用户违反有关法律规定或协议约定,使良闯遭受损失,或受到第三方的索赔,或受到行政管理机关的处罚,用户应当赔偿良闯因此造成的损失和(或)发生的费用,包括合理的律师费、调查取证费用。

      + +

      五、第三方服务说明

      +

      5.1 用户理解并同意,本软件系统可能包含由良闯的关联方或第三方提供的服务,良闯只是为了用户便利操作而在系统中提供相关功能模块,提供第三方服务的使用入口。

      + +

      5.2 不论第三方服务预置于本软件系统服务中,还是由用户自行开通或订购,用户均理解并同意,良闯不对第三方服务提供方或用户行为的合法性、有效性,以及第三方服务的合法性、准确性、有效性、安全性进行任何明示或默示的保证或担保。

      + +

      5.3 良闯并不监督第三方服务,不对其拥有任何控制权,也不对第三方服务提供任何形式的保证或担保,更不承担任何责任。

      + +

      5.4 用户与第三方服务提供方之间发生的任何争议、纠纷应由用户与该方按照第三方服务提供方的业务流程及业务规范自行协商解决,良闯不承担任何责任。

      + +

      六、隐私政策与个人信息保护

      +

      6.1 良闯承诺按照隐私政策保护用户的隐私,具体请见:《Voitrans应用隐私政策》。

      + +

      七、违约责任

      +

      7.1 良闯有权判断用户的行为是否符合本协议条款规定,如果认为用户违反有关法律法规或者本协议、相关规则的规定,根据用户违规情形的严重程度,良闯有权对用户采取删除违规信息、限制、中止、终止用户使用本软件服务、追究用户的法律责任以及其他良闯认为适合的处理措施。如果使良闯遭受任何损失(包括但不限于收到任何第三方的索赔或任何行政管理部门的处罚),用户应当承担全部责任。

      + +

      八、服务风险及免责声明

      +

      8.1 良闯以目前的技术提供服务支持。良闯不保证本软件服务在操作上不会中断或没有错误,不保证会纠正本软件服务的所有缺陷,亦不保证本软件服务能满足用户的所有要求。由此产生的后果,良闯不承担任何责任。

      + +

      8.2 用户因第三方如通讯线路故障、技术问题、网络、电脑终端设备故障、系统不稳定性及其他各种不可抗力原因而遭受的一切损失,良闯不承担责任。

      + +

      8.3 良闯不保证通过本软件获得的信息内容(包括但不限于调用的第三方服务内容)的合法性、真实性、准确性、有效性,良闯不对用户基于查询、查看做出的任何行为的结果承担任何责任。

      + +

      8.4 本软件同大多数互联网软件一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料,造成现实生活中的骚扰;用户下载安装的其他软件或访问的其他网站中含有"特洛伊木马"等病毒,威胁到用户的终端设备信息和数据的安全,继而影响本软件的正常使用等等。用户应加强信息安全及使用者资料的保护意识,要注意加强密码保护,以免遭致损失和骚扰。

      + +

      8.5 因用户使用本软件或要求良闯提供特定服务时,本软件可能会调用第三方系统或第三方软件支持用户的使用或访问,使用或访问的结果由该第三方提供,用户除遵守本协议相关规则外,还应遵守第三方的协议、相关规则。用户须理解并同意,在使用第三方服务时,第三方可能会对用户数据进行读取,良闯不保证通过第三方系统或第三方软件支持实现的结果的安全性、准确性、有效性及其他不确定的风险,用户应审慎判断,由此若引发的任何争议及损害,良闯不承担任何责任。

      + +

      8.6 良闯特别提请用户注意,良闯为了保障公司业务发展和调整的自主权,良闯采取合理的方式通知用户后可随时修改或中断服务。

      + +

      8.7 除法律法规有明确规定外,良闯将尽最大努力确保软件及其所涉及的技术及信息安全、有效、准确、可靠,但受限于现有技术,用户理解良闯不能对此进行担保。

      + +

      8.8 由于用户因下述任一情况所引起或与此有关的人身伤害或附带的、间接的经济损害赔偿,包括但不限于利润损失、资料损失、业务中断的损害赔偿或其他商业损害赔偿或损失,需由用户自行承担:

      + +

      (1)使用或未能使用许可软件。

      + +

      (2)第三方未经许可的使用软件或更改用户的数据。

      + +

      (3)用户使用软件进行的行为产生的费用及损失。

      + +

      (4)用户对软件的误解。

      + +

      (5)非因良闯的原因引起的与软件有关的其他损失。

      + +

      8.9 用户同意良闯有权基于司法、监管部门、监督机构的要求或自身业务原因,暂停、中断或终止向用户提供全部或者部分本服务。对此良闯不承担任何责任。

      + +

      8.10 用户理解并同意,良闯将会尽其商业上的合理努力保障用户在本软件及服务中的数据存储安全,但良闯不能提供完全保证,用户须理解,良闯不对服务中的数据的删除或储存或备份失败负责。

      + +

      8.11 在法律允许的最大范围内,开发者或供应商不对因使用应用程序而造成的任何直接、间接、偶然、特殊或后果性的损害负责。用户如有进一步的需要,请去往正规医院进行深度检测。

      + +

      九、知识产权声明

      +

      9.1 良闯是本软件的知识产权权利人。本软件的一切著作权、商标权、专利权、商业秘密等知识产权,以及与本软件相关的所有信息内容(包括但不限于文字、图片、音频、视频、图表、界面设计、版面框架、有关数据或电子文档等)均受当地法律法规和相应的国际条约保护,良闯享有上述知识产权。

      + +

      9.2 未经良闯书面同意,用户不得为任何商业或非商业目的自行或许可任何第三方实施、利用、转让上述知识产权,良闯保留追究上述行为法律责任的权利。

      + +

      十、协议变更

      +

      10.1 良闯有权在必要时修改本协议条款,协议条款一旦发生变动,将会在相关页面上公布修改后的协议条款。如果不同意所改动的内容,用户应主动取消此项服务。如果用户继续使用服务,则视为接受协议条款的变动。

      + +

      10.2 良闯有权按需要修改或变更所提供的收费服务、收费标准、收费方式、服务费及服务条款。良闯在提供服务时,可能现在或日后对部分服务的用户开始收取一定的费用如用户拒绝支付该等费用,则不能在收费开始后继续使用相关的服务。

      + + \ No newline at end of file diff --git a/doc/yhxy_en.html b/doc/yhxy_en.html new file mode 100644 index 000000000..d2f2183e1 --- /dev/null +++ b/doc/yhxy_en.html @@ -0,0 +1,730 @@ + + +

      English£¨US£© 

      Voitrans Application User Protocol

      These Terms and Conditions of Use tell you how to access using the Voitrans Application and online services (the "Services"). Saitong Industries Inc. (hereinafter referred to as "Saitong") hereby reminds users to carefully read and fully understand this User Agreement (hereinafter referred to as the "Agreement"). Users should carefully read and fully understand the terms of this Agreement. Please read carefully and choose to accept or not accept this Agreement. Your use of Voitrans APP (hereinafter referred to as "the APP" or" the Software ") will be deemed as acceptance of this Agreement and you agree to be bound by the terms of this Agreement. If you do not agree to this Agreement, do not use the APP.Saitong reserves the right to amend this Agreement, and the updated terms of the Agreement will be published in this APP, effective from the date of publication.

      һ¡¢General rules

      1.1 This APP is the software provided by Saitong for connecting the headset products released by Saitong and its partner companies. The ownership and operation rights of the software and related services are all owned by Saitong.

      1.2 This Agreement is an agreement between you (hereinafter referred to as the "User") and the company and its partners and operating partners (hereinafter referred to as the "Partners") regarding the user's use of the APP and related services.

      1.3 The Software and services include:

      1.3.1 The software provided provides Voitrans users with Voitrans connection and binding, function setting management and other software services, subject to the actual software services provided by the APP.

      1.3.2 Updates, upgrades and other services of the software.

      ¶þ¡¢Scope of software license

      2.1 We grant the user a personal, non-transferable, non-sublicensable, and non-exclusive license to the Software.

      2.2 Users can install, use, display and run the software on a single mobile terminal device for non-commercial purposes. However, the user shall not install, use or run the software for commercial operation purposes, copy, change, modify, connect or run the software or the data released into the memory of any terminal device during the operation of the software or the interaction data between the client and the server during the operation of the software, or create any derivative works. This includes, but is not limited to, the use of plug-ins, plug-ins, or unauthorized third-party tools/services to access the Software and related systems. For commercial sale, reproduction and distribution, such as software pre-installation and bundling, written authorization and permission must be obtained from the idea.

      2.3 The User shall not install the Software on other terminal devices without the express permission of the Creator, including but not limited to TVS, digital set-top boxes, game consoles and other devices.

      2.4 Except as expressly authorized by this Agreement, no other rights are granted to the User, and the User shall obtain the written consent of the User to use other rights.

      Èý¡¢Software upgrade

      3.1 The user must select the software version suitable for the setup of the installed terminal. Otherwise, software problems, device problems or damage caused by any software version not suitable for the device type shall be solely the responsibility of the user.

      3.2 In order to improve the user experience and improve the service content, Saitong has the right to provide you with replacement, modification and upgrade versions of the software from time to time. The "Upgrade prompt" function is enabled for users by default. Depending on the different software versions used by users, Saitong provides users with the option to activate this function. After the release of a new version of the software, Saitong does not guarantee the continued availability of the old version of the software.

      Ëġ¢Usage specification

      4.1 Users may use the Software and Services in accordance with this Agreement under the premise of abiding by the law and this Agreement, and users shall not perform the following acts:

      4.1.1 Delete all copyright information on the Software and other copies, and modify, delete or circumvent the technical measures set up by the Software to protect intellectual property rights.

      4.1.2 Reverse engineering the Software, such as disassembly, decompilation, or other attempts to obtain the source code of the Software.

      4.1.3 By modifying or falsifying instructions and data in the operation of the software, increasing, deleting or changing the function or operation effect of the software, or software or methods to be used for the above purposes to operate or disseminate to the public, regardless of whether these acts are for commercial purposes.

      4.1.4 Use the software for any behavior that jeopardizes network security, including but not limited to: using unauthorized data or accessing unauthorized servers/accounts; Access public networks or other operating systems without permission and delete, modify or add stored information; Unauthorized attempts to probe, scan, or test the weaknesses of the system or network of the software or other acts that undermine network security; Attempts to interfere with or destroy the normal operation of the software system or website, intentionally spread malicious programs or viruses, and other acts that disrupt normal network information services; Forge TCP/IP packet names or partial names.

      4.1.6 Without the written consent of the Company, the user arbitrarily performs the following acts on the software and the information in it, including but not limited to: using, renting, lending, copying, modifying, linking, reprinting, compiling, publishing, publishing, establishing mirror sites, developing derivative products, works, services, plug-ins, plug-ins, compatibility, interconnection, etc., with the help of the Software.

      4.1.7 Use the Software to publish, transmit, distribute, and store content that violates your local laws.

      4.1.8 Use the software to publish, transmit, disseminate, and store content that infringes others' intellectual property rights, trade secrets, and other legitimate rights.

      4.1.9 Use this software to publish, transmit and disseminate advertising information and junk information in bulk.

      4.1.10 Use the Software and other Services in any unlawful manner, for any unlawful purpose, or in any manner inconsistent with the licensed use of this Agreement.

      4.2 Information release specification

      4.2.1 If you use the software to publish information content (if any), you should guarantee that you own the intellectual property rights of the information content uploaded by you or have obtained legal authorization, and any behavior of you using the software and services does not infringe on the legitimate rights and interests of any third party.

      4.2.2 When using the Software, the user shall not use the Software to engage in the following activities, including but not limited to:

      4.2.2.1 Create, copy, publish, disseminate, and store content that violates local national laws and regulations.

      4.2.2.2 Publish, transmit, disseminate, and store content that infringes others' legal rights such as reputation, portrait, intellectual property, and trade secrets.

      4.2.2.3 Fabricate facts, conceal the truth in order to mislead or deceive others.

      4.2.2.4 Publish, transmit and disseminate advertising information and junk information.

      4.2.2.5 Engaging in other acts in violation of local laws and regulations.

      4.2.3 You may not carry out any commercial activities such as advertising and selling goods in the Software without the permission of the Company.

      4.3 The User understands and agrees that:

      4.3.1 Saitong will determine whether the user is suspected of violating the above specifications of use, and according to the results of the determination, suspend or terminate your license to use or take other restrictive measures that can be taken in accordance with this agreement.

      4.3.2 For the user's use of the licensed software published suspected of illegal or suspected infringement of the legal rights of others or violation of this Agreement, the information will be directly deleted.

      4.3.3 If the user's violation of the above rules of use causes damage to third parties, you need to bear legal responsibility independently in your own name, and you should ensure that the idea is free from losses or increased costs.

      4.3.4 If the user violates the relevant legal provisions or agreements, causing the Saitong to suffer losses, or is subject to third-party claims, or is punished by the administrative authority, the user shall compensate the loss and/or expenses caused by the Saitong, including reasonable attorney fees, investigation and evidence collection costs.

      Î塢Third-party service description

      5.1 The user understands and agrees that the software system may contain services provided by affiliates of the Company or third parties, and that the Company only provides relevant functional modules in the system for the convenience of users and provides access to third-party services.

      5.2 Whether the third-party services are preset in the software system services, or are opened or ordered by users themselves, users understand and agree that Saitong does not make any express or implied guarantee or guarantee of the legality and effectiveness of the third-party service providers or users, as well as the legality, accuracy, effectiveness and security of the third-party services.

      5.3 The company does not supervise, control or provide any warranty or guarantee of any kind for, or assume any liability for, third party services.

      5.4 Any dispute or dispute between the user and the third party service provider shall be resolved by the User and the third party in accordance with the business process and business norms of the third party service provider, and the company shall not assume any responsibility.

      Áù¡¢Privacy Policy and Protection of Personal Information

      6.1 Saitong is committed to protecting the privacy of users in accordance with the privacy policy, please see:¡¶Voitrans applies Privacy Policy¡·¡£

      Æߡ¢Liability for breach

      7.1 Saitong has the right to judge whether the user's behavior complies with the provisions of this Agreement. If it is believed that the User has violated relevant laws and regulations or the provisions of this Agreement and relevant rules, according to the severity of the user's violation, Saitong has the right to delete the illegal information, restrict, suspend, terminate the user's use of the Software service, pursue the user's legal liability and take other measures that Saitong deems appropriate. If we suffer any loss (including but not limited to receiving any third party claims or penalties from any administrative department), the User shall be fully liable.

      °ˡ¢Service Risks and Disclaimers

      8.1 We want to provide service support with current technology. Saitong does not warrant that the Software Service will operate without interruption or error, that all defects of the Software Service will be corrected, or that the Software Service will meet all requirements of users. The resulting consequences, the Saitong does not assume any responsibility.

      8.2 All losses suffered by the user due to third parties such as communication line failure, technical problems, network, computer terminal equipment failure, system instability and other force majeure causes shall not be held liable.

      8.3 Saitong does not guarantee the legality, authenticity, accuracy and effectiveness of the information content obtained through the software (including but not limited to the third party service content), and Saitong does not assume any responsibility for the results of any behavior made by users based on query and viewing.

      8.4 The software, like most Internet software, is affected by differences in factors including but not limited to user reasons, network service quality, social environment and other factors, and may be subjected to various security problems, such as others using user information, resulting in harassment in real life; Other software downloaded and installed by users or other websites visited by users contain viruses such as "Trojan horses", which threaten the security of users' terminal equipment information and data, and then affect the normal use of the software. Users should strengthen the awareness of information security and user data protection, and pay attention to strengthen password protection to avoid loss and harassment.

      8.5 When users use the Software or require Saitong to provide specific services, the Software may call third-party systems or third-party software to support users' use or access, and the results of use or access are provided by the third party. In addition to complying with the relevant rules of this Agreement, users shall also comply with the agreements and relevant rules of the third party. Users must understand and agree that, when using third-party services, third parties may read user data, and Saitong does not guarantee the safety, accuracy, effectiveness and other uncertain risks of the results achieved through third-party systems or third-party software support, users should exercise careful judgment, and Saitong does not assume any responsibility for any disputes and damages caused by this.

      8.6 In order to guarantee the autonomy of the company's business development and adjustment, the company may modify or interrupt the service at any time after taking a reasonable way to notify the user.

      8.7 Except as expressly provided by laws and regulations, Saitong will make its best efforts to ensure that the software and the technology and information involved are safe, effective, accurate and reliable, but limited by the existing technology, the user understands that Saitong cannot guarantee this.

      8.8 Compensation for personal injury or incidental and indirect economic damage caused by or in connection with any of the following circumstances, including but not limited to loss of profits, loss of data, damages for business interruption or other business damages or losses, shall be borne by the User:

      £¨1£©Use or failure to use the licensed software.

      £¨2£©Unauthorized use of the software or alteration of user data by third parties.

      £¨3£©Expenses and losses incurred by the user's actions with the software.

      £¨4£©User misconceptions about the software.

      £¨5£©Any other loss related to the software that is not attributable to Saitong causes.

      8.9 The User agrees that the Company has the right to suspend, interrupt or terminate all or part of the Service to the user based on the requirements of the judicial, regulatory and supervisory authorities or its own business reasons. Saitong accepts no responsibility for this.

      8.10 The User understands and agrees that the Company will use its commercially reasonable efforts to ensure the security of data storage in the Software and Services, but the company cannot provide a complete guarantee, and the User understands that the Company is not responsible for the deletion or storage or backup failure of data in the Service.

      8.11 To the fullest extent permitted by law, the Developer or Supplier shall not be liable for any direct, indirect, incidental, special or consequential damages arising from the use of the Application. If the user has further needs, please go to the regular hospital for in-depth testing.

      ¾š¢Intellectual property statement

      9.1 Saitong is the intellectual property right holder of this software. All Copyrights, trademarks, patents, trade secrets and other intellectual property rights of the software, as well as all information content related to the software (including but not limited to text, pictures, audio, video, graphics, interface design, layout frame, relevant data or electronic documents, etc.) are protected by local laws and regulations and corresponding international treaties.

      9.2 Without the written consent of the Company, the User shall not implement, utilize or transfer the above intellectual property rights for any commercial or non-commercial purpose, or permit any third party, and the Company reserves the right to pursue the legal responsibility for the above acts.

      ʮ¡¢Protocol change

      10.1 Saitong has the right to modify the terms of this Agreement when necessary. Once the terms of the Agreement are changed, the revised terms of the Agreement will be published on the relevant page. If you do not agree with the changed content, the user should take the initiative to cancel this service. If the User continues to use the Services, it is deemed to accept the changes in the terms of the Agreement.

      10.2 Saitong reserves the right to modify or change the paid services, charging standards, charging methods, service fees and terms of service provided as necessary. When providing services, we may charge certain fees to users of some services now or in the future. If users refuse to pay such fees, they cannot continue to use the relevant services after the start of the fees.

       

      \ No newline at end of file diff --git a/doc/ysxy.html b/doc/ysxy.html new file mode 100644 index 000000000..d8678a529 --- /dev/null +++ b/doc/ysxy.html @@ -0,0 +1,352 @@ + + + + + Voitrans隐私政策 + + + + +

      Voitrans 隐私政策

      +

      更新日期:2025年5月27日

      +

      生效日期:2025年5月27日

      +

      深圳市良闯时代科技有限公司(下称“我们”),是VoitransAPP(具体范围及定义见下文)的开发者和运营者。我们深知个人信息对您的重要性,您的信任对我们非常重要,我们将按照法律法规的规定并参照行业最佳实践保护您的个人信息及隐私安全。我们制定本"隐私政策"并特别提示:希望您在使用Voitrans及相关服务前仔细阅读并理解本隐私政策,以便做出适当的选择。 +

      +

      本隐私政策将帮助您了解 :

      +

      我们会遵循隐私政策收集、使用您的信息,但不会仅因您同意本隐私政策而采用强制捆绑的方式收集个人信息。

      +

      当您使用或开启相关功能或使用服务时,为实现功能、服务所必需,我们会收集、使用相关信息。除非是为实现业务功能或根据法律法规要求所必需的必要信息,您均可以拒绝提供且不影响其他功能或服务。我们将在隐私政策中逐项说明所要收集的信息。 +

      +

      如果您未登录账号,我们会通过设备对应的标识符信息来保障信息推送的基本功能。如果您登录了账号,我们会根据账号信息实现信息推送。

      +

      精确地理位置、摄像头(相机)、相册(存储)等权限,均不会默认开启,只有经过您的明示授权才会在为实现特定功能或服务时使用,您也可以撤回授权。特别需要指出的是,即使经过您的授权,我们获得了这些敏感权限,也不会在相关功能或服务不需要时而收集您的信息。 +

      +

      下文将帮您详细了解我们如何收集、使用、存储、转移(如适用)与保护个人信息;帮您了解查阅、复制、更正、删除、撤回授权个人信息的方式。本政策与您使用我们的服务关系密切,我们建议您仔细阅读并理解本政策全部内容,作出您认为适当的选择,有关您个人信息权益的条款重要内容我们已用加粗形式提示 + , 请特别关注。

      +

      1.我们如何收集和使用个人信息

      +

      2 .数据使用过程中涉及的合作方以及转移、公开个人信息

      +

      3 .我们如何存储个人信息

      +

      4 .我们如何保护个人信息的安全

      +

      5 .我们如何管理您的个人信息

      +

      6 .未成年人条款

      +

      7 .隐私政策的修订和通知

      +

      8 .联系我们

      +

      1. 我们如何收集和使用个人信息

      +

      我们会按照如下方式收集您在访问Voitrans平台或使用Voitrans平台提供的产品及服务时主动提供的,以及通过自动化手段收集您在使用功能或接受服务过程中产生的信息,收集和使用这些信息的目的和用途详见下述功能描述部分。 +

      +

      我们不会通过共享、转让、搜集公开信息等其他渠道间接获取有关您的个人信息。如将来发生需通过其他渠道间接获取您的个人信息时,我们只获取实现产品或服务的业务功能所必需的最少数量的信息,且在收集和使用之前明确告知您并征求您的明示同意。同时,我们将在收集信息前确保信息来源的合法性,了解个人信息提供方已获得的个人信息处理的授权同意范围,包括使用目的、授权同意转让、共享、公开披露等。若我们开展业务需进行的个人信息处理活动超出该授权同意范围,会在获取个人信息后的合理期限内或处理个人信息前,征得您的明示同意。 +

      +

      我们收集和使用您的信息的目的和用途详情如下:

      +

      1.1 注册、登录Voitrans

      +

      当您注册、登录Voitrans时,您可以通过手机号,电子邮箱,以及微信授权方式,创建“Voitrans账号”,并且完善相关的网络身份识别信息(账号、密码、头像、昵称),我们会收集您的手机号,并且获取短信验证码,以便我们对您的账户进行身份核验。 +

      +

      收集您的上述信息是为了帮助您完成手机号注册和登陆,保证您的账户权益。此类信息属于使用手机号注册和登录的必要信息,如您不提供将无法完成注册/登录操作。

      +

      1.2 录音

      +

      1.2.1 必要信息范围

      +

      在您联网使用录音功能服务时,我们将收集您的语音信息与/或您提供的其他录音内容 。此类信息属于录音功能服务的必要信息 。请您知悉,在未联网的环境下或您未主动上传的情况下,前述信息仅会存储在设备端 + ,我们不会收集并上传云端服务器存储。

      +

      1.2.2 调用的权限范围

      +

      在您使用录音功能服务时,我们需要调用您的麦克风权限以获取您的语音信息,此为该功能服务所必须的系统权限,若您拒绝,您将无法使用录音功能 。

      +

      在您使用录音存储功能服务时,我们需要调用您的存储权限以存储您的语音信息,此为该功能服务所必须的系统权限,若您拒绝,您将无法使用录音功能 。

      +

      1.3 语音转写

      +

      1.3.1 必要信息范围

      +

      在您使用语音转文字功能服务时,我们将收集您的语音信息与/或您提供的其他录音内容以在云端服务器进行语音转写。同时,我们会收集转写后的文本信息 + ,判断您的需求并做出实时处理反馈给您,以方便您了解进行了哪些语音交互。此类信息属于语音转文字功能的必要信息,如您不能提供,您将无法使用语音转文字功能。

      +

      1.3.2 调用的权限范围

      +

      在您使用语音转文字功能服务时,我们需要调用您的麦克风权限以获取您的语音信息,此为该功能服务所必须的系统权限,若您拒绝,您将无法使用语音转文字功能。

      +

      1.4 管理录音及转写文稿

      +

      1.4.1 必要信息范围

      +

      当您在登录状态下使用录音转文字功能,并对以及转写文稿进行云端存储、编辑、管理时,我们将收集您的录音以及编辑后的转写文稿信息,如文本信息、语音信息,同时需获取您的网络状态,在您允许我们开启存储与网络权限后,我们可以获取到您的录音以及编辑后的转写文稿信息 + ,这是为了方便您随时导出、存储、分享您的录音以及编辑后的转写文稿。此类信息属于云端存储、编辑与管理录音及转写文稿必须的信息,如您拒绝提供,我们将无法为您提供云端存储、编辑、管理、分享、下载等服务,但不影响您使用本软件的其他功能。 +

      +

      1.4.2 调用的权限范围

      +

      在您修改录音文件时,我们需要调用您的存储权限以存储您的文本信息 ,此为该功能服务所必须的系统权限,若您拒绝,您修改后的内容将不会存储至本地端。

      +

      1.5 语音翻译

      +

      1.5.1 必要信息、非必要信息范围

      +

      若您使用语音翻译服务,我们会申请您设备系统的麦克风权限、存储权限 。在经您授权同意后,我们会收集您的语音信息 + ,以便/以用于获取说出的语音来进行翻译。此类信息属于语音转文字功能的必要信息,如您不能提供,您将无法使用语音翻译功能。

      +

      1.5.2 调用的权限范围

      +

      在您使用语音翻译和同声传译功能服务时我们需要调用您的麦克风权限以获取您的语音信息 ,此为该功能服务所必须的系统权限,若您拒绝,您将无法使用语音翻译和同声传译功能。

      +

      同时,我们需要调用您的存储权限以存储您的语音信息和文本信息,此为该功能服务所必须的系统权限,若您拒绝,您将无法使用语音翻译功能。

      +

      1.7 设备权限

      +

      1.7.1 位置权限

      +

      在使用智能翻译功能时,我们将收集您的定位信息以获得您的精确地理位置信息,用于实现智能翻译中的自动检测源语言功能,我们将根据您的定位信息自动匹配出您使用的语言,向您提供智能翻译服务。精确地理位置信息是个人敏感信息,若您拒绝开启GPS权限,我们将无法为您自动匹配翻译语言,需要您手动进行语言的选择。 +

      +

      1.7.2 蓝牙权限

      +

      在您连接智能硬件时,我们需要获取您的蓝牙权限来搜索设备,传输配网信息,实现绑定设备目的。

      +

      1.7.3 通讯录权限

      +

      在您使用拨打电话功能时,我们需要获取您的通讯录权限获取信息,实现您给对应用户拨打电话的需求。

      +

      1.7.4 短信权限

      +

      在您使用智能助手时,我们需要获取您的短信权限,实现您给对应用户发送短信的需求。

      +

      1.7.5 系统通知权限

      +

      在向您推送 PUSH 消息时,我们需要获取您的通知权限。这是为了能在您的设备通知栏显示 APP 相关的通知内容,包括但不限于 APP + 的新功能上线通知、您关注内容的更新信息、优惠活动提醒等。若您拒绝开启通知权限,您将无法及时收到这些重要信息,可能会错过 APP 为您准备的精彩内容和便利服务。

      +

      1.7.7 存储权限(较少情况)

      +

      在某些特殊的 PUSH + 消息场景下,若消息需要将一些临时数据存储在本地设备上,我们需要获取您的存储权限。比如推送包含新功能配置文件的消息,需要存储权限来保存这些文件到本地,以便实现新功能在您设备上的应用。若您拒绝此权限,相关特殊功能可能无法正常使用。 +

      +

      1.7.8 相机权限

      +

      当您使用设置头像或意见反馈上传图片功能时,我们会申请相机权限。在您明确授权后,相机将被用于拍摄照片以满足对应功能需求,且仅在相关功能运行期间收集和使用相机所产生的数据,功能结束后不再进行数据收集。若您拒绝授权相机权限,将无法使用涉及相机的相关功能,但不影响其他功能的正常使用。 +

      +

      1.7.8.1 相机权限的使用场景

      +

      在Voitrans App中,我们有两个主要功能,需要使用到您的相机权限:

      +

      更改个人头像:当您希望更改您的个人头像时,我们需要调用相机权限以便您能够拍摄新的照片或从相册中选择一张图片作为头像。

      +

      意见反馈功能:在意见反馈功能中,如果您希望通过上传图片来提供更详细的反馈信息,我们需要相机权限来允许您拍摄照片或从相册中选择图片上传。

      +

      1.7.8.2 用户控制

      +

      您可以随时在设备的设置中开启或关闭相机权限。如果您选择关闭相机权限,您将无法使用上述功能,但不影响您使用Voitrans App的其他功能。

      +

      1.7.8.3 数据的存储和处理

      +

      照片存储:当您使用相机权限拍摄照片或选择图片时,这些图片仅在您的设备上存储,除非您主动选择上传。

      +

      数据处理:如果图片被上传到我们的服务器,我们将按照隐私政策中的规定处理这些数据,包括但不限于存储、备份和删除机制。

      +

      1.7.8.4 数据的共享和转让

      +

      我们不会与任何第三方共享或转让通过相机权限收集的图片数据,除非是为了提供服务所必需,或者您明确同意。

      +

      1.7.8.5 用户撤销权限后的影响

      +

      如果您撤销相机权限,您将无法使用更改个人头像和意见反馈中上传图片的功能。如果您希望重新授权,可以在设备的设置中重新开启相机权限。

      +

      1.7.8.6 相机权限的安全性

      +

      我们承诺采取行业标准的安全措施来保护您通过相机权限提供的数据,包括但不限于数据加密传输和安全存储。

      +

      1.8 用户反馈与服务

      +

      1.8.1客服及问题

      +

      为便于与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们可能会保存您与我们的通信/通话记录及相关内容(包括账号信息、反馈信息、预约信息、您为了证明相关事实提供的其他信息,或您留下的联系方式信息),如果您针对具体预约进行咨询、投诉或提供建议的,我们会使用您的账号信息和预约信息。 +

      +

      1.8.2 投诉

      +

      当您投诉他人或被他人投诉时,为了保护您及他人的合法权益,我们可能会将您的账号/身份信息、联系方式、投诉相关内容提供给消费者权益保护部门及监管机关,以便及时解决投诉纠纷,但法律法规明确禁止提供的除外。

      +

      如您通过我们产品或服务使用良闯时代关联方、合作方提供的服务并进行投诉时,为便于服务提供方(如良闯时代关联方、合作方)能与您有效联系并及时处理您的投诉,您同意我们获取您投诉时所提供的个人信息,并同步给对应服务提供方。

      +

      1.9 运营与安全运行/保障

      +

      1.9.1 运营与安全保障

      +

      我们致力于为您提供安全、可信的产品与使用环境,提供优质而可靠的服务与信息是我们的核心目标。为了维护Voitrans 平台的正常运行,保护您或其他用户或公众的合法利益免受损失,我们会收集用于维护产品或服务安全稳定运行的必要信息。 +

      +

      1.9.2 设备信息与日志信息

      +

      a. 为了保障软件与服务的安全运行、运营的质量及效率,我们会收集您的硬件型号、操作系统版本号、设备标识符(Android如 IMEl 、 Android_ID 、 OAID 、 IMSI 、 ICCID 、 GAID 、 + MEID 、硬件序列号, iOS 如 IDFV 、 IDFA: 不同的标识符在有效期,是否可由用户重置以及获取方式方面会有所不同) 、网络设备硬件地址 (MAC 地址 ) 、 IP 地址、 WLAN 接入点 ( 如 SSID + , BSSID) 、蓝牙 (Bluetooth) 、基站、软件版本号、网络接入方式、类型、状态、网络质量数据、操作、使用、服务日志、设备传感器数据。

      +

      b. 为了预防恶意程序、保障运营质量及效率,我们会收集安装的应用信息或正在运行的进程信息、应用程序的总体运行、使用情况与频率。应用崩溃情况、总体安装使用情况、性能数据、应用来源。

      +

      c. 为了分析应用新增、激活、留存、性能等统计性指标,我们可能会调用剪切板对相关统计信息进行归因分析,请您放心,我们不会收集您的隐私信息。

      +

      d. 我们可能使用您的账户信息、设备信息、服务日志信息以及我们关联方、合作方在获得您授权或依法可以提供的信息,用于判断账户安全、进行身份验证、识别违法违规情况、检测及防范安全事件,并依法采取必要的记录、分析、处置措施。

      +

      1.10 收集、使用个人信息目的变更

      +

      请您了解,随着我们业务的发展,可能会对 Voitrans + 的功能和提供的服务有所调整变化。原则上,当新功能或服务与我们当前提供的功能或服务相关时,收集与使用的个人信息将与原处理目的具有直接或合理关联。在与原处理目的无直接或合理关联的场景下,我们收集、使用您的个人信息,会再次按照法律法规及国家标准的要求以页面提示、交互流程、协议确认方式另行向您进行告知说明,并征得您的同意。 +

      +

      1.11 征得授权同意的例外

      +

      请您理解,在下列情形中,根据法律法规及相关国家标准,我们收集和使用您的个人信息不必事先征得您的授权同意:

      +

      a. 与我们履行法律法规规定的义务相关的;

      +

      b. 与国家安全、国防安全直接相关的;

      +

      c. 与公共安全、公共卫生、重大公共利益直接相关的;

      +

      d. 与刑事侦查、起诉、审判和判决执行等直接相关的;

      +

      e. 出于维护您或他人的生命、财产等重大合法权益但又很难得到本人授权同意的;

      +

      f. 您自行向社会公众公开的个人信息;

      +

      g. 根据个人信息主体要求签订和履行合同所必需的;

      +

      h. 从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;

      +

      i. 用于维护软件及相关服务的安全稳定运行所必需的,例如发现、处置软件及相关服务的故障;

      +

      j. 为开展合法的新闻报道所必需的;

      +

      k. 为学术研究机构,基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;

      +

      l. 法律法规规定的其他情形。

      +

      特别提示您注意,如信息无法单独或结合其他信息识别到您的个人身份,其不属于法律意义上您的个人信息 ; + 当您的信息可以单独或结合其他信息识别到您的个人身份时或我们将无法与任何特定个人信息建立联系的数据与其他您的个人信息结合使用时,这些信息在结合使用期间,将作为您的个人信息按照本隐私政策处理与保护。

      +

      1.12 人机交互对话

      +

      在您使用我们的人机交互服务时(包括智能助手,等),我们会收集您主动输入的内容(包括文本、图片、音视频等),并基于这些信息为您提供相应的服务。当您使用语音输入时,我们将收集您的音频数据,进行语音转写,并基于转写后的文本生成对话内容,以提供更好的互动体验。 +

      +

      如果您输入的信息包含他人个人数据,请确保已获得他人的合法授权,避免不当泄露他人隐私。

      +

      为了更好地理解您的需求和语境,我们会对您提供的信息进行分析和处理,以便输出更具相关性的内容。在确保信息经过加密、安全处理且去标识化的前提下,我们可能会将所收集的数据和生成的回复用于模型训练,持续优化服务质量。

      +

      1.13 数据埋点统计及上报

      +

      我们在 APP 内设置了页面埋点,目的是为了统计 APP 的使用情况,以便更好地优化产品性能、修复漏洞以及提升您的使用体验。当您访问 APP + 页面时,页面埋点会收集您的页面浏览记录、点击行为、停留时长等信息,但此类信息的收集频率遵循合理必要原则,通常情况下,同一页面在您单次访问期间仅收集一次,不会对您造成频繁的数据收集干扰。仅在您进行交互操作(如点击按钮、切换页面板块等)触发新的业务需求时,才会根据实际需要再次收集与之相关的少量信息。 +

      +

      a. 我们收集的信息将主要用于为您提供、优化和改进本 APP 的服务,依据您的反馈修复程序问题等。

      +

      b. 部分信息可能会用于数据分析和研究,以了解用户群体的使用习惯和偏好趋势,从而推动本 APP 的持续创新发展。

      +

      1.14 模型服务与数据处理

      +

      1.14.1 模型服务基础

      +

      Voitrans 接入了目前国内比较优秀的的人工智能大模型服务,如豆包, DeepSeek,未来会持续优化模型的接入能力,拓展更多的模型,以为用户提供更好的服务。

      +

      1.14.2 数据收集与共享

      +

      在您使用第三方模型期间,为实现高效的聊天互动、回答问题、生成图像等服务,我们会收集您的输入内容并共享给相关服务提供方,以便根据您的内容提供文生文或文生图的人机交互服务。

      +

      1.14.3 模型服务说明

      +

      在您使用第三方模型期间,如遇到问题,可及时于我们取得联系,我们将持续优化模型的接入。

      +

      1.15 应用自启动与关联启动说明

      +

      1.15.1 自启动用途说明

      +

      Voitrans app 需要使用自启动能力以确保与外部蓝牙设备(如ble蓝牙耳机)保持稳定连接,这对于提供持续的语音交互和设备控制服务是必要的。自启动功能仅用于维持蓝牙连接服务,不会进行其他后台操作。

      +

      1.15.2 自启动场景说明

      +
        +
      • 蓝牙设备连接:当配对的蓝牙设备在范围内被激活时,应用需要自动启动以建立连接。
      • +
      • 设备通信维护:为确保与蓝牙设备的实时通信质量,需要保持后台服务运行。
      • +
      • 语音交互响应:当用户通过蓝牙设备发起语音指令时,应用需要及时响应。
      • +
      • 设备状态监控:实时监控蓝牙设备的连接状态,确保服务的可靠性。
      • +
      +

      2. 数据使用过程中涉及的合作方以及转移、公开个人信息

      +

      2.1数据使用过程中涉及的合作方

      +

      2.1.1原则

      +

      a.合法原则 :与合作方合作过程中涉及数据使用活动的,必须具有合法目的、符合法定的合法性基础。如果合作方使用信息不再符合合法原则,则其不应再使用您的个人信息,或在获得相应合法性基础后再行使用。

      +

      b.正当与最小必要原则 :数据使用必须具有正当目的,且应以达成目的必要为限。

      +

      c.安全审慎原则 :我们将审慎评估合作方使用数据的目的,对这些合作方的安全保障能力进行综合评估,并要求其遵循合作法律协议。我们会对合作方获取信息的软件工具开发包(SDK)、应用程序接口 (API) + 进行严格的安全监测,以保护数据安全。

      +

      2.1.2委托处理

      +

      对于委托处理个人信息的场景,我们会与受托合作方根据法律规定签署相关处理协议,并对其个人信息使用活动进行监督。

      +

      2.1.3共同处理

      +

      对于共同处理个人信息的场景,我们会与合作方根据法律规定签署相关协议并约定各自的权利和义务,确保在使用相关个人信息的过程中遵守法律的相关规定、保护数据安全。

      +

      2.1.4合作方的范围

      +

      若具体功能和场景中涉及由我们的关联方、第三方提供服务,则合作方范围包括我们的关联方与第三方。

      +

      2.1.5实现功能或服务的数据使用

      +

      a.地理位置服务 : 当您使用地理位置相关服务时,位置服务提供商 ( 高德地图 ) 可能会通过 SDK 或相关技术使用您的 GPS + 信息、设备信息以便可以向您返回位置结果。拒绝上述使用仅会影响地理位置服务功能,但不影响其他功能的正常使用。

      +

      b.客户服务 : 为及时处理您的投诉、建议以及其他诉求,客户服务提供商需要使用您的账号及所涉及事件的相关信息,以及时了解、处理和响应相关问题。

      +

      2.1.6实现安全与分析统计的数据使用

      +

      a.保障使用安全 : 我们非常重视账号、服务及内容安全,为保障您和其他用户的账号与财产安全,使您和我们的正当合法权益免受不法侵害,我们的合作方可能会使用必要的设备、账号及日志信息。

      +

      b.分析产品情况 : 为分析我们产品的使用和表现情况,我们的合作方可能需要使用该产品使用情况(崩溃、闪退 ) 、设备标识信息、应用总体安装使用情况等信息。

      +

      c. 为提升相关领域的科研能力,促进科技发展水平,我们在确保数据安全与目的正当的前提下,可能会与合作的科研院所、高校等机构使用去标识化或匿名化的数据。

      +

      2.2 转移

      +

      随着我们业务的持续发展,我们将有可能进行合并、收购、资产转让,您的个人信息有可能因此而被转移。在发生前述变更时,我们将按照法律法规及不低于本隐私政策所载明的安全标准要求继受方继续履行个人信息处理者的义务,若继受方变更原先的处理目的、处理方式的,我们将要求继受方重新征得您的授权同意。 +

      +

      2.3 公开

      +

      a. 我们不会公开您的信息,除非遵循国家法律法规规定或者获得您的同意。我们公开您的个人信息会采用符合行业内标准的安全保护措施。

      +

      b.对违规 账号 、欺诈行为进行处罚公告时,我们会披露相关账号的信息。

      +

      2.4 依法豁免征得同意提供、公开的个人信息

      +

      请您理解,在下列情形中,根据法律法规及国家标准,我们向合作方提供、公开您的个人信息无需征得您的授权同意 :

      +

      a. 为订立、履行您作为一方当事人的合同所必需,或者按照依法制定的劳动规章制度和依法签订的集体合同实施人力资源管理所必需;

      +

      b.为履行法定职责或者法定义务所必需 ;

      +

      c.与国家安全、国防安全直接相关的 ;

      +

      d.与刑事侦查、起诉、审判和判决执行等直接相关的 ;

      +

      e.为应对突发公共卫生事件,或者紧急情况下为保护自然人的生命健康和财产安全所必需 ;

      +

      f. 出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人授权同意的;

      +

      g.为公共利益实施新闻报道、舆论监督等行为 , 在合理的范围内处理个人信息 ;

      +

      h.依照相关法律规定处理您自行公开或者其他已经合法公开的个人信息 ;

      +

      i.从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;

      +

      j.法律、行政法规规定的其他情形。

      +

      2.5 支付

      +

      您授权我们通过指定的付款方式向您收取费用。当您使用Voitrans + app及相关服务涉及交易时,系统将会生成您的交易订单,您需要填写购买人姓名、订单相关手机号码,订单会自动生成您所购买的商品或服务信息、您应支付的货款金额及您选择的支付方式等支付信息,您可能在订单上补充告知相关方的其他信息以方便交易的实现。 +

      +

      当您使用涉及支付的功能时:支付通过合作的第三方支付机构(微信支付苹果支付等)所提供的支付服务完成,第三方支付服务有可能使用生物识别信息用于付款验证,您在使用第三方支付服务的时候请阅读该第三方机构的用户协议、隐私政策,如对于该第三方机构的用户协议、隐私政策不同意的,请您及时停止使用该第三方机构的支付服务。 +

      +

      3. 我们如何存储个人信息

      +

      3.1存储地点

      +

      我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息 存储于中华人民共和国境内。目前,我们不会将上述信息传输至境外,如果我们向境外传输,会严格遵守中国的相关法律、监管政策,并会遵循相关国家规定或者征求您的同意。 +

      +

      3.2 存储期限

      +

      3.2.1 我们仅在为提供Voitrans 服务之目的所必需的期间内保留您的个人信息,例如:

      +

      a. 手机号码: 当您使用手机号码注册登录时,我们需要持续保留您的手机号码,以便于向您提供正常的服务、应对您可能的查询和客诉并保障您的账号和系统安全。

      +

      b.电子邮箱:当您使用电子邮箱注册登录时,我们需要持续保留您的电子邮箱,以便于向您提供正常的服务、应对您可能的查询和客诉并保障您的账号和系统安全。

      +

      c.第三方授权:当您使用其他合作方授权方式登录时,我们会保留您的授权信息,以便您可以持续使用第三方登录方式进行登录,使得我们可以持续为您提供服务。

      +

      c. 您发布的信息、评论、点赞及相关信息,在您未撤回、删除或未注销账号期间,我们会保留相关信息用于向您提供持续的业务功能。

      +

      d. 根据《中华人民共和国网络安全法》、《中华人民共和国电子商务法》相关规定保留您的个人信息。

      +

      3.2.2 + 如果您注销账号、主动删除个人信息或超出必要的期限后,我们将对您的个人信息进行删除或匿名化处理,但以下情况除外:

      +

      a .遵从法律法规有关信息留存的要求;

      +

      b .遵守法院判决、裁定或其他法律程序的规定;

      +

      c. 遵守相关政府机关或法定授权组织的要求;

      +

      d. 出于财务、审计、争议解决等目的需要合理延长期限的。

      +

      4. 我们如何保护个人信息的安全

      +

      4.1 我们非常重视您个人信息的安全,将努力采取合理的安全措施 ( 包括技术方面和管理方面 ) 来保护您的个人信息,防止您提供的个人信息被不当使用或未经授权的情况下被访问、公开披露、使用、修改、损坏、丢失或泄漏。

      +

      4.2 我们会使用不低于行业同行的加密技术、 匿 名化处理及相关合理可行的手段保护您的个人信息,并使用安全保护机制防止您的个人信息遭到恶意攻击。

      +

      4.3 我们会建立专门的安全部门、安全管理制度、数据安全流程保障您的个人信息安全。我们采取严格的数据使用和访问制度,确保只有授权人员才可访问您的个人信息,并适时对数据和技术进行安全审计。

      +

      4.4 + 尽管已经采取了上述合理有效措施,并已经遵守了相关法律规定要求的标准,但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全,我们将尽力确保您提供给我们的个人信息的安全性。 +

      +

      4.5 您知悉并理解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。因此,我们强烈建议您采取积极措施保护个人信息的安全,包括但不限于使用复杂密码、定期修改密码、不将自己的 账号 + 密码及相关个人信息透露给他人。

      +

      4.6 我们会制定应急处理预案,并在发生用户信息安全事件时立即启动应急预案,努力阻止这些安全事件的影响和后果扩大。一 旦 发生用户信息安全事件(泄露、丢失 ) 后,我们将按照法律法规的要求,及时向您告知 : + 安全事件的基本情况和可能的影响,我们已经采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施。我们将及时将事件相关情况以推送通知、邮件、信函、短信及相关形式告知您,难以逐一告知时,我们会采取合理、有效的方式发布公告。同时,我们还将按照相关监管部门要求,上报用户信息安全事件的处置情况。 +

      +

      4.7 您一旦离开Voitrans 平台及相关服务,浏览或使用其他网站、服务及内容资源,我们将没有能力和直接义务保护您在Voitrans + 平台及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用上述软件、网站是否基于Voitrans 平台的链接或引导。

      +

      5. 我们如何管理您的个人信息

      +

      我们非常重视您对个人信息的管理,并尽全力保护您对于您个人信息的查阅、复制、更正、补充、删除、撤回同意授权、注销账号、投诉举报以及设置隐私功能等权利,以使您有能力保障您的隐私和信息安全。

      +

      5.1 改变或撤回授权范围

      +

      5.1.1 改变或撤回敏感权限设置 : + 特定的业务功能和服务将需要您的设备敏感权限才能得以完成,当您改变或撤回敏感权限后,我们无法继续为您提供撤回敏感权限所对应的功能和服务,也不再处理您相应的敏感权限信息。但您撤回敏感权限的决定,不会影响我们此前基于您的授权而开展的个人信息处理。您可以通过 + 更改移动终端的设置 开启或关闭敏感权限。

      +

      5.1.2 改变或撤回授权的信息处理 : + 特定的业务功能和服务将需要您的信息才能得以完成,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的功能和服务,也不再处理您相应的个人信息。但您撤回同意或授权的决定,不会影响我们此前基于您的授权而开展的个人信息处理。 +

      +

      5.2 您的个人信息权利

      +

      5.2.1 查阅个人信息 :

      +

      您可以通过Voitrans APP【个人中心】查阅您的昵称、手机号等个人信息。

      +

      5.2.2 更正个人信息 :

      +

      您可以通过Voitrans APP【个人中心】修改您的昵称 等个人信息 。

      +

      特别提示您注意,出于安全性和身份识别(如号码申诉服务 ) 的考虑,您可能无法自主修改注册时提交的某些初始注册信息。如您确有需要修改该类注册信息,请根据本隐私政策载明的联系方式联系我们。

      +

      除上述外,如果您或其他有权主体对相关法律法规赋予的个人信息权利的行使,有任何主张,要求或者疑问,您可以通过我们预留的联系方式(官网、APP内)与我们联系,我们将尽快审核所涉问题,并在验证您的用户身份后的1 0 个工作日内回复。 +

      +

      5.3 注销 账号

      +

      您可以通过Voitrans APP【设置】 -【个人中心】 - 【注销 账号 】与我们联系申请注销您的账号,我们将会在收到您的申请后及时进行处理,并在1 0 + 个工作日或法律法规要求的时限内回复您的请求。在您注销账号前,我们将验证您的个人身份、安全状态、设备信息等。您知悉并理解,注销账号是不可逆的行为。

      +

      5.4 意见反馈和投诉举报

      +

      您可以按照我们公示的制度进行投诉或举报。如果您有任何意见或您认为您的个人信息权利可能受到侵害,或者发现侵害个人信息权利的线索,您可以通过Voitrans APP【设置】 - 【用户反馈】与我们联系。

      +

      5.5 访问隐私政策

      +

      您可以在Voitrans平台的注册页面,或者在Voitrans APP【设置】 -【个人中心】 - 【 隐私政策 】查看本隐私政策。

      +

      请您了解,本隐私政策中所述的 Voitrans及相关服务可能会根据您所使用的手机型号、系统版本、软件应用程序版本、移动客户端等因素而有所不同。最终的产品和服务以您所使用的Voitrans 软件及相关服务为准。

      +

      6. 停止运营并向您告知

      +

      如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。

      +

      6.1 未成年人通用条款

      +

      a. 若您是已满14周岁但未满 18 周岁的未成年人,在使用Voitrans平台及相关服务前,应在您的父母或其他监护人监护、指导下共同阅读并同意本隐私政策。

      +

      b. 若您是未满 14 周岁的未成年人的监护人,在使用Voitrans 平台及相关服务前,应由您代被监护人阅读并同意本隐私政策。

      +

      c. 我们根据国家相关法律法规的规定保护未成年人的个人信息,只会在法律允许、父母或其他监护人明确同意或保护未成年人所必要的情况下收集、使用或披露未成年人的个人信息 ; + 如果我们发现在未事先获得可证实的父母或其他监护人同意的情况下收集了未成年人的个人信息,则会设法尽快删除相关信息。同时我们建立了严格的儿童信息收集使用规则,以保护儿童个人信息安全。

      +

      d. 若您是未成年人的监护人,当您对您所监护的未成年人的个人信息有相关疑问时,请通过本隐私政策公示的联系方式与我们联系。

      +

      7. 隐私政策的修订和通知

      +

      7.1 为了给您提供更好的服务,Voitrans + 平台及相关服务将不时更新与变化,我们会适时对本隐私政策进行修订,这些修订构成本隐私政策的一部分并具有等同于本隐私政策的效力,未经您明确同意,我们不会削减您依据当前生效的本隐私政策所应享受的权利。

      +

      7.2 本隐私政策更新后,我们会在Voitrans 平台发出更新版本,并在更新后的条款生效前通过官方系统公告或其他适当的方式提醒您更新的内容,以便您及时了解本隐私政策的最新版本。

      +

      8. 联系我们

      +

      8.1 如果您对个人信息保护问题有投诉、建议、疑问,您可以通过Voitrans APP【设置】 - 【用户反馈】与我们联系,我们核查并验证您的用户身份后会及时给您反馈,一般情况下我们将在10个工作日内回复您的请求。

      +

      8.2 如对本隐私政策内容有任何疑问、意见或建议,您可以通过Voitrans APP【设置】 - 【用户反馈】与我们联系。

      +

      9. 第三方信息共享清单

      +

      以下为我们接入的第三方SDK名称、信息获取、使用目的及其隐私协议地址说明,便于您更清楚的了解您的个人信息使用、保护情况:

      +

      9.1 微信登录SDK

      +

      信息获取:设备号、IP地址、设备软件信息、设备识别码(IMEI、Android ID、IDFA、OAID、OPENUDID、GUID、ICCID、SIM 卡 IMSI + 信息、IP、MAC地址)、设备识别符、所在地区、设备相关应用信息以及其他与服务相关的日志信息

      +

      使用目的:订单支付,详情见SDK隐私协议

      +

      使用场景:在用户使用微信登录时使用,详情见SDK隐私协议

      +

      合作方主体:深圳市腾讯计算机系统有限公司

      +

      收集方式:SDK自行采集

      +

      官网链接:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      +

      https://www.tenpay.com/v4/index.html

      +

      隐私协议地址:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      +

      https://www.tenpay.com/v3/helpcenter/low/privacy.shtml

      +

      9.2 高德地图导航SDK

      +

      信息获取:应用名、应用版本号、设备品牌及型号、操作系统、运营商信息、屏幕分辨率、传感器信息(矢量、加速度、压力、方向、地磁 、陀螺、温度、光敏、nema信号)、设备信号强度信息

      +

      使用目的:使用高德地图进行导航

      +

      使用场景:使用高德地图进行导航

      +

      合作方主体: 阿里巴巴云计算(北京)有限公司

      +

      收集方式:SDK自行采集

      +

      隐私协议地址:https://lbs.amap.com/pages/privacy/

      + + + \ No newline at end of file diff --git a/doc/ysxy_en.html b/doc/ysxy_en.html new file mode 100644 index 000000000..cf649e9f0 --- /dev/null +++ b/doc/ysxy_en.html @@ -0,0 +1,1421 @@ + + +

      Release date2025225

      Update date2025225

      Voitrans Software privacy Agreement

      Welcome to useVoitrans Software and Services

      1Voitrans Provided by Saitong Industries Inc. (hereinafter referred to as "the Company"). Can help users achieve Bluetooth devices and other products management. We understand the importance of personal information to our users (hereinafter referred to as "you") and that effective protection of your personal information is the cornerstone of the healthy and sustainable development of our business. Thank you for your use and trust in Voitrans products or services! We are fully aware that this trust does not come easily, we adhere to the principle of openness and transparency, to express to you our rules for processing your personal information, we use legal and legitimate ways and clear and reasonable purposes to process your personal information. Special note: Please be sure to read and understand this Privacy Policy carefully before using our products or services so that you can make appropriate choices.

      2This Privacy Policy explains to you how we collect, use, store and share your personal information when you use Voitrans. Personal information refers to all kinds of information recorded by electronic or other means that can identify a specific natural person or reflect the activities of a specific natural person alone or in combination with other information. Voitrans respects and protects the personal privacy of all users of the service. Except as otherwise provided in this Privacy Policy, Voitrans will not disclose this information to the public or provide it to third parties without your prior permission.

      3When you use a third party's product or service through an App Marketplace product or service, your personal information shall be subject to the third party's privacy policy.

      4Voitrans This Privacy Policy will be updated from time to time. By agreeing to the Voitrans Service Usage Agreement and beginning to use Voitrans, you are deemed to have agreed to all of this Privacy Policy. If you do not agree to this Privacy Policy, please do not use Voitrans Software and Services.

      5In order to analyze and measure the effectiveness of relevant services, we will use and disclose your personal information in accordance with the provisions of this Privacy Policy.

      This Privacy policy will help you understand the following:

      1The information we collect

      2Storage of information

      3Information security

      4How do we use the information we collect

      5Information sharing

      6How do you manage your personal information

      7Application permission description

      8Access third-party SDKS

      9Protection of minors

      10Effective and updated Privacy Policy

      11How to contact us

      The information we collect

      1.Use Voitrans at the beginningWe will start collecting data about your usage of the application

      2. Voitrans may obtain personal information about you from third parties or business partners through lawful means

      3.In order to provide you with better products and services, give you network security during use, maintain the normal operation of products and optimize and improve, the purpose of our information services, after you actively click to agree to this privacy policy, use the information we provide. During the service, in addition to the personal information necessary to ensure the normal operation of the basic functions of the App in accordance with national laws and regulations, we will collect other personal information from you:

      3.1 In order to identify risk users, judge the authenticity of users and prevent cheating in an all-round way, we will read your device information every time you open the software, including: (Device model, device MAC address, device unique identifier (IMEI, AndroidID, Device ID, MEID, UUID, GAID, OAID, IDFA, OpenUDID, GUID, IMSI, CCID, etc.) MEID, serial number, SSID and BSSID of WIFI), read Bluetooth address, operating system version, operating system name, user login account and password information;

      3.2 When you use our products and services, we may collect certain information through network log information or certain programs and software, such information may include: details of the use of products and services, such as the opening time of your application, the length of use, and the address of the page visited; Device event information, such as crashes, system activity, etc., to optimize your device and improve our services;

      3.3 To identify applications where equipment is at risk, provide more secure functional services. Therefore, we need to obtain your application/application installation list in the process to ensure the normal operation of the product and protect the security of the device.

      3.4 In order to analyze the use of application functions by users and determine the authenticity of users, we need to conduct data statistics, and collect the above device information, including device MAC address and device unique identifier, when your device is in use.

      3.5Device signal: the network status of the device you use, WIFI access point information, etc.

      3.6Location Information: We may use GPS, WiFi or other technical means to collect and process information about your location for updating local information, providing content services, etc.

      For more information, please click "Personal Information Collection List".

      1For the more sensitive personal information in the above information, such as user device information (IMEI number, call status and identification number), GPS location information, photo media content and file access rights, we will obtain your consent before collection. For some non-sensitive information, the collection may be default and automatic. You can restrict our collection of relevant information or use of certain permissions from your mobile device by adjusting the Settings option for your mobile device. When you restrict our access to a certain permission, we may not be able to continue to provide you with the corresponding services, and no longer process your corresponding information.

      2We will not collect your ID card number, personal biometric information, bank account number, property information, credit information, health and physiological information and other personal sensitive information.

      3About sensitive permissions: In order to properly use the application functions, the product needs to obtain the following permissions in order to provide functional services related to normal products.

      1Obtain storage read and write permissions

      1How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      2Purpose and scope of use: It is used to scan the resource cache files and thumbnails in the system, load music resources and product pictures. It is displayed on the App interface to facilitate users to view and operate

      2Obtain permission to the application installation list

      1How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      2Purpose and scope of use: When the application needs to use advertising promotion services, the third-party advertising platform, Youmon +SDK, needs to obtain the "app software installation list permission" of the device to prevent the user from pushing the application already owned by the user and improve the user experience.

      3The permission to obtain device status information includes: (Device model, device MAC address, device unique identifier (IMEI, AndroidID, Device ID, MEID, UUID, GAID, OAID, IDFA, OpenUDID, GUID, IMSI, CCID, etc.) MEID, serial number, SSID and BSSID of WIFI, read Bluetooth address), operating system version, operating system name, etc.;

      1How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      2Purpose and Scope of use: When using our application, in order to analyze the user's use of application functions and judge the user's authenticity, we will synchronize the permission to third-party SDKS, including Autonavi SDK, Youmon +SDK, etc.

      4Access to location information

      1How to obtain: pop-up prompts, when the permission is obtained, the user will use this permission only when he actively clicks agree with the application.

      2Purpose and Scope of use: When the application needs to use GPS, WiFi or other functions, the product needs to collect your location and information to search for Bluetooth devices in nearby locations.

      Note: For more application permissions, see this document"Privacy Policy" Section 7 "Application Permission Description"

      Storage of information

      1. Where the information is stored

      The personal information we collect and generate in the People's Republic of China will be stored on our servers and/or those of our affiliates.

      2. Information storage and processing

      We store your personal information only for the period necessary to achieve the purpose or as long as required by law and regulation. After you stop using this product, we will immediately stop collecting and processing your personal information and application data. When the above period is exceeded, we will delete or anonymize the personal information you have provided to us.

      In addition to the necessary functions, Voitrans needs to apply for corresponding system permissions. The server side of the cloud does not store user personal information, and the third-party SDK accessed will be anonymized and de-identified by the service provider (Amu Statistics SDK, Autonavi SDK), so users cannot be tracked. Information stored on the user's phone will be automatically deleted when the user uninstalls Voitrans or clears the cache.

      Information security

      1. Voitrans stores and protects your personal information using industry-standard security measures and technologies, such as authentication, data encryption, restricted data center access and other security measures to ensure that your information is secure from disclosure, alteration and destruction. Despite the aforementioned security measures, please note that no security measure can be 100% secure.

      2. When you use the services provided by Voitrans, please protect your personal information. If you find that your personal information has been compromised, please contact us immediately so that we can take appropriate measures.

      How do we use the information we collect

      1. When implementing application business functions, we may use your personal information to ensure the integrity and security of the products and services we provide to you;

      2. We will understand your usage habits through the collected information, and with the help of data analysis, identify the acceptability of services, your usage habits, etc., in order to test and create new products, functions and services, improve the service level, and help us improve existing services and develop new services;

      3. We may use your personal information for customer surveys about the products and services, for sending notices about the products and services, and for commercial promotion;

      4. We may use your information for internal analysis and research related to the application;

      Information sharing

      At present, we will not actively share or transfer your personal information to third parties outside the company, if there is other sharing or transfer of your personal information, we will directly or confirm that the third party has obtained your express consent to the above behavior.

      We will not publicly disclose the personal information we collect. If it is necessary to publicly disclose it, we will inform you of the purpose of the public disclosure, the type of information disclosed and the sensitive information that may be involved, and obtain your express consent.

      As our business continues to develop, we may engage in mergers, acquisitions, asset transfers and other transactions, and we will inform you of the relevant circumstances, in accordance with laws and regulations and no less than the standards required by this Guide to continue to protect your personal information or require a new controller to continue to protect your personal information.

      In addition, according to relevant laws and regulations and national standards, we may share, transfer and publicly disclose personal information without prior authorization and consent of the personal information subject under the following circumstances:

      1 Directly related to national security and national defense security;

      2 Directly related to public safety, public health or major public interests;

      3 Directly related to criminal investigation, prosecution, trial and execution of judgments;

      4 In order to protect the life, property and other major legitimate rights and interests of the personal data subject or other individuals, but it is difficult to obtain the consent of the person;

      5 Personal information disclosed to the public by the personal information subject;

      6 Collecting personal information from legally publicly disclosed information, such as legitimate news reports, government information disclosure and other channels.

      How do you manage your personal information

      In accordance with the relevant laws, regulations and standards of China, as well as the common practices of other countries and regions, we guarantee that you exercise the following rights to your personal information:

      1.Correct your personal information

      If you find that there is an error in your personal information processed by us, you have the right to correct or update the wrong or incomplete information. If you are unable to operate independently in the account center, you can emailsaitong.voitrans@gmail.comContact us

      2. Delete your personal information

      In the following cases, you may make a request to us to delete your personal information:

      If we process personal information in violation of laws and regulations;

      If we collect and use your personal information without your consent;

      If our processing of personal information violates our agreement with you;

      ¢Ü If you no longer use our products or services;

      ¢Ý If we no longer provide you with products or services.

      Contact us. We will process your request within saitong.voitrans@gmail.comContact us. We will send it to you after receiving it30working days of receipt

      3. Change the scope of your consent

      You can contact us by emailsaitong.voitrans@gmail.comContact us. At your request, we will no longer collect, use or disclose your personal information. Please note that your withdrawal of consent or deletion of your personal information may affect your use of some of our services.

      4 Access and copy personal information

      You may, in accordance with the provisions of the relevant laws, provide yourimei(phone serial number) oroaidOr AndroidIDAfter the account information and other information, you can apply to us for access to and copy your personal information, you can email to3514406195@qq.comGet in touch with us.

      5. In response to your above request

      For security purposes, you may need to provide a written request or otherwise prove your identity. We may ask you to verify your identity before processing your request. For your reasonable request, we will respond and deal with it in a timely manner. We may reject requests that are unnecessarily repetitive, require too much technology (for example, the development of new systems or fundamental changes to existing practices), pose a risk to the legitimate interests of others, or are highly impractical.

      In the following circumstances, according to the requirements of laws and regulations, we will not be able to respond to your request:

      Related to national security and national defense security;

      Related to national security and national defense security;

      In connection with criminal investigation, prosecution and trial;

      ¢Ü There is sufficient evidence that you have subjective malice or abuse of rights;

      ¢Ý Responding to your request will cause serious damage to the legitimate rights and interests of you or other individuals and organizations.

      6.Account cancellation

      User can be inPerform [account cancellation] operation on the APP. Operation steps:

      1Go to the [My] page

      2Click the [Settings] button on the upper right

      3Click [Cancel account] to confirm

      After you log out, the information about the user account is cleared

      Application permission description

      In order to provide better products and services, when you use the software, we will apply for the following rights, when you enter the home page or use the function will request authorization, if you refuse, some of the corresponding functions will not be able to use normally. The specific purposes and reminders of permissions are described in detail as follows:

      1Location rights:

      android.permission.ACCESS_COARSE_LOCATION

      android.permission.ACCESS_FINE_LOCATION

      passWiFi or mobile base station to obtain the user's latitude and longitude location information

      When you useIn Voitrans, we will search for your attached Bluetooth device based on your geographical location. At the same time, in order to provide more stable services, optimize products and improve experience, we will share the above information with three SDKS, such as Youmon and Autonavi, to obtain Voitrans operating data and functional services.

      Reminder mode

      A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance

      2

      android.permission.READ_EXTERNAL_STORAGE

      android.permission.WRITE_EXTERNAL_STORAGE

      This permission is required when you access an application to perform application management functions.

      Reminder method:

      User Agreement and Privacy Policy description.

      3Network permissions:

      android.permission.INTERNET

      When you useThese permissions are required for Voitrans's information services and version upgrade services, and in order to improve the user experience and optimize the service capabilities, third-party SDKS such as Friends will also use these permissions.

      Reminder mode

      User Agreement and Privacy Policy description.

      4Get network status permissions:

      android.permission.ACCESS_NETWORK_STATE

      android.permission.ACCESS_WIFI_STATE

      It is used to obtain whether the current network connection is valid, determine whether the current 4G environment is , and whether to remind the network environment changes, thus affecting the loading of information content. This permission is applied for when you use Voitrans.

      Changes in the state of the network affect the uploading and loading of data. Therefore, the access to network status permission will be shared with friends + and other platforms.

      Reminder method:

      User Agreement and Privacy Policy description.

      5Get task list permissions:

      android.permission.GET_TASKS

      This permission is used to obtain the application list for the software management function. When you use the software management function, you need to read the applications installed on the mobile phone.

      Reminder mode

      User Agreement and Privacy Policy description.

      6Obtain MAC address permission

      android.permission.ACCESS_WIFI_STATE

      android.permission.INTERNET

      android.permission.ACCESS_NETWORK_STATE

      When you use Voitrans, the application will need to obtain MAC address permissions:

      When an application needs to report target conversion data, third-party platforms such as Youmon +SDK need to use MAC.

      Reminder method:

      User Agreement and Privacy Policy description.

      7Obtain permission to record audio

      android.permission.RECORD_AUDIO

      When you use the voice input function of Voitrans, you need to use the permission to record audio, and mainly use the voice input for translation and other related functions.

      Reminder method:

      User Agreement and Privacy Policy description , the user dynamically pops the box when required.

      8Obtain SSID permission for WIFI

      When this permission is used, the app reads the SSID permission for WIFI:

      Scope of use and purpose:

      When the application needs to use data analysis services, third-party platforms such as +SDK need to read the device's "WIFI SSID permission" to provide users with more accurate and effective functional services.

      Reminder method:

      User Agreement and Privacy Policy description.

      9Get Bluetooth access

      When this permission is used, the app reads the Bluetooth permission:

      Scope of use and purpose:

      Bluetooth devices for searching and configuring accessories, such as Bluetooth headsets, Bluetooth watches, etc. Easy for users to manage

      Reminder method:

      A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance

      User Agreement and Privacy Policy description.

      10Get the BSSID permission for WiFi

      When the application needs to distinguish and identify the user to provide functional services and data statistics, it will read the "WiFi BSSID" permission of the device for:

      Scope of use and purpose:

      1Third-party platforms: such as Youmeng SDK, Bugly SDK, Autonavi SDK

      Reminder method:

      User Agreement and Privacy Policy description.

      11Obtain the application installation permission

      android.permission.REQUEST_INSTALL_PACKAGES

      The software will use the application installation permission, which is mainly used to allow users to install a new version and experience new functions when there is a new version.

      Reminder mode

      User Agreement and Privacy Policy description.

      12Get permissions for the camera

      android.permission.CAMERA

      Voitrans uses camera permissions to scan QR codes and bind Bluetooth devices such as Bluetooth headsets and watches.

      Reminder method:

      A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance

      User Agreement and Privacy Policy description.

      Special note:

      1Application integration within their Allies SDK, Scott map SDK in the user agrees to allow after use, application in the background/foreground for ICCID, IMSI, IMEI, SN, ANDROID, BSSID, ANDROID ID, SSID, IMSI and other personal information;

      Remarks: MorePlease see the following SDK-related content and permissions [VIII. Access to third-party SDKS list]

      Access a third partySDK

      1In order to ensure the stable operation and functional realization of our client, so that you can use and enjoy more services and functions, our application will be embedded in the software tool development kit (SDK) or other similar applications of third parties, these third parties will collect and process relevant information in accordance with their own privacy policies, in order to normally provide functions and advertising services. You can learn about the information collection and processing rules of the third party in the following section. We will conduct strict security tests on the development kits (SDKS) for partners to obtain information, in order to protect the reasonable use and security of your personal information. Please note that third-party SDKS may change the data processing types due to their version upgrades. Please refer to the privacy policies published by third-party SDKS. See the details below or click to view the Third Party SDK List.

      1+SDK SDKSDK

      Type of personal information: device identification information and hardware serial number(IMEIAndroid IDIMSIICCIDOAIDSensor information, MAC address), geographic location information, read WIFI SSID and BSSID, read Bluetooth address

      Purpose: For data analysis and reportAPP crash information

      Application scenario: Application data statistics

      Sharing modeSDK active acquisition

      Privacy agreement https://www.umeng.com/page/policy

      2Amap SDK

      Supplier name: Autonavi Software Co., LTD., Beijing Autonavi Technology Co., LTD

      Type of personal information: e.gIP Address, GNSS information, base station information, WiFi status, WiFi parameters, WiFi list, SSID, BSSID, signal strength information, Bluetooth information, sensor information (vector, geomagnetic, acceleration, gyroscope, direction, photosensitivity, pressure, gravity, step counting, step detection), device signal strength information.

      Purpose of use: map service

      Privacy agreementhttps://developer.amap.com/pages/privacy/

      Protection of minors

      Users of our products and services may includeMinors under the age of 18, minor users should seek the advice of their parents or guardians regarding this Privacy Policy before using our products, and use our services or provide your information to us after obtaining the consent of and under the guidance of their parents or guardians. Guardians of minors who have questions may contact us through the contact details in this Privacy Policy.

      If you do not agree to the collection of the aforementioned information by the above third-party service providers, please stop using the Software immediately. During your use of the Software, these third parties will collect and process relevant information in accordance with their own privacy policies to provide some functions, advertising and other services. If the information is leaked due to the collection of the aforesaid information by the relevant third-party service provider, the relevant third-party service provider shall bear the corresponding legal responsibility.

      Effective and updated Privacy Policy

      1. This Privacy policy is effective from the date of publication.

      2. As our business evolves and changes, our Privacy Policy may change. We reserve the right to change our privacy policy at any time, so please check back often. If we make changes to our Privacy Policy, we will post these updates on our website, apps, and where we deem appropriate to keep you informed. If the privacy policy is updated, it will take effect from the date of update. Your continued use of our products or services means that you agree to our changed Privacy Policy.

      Saitong Industries IncEstablished on November 22, 2024, registered address: 18305 E Valley Blvd, Unit C, City of Industry, CA 91744, USA. If you want to know more about our company and platform, you can contact us through the contact information provided in this policy (saitong.voitrans@gmail.com).

       

      \ No newline at end of file From d84b99f0d54d5e83dea13e914f29f923b20cd07d Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Fri, 5 Dec 2025 12:03:44 +0800 Subject: [PATCH 121/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=A4=8D=E5=88=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/timbre/controllers/timbre_controller.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/timbre/controllers/timbre_controller.dart b/lib/modules/timbre/controllers/timbre_controller.dart index 37e71efd9..c5ebcc4b5 100644 --- a/lib/modules/timbre/controllers/timbre_controller.dart +++ b/lib/modules/timbre/controllers/timbre_controller.dart @@ -148,7 +148,7 @@ class TimbreController extends GetxController { // 创建训练任务 Future _addTask() async { - String data = '{"resourceType":"12"}'; + String data = '{"resourceType":"12","engineVersion":"omni_v1"}'; Map sign = _sign(data); final response = await http.post( From cae76b1c167a9aa2df21838077d56ae85176aa8f Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 5 Dec 2025 14:20:51 +0800 Subject: [PATCH 122/177] =?UTF-8?q?docs(=E9=9A=90=E7=A7=81=E6=94=BF?= =?UTF-8?q?=E7=AD=96):=20=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=B8=89=E6=96=B9SDK?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=8F=8A=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新中文和英文隐私政策文档,完善第三方SDK的详细信息,包括: 1. 新增多个高德地图相关SDK说明 2. 补充微信OpenSDK和支付宝SDK的详细信息 3. 更新所有SDK的隐私政策链接 4. 规范文档格式和内容表述 --- doc/ysxy.html | 56 ++++++++++++++++++----- doc/ysxy_en.html | 114 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 153 insertions(+), 17 deletions(-) diff --git a/doc/ysxy.html b/doc/ysxy.html index d8678a529..f384a3ed9 100644 --- a/doc/ysxy.html +++ b/doc/ysxy.html @@ -328,25 +328,57 @@

      8.1 如果您对个人信息保护问题有投诉、建议、疑问,您可以通过Voitrans APP【设置】 - 【用户反馈】与我们联系,我们核查并验证您的用户身份后会及时给您反馈,一般情况下我们将在10个工作日内回复您的请求。

      8.2 如对本隐私政策内容有任何疑问、意见或建议,您可以通过Voitrans APP【设置】 - 【用户反馈】与我们联系。

      9. 第三方信息共享清单

      -

      以下为我们接入的第三方SDK名称、信息获取、使用目的及其隐私协议地址说明,便于您更清楚的了解您的个人信息使用、保护情况:

      -

      9.1 微信登录SDK

      +

      以下为我们接入的第三方SDK名称、开发者信息及其隐私政策链接说明,便于您更清楚地了解您的个人信息使用与保护情况:

      +

      9.1 微信OpenSDK Android

      信息获取:设备号、IP地址、设备软件信息、设备识别码(IMEI、Android ID、IDFA、OAID、OPENUDID、GUID、ICCID、SIM 卡 IMSI 信息、IP、MAC地址)、设备识别符、所在地区、设备相关应用信息以及其他与服务相关的日志信息

      -

      使用目的:订单支付,详情见SDK隐私协议

      -

      使用场景:在用户使用微信登录时使用,详情见SDK隐私协议

      +

      使用目的:微信登录与分享,详情见SDK隐私政策

      +

      使用场景:在用户使用微信登录与分享时使用,详情见SDK隐私政策

      合作方主体:深圳市腾讯计算机系统有限公司

      收集方式:SDK自行采集

      -

      官网链接:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      -

      https://www.tenpay.com/v4/index.html

      -

      隐私协议地址:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      -

      https://www.tenpay.com/v3/helpcenter/low/privacy.shtml

      -

      9.2 高德地图导航SDK

      +

      隐私政策链接:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      +

      9.2 导航SDK

      信息获取:应用名、应用版本号、设备品牌及型号、操作系统、运营商信息、屏幕分辨率、传感器信息(矢量、加速度、压力、方向、地磁 、陀螺、温度、光敏、nema信号)、设备信号强度信息

      使用目的:使用高德地图进行导航

      使用场景:使用高德地图进行导航

      -

      合作方主体: 阿里巴巴云计算(北京)有限公司

      +

      合作方主体:北京高德图强科技有限公司

      收集方式:SDK自行采集

      -

      隐私协议地址:https://lbs.amap.com/pages/privacy/

      +

      隐私政策链接:https://lbs.amap.com/pages/privacy/

      +

      9.3 地图SDK

      +

      信息获取:应用名、应用版本号、设备品牌及型号、操作系统、网络信息、设备信号强度信息等

      +

      使用目的:地图展示与交互

      +

      使用场景:地图相关功能

      +

      合作方主体:北京高德图强科技有限公司

      +

      收集方式:SDK自行采集

      +

      隐私政策链接:https://lbs.amap.com/pages/privacy/

      +

      9.4 定位SDK

      +

      信息获取:位置信息(GPS、Wi-Fi、基站)、设备信息、网络信息等

      +

      使用目的:提供定位服务

      +

      使用场景:位置相关功能

      +

      合作方主体:北京高德图强科技有限公司

      +

      收集方式:SDK自行采集

      +

      隐私政策链接:https://lbs.amap.com/pages/privacy/

      +

      9.5 轻量版地图SDK

      +

      信息获取:应用名、应用版本号、设备信息、网络信息等

      +

      使用目的:地图工具与渲染优化

      +

      使用场景:地图相关工具功能

      +

      合作方主体:北京高德图强科技有限公司

      +

      收集方式:SDK自行采集

      +

      隐私政策链接:https://lbs.amap.com/pages/privacy/

      +

      9.6 APP支付客户端SDK

      +

      信息获取:设备标识、设备信息、软件安装列表、网络信息等(详见官方隐私政策)

      +

      使用目的:支付宝账号登录与调起支付能力

      +

      使用场景:支付相关功能

      +

      合作方主体:支付宝(杭州)信息技术有限公司

      +

      收集方式:SDK自行采集

      +

      隐私政策链接:https://opendocs.alipay.com/open/54/01g6qm#%E6%94%AF%E4%BB%98%E5%AE%9D%20App%20%E6%94%AF%E4%BB%98%E5%AE%A2%E6%88%B7%E7%AB%AF%20SDK%20%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96

      +

      9.7 灯塔 SDK Android

      +

      信息获取:SDK或API版本、应用标识符、应用版本、终端厂商、操作系统版本、语言、时区、网络状态、崩溃与使用日志、IP地址等(详见官方隐私政策)

      +

      使用目的:应用质量与数据上报服务

      +

      使用场景:稳定性监测与性能分析

      +

      合作方主体:深圳市腾讯计算机系统有限公司

      +

      收集方式:SDK自行采集

      +

      隐私政策链接:https://privacy.qq.com/document/preview/a19a8cf4f2354306b137a7db39d32024

      - \ No newline at end of file + diff --git a/doc/ysxy_en.html b/doc/ysxy_en.html index cf649e9f0..9a2f2f258 100644 --- a/doc/ysxy_en.html +++ b/doc/ysxy_en.html @@ -814,12 +814,12 @@ mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;mso-font-kern margin-left:0.0000pt;mso-pagination:widow-orphan;text-align:justify; text-justify:inter-ideograph;">¢Ü If you no longer use our products or services;�� If you no longer use our products or services;

      ¢Ý If we no longer provide you with products or services.�� If we no longer provide you with products or services.

      ¢Ü There is sufficient evidence that you have subjective malice or abuse of rights;�� There is sufficient evidence that you have subjective malice or abuse of rights;

      ¢Ý Responding to your request will cause serious damage to the legitimate rights and interests of you or other individuals and organizations.�� Responding to your request will cause serious damage to the legitimate rights and interests of you or other individuals and organizations.

      Saitong Industries IncEstablished on November 22, 2024, registered address: 18305 E Valley Blvd, Unit C, City of Industry, CA 91744, USA. If you want to know more about our company and platform, you can contact us through the contact information provided in this policy (saitong.voitrans@gmail.com).

       

      \ No newline at end of file +mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"> 

      + + + + + Voitrans Privacy Policy + + + + +

      Voitrans Privacy Policy

      +

      Last Updated: May 27, 2025

      +

      Effective Date: May 27, 2025

      + +

      9. Third-Party SDK Disclosure

      +

      Below are the third-party SDKs we integrate, including SDK name, developer, and privacy policy link, to help you understand how your personal information is used and protected:

      +

      9.1 WeChat OpenSDK Android (com.tencent.mm.opensdk)

      +

      Information Obtained: Device number, IP address, device software information, device identification code (IMEI, Android ID, IDFA, OAID, OPENUDID, GUID, ICCID, SIM card IMSI information, IP, MAC address), device identifier, region, device-related application information, and other service-related log information

      +

      Purpose of Use: WeChat login and sharing

      +

      Developer: Shenzhen Tencent Computer Systems Company Limited

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      +

      9.2 Navigation SDK (com.amap.api.navi)

      +

      Information Obtained: Application name, application version number, device brand and model, operating system, carrier information, screen resolution, sensor information (vector, acceleration, pressure, direction, geomagnetic, gyroscope, temperature, light sensor, NMEA signal), device signal strength information

      +

      Purpose of Use: Navigation using Amap

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      +

      9.3 Map SDK (com.amap.api.maps)

      +

      Information Obtained: Application name, application version, device brand and model, operating system, network information, device signal strength, etc.

      +

      Purpose of Use: Map display and interaction

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      +

      9.4 Location SDK (com.amap.api.location)

      +

      Information Obtained: Location information (GPS, Wi-Fi, base station), device information, network information, etc.

      +

      Purpose of Use: Provide location services

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      +

      9.5 Lite Map SDK (com.amap.api.maps.utils)

      +

      Information Obtained: Application name, application version, device information, network information, etc.

      +

      Purpose of Use: Map tools and rendering optimization

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      +

      9.6 Alipay App Client SDK (com.alipay.sdk)

      +

      Information Obtained: Device identifiers, basic device information, installed software list, and network information (see official privacy policy for details)

      +

      Purpose of Use: Alipay account login and payment invocation

      +

      Developer: Alipay (Hangzhou) Information Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://opendocs.alipay.com/open/54/01g6qm#%E6%94%AF%E4%BB%98%E5%AE%9D%20App%20%E6%94%AF%E4%BB%98%E5%AE%A2%E6%88%B7%E7%AB%AF%20SDK%20%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96

      +

      9.7 Beacon SDK Android (com.tencent.beacon)

      +

      Information Obtained: SDK/API version, platform, timestamp, app identifier, app version, device manufacturer, OS version, locale, timezone, network status (Wi-Fi, etc.), network logs, crash and usage data, IP address, etc. (see official privacy policy for details)

      +

      Purpose of Use: App quality monitoring and data reporting service

      +

      Developer: Shenzhen Tencent Computer Systems Company Limited

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://privacy.qq.com/document/preview/a19a8cf4f2354306b137a7db39d32024

      + + + From 6599c52cbed004b52a13464be8a8088a8ae08828 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 5 Dec 2025 15:34:36 +0800 Subject: [PATCH 123/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E5=92=8C=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E7=89=88=E7=9A=84=E7=BB=93=E6=9E=84=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E9=99=A4=E5=86=97=E4=BD=99=E6=A0=87=E8=AE=B0=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/yhxy_en.html | 855 ++++------------------ doc/ysxy_en.html | 1827 +++++++++------------------------------------- 2 files changed, 476 insertions(+), 2206 deletions(-) diff --git a/doc/yhxy_en.html b/doc/yhxy_en.html index d2f2183e1..ad7ceffe5 100644 --- a/doc/yhxy_en.html +++ b/doc/yhxy_en.html @@ -1,730 +1,151 @@ - - -
      + + +
      +
      English(US)
      -@font-face{ -font-family:"ËÎÌå"; -} +

      Voitrans Application User Protocol

      -@font-face{ -font-family:"Wingdings"; -} +

      These Terms and Conditions of Use tell you how to access using the Voitrans Application and online services (the "Services"). Saitong Industries Inc. (hereinafter referred to as "Saitong") hereby reminds users to carefully read and fully understand this User Agreement (hereinafter referred to as the "Agreement"). Users should carefully read and fully understand the terms of this Agreement. Please read carefully and choose to accept or not accept this Agreement. Your use of Voitrans APP (hereinafter referred to as "the APP" or" the Software ") will be deemed as acceptance of this Agreement and you agree to be bound by the terms of this Agreement. If you do not agree to this Agreement, do not use the APP.

      +

      Saitong reserves the right to amend this Agreement, and the updated terms of the Agreement will be published in this APP, effective from the date of publication.

      -@font-face{ -font-family:"Calibri"; -} +

      1. General rules

      +

      1.1 This APP is the software provided by Saitong for connecting the headset products released by Saitong and its partner companies. The ownership and operation rights of the software and related services are all owned by Saitong.

      +

      1.2 This Agreement is an agreement between you (hereinafter referred to as the "User") and the company and its partners and operating partners (hereinafter referred to as the "Partners") regarding the user's use of the APP and related services.

      +

      1.3 The Software and services include:

      +

      1.3.1 The software provided provides Voitrans users with Voitrans connection and binding, function setting management and other software services, subject to the actual software services provided by the APP.

      +

      1.3.2 Updates, upgrades and other services of the software.

      -@font-face{ -font-family:"΢ÈíÑźÚ"; -} +

      2. Scope of software license

      +

      2.1 We grant the user a personal, non-transferable, non-sublicensable, and non-exclusive license to the Software.

      +

      2.2 Users can install, use, display and run the software on a single mobile terminal device for non-commercial purposes. However, the user shall not install, use or run the software for commercial operation purposes, copy, change, modify, connect or run the software or the data released into the memory of any terminal device during the operation of the software or the interaction data between the client and the server during the operation of the software, or create any derivative works. This includes, but is not limited to, the use of plug-ins, plug-ins, or unauthorized third-party tools/services to access the Software and related systems. For commercial sale, reproduction and distribution, such as software pre-installation and bundling, written authorization and permission must be obtained from the idea.

      +

      2.3 The User shall not install the Software on other terminal devices without the express permission of the Creator, including but not limited to TVS, digital set-top boxes, game consoles and other devices.

      +

      2.4 Except as expressly authorized by this Agreement, no other rights are granted to the User, and the User shall obtain the written consent of the User to use other rights.

      -p.MsoNormal{ -mso-style-name:ÕýÎÄ; -mso-style-parent:""; -margin:0pt; -margin-bottom:.0001pt; -mso-pagination:none; -text-align:justify; -text-justify:inter-ideograph; -font-family:Calibri; -mso-fareast-font-family:ËÎÌå; -mso-bidi-font-family:'Times New Roman'; -font-size:10.5000pt; -mso-font-kerning:1.0000pt; -} +

      3. Software upgrade

      +

      3.1 The user must select the software version suitable for the setup of the installed terminal. Otherwise, software problems, device problems or damage caused by any software version not suitable for the device type shall be solely the responsibility of the user.

      +

      3.2 In order to improve the user experience and improve the service content, Saitong has the right to provide you with replacement, modification and upgrade versions of the software from time to time. The "Upgrade prompt" function is enabled for users by default. Depending on the different software versions used by users, Saitong provides users with the option to activate this function. After the release of a new version of the software, Saitong does not guarantee the continued availability of the old version of the software.

      -h2{ -mso-style-name:"±êÌâ 2"; -mso-style-noshow:yes; -mso-style-next:ÕýÎÄ; -margin-top:5.0000pt; -margin-bottom:5.0000pt; -mso-margin-top-alt:auto; -mso-margin-bottom-alt:auto; -mso-pagination:widow-orphan; -text-align:left; -font-family:ËÎÌå; -font-weight:bold; -font-size:18.0000pt; -} +

      4. Usage specification

      +

      4.1 Users may use the Software and Services in accordance with this Agreement under the premise of abiding by the law and this Agreement, and users shall not perform the following acts:

      +

      4.1.1 Delete all copyright information on the Software and other copies, and modify, delete or circumvent the technical measures set up by the Software to protect intellectual property rights.

      +

      4.1.2 Reverse engineering the Software, such as disassembly, decompilation, or other attempts to obtain the source code of the Software.

      +

      4.1.3 By modifying or falsifying instructions and data in the operation of the software, increasing, deleting or changing the function or operation effect of the software, or software or methods to be used for the above purposes to operate or disseminate to the public, regardless of whether these acts are for commercial purposes.

      +

      4.1.4 Use the software for any behavior that jeopardizes network security, including but not limited to: using unauthorized data or accessing unauthorized servers/accounts; Access public networks or other operating systems without permission and delete, modify or add stored information; Unauthorized attempts to probe, scan, or test the weaknesses of the system or network of the software or other acts that undermine network security; Attempts to interfere with or destroy the normal operation of the software system or website, intentionally spread malicious programs or viruses, and other acts that disrupt normal network information services; Forge TCP/IP packet names or partial names.

      +

      4.1.6 Without the written consent of the Company, the user arbitrarily performs the following acts on the software and the information in it, including but not limited to: using, renting, lending, copying, modifying, linking, reprinting, compiling, publishing, publishing, establishing mirror sites, developing derivative products, works, services, plug-ins, plug-ins, compatibility, interconnection, etc., with the help of the Software.

      +

      4.1.7 Use the Software to publish, transmit, distribute, and store content that violates your local laws.

      +

      4.1.8 Use the software to publish, transmit, disseminate, and store content that infringes others' intellectual property rights, trade secrets, and other legitimate rights.

      +

      4.1.9 Use this software to publish, transmit and disseminate advertising information and junk information in bulk.

      +

      4.1.10 Use the Software and other Services in any unlawful manner, for any unlawful purpose, or in any manner inconsistent with the licensed use of this Agreement.

      +

      4.2 Information release specification

      +

      4.2.1 If you use the software to publish information content (if any), you should guarantee that you own the intellectual property rights of the information content uploaded by you or have obtained legal authorization, and any behavior of you using the software and services does not infringe on the legitimate rights and interests of any third party.

      +

      4.2.2 When using the Software, the user shall not use the Software to engage in the following activities, including but not limited to:

      +

      4.2.2.1 Create, copy, publish, disseminate, and store content that violates local national laws and regulations.

      +

      4.2.2.2 Publish, transmit, disseminate, and store content that infringes others' legal rights such as reputation, portrait, intellectual property, and trade secrets.

      +

      4.2.2.3 Fabricate facts, conceal the truth in order to mislead or deceive others.

      +

      4.2.2.4 Publish, transmit and disseminate advertising information and junk information.

      +

      4.2.2.5 Engaging in other acts in violation of local laws and regulations.

      +

      4.2.3 You may not carry out any commercial activities such as advertising and selling goods in the Software without the permission of the Company.

      +

      4.3 The User understands and agrees that:

      +

      4.3.1 Saitong will determine whether the user is suspected of violating the above specifications of use, and according to the results of the determination, suspend or terminate your license to use or take other restrictive measures that can be taken in accordance with this agreement.

      +

      4.3.2 For the user's use of the licensed software published suspected of illegal or suspected infringement of the legal rights of others or violation of this Agreement, the information will be directly deleted.

      +

      4.3.3 If the user's violation of the above rules of use causes damage to third parties, you need to bear legal responsibility independently in your own name, and you should ensure that the idea is free from losses or increased costs.

      +

      4.3.4 If the user violates the relevant legal provisions or agreements, causing the Saitong to suffer losses, or is subject to third-party claims, or is punished by the administrative authority, the user shall compensate the loss and/or expenses caused by the Saitong, including reasonable attorney fees, investigation and evidence collection costs.

      -h3{ -mso-style-name:"±êÌâ 3"; -mso-style-noshow:yes; -mso-style-next:ÕýÎÄ; -margin-top:5.0000pt; -margin-bottom:5.0000pt; -mso-margin-top-alt:auto; -mso-margin-bottom-alt:auto; -mso-pagination:widow-orphan; -text-align:left; -font-family:ËÎÌå; -font-weight:bold; -font-size:13.5000pt; -} +

      5. Third-party service description

      +

      5.1 The user understands and agrees that the software system may contain services provided by affiliates of the Company or third parties, and that the Company only provides relevant functional modules in the system for the convenience of users and provides access to third-party services.

      +

      5.2 Whether the third-party services are preset in the software system services, or are opened or ordered by users themselves, users understand and agree that Saitong does not make any express or implied guarantee or guarantee of the legality and effectiveness of the third-party service providers or users, as well as the legality, accuracy, effectiveness and security of the third-party services.

      +

      5.3 The company does not supervise, control or provide any warranty or guarantee of any kind for, or assume any liability for, third party services.

      +

      5.4 Any dispute or dispute between the user and the third party service provider shall be resolved by the User and the third party in accordance with the business process and business norms of the third party service provider, and the company shall not assume any responsibility.

      -span.10{ -font-family:'Times New Roman'; -} +

      6. Privacy Policy and Protection of Personal Information

      +

      6.1 Saitong is committed to protecting the privacy of users in accordance with the privacy policy, please see: Voitrans applies Privacy Policy.

      -p.p{ -mso-style-name:"ÆÕͨ\(Íøվ\)"; -margin:0pt; -margin-bottom:.0001pt; -mso-pagination:none; -text-align:justify; -text-justify:inter-ideograph; -font-family:Calibri; -mso-fareast-font-family:ËÎÌå; -mso-bidi-font-family:'Times New Roman'; -font-size:12.0000pt; -mso-font-kerning:1.0000pt; -} +

      7. Liability for breach

      +

      7.1 Saitong has the right to judge whether the user's behavior complies with the provisions of this Agreement. If it is believed that the User has violated relevant laws and regulations or the provisions of this Agreement and relevant rules, according to the severity of the user's violation, Saitong has the right to delete the illegal information, restrict, suspend, terminate the user's use of the Software service, pursue the user's legal liability and take other measures that Saitong deems appropriate. If we suffer any loss (including but not limited to receiving any third party claims or penalties from any administrative department), the User shall be fully liable.

      -span.msoIns{ -mso-style-type:export-only; -mso-style-name:""; -text-decoration:underline; -text-underline:single; -color:blue; -} +

      8. Service Risks and Disclaimers

      +

      8.1 We want to provide service support with current technology. Saitong does not warrant that the Software Service will operate without interruption or error, that all defects of the Software Service will be corrected, or that the Software Service will meet all requirements of users. The resulting consequences, the Saitong does not assume any responsibility.

      +

      8.2 All losses suffered by the user due to third parties such as communication line failure, technical problems, network, computer terminal equipment failure, system instability and other force majeure causes shall not be held liable.

      +

      8.3 Saitong does not guarantee the legality, authenticity, accuracy and effectiveness of the information content obtained through the software (including but not limited to the third party service content), and Saitong does not assume any responsibility for the results of any behavior made by users based on query and viewing.

      +

      8.4 The software, like most Internet software, is affected by differences in factors including but not limited to user reasons, network service quality, social environment and other factors, and may be subjected to various security problems, such as others using user information, resulting in harassment in real life; Other software downloaded and installed by users or other websites visited by users contain viruses such as "Trojan horses", which threaten the security of users' terminal equipment information and data, and then affect the normal use of the software. Users should strengthen the awareness of information security and user data protection, and pay attention to strengthen password protection to avoid loss and harassment.

      +

      8.5 When users use the Software or require Saitong to provide specific services, the Software may call third-party systems or third-party software to support users' use or access, and the results of use or access are provided by the third party. In addition to complying with the relevant rules of this Agreement, users shall also comply with the agreements and relevant rules of the third party. Users must understand and agree that, when using third-party services, third parties may read user data, and Saitong does not guarantee the safety, accuracy, effectiveness and other uncertain risks of the results achieved through third-party systems or third-party software support, users should exercise careful judgment, and Saitong does not assume any responsibility for any disputes and damages caused by this.

      +

      8.6 In order to guarantee the autonomy of the company's business development and adjustment, the company may modify or interrupt the service at any time after taking a reasonable way to notify the user.

      +

      8.7 Except as expressly provided by laws and regulations, Saitong will make its best efforts to ensure that the software and the technology and information involved are safe, effective, accurate and reliable, but limited by the existing technology, the user understands that Saitong cannot guarantee this.

      +

      8.8 Compensation for personal injury or incidental and indirect economic damage caused by or in connection with any of the following circumstances, including but not limited to loss of profits, loss of data, damages for business interruption or other business damages or losses, shall be borne by the User:

      +

      1) Use or failure to use the licensed software.

      +

      2) Unauthorized use of the software or alteration of user data by third parties.

      +

      3) Expenses and losses incurred by the user's actions with the software.

      +

      4) User misconceptions about the software.

      +

      5) Any other loss related to the software that is not attributable to Saitong causes.

      +

      8.9 The User agrees that the Company has the right to suspend, interrupt or terminate all or part of the Service to the user based on the requirements of the judicial, regulatory and supervisory authorities or its own business reasons. Saitong accepts no responsibility for this.

      +

      8.10 The User understands and agrees that the Company will use its commercially reasonable efforts to ensure the security of data storage in the Software and Services, but the company cannot provide a complete guarantee, and the User understands that the Company is not responsible for the deletion or storage or backup failure of data in the Service.

      +

      8.11 To the fullest extent permitted by law, the Developer or Supplier shall not be liable for any direct, indirect, incidental, special or consequential damages arising from the use of the Application. If the user has further needs, please go to the regular hospital for in-depth testing.

      -span.msoDel{ -mso-style-type:export-only; -mso-style-name:""; -text-decoration:line-through; -color:red; -} +

      9. Intellectual property statement

      +

      9.1 Saitong is the intellectual property right holder of this software. All Copyrights, trademarks, patents, trade secrets and other intellectual property rights of the software, as well as all information content related to the software (including but not limited to text, pictures, audio, video, graphics, interface design, layout frame, relevant data or electronic documents, etc.) are protected by local laws and regulations and corresponding international treaties.

      +

      9.2 Without the written consent of the Company, the User shall not implement, utilize or transfer the above intellectual property rights for any commercial or non-commercial purpose, or permit any third party, and the Company reserves the right to pursue the legal responsibility for the above acts.

      -table.MsoNormalTable{ -mso-style-name:ÆÕͨ±í¸ñ; -mso-style-parent:""; -mso-style-noshow:yes; -mso-tstyle-rowband-size:0; -mso-tstyle-colband-size:0; -mso-padding-alt:0.0000pt 5.4000pt 0.0000pt 5.4000pt; -mso-para-margin:0pt; -mso-para-margin-bottom:.0001pt; -mso-pagination:widow-orphan; -font-family:'Times New Roman'; -font-size:10.0000pt; -mso-ansi-language:#0400; -mso-fareast-language:#0400; -mso-bidi-language:#0400; -} -@page{mso-page-border-surround-header:no; - mso-page-border-surround-footer:no;}@page Section0{ -margin-top:72.0000pt; -margin-bottom:72.0000pt; -margin-left:90.0000pt; -margin-right:90.0000pt; -size:595.3000pt 841.9000pt; -layout-grid:15.6000pt; -mso-header-margin:42.5500pt; -mso-footer-margin:49.6000pt; -} -div.Section0{page:Section0;}

      English£¨US£© 

      Voitrans Application User Protocol

      These Terms and Conditions of Use tell you how to access using the Voitrans Application and online services (the "Services"). Saitong Industries Inc. (hereinafter referred to as "Saitong") hereby reminds users to carefully read and fully understand this User Agreement (hereinafter referred to as the "Agreement"). Users should carefully read and fully understand the terms of this Agreement. Please read carefully and choose to accept or not accept this Agreement. Your use of Voitrans APP (hereinafter referred to as "the APP" or" the Software ") will be deemed as acceptance of this Agreement and you agree to be bound by the terms of this Agreement. If you do not agree to this Agreement, do not use the APP.Saitong reserves the right to amend this Agreement, and the updated terms of the Agreement will be published in this APP, effective from the date of publication.

      һ¡¢General rules

      1.1 This APP is the software provided by Saitong for connecting the headset products released by Saitong and its partner companies. The ownership and operation rights of the software and related services are all owned by Saitong.

      1.2 This Agreement is an agreement between you (hereinafter referred to as the "User") and the company and its partners and operating partners (hereinafter referred to as the "Partners") regarding the user's use of the APP and related services.

      1.3 The Software and services include:

      1.3.1 The software provided provides Voitrans users with Voitrans connection and binding, function setting management and other software services, subject to the actual software services provided by the APP.

      1.3.2 Updates, upgrades and other services of the software.

      ¶þ¡¢Scope of software license

      2.1 We grant the user a personal, non-transferable, non-sublicensable, and non-exclusive license to the Software.

      2.2 Users can install, use, display and run the software on a single mobile terminal device for non-commercial purposes. However, the user shall not install, use or run the software for commercial operation purposes, copy, change, modify, connect or run the software or the data released into the memory of any terminal device during the operation of the software or the interaction data between the client and the server during the operation of the software, or create any derivative works. This includes, but is not limited to, the use of plug-ins, plug-ins, or unauthorized third-party tools/services to access the Software and related systems. For commercial sale, reproduction and distribution, such as software pre-installation and bundling, written authorization and permission must be obtained from the idea.

      2.3 The User shall not install the Software on other terminal devices without the express permission of the Creator, including but not limited to TVS, digital set-top boxes, game consoles and other devices.

      2.4 Except as expressly authorized by this Agreement, no other rights are granted to the User, and the User shall obtain the written consent of the User to use other rights.

      Èý¡¢Software upgrade

      3.1 The user must select the software version suitable for the setup of the installed terminal. Otherwise, software problems, device problems or damage caused by any software version not suitable for the device type shall be solely the responsibility of the user.

      3.2 In order to improve the user experience and improve the service content, Saitong has the right to provide you with replacement, modification and upgrade versions of the software from time to time. The "Upgrade prompt" function is enabled for users by default. Depending on the different software versions used by users, Saitong provides users with the option to activate this function. After the release of a new version of the software, Saitong does not guarantee the continued availability of the old version of the software.

      Ëġ¢Usage specification

      4.1 Users may use the Software and Services in accordance with this Agreement under the premise of abiding by the law and this Agreement, and users shall not perform the following acts:

      4.1.1 Delete all copyright information on the Software and other copies, and modify, delete or circumvent the technical measures set up by the Software to protect intellectual property rights.

      4.1.2 Reverse engineering the Software, such as disassembly, decompilation, or other attempts to obtain the source code of the Software.

      4.1.3 By modifying or falsifying instructions and data in the operation of the software, increasing, deleting or changing the function or operation effect of the software, or software or methods to be used for the above purposes to operate or disseminate to the public, regardless of whether these acts are for commercial purposes.

      4.1.4 Use the software for any behavior that jeopardizes network security, including but not limited to: using unauthorized data or accessing unauthorized servers/accounts; Access public networks or other operating systems without permission and delete, modify or add stored information; Unauthorized attempts to probe, scan, or test the weaknesses of the system or network of the software or other acts that undermine network security; Attempts to interfere with or destroy the normal operation of the software system or website, intentionally spread malicious programs or viruses, and other acts that disrupt normal network information services; Forge TCP/IP packet names or partial names.

      4.1.6 Without the written consent of the Company, the user arbitrarily performs the following acts on the software and the information in it, including but not limited to: using, renting, lending, copying, modifying, linking, reprinting, compiling, publishing, publishing, establishing mirror sites, developing derivative products, works, services, plug-ins, plug-ins, compatibility, interconnection, etc., with the help of the Software.

      4.1.7 Use the Software to publish, transmit, distribute, and store content that violates your local laws.

      4.1.8 Use the software to publish, transmit, disseminate, and store content that infringes others' intellectual property rights, trade secrets, and other legitimate rights.

      4.1.9 Use this software to publish, transmit and disseminate advertising information and junk information in bulk.

      4.1.10 Use the Software and other Services in any unlawful manner, for any unlawful purpose, or in any manner inconsistent with the licensed use of this Agreement.

      4.2 Information release specification

      4.2.1 If you use the software to publish information content (if any), you should guarantee that you own the intellectual property rights of the information content uploaded by you or have obtained legal authorization, and any behavior of you using the software and services does not infringe on the legitimate rights and interests of any third party.

      4.2.2 When using the Software, the user shall not use the Software to engage in the following activities, including but not limited to:

      4.2.2.1 Create, copy, publish, disseminate, and store content that violates local national laws and regulations.

      4.2.2.2 Publish, transmit, disseminate, and store content that infringes others' legal rights such as reputation, portrait, intellectual property, and trade secrets.

      4.2.2.3 Fabricate facts, conceal the truth in order to mislead or deceive others.

      4.2.2.4 Publish, transmit and disseminate advertising information and junk information.

      4.2.2.5 Engaging in other acts in violation of local laws and regulations.

      4.2.3 You may not carry out any commercial activities such as advertising and selling goods in the Software without the permission of the Company.

      4.3 The User understands and agrees that:

      4.3.1 Saitong will determine whether the user is suspected of violating the above specifications of use, and according to the results of the determination, suspend or terminate your license to use or take other restrictive measures that can be taken in accordance with this agreement.

      4.3.2 For the user's use of the licensed software published suspected of illegal or suspected infringement of the legal rights of others or violation of this Agreement, the information will be directly deleted.

      4.3.3 If the user's violation of the above rules of use causes damage to third parties, you need to bear legal responsibility independently in your own name, and you should ensure that the idea is free from losses or increased costs.

      4.3.4 If the user violates the relevant legal provisions or agreements, causing the Saitong to suffer losses, or is subject to third-party claims, or is punished by the administrative authority, the user shall compensate the loss and/or expenses caused by the Saitong, including reasonable attorney fees, investigation and evidence collection costs.

      Î塢Third-party service description

      5.1 The user understands and agrees that the software system may contain services provided by affiliates of the Company or third parties, and that the Company only provides relevant functional modules in the system for the convenience of users and provides access to third-party services.

      5.2 Whether the third-party services are preset in the software system services, or are opened or ordered by users themselves, users understand and agree that Saitong does not make any express or implied guarantee or guarantee of the legality and effectiveness of the third-party service providers or users, as well as the legality, accuracy, effectiveness and security of the third-party services.

      5.3 The company does not supervise, control or provide any warranty or guarantee of any kind for, or assume any liability for, third party services.

      5.4 Any dispute or dispute between the user and the third party service provider shall be resolved by the User and the third party in accordance with the business process and business norms of the third party service provider, and the company shall not assume any responsibility.

      Áù¡¢Privacy Policy and Protection of Personal Information

      6.1 Saitong is committed to protecting the privacy of users in accordance with the privacy policy, please see:¡¶Voitrans applies Privacy Policy¡·¡£

      Æߡ¢Liability for breach

      7.1 Saitong has the right to judge whether the user's behavior complies with the provisions of this Agreement. If it is believed that the User has violated relevant laws and regulations or the provisions of this Agreement and relevant rules, according to the severity of the user's violation, Saitong has the right to delete the illegal information, restrict, suspend, terminate the user's use of the Software service, pursue the user's legal liability and take other measures that Saitong deems appropriate. If we suffer any loss (including but not limited to receiving any third party claims or penalties from any administrative department), the User shall be fully liable.

      °ˡ¢Service Risks and Disclaimers

      8.1 We want to provide service support with current technology. Saitong does not warrant that the Software Service will operate without interruption or error, that all defects of the Software Service will be corrected, or that the Software Service will meet all requirements of users. The resulting consequences, the Saitong does not assume any responsibility.

      8.2 All losses suffered by the user due to third parties such as communication line failure, technical problems, network, computer terminal equipment failure, system instability and other force majeure causes shall not be held liable.

      8.3 Saitong does not guarantee the legality, authenticity, accuracy and effectiveness of the information content obtained through the software (including but not limited to the third party service content), and Saitong does not assume any responsibility for the results of any behavior made by users based on query and viewing.

      8.4 The software, like most Internet software, is affected by differences in factors including but not limited to user reasons, network service quality, social environment and other factors, and may be subjected to various security problems, such as others using user information, resulting in harassment in real life; Other software downloaded and installed by users or other websites visited by users contain viruses such as "Trojan horses", which threaten the security of users' terminal equipment information and data, and then affect the normal use of the software. Users should strengthen the awareness of information security and user data protection, and pay attention to strengthen password protection to avoid loss and harassment.

      8.5 When users use the Software or require Saitong to provide specific services, the Software may call third-party systems or third-party software to support users' use or access, and the results of use or access are provided by the third party. In addition to complying with the relevant rules of this Agreement, users shall also comply with the agreements and relevant rules of the third party. Users must understand and agree that, when using third-party services, third parties may read user data, and Saitong does not guarantee the safety, accuracy, effectiveness and other uncertain risks of the results achieved through third-party systems or third-party software support, users should exercise careful judgment, and Saitong does not assume any responsibility for any disputes and damages caused by this.

      8.6 In order to guarantee the autonomy of the company's business development and adjustment, the company may modify or interrupt the service at any time after taking a reasonable way to notify the user.

      8.7 Except as expressly provided by laws and regulations, Saitong will make its best efforts to ensure that the software and the technology and information involved are safe, effective, accurate and reliable, but limited by the existing technology, the user understands that Saitong cannot guarantee this.

      8.8 Compensation for personal injury or incidental and indirect economic damage caused by or in connection with any of the following circumstances, including but not limited to loss of profits, loss of data, damages for business interruption or other business damages or losses, shall be borne by the User:

      £¨1£©Use or failure to use the licensed software.

      £¨2£©Unauthorized use of the software or alteration of user data by third parties.

      £¨3£©Expenses and losses incurred by the user's actions with the software.

      £¨4£©User misconceptions about the software.

      £¨5£©Any other loss related to the software that is not attributable to Saitong causes.

      8.9 The User agrees that the Company has the right to suspend, interrupt or terminate all or part of the Service to the user based on the requirements of the judicial, regulatory and supervisory authorities or its own business reasons. Saitong accepts no responsibility for this.

      8.10 The User understands and agrees that the Company will use its commercially reasonable efforts to ensure the security of data storage in the Software and Services, but the company cannot provide a complete guarantee, and the User understands that the Company is not responsible for the deletion or storage or backup failure of data in the Service.

      8.11 To the fullest extent permitted by law, the Developer or Supplier shall not be liable for any direct, indirect, incidental, special or consequential damages arising from the use of the Application. If the user has further needs, please go to the regular hospital for in-depth testing.

      ¾š¢Intellectual property statement

      9.1 Saitong is the intellectual property right holder of this software. All Copyrights, trademarks, patents, trade secrets and other intellectual property rights of the software, as well as all information content related to the software (including but not limited to text, pictures, audio, video, graphics, interface design, layout frame, relevant data or electronic documents, etc.) are protected by local laws and regulations and corresponding international treaties.

      9.2 Without the written consent of the Company, the User shall not implement, utilize or transfer the above intellectual property rights for any commercial or non-commercial purpose, or permit any third party, and the Company reserves the right to pursue the legal responsibility for the above acts.

      ʮ¡¢Protocol change

      10.1 Saitong has the right to modify the terms of this Agreement when necessary. Once the terms of the Agreement are changed, the revised terms of the Agreement will be published on the relevant page. If you do not agree with the changed content, the user should take the initiative to cancel this service. If the User continues to use the Services, it is deemed to accept the changes in the terms of the Agreement.

      10.2 Saitong reserves the right to modify or change the paid services, charging standards, charging methods, service fees and terms of service provided as necessary. When providing services, we may charge certain fees to users of some services now or in the future. If users refuse to pay such fees, they cannot continue to use the relevant services after the start of the fees.

       

      \ No newline at end of file +

      10. Protocol change

      +

      10.1 Saitong has the right to modify the terms of this Agreement when necessary. Once the terms of the Agreement are changed, the revised terms of the Agreement will be published on the relevant page. If you do not agree with the changed content, the user should take the initiative to cancel this service. If the User continues to use the Services, it is deemed to accept the changes in the terms of the Agreement.

      +

      10.2 Saitong reserves the right to modify or change the paid services, charging standards, charging methods, service fees and terms of service provided as necessary. When providing services, we may charge certain fees to users of some services now or in the future. If users refuse to pay such fees, they cannot continue to use the relevant services after the start of the fees.

      +
      + + diff --git a/doc/ysxy_en.html b/doc/ysxy_en.html index 9a2f2f258..c6fa999bd 100644 --- a/doc/ysxy_en.html +++ b/doc/ysxy_en.html @@ -1,1525 +1,374 @@ - - -

      Release date2025225

      Update date2025225

      Voitrans Software privacy Agreement

      Welcome to useVoitrans Software and Services

      1Voitrans Provided by Saitong Industries Inc. (hereinafter referred to as "the Company"). Can help users achieve Bluetooth devices and other products management. We understand the importance of personal information to our users (hereinafter referred to as "you") and that effective protection of your personal information is the cornerstone of the healthy and sustainable development of our business. Thank you for your use and trust in Voitrans products or services! We are fully aware that this trust does not come easily, we adhere to the principle of openness and transparency, to express to you our rules for processing your personal information, we use legal and legitimate ways and clear and reasonable purposes to process your personal information. Special note: Please be sure to read and understand this Privacy Policy carefully before using our products or services so that you can make appropriate choices.

      2This Privacy Policy explains to you how we collect, use, store and share your personal information when you use Voitrans. Personal information refers to all kinds of information recorded by electronic or other means that can identify a specific natural person or reflect the activities of a specific natural person alone or in combination with other information. Voitrans respects and protects the personal privacy of all users of the service. Except as otherwise provided in this Privacy Policy, Voitrans will not disclose this information to the public or provide it to third parties without your prior permission.

      3When you use a third party's product or service through an App Marketplace product or service, your personal information shall be subject to the third party's privacy policy.

      4Voitrans This Privacy Policy will be updated from time to time. By agreeing to the Voitrans Service Usage Agreement and beginning to use Voitrans, you are deemed to have agreed to all of this Privacy Policy. If you do not agree to this Privacy Policy, please do not use Voitrans Software and Services.

      5In order to analyze and measure the effectiveness of relevant services, we will use and disclose your personal information in accordance with the provisions of this Privacy Policy.

      This Privacy policy will help you understand the following:

      1The information we collect

      2Storage of information

      3Information security

      4How do we use the information we collect

      5Information sharing

      6How do you manage your personal information

      7Application permission description

      8Access third-party SDKS

      9Protection of minors

      10Effective and updated Privacy Policy

      11How to contact us

      The information we collect

      1.Use Voitrans at the beginningWe will start collecting data about your usage of the application

      2. Voitrans may obtain personal information about you from third parties or business partners through lawful means

      3.In order to provide you with better products and services, give you network security during use, maintain the normal operation of products and optimize and improve, the purpose of our information services, after you actively click to agree to this privacy policy, use the information we provide. During the service, in addition to the personal information necessary to ensure the normal operation of the basic functions of the App in accordance with national laws and regulations, we will collect other personal information from you:

      3.1 In order to identify risk users, judge the authenticity of users and prevent cheating in an all-round way, we will read your device information every time you open the software, including: (Device model, device MAC address, device unique identifier (IMEI, AndroidID, Device ID, MEID, UUID, GAID, OAID, IDFA, OpenUDID, GUID, IMSI, CCID, etc.) MEID, serial number, SSID and BSSID of WIFI), read Bluetooth address, operating system version, operating system name, user login account and password information;

      3.2 When you use our products and services, we may collect certain information through network log information or certain programs and software, such information may include: details of the use of products and services, such as the opening time of your application, the length of use, and the address of the page visited; Device event information, such as crashes, system activity, etc., to optimize your device and improve our services;

      3.3 To identify applications where equipment is at risk, provide more secure functional services. Therefore, we need to obtain your application/application installation list in the process to ensure the normal operation of the product and protect the security of the device.

      3.4 In order to analyze the use of application functions by users and determine the authenticity of users, we need to conduct data statistics, and collect the above device information, including device MAC address and device unique identifier, when your device is in use.

      3.5Device signal: the network status of the device you use, WIFI access point information, etc.

      3.6Location Information: We may use GPS, WiFi or other technical means to collect and process information about your location for updating local information, providing content services, etc.

      For more information, please click "Personal Information Collection List".

      1For the more sensitive personal information in the above information, such as user device information (IMEI number, call status and identification number), GPS location information, photo media content and file access rights, we will obtain your consent before collection. For some non-sensitive information, the collection may be default and automatic. You can restrict our collection of relevant information or use of certain permissions from your mobile device by adjusting the Settings option for your mobile device. When you restrict our access to a certain permission, we may not be able to continue to provide you with the corresponding services, and no longer process your corresponding information.

      2We will not collect your ID card number, personal biometric information, bank account number, property information, credit information, health and physiological information and other personal sensitive information.

      3About sensitive permissions: In order to properly use the application functions, the product needs to obtain the following permissions in order to provide functional services related to normal products.

      1Obtain storage read and write permissions

      1How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      2Purpose and scope of use: It is used to scan the resource cache files and thumbnails in the system, load music resources and product pictures. It is displayed on the App interface to facilitate users to view and operate

      2Obtain permission to the application installation list

      1How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      2Purpose and scope of use: When the application needs to use advertising promotion services, the third-party advertising platform, Youmon +SDK, needs to obtain the "app software installation list permission" of the device to prevent the user from pushing the application already owned by the user and improve the user experience.

      3The permission to obtain device status information includes: (Device model, device MAC address, device unique identifier (IMEI, AndroidID, Device ID, MEID, UUID, GAID, OAID, IDFA, OpenUDID, GUID, IMSI, CCID, etc.) MEID, serial number, SSID and BSSID of WIFI, read Bluetooth address), operating system version, operating system name, etc.;

      1How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      2Purpose and Scope of use: When using our application, in order to analyze the user's use of application functions and judge the user's authenticity, we will synchronize the permission to third-party SDKS, including Autonavi SDK, Youmon +SDK, etc.

      4Access to location information

      1How to obtain: pop-up prompts, when the permission is obtained, the user will use this permission only when he actively clicks agree with the application.

      2Purpose and Scope of use: When the application needs to use GPS, WiFi or other functions, the product needs to collect your location and information to search for Bluetooth devices in nearby locations.

      Note: For more application permissions, see this document"Privacy Policy" Section 7 "Application Permission Description"

      Storage of information

      1. Where the information is stored

      The personal information we collect and generate in the People's Republic of China will be stored on our servers and/or those of our affiliates.

      2. Information storage and processing

      We store your personal information only for the period necessary to achieve the purpose or as long as required by law and regulation. After you stop using this product, we will immediately stop collecting and processing your personal information and application data. When the above period is exceeded, we will delete or anonymize the personal information you have provided to us.

      In addition to the necessary functions, Voitrans needs to apply for corresponding system permissions. The server side of the cloud does not store user personal information, and the third-party SDK accessed will be anonymized and de-identified by the service provider (Amu Statistics SDK, Autonavi SDK), so users cannot be tracked. Information stored on the user's phone will be automatically deleted when the user uninstalls Voitrans or clears the cache.

      Information security

      1. Voitrans stores and protects your personal information using industry-standard security measures and technologies, such as authentication, data encryption, restricted data center access and other security measures to ensure that your information is secure from disclosure, alteration and destruction. Despite the aforementioned security measures, please note that no security measure can be 100% secure.

      2. When you use the services provided by Voitrans, please protect your personal information. If you find that your personal information has been compromised, please contact us immediately so that we can take appropriate measures.

      How do we use the information we collect

      1. When implementing application business functions, we may use your personal information to ensure the integrity and security of the products and services we provide to you;

      2. We will understand your usage habits through the collected information, and with the help of data analysis, identify the acceptability of services, your usage habits, etc., in order to test and create new products, functions and services, improve the service level, and help us improve existing services and develop new services;

      3. We may use your personal information for customer surveys about the products and services, for sending notices about the products and services, and for commercial promotion;

      4. We may use your information for internal analysis and research related to the application;

      Information sharing

      At present, we will not actively share or transfer your personal information to third parties outside the company, if there is other sharing or transfer of your personal information, we will directly or confirm that the third party has obtained your express consent to the above behavior.

      We will not publicly disclose the personal information we collect. If it is necessary to publicly disclose it, we will inform you of the purpose of the public disclosure, the type of information disclosed and the sensitive information that may be involved, and obtain your express consent.

      As our business continues to develop, we may engage in mergers, acquisitions, asset transfers and other transactions, and we will inform you of the relevant circumstances, in accordance with laws and regulations and no less than the standards required by this Guide to continue to protect your personal information or require a new controller to continue to protect your personal information.

      In addition, according to relevant laws and regulations and national standards, we may share, transfer and publicly disclose personal information without prior authorization and consent of the personal information subject under the following circumstances:

      1 Directly related to national security and national defense security;

      2 Directly related to public safety, public health or major public interests;

      3 Directly related to criminal investigation, prosecution, trial and execution of judgments;

      4 In order to protect the life, property and other major legitimate rights and interests of the personal data subject or other individuals, but it is difficult to obtain the consent of the person;

      5 Personal information disclosed to the public by the personal information subject;

      6 Collecting personal information from legally publicly disclosed information, such as legitimate news reports, government information disclosure and other channels.

      How do you manage your personal information

      In accordance with the relevant laws, regulations and standards of China, as well as the common practices of other countries and regions, we guarantee that you exercise the following rights to your personal information:

      1.Correct your personal information

      If you find that there is an error in your personal information processed by us, you have the right to correct or update the wrong or incomplete information. If you are unable to operate independently in the account center, you can emailsaitong.voitrans@gmail.comContact us

      2. Delete your personal information

      In the following cases, you may make a request to us to delete your personal information:

      If we process personal information in violation of laws and regulations;

      If we collect and use your personal information without your consent;

      If our processing of personal information violates our agreement with you;

      �� If you no longer use our products or services;

      �� If we no longer provide you with products or services.

      Contact us. We will process your request within saitong.voitrans@gmail.comContact us. We will send it to you after receiving it30working days of receipt

      3. Change the scope of your consent

      You can contact us by emailsaitong.voitrans@gmail.comContact us. At your request, we will no longer collect, use or disclose your personal information. Please note that your withdrawal of consent or deletion of your personal information may affect your use of some of our services.

      4 Access and copy personal information

      You may, in accordance with the provisions of the relevant laws, provide yourimei(phone serial number) oroaidOr AndroidIDAfter the account information and other information, you can apply to us for access to and copy your personal information, you can email to3514406195@qq.comGet in touch with us.

      5. In response to your above request

      For security purposes, you may need to provide a written request or otherwise prove your identity. We may ask you to verify your identity before processing your request. For your reasonable request, we will respond and deal with it in a timely manner. We may reject requests that are unnecessarily repetitive, require too much technology (for example, the development of new systems or fundamental changes to existing practices), pose a risk to the legitimate interests of others, or are highly impractical.

      In the following circumstances, according to the requirements of laws and regulations, we will not be able to respond to your request:

      Related to national security and national defense security;

      Related to national security and national defense security;

      In connection with criminal investigation, prosecution and trial;

      �� There is sufficient evidence that you have subjective malice or abuse of rights;

      �� Responding to your request will cause serious damage to the legitimate rights and interests of you or other individuals and organizations.

      6.Account cancellation

      User can be inPerform [account cancellation] operation on the APP. Operation steps:

      1Go to the [My] page

      2Click the [Settings] button on the upper right

      3Click [Cancel account] to confirm

      After you log out, the information about the user account is cleared

      Application permission description

      In order to provide better products and services, when you use the software, we will apply for the following rights, when you enter the home page or use the function will request authorization, if you refuse, some of the corresponding functions will not be able to use normally. The specific purposes and reminders of permissions are described in detail as follows:

      1Location rights:

      android.permission.ACCESS_COARSE_LOCATION

      android.permission.ACCESS_FINE_LOCATION

      passWiFi or mobile base station to obtain the user's latitude and longitude location information

      When you useIn Voitrans, we will search for your attached Bluetooth device based on your geographical location. At the same time, in order to provide more stable services, optimize products and improve experience, we will share the above information with three SDKS, such as Youmon and Autonavi, to obtain Voitrans operating data and functional services.

      Reminder mode

      A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance

      2

      android.permission.READ_EXTERNAL_STORAGE

      android.permission.WRITE_EXTERNAL_STORAGE

      This permission is required when you access an application to perform application management functions.

      Reminder method:

      User Agreement and Privacy Policy description.

      3Network permissions:

      android.permission.INTERNET

      When you useThese permissions are required for Voitrans's information services and version upgrade services, and in order to improve the user experience and optimize the service capabilities, third-party SDKS such as Friends will also use these permissions.

      Reminder mode

      User Agreement and Privacy Policy description.

      4Get network status permissions:

      android.permission.ACCESS_NETWORK_STATE

      android.permission.ACCESS_WIFI_STATE

      It is used to obtain whether the current network connection is valid, determine whether the current 4G environment is , and whether to remind the network environment changes, thus affecting the loading of information content. This permission is applied for when you use Voitrans.

      Changes in the state of the network affect the uploading and loading of data. Therefore, the access to network status permission will be shared with friends + and other platforms.

      Reminder method:

      User Agreement and Privacy Policy description.

      5Get task list permissions:

      android.permission.GET_TASKS

      This permission is used to obtain the application list for the software management function. When you use the software management function, you need to read the applications installed on the mobile phone.

      Reminder mode

      User Agreement and Privacy Policy description.

      6Obtain MAC address permission

      android.permission.ACCESS_WIFI_STATE

      android.permission.INTERNET

      android.permission.ACCESS_NETWORK_STATE

      When you use Voitrans, the application will need to obtain MAC address permissions:

      When an application needs to report target conversion data, third-party platforms such as Youmon +SDK need to use MAC.

      Reminder method:

      User Agreement and Privacy Policy description.

      7Obtain permission to record audio

      android.permission.RECORD_AUDIO

      When you use the voice input function of Voitrans, you need to use the permission to record audio, and mainly use the voice input for translation and other related functions.

      Reminder method:

      User Agreement and Privacy Policy description , the user dynamically pops the box when required.

      8Obtain SSID permission for WIFI

      When this permission is used, the app reads the SSID permission for WIFI:

      Scope of use and purpose:

      When the application needs to use data analysis services, third-party platforms such as +SDK need to read the device's "WIFI SSID permission" to provide users with more accurate and effective functional services.

      Reminder method:

      User Agreement and Privacy Policy description.

      9Get Bluetooth access

      When this permission is used, the app reads the Bluetooth permission:

      Scope of use and purpose:

      Bluetooth devices for searching and configuring accessories, such as Bluetooth headsets, Bluetooth watches, etc. Easy for users to manage

      Reminder method:

      A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance

      User Agreement and Privacy Policy description.

      10Get the BSSID permission for WiFi

      When the application needs to distinguish and identify the user to provide functional services and data statistics, it will read the "WiFi BSSID" permission of the device for:

      Scope of use and purpose:

      1Third-party platforms: such as Youmeng SDK, Bugly SDK, Autonavi SDK

      Reminder method:

      User Agreement and Privacy Policy description.

      11Obtain the application installation permission

      android.permission.REQUEST_INSTALL_PACKAGES

      The software will use the application installation permission, which is mainly used to allow users to install a new version and experience new functions when there is a new version.

      Reminder mode

      User Agreement and Privacy Policy description.

      12Get permissions for the camera

      android.permission.CAMERA

      Voitrans uses camera permissions to scan QR codes and bind Bluetooth devices such as Bluetooth headsets and watches.

      Reminder method:

      A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance

      User Agreement and Privacy Policy description.

      Special note:

      1Application integration within their Allies SDK, Scott map SDK in the user agrees to allow after use, application in the background/foreground for ICCID, IMSI, IMEI, SN, ANDROID, BSSID, ANDROID ID, SSID, IMSI and other personal information;

      Remarks: MorePlease see the following SDK-related content and permissions [VIII. Access to third-party SDKS list]

      Access a third partySDK

      1In order to ensure the stable operation and functional realization of our client, so that you can use and enjoy more services and functions, our application will be embedded in the software tool development kit (SDK) or other similar applications of third parties, these third parties will collect and process relevant information in accordance with their own privacy policies, in order to normally provide functions and advertising services. You can learn about the information collection and processing rules of the third party in the following section. We will conduct strict security tests on the development kits (SDKS) for partners to obtain information, in order to protect the reasonable use and security of your personal information. Please note that third-party SDKS may change the data processing types due to their version upgrades. Please refer to the privacy policies published by third-party SDKS. See the details below or click to view the Third Party SDK List.

      1+SDK SDKSDK

      Type of personal information: device identification information and hardware serial number(IMEIAndroid IDIMSIICCIDOAIDSensor information, MAC address), geographic location information, read WIFI SSID and BSSID, read Bluetooth address

      Purpose: For data analysis and reportAPP crash information

      Application scenario: Application data statistics

      Sharing modeSDK active acquisition

      Privacy agreement https://www.umeng.com/page/policy

      2Amap SDK

      Supplier name: Autonavi Software Co., LTD., Beijing Autonavi Technology Co., LTD

      Type of personal information: e.gIP Address, GNSS information, base station information, WiFi status, WiFi parameters, WiFi list, SSID, BSSID, signal strength information, Bluetooth information, sensor information (vector, geomagnetic, acceleration, gyroscope, direction, photosensitivity, pressure, gravity, step counting, step detection), device signal strength information.

      Purpose of use: map service

      Privacy agreementhttps://developer.amap.com/pages/privacy/

      Protection of minors

      Users of our products and services may includeMinors under the age of 18, minor users should seek the advice of their parents or guardians regarding this Privacy Policy before using our products, and use our services or provide your information to us after obtaining the consent of and under the guidance of their parents or guardians. Guardians of minors who have questions may contact us through the contact details in this Privacy Policy.

      If you do not agree to the collection of the aforementioned information by the above third-party service providers, please stop using the Software immediately. During your use of the Software, these third parties will collect and process relevant information in accordance with their own privacy policies to provide some functions, advertising and other services. If the information is leaked due to the collection of the aforesaid information by the relevant third-party service provider, the relevant third-party service provider shall bear the corresponding legal responsibility.

      Effective and updated Privacy Policy

      1. This Privacy policy is effective from the date of publication.

      2. As our business evolves and changes, our Privacy Policy may change. We reserve the right to change our privacy policy at any time, so please check back often. If we make changes to our Privacy Policy, we will post these updates on our website, apps, and where we deem appropriate to keep you informed. If the privacy policy is updated, it will take effect from the date of update. Your continued use of our products or services means that you agree to our changed Privacy Policy.

      Saitong Industries IncEstablished on November 22, 2024, registered address: 18305 E Valley Blvd, Unit C, City of Industry, CA 91744, USA. If you want to know more about our company and platform, you can contact us through the contact information provided in this policy (saitong.voitrans@gmail.com).

       

      - + + - + + Voitrans Privacy Policy -

      Voitrans Privacy Policy

      -

      Last Updated: May 27, 2025

      -

      Effective Date: May 27, 2025

      +
      +

      Voitrans Privacy Policy

      +

      Last Updated: May 27, 2025

      +

      Effective Date: May 27, 2025

      + +

      Welcome to use Voitrans Software and Services

      +

      1. Voitrans Provided by Saitong Industries Inc. (hereinafter referred to as "the Company"). Can help users achieve Bluetooth devices and other products management. We understand the importance of personal information to our users (hereinafter referred to as "you") and that effective protection of your personal information is the cornerstone of the healthy and sustainable development of our business. Thank you for your use and trust in Voitrans products or services! We are fully aware that this trust does not come easily, we adhere to the principle of openness and transparency, to express to you our rules for processing your personal information, we use legal and legitimate ways and clear and reasonable purposes to process your personal information. Special note: Please be sure to read and understand this Privacy Policy carefully before using our products or services so that you can make appropriate choices.

      +

      2. This Privacy Policy explains to you how we collect, use, store and share your personal information when you use Voitrans. Personal information refers to all kinds of information recorded by electronic or other means that can identify a specific natural person or reflect the activities of a specific natural person alone or in combination with other information. Voitrans respects and protects the personal privacy of all users of the service. Except as otherwise provided in this Privacy Policy, Voitrans will not disclose this information to the public or provide it to third parties without your prior permission.

      +

      3. When you use a third party's product or service through an App Marketplace product or service, your personal information shall be subject to the third party's privacy policy.

      +

      4. Voitrans This Privacy Policy will be updated from time to time. By agreeing to the Voitrans Service Usage Agreement and beginning to use Voitrans, you are deemed to have agreed to all of this Privacy Policy. If you do not agree to this Privacy Policy, please do not use Voitrans Software and Services.

      +

      5. In order to analyze and measure the effectiveness of relevant services, we will use and disclose your personal information in accordance with the provisions of this Privacy Policy.

      + +

      This Privacy policy will help you understand the following:

      +
        +
      • 1 The information we collect
      • +
      • 2 Storage of information
      • +
      • 3 Information security
      • +
      • 4 How do we use the information we collect
      • +
      • 5 Information sharing
      • +
      • 6 How do you manage your personal information
      • +
      • 7 Application permission description
      • +
      • 8 Access third-party SDKS
      • +
      • 9 Protection of minors
      • +
      • 10 Effective and updated Privacy Policy
      • +
      • 11 How to contact us
      • +
      + +

      1. The information we collect

      +

      1. Use Voitrans at the beginning We will start collecting data about your usage of the application

      +

      2. Voitrans may obtain personal information about you from third parties or business partners through lawful means

      +

      3. In order to provide you with better products and services, give you network security during use, maintain the normal operation of products and optimize and improve, the purpose of our information services, after you actively click to agree to this privacy policy, use the information we provide. During the service, in addition to the personal information necessary to ensure the normal operation of the basic functions of the App in accordance with national laws and regulations, we will collect other personal information from you:

      +

      3.1 In order to identify risk users, judge the authenticity of users and prevent cheating in an all-round way, we will read your device information every time you open the software, including: (Device model, device MAC address, device unique identifier (IMEI, AndroidID, Device ID, MEID, UUID, GAID, OAID, IDFA, OpenUDID, GUID, IMSI, CCID, etc.) MEID, serial number, SSID and BSSID of WIFI), read Bluetooth address, operating system version, operating system name, user login account and password information;

      +

      3.2 When you use our products and services, we may collect certain information through network log information or certain programs and software, such information may include: details of the use of products and services, such as the opening time of your application, the length of use, and the address of the page visited; Device event information, such as crashes, system activity, etc., to optimize your device and improve our services;

      +

      3.3 To identify applications where equipment is at risk, provide more secure functional services. Therefore, we need to obtain your application/application installation list in the process to ensure the normal operation of the product and protect the security of the device.

      +

      3.4 In order to analyze the use of application functions by users and determine the authenticity of users, we need to conduct data statistics, and collect the above device information, including device MAC address and device unique identifier, when your device is in use.

      +

      3.5 Device signal: the network status of the device you use, WIFI access point information, etc.

      +

      3.6 Location Information: We may use GPS, WiFi or other technical means to collect and process information about your location for updating local information, providing content services, etc.

      +

      For more information, please click "Personal Information Collection List".

      + +

      1. For the more sensitive personal information in the above information, such as user device information (IMEI number, call status and identification number), GPS location information, photo media content and file access rights, we will obtain your consent before collection. For some non-sensitive information, the collection may be default and automatic. You can restrict our collection of relevant information or use of certain permissions from your mobile device by adjusting the Settings option for your mobile device. When you restrict our access to a certain permission, we may not be able to continue to provide you with the corresponding services, and no longer process your corresponding information.

      +

      2. We will not collect your ID card number, personal biometric information, bank account number, property information, credit information, health and physiological information and other personal sensitive information.

      +

      3. About sensitive permissions: In order to properly use the application functions, the product needs to obtain the following permissions in order to provide functional services related to normal products.

      + +

      1 Obtain storage read and write permissions

      +

      1 How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      +

      2 Purpose and scope of use: It is used to scan the resource cache files and thumbnails in the system, load music resources and product pictures. It is displayed on the App interface to facilitate users to view and operate

      + +

      2 Obtain permission to the application installation list

      +

      1 How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      +

      2 Purpose and scope of use: When the application needs to use advertising promotion services, the third-party advertising platform, Youmon +SDK, needs to obtain the "app software installation list permission" of the device to prevent the user from pushing the application already owned by the user and improve the user experience.

      + +

      3 The permission to obtain device status information

      +

      Includes: (Device model, device MAC address, device unique identifier (IMEI, AndroidID, Device ID, MEID, UUID, GAID, OAID, IDFA, OpenUDID, GUID, IMSI, CCID, etc.) MEID, serial number, SSID and BSSID of WIFI, read Bluetooth address), operating system version, operating system name, etc.;

      +

      1 How to get: pop-up prompt, when the permission is obtained, the user will take the initiative to click agree application will use this permission

      +

      2 Purpose and Scope of use: When using our application, in order to analyze the user's use of application functions and judge the user's authenticity, we will synchronize the permission to third-party SDKS, including Autonavi SDK, Youmon +SDK, etc.

      + +

      4 Access to location information

      +

      1 How to obtain: pop-up prompts, when the permission is obtained, the user will use this permission only when he actively clicks agree with the application.

      +

      2 Purpose and Scope of use: When the application needs to use GPS, WiFi or other functions, the product needs to collect your location and information to search for Bluetooth devices in nearby locations.

      +

      Note: For more application permissions, see this document "Privacy Policy" Section 7 "Application Permission Description"

      + +

      2. Storage of information

      +

      1. Where the information is stored

      +

      The personal information we collect and generate in the People's Republic of China will be stored on our servers and/or those of our affiliates.

      +

      2. Information storage and processing

      +

      We store your personal information only for the period necessary to achieve the purpose or as long as required by law and regulation. After you stop using this product, we will immediately stop collecting and processing your personal information and application data. When the above period is exceeded, we will delete or anonymize the personal information you have provided to us.

      +

      In addition to the necessary functions, Voitrans needs to apply for corresponding system permissions. The server side of the cloud does not store user personal information, and the third-party SDK accessed will be anonymized and de-identified by the service provider (Amu Statistics SDK, Autonavi SDK), so users cannot be tracked. Information stored on the user's phone will be automatically deleted when the user uninstalls Voitrans or clears the cache.

      + +

      3. Information security

      +

      1. Voitrans stores and protects your personal information using industry-standard security measures and technologies, such as authentication, data encryption, restricted data center access and other security measures to ensure that your information is secure from disclosure, alteration and destruction. Despite the aforementioned security measures, please note that no security measure can be 100% secure.

      +

      2. When you use the services provided by Voitrans, please protect your personal information. If you find that your personal information has been compromised, please contact us immediately so that we can take appropriate measures.

      + +

      4. How do we use the information we collect

      +

      1. When implementing application business functions, we may use your personal information to ensure the integrity and security of the products and services we provide to you;

      +

      2. We will understand your usage habits through the collected information, and with the help of data analysis, identify the acceptability of services, your usage habits, etc., in order to test and create new products, functions and services, improve the service level, and help us improve existing services and develop new services;

      +

      3. We may use your personal information for customer surveys about the products and services, for sending notices about the products and services, and for commercial promotion;

      +

      4. We may use your information for internal analysis and research related to the application;

      + +

      5. Information sharing

      +

      At present, we will not actively share or transfer your personal information to third parties outside the company, if there is other sharing or transfer of your personal information, we will directly or confirm that the third party has obtained your express consent to the above behavior.

      +

      We will not publicly disclose the personal information we collect. If it is necessary to publicly disclose it, we will inform you of the purpose of the public disclosure, the type of information disclosed and the sensitive information that may be involved, and obtain your express consent.

      +

      As our business continues to develop, we may engage in mergers, acquisitions, asset transfers and other transactions, and we will inform you of the relevant circumstances, in accordance with laws and regulations and no less than the standards required by this Guide to continue to protect your personal information or require a new controller to continue to protect your personal information.

      +

      In addition, according to relevant laws and regulations and national standards, we may share, transfer and publicly disclose personal information without prior authorization and consent of the personal information subject under the following circumstances:

      +
        +
      • 1 Directly related to national security and national defense security;
      • +
      • 2 Directly related to public safety, public health or major public interests;
      • +
      • 3 Directly related to criminal investigation, prosecution, trial and execution of judgments;
      • +
      • 4 In order to protect the life, property and other major legitimate rights and interests of the personal data subject or other individuals, but it is difficult to obtain the consent of the person;
      • +
      • 5 Personal information disclosed to the public by the personal information subject;
      • +
      • 6 Collecting personal information from legally publicly disclosed information, such as legitimate news reports, government information disclosure and other channels.
      • +
      + +

      6. How do you manage your personal information

      +

      In accordance with the relevant laws, regulations and standards of China, as well as the common practices of other countries and regions, we guarantee that you exercise the following rights to your personal information:

      + +

      1. Correct your personal information

      +

      If you find that there is an error in your personal information processed by us, you have the right to correct or update the wrong or incomplete information. If you are unable to operate independently in the account center, you can email saitong.voitrans@gmail.com Contact us

      + +

      2. Delete your personal information

      +

      In the following cases, you may make a request to us to delete your personal information:

      +
        +
      • If we process personal information in violation of laws and regulations;
      • +
      • If we collect and use your personal information without your consent;
      • +
      • If our processing of personal information violates our agreement with you;
      • +
      • If you no longer use our products or services;
      • +
      • If we no longer provide you with products or services.
      • +
      +

      Contact us. We will process your request within saitong.voitrans@gmail.com Contact us. We will send it to you after receiving it 30 working days of receipt

      + +

      3. Change the scope of your consent

      +

      You can contact us by email saitong.voitrans@gmail.com Contact us. At your request, we will no longer collect, use or disclose your personal information. Please note that your withdrawal of consent or deletion of your personal information may affect your use of some of our services.

      + +

      4 Access and copy personal information

      +

      You may, in accordance with the provisions of the relevant laws, provide your imei (phone serial number) or oaid Or Android ID After the account information and other information, you can apply to us for access to and copy your personal information, you can email to 3514406195@qq.com Get in touch with us.

      + +

      5. In response to your above request

      +

      For security purposes, you may need to provide a written request or otherwise prove your identity. We may ask you to verify your identity before processing your request. For your reasonable request, we will respond and deal with it in a timely manner. We may reject requests that are unnecessarily repetitive, require too much technology (for example, the development of new systems or fundamental changes to existing practices), pose a risk to the legitimate interests of others, or are highly impractical.

      +

      In the following circumstances, according to the requirements of laws and regulations, we will not be able to respond to your request:

      +
        +
      • Related to national security and national defense security;
      • +
      • In connection with criminal investigation, prosecution and trial;
      • +
      • There is sufficient evidence that you have subjective malice or abuse of rights;
      • +
      • Responding to your request will cause serious damage to the legitimate rights and interests of you or other individuals and organizations.
      • +
      + +

      6. Account cancellation

      +

      User can be in Perform [account cancellation] operation on the APP. Operation steps:

      +
        +
      1. Go to the [My] page
      2. +
      3. Click the [Settings] button on the upper right
      4. +
      5. Click [Cancel account] to confirm
      6. +
      +

      After you log out, the information about the user account is cleared

      + +

      7. Application permission description

      +

      In order to provide better products and services, when you use the software, we will apply for the following rights, when you enter the home page or use the function will request authorization, if you refuse, some of the corresponding functions will not be able to use normally. The specific purposes and reminders of permissions are described in detail as follows:

      + +

      1 Location rights:

      +

      android.permission.ACCESS_COARSE_LOCATION

      +

      android.permission.ACCESS_FINE_LOCATION

      +

      pass WiFi or mobile base station to obtain the user's latitude and longitude location information

      +

      When you use In Voitrans, we will search for your attached Bluetooth device based on your geographical location. At the same time, in order to provide more stable services, optimize products and improve experience, we will share the above information with three SDKS, such as Youmon and Autonavi, to obtain Voitrans operating data and functional services.

      +

      Reminder mode: A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance. User Agreement and Privacy Policy description.

      + +

      2

      +

      android.permission.READ_EXTERNAL_STORAGE

      +

      android.permission.WRITE_EXTERNAL_STORAGE

      +

      This permission is required when you access an application to perform application management functions.

      +

      Reminder method: User Agreement and Privacy Policy description.

      + +

      3 Network permissions:

      +

      android.permission.INTERNET

      +

      When you use These permissions are required for Voitrans's information services and version upgrade services, and in order to improve the user experience and optimize the service capabilities, third-party SDKS such as Friends will also use these permissions.

      +

      Reminder mode: User Agreement and Privacy Policy description.

      + +

      4 Get network status permissions:

      +

      android.permission.ACCESS_NETWORK_STATE

      +

      android.permission.ACCESS_WIFI_STATE

      +

      It is used to obtain whether the current network connection is valid, determine whether the current 4G environment is , and whether to remind the network environment changes, thus affecting the loading of information content. This permission is applied for when you use Voitrans.

      +

      Changes in the state of the network affect the uploading and loading of data. Therefore, the access to network status permission will be shared with friends + and other platforms.

      +

      Reminder method: User Agreement and Privacy Policy description.

      + +

      5 Get task list permissions:

      +

      android.permission.GET_TASKS

      +

      This permission is used to obtain the application list for the software management function. When you use the software management function, you need to read the applications installed on the mobile phone.

      +

      Reminder mode: User Agreement and Privacy Policy description.

      + +

      6 Obtain MAC address permission

      +

      android.permission.ACCESS_WIFI_STATE

      +

      android.permission.INTERNET

      +

      android.permission.ACCESS_NETWORK_STATE

      +

      When you use Voitrans, the application will need to obtain MAC address permissions:

      +

      When an application needs to report target conversion data, third-party platforms such as Youmon +SDK need to use MAC.

      +

      Reminder method: User Agreement and Privacy Policy description.

      + +

      7 Obtain permission to record audio

      +

      android.permission.RECORD_AUDIO

      +

      When you use the voice input function of Voitrans, you need to use the permission to record audio, and mainly use the voice input for translation and other related functions.

      +

      Reminder method: User Agreement and Privacy Policy description , the user dynamically pops the box when required.

      + +

      8 Obtain SSID permission for WIFI

      +

      When this permission is used, the app reads the SSID permission for WIFI:

      +

      Scope of use and purpose: When the application needs to use data analysis services, third-party platforms such as +SDK need to read the device's "WIFI SSID permission" to provide users with more accurate and effective functional services.

      +

      Reminder method: User Agreement and Privacy Policy description.

      + +

      9 Get Bluetooth access

      +

      When this permission is used, the app reads the Bluetooth permission:

      +

      Scope of use and purpose: Bluetooth devices for searching and configuring accessories, such as Bluetooth headsets, Bluetooth watches, etc. Easy for users to manage

      +

      Reminder method: A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance. User Agreement and Privacy Policy description.

      + +

      10 Get the BSSID permission for WiFi

      +

      When the application needs to distinguish and identify the user to provide functional services and data statistics, it will read the "WiFi BSSID" permission of the device for:

      +

      Scope of use and purpose: 1 Third-party platforms: such as Youmeng SDK, Bugly SDK, Autonavi SDK

      +

      Reminder method: User Agreement and Privacy Policy description.

      + +

      11 Obtain the application installation permission

      +

      android.permission.REQUEST_INSTALL_PACKAGES

      +

      The software will use the application installation permission, which is mainly used to allow users to install a new version and experience new functions when there is a new version.

      +

      Reminder mode: User Agreement and Privacy Policy description.

      + +

      12 Get permissions for the camera

      +

      android.permission.CAMERA

      +

      Voitrans uses camera permissions to scan QR codes and bind Bluetooth devices such as Bluetooth headsets and watches.

      +

      Reminder method: A prompt indicating the permission to start the application for the first time is displayed, requiring the user to confirm acceptance. User Agreement and Privacy Policy description.

      + +

      Special note:

      +

      1 Application integration within their Allies SDK, Scott map SDK in the user agrees to allow after use, application in the background/foreground for ICCID, IMSI, IMEI, SN, ANDROID, BSSID, ANDROID ID, SSID, IMSI and other personal information;

      +

      Remarks: More Please see the following SDK-related content and permissions [VIII. Access to third-party SDKS list]

      + +

      8. Access third-party SDKS

      +

      1 In order to ensure the stable operation and functional realization of our client, so that you can use and enjoy more services and functions, our application will be embedded in the software tool development kit (SDK) or other similar applications of third parties, these third parties will collect and process relevant information in accordance with their own privacy policies, in order to normally provide functions and advertising services. You can learn about the information collection and processing rules of the third party in the following section. We will conduct strict security tests on the development kits (SDKS) for partners to obtain information, in order to protect the reasonable use and security of your personal information. Please note that third-party SDKS may change the data processing types due to their version upgrades. Please refer to the privacy policies published by third-party SDKS. See the details below or click to view the Third Party SDK List.

      + +

      8.1 WeChat OpenSDK Android (com.tencent.mm.opensdk)

      +

      Information Obtained: Device number, IP address, device software information, device identification code (IMEI, Android ID, IDFA, OAID, OPENUDID, GUID, ICCID, SIM card IMSI information, IP, MAC address), device identifier, region, device-related application information, and other service-related log information

      +

      Purpose of Use: WeChat login and sharing

      +

      Developer: Shenzhen Tencent Computer Systems Company Limited

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      + +

      8.2 Navigation SDK (com.amap.api.navi)

      +

      Information Obtained: Application name, application version number, device brand and model, operating system, carrier information, screen resolution, sensor information (vector, acceleration, pressure, direction, geomagnetic, gyroscope, temperature, light sensor, NMEA signal), device signal strength information

      +

      Purpose of Use: Navigation using Amap

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      + +

      8.3 Map SDK (com.amap.api.maps)

      +

      Information Obtained: Application name, application version, device brand and model, operating system, network information, device signal strength, etc.

      +

      Purpose of Use: Map display and interaction

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      + +

      8.4 Location SDK (com.amap.api.location)

      +

      Information Obtained: Location information (GPS, Wi-Fi, base station), device information, network information, etc.

      +

      Purpose of Use: Provide location services

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      + +

      8.5 Lite Map SDK (com.amap.api.maps.utils)

      +

      Information Obtained: Application name, application version, device information, network information, etc.

      +

      Purpose of Use: Map tools and rendering optimization

      +

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      + +

      8.6 Alipay App Client SDK (com.alipay.sdk)

      +

      Information Obtained: Device identifiers, basic device information, installed software list, and network information (see official privacy policy for details)

      +

      Purpose of Use: Alipay account login and payment invocation

      +

      Developer: Alipay (Hangzhou) Information Technology Co., Ltd.

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://opendocs.alipay.com/open/54/01g6qm#%E6%94%AF%E4%BB%98%E5%AE%9D%20App%20%E6%94%AF%E4%BB%98%E5%AE%A2%E6%88%B7%E7%AB%AF%20SDK%20%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96

      + +

      8.7 Beacon SDK Android (com.tencent.beacon)

      +

      Information Obtained: SDK/API version, platform, timestamp, app identifier, app version, device manufacturer, OS version, locale, timezone, network status (Wi-Fi, etc.), network logs, crash and usage data, IP address, etc. (see official privacy policy for details)

      +

      Purpose of Use: App quality monitoring and data reporting service

      +

      Developer: Shenzhen Tencent Computer Systems Company Limited

      +

      Collection Method: SDK self-collection

      +

      Privacy Policy Link: https://privacy.qq.com/document/preview/a19a8cf4f2354306b137a7db39d32024

      + +

      9. Protection of minors

      +

      Users of our products and services may include Minors under the age of 18, minor users should seek the advice of their parents or guardians regarding this Privacy Policy before using our products, and use our services or provide your information to us after obtaining the consent of and under the guidance of their parents or guardians. Guardians of minors who have questions may contact us through the contact details in this Privacy Policy.

      +

      If you do not agree to the collection of the aforementioned information by the above third-party service providers, please stop using the Software immediately. During your use of the Software, these third parties will collect and process relevant information in accordance with their own privacy policies to provide some functions, advertising and other services. If the information is leaked due to the collection of the aforesaid information by the relevant third-party service provider, the relevant third-party service provider shall bear the corresponding legal responsibility.

      + +

      10. Effective and updated Privacy Policy

      +

      1. This Privacy policy is effective from the date of publication.

      +

      2. As our business evolves and changes, our Privacy Policy may change. We reserve the right to change our privacy policy at any time, so please check back often. If we make changes to our Privacy Policy, we will post these updates on our website, apps, and where we deem appropriate to keep you informed. If the privacy policy is updated, it will take effect from the date of update. Your continued use of our products or services means that you agree to our changed Privacy Policy.

      -

      9. Third-Party SDK Disclosure

      -

      Below are the third-party SDKs we integrate, including SDK name, developer, and privacy policy link, to help you understand how your personal information is used and protected:

      -

      9.1 WeChat OpenSDK Android (com.tencent.mm.opensdk)

      -

      Information Obtained: Device number, IP address, device software information, device identification code (IMEI, Android ID, IDFA, OAID, OPENUDID, GUID, ICCID, SIM card IMSI information, IP, MAC address), device identifier, region, device-related application information, and other service-related log information

      -

      Purpose of Use: WeChat login and sharing

      -

      Developer: Shenzhen Tencent Computer Systems Company Limited

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

      -

      9.2 Navigation SDK (com.amap.api.navi)

      -

      Information Obtained: Application name, application version number, device brand and model, operating system, carrier information, screen resolution, sensor information (vector, acceleration, pressure, direction, geomagnetic, gyroscope, temperature, light sensor, NMEA signal), device signal strength information

      -

      Purpose of Use: Navigation using Amap

      -

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      -

      9.3 Map SDK (com.amap.api.maps)

      -

      Information Obtained: Application name, application version, device brand and model, operating system, network information, device signal strength, etc.

      -

      Purpose of Use: Map display and interaction

      -

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      -

      9.4 Location SDK (com.amap.api.location)

      -

      Information Obtained: Location information (GPS, Wi-Fi, base station), device information, network information, etc.

      -

      Purpose of Use: Provide location services

      -

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      -

      9.5 Lite Map SDK (com.amap.api.maps.utils)

      -

      Information Obtained: Application name, application version, device information, network information, etc.

      -

      Purpose of Use: Map tools and rendering optimization

      -

      Developer: Beijing Gaode Tuqiang Technology Co., Ltd.

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://lbs.amap.com/pages/privacy/

      -

      9.6 Alipay App Client SDK (com.alipay.sdk)

      -

      Information Obtained: Device identifiers, basic device information, installed software list, and network information (see official privacy policy for details)

      -

      Purpose of Use: Alipay account login and payment invocation

      -

      Developer: Alipay (Hangzhou) Information Technology Co., Ltd.

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://opendocs.alipay.com/open/54/01g6qm#%E6%94%AF%E4%BB%98%E5%AE%9D%20App%20%E6%94%AF%E4%BB%98%E5%AE%A2%E6%88%B7%E7%AB%AF%20SDK%20%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96

      -

      9.7 Beacon SDK Android (com.tencent.beacon)

      -

      Information Obtained: SDK/API version, platform, timestamp, app identifier, app version, device manufacturer, OS version, locale, timezone, network status (Wi-Fi, etc.), network logs, crash and usage data, IP address, etc. (see official privacy policy for details)

      -

      Purpose of Use: App quality monitoring and data reporting service

      -

      Developer: Shenzhen Tencent Computer Systems Company Limited

      -

      Collection Method: SDK self-collection

      -

      Privacy Policy Link: https://privacy.qq.com/document/preview/a19a8cf4f2354306b137a7db39d32024

      +

      11. How to contact us

      +

      Saitong Industries Inc Established on November 22, 2024, registered address: 18305 E Valley Blvd, Unit C, City of Industry, CA 91744, USA. If you want to know more about our company and platform, you can contact us through the contact information provided in this policy (saitong.voitrans@gmail.com).

      +
      From bf3a9ebc2d5b26939e341965f12a3937fd23257b Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Fri, 5 Dec 2025 19:57:26 +0800 Subject: [PATCH 124/177] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/XunFeiAsrHelper.kt | 209 ++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt new file mode 100644 index 000000000..5cae21a89 --- /dev/null +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -0,0 +1,209 @@ +package com.yunqiinnovation.azure_speech + +import android.content.Context +import android.util.Base64 +import android.util.Log +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.WebSocket +import okhttp3.WebSocketListener +import okio.ByteString +import org.json.JSONObject +import java.io.File +import java.io.FileInputStream +import java.net.URLEncoder +import java.nio.charset.StandardCharsets +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone +import java.util.UUID +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicBoolean +import javax.crypto.Mac +import javax.crypto.spec.SecretKeySpec + +class XunFeiAsrHelper(private val context: Context) { + private val tag = "XunFeiAsrHelper" + + private val appId = "43d87d22" + private val accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec" + + private val audioEncode = "pcm_s16le" + private val lang = "autodialect" + private val sampleRate = "16000" + private val audioFrameSize = 1280 + private val frameIntervalMs = 40 + private val baseWsUrl = "wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1" + private val client = OkHttpClient.Builder().retryOnConnectionFailure(true).build() + + private var webSocket: WebSocket? = null + private val isConnected = AtomicBoolean(false) + private val isSendingAudio = AtomicBoolean(false) + private var sessionId: String? = null + private var audioFileSize: Long = 0 + + private fun getAudioFileSize(audioPath: String): Long { + val file = File(audioPath) + return if (file.exists() && file.isFile) file.length() else 0L + } + + private fun getUtcTime(): String { + val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US) + sdf.timeZone = TimeZone.getTimeZone("GMT+8") + return sdf.format(Date()) + } + + private fun calculateSignature(params: Map, accessKeySecret: String): String { + val baseStr = buildString { + var first = true + for ((key, value) in params.toSortedMap()) { + if (key == "signature") continue + if (value.isBlank()) continue + if (!first) append("&") + append(URLEncoder.encode(key, StandardCharsets.UTF_8.name())) + append("=") + append(URLEncoder.encode(value, StandardCharsets.UTF_8.name())) + first = false + } + } + val mac = Mac.getInstance("HmacSHA1") + val keySpec = SecretKeySpec(accessKeySecret.toByteArray(StandardCharsets.UTF_8), "HmacSHA1") + mac.init(keySpec) + val signBytes = mac.doFinal(baseStr.toByteArray(StandardCharsets.UTF_8)) + return Base64.encodeToString(signBytes, Base64.NO_WRAP) + } + + private fun buildParamsString(params: Map): String { + val sb = StringBuilder() + var first = true + for ((key, value) in params) { + if (!first) sb.append("&") + sb.append(URLEncoder.encode(key, StandardCharsets.UTF_8.name())) + sb.append("=") + sb.append(URLEncoder.encode(value, StandardCharsets.UTF_8.name())) + first = false + } + return sb.toString() + } + + fun connect(appId: String, accessKeyId: String, accessKeySecret: String): Boolean { + return try { + val params = mutableMapOf() + params["audio_encode"] = audioEncode + params["lang"] = lang + params["samplerate"] = sampleRate + params["accessKeyId"] = accessKeyId + params["appId"] = appId + params["uuid"] = UUID.randomUUID().toString().replace("-", "") + params["utc"] = getUtcTime() + params["signature"] = calculateSignature(params, accessKeySecret) + val fullUrl = "$baseWsUrl?${buildParamsString(params)}" + + val request = Request.Builder().url(fullUrl).build() + val latch = CountDownLatch(1) + val listener = object : WebSocketListener() { + override fun onOpen(ws: WebSocket, response: okhttp3.Response) { + webSocket = ws + isConnected.set(true) + latch.countDown() + } + + override fun onMessage(ws: WebSocket, text: String) { + try { + val json = JSONObject(text) + if (json.optString("msg_type") == "action") { + val data = json.optJSONObject("data") + val sid = data?.optString("sessionId") + if (!sid.isNullOrEmpty()) { + sessionId = sid + } + } + } catch (e: Exception) { + Log.d(tag, "onMessage parse error: ${e.message}") + } + } + + override fun onClosed(ws: WebSocket, code: Int, reason: String) { + isConnected.set(false) + } + + override fun onFailure(ws: WebSocket, t: Throwable, response: okhttp3.Response?) { + isConnected.set(false) + Log.e(tag, "WebSocket failure: ${t.message}") + } + } + client.newWebSocket(request, listener) + latch.await(15, TimeUnit.SECONDS) + isConnected.get() + } catch (e: Exception) { + Log.e(tag, "connect failed: ${e.message}") + false + } + } + + fun sendAudio(audioPath: String): Boolean { + if (!isConnected.get() || webSocket == null || isSendingAudio.get()) { + Log.d(tag, "sendAudio invalid state") + return false + } + isSendingAudio.set(true) + audioFileSize = getAudioFileSize(audioPath) + return try { + FileInputStream(audioPath).use { fis -> + val buffer = ByteArray(audioFrameSize) + var frameIndex = 0 + var startTime: Long? = null + while (true) { + val bytesRead = fis.read(buffer) + if (bytesRead == -1) break + val frameData = if (bytesRead == audioFrameSize) buffer else buffer.copyOf(bytesRead) + if (startTime == null) startTime = System.currentTimeMillis() + val expectedSendTime = startTime!! + frameIndex * frameIntervalMs + val now = System.currentTimeMillis() + val diff = expectedSendTime - now + if (diff > 1) Thread.sleep(diff) + webSocket?.send(ByteString.of(frameData, 0, frameData.size)) + frameIndex++ + } + val endMsg = JSONObject() + endMsg.put("end", true) + sessionId?.let { endMsg.put("sessionId", it) } + webSocket?.send(endMsg.toString()) + true + } + } catch (e: Exception) { + Log.e(tag, "sendAudio error: ${e.message}") + false + } finally { + isSendingAudio.set(false) + } + } + + fun runDemo(appId: String, accessKeyId: String, accessKeySecret: String, audioPath: String) { + try { + if (!connect(appId, accessKeyId, accessKeySecret)) return + if (!sendAudio(audioPath)) return + val estimatedDurationSec = (((audioFileSize / audioFrameSize) * frameIntervalMs) / 1000).toInt() + val waitTime = estimatedDurationSec + 5 + for (i in 0..waitTime) { + if (!isConnected.get()) break + Thread.sleep(1000) + } + } catch (_: InterruptedException) { + } finally { + close() + } + } + + fun close() { + try { + isConnected.set(false) + webSocket?.close(1000, "normal") + } catch (_: Exception) { + } finally { + webSocket = null + } + } +} From 653883b4d5ad5bf3f8edcf62c07396956c1841d7 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Sat, 6 Dec 2025 18:06:56 +0800 Subject: [PATCH 125/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/XunFeiAsrHelper.kt | 315 ++++++++---------- 1 file changed, 135 insertions(+), 180 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 5cae21a89..51e15ad21 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -3,207 +3,162 @@ package com.yunqiinnovation.azure_speech import android.content.Context import android.util.Base64 import android.util.Log -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.WebSocket -import okhttp3.WebSocketListener +import okhttp3.* import okio.ByteString import org.json.JSONObject -import java.io.File -import java.io.FileInputStream import java.net.URLEncoder import java.nio.charset.StandardCharsets -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.TimeZone -import java.util.UUID -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicBoolean +import java.security.MessageDigest import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec class XunFeiAsrHelper(private val context: Context) { - private val tag = "XunFeiAsrHelper" - - private val appId = "43d87d22" - private val accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec" - - private val audioEncode = "pcm_s16le" - private val lang = "autodialect" - private val sampleRate = "16000" - private val audioFrameSize = 1280 - private val frameIntervalMs = 40 - private val baseWsUrl = "wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1" - private val client = OkHttpClient.Builder().retryOnConnectionFailure(true).build() - - private var webSocket: WebSocket? = null - private val isConnected = AtomicBoolean(false) - private val isSendingAudio = AtomicBoolean(false) - private var sessionId: String? = null - private var audioFileSize: Long = 0 - - private fun getAudioFileSize(audioPath: String): Long { - val file = File(audioPath) - return if (file.exists() && file.isFile) file.length() else 0L - } + private val tag = "XunFeiAsrHelper" - private fun getUtcTime(): String { - val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US) - sdf.timeZone = TimeZone.getTimeZone("GMT+8") - return sdf.format(Date()) - } + private val appId = "43d87d22" + private val accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec" - private fun calculateSignature(params: Map, accessKeySecret: String): String { - val baseStr = buildString { - var first = true - for ((key, value) in params.toSortedMap()) { - if (key == "signature") continue - if (value.isBlank()) continue - if (!first) append("&") - append(URLEncoder.encode(key, StandardCharsets.UTF_8.name())) - append("=") - append(URLEncoder.encode(value, StandardCharsets.UTF_8.name())) - first = false - } - } - val mac = Mac.getInstance("HmacSHA1") - val keySpec = SecretKeySpec(accessKeySecret.toByteArray(StandardCharsets.UTF_8), "HmacSHA1") - mac.init(keySpec) - val signBytes = mac.doFinal(baseStr.toByteArray(StandardCharsets.UTF_8)) - return Base64.encodeToString(signBytes, Base64.NO_WRAP) + private var webSocket: WebSocket? = null + private val client = OkHttpClient() + + // Status: "UNDEFINED", "CONNECTING", "OPEN", "CLOSING", "CLOSED" + private var btnStatus = "UNDEFINED" + + private var resultText = "" + + var onResult: ((String) -> Unit)? = null + var onError: ((String) -> Unit)? = null + var onStatusChange: ((String) -> Unit)? = null + + fun connectWebSocket() { + val url = getWebSocketUrl() + val request = Request.Builder().url(url).build() + + changeBtnStatus("CONNECTING") + + webSocket = client.newWebSocket(request, object : WebSocketListener() { + override fun onOpen(webSocket: WebSocket, response: Response) { + Log.d(tag, "WebSocket Opened") + changeBtnStatus("OPEN") + } + + override fun onMessage(webSocket: WebSocket, text: String) { + renderResult(text) + } + + override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { + Log.d(tag, "WebSocket Closing: $code / $reason") + changeBtnStatus("CLOSING") + webSocket.close(1000, null) + } + + override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { + Log.d(tag, "WebSocket Closed: $code / $reason") + changeBtnStatus("CLOSED") + } + + override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { + Log.e(tag, "WebSocket Error", t) + changeBtnStatus("CLOSED") + onError?.invoke(t.message ?: "WebSocket connection failed") + } + }) + } + + fun sendAudio(frameBuffer: ByteArray) { + webSocket?.let { ws -> + ws.send(ByteString.of(frameBuffer, 0, frameBuffer.size)) } + } - private fun buildParamsString(params: Map): String { - val sb = StringBuilder() - var first = true - for ((key, value) in params) { - if (!first) sb.append("&") - sb.append(URLEncoder.encode(key, StandardCharsets.UTF_8.name())) - sb.append("=") - sb.append(URLEncoder.encode(value, StandardCharsets.UTF_8.name())) - first = false - } - return sb.toString() + fun close() { + webSocket?.let { ws -> + ws.send("{\"end\": true}") + changeBtnStatus("CLOSING") } + } - fun connect(appId: String, accessKeyId: String, accessKeySecret: String): Boolean { - return try { - val params = mutableMapOf() - params["audio_encode"] = audioEncode - params["lang"] = lang - params["samplerate"] = sampleRate - params["accessKeyId"] = accessKeyId - params["appId"] = appId - params["uuid"] = UUID.randomUUID().toString().replace("-", "") - params["utc"] = getUtcTime() - params["signature"] = calculateSignature(params, accessKeySecret) - val fullUrl = "$baseWsUrl?${buildParamsString(params)}" - - val request = Request.Builder().url(fullUrl).build() - val latch = CountDownLatch(1) - val listener = object : WebSocketListener() { - override fun onOpen(ws: WebSocket, response: okhttp3.Response) { - webSocket = ws - isConnected.set(true) - latch.countDown() - } - - override fun onMessage(ws: WebSocket, text: String) { - try { - val json = JSONObject(text) - if (json.optString("msg_type") == "action") { - val data = json.optJSONObject("data") - val sid = data?.optString("sessionId") - if (!sid.isNullOrEmpty()) { - sessionId = sid - } - } - } catch (e: Exception) { - Log.d(tag, "onMessage parse error: ${e.message}") - } - } - - override fun onClosed(ws: WebSocket, code: Int, reason: String) { - isConnected.set(false) - } - - override fun onFailure(ws: WebSocket, t: Throwable, response: okhttp3.Response?) { - isConnected.set(false) - Log.e(tag, "WebSocket failure: ${t.message}") - } - } - client.newWebSocket(request, listener) - latch.await(15, TimeUnit.SECONDS) - isConnected.get() - } catch (e: Exception) { - Log.e(tag, "connect failed: ${e.message}") - false - } + private fun changeBtnStatus(status: String) { + btnStatus = status + if (status == "CONNECTING") { + resultText = "" } + onStatusChange?.invoke(status) + } - fun sendAudio(audioPath: String): Boolean { - if (!isConnected.get() || webSocket == null || isSendingAudio.get()) { - Log.d(tag, "sendAudio invalid state") - return false - } - isSendingAudio.set(true) - audioFileSize = getAudioFileSize(audioPath) - return try { - FileInputStream(audioPath).use { fis -> - val buffer = ByteArray(audioFrameSize) - var frameIndex = 0 - var startTime: Long? = null - while (true) { - val bytesRead = fis.read(buffer) - if (bytesRead == -1) break - val frameData = if (bytesRead == audioFrameSize) buffer else buffer.copyOf(bytesRead) - if (startTime == null) startTime = System.currentTimeMillis() - val expectedSendTime = startTime!! + frameIndex * frameIntervalMs - val now = System.currentTimeMillis() - val diff = expectedSendTime - now - if (diff > 1) Thread.sleep(diff) - webSocket?.send(ByteString.of(frameData, 0, frameData.size)) - frameIndex++ - } - val endMsg = JSONObject() - endMsg.put("end", true) - sessionId?.let { endMsg.put("sessionId", it) } - webSocket?.send(endMsg.toString()) - true - } - } catch (e: Exception) { - Log.e(tag, "sendAudio error: ${e.message}") - false - } finally { - isSendingAudio.set(false) + private fun renderResult(resultData: String) { + try { + val jsonData = JSONObject(resultData) + val action = jsonData.optString("action") + + when (action) { + "started" -> { + Log.d(tag, "Handshake success") } - } - fun runDemo(appId: String, accessKeyId: String, accessKeySecret: String, audioPath: String) { - try { - if (!connect(appId, accessKeyId, accessKeySecret)) return - if (!sendAudio(audioPath)) return - val estimatedDurationSec = (((audioFileSize / audioFrameSize) * frameIntervalMs) / 1000).toInt() - val waitTime = estimatedDurationSec + 5 - for (i in 0..waitTime) { - if (!isConnected.get()) break - Thread.sleep(1000) + "result" -> { + val dataStr = jsonData.optString("data") + val data = JSONObject(dataStr) + + val cn = data.optJSONObject("cn") ?: return + val st = cn.optJSONObject("st") ?: return + val rt = st.optJSONArray("rt") ?: return + + var resultTextTemp = "" + + for (i in 0 until rt.length()) { + val j = rt.getJSONObject(i) + val ws = j.optJSONArray("ws") ?: continue + for (k in 0 until ws.length()) { + val kObj = ws.getJSONObject(k) + val cw = kObj.optJSONArray("cw") ?: continue + for (l in 0 until cw.length()) { + val lObj = cw.getJSONObject(l) + resultTextTemp += lObj.optString("w") + } } - } catch (_: InterruptedException) { - } finally { - close() + } + + if (st.optInt("type") == 0) { + resultText += resultTextTemp + onResult?.invoke(resultText) + } else { + onResult?.invoke(resultText + resultTextTemp) + } } - } - fun close() { - try { - isConnected.set(false) - webSocket?.close(1000, "normal") - } catch (_: Exception) { - } finally { - webSocket = null + "error" -> { + Log.e(tag, "Error: $resultData") + onError?.invoke(jsonData.toString()) } + } + } catch (e: Exception) { + Log.e(tag, "Parse error", e) } + } + + private fun getWebSocketUrl(): String { + val url = "wss://rtasr.xfyun.cn/v1/ws" + val ts = (System.currentTimeMillis() / 1000).toString() + val baseString = appId + ts + val signa = md5(baseString) + val signatureSha = hmacSha1(signa, accessKeyId) + val signature = Base64.encodeToString(signatureSha, Base64.NO_WRAP) + val encodedSignature = URLEncoder.encode(signature, "UTF-8") + + return "$url?appid=$appId&ts=$ts&signa=$encodedSignature" + } + + private fun md5(string: String): String { + val md = MessageDigest.getInstance("MD5") + val digest = md.digest(string.toByteArray(StandardCharsets.UTF_8)) + return digest.joinToString("") { "%02x".format(it) } + } + + private fun hmacSha1(data: String, key: String): ByteArray { + val secretKeySpec = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "HmacSHA1") + val mac = Mac.getInstance("HmacSHA1") + mac.init(secretKeySpec) + return mac.doFinal(data.toByteArray(StandardCharsets.UTF_8)) + } } From 4d09cb707981f5de12090221932e9454224dc4a5 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 5 Dec 2025 17:27:58 +0800 Subject: [PATCH 126/177] =?UTF-8?q?refactor(explore):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=8E=A2=E7=B4=A2=E9=A1=B5=E9=9D=A2=E5=B8=83=E5=B1=80=E5=92=8C?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除未使用的搜索功能和FunctionScene类 简化AI功能列表和导航逻辑 调整探索页面布局为2x2网格 添加用量统计功能到主网格 --- .../controllers/explore_controller.dart | 175 +------ lib/modules/explore/views/explore_view.dart | 481 +++--------------- 2 files changed, 84 insertions(+), 572 deletions(-) diff --git a/lib/modules/explore/controllers/explore_controller.dart b/lib/modules/explore/controllers/explore_controller.dart index 6376e3fa4..ebd64067a 100644 --- a/lib/modules/explore/controllers/explore_controller.dart +++ b/lib/modules/explore/controllers/explore_controller.dart @@ -27,30 +27,7 @@ class AIFeature { }); } -class FunctionScene { - final String title; - final String description; - final IconData icon; - final Color startColor; - final Color endColor; - final Color iconColor; - final String targetRoute; - - FunctionScene({ - required this.title, - required this.description, - required this.icon, - required this.startColor, - required this.endColor, - required this.iconColor, - required this.targetRoute, - }); -} - class ExploreController extends GetxController { - // 搜索关键词 - final searchController = TextEditingController(); - // AI功能列表 final List aiFeatures = [ AIFeature( @@ -75,42 +52,6 @@ class ExploreController extends GetxController { agentId: 'simultaneous_interpreter', targetRoute: Routes.translationMiddleware, ), - // AIFeature( - // title: 'conferenceAssistant'.tr, // 商务会议助手 - // description: 'conferenceAssistantInfo'.tr, // 实时记录会议纪要,多语言翻译 - // icon: Icons.people, - // startColor: const Color(0xFFab47bc), - // endColor: const Color(0xFFec407a), - // iconBgColor: const Color(0xFFd81b60).withOpacity(0.2), - // iconColor: const Color(0xFFd81b60), - // agentId: 'meeting_assistant', - // targetRoute: Routes.meeting, - // ), - // AIFeature( - // title: 'aiGirlfriend'.tr, // 亲子陪伴 - // description: 'aiGirlfriendInfo'.tr, // 智能陪伴,随时聊天 - // icon: Icons.favorite, - // startColor: const Color(0xFFE91E63), - // endColor: const Color(0xFFFF5252), - // iconBgColor: const Color(0xFFE91E63).withOpacity(0.2), - // iconColor: const Color(0xFFE91E63), - // agentId: 'cyber_girlfriend', - // targetRoute: Routes.chat, - // ), - // AIFeature( - // title: 'healthConsultant'.tr, // 健康顾问 - // description: 'healthConsultantInfo'.tr, // 提供科学健康建议 - // icon: Icons.healing, - // startColor: const Color(0xFFFFC107), - // endColor: const Color(0xFFFF9800), - // iconBgColor: const Color(0xFFFFC107).withOpacity(0.2), - // iconColor: const Color(0xFFFFC107), - // agentId: 'health_advisor', - // targetRoute: Routes.chat, - // ), - ]; - - final List aiFeaturesWide = [ AIFeature( title: 'conferenceAssistant'.tr, // 商务会议助手 description: 'conferenceAssistantInfo'.tr, // 实时记录会议纪要,多语言翻译 @@ -122,90 +63,42 @@ class ExploreController extends GetxController { agentId: 'meeting_assistant', targetRoute: Routes.meeting, ), + AIFeature( + title: 'usageStats'.tr, + description: 'usageStatsInfo'.tr, + icon: Icons.analytics_outlined, + startColor: const Color(0xFF2196F3), // 科技蓝 + endColor: const Color(0xFF00BCD4), // 青蓝色 + iconBgColor: const Color(0xFF2196F3).withOpacity(0.2), + iconColor: const Color(0xFF2196F3), + agentId: 'usage_stats', + targetRoute: Routes.usageStats, + ) ]; - // 热门功能场景列表 - final List functionScenes = [ - FunctionScene( + final List aiFeaturesWide = [ + AIFeature( title: 'conferenceAssistant'.tr, // 商务会议助手 description: 'conferenceAssistantInfo'.tr, // 实时记录会议纪要,多语言翻译 icon: Icons.people, startColor: const Color(0xFFab47bc), endColor: const Color(0xFFec407a), + iconBgColor: const Color(0xFFd81b60).withOpacity(0.2), iconColor: const Color(0xFFd81b60), + agentId: 'meeting_assistant', targetRoute: Routes.meeting, ), - FunctionScene( - title: 'studyAssistant'.tr, // 语言学习助手 - description: 'studyAssistantInfo'.tr, // 发音纠正,实时练习口语 - icon: Icons.school, - startColor: const Color(0xFF4CAF50), - endColor: const Color(0xFF009688), - iconColor: const Color(0xFF4CAF50), - targetRoute: Routes.realtime, - ), - FunctionScene( - title: 'travelTranslator'.tr, // 旅行翻译助手 - description: 'travelTranslatorInfo'.tr, // 实时语音翻译,旅游景点介绍 - icon: Icons.language, - startColor: const Color(0xFFFFC107), - endColor: const Color(0xFFFF9800), - iconColor: const Color(0xFFFFC107), - targetRoute: '', - ), ]; - // 搜索功能 - void search() { - if (searchController.text.isEmpty) return; - - Get.snackbar( - 'search'.tr, // 搜索 - '${'beSearching'.tr} ${searchController.text}', // 正在搜索: - snackPosition: SnackPosition.TOP, - ); - - // 实际应用中,这里应该实现真正的搜索逻辑 - searchController.clear(); - } - // 点击AI功能 void onAIFeatureTap(int index) { if (index < 0 || index >= aiFeatures.length) return; final feature = aiFeatures[index]; - final agent = AgentProvider.getAgentById(feature.agentId); - - if (agent == null) { - Get.snackbar( - 'error'.tr, // 错误 - 'noAssistantFound'.tr, // 未找到对应的AI助手 - snackPosition: SnackPosition.TOP, - ); - return; - } + if (feature.targetRoute.isEmpty) return; // 根据目标路由进行跳转 - if (feature.targetRoute == Routes.chat) { - // 跳转到聊天页面 - Get.toNamed(feature.targetRoute, arguments: { - 'agentId': agent.id, - 'agentName': agent.name, - 'agentVoice': agent.voice, - 'agentAvatar': agent.avatarUrl, - 'agentSubtitle': agent.description, - 'systemPrompt': agent.systemPrompt, - 'welcomeMessage': agent.welcomeMessage, - }); - } else if (feature.targetRoute == Routes.translationMiddleware) { - // 跳转到翻译页面 - Get.toNamed(feature.targetRoute); - } else if (feature.targetRoute == Routes.agent) { - Get.toNamed(feature.targetRoute); - } else if (feature.targetRoute == Routes.meeting) { - // 跳转到会议页面 - Get.toNamed(feature.targetRoute); - } + Get.toNamed(feature.targetRoute); } // 点击AI功能(宽版本) @@ -235,42 +128,8 @@ class ExploreController extends GetxController { } } - // 点击功能场景 - void onFunctionSceneTap(int index) { - if (index < 0 || index >= functionScenes.length) return; - - final scene = functionScenes[index]; - - if (scene.targetRoute.isNotEmpty) { - Get.toNamed(scene.targetRoute); - } else { - Get.snackbar( - 'scene'.tr, // 场景 - '${'youHaveSelected'.tr} ${functionScenes[index].title}', // 您选择了: - snackPosition: SnackPosition.TOP, - ); - } - } - - // 尝试新功能 - void tryNewFeature() { - Get.snackbar( - 'newFunction'.tr, // 新功能 - '${'youChoseTry'.tr}${'aiSinger'.tr}', // 您选择了尝试 // AI歌手模式 - snackPosition: SnackPosition.TOP, - ); - - // 实际应用中,这里应该跳转到新功能页面 - } - // 跳转到用量统计页面 void goToUsageStats() { Get.toNamed(Routes.usageStats); } - - @override - void onClose() { - searchController.dispose(); - super.onClose(); - } } diff --git a/lib/modules/explore/views/explore_view.dart b/lib/modules/explore/views/explore_view.dart index c501ab04b..f4504e26e 100644 --- a/lib/modules/explore/views/explore_view.dart +++ b/lib/modules/explore/views/explore_view.dart @@ -25,7 +25,7 @@ class ExploreView extends GetView { child: SingleChildScrollView( //physics: const BouncingScrollPhysics(), child: Padding( - padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 0.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -66,14 +66,6 @@ class ExploreView extends GetView { // AI功能列表 SizedBox(height: 24.h), _buildCustomAILayout(isDarkMode), - - // 热门功能场景 - SizedBox(height: 24.h), - //_buildFunctionScenesSection(isDarkMode), - - // 新功能推荐 - SizedBox(height: 24.h), - //_buildNewFeatureSection(isDarkMode), ], ), ), @@ -104,59 +96,27 @@ class ExploreView extends GetView { color: isDarkMode ? Colors.white : Colors.grey[800], ), ), - Container( - width: 32.w, - height: 32.w, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.white.withOpacity(0.1) - : Colors.grey[200], - shape: BoxShape.circle, - ), - child: IconButton( - icon: Icon( - Icons.analytics_outlined, - size: 16.sp, - color: isDarkMode ? Colors.white : Colors.grey[700], - ), - padding: EdgeInsets.zero, - onPressed: controller.goToUsageStats, - ), - ), + // Container( + // width: 32.w, + // height: 32.w, + // decoration: BoxDecoration( + // color: isDarkMode + // ? Colors.white.withOpacity(0.1) + // : Colors.grey[200], + // shape: BoxShape.circle, + // ), + // child: IconButton( + // icon: Icon( + // Icons.analytics_outlined, + // size: 16.sp, + // color: isDarkMode ? Colors.white : Colors.grey[700], + // ), + // padding: EdgeInsets.zero, + // onPressed: controller.goToUsageStats, + // ), + // ), ], ), - - // // 搜索框 - // SizedBox(height: 16.h), - // Container( - // decoration: BoxDecoration( - // color: - // isDarkMode ? Colors.white.withOpacity(0.1) : Colors.grey[100], - // borderRadius: BorderRadius.circular(12.r), - // ), - // child: TextField( - // controller: controller.searchController, - // decoration: InputDecoration( - // hintText: 'searchAi'.tr, // 搜索AI功能... - // hintStyle: TextStyle( - // fontSize: 14.sp, - // color: isDarkMode ? Colors.grey[400] : Colors.grey[400], - // ), - // prefixIcon: Icon( - // Icons.search, - // size: 20.sp, - // color: isDarkMode ? Colors.grey[400] : Colors.grey[400], - // ), - // border: InputBorder.none, - // contentPadding: EdgeInsets.symmetric(vertical: 12.h), - // ), - // textInputAction: TextInputAction.search, - // onSubmitted: (_) => controller.search(), - // style: TextStyle( - // color: isDarkMode ? Colors.white : Colors.black, - // ), - // ), - // ), ], ), ); @@ -250,23 +210,8 @@ class ExploreView extends GetView { ); } - // 自定义AI功能布局:2x2网格,商务会议助手占据下方两个网格位置 + // 自定义AI功能布局:2x2网格 Widget _buildCustomAILayout(bool isDarkMode) { - // 找到AI全能助手 - final aiAssistantIndex = controller.aiFeatures.indexWhere( - (feature) => feature.agentId == 'personal_assistant', - ); - - // 找到同声传译 - final translationIndex = controller.aiFeatures.indexWhere( - (feature) => feature.agentId == 'simultaneous_interpreter', - ); - - // 找到商务会议助手(在aiFeaturesWide中) - final meetingFeature = controller.aiFeaturesWide.isNotEmpty - ? controller.aiFeaturesWide.first - : null; - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -287,47 +232,65 @@ class ExploreView extends GetView { Row( children: [ // 左上角:AI全能助手 - if (aiAssistantIndex != -1) - Expanded( - child: AspectRatio( - aspectRatio: 1.0, // 正方形 - child: _buildAIFeatureItem( - controller.aiFeatures[aiAssistantIndex], - aiAssistantIndex, - isDarkMode, - ), + Expanded( + child: AspectRatio( + aspectRatio: 1.0, // 正方形 + child: _buildAIFeatureItem( + controller.aiFeatures[0], + 0, + isDarkMode, ), ), + ), SizedBox(width: 16.w), // 右上角:同声传译 - if (translationIndex != -1) - Expanded( - child: AspectRatio( - aspectRatio: 1.0, // 正方形 - child: _buildAIFeatureItem( - controller.aiFeatures[translationIndex], - translationIndex, - isDarkMode, - ), + Expanded( + child: AspectRatio( + aspectRatio: 1.0, // 正方形 + child: _buildAIFeatureItem( + controller.aiFeatures[1], + 1, + isDarkMode, ), ), + ), ], ), SizedBox(height: 16.h), - // 下层:商务会议助手(横跨整行) - if (meetingFeature != null) - AspectRatio( - aspectRatio: 2.0, // 宽高比2:1,横跨两个网格位置 - child: _buildAIFeatureItemWideForMeeting( - meetingFeature, - 0, // 使用固定索引,因为这是aiFeaturesWide中的项目 - isDarkMode, + // 下层:商务会议助手+用量统计 + Row( + children: [ + // 左下角:商务会议助手 + Expanded( + child: AspectRatio( + aspectRatio: 1.0, // 正方形 + child: _buildAIFeatureItem( + controller.aiFeatures[2], + 2, + isDarkMode, + ), + ), ), - ), + + SizedBox(width: 16.w), + + // 右下角:用量统计 + Expanded( + child: AspectRatio( + aspectRatio: 1.0, // 正方形 + child: _buildAIFeatureItem( + controller.aiFeatures[3], + 3, + isDarkMode, + ), + ), + ), + ], + ), ], ), ], @@ -417,121 +380,9 @@ class ExploreView extends GetView { ); } -//整行布局 - Widget _buildAIFeaturesWideSection(bool isDarkMode) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Text( - // 'aiFunction'.tr, // AI功能 - // style: TextStyle( - // fontSize: 18.sp, - // fontWeight: FontWeight.w600, - // color: isDarkMode ? Colors.white : Colors.grey[800], - // ), - // ), - // SizedBox(height: 16.h), - // 直接使用 Column 包裹宽版卡片 - Column( - children: controller.aiFeaturesWide.map((feature) { - return Padding( - padding: EdgeInsets.only(bottom: 16.h), // 卡片间距 - child: _buildAIFeatureItemWide( - feature, - controller.aiFeatures.indexOf(feature), - isDarkMode, - ), - ); - }).toList(), - ), - ], - ); - } - - // AI功能项(宽版本,用于横跨整行的AI全能助手) + // AI功能项(宽版本) Widget _buildAIFeatureItemWide( AIFeature feature, int index, bool isDarkMode) { - return GestureDetector( - onTap: () => controller.onAIFeatureTap(index), - child: Container( - padding: EdgeInsets.all(20.w), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - feature.startColor.withOpacity(isDarkMode ? 0.3 : 0.3), - feature.endColor.withOpacity(isDarkMode ? 0.3 : 0.3), - ], - ), - borderRadius: BorderRadius.circular(20.r), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withOpacity(0.2) - : Colors.grey.withOpacity(0.1), - blurRadius: 8.w, - offset: const Offset(0, 4), - ), - ], - ), - child: Row( - children: [ - // 图标圆圈 - Container( - width: 48.w, - height: 48.w, - decoration: BoxDecoration( - color: feature.iconColor.withValues(alpha: 0.2), - shape: BoxShape.circle, - ), - child: Icon( - feature.icon, - size: 24.sp, - color: feature.iconColor, - ), - ), - SizedBox(width: 16.w), - // 文本内容 - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // 标题 - Text( - feature.title, - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.grey[800], - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - SizedBox(height: 4.h), - // 描述 - Text( - feature.description, - style: TextStyle( - fontSize: 12.sp, - color: isDarkMode ? Colors.grey[400] : Colors.grey[600], - ), - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), - ], - ), - ), - ], - ), - ), - ); - } - - // AI功能项(宽版本,专门用于商务会议助手) - Widget _buildAIFeatureItemWideForMeeting( - AIFeature feature, int index, bool isDarkMode) { return GestureDetector( onTap: () => controller.onAIFeatureWideTap(index), child: Container( @@ -609,202 +460,4 @@ class ExploreView extends GetView { ), ); } - - // 热门功能场景部分 - Widget _buildFunctionScenesSection(bool isDarkMode) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Text( - // 'popularFunction'.tr, // 热门功能场景 - // style: TextStyle( - // fontSize: 18.sp, - // fontWeight: FontWeight.w600, - // color: isDarkMode ? Colors.white : Colors.grey[800], - // ), - // ), - // SizedBox(height: 16.h), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: controller.functionScenes.length, - itemBuilder: (context, index) { - final scene = controller.functionScenes[index]; - return Padding( - padding: EdgeInsets.only(bottom: 16.h), - child: _buildFunctionSceneItem(scene, index, isDarkMode), - ); - }, - ), - ], - ); - } - - // 功能场景项 - Widget _buildFunctionSceneItem( - FunctionScene scene, int index, bool isDarkMode) { - return GestureDetector( - onTap: () => controller.onFunctionSceneTap(index), - child: Container( - padding: EdgeInsets.all(16.w), - decoration: BoxDecoration( - color: isDarkMode - ? Colors.white.withValues(alpha: 0.05) - : Colors.grey[100], - borderRadius: BorderRadius.circular(16.r), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withValues(alpha: 0.2) - : Colors.grey.withValues(alpha: 0.1), - blurRadius: 4, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - children: [ - // 图标 - Container( - width: 48.w, - height: 48.w, - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - scene.startColor.withOpacity(isDarkMode ? 0.3 : 0.3), - scene.endColor.withOpacity(isDarkMode ? 0.3 : 0.3), - ], - ), - borderRadius: BorderRadius.circular(12.r), - ), - child: Icon( - scene.icon, - size: 24.sp, - color: scene.iconColor, - ), - ), - SizedBox(width: 16.w), - - // 文本内容 - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - scene.title, - style: TextStyle( - fontSize: 16.sp, - fontWeight: FontWeight.w600, - color: isDarkMode ? Colors.white : Colors.grey[800], - ), - ), - SizedBox(height: 4.h), - Text( - scene.description, - style: TextStyle( - fontSize: 12.sp, - color: isDarkMode ? Colors.grey[400] : Colors.grey[600], - ), - ), - ], - ), - ), - ], - ), - ), - ); - } - - // 新功能推荐部分 - Widget _buildNewFeatureSection(bool isDarkMode) { - return Container( - padding: EdgeInsets.all(20.w), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - const Color(0xFF9C27B0).withOpacity(isDarkMode ? 0.3 : 0.3), - const Color(0xFFE91E63).withOpacity(isDarkMode ? 0.3 : 0.3), - ], - ), - borderRadius: BorderRadius.circular(16.r), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withOpacity(0.2) - : Colors.grey.withOpacity(0.1), - blurRadius: 8, - offset: const Offset(0, 4), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 图标 - Container( - width: 48.w, - height: 48.w, - decoration: BoxDecoration( - color: const Color(0xFF9C27B0).withOpacity(0.2), - borderRadius: BorderRadius.circular(12.r), - ), - child: Icon( - Icons.lightbulb_outline, - size: 24.sp, - color: const Color(0xFF9C27B0), - ), - ), - SizedBox(height: 16.h), - - // 标题 - Text( - 'aiSinger'.tr, // AI歌手模式 - style: TextStyle( - fontSize: 20.sp, - fontWeight: FontWeight.bold, - color: isDarkMode ? Colors.white : Colors.grey[800], - ), - ), - SizedBox(height: 8.h), - - // 描述 - Text( - 'aiSingerInfo'.tr, // 用你喜欢的歌手声音演唱任何歌曲,甚至是你自己创作的歌曲 - style: TextStyle( - fontSize: 14.sp, - color: isDarkMode ? Colors.grey[300] : Colors.grey[600], - ), - ), - SizedBox(height: 16.h), - - // 按钮 - ElevatedButton( - onPressed: controller.tryNewFeature, - style: ElevatedButton.styleFrom( - backgroundColor: isDarkMode - ? const Color(0xFF9C27B0) - : Colors.white.withOpacity(0.2), - foregroundColor: Colors.white, - padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.r), - ), - ), - child: Text( - 'tryNow'.tr, // 立即尝试 - style: TextStyle( - fontSize: 14.sp, - fontWeight: FontWeight.w500, - color: isDarkMode ? Colors.white : Colors.grey[800], - ), - ), - ), - ], - ), - ); - } } From 3e40ebec9f5df5c75bc8aaa0cf64ad0eb8e53876 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 6 Dec 2025 12:44:31 +0800 Subject: [PATCH 127/177] =?UTF-8?q?feat(settings):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E5=85=85=E5=80=BC=E7=95=8C=E9=9D=A2=E5=92=8C?= =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新会员充值卡片UI样式,添加云端同步选项 新增多语言翻译字段用于会员充值相关功能 --- lib/core/translations/language/ar_sa.dart | 8 +- lib/core/translations/language/bg_bg.dart | 8 +- lib/core/translations/language/cs_cz.dart | 8 +- lib/core/translations/language/da_dk.dart | 8 +- lib/core/translations/language/de_de.dart | 8 +- lib/core/translations/language/el_gr.dart | 8 +- lib/core/translations/language/en_us.dart | 8 +- lib/core/translations/language/es_es.dart | 8 +- lib/core/translations/language/et_ee.dart | 8 +- lib/core/translations/language/fa_ir.dart | 8 +- lib/core/translations/language/fi_fi.dart | 8 +- lib/core/translations/language/fr_fr.dart | 8 +- lib/core/translations/language/hi_in.dart | 8 +- lib/core/translations/language/hr_hr.dart | 8 +- lib/core/translations/language/hu_hu.dart | 8 +- lib/core/translations/language/id_id.dart | 8 +- lib/core/translations/language/is_is.dart | 8 +- lib/core/translations/language/it_it.dart | 8 +- lib/core/translations/language/ja_jp.dart | 10 +- lib/core/translations/language/ko_kr.dart | 8 +- lib/core/translations/language/lt_lt.dart | 8 +- lib/core/translations/language/lv_lv.dart | 8 +- lib/core/translations/language/ms_my.dart | 8 +- lib/core/translations/language/nb_no.dart | 8 +- lib/core/translations/language/nl_nl.dart | 8 +- lib/core/translations/language/pl_pl.dart | 8 +- lib/core/translations/language/pt_pt.dart | 8 +- lib/core/translations/language/ro_ro.dart | 8 +- lib/core/translations/language/ru_ru.dart | 8 +- lib/core/translations/language/sk_sk.dart | 8 +- lib/core/translations/language/sl_si.dart | 8 +- lib/core/translations/language/sr_rs.dart | 8 +- lib/core/translations/language/sv_se.dart | 8 +- lib/core/translations/language/th_th.dart | 8 +- lib/core/translations/language/tl_ph.dart | 8 +- lib/core/translations/language/tr_tr.dart | 8 +- lib/core/translations/language/uk_ua.dart | 8 +- lib/core/translations/language/vi_vn.dart | 8 +- lib/core/translations/language/zh_cn.dart | 6 +- lib/core/translations/language/zh_hk.dart | 8 +- lib/modules/settings/views/settings_view.dart | 109 +++++++++++------- 41 files changed, 305 insertions(+), 124 deletions(-) diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index b0d8eb705..3b1578ce3 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -429,8 +429,12 @@ const Map arSA = { 'inputAttendees': 'أدخل الحضور', // 设置页 - "systemSettings": "إعدادات النظام", - "premiumMember": "عضو مميز", + "systemSettings": "إعدادات النظام", //系统设置 + "vipRecharge": "إعادة صيغ العضوية", //会员充值 + "premiumMember": "عضو مميز", //AI充值 + "translationRecharge": "إعادة صيغ الترجمة", //翻译充值 + "meetingAssistantRecharge": "إعادة صيغ الاجتماع", //会议助手充值 + "cloudSync": "إعادة صيغ مزامنة السحابة", //云端同步 "joinDevice": "الجهاز المتصل:", "accountId": "معرف الحساب:", "systemSetting": "إعدادات النظام", diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index f09c1491e..0a9e23018 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -214,8 +214,12 @@ const Map bgBG = { 'meetingTranscript': 'Протокол от срещата', // 设置页 - "systemSettings": "Системни настройки", - "premiumMember": "Премиум член", + "systemSettings": "Системни настройки", //系统设置 + "vipRecharge": "Преплащане за VIP член", //会员充值 + "premiumMember": "Премиум член", //AI充值 + "translationRecharge": "Преплащане за превод", //翻译充值 + "meetingAssistantRecharge": "Преплащане за Сообщението", //会议助手充值 + "cloudSync": "Преплащане за синхронизация в облака", //云端同步 "joinDevice": "Свързано устройство:", "accountId": "ID на акаунта:", "systemSetting": "Системни настройки", diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index f5d2aaa00..b9793a751 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -212,8 +212,12 @@ const Map csCZ = { 'meetingTranscript': 'Přepis schůzky', // 设置页 - "systemSettings": "Systémová nastavení", - "premiumMember": "Prémiový člen", + "systemSettings": "Systémová nastavení", //系统设置 + "vipRecharge": "Přepayka VIP členství", //会员充值 + "premiumMember": "Prémiový člen", //AI充值 + "translationRecharge": "Přepayka překladu", //翻译充值 + "meetingAssistantRecharge": "Přepayka asistenta schůzky", //会议助手充值 + "cloudSync": "Přepayka synchronizace v cloudu", //云端同步 "joinDevice": "Připojené zařízení:", "accountId": "ID účtu:", "systemSetting": "Systémová nastavení", diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index 5f51eb2bf..11e00c385 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -213,8 +213,12 @@ const Map daDK = { 'meetingTranscript': 'Mødeudskrift', // 设置页 - "systemSettings": "Systemindstillinger", - "premiumMember": "Premium medlem", + "systemSettings": "Systemindstillinger", //系统设置 + "vipRecharge": "Opladning af VIP medlem", //会员充值 + "premiumMember": "Premium medlem", //AI充值 + "translationRecharge": "Opladning af oversetning", //翻译充值 + "meetingAssistantRecharge": "Opladning af mødeassistent", //会议助手充值 + "cloudSync": "Opladning af cloud-synkronisering", //云端同步 "joinDevice": "Tilsluttet enhed:", "accountId": "Konto-ID:", "systemSetting": "Systemindstillinger", diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index 0960e49f6..803347359 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -217,8 +217,12 @@ const Map deDE = { 'meetingTranscript': 'Meeting-Transkript', // 设置页 - "systemSettings": "Systemeinstellungen", - "premiumMember": "Premium-Mitgliedschaft", + "systemSettings": "Systemeinstellungen", //系统设置 + "vipRecharge": "VIP-Mitgliedschaft-Recharge", //会员充值 + "premiumMember": "Premium-Mitgliedschaft", //AI充值 + "translationRecharge": "Übersetzungs-Recharge", //翻译充值 + "meetingAssistantRecharge": "Meeting-Assistent-Recharge", //会议助手充值 + "cloudSync": "Cloud-Synchronisierung-Recharge", //云端同步 "joinDevice": "Verbundenes Gerät:", "accountId": "Konto-ID:", "systemSetting": "Systemeinstellungen", diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index 8a9254504..175861818 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -215,8 +215,12 @@ const Map elGR = { 'meetingTranscript': 'Απομαγνητοφώνηση συνάντησης', // 设置页 - "systemSettings": "Ρυθμίσεις συστήματος", - "premiumMember": "Premium μέλος", + "systemSettings": "Ρυθμίσεις συστήματος", //系统设置 + "vipRecharge": "Περιορέωση VIP μέλους", //会员充值 + "premiumMember": "Premium μέλος", //AI充值 + "translationRecharge": "Περιορέωση μετάφρασης", //翻译充值 + "meetingAssistantRecharge": "Περιορέωση βοηθού συνάντησης", //会议助手充值 + "cloudSync": "Περιορέωση συγχρονισμού στο cloud", //云端同步 "joinDevice": "Συνδεδεμένη συσκευή:", "accountId": "ID λογαριασμού:", "systemSetting": "Ρυθμίσεις συστήματος", diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 9f9ec4524..ec6c0edd8 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -597,8 +597,12 @@ const Map enUS = { 'inputAttendees': 'Enter Attendees', // 设置页 - "systemSettings": "System Settings", - "premiumMember": "Premium Membership", + "systemSettings": "System Settings", //系统设置 + "vipRecharge": "VIP Recharge", //会员充值 + "premiumMember": "AI Recharge", //AI充值 + "translationRecharge": "Translation Recharge", //翻译充值 + "meetingAssistantRecharge": "Meeting Recharge", //会议充值 + "cloudSync": "Cloud Sync Recharge", //云端同步 "memberService": "Member Service", "bindRewardTitle": "Rewards", "bindRewardSimpleDesc": diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 626061581..1adae42bd 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -216,8 +216,12 @@ const Map esES = { 'meetingTranscript': 'Transcripción de reunión', // 设置页 - "systemSettings": "Configuración del sistema", - "premiumMember": "Miembro premium", + "systemSettings": "Configuración del sistema", //系统设置 + "vipRecharge": "Recarga de VIP", //会员充值 + "premiumMember": "Miembro premium", //AI充值 + "translationRecharge": "Recarga de traducción", //翻译充值 + "meetingAssistantRecharge": "Recarga de asistente de reunión", //会议助手充值 + "cloudSync": "Recarga de sincronización en la nube", //云端同步 "joinDevice": "Dispositivo conectado:", "accountId": "ID de cuenta:", "systemSetting": "Configuración del sistema", diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index 6816cba04..3e47b9d0d 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -210,8 +210,12 @@ const Map etEE = { 'meetingTranscript': 'Koosoleku transkriptsioon', // 设置页 - "systemSettings": "Süsteemi seaded", - "premiumMember": "Premium liige", + "systemSettings": "Süsteemi seaded", //系统设置 + "vipRecharge": "VIP liige varundus", //会员充值 + "premiumMember": "Premium liige", //AI充值 + "translationRecharge": "Tõlke varundus", //翻译充值 + "meetingAssistantRecharge": "Koosoleku assistendi varundus", //会议助手充值 + "cloudSync": "Pääsyvaraus cloud-synkronointiin", //云端同步 "joinDevice": "Ühendatud seade:", "accountId": "Konto ID:", "systemSetting": "Süsteemi seaded", diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index 92e9889cb..fc7d14415 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -429,8 +429,12 @@ const Map faIR = { 'inputAttendees': 'ورود شرکت‌کنندگان', // 设置页 - "systemSettings": "تنظیمات سیستم", - "premiumMember": "عضویت ویژه", + "systemSettings": "تنظیمات سیستم", //系统设置 + "vipRecharge": "شارژ عضویت ویژه", //会员充值 + "premiumMember": "عضویت ویژه", //AI充值 + "translationRecharge": "شارژ ترجمه", //翻译充值 + "meetingAssistantRecharge": "شارژ کمک‌کننده جلسه", //会议助手充值 + "cloudSync": "شارژ همگام‌سازی ابری", //云端同步 "joinDevice": "دستگاه متصل:", "accountId": "شناسه حساب:", "systemSetting": "تنظیمات سیستم", diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index da47b92ad..acf223fbf 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -213,8 +213,12 @@ const Map fiFI = { 'meetingTranscript': 'Kokouksen transkriptio', // 设置页 - "systemSettings": "Järjestelmäasetukset", - "premiumMember": "Premium-jäsen", + "systemSettings": "Järjestelmäasetukset", //系统设置 + "vipRecharge": "Premium-jäsenvaraus", //会员充值 + "premiumMember": "Premium-jäsen", //AI充值 + "translationRecharge": "Käännösvaraus", //翻译充值 + "meetingAssistantRecharge": "Kokousavustajan varaus", //会议助手充值 + "cloudSync": "Pääsyvaraus cloud-synkronointiin", //云端同步 "joinDevice": "Yhdistetty laite:", "accountId": "Tilin tunnus:", "systemSetting": "Järjestelmäasetukset", diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index 3ebb0fa62..2531f1951 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -219,8 +219,12 @@ const Map frFR = { 'meetingTranscript': 'Transcription de la réunion', // 设置页 - "systemSettings": "Paramètres système", - "premiumMember": "Membre premium", + "systemSettings": "Paramètres système", //系统设置 + "vipRecharge": "Recharge de VIP", //会员充值 + "premiumMember": "Membre premium", //AI充值 + "translationRecharge": "Recharge de traduction", //翻译充值 + "meetingAssistantRecharge": "Recharge de l'assistant de réunion", //会议助手充值 + "cloudSync": "Recharge de synchronisation cloud", //云端同步 "joinDevice": "Appareil connecté :", "accountId": "ID du compte :", "systemSetting": "Paramètres système", diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 348a8f121..ae79c91b5 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -210,8 +210,12 @@ const Map hiIN = { 'meetingTranscript': 'बैठक का प्रतिलेख', // 设置页 - "systemSettings": "सिस्टम सेटिंग्स", - "premiumMember": "प्रीमियम सदस्य", + "systemSettings": "सिस्टम सेटिंग्स", //系统设置 + "vipRecharge": "प्रीमियम सदस्य रिचार्ज", //会员充值 + "premiumMember": "प्रीमियम सदस्य", //AI充值 + "translationRecharge": "अनुवाद रिचार्ज", //翻译充值 + "meetingAssistantRecharge": "बैठक असिस्टेंट रिचार्ज", //会议助手充值 + "cloudSync": "क्लाउड सिंक्रोनाइज़ेशन रिचार्ज", //云端同步 "joinDevice": "कनेक्टेड डिवाइस:", "accountId": "खाता आईडी:", "systemSetting": "सिस्टम सेटिंग", diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index b1103c34f..a6a3e0386 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -216,8 +216,12 @@ const Map hrHR = { 'meetingTranscript': 'Transkript sastanka', // 设置页 - "systemSettings": "Postavke sustava", - "premiumMember": "Premium član", + "systemSettings": "Postavke sustava", //系统设置 + "vipRecharge": "Ponuda premium članstva", //会员充值 + "premiumMember": "Premium član", //AI充值 + "translationRecharge": "Prijevod ponuda", //翻译充值 + "meetingAssistantRecharge": "Asistent sastanka ponuda", //会议助手充值 + "cloudSync": "Synchronizacija u oblaku ponuda", //云端同步 "joinDevice": "Povezan uređaj:", "accountId": "ID računa:", "systemSetting": "Postavke sustava", diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index 7a47009ff..e20a91487 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -216,8 +216,12 @@ const Map huHU = { 'meetingTranscript': 'Megbeszélés átirata', // 设置页 - "systemSettings": "Rendszerbeállítások", - "premiumMember": "Prémium tag", + "systemSettings": "Rendszerbeállítások", //系统设置 + "vipRecharge": "Prémium tag ponuda", //会员充值 + "premiumMember": "Prémium tag", //AI充值 + "translationRecharge": "Fordítás ponuda", //翻译充值 + "meetingAssistantRecharge": "Megbeszélés asszisztens ponuda", //会议助手充值 + "cloudSync": "Synchronizációs ponuda", //云端同步 "joinDevice": "Csatlakoztatott eszköz:", "accountId": "Fiók azonosító:", "systemSetting": "Rendszerbeállítás", diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 7520cd66c..99ba6c8a4 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -211,8 +211,12 @@ const Map idID = { 'meetingTranscript': 'Transkrip Rapat', // 设置页 - "systemSettings": "Pengaturan Sistem", - "premiumMember": "Anggota Premium", + "systemSettings": "Pengaturan Sistem", //系统设置 + "vipRecharge": "Pembayaran Premium", //会员充值 + "premiumMember": "Anggota Premium", //AI充值 + "translationRecharge": "Pembayaran Terjemahan", //翻译充值 + "meetingAssistantRecharge": "Pembayaran Asisten Rapat", //会议助手充值 + "cloudSync": "Pembayaran Sinkronisasi awan", //云端同步 "joinDevice": "Perangkat terhubung:", "accountId": "ID Akun:", "systemSetting": "Pengaturan Sistem", diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index 7976276d5..8990e7301 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -211,8 +211,12 @@ const Map isIS = { 'meetingTranscript': 'Fundarritun', // 设置页 - "systemSettings": "Kerfisstillingar", - "premiumMember": "Premium meðlimur", + "systemSettings": "Kerfisstillingar", //系统设置 + "vipRecharge": "Premium meðlimurinnsla", //会员充值 + "premiumMember": "Premium meðlimur", //AI充值 + "translationRecharge": "Þýðingsponsoring", //翻译充值 + "meetingAssistantRecharge": "Fundarasistentsponsoring", //会议助手充值 + "cloudSync": "Synchronisering með skýjaraddþjónustu", //云端同步 "joinDevice": "Tengt tæki:", "accountId": "Auðkenni reiknings:", "systemSetting": "Kerfisstillingar", diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index ea56b3896..d086c7178 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -218,8 +218,12 @@ const Map itIT = { 'meetingTranscript': 'Trascrizione riunione', // 设置页 - "systemSettings": "Impostazioni di sistema", - "premiumMember": "Membro Premium", + "systemSettings": "Impostazioni di sistema", //系统设置 + "vipRecharge": "Ricarica membro Premium", //会员充值 + "premiumMember": "Membro Premium", //AI充值 + "translationRecharge": "Recharge traduzione", //翻译充值 + "meetingAssistantRecharge": "Recharge assistente riunione", //会议助手充值 + "cloudSync": "Recharge sincronizzazione cloud", //云端同步 "joinDevice": "Dispositivo connesso:", "accountId": "ID account:", "systemSetting": "Impostazioni di sistema", diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index 877bdc8bb..b8fd8eec6 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -202,11 +202,15 @@ const Map jaJP = { 'meeting': '会議', 'recordingDetails': '録音詳細', 'aiSummary': 'AI要約', - 'meetingTranscript': '会議記録', + 'meetingTranscript': '会議記録', //会议记录 // 设置页 - "systemSettings": "システム設定", - "premiumMember": "プレミアムメンバー", + "systemSettings": "システム設定", //系统设置 + "vipRecharge": "プレミアムメンバー料金", //会员充值 + "premiumMember": "プレミアムメンバー", //AI充值 + "translationRecharge": "翻訳料金", //翻译充值 + "meetingAssistantRecharge": "会議アシスタント料金", //会议助手充值 + "cloudSync": "クラウド同期料金", //云端同步 "joinDevice": "接続デバイス:", "accountId": "アカウントID:", "systemSetting": "システム設定", diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 5e16c8981..84b28783f 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -203,8 +203,12 @@ const Map koKR = { 'meetingTranscript': '회의 원문', // 设置页 - "systemSettings": "시스템 설정", - "premiumMember": "프리미엄 회원", + "systemSettings": "시스템 설정", //系统设置 + "vipRecharge": "프리미엄 회원료", //会员充值 + "premiumMember": "프리미엄 회원", //AI充值 + "translationRecharge": "번역료", //翻译充值 + "meetingAssistantRecharge": "회의 어시스턴트료", //会议助手充值 + "cloudSync": "클라우드 동기화료", //云端同步 "joinDevice": "연결된 기기:", "accountId": "계정 ID:", "systemSetting": "시스템 설정", diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 5588dcb62..0d6fa4d59 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -215,8 +215,12 @@ const Map ltLT = { 'meetingTranscript': 'Susitikimo stenograma', // 设置页 - "systemSettings": "Sistemos nustatymai", - "premiumMember": "Premium narys", + "systemSettings": "Sistemos nustatymai", //系统设置 + "vipRecharge": "Premium naryso užsipirkimas", //会员充值 + "premiumMember": "Premium narys", //AI充值 + "translationRecharge": "Vertimo užsipirkimas", //翻译充值 + "meetingAssistantRecharge": "Susitikimų asistento užsipirkimas", //会议助手充值 + "cloudSync": "Synchronizacijos užsipirkimas", //云端同步 "joinDevice": "Prijungtas įrenginys:", "accountId": "Paskyros ID:", "systemSetting": "Sistemos nustatymas", diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 27aac8005..163d2903e 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -214,8 +214,12 @@ const Map lvLV = { 'meetingTranscript': 'Sapulces atšifrējums', // 设置页 - "systemSettings": "Sistēmas iestatījumi", - "premiumMember": "Premium biedrs", + "systemSettings": "Sistēmas iestatījumi", //系统设置 + "vipRecharge": "Premium biedra pārrakstīšana", //会员充值 + "premiumMember": "Premium biedrs", //AI充值 + "translationRecharge": "Tulkošanas pārrakstīšana", //翻译充值 + "meetingAssistantRecharge": "Sapulces palīgs pārrakstīšana", //会议助手充值 + "cloudSync": "Tīkla sincronizācijas pārrakstīšana", //云端同步 "joinDevice": "Savienotā ierīce:", "accountId": "Konta ID:", "systemSetting": "Sistēmas iestatījumi", diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index 35e225415..099081ffc 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -213,8 +213,12 @@ const Map msMY = { 'meetingTranscript': 'Transkrip Mesyuarat', // 设置页 - "systemSettings": "Tetapan Sistem", - "premiumMember": "Ahli Premium", + "systemSettings": "Tetapan Sistem", //系统设置 + "vipRecharge": "Pembayaran Ahli Premium", //会员充值 + "premiumMember": "Ahli Premium", //AI充值 + "translationRecharge": "Pembayaran Penterjemahan", //翻译充值 + "meetingAssistantRecharge": "Pembayaran Pembantu Mesyuarat", //会议助手充值 + "cloudSync": "Pembayaran Sinkronisasi awan", //云端同步 "joinDevice": "Peranti disambungkan:", "accountId": "ID Akaun:", "systemSetting": "Tetapan Sistem", diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index 02225c5b6..54a5168a0 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -213,8 +213,12 @@ const Map nbNO = { 'meetingTranscript': 'Møtetranskripsjon', // 设置页 - "systemSettings": "Systeminnstillinger", - "premiumMember": "Premium-medlem", + "systemSettings": "Systeminnstillinger", //系统设置 + "vipRecharge": "Premium-medlemsinnskudd", //会员充值 + "premiumMember": "Premium-medlem", //AI充值 + "translationRecharge": "Oversettelsespenger", //翻译充值 + "meetingAssistantRecharge": "Møteassistentpenger", //会议助手充值 + "cloudSync": "Cloud-synchroniseringspenger", //云端同步 "joinDevice": "Tilkoblet enhet:", "accountId": "Konto-ID:", "systemSetting": "Systeminnstillinger", diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index 043908c23..a6a9ed97d 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -214,8 +214,12 @@ const Map nlNL = { 'meetingTranscript': 'Vergadertranscript', // 设置页 - "systemSettings": "Systeeminstellingen", - "premiumMember": "Premium lid", + "systemSettings": "Systeeminstellingen", //系统设置 + "vipRecharge": "Premium lidspayering", //会员充值 + "premiumMember": "Premium lid", //AI充值 + "translationRecharge": "Vertalingspayering", //翻译充值 + "meetingAssistantRecharge": "Vergaderassistentpayering", //会议助手充值 + "cloudSync": "Cloud-synchronisatiepayering", //云端同步 "joinDevice": "Verbonden apparaat:", "accountId": "Account-ID:", "systemSetting": "Systeeminstellingen", diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index c6b2c7add..604087c23 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -215,8 +215,12 @@ const Map plPL = { 'meetingTranscript': 'Transkrypcja spotkania', // 设置页 - "systemSettings": "Ustawienia systemowe", - "premiumMember": "Członek Premium", + "systemSettings": "Ustawienia systemowe", //系统设置 + "vipRecharge": "Płatność Premium", //会员充值 + "premiumMember": "Członek Premium", //AI充值 + "translationRecharge": "Płatność tłumaczenia", //翻译充值 + "meetingAssistantRecharge": "Płatność asystenta spotkań", //会议助手充值 + "cloudSync": "Płatność synchronizacji w chmurze", //云端同步 "joinDevice": "Podłączone urządzenie:", "accountId": "ID konta:", "systemSetting": "Ustawienia systemowe", diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 54d7e7724..3c88d9636 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -218,8 +218,12 @@ const Map ptPT = { 'meetingTranscript': 'Transcrição da Reunião', // 设置页 - "systemSettings": "Definições do Sistema", - "premiumMember": "Membro Premium", + "systemSettings": "Definições do Sistema", //系统设置 + "vipRecharge": "Recarga Premium", //会员充值 + "premiumMember": "Membro Premium", //AI充值 + "translationRecharge": "Recarga de Tradução", //翻译充值 + "meetingAssistantRecharge": "Recarga do Assistente de Reunião", //会议助手充值 + "cloudSync": "Recarga de Sincronização em Nuvem", //云端同步 "joinDevice": "Dispositivo conectado:", "accountId": "ID da Conta:", "systemSetting": "Definição do Sistema", diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index 8075a5f50..e795b025a 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -217,8 +217,12 @@ const Map roRO = { 'meetingTranscript': 'Transcriere ședință', // 设置页 - "systemSettings": "Setări de sistem", - "premiumMember": "Membru Premium", + "systemSettings": "Setări de sistem", //系统设置 + "vipRecharge": "Recarga Premium", //会员充值 + "premiumMember": "Membru Premium", //AI充值 + "translationRecharge": "Recarga de traducere", //翻译充值 + "meetingAssistantRecharge": "Recarga de asistent ședință", //会议助手充值 + "cloudSync": "Recarga de sincronizare în cloud", //云端同步 "joinDevice": "Dispozitiv conectat:", "accountId": "ID cont:", "systemSetting": "Setări de sistem", diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 2e8bad9f0..d39d79a7e 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -216,8 +216,12 @@ const Map ruRU = { 'meetingTranscript': 'Транскрипт встречи', // 设置页 - "systemSettings": "Системные настройки", - "premiumMember": "Премиум-участник", + "systemSettings": "Системные настройки", //系统设置 + "vipRecharge": "Пополнение премиум-члена", //会员充值 + "premiumMember": "Премиум-участник", //AI充值 + "translationRecharge": "Пополнение перевода", //翻译充值 + "meetingAssistantRecharge": "Пополнение помощника встречи", //会议助手充值 + "cloudSync": "Пополнение синхронизации в облаке", //云端同步 "joinDevice": "Подключенное устройство:", "accountId": "ID аккаунта:", "systemSetting": "Системные настройки", diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index 32d14d1fe..0316a20da 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -214,8 +214,12 @@ const Map skSK = { 'meetingTranscript': 'Prepis stretnutia', // 设置页 - "systemSettings": "Systémové nastavenia", - "premiumMember": "Prémium člen", + "systemSettings": "Systémové nastavenia", //系统设置 + "vipRecharge": "Nákup prémium členstva", //会员充值 + "premiumMember": "Prémium člen", //AI充值 + "translationRecharge": "Nákup prekladov", //翻译充值 + "meetingAssistantRecharge": "Nákup asistentu stretnutia", //会议助手充值 + "cloudSync": "Nákup synchronizácie v cloude", //云端同步 "joinDevice": "Pripojené zariadenie:", "accountId": "ID účtu:", "systemSetting": "Systémové nastavenie", diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index 2c9eec354..de9d0276c 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -214,8 +214,12 @@ const Map slSI = { 'meetingTranscript': 'Prepis sestanka', // 设置页 - "systemSettings": "Sistemske nastavitve", - "premiumMember": "Premium član", + "systemSettings": "Sistemske nastavitve", //系统设置 + "vipRecharge": "Nákup premium člana", //会员充值 + "premiumMember": "Premium član", //AI充值 + "translationRecharge": "Nákup prevajanja", //翻译充值 + "meetingAssistantRecharge": "Nákup asistenta sestanka", //会议助手充值 + "cloudSync": "Nákup sinkronizacije v oblaku", //云端同步 "joinDevice": "Povezana naprava:", "accountId": "ID računa:", "systemSetting": "Sistemska nastavitev", diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index 1ab654c58..c8b61f61c 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -213,8 +213,12 @@ const Map srRS = { 'meetingTranscript': 'Transkript sastanka', // 设置页 - "systemSettings": "Sistemska podešavanja", - "premiumMember": "Premium član", + "systemSettings": "Sistemska podešavanja", //系统设置 + "vipRecharge": "Nákup premium člana", //会员充值 + "premiumMember": "Premium član", //AI充值 + "translationRecharge": "Nákup prevajanja", //翻译充值 + "meetingAssistantRecharge": "Nákup asistenta sastanka", //会议助手充值 + "cloudSync": "Nákup sinkronizacije u oblaku", //云端同步 "joinDevice": "Povezan uređaj:", "accountId": "ID naloga:", "systemSetting": "Sistemsko podešavanje", diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index 0ee05fc05..01db4c3ac 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -214,8 +214,12 @@ const Map svSE = { 'meetingTranscript': 'Mötesutskrift', // 设置页 - "systemSettings": "Systeminställningar", - "premiumMember": "Premium-medlem", + "systemSettings": "Systeminställningar", //系统设置 + "vipRecharge": "Premium-låntagning", //会员充值 + "premiumMember": "Premium-medlem", //AI充值 + "translationRecharge": "Översättningslåntagning", //翻译充值 + "meetingAssistantRecharge": "Mötesassistentlåntagning", //会议助手充值 + "cloudSync": "Molnsynkronisering", //云端同步 "joinDevice": "Ansluten enhet:", "accountId": "Konto-ID:", "systemSetting": "Systeminställning", diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index 0f5b3d2bb..60c85fcd1 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -206,8 +206,12 @@ const Map thTH = { 'meetingTranscript': 'ข้อความถอดเสียงการประชุม', // 设置页 - "systemSettings": "การตั้งค่าระบบ", - "premiumMember": "สมาชิกระดับพรีเมียม", + "systemSettings": "การตั้งค่าระบบ", //系统设置 + "vipRecharge": "การเติมเงินสมาชิกระดับพรีเมียม", //会员充值 + "premiumMember": "สมาชิกระดับพรีเมียม", //AI充值 + "translationRecharge": "การเติมเงินการแปล", //翻译充值 + "meetingAssistantRecharge": "การเติมเงินผู้ช่วยการประชุม", //会议助手充值 + "cloudSync": "การเติมเงินการ đồng bộ hóaคลาวด์", //云端同步 "joinDevice": "อุปกรณ์ที่เชื่อมต่อ:", "accountId": "ID บัญชี:", "systemSetting": "การตั้งค่าระบบ", diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index 507867777..9b537f6b5 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -217,8 +217,12 @@ const Map tlPH = { 'meetingTranscript': 'Transkripsyon ng Pulong', // 设置页 - "systemSettings": "Mga Setting ng System", - "premiumMember": "Premium na Miyembro", + "systemSettings": "Mga Setting ng System", //系统设置 + "vipRecharge": "Pagsasalin ng Recharge ng Premium na Miyembro", //会员充值 + "premiumMember": "Premium na Miyembro", //AI充值 + "translationRecharge": "Pagsasalin ng Recharge", //翻译充值 + "meetingAssistantRecharge": "Pagsasalin ng Recharge ng Pulong", //会议助手充值 + "cloudSync": "Pagsasalin ng Recharge ng Cloud", //云端同步 "joinDevice": "Konektadong device:", "accountId": "Account ID:", "systemSetting": "Setting ng System", diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index 1edb17ea9..8d4453991 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -211,8 +211,12 @@ const Map trTR = { 'meetingTranscript': 'Toplantı Metni', // 设置页 - "systemSettings": "Sistem Ayarları", - "premiumMember": "Premium Üye", + "systemSettings": "Sistem Ayarları", //系统设置 + "vipRecharge": "Premium Üye Recharge", //会员充值 + "premiumMember": "Premium Üye", //AI充值 + "translationRecharge": "Çeviri Toplantı Recharge", //翻译充值 + "meetingAssistantRecharge": "Toplantı Asistanı Recharge", //会议助手充值 + "cloudSync": "Bulut Sincronizasyonu", //云端同步 "joinDevice": "Bağlı cihaz:", "accountId": "Hesap Kimliği:", "systemSetting": "Sistem Ayarları", diff --git a/lib/core/translations/language/uk_ua.dart b/lib/core/translations/language/uk_ua.dart index 0c010296f..28f538d65 100644 --- a/lib/core/translations/language/uk_ua.dart +++ b/lib/core/translations/language/uk_ua.dart @@ -215,8 +215,12 @@ const Map ukUA = { 'meetingTranscript': 'Транскрипт зустрічі', // 设置页 - "systemSettings": "Системні налаштування", - "premiumMember": "Преміум-учасник", + "systemSettings": "Системні налаштування", //系统设置 + "vipRecharge": "Підписатися на премиум-членство", //会员充值 + "premiumMember": "Преміум-учасник", //AI充值 + "translationRecharge": "Підписатися на переклад", //翻译充值 + "meetingAssistantRecharge": "Підписатися на допомогу з зустрічю", //会议助手充值 + "cloudSync": "Увімкнути синхронізацію в хмарі", //云端同步 "joinDevice": "Підключений пристрій:", "accountId": "ID облікового запису:", "systemSetting": "Системні налаштування", diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index 3c5336eef..7055badee 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -210,8 +210,12 @@ const Map viVN = { 'meetingTranscript': 'Bản ghi cuộc họp', // 设置页 - "systemSettings": "Cài đặt hệ thống", - "premiumMember": "Thành viên Premium", + "systemSettings": "Cài đặt hệ thống", //系统设置 + "vipRecharge": "Nạp lại dịch vụ Premium", //会员充值 + "premiumMember": "Thành viên Premium", //AI充值 + "translationRecharge": "Nạp lại dịch vụ dịch", //翻译充值 + "meetingAssistantRecharge": "Nạp lại dịch vụ hỗ trợ họp", //会议助手充值 + "cloudSync": "Chuyển đổi đồng bộ hóa đám mây", //云端同步 "joinDevice": "Thiết bị đã kết nối:", "accountId": "ID tài khoản:", "systemSetting": "Cài đặt hệ thống", diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 763f1adfc..d96d17eb7 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -559,7 +559,11 @@ const Map zhCN = { // 设置页 "systemSettings": "系统设置", - "premiumMember": "高级会员", + "vipRecharge": "会员充值", + "premiumMember": "AI充值", + "translationRecharge": "翻译充值", + "meetingAssistantRecharge": "会议充值", + "cloudSync": "云端同步", "memberService": "会员服务", "bindRewardTitle": "奖励", "bindRewardSimpleDesc": "首次绑定设备奖励已下发,点击确定关闭即可", diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index c75856db6..2d31ea168 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -225,8 +225,12 @@ const Map zhHK = { 'meetingTranscript': '會議原文', // 設定頁 - "systemSettings": "系統設定", - "premiumMember": "高級會員", + "systemSettings": "系統設定", //系统设置 + "vipRecharge": "高級會員充值", //会员充值 + "premiumMember": "高級會員", //AI充值 + "translationRecharge": "翻譯充值", //翻译充值 + "meetingAssistantRecharge": "會議充值", //会议充值 + "cloudSync": "雲端同步", //云端同步 "joinDevice": "已連接設備:", "accountId": "帳號ID:", "systemSetting": "系統設定", diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index 7691cba0a..9bd94a050 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -40,11 +40,11 @@ class SettingsView extends GetView { padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), children: [ _buildUserInfoCard(isDarkMode), - SizedBox(height: 20.h), + SizedBox(height: 12.h), _buildVipPurchaseCard(isDarkMode), // SizedBox(height: 20.h), // _buildAISettingsSection(isDarkMode), - SizedBox(height: 20.h), + SizedBox(height: 16.h), _buildSystemSettingsSection(isDarkMode), SizedBox(height: 20.h), _buildAboutSection(isDarkMode), @@ -220,15 +220,15 @@ class SettingsView extends GetView { // 构建Vip购买卡片 Widget _buildVipPurchaseCard(bool isDarkMode) { return Container( - padding: EdgeInsets.all(16.w), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 12.h), decoration: BoxDecoration( gradient: LinearGradient( colors: isDarkMode ? [ - const Color(0xFF4A148C).withOpacity(0.7), - const Color(0xFFAD1457).withOpacity(0.7) + const Color(0xFF0D47A1).withOpacity(0.5), + const Color(0xFF1976D2).withOpacity(0.5) ] - : [const Color(0xFFF8BBD0), const Color(0xFFE1BEE7)], + : [const Color(0xFFE3F2FD), const Color(0xFFBBDEFB)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), @@ -243,45 +243,64 @@ class SettingsView extends GetView { ), ], ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildCategoryItem( - icon: Icons.workspace_premium, - label: 'premiumMember'.tr, - iconBg: isDarkMode - ? Colors.amber[900]!.withOpacity(0.3) - : Colors.amber[100]!, - iconColor: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, - onTap: () => Get.toNamed(Routes.goodsvip), - ), - _buildCategoryItem( - icon: Icons.translate, - label: 'interpretation'.tr, - iconBg: isDarkMode - ? Colors.indigo[900]!.withOpacity(0.3) - : Colors.indigo[100]!, - iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, - onTap: () => Get.toNamed(Routes.goodstrade), + Text( + 'vipRecharge'.tr, // 会员充值 + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black87, + ), ), - _buildCategoryItem( - icon: Icons.people, - label: 'conferenceAssistant'.tr, - iconBg: isDarkMode - ? Colors.pink[900]!.withOpacity(0.3) - : Colors.pink[100]!, - iconColor: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, - onTap: () => Get.toNamed(Routes.goodsmeet), + SizedBox(height: 12.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildCategoryItem( + icon: Icons.workspace_premium, + label: 'premiumMember'.tr, //AI充值 + iconBg: isDarkMode + ? Colors.amber[900]!.withOpacity(0.3) + : Colors.amber[100]!, + iconColor: isDarkMode ? Colors.amber[300]! : Colors.amber[600]!, + textColor: isDarkMode ? Colors.white : Colors.black87, + onTap: () => Get.toNamed(Routes.goodsvip), + ), + _buildCategoryItem( + icon: Icons.translate, + label: 'translationRecharge'.tr, //翻译充值 + iconBg: isDarkMode + ? Colors.indigo[900]!.withOpacity(0.3) + : Colors.indigo[100]!, + iconColor: + isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, + textColor: isDarkMode ? Colors.white : Colors.black87, + onTap: () => Get.toNamed(Routes.goodstrade), + ), + _buildCategoryItem( + icon: Icons.people, + label: 'meetingAssistantRecharge'.tr, //会议充值 + iconBg: isDarkMode + ? Colors.pink[900]!.withOpacity(0.3) + : Colors.pink[100]!, + iconColor: isDarkMode ? Colors.pink[300]! : Colors.pink[600]!, + textColor: isDarkMode ? Colors.white : Colors.black87, + onTap: () => Get.toNamed(Routes.goodsmeet), + ), + _buildCategoryItem( + icon: Icons.cloud, + label: 'cloudSync'.tr, //云端同步 + iconBg: isDarkMode + ? Colors.teal[900]!.withOpacity(0.3) + : Colors.teal[100]!, + iconColor: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, + textColor: isDarkMode ? Colors.white : Colors.black87, + onTap: () => {}, + ), + ], ), - // _buildCategoryItem( - // icon: Icons.smart_toy, - // label: 'aiFunction'.tr, - // iconBg: isDarkMode - // ? Colors.teal[900]!.withOpacity(0.3) - // : Colors.teal[100]!, - // iconColor: isDarkMode ? Colors.teal[300]! : Colors.teal[600]!, - // onTap: () => Get.toNamed(Routes.goodsai), - // ), ], ), ); @@ -293,6 +312,7 @@ class SettingsView extends GetView { required Color iconBg, required Color iconColor, required VoidCallback onTap, + Color? textColor, }) { return InkWell( onTap: onTap, @@ -312,7 +332,7 @@ class SettingsView extends GetView { color: iconColor, ), ), - SizedBox(height: 8.h), + SizedBox(height: 5.h), SizedBox( width: 72.w, height: 32.h, @@ -323,7 +343,8 @@ class SettingsView extends GetView { style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w500, - color: Colors.white, + color: textColor ?? + (Get.isDarkMode ? Colors.white : Colors.black87), height: 1.2, ), maxLines: 2, From 8cd94f9c87ff6fc949cf5e4ca08c1504f966c493 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 6 Dec 2025 15:27:57 +0800 Subject: [PATCH 128/177] =?UTF-8?q?fix(account):=20=E5=9C=A8=E7=99=BB?= =?UTF-8?q?=E5=87=BA=E6=97=B6=E6=B8=85=E7=90=86=E7=94=A8=E6=88=B7=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加User.clearUserSession()调用以确保用户登出时完全清理会话数据 同时在蓝牙管理器中增加登录状态检查,防止未登录时跳转配对页面 --- lib/data/services/account_service.dart | 3 +++ lib/data/services/bluetooth_manager.dart | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/data/services/account_service.dart b/lib/data/services/account_service.dart index c2c9748bd..1293ecec5 100644 --- a/lib/data/services/account_service.dart +++ b/lib/data/services/account_service.dart @@ -7,6 +7,7 @@ import '../../modules/login/controllers/facebookLogin.dart'; import '../services/network/api.dart'; import 'db/database_helper.dart'; import 'meeting/meeting_task_service.dart'; +import '../../data/models/user_Info.dart'; /// 账号管理服务 /// @@ -33,6 +34,7 @@ class AccountService extends GetxService { await _storage.write("logintoken", null); await _storage.write("user_info", null); await _storage.write("local_avatar", null); + User.clearUserSession(); logger.d('用户数据清理成功'); return true; } catch (e) { @@ -45,6 +47,7 @@ class AccountService extends GetxService { // 清理所有用户数据 try { await _storage.erase(); + User.clearUserSession(); logger.d('所有用户数据清理成功'); return true; } catch (e) { diff --git a/lib/data/services/bluetooth_manager.dart b/lib/data/services/bluetooth_manager.dart index ee28c94fa..7075fa3d4 100644 --- a/lib/data/services/bluetooth_manager.dart +++ b/lib/data/services/bluetooth_manager.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:get/get.dart'; import 'package:classic_bluetooth/classic_bluetooth.dart'; +import 'package:get_storage/get_storage.dart'; import '../../core/utils/logger.dart'; import '../../routes/app_routes.dart'; import 'ble_manager.dart'; @@ -21,6 +22,7 @@ class BluetoothManager extends GetxService { final Rx currentDeviceRx = Rx(null); BluetoothDevice? get currentDevice => currentDeviceRx.value; final BleManager _bleManager = Get.find(); + final GetStorage _storage = GetStorage(); // 订阅 StreamSubscription? _bluetoothSubscription; @@ -76,7 +78,8 @@ class BluetoothManager extends GetxService { currentDeviceRx.value = newDevice; // 检查当前是否在OTA升级界面,如果是则不跳转 - if (!_isInOtaUpgradePage() && + if (_isLoggedIn() && + !_isInOtaUpgradePage() && !_bleManager.isConnected && Get.currentRoute != Routes.pairing) { Get.toNamed(Routes.pairing, arguments: newDevice); @@ -161,4 +164,14 @@ class BluetoothManager extends GetxService { return false; } } + + /// 是否已登录 + bool _isLoggedIn() { + try { + final token = _storage.read('logintoken'); + return token != null && token is String && token.isNotEmpty; + } catch (e) { + return false; + } + } } From 7866066efb6f5706e109a9f48b02c2550ad44f88 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 6 Dec 2025 16:57:30 +0800 Subject: [PATCH 129/177] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7=E7=A7=AF?= =?UTF-8?q?=E5=88=86):=20=E5=9C=A8=E7=BF=BB=E8=AF=91=E5=92=8C=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E5=89=A9=E4=BD=99=E6=97=B6=E9=97=B4=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为翻译中间层视图和会议主页面的AppBar底部添加积分剩余时间显示组件,包含时间格式化和进度条展示功能。当用户登录时显示剩余积分时间,未登录时显示0。使用Obx实现数据响应式更新,并根据当前主题模式适配样式。 --- .../meeting/views/meeting_home_view.dart | 67 ++++++++++++++++++- .../views/translation_middleware_view.dart | 66 ++++++++++++++++++ 2 files changed, 131 insertions(+), 2 deletions(-) diff --git a/lib/modules/meeting/views/meeting_home_view.dart b/lib/modules/meeting/views/meeting_home_view.dart index f9a9dd988..bf9cf58e4 100644 --- a/lib/modules/meeting/views/meeting_home_view.dart +++ b/lib/modules/meeting/views/meeting_home_view.dart @@ -10,6 +10,7 @@ import '../controllers/meeting_home_controller.dart'; import '../model/meeting_model.dart'; import '../utils/meeting_ui_utils.dart'; import 'bottomSheet/edit_title_bottom_sheet.dart'; +import '../../../../data/models/user_Info.dart'; ///会议主页面,提供会议列表、会议详情、会议设置 class MeetingHomeView extends StatefulWidget { @@ -173,6 +174,60 @@ class _MeetingHomeViewState extends State ), ), centerTitle: true, + bottom: PreferredSize( + preferredSize: Size.fromHeight(28.w), + child: Obx(() { + final _ = User.refreshTick.value; + final remain = User.isLoggedIn() ? User.instance.meetintegral : 0; + final total = User.isLoggedIn() ? User.instance.meettotalintegral : 0; + final double fraction = + total > 0 ? (remain / total).clamp(0.0, 1.0).toDouble() : 0.0; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: EdgeInsets.only(right: 12.w, bottom: 4.w), + alignment: Alignment.centerRight, + child: Text( + _formatHms(remain), + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + LayoutBuilder( + builder: (context, constraints) { + final barWidth = constraints.maxWidth * fraction; + return Stack( + children: [ + Container( + height: 2.w, + decoration: BoxDecoration( + color: isDarkMode ? Colors.white10 : Colors.black12, + borderRadius: BorderRadius.circular(2.w), + ), + ), + Align( + alignment: Alignment.centerRight, + child: Container( + width: barWidth, + height: 2.w, + decoration: BoxDecoration( + color: MeetingUIUtils.getButtonColor(isDarkMode), + borderRadius: BorderRadius.circular(2.w), + ), + ), + ), + ], + ); + }, + ), + ], + ); + }), + ), ); } @@ -320,8 +375,8 @@ class _MeetingHomeViewState extends State : const SizedBox(); }), Obx(() { - Map taskData = _controller.taskAggregator.taskFinishList - .firstWhere( + Map taskData = + _controller.taskAggregator.taskFinishList.firstWhere( (element) => element['id'] == data.id, orElse: () => {}, ); @@ -456,4 +511,12 @@ class _MeetingHomeViewState extends State return '${hours}h ${remainingMinutes}m ${remainingSeconds}s'; } } + + String _formatHms(int seconds) { + int h = seconds ~/ 3600; + int m = (seconds % 3600) ~/ 60; + int s = seconds % 60; + String twoDigits(int n) => n.toString().padLeft(2, '0'); + return '${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}'; + } } diff --git a/lib/modules/translation/middleware/views/translation_middleware_view.dart b/lib/modules/translation/middleware/views/translation_middleware_view.dart index adc9d95cb..678efb2d5 100644 --- a/lib/modules/translation/middleware/views/translation_middleware_view.dart +++ b/lib/modules/translation/middleware/views/translation_middleware_view.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/translation_middleware_controller.dart'; import '../../../../core/theme/app_colors.dart'; +import '../../../../data/models/user_Info.dart'; /// 翻译中间层视图 /// 展示四种翻译功能的入口选项 @@ -44,6 +45,63 @@ class TranslationMiddlewareView color: isDarkMode ? Colors.white : Colors.black, ), ), + bottom: PreferredSize( + preferredSize: Size.fromHeight(28.w), + child: Obx(() { + final _ = User.refreshTick.value; + final remain = User.isLoggedIn() ? User.instance.tradeintegral : 0; + final total = + User.isLoggedIn() ? User.instance.tradetotalintegral : 0; + final double fraction = + total > 0 ? (remain / total).clamp(0.0, 1.0).toDouble() : 0.0; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: EdgeInsets.only(right: 12.w, bottom: 4.w), + alignment: Alignment.centerRight, + child: Text( + _formatHms(remain), + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + LayoutBuilder( + builder: (context, constraints) { + final barWidth = constraints.maxWidth * fraction; + return Stack( + children: [ + Container( + height: 2.w, + decoration: BoxDecoration( + color: isDarkMode ? Colors.white10 : Colors.black12, + borderRadius: BorderRadius.circular(2.w), + ), + ), + Align( + alignment: Alignment.centerRight, + child: Container( + width: barWidth, + height: 2.w, + decoration: BoxDecoration( + color: isDarkMode + ? const Color(0xFF0066CC) + : Colors.blue, + borderRadius: BorderRadius.circular(2.w), + ), + ), + ), + ], + ); + }, + ), + ], + ); + }), + ), ); } @@ -152,4 +210,12 @@ class TranslationMiddlewareView ), ); } + + String _formatHms(int seconds) { + int h = seconds ~/ 3600; + int m = (seconds % 3600) ~/ 60; + int s = seconds % 60; + String twoDigits(int n) => n.toString().padLeft(2, '0'); + return '${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}'; + } } From 23c3db8b585cf2ae11538a27b0809d699a7812b8 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 6 Dec 2025 18:20:28 +0800 Subject: [PATCH 130/177] =?UTF-8?q?feat(i18n):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=A8=E9=87=8F=E7=BB=9F=E8=AE=A1=E7=9A=84=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E6=94=AF=E6=8C=81=E5=B9=B6=E7=A7=BB=E9=99=A4=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E7=AD=89=E7=BA=A7=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在探索控制器中添加用量统计的翻译注释,并在设置视图中注释掉会员等级显示代码 --- lib/core/translations/language/ar_sa.dart | 16 +----- lib/core/translations/language/bg_bg.dart | 17 +----- lib/core/translations/language/cs_cz.dart | 16 +----- lib/core/translations/language/da_dk.dart | 17 +----- lib/core/translations/language/de_de.dart | 18 ++----- lib/core/translations/language/el_gr.dart | 17 +----- lib/core/translations/language/en_us.dart | 16 +----- lib/core/translations/language/es_es.dart | 17 +----- lib/core/translations/language/et_ee.dart | 16 +----- lib/core/translations/language/fa_ir.dart | 16 +----- lib/core/translations/language/fi_fi.dart | 17 +----- lib/core/translations/language/fr_fr.dart | 18 +------ lib/core/translations/language/hi_in.dart | 16 +----- lib/core/translations/language/hr_hr.dart | 18 +------ lib/core/translations/language/hu_hu.dart | 17 +----- lib/core/translations/language/id_id.dart | 17 +----- lib/core/translations/language/is_is.dart | 16 +----- lib/core/translations/language/it_it.dart | 18 +------ lib/core/translations/language/ja_jp.dart | 15 +----- lib/core/translations/language/ko_kr.dart | 15 +----- lib/core/translations/language/lt_lt.dart | 17 +----- lib/core/translations/language/lv_lv.dart | 17 +----- lib/core/translations/language/ms_my.dart | 17 +----- lib/core/translations/language/nb_no.dart | 17 +----- lib/core/translations/language/nl_nl.dart | 17 +----- lib/core/translations/language/pl_pl.dart | 17 +----- lib/core/translations/language/pt_pt.dart | 18 +------ lib/core/translations/language/ro_ro.dart | 18 +------ lib/core/translations/language/ru_ru.dart | 18 +------ lib/core/translations/language/sk_sk.dart | 17 +----- lib/core/translations/language/sl_si.dart | 17 +----- lib/core/translations/language/sr_rs.dart | 17 +----- lib/core/translations/language/sv_se.dart | 18 +------ lib/core/translations/language/th_th.dart | 16 +----- lib/core/translations/language/tl_ph.dart | 18 +------ lib/core/translations/language/tr_tr.dart | 17 +----- lib/core/translations/language/uk_ua.dart | 18 +------ lib/core/translations/language/vi_vn.dart | 17 +----- lib/core/translations/language/zh_cn.dart | 15 +----- lib/core/translations/language/zh_hk.dart | 15 +----- .../controllers/explore_controller.dart | 4 +- lib/modules/settings/views/settings_view.dart | 54 +++++++++---------- 42 files changed, 110 insertions(+), 622 deletions(-) diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index 3b1578ce3..305c3d04e 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -180,21 +180,9 @@ const Map arSA = { "conferenceAssistant": "مساعد اجتماعات الأعمال", "conferenceAssistantInfo": "تسجيل محاضر الاجتماعات في الوقت الفعلي، ترجمة متعددة اللغات", - "studyAssistant": "مساعد تعلم اللغة", - "studyAssistantInfo": "تصحيح النطق، ممارسة المحادثة في الوقت الفعلي", - "travelTranslator": "مساعد ترجمة السفر", - "travelTranslatorInfo": "ترجمة صوتية فورية، مقدمة عن مناطق الجذب السياحي", - "beSearching": "جاري البحث:", - "noAssistantFound": "لم يتم العثور على مساعد الذكاء الاصطناعي المقابل", + "usageStats": "إحصائيات الاستخدام", // 用量统计 + "usageStatsInfo": "عرض إحصائيات استخدامك", // 查看您的使用统计数据 "scene": "مشهد", - "youHaveSelected": "لقد اخترت:", - "newFunction": "وظيفة جديدة", - "youChoseTry": "لقد اخترت التجربة", - "aiSinger": "وضع مغني الذكاء الاصطناعي", - "aiSingerInfo": - "غنِ أي أغنية بصوت فنانك المفضل، حتى الأغاني التي كتبتها بنفسك", - "popularFunction": "مشاهد الوظائف الشائعة", - "tryNow": "جرب الآن", // 商务会议助手页 "startMeeting": "بدء الاجتماع", diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index 0a9e23018..2dbbb3034 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -183,22 +183,9 @@ const Map bgBG = { "conferenceAssistant": "Асистент за бизнес срещи", "conferenceAssistantInfo": "Записване на протоколи в реално време и многоезичен превод", - "studyAssistant": "Асистент за изучаване на езици", - "studyAssistantInfo": "Корекция на произношението и практика на говоренето", - "travelTranslator": "Пътуващ преводач", - "travelTranslatorInfo": - "Гласов превод в реално време и гид за забележителности", - "beSearching": "Търсене:", - "noAssistantFound": "Не е намерен съответстващ AI асистент", + "usageStats": "Статистика за използване", + "usageStatsInfo": "Прегледвайте статистика за използване на приложението", "scene": "Сценарии", - "youHaveSelected": "Избрахте:", - "newFunction": "Нови функции", - "youChoseTry": "Избрахте да опитате", - "aiSinger": "AI певец режим", - "aiSingerInfo": - "Пейте всяка песен с гласа на любимия си изпълнител, дори собствените си творения", - "popularFunction": "Популярни функции", - "tryNow": "Опитай сега", // 商务会议助手页 "startMeeting": "Започни среща", diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index b9793a751..67c41a489 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -182,21 +182,9 @@ const Map csCZ = { "conferenceAssistant": "Asistent obchodních schůzek", "conferenceAssistantInfo": "Záznam zápisů v reálném čase a vícejazyčný překlad", - "studyAssistant": "Asistent pro výuku jazyků", - "studyAssistantInfo": "Korekce výslovnosti a procvičování mluvení", - "travelTranslator": "Cestovní překladač", - "travelTranslatorInfo": "Hlasový překlad v reálném čase a průvodce památkami", - "beSearching": "Hledání:", - "noAssistantFound": "Nebyl nalezen odpovídající AI asistent", + "usageStats": "Statistika použití", + "usageStatsInfo": "Zobrazit statistiku použití aplikace", "scene": "Scénáře", - "youHaveSelected": "Vybrali jste:", - "newFunction": "Nové funkce", - "youChoseTry": "Rozhodli jste se vyzkoušet", - "aiSinger": "AI zpěvák režim", - "aiSingerInfo": - "Zpívejte jakoukoliv píseň hlasem vašeho oblíbeného umělce, dokonce i vaše vlastní tvorbu", - "popularFunction": "Populární funkce", - "tryNow": "Vyzkoušet nyní", // 商务会议助手页 "startMeeting": "Začít schůzku", diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index 11e00c385..17caef9c9 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -182,22 +182,9 @@ const Map daDK = { "conferenceAssistant": "Forretningsmøde assistent", "conferenceAssistantInfo": "Realtidsoptagelse af mødereferater og flersproget oversættelse", - "studyAssistant": "Sprogindlærings assistent", - "studyAssistantInfo": "Udtalerettelse og taleøvelse", - "travelTranslator": "Rejseoversætter", - "travelTranslatorInfo": - "Realtids stemmeoversættelse og turistattraktionsguide", - "beSearching": "Søger:", - "noAssistantFound": "Ingen tilsvarende AI assistent fundet", + "usageStats": "Brugsstatistik", + "usageStatsInfo": "Se statistik for brug af appen", "scene": "Scenarier", - "youHaveSelected": "Du har valgt:", - "newFunction": "Nye funktioner", - "youChoseTry": "Du valgte at prøve", - "aiSinger": "AI sanger tilstand", - "aiSingerInfo": - "Syng enhver sang med din yndlingskunstners stemme, endda dine egne kreationer", - "popularFunction": "Populære funktioner", - "tryNow": "Prøv nu", // 商务会议助手页 "startMeeting": "Start møde", diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index 803347359..dc0f1d699 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -186,22 +186,10 @@ const Map deDE = { "conferenceAssistant": "Geschäftstreffen-Assistent", "conferenceAssistantInfo": "Echtzeit-Protokollaufzeichnung und mehrsprachige Übersetzung", - "studyAssistant": "Sprachlern-Assistent", - "studyAssistantInfo": "Aussprachekorrektur und Sprechpraxis", - "travelTranslator": "Reise-Übersetzer", - "travelTranslatorInfo": - "Echtzeit-Sprachübersetzung und Sehenswürdigkeiten-Führung", - "beSearching": "Suche nach:", - "noAssistantFound": "Kein entsprechender KI-Assistent gefunden", + "usageStats": "Benutzungsstatistik", + "usageStatsInfo": + "Sehen Sie sich die Statistiken für die Benutzung der App an", "scene": "Szenarien", - "youHaveSelected": "Sie haben ausgewählt:", - "newFunction": "Neue Funktionen", - "youChoseTry": "Sie haben sich entschieden zu versuchen", - "aiSinger": "KI-Sänger-Modus", - "aiSingerInfo": - "Singen Sie jedes Lied in der Stimme Ihres Lieblingskünstlers, sogar Ihre eigenen Kreationen", - "popularFunction": "Beliebte Funktionen", - "tryNow": "Jetzt versuchen", // 商务会议助手页 "startMeeting": "Meeting starten", diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index 175861818..d039d57f9 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -184,22 +184,9 @@ const Map elGR = { "conferenceAssistant": "Βοηθός επιχειρηματικών συναντήσεων", "conferenceAssistantInfo": "Καταγραφή πρακτικών σε πραγματικό χρόνο και πολυγλωσσική μετάφραση", - "studyAssistant": "Βοηθός εκμάθησης γλωσσών", - "studyAssistantInfo": "Διόρθωση προφοράς και εξάσκηση ομιλίας", - "travelTranslator": "Μεταφραστής ταξιδιού", - "travelTranslatorInfo": - "Φωνητική μετάφραση σε πραγματικό χρόνο και οδηγός αξιοθέατων", - "beSearching": "Αναζήτηση:", - "noAssistantFound": "Δεν βρέθηκε αντίστοιχος βοηθός AI", + "usageStats": "Στατιστικά χρήσης", + "usageStatsInfo": "Δείτε τα στατιστικά χρήσης της εφαρμογής", "scene": "Σενάρια", - "youHaveSelected": "Έχετε επιλέξει:", - "newFunction": "Νέες λειτουργίες", - "youChoseTry": "Επιλέξατε να δοκιμάσετε", - "aiSinger": "Λειτουργία τραγουδιστή AI", - "aiSingerInfo": - "Τραγουδήστε οποιοδήποτε τραγούδι με τη φωνή του αγαπημένου σας καλλιτέχνη, ακόμα και τις δικές σας δημιουργίες", - "popularFunction": "Δημοφιλείς λειτουργίες", - "tryNow": "Δοκιμάστε τώρα", // 商务会议助手页 "startMeeting": "Έναρξη συνάντησης", diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index ec6c0edd8..b241b7ee6 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -182,21 +182,9 @@ const Map enUS = { "conferenceAssistant": "Business Meeting Assistant", "conferenceAssistantInfo": "Real-time minutes recording and multilingual translation", - "studyAssistant": "Language Learning Assistant", - "studyAssistantInfo": "Pronunciation correction and speaking practice", - "travelTranslator": "Travel Translator", - "travelTranslatorInfo": "Real-time voice translation and attraction guides", - "beSearching": "Searching for:", - "noAssistantFound": "No corresponding AI assistant found", + "usageStats": "Usage Statistics", + "usageStatsInfo": "View Your Usage Statistics", "scene": "Scenarios", - "youHaveSelected": "You've selected:", - "newFunction": "New Features", - "youChoseTry": "You've chosen to try", - "aiSinger": "AI Singer Mode", - "aiSingerInfo": - "Sing any song in your favorite artist's voice, even your own creations", - "popularFunction": "Popular Features", - "tryNow": "Try Now", // 商品页面(AI/翻译/会议) 'availablePackages': 'Available Packages', diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 1adae42bd..0c05d6429 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -185,22 +185,9 @@ const Map esES = { "conferenceAssistant": "Asistente de reuniones de negocios", "conferenceAssistantInfo": "Grabación de actas en tiempo real y traducción multiidioma", - "studyAssistant": "Asistente de aprendizaje de idiomas", - "studyAssistantInfo": "Corrección de pronunciación y práctica de habla", - "travelTranslator": "Traductor de viajes", - "travelTranslatorInfo": - "Traducción de voz en tiempo real y guía de atracciones turísticas", - "beSearching": "Buscando:", - "noAssistantFound": "No se encontró asistente de IA correspondiente", + "usageStats": "Estadísticas de uso", + "usageStatsInfo": "Consulte las estadísticas de uso de la aplicación", "scene": "Escenarios", - "youHaveSelected": "Has seleccionado:", - "newFunction": "Nuevas funciones", - "youChoseTry": "Elegiste probar", - "aiSinger": "Modo cantante de IA", - "aiSingerInfo": - "Canta cualquier canción con la voz de tu artista favorito, incluso tus propias creaciones", - "popularFunction": "Funciones populares", - "tryNow": "Probar ahora", // 商务会议助手页 "startMeeting": "Iniciar reunión", diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index 3e47b9d0d..a3189593c 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -180,21 +180,9 @@ const Map etEE = { "conferenceAssistant": "Ärikoosoleku assistent", "conferenceAssistantInfo": "Reaalajas protokolli salvestamine ja mitmekeelne tõlge", - "studyAssistant": "Keeleõppe assistent", - "studyAssistantInfo": "Häälduse parandamine ja kõne harjutamine", - "travelTranslator": "Reisi tõlkija", - "travelTranslatorInfo": "Reaalajas häältõlge ja vaatamisväärsuste giid", - "beSearching": "Otsimine:", - "noAssistantFound": "Vastavat AI assistenti ei leitud", + "usageStats": "Kasutamise statistika", + "usageStatsInfo": "Näita sovelluksen kasutamise statistikat", "scene": "Stsenaariumid", - "youHaveSelected": "Oled valinud:", - "newFunction": "Uued funktsioonid", - "youChoseTry": "Valisid proovida", - "aiSinger": "AI laulja režiim", - "aiSingerInfo": - "Laula mis tahes laulu oma lemmikartisti häälega, isegi oma loominguga", - "popularFunction": "Populaarsed funktsioonid", - "tryNow": "Proovi kohe", // 商务会议助手页 "startMeeting": "Alusta koosolekut", diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index fc7d14415..aeab553e0 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -178,21 +178,9 @@ const Map faIR = { "healthConsultantInfo": "ویژگی‌های بیشتر چت هوش مصنوعی", "conferenceAssistant": "دستیار جلسات کاری", "conferenceAssistantInfo": "ضبط صورت‌جلسه همزمان و ترجمه چندزبانه", - "studyAssistant": "دستیار یادگیری زبان", - "studyAssistantInfo": "تصحیح تلفظ و تمرین مکالمه", - "travelTranslator": "مترجم سفر", - "travelTranslatorInfo": "ترجمه صوتی همزمان و راهنمای جاذبه‌ها", - "beSearching": "در حال جستجو برای:", - "noAssistantFound": "دستیار هوش مصنوعی مورد نظر یافت نشد", + "usageStats": "استفاده از خدمات", + "usageStatsInfo": "دیدن آمار مصرف سرویس‌ها", "scene": "سناریوها", - "youHaveSelected": "شما انتخاب کردید:", - "newFunction": "ویژگی‌های جدید", - "youChoseTry": "شما انتخاب کردید که امتحان کنید", - "aiSinger": "حالت خواننده هوش مصنوعی", - "aiSingerInfo": - "هر آهنگی را با صدای هنرمند مورد علاقه خود بخوانید، حتی ساخته‌های خودتان", - "popularFunction": "ویژگی‌های محبوب", - "tryNow": "اکنون امتحان کنید", // 商务会议助手页 "startMeeting": "شروع جلسه", diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index acf223fbf..84f02f47b 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -182,22 +182,9 @@ const Map fiFI = { "conferenceAssistant": "Yrityskokousavustaja", "conferenceAssistantInfo": "Reaaliaikainen pöytäkirjan pito, monikielinen käännös", - "studyAssistant": "Kielenoppimisavustaja", - "studyAssistantInfo": "Ääntämisen korjaus, reaaliaikainen puheharjoittelu", - "travelTranslator": "Matkakäännösavustaja", - "travelTranslatorInfo": - "Reaaliaikainen puhekäännös, matkailukohteiden esittely", - "beSearching": "Etsitään:", - "noAssistantFound": "Vastaavaa AI-avustajaa ei löytynyt", + "usageStats": "Käyttöstatistiikka", + "usageStatsInfo": "Näytä sovelluksen käytön statistiikka", "scene": "Skenaario", - "youHaveSelected": "Olet valinnut:", - "newFunction": "Uusi toiminto", - "youChoseTry": "Valitsit kokeilla", - "aiSinger": "AI-laulaja-tila", - "aiSingerInfo": - "Laula mikä tahansa kappale suosikkilaulajasi äänellä, jopa omat sävellyksesi", - "popularFunction": "Suositut toimintoskenaariot", - "tryNow": "Kokeile nyt", // 商务会议助手页 "startMeeting": "Aloita kokous", diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index 2531f1951..f2f0bd78a 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -187,23 +187,9 @@ const Map frFR = { "conferenceAssistant": "Assistant de réunion d'affaires", "conferenceAssistantInfo": "Enregistrement de procès-verbaux en temps réel et traduction multilingue", - "studyAssistant": "Assistant d'apprentissage des langues", - "studyAssistantInfo": - "Correction de prononciation et pratique de l'expression orale", - "travelTranslator": "Traducteur de voyage", - "travelTranslatorInfo": - "Traduction vocale en temps réel et guides d'attractions", - "beSearching": "Recherche de :", - "noAssistantFound": "Aucun assistant IA correspondant trouvé", + "usageStats": "Statistiques d'utilisation", + "usageStatsInfo": "Consultez les statistiques d'utilisation de l'application", "scene": "Scénarios", - "youHaveSelected": "Vous avez sélectionné :", - "newFunction": "Nouvelles fonctions", - "youChoseTry": "Vous avez choisi d'essayer", - "aiSinger": "Mode chanteur IA", - "aiSingerInfo": - "Chantez n'importe quelle chanson avec la voix de votre artiste préféré, même vos propres créations", - "popularFunction": "Fonctions populaires", - "tryNow": "Essayer maintenant", // 商务会议助手页 "startMeeting": "Démarrer la réunion", diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index ae79c91b5..7bd8c16df 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -180,21 +180,9 @@ const Map hiIN = { "conferenceAssistant": "बिजनेस मीटिंग असिस्टेंट", "conferenceAssistantInfo": "रीयल-टाइम मीटिंग मिनट रिकॉर्डिंग, बहु-भाषा अनुवाद", - "studyAssistant": "भाषा सीखने का सहायक", - "studyAssistantInfo": "उच्चारण सुधार, रीयल-टाइम बोलने का अभ्यास", - "travelTranslator": "यात्रा अनुवाद सहायक", - "travelTranslatorInfo": "रीयल-टाइम वॉयस अनुवाद, पर्यटन स्थलों का परिचय", - "beSearching": "खोज रहा है:", - "noAssistantFound": "कोई संबंधित एआई सहायक नहीं मिला", + "usageStats": "उपयोग सtatistik", + "usageStatsInfo": "अप्लिकेशन का उपयोग सtatistik देखें", "scene": "दृश्य", - "youHaveSelected": "आपने चुना है:", - "newFunction": "नया फ़ंक्शन", - "youChoseTry": "आपने कोशिश करने के लिए चुना", - "aiSinger": "एआई सिंगर मोड", - "aiSingerInfo": - "अपने पसंदीदा गायक की आवाज में कोई भी गाना गाएं, यहां तक कि अपनी खुद की रचनाएं भी", - "popularFunction": "लोकप्रिय फ़ंक्शन दृश्य", - "tryNow": "अभी চেষ্টা করুন", // 商务会议助手页 "startMeeting": "बैठक शुरू करें", diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index a6a3e0386..1fd2dde95 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -184,23 +184,9 @@ const Map hrHR = { "conferenceAssistant": "Asistent za poslovne sastanke", "conferenceAssistantInfo": "Bilježenje zapisnika u stvarnom vremenu, višejezični prijevod", - "studyAssistant": "Asistent za učenje jezika", - "studyAssistantInfo": - "Ispravak izgovora, vježbanje govora u stvarnom vremenu", - "travelTranslator": "Asistent za prevođenje na putovanjima", - "travelTranslatorInfo": - "Glasovni prijevod u stvarnom vremenu, predstavljanje turističkih atrakcija", - "beSearching": "Traženje:", - "noAssistantFound": "Nije pronađen odgovarajući AI asistent", + "usageStats": "Statistika upotrebe", + "usageStatsInfo": "Pregledajte statistiku upotrebe aplikacije", "scene": "Scenarij", - "youHaveSelected": "Odabrali ste:", - "newFunction": "Nova funkcija", - "youChoseTry": "Odabrali ste isprobati", - "aiSinger": "AI pjevač način rada", - "aiSingerInfo": - "Pjevajte bilo koju pjesmu glasom svog omiljenog pjevača, čak i vlastite skladbe", - "popularFunction": "Popularni scenariji funkcija", - "tryNow": "Isprobaj sada", // 商务会议助手页 "startMeeting": "Započni sastanak", diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index e20a91487..3e0de253f 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -185,22 +185,9 @@ const Map huHU = { "healthConsultantInfo": "További AI csevegési funkciókat kínál", "conferenceAssistant": "Üzleti megbeszélés asszisztens", "conferenceAssistantInfo": "Valós idejű jegyzőkönyvezés, többnyelvű fordítás", - "studyAssistant": "Nyelvtanulási asszisztens", - "studyAssistantInfo": "Kiejtésjavítás, valós idejű beszédgyakorlás", - "travelTranslator": "Utazási fordító asszisztens", - "travelTranslatorInfo": - "Valós idejű hangfordítás, turisztikai látványosságok bemutatása", - "beSearching": "Keresés:", - "noAssistantFound": "Nem található megfelelő AI asszisztens", + "usageStats": "Használati statisztika", + "usageStatsInfo": "Lásd a használati statisztikát", "scene": "Helyzet", - "youHaveSelected": "Ön választotta:", - "newFunction": "Új funkció", - "youChoseTry": "Ön a próbát választotta", - "aiSinger": "AI énekes mód", - "aiSingerInfo": - "Énekeljen el bármilyen dalt kedvenc énekese hangján, akár saját szerzeményeit is", - "popularFunction": "Népszerű funkciók", - "tryNow": "Próbálja ki most", // 商务会议助手页 "startMeeting": "Megbeszélés indítása", diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 99ba6c8a4..4d4cd7c1c 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -180,22 +180,9 @@ const Map idID = { "conferenceAssistant": "Asisten Rapat Bisnis", "conferenceAssistantInfo": "Catatan rapat waktu nyata, terjemahan multibahasa", - "studyAssistant": "Asisten Belajar Bahasa", - "studyAssistantInfo": "Koreksi pengucapan, latihan berbicara waktu nyata", - "travelTranslator": "Asisten Terjemahan Perjalanan", - "travelTranslatorInfo": - "Terjemahan suara waktu nyata, pengenalan tempat wisata", - "beSearching": "Mencari:", - "noAssistantFound": "Tidak ada asisten AI yang cocok ditemukan", + "usageStats": "Statistik Penggunaan", + "usageStatsInfo": "Lihat statistik penggunaan aplikasi", "scene": "Skenario", - "youHaveSelected": "Anda telah memilih:", - "newFunction": "Fitur Baru", - "youChoseTry": "Anda memilih untuk mencoba", - "aiSinger": "Mode Penyanyi AI", - "aiSingerInfo": - "Nyanyikan lagu apa pun dengan suara penyanyi favorit Anda, bahkan lagu ciptaan Anda sendiri", - "popularFunction": "Skenario Fitur Populer", - "tryNow": "Coba Sekarang", // 商务会议助手页 "startMeeting": "Mulai Rapat", diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index 8990e7301..3e4df74ed 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -181,21 +181,9 @@ const Map isIS = { "healthConsultantInfo": "Býður upp á fleiri gervigreindarspjallaðgerðir", "conferenceAssistant": "Aðstoðarmaður fyrir viðskiptafundi", "conferenceAssistantInfo": "Skráning fundargerða í rauntíma, fjöltyng þýðing", - "studyAssistant": "Aðstoðarmaður við tungumálanám", - "studyAssistantInfo": "Framburðarleiðrétting, rauntímaæfing í tali", - "travelTranslator": "Aðstoðarmaður við ferðaþýðingu", - "travelTranslatorInfo": "Rauntíma raddþýðing, kynning á ferðamannastöðum", - "beSearching": "Leita:", - "noAssistantFound": "Enginn samsvarandi gervigreindar-aðstoðarmaður fannst", + "usageStats": "Notendastatistika", + "usageStatsInfo": " skoða notendastatistika", "scene": "Atburðarás", - "youHaveSelected": "Þú valdir:", - "newFunction": "Nýr eiginleiki", - "youChoseTry": "Þú valdir að prófa", - "aiSinger": "Gervigreindarsöngvarahamur", - "aiSingerInfo": - "Syngdu hvaða lag sem er með rödd uppáhalds söngvarans þíns, jafnvel þínar eigin tónsmíðar", - "popularFunction": "Vinsælir eiginleikaatburðir", - "tryNow": "Prófa núna", // 商务会议助手页 "startMeeting": "Hefja fund", diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index d086c7178..6ad878537 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -186,23 +186,9 @@ const Map itIT = { "conferenceAssistant": "Assistente per riunioni di lavoro", "conferenceAssistantInfo": "Registrazione di verbali in tempo reale, traduzione multilingue", - "studyAssistant": "Assistente per l'apprendimento delle lingue", - "studyAssistantInfo": - "Correzione della pronuncia, pratica della conversazione in tempo reale", - "travelTranslator": "Assistente di traduzione per viaggi", - "travelTranslatorInfo": - "Traduzione vocale in tempo reale, introduzione alle attrazioni turistiche", - "beSearching": "Ricerca in corso:", - "noAssistantFound": "Nessun assistente AI corrispondente trovato", + "usageStats": "Statistiche di utilizzo", + "usageStatsInfo": "Visualizza le statistiche di utilizzo dell'applicazione", "scene": "Scenario", - "youHaveSelected": "Hai selezionato:", - "newFunction": "Nuova funzione", - "youChoseTry": "Hai scelto di provare", - "aiSinger": "Modalità cantante AI", - "aiSingerInfo": - "Canta qualsiasi canzone con la voce del tuo cantante preferito, anche le tue composizioni", - "popularFunction": "Scenari di funzioni popolari", - "tryNow": "Prova ora", // 商务会议助手页 "startMeeting": "Inizia riunione", diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index b8fd8eec6..184235148 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -176,20 +176,9 @@ const Map jaJP = { "healthConsultantInfo": "より多くのAIチャット機能", "conferenceAssistant": "ビジネス会議アシスタント", "conferenceAssistantInfo": "リアルタイム議事録記録と多言語翻訳", - "studyAssistant": "語学学習アシスタント", - "studyAssistantInfo": "発音矯正とスピーキング練習", - "travelTranslator": "旅行翻訳者", - "travelTranslatorInfo": "リアルタイム音声翻訳と観光地ガイド", - "beSearching": "検索中:", - "noAssistantFound": "対応するAIアシスタントが見つかりません", + "usageStats": "使用統計", + "usageStatsInfo": "使用統計を確認", "scene": "シナリオ", - "youHaveSelected": "選択しました:", - "newFunction": "新機能", - "youChoseTry": "試すことを選択しました", - "aiSinger": "AIシンガーモード", - "aiSingerInfo": "お気に入りのアーティストの声で任意の曲を歌う、自分の創作も可能", - "popularFunction": "人気機能", - "tryNow": "今すぐ試す", // 商务会议助手页 "startMeeting": "会議を開始", diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 84b28783f..27f5922c8 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -174,20 +174,9 @@ const Map koKR = { "healthConsultantInfo": "더 많은 AI 채팅 기능 제공", "conferenceAssistant": "비즈니스 회의 어시스턴트", "conferenceAssistantInfo": "실시간 회의록 작성, 다국어 번역", - "studyAssistant": "언어 학습 어시스턴트", - "studyAssistantInfo": "발음 교정, 실시간 회화 연습", - "travelTranslator": "여행 번역 어시스턴트", - "travelTranslatorInfo": "실시간 음성 번역, 관광지 소개", - "beSearching": "검색 중:", - "noAssistantFound": "해당하는 AI 어시스턴트를 찾을 수 없습니다", + "usageStats": "사용 통계", + "usageStatsInfo": "사용 통계를 확인하세요", "scene": "상황", - "youHaveSelected": "선택하셨습니다:", - "newFunction": "새로운 기능", - "youChoseTry": "시도하기로 선택하셨습니다", - "aiSinger": "AI 가수 모드", - "aiSingerInfo": "좋아하는 가수의 목소리로 어떤 노래든 부르세요, 심지어 직접 만든 노래까지", - "popularFunction": "인기 기능 상황", - "tryNow": "지금 시도하기", // 商务会议助手页 "startMeeting": "회의 시작", diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 0d6fa4d59..517781efc 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -184,22 +184,9 @@ const Map ltLT = { "conferenceAssistant": "Verslo susitikimų asistentas", "conferenceAssistantInfo": "Susitikimų protokolo įrašymas realiuoju laiku, daugiakalbis vertimas", - "studyAssistant": "Kalbos mokymosi asistentas", - "studyAssistantInfo": "Tarimo korekcija, kalbėjimo praktika realiuoju laiku", - "travelTranslator": "Kelionių vertimo asistentas", - "travelTranslatorInfo": - "Balso vertimas realiuoju laiku, turistinių objektų pristatymas", - "beSearching": "Ieškoma:", - "noAssistantFound": "Nerasta atitinkamo AI asistento", + "usageStats": "Naudojimo statistika", + "usageStatsInfo": "Peržiūrėkite jūsų naudojimo statistiką", "scene": "Scenarijus", - "youHaveSelected": "Pasirinkote:", - "newFunction": "Nauja funkcija", - "youChoseTry": "Pasirinkote išbandyti", - "aiSinger": "AI dainininko režimas", - "aiSingerInfo": - "Dainuokite bet kurią dainą mėgstamo dainininko balsu, net savo kompozicijas", - "popularFunction": "Populiarūs funkcijų scenarijai", - "tryNow": "Išbandyti dabar", // 商务会议助手页 "startMeeting": "Pradėti susitikimą", diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 163d2903e..534fabb8e 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -183,22 +183,9 @@ const Map lvLV = { "conferenceAssistant": "Biznesa sanāksmju palīgs", "conferenceAssistantInfo": "Reāllaika protokolu ierakstīšana, daudzvalodu tulkošana", - "studyAssistant": "Valodu apguves palīgs", - "studyAssistantInfo": "Izrunas korekcija, reāllaika runas prakse", - "travelTranslator": "Ceļojumu tulkošanas palīgs", - "travelTranslatorInfo": - "Reāllaika balss tulkošana, tūrisma objektu iepazīstināšana", - "beSearching": "Meklē:", - "noAssistantFound": "Neviens atbilstošs AI palīgs nav atrasts", + "usageStats": "Pārskatījumu statistika", + "usageStatsInfo": "Pārskatiet jūsu lietotāja pārskatījumu statistiku", "scene": "Scenārijs", - "youHaveSelected": "Jūs izvēlējāties:", - "newFunction": "Jauna funkcija", - "youChoseTry": "Jūs izvēlējāties mēģināt", - "aiSinger": "AI dziedātāja režīms", - "aiSingerInfo": - "Dziediet jebkuru dziesmu ar sava iecienītākā dziedātāja balsi, pat savas kompozīcijas", - "popularFunction": "Populāri funkciju scenāriji", - "tryNow": "Izmēģināt tagad", // 商务会议助手页 "startMeeting": "Sākt sapulci", diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index 099081ffc..dd4b08331 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -182,22 +182,9 @@ const Map msMY = { "conferenceAssistant": "Pembantu Mesyuarat Perniagaan", "conferenceAssistantInfo": "Minit mesyuarat masa nyata, terjemahan pelbagai bahasa", - "studyAssistant": "Pembantu Pembelajaran Bahasa", - "studyAssistantInfo": "Pembetulan sebutan, latihan pertuturan masa nyata", - "travelTranslator": "Pembantu Terjemahan Perjalanan", - "travelTranslatorInfo": - "Terjemahan suara masa nyata, pengenalan tempat pelancongan", - "beSearching": "Mencari:", - "noAssistantFound": "Tiada pembantu AI yang sepadan ditemui", + "usageStats": "Statistik Penggunaan", + "usageStatsInfo": "Lihat statistik penggunaan aplikasi", "scene": "Senario", - "youHaveSelected": "Anda telah memilih:", - "newFunction": "Fungsi Baharu", - "youChoseTry": "Anda memilih untuk mencuba", - "aiSinger": "Mod Penyanyi AI", - "aiSingerInfo": - "Nyanyikan sebarang lagu dengan suara penyanyi kegemaran anda, malah lagu ciptaan anda sendiri", - "popularFunction": "Senario Fungsi Popular", - "tryNow": "Cuba Sekarang", // 商务会议助手页 "startMeeting": "Mula Mesyuarat", diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index 54a5168a0..0c4f7a8cd 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -182,22 +182,9 @@ const Map nbNO = { "conferenceAssistant": "Assistent for forretningsmøter", "conferenceAssistantInfo": "Sanntids protokollføring, flerspråklig oversettelse", - "studyAssistant": "Assistent for språklæring", - "studyAssistantInfo": "Uttalekorreksjon, sanntids taleøvelse", - "travelTranslator": "Assistent for reiseoversettelse", - "travelTranslatorInfo": - "Sanntids stemmeoversettelse, introduksjon til turistattraksjoner", - "beSearching": "Søker:", - "noAssistantFound": "Ingen tilsvarende AI-assistent funnet", + "usageStats": "Brukstatistikk", + "usageStatsInfo": "Vis brukstatistikk for din app", "scene": "Scenario", - "youHaveSelected": "Du har valgt:", - "newFunction": "Ny funksjon", - "youChoseTry": "Du valgte å prøve", - "aiSinger": "AI-sangermodus", - "aiSingerInfo": - "Syng hvilken som helst sang med stemmen til din favorittartist, til og med dine egne komposisjoner", - "popularFunction": "Populære funksjonsscenarier", - "tryNow": "Prøv nå", // 商务会议助手页 "startMeeting": "Start møte", diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index a6a9ed97d..cb66130fb 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -183,22 +183,9 @@ const Map nlNL = { "conferenceAssistant": "Assistent voor zakelijke bijeenkomsten", "conferenceAssistantInfo": "Realtime notuleren van vergaderingen, meertalige vertaling", - "studyAssistant": "Assistent voor taalstudie", - "studyAssistantInfo": "Uitspraakcorrectie, realtime spraakoefening", - "travelTranslator": "Assistent voor reisvertaling", - "travelTranslatorInfo": - "Realtime spraakvertaling, introductie van toeristische attracties", - "beSearching": "Zoeken:", - "noAssistantFound": "Geen overeenkomende AI-assistent gevonden", + "usageStats": "Gebruikstatistieken", + "usageStatsInfo": " Bekijk de gebruikstatistieken van uw applicatie", "scene": "Scenario", - "youHaveSelected": "U heeft geselecteerd:", - "newFunction": "Nieuwe functie", - "youChoseTry": "U koos ervoor om te proberen", - "aiSinger": "AI-zangermodus", - "aiSingerInfo": - "Zing elk nummer met de stem van uw favoriete zanger, zelfs uw eigen composities", - "popularFunction": "Populaire functiescenario's", - "tryNow": "Probeer nu", // 商务会议助手页 "startMeeting": "Start vergadering", diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index 604087c23..0adc00c42 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -184,22 +184,9 @@ const Map plPL = { "conferenceAssistant": "Asystent spotkań biznesowych", "conferenceAssistantInfo": "Zapisywanie protokołów w czasie rzeczywistym, tłumaczenie wielojęzyczne", - "studyAssistant": "Asystent nauki języków", - "studyAssistantInfo": "Korekta wymowy, ćwiczenie mowy w czasie rzeczywistym", - "travelTranslator": "Asystent tłumaczenia w podróży", - "travelTranslatorInfo": - "Tłumaczenie głosowe w czasie rzeczywistym, prezentacja atrakcji turystycznych", - "beSearching": "Wyszukiwanie:", - "noAssistantFound": "Nie znaleziono odpowiedniego asystenta AI", + "usageStats": "Statystyki użycia", + "usageStatsInfo": "Przeglądaj statystyki użycia aplikacji", "scene": "Scenariusz", - "youHaveSelected": "Wybrałeś:", - "newFunction": "Nowa funkcja", - "youChoseTry": "Wybrałeś, aby spróbować", - "aiSinger": "Tryb piosenkarza AI", - "aiSingerInfo": - "Śpiewaj dowolną piosenkę głosem ulubionego piosenkarza, nawet własne kompozycje", - "popularFunction": "Popularne scenariusze funkcji", - "tryNow": "Wypróbuj teraz", // 商务会议助手页 "startMeeting": "Rozpocznij spotkanie", diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 3c88d9636..2c9792ce0 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -186,23 +186,9 @@ const Map ptPT = { "conferenceAssistant": "Assistente de Reunião de Negócios", "conferenceAssistantInfo": "Gravação de atas em tempo real, tradução multilingue", - "studyAssistant": "Assistente de Aprendizagem de Línguas", - "studyAssistantInfo": - "Correção de pronúncia, prática de conversação em tempo real", - "travelTranslator": "Assistente de Tradução de Viagem", - "travelTranslatorInfo": - "Tradução de voz em tempo real, apresentação de pontos turísticos", - "beSearching": "A pesquisar:", - "noAssistantFound": "Nenhum assistente de IA correspondente encontrado", + "usageStats": "Estatísticas de Uso", + "usageStatsInfo": "Visualize as estatísticas de uso da sua aplicação", "scene": "Cenário", - "youHaveSelected": "Selecionou:", - "newFunction": "Nova Função", - "youChoseTry": "Escolheu experimentar", - "aiSinger": "Modo Cantor IA", - "aiSingerInfo": - "Cante qualquer música com a voz do seu cantor favorito, até mesmo as suas próprias composições", - "popularFunction": "Cenários de Funções Populares", - "tryNow": "Experimente Agora", // 商务会议助手页 "startMeeting": "Iniciar Reunião", diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index e795b025a..0b18b9f60 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -185,23 +185,9 @@ const Map roRO = { "conferenceAssistant": "Asistent pentru ședințe de afaceri", "conferenceAssistantInfo": "Înregistrare în timp real a proceselor-verbale, traducere multilingvă", - "studyAssistant": "Asistent pentru învățarea limbilor străine", - "studyAssistantInfo": - "Corectarea pronunției, practicarea vorbirii în timp real", - "travelTranslator": "Asistent de traducere pentru călătorii", - "travelTranslatorInfo": - "Traducere vocală în timp real, prezentarea atracțiilor turistice", - "beSearching": "Se caută:", - "noAssistantFound": "Niciun asistent AI corespunzător nu a fost găsit", + "usageStats": "Statistici de utilizare", + "usageStatsInfo": "Vizualizați istoricul utilizării aplicației", "scene": "Scenariu", - "youHaveSelected": "Ați selectat:", - "newFunction": "Funcție nouă", - "youChoseTry": "Ați ales să încercați", - "aiSinger": "Modul cântăreț AI", - "aiSingerInfo": - "Cântați orice melodie cu vocea cântărețului preferat, chiar și propriile compoziții", - "popularFunction": "Scenarii de funcții populare", - "tryNow": "Încearcă acum", // 商务会议助手页 "startMeeting": "Începe ședința", diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index d39d79a7e..86b6ff85f 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -184,23 +184,9 @@ const Map ruRU = { "conferenceAssistant": "Помощник для деловых встреч", "conferenceAssistantInfo": "Запись протоколов в реальном времени, многоязычный перевод", - "studyAssistant": "Помощник в изучении языков", - "studyAssistantInfo": - "Коррекция произношения, практика разговорной речи в реальном времени", - "travelTranslator": "Помощник-переводчик для путешествий", - "travelTranslatorInfo": - "Голосовой перевод в реальном времени, описание туристических достопримечательностей", - "beSearching": "Поиск:", - "noAssistantFound": "Соответствующий AI-помощник не найден", + "usageStats": "Статистика использования", + "usageStatsInfo": "Просмотрите статистику использования вашего приложения", "scene": "Сценарий", - "youHaveSelected": "Вы выбрали:", - "newFunction": "Новая функция", - "youChoseTry": "Вы решили попробовать", - "aiSinger": "Режим AI-певца", - "aiSingerInfo": - "Пойте любую песню голосом вашего любимого исполнителя, даже ваши собственные композиции", - "popularFunction": "Популярные функциональные сценарии", - "tryNow": "Попробовать сейчас", // 商务会议助手页 "startMeeting": "Начать встречу", diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index 0316a20da..97bfcc2b2 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -183,22 +183,9 @@ const Map skSK = { "conferenceAssistant": "Asistent pre obchodné stretnutia", "conferenceAssistantInfo": "Záznam zápisnice v reálnom čase, viacjazyčný preklad", - "studyAssistant": "Asistent pre štúdium jazykov", - "studyAssistantInfo": "Oprava výslovnosti, prax reči v reálnom čase", - "travelTranslator": "Asistent pre preklad na cestách", - "travelTranslatorInfo": - "Hlasový preklad v reálnom čase, predstavenie turistických atrakcií", - "beSearching": "Hľadám:", - "noAssistantFound": "Nenájdený žiadny zodpovedajúci AI asistent", + "usageStats": "Statistiky využitia", + "usageStatsInfo": "Zobrazte vaše využitie aplikácie", "scene": "Scenár", - "youHaveSelected": "Vybrali ste:", - "newFunction": "Nová funkcia", - "youChoseTry": "Rozhodli ste sa vyskúšať", - "aiSinger": "Režim AI speváka", - "aiSingerInfo": - "Spievajte akúkoľvek pieseň hlasom vášho obľúbeného speváka, dokonca aj vlastné skladby", - "popularFunction": "Populárne funkčné scenáre", - "tryNow": "Vyskúšať teraz", // 商务会议助手页 "startMeeting": "Začať stretnutie", diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index de9d0276c..8060c79d8 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -183,22 +183,9 @@ const Map slSI = { "conferenceAssistant": "Pomočnik za poslovne sestanke", "conferenceAssistantInfo": "Zapisovanje zapisnikov v realnem času, večjezično prevajanje", - "studyAssistant": "Pomočnik za učenje jezikov", - "studyAssistantInfo": "Popravek izgovorjave, vadba govorjenja v realnem času", - "travelTranslator": "Pomočnik za prevajanje na potovanjih", - "travelTranslatorInfo": - "Glasovno prevajanje v realnem času, predstavitev turističnih znamenitosti", - "beSearching": "Iskanje:", - "noAssistantFound": "Ni bil najden noben ustrezen pomočnik AI", + "usageStats": "Statistika uporabe", + "usageStatsInfo": "Pregledajte vaše uporabo aplikacije", "scene": "Scenarij", - "youHaveSelected": "Izbrali ste:", - "newFunction": "Nova funkcija", - "youChoseTry": "Izbrali ste poskusiti", - "aiSinger": "Način AI pevca", - "aiSingerInfo": - "Zapojte katero koli pesem z glasom vašega najljubšega pevca, celo lastne skladbe", - "popularFunction": "Priljubljeni funkcijski scenariji", - "tryNow": "Poskusi zdaj", // 商务会议助手页 "startMeeting": "Začni sestanek", diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index c8b61f61c..684574993 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -182,22 +182,9 @@ const Map srRS = { "conferenceAssistant": "Asistent za poslovne sastanke", "conferenceAssistantInfo": "Beleženje zapisnika u realnom vremenu, višejezično prevođenje", - "studyAssistant": "Asistent za učenje jezika", - "studyAssistantInfo": "Korekcija izgovora, vežbanje govora u realnom vremenu", - "travelTranslator": "Asistent za prevođenje na putovanjima", - "travelTranslatorInfo": - "Glasovno prevođenje u realnom vremenu, predstavljanje turističkih atrakcija", - "beSearching": "Pretraga:", - "noAssistantFound": "Nije pronađen odgovarajući AI asistent", + "usageStats": "Statistika korišćenja", + "usageStatsInfo": "Pregledajte vaše korišćenje aplikacije", "scene": "Scena", - "youHaveSelected": "Izabrali ste:", - "newFunction": "Nova funkcija", - "youChoseTry": "Izabrali ste da probate", - "aiSinger": "AI pevač mod", - "aiSingerInfo": - "Pevajte bilo koju pesmu glasom svog omiljenog pevača, čak i sopstvene kompozicije", - "popularFunction": "Popularne scene funkcija", - "tryNow": "Probaj sada", // 商务会议助手页 "startMeeting": "Započni sastanak", diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index 01db4c3ac..45f242a2a 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -182,23 +182,9 @@ const Map svSE = { "conferenceAssistant": "Affärsmötesassistent", "conferenceAssistantInfo": "Realtidsinspelning av mötesprotokoll, flerspråkig översättning", - "studyAssistant": "Språkinlärningsassistent", - "studyAssistantInfo": - "Uttalskorrigering, realtidsövning av muntlig färdighet", - "travelTranslator": "Reseöversättningsassistent", - "travelTranslatorInfo": - "Realtids röstöversättning, introduktion till turistattraktioner", - "beSearching": "Söker:", - "noAssistantFound": "Ingen motsvarande AI-assistent hittades", + "usageStats": "Användningsstatistik", + "usageStatsInfo": "Visa din användningsstatistik", "scene": "Scenario", - "youHaveSelected": "Du har valt:", - "newFunction": "Ny funktion", - "youChoseTry": "Du valde att prova", - "aiSinger": "AI-sångarläge", - "aiSingerInfo": - "Sjung vilken låt som helst med din favoritsångares röst, även dina egna kompositioner", - "popularFunction": "Populära funktionsscenarier", - "tryNow": "Prova nu", // 商务会议助手页 "startMeeting": "Starta möte", diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index 60c85fcd1..a0cbc2e82 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -176,21 +176,9 @@ const Map thTH = { "healthConsultantInfo": "มีฟังก์ชันแชท AI เพิ่มเติม", "conferenceAssistant": "ผู้ช่วยประชุมธุรกิจ", "conferenceAssistantInfo": "บันทึกการประชุมแบบเรียลไทม์ แปลหลายภาษา", - "studyAssistant": "ผู้ช่วยเรียนภาษา", - "studyAssistantInfo": "แก้ไขการออกเสียง ฝึกพูดแบบเรียลไทม์", - "travelTranslator": "ผู้ช่วยแปลภาษาสำหรับการเดินทาง", - "travelTranslatorInfo": "แปลเสียงแบบเรียลไทม์ แนะนำสถานที่ท่องเที่ยว", - "beSearching": "กำลังค้นหา:", - "noAssistantFound": "ไม่พบผู้ช่วย AI ที่ตรงกัน", + "usageStats": "สถิติการใช้งาน", + "usageStatsInfo": "ดูสถิติการใช้งานของคุณ", "scene": "สถานการณ์", - "youHaveSelected": "คุณได้เลือก:", - "newFunction": "ฟังก์ชันใหม่", - "youChoseTry": "คุณเลือกที่จะลอง", - "aiSinger": "โหมดนักร้อง AI", - "aiSingerInfo": - "ร้องเพลงใดก็ได้ด้วยเสียงของนักร้องที่คุณชื่นชอบ แม้แต่เพลงที่คุณแต่งเอง", - "popularFunction": "สถานการณ์ฟังก์ชันยอดนิยม", - "tryNow": "ลองเลย", // 商务会议助手页 "startMeeting": "เริ่มการประชุม", diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index 9b537f6b5..e697b10d5 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -185,23 +185,9 @@ const Map tlPH = { "conferenceAssistant": "Business Meeting Assistant", "conferenceAssistantInfo": "Real-time na pagtatala ng mga minuto ng pulong, pagsasalin sa maraming wika", - "studyAssistant": "Language Learning Assistant", - "studyAssistantInfo": - "Pagwawasto ng bigkas, real-time na pagsasanay sa pagsasalita", - "travelTranslator": "Travel Translation Assistant", - "travelTranslatorInfo": - "Real-time na pagsasalin ng boses, pagpapakilala sa mga pasyalan", - "beSearching": "Naghahanap:", - "noAssistantFound": "Walang natagpuang katugmang AI assistant", + "usageStats": "Usage Statistics", + "usageStatsInfo": "View your usage statistics", "scene": "Eksena", - "youHaveSelected": "Pinili mo ang:", - "newFunction": "Bagong Function", - "youChoseTry": "Pinili mong subukan", - "aiSinger": "AI Singer Mode", - "aiSingerInfo": - "Kantahin ang anumang kanta sa boses ng paborito mong mang-aawit, kahit na ang sarili mong mga likha", - "popularFunction": "Mga Sikat na Eksena ng Function", - "tryNow": "Subukan Ngayon", // 商务会议助手页 "startMeeting": "Simulan ang Pulong", diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index 8d4453991..7ffdaa604 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -180,22 +180,9 @@ const Map trTR = { "conferenceAssistant": "İş Toplantısı Asistanı", "conferenceAssistantInfo": "Gerçek zamanlı toplantı tutanakları, çok dilli çeviri", - "studyAssistant": "Dil Öğrenme Asistanı", - "studyAssistantInfo": "Telaffuz düzeltme, gerçek zamanlı konuşma pratiği", - "travelTranslator": "Seyahat Çeviri Asistanı", - "travelTranslatorInfo": - "Gerçek zamanlı sesli çeviri, turistik yer tanıtımları", - "beSearching": "Aranıyor:", - "noAssistantFound": "İlgili yapay zeka asistanı bulunamadı", + "usageStats": "Kullanım İstatistikleri", + "usageStatsInfo": "Kullanım istatistiklerinizi görüntüleyin", "scene": "Senaryo", - "youHaveSelected": "Seçtiniz:", - "newFunction": "Yeni Özellik", - "youChoseTry": "Denemeyi seçtiniz", - "aiSinger": "Yapay Zeka Şarkıcı Modu", - "aiSingerInfo": - "En sevdiğiniz sanatçının sesiyle herhangi bir şarkıyı, hatta kendi bestelerinizi söyleyin", - "popularFunction": "Popüler Özellik Senaryoları", - "tryNow": "Şimdi Dene", // 商务会议助手页 "startMeeting": "Toplantıyı Başlat", diff --git a/lib/core/translations/language/uk_ua.dart b/lib/core/translations/language/uk_ua.dart index 28f538d65..71a933928 100644 --- a/lib/core/translations/language/uk_ua.dart +++ b/lib/core/translations/language/uk_ua.dart @@ -183,23 +183,9 @@ const Map ukUA = { "conferenceAssistant": "Помічник для ділових зустрічей", "conferenceAssistantInfo": "Запис протоколів у реальному часі, багатомовний переклад", - "studyAssistant": "Помічник у вивченні мов", - "studyAssistantInfo": - "Виправлення вимови, практика розмовної мови в реальному часі", - "travelTranslator": "Помічник-перекладач для подорожей", - "travelTranslatorInfo": - "Голосовий переклад у реальному часі, опис туристичних місць", - "beSearching": "Пошук:", - "noAssistantFound": "Не знайдено відповідного помічника AI", + "usageStats": "Статистика використання", + "usageStatsInfo": "Перегляньте статистику використання вашого пристрою", "scene": "Сценарій", - "youHaveSelected": "Ви обрали:", - "newFunction": "Нова функція", - "youChoseTry": "Ви вирішили спробувати", - "aiSinger": "Режим AI співака", - "aiSingerInfo": - "Співайте будь-яку пісню голосом улюбленого співака, навіть пісні власного авторства", - "popularFunction": "Популярні функціональні сценарії", - "tryNow": "Спробувати зараз", // 商务会议助手页 "startMeeting": "Почати зустріч", diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index 7055badee..2313247d2 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -179,22 +179,9 @@ const Map viVN = { "conferenceAssistant": "Trợ lý hội nghị kinh doanh", "conferenceAssistantInfo": "Ghi lại biên bản họp thời gian thực, dịch đa ngôn ngữ", - "studyAssistant": "Trợ lý học ngôn ngữ", - "studyAssistantInfo": "Sửa lỗi phát âm, luyện nói thời gian thực", - "travelTranslator": "Trợ lý dịch thuật du lịch", - "travelTranslatorInfo": - "Dịch giọng nói thời gian thực, giới thiệu các điểm du lịch", - "beSearching": "Đang tìm kiếm:", - "noAssistantFound": "Không tìm thấy trợ lý AI tương ứng", + "usageStats": "Thống kê sử dụng", + "usageStatsInfo": "Xem thống kê sử dụng của bạn", "scene": "Tình huống", - "youHaveSelected": "Bạn đã chọn:", - "newFunction": "Chức năng mới", - "youChoseTry": "Bạn đã chọn thử", - "aiSinger": "Chế độ ca sĩ AI", - "aiSingerInfo": - "Hát bất kỳ bài hát nào bằng giọng của ca sĩ bạn yêu thích, thậm chí cả bài hát do chính bạn sáng tác", - "popularFunction": "Các tình huống chức năng phổ biến", - "tryNow": "Thử ngay", // 商务会议助手页 "startMeeting": "Bắt đầu cuộc họp", diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index d96d17eb7..a0204ca8f 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -176,20 +176,9 @@ const Map zhCN = { "healthConsultantInfo": "提供更多AI聊天功能", "conferenceAssistant": "商务会议助手", "conferenceAssistantInfo": "实时记录会议纪要,多语言翻译", - "studyAssistant": "语言学习助手", - "studyAssistantInfo": "发音纠正,实时练习口语", - "travelTranslator": "旅行翻译助手", - "travelTranslatorInfo": "实时语音翻译,旅游景点介绍", - "beSearching": "正在搜索:", - "noAssistantFound": "未找到对应的AI助手", + "usageStats": "用量统计", + "usageStatsInfo": "查看您的使用统计数据", "scene": "场景", - "youHaveSelected": "您选择了:", - "newFunction": "新功能", - "youChoseTry": "您选择了尝试", - "aiSinger": "AI歌手模式", - "aiSingerInfo": "用你喜欢的歌手声音演唱任何歌曲,甚至是你自己创作的歌曲", - "popularFunction": "热门功能场景", - "tryNow": "立即尝试", // 商品页面(AI/翻译/会议) 'availablePackages': '可购买套餐', diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 2d31ea168..c1664eba1 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -175,20 +175,9 @@ const Map zhHK = { "healthConsultantInfo": "提供更多AI聊天功能", "conferenceAssistant": "商務會議助手", "conferenceAssistantInfo": "實時記錄會議紀要,多語言翻譯", - "studyAssistant": "語言學習助手", - "studyAssistantInfo": "發音糾正,實時練習口語", - "travelTranslator": "旅行翻譯助手", - "travelTranslatorInfo": "實時語音翻譯,旅遊景點介紹", - "beSearching": "正在搜尋:", - "noAssistantFound": "未找到對應的AI助手", + "usageStats": "用量統計", + "usageStatsInfo": "查看您的使用統計數據", "scene": "場景", - "youHaveSelected": "您選擇了:", - "newFunction": "新功能", - "youChoseTry": "您選擇了嘗試", - "aiSinger": "AI歌手模式", - "aiSingerInfo": "用你喜歡的歌手聲音演唱任何歌曲,甚至是你自己創作的歌曲", - "popularFunction": "熱門功能場景", - "tryNow": "立即嘗試", // 商品名稱(按ID) 'ai_001_name': 'AI基礎 100 次', 'ai_002_name': 'AI基礎 500 次', diff --git a/lib/modules/explore/controllers/explore_controller.dart b/lib/modules/explore/controllers/explore_controller.dart index ebd64067a..bdf0ad293 100644 --- a/lib/modules/explore/controllers/explore_controller.dart +++ b/lib/modules/explore/controllers/explore_controller.dart @@ -64,8 +64,8 @@ class ExploreController extends GetxController { targetRoute: Routes.meeting, ), AIFeature( - title: 'usageStats'.tr, - description: 'usageStatsInfo'.tr, + title: 'usageStats'.tr, // 用量统计 + description: 'usageStatsInfo'.tr, // 查看您的使用统计数据 icon: Icons.analytics_outlined, startColor: const Color(0xFF2196F3), // 科技蓝 endColor: const Color(0xFF00BCD4), // 青蓝色 diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index 9bd94a050..36db557fd 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -129,34 +129,34 @@ class SettingsView extends GetView { ), overflow: TextOverflow.ellipsis, ), - SizedBox(height: 4.h), - Row( + // SizedBox(height: 4.h), + const Row( children: [ - Container( - padding: EdgeInsets.symmetric( - horizontal: 8.w, vertical: 2.h), - decoration: BoxDecoration( - color: Colors.blue[600], - borderRadius: BorderRadius.circular(10.r), - ), - child: Obx(() { - final membershipMap = { - 0: 'freeUser', //'免费用户' - 1: 'standardUser', //'标准用户' - 2: 'proUser', //'专业用户' - }; - final membershipString = membershipMap[ - profileCtrl.userInfo.value.viplv] ?? - 'Unknown'; - return Text( - membershipString.tr, // 会员等级 - style: TextStyle( - fontSize: 10.sp, - color: Colors.white, - ), - ); - }), - ), + // Container( + // padding: EdgeInsets.symmetric( + // horizontal: 8.w, vertical: 2.h), + // decoration: BoxDecoration( + // color: Colors.blue[600], + // borderRadius: BorderRadius.circular(10.r), + // ), + // child: Obx(() { + // final membershipMap = { + // 0: 'freeUser', //'免费用户' + // 1: 'standardUser', //'标准用户' + // 2: 'proUser', //'专业用户' + // }; + // final membershipString = membershipMap[ + // profileCtrl.userInfo.value.viplv] ?? + // 'Unknown'; + // return Text( + // membershipString.tr, // 会员等级 + // style: TextStyle( + // fontSize: 10.sp, + // color: Colors.white, + // ), + // ); + // }), + // ), // SizedBox(width: 8.w), // Flexible( // child: Text( From cb62b7fd7199891ac7eb6de3be0aefc8a41fcbdc Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 8 Dec 2025 15:21:53 +0800 Subject: [PATCH 131/177] =?UTF-8?q?refactor(azure=5Fspeech):=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E9=9F=B3=E9=A2=91=E5=B8=A7=E5=8F=91=E9=80=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=88=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91=E6=8A=A5?= =?UTF-8?q?=E9=94=99=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用扩展函数toByteString替代ByteString.of,使代码更简洁 --- .../com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 51e15ad21..647e005f2 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -5,6 +5,7 @@ import android.util.Base64 import android.util.Log import okhttp3.* import okio.ByteString +import okio.ByteString.Companion.toByteString import org.json.JSONObject import java.net.URLEncoder import java.nio.charset.StandardCharsets @@ -66,9 +67,7 @@ class XunFeiAsrHelper(private val context: Context) { } fun sendAudio(frameBuffer: ByteArray) { - webSocket?.let { ws -> - ws.send(ByteString.of(frameBuffer, 0, frameBuffer.size)) - } + webSocket?.send(frameBuffer.toByteString()) } fun close() { From 13971c3b2ec3da48b362984806c6dc2834270c23 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 8 Dec 2025 17:16:28 +0800 Subject: [PATCH 132/177] =?UTF-8?q?feat(=E7=BD=91=E7=BB=9C=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8):=20=E6=B7=BB=E5=8A=A0=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E5=92=8C=E6=97=B6=E9=97=B4=E6=88=B3=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在请求头中添加时间戳和基于MD5的签名,与Go端保持一致的验证机制 --- lib/data/services/network/auth_interceptor.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/data/services/network/auth_interceptor.dart b/lib/data/services/network/auth_interceptor.dart index 2933d5d62..c25accc3b 100644 --- a/lib/data/services/network/auth_interceptor.dart +++ b/lib/data/services/network/auth_interceptor.dart @@ -1,20 +1,33 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart' hide Response; +import 'dart:convert'; +import 'package:crypto/crypto.dart'; import 'package:get_storage/get_storage.dart'; import 'entity/base_entity.dart'; class AuthInterceptor extends Interceptor { final GetStorage _storage = GetStorage(); + final String _signKey = '@214%67g15q4*67m17#4l67!'; // 替换为实际的密钥 @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { var jsonString = _storage.read("logintoken"); options.headers['Authorization'] = jsonString; + final timestamp = DateTime.now().millisecondsSinceEpoch.toString(); + options.headers['Ts'] = timestamp; + options.headers['Sign'] = _generateSign(timestamp); handler.next(options); } + String _generateSign(String timestamp) { + // 按照“MD5(私钥 + 时间戳)”生成签名,与 Go 端保持一致 + final signStr = 'ts=${timestamp}key=${_signKey}'; + print("signStr: $signStr"); + return md5.convert(utf8.encode(signStr)).toString(); + } + @override void onResponse(Response response, ResponseInterceptorHandler handler) async { BaseEntity entity = BaseEntity.fromJson(response.data); From 56349b4f13fcf1bac2535cd232bc46701cbc46fa Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 8 Dec 2025 17:21:11 +0800 Subject: [PATCH 133/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/AzureAsrHelper.kt | 1457 +++++++++-------- .../azure_speech/XunFeiAsrHelper.kt | 57 +- 2 files changed, 789 insertions(+), 725 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index 2f0989c62..34ec10deb 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -24,795 +24,874 @@ import java.util.UUID */ class AzureAsrHelper(private val context: Context) { - private val tag = "AzureAsrHelper" + private val tag = "AzureAsrHelper" - // 核心组件 - private var speechConfig: SpeechConfig? = null - private var recognizer: SpeechRecognizer? = null - private var audioConfig: AudioConfig? = null - private var continuousCallback: ContinuousRecognizeCallback? = null + // 核心组件 + private var speechConfig: SpeechConfig? = null + private var recognizer: SpeechRecognizer? = null + private var audioConfig: AudioConfig? = null + private var continuousCallback: ContinuousRecognizeCallback? = null - // 添加前台服务管理标志 - private var isForegroundServiceRunning = false - // 配置参数 - private var currentLanguage = "zh-CN" - private var supportedLanguages = arrayOf("zh-CN") - private var isAutoDetectLanguage = false - private var subscriptionKey = "" - private var region = "" + // 添加前台服务管理标志 + private var isForegroundServiceRunning = false - // 音频源配置 - var audioSourceType = AudioSourceType.MICROPHONE + // 配置参数 + private var currentLanguage = "zh-CN" + private var supportedLanguages = arrayOf("zh-CN") + private var isAutoDetectLanguage = false + private var subscriptionKey = "" + private var region = "" - // 音频处理 - Initialize immediately to avoid null checks - var audioStream: SimpleAudioReceiver = SimpleAudioReceiver(context) + private var useXunfei = false + private var xunFeiAsrHelper: XunFeiAsrHelper? = null + + // 音频源配置 + var audioSourceType = AudioSourceType.MICROPHONE + + // 音频处理 - Initialize immediately to avoid null checks + var audioStream: SimpleAudioReceiver = SimpleAudioReceiver(context) // 网络状态监听 - private var networkMonitor: NetworkStateMonitor = NetworkStateMonitor(context) - private var isNetworkRecovering = false - + private var networkMonitor: NetworkStateMonitor = NetworkStateMonitor(context) + private var isNetworkRecovering = false + // 网络丢失计数器 - private var networkLostCount = 0 + private var networkLostCount = 0 + // 最大网络丢失次数(3秒检测) - private val maxNetworkLostCount = 3 - + private val maxNetworkLostCount = 3 + // 防抖机制相关变量 - private var lastNetworkLostTime = 0L - private val networkLostDebounceInterval = 3000L // 2秒防抖间隔 - private var currsessionid = "" //识别回话id 关联到整个聊天过程中 - + private var lastNetworkLostTime = 0L + private val networkLostDebounceInterval = 3000L // 2秒防抖间隔 + private var currsessionid = "" //识别回话id 关联到整个聊天过程中 - /** - * 音频来源类型 - */ - enum class AudioSourceType { - /** 使用设备麦克风 */ - MICROPHONE, - /** 使用外部提供的音频数据 */ - EXTERNAL - } + /** + * 音频来源类型 + */ + enum class AudioSourceType { + /** 使用设备麦克风 */ + MICROPHONE, + /** 使用外部提供的音频数据 */ + EXTERNAL + } - /** - * 初始化Azure语音服务 - * - * @param subscriptionKey Azure 订阅密钥 - * @param region Azure 区域 - * @param supportedLanguages 支持的语言数组 - * @param audioSourceType 音频源类型 - * @return 初始化是否成功 - */ - fun initialize( - subscriptionKey: String, - region: String, - supportedLanguages: Array = arrayOf("zh-CN", "en-US"), - audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE - ): Boolean { - try { - // 检查配置是否为空 - if (subscriptionKey.isEmpty() || region.isEmpty()) { - Log.e(tag, "Azure 配置信息不完整") - return false - } - // 释放之前的资源 - dispose() + /** + * 初始化Azure语音服务 + * + * @param subscriptionKey Azure 订阅密钥 + * @param region Azure 区域 + * @param supportedLanguages 支持的语言数组 + * @param audioSourceType 音频源类型 + * @return 初始化是否成功 + */ + fun initialize( + subscriptionKey: String, + region: String, + supportedLanguages: Array = arrayOf("zh-CN", "en-US"), + audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE + ): Boolean { + try { + // 检查配置是否为空 + if (subscriptionKey.isEmpty() || region.isEmpty()) { + Log.e(tag, "Azure 配置信息不完整") + return false + } + + // 释放之前的资源 + dispose() + + // 保存配置 + this.subscriptionKey = subscriptionKey + this.region = region + this.audioSourceType = audioSourceType + + // 设置语言 + if (supportedLanguages.isNotEmpty()) { + this.supportedLanguages = supportedLanguages + } + + this.useXunfei = supportedLanguages.any { it == "zh-CN" || it == "en-US" } + + // 根据支持的语言数量决定是否启用自动语言检测 + this.isAutoDetectLanguage = supportedLanguages.size >= 2 + + // 如果只有一种语言,设置为当前语言 + if (!isAutoDetectLanguage && supportedLanguages.isNotEmpty()) { + this.currentLanguage = supportedLanguages[0] + } + + // 创建语音配置 + speechConfig = SpeechConfig.fromSubscription(subscriptionKey, region).apply { + if (isAutoDetectLanguage) { + // 直接启用语言检测模式 + setProperty(PropertyId.SpeechServiceConnection_LanguageIdMode, "Continuous") + } else { + // 设置指定的识别语言 + speechRecognitionLanguage = currentLanguage + } - // 保存配置 - this.subscriptionKey = subscriptionKey - this.region = region - this.audioSourceType = audioSourceType + setProperty("SpeechServiceConnection_EndSilenceTimeoutMs", "300") + setProperty("Speech_SegmentationSilenceTimeoutMs", "300") + + // 优化:添加低延迟连接配置 + setProperty("SpeechServiceConnection_InitialSilenceTimeoutMs", "200") + setProperty("SpeechServiceConnection_RecoMode", "INTERACTIVE") + setProperty("Speech_PushStreamFormat", "PCM") + + // 设置分段策略为时间模式 + setProperty("Speech_SegmentationStrategy", "Time") + } + // 初始化网络监听 + networkMonitor.initialize(object : NetworkStateMonitor.NetworkStateListener { + override fun onNetworkAvailable() { + handleNetworkAvailable() + } - // 设置语言 - if (supportedLanguages.isNotEmpty()) { - this.supportedLanguages = supportedLanguages - } + override fun onNetworkLost() { + handleNetworkLost() + } + }) - // 根据支持的语言数量决定是否启用自动语言检测 - this.isAutoDetectLanguage = supportedLanguages.size >= 2 + return true + } catch (e: Exception) { + Log.e(tag, "初始化失败: ${e.message}") + return false + } + } + + // /** + // * 设置音频配置 + // * @param sampleRate 采样率 (8000, 16000, 24000, 32000, 44100, 48000) + // * @param channels 声道数 (1=单声道, 2=立体声) + // */ + // fun setAudioConfig(sampleRate: Int, channels: Int) { + // try { + // // 设置RecordFile的音频配置 + // recordfile?.setAudioConfig(sampleRate, channels) + // Log.d(tag, "音频配置已设置: 采样率=${sampleRate}Hz, 声道数=${channels}") + // } catch (e: Exception) { + // Log.e(tag, "设置音频配置失败: ${e.message}") + // } + // } + + private fun isRecognizerValid(): Boolean { + return recognizer != null + } - // 如果只有一种语言,设置为当前语言 - if (!isAutoDetectLanguage && supportedLanguages.isNotEmpty()) { - this.currentLanguage = supportedLanguages[0] - } + /** + * 设置识别器 + */ + private fun setupRecognizer(): Boolean { + try { + // 如果正在进行连续识别,先停止 + if (audioStream.isContinuousRecognitionActive) { + // 直接停止,不等待结果 + recognizer?.stopContinuousRecognitionAsync() + audioStream.isContinuousRecognitionActive = false + } + setupMicrophoneStream() + + recognizer?.close() + recognizer = null + //创建识别器 + recognizer = if (isAutoDetectLanguage) { + val autoDetectConfig = + AutoDetectSourceLanguageConfig.fromLanguages(supportedLanguages.toList()) + SpeechRecognizer(speechConfig, autoDetectConfig, audioConfig) + } else { + SpeechRecognizer(speechConfig, audioConfig) + } + + return true + } catch (e: Exception) { + Log.e(tag, "创建识别器失败: ${e.message}") + stopAudioProcessing() + return false + } + } - // 创建语音配置 - speechConfig = SpeechConfig.fromSubscription(subscriptionKey, region).apply { - if (isAutoDetectLanguage) { - // 直接启用语言检测模式 - setProperty(PropertyId.SpeechServiceConnection_LanguageIdMode, "Continuous") - } else { - // 设置指定的识别语言 - speechRecognitionLanguage = currentLanguage - } - - setProperty("SpeechServiceConnection_EndSilenceTimeoutMs", "300") - setProperty("Speech_SegmentationSilenceTimeoutMs", "300") - - // 优化:添加低延迟连接配置 - setProperty("SpeechServiceConnection_InitialSilenceTimeoutMs", "200") - setProperty("SpeechServiceConnection_RecoMode", "INTERACTIVE") - setProperty("Speech_PushStreamFormat", "PCM") - - // 设置分段策略为时间模式 - setProperty("Speech_SegmentationStrategy", "Time") - } - // 初始化网络监听 - networkMonitor.initialize(object : NetworkStateMonitor.NetworkStateListener { - override fun onNetworkAvailable() { - handleNetworkAvailable() - } - - override fun onNetworkLost() { - handleNetworkLost() - } - }) - - return true - } catch (e: Exception) { - Log.e(tag, "初始化失败: ${e.message}") - return false - } + /** + * 设置麦克风流 - 使用拉流方式 + */ + private fun setupMicrophoneStream() { + try { + Log.d(tag, "设置麦克风流 - 使用拉流方式: }") + + // Initialize if not already done + if (!audioStream.isInitialized()) { + audioStream.initAudioRecord() + } + audioStream.setupStream() + audioConfig = AudioConfig.fromStreamInput(audioStream.pushAudioStream) + + } catch (e: Exception) { + Log.e(tag, "设置麦克风流失败: ${e.message}") } + } - // /** - // * 设置音频配置 - // * @param sampleRate 采样率 (8000, 16000, 24000, 32000, 44100, 48000) - // * @param channels 声道数 (1=单声道, 2=立体声) - // */ - // fun setAudioConfig(sampleRate: Int, channels: Int) { - // try { - // // 设置RecordFile的音频配置 - // recordfile?.setAudioConfig(sampleRate, channels) - // Log.d(tag, "音频配置已设置: 采样率=${sampleRate}Hz, 声道数=${channels}") - // } catch (e: Exception) { - // Log.e(tag, "设置音频配置失败: ${e.message}") - // } - // } - - private fun isRecognizerValid(): Boolean { - return recognizer != null + + /** + * 开始连续语音识别 + * @param audioSourceType 音频源类型 + * @param audioDataCallback 音频数据回调 + * @return 是否成功开始识别 + */ + fun startContinuousRecognition( + audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE, + audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = null + ): Boolean { + + Log.d(tag, "startContinuousRecognition:${audioStream.isContinuousRecognitionActive} ") + + // 检查网络状态 + if (!checkNetworkStatus()) { + Log.e(tag, "网络不可用,无法开始语音识别") + continuousCallback?.onError(currsessionid, 1000, "网络连接不可用,请检查网络设置") + return false } - /** - * 设置识别器 - */ - private fun setupRecognizer(): Boolean { - try { - // 如果正在进行连续识别,先停止 - if (audioStream.isContinuousRecognitionActive) { - // 直接停止,不等待结果 - recognizer?.stopContinuousRecognitionAsync() - audioStream.isContinuousRecognitionActive = false - } - setupMicrophoneStream() - - recognizer?.close() - recognizer = null - //创建识别器 - recognizer = if (isAutoDetectLanguage) { - val autoDetectConfig = - AutoDetectSourceLanguageConfig.fromLanguages(supportedLanguages.toList()) - SpeechRecognizer(speechConfig, autoDetectConfig, audioConfig) - } else { - SpeechRecognizer(speechConfig, audioConfig) - } + if (audioStream.isContinuousRecognitionActive) { + return true + } - return true - } catch (e: Exception) { - Log.e(tag, "创建识别器失败: ${e.message}") - stopAudioProcessing() - return false - } + // 启动前台服务(在开始音频录制前) + if (!isForegroundServiceRunning && audioSourceType == AudioSourceType.MICROPHONE) { + try { + AudioRecordingForegroundService.startService(context) + isForegroundServiceRunning = true + Log.d(tag, "前台服务已启动") + } catch (e: Exception) { + Log.e(tag, "启动前台服务失败: ${e.message}") + continuousCallback?.onError(currsessionid, 1003, "启动前台服务失败: ${e.message}") + return false + } } - /** - * 设置麦克风流 - 使用拉流方式 - */ - private fun setupMicrophoneStream() { - try { - Log.d(tag, "设置麦克风流 - 使用拉流方式: }") + if (useXunfei) { + Log.d(tag, "Using Xunfei Recognition") + val callback = continuousCallback + if (callback == null) { + Log.e(tag, "无法启动连续识别:回调为空") + continuousCallback?.onError(currsessionid, 1001, "回调为空") + return false + } - // Initialize if not already done - if (!audioStream.isInitialized()) { - audioStream.initAudioRecord() - } - audioStream.setupStream() - audioConfig = AudioConfig.fromStreamInput(audioStream.pushAudioStream) + if (xunFeiAsrHelper == null) { + xunFeiAsrHelper = XunFeiAsrHelper(context) + } - } catch (e: Exception) { - Log.e(tag, "设置麦克风流失败: ${e.message}") + try { + xunFeiAsrHelper?.start(callback) + + this.audioSourceType = audioSourceType + if (!audioStream.isContinuousRecognitionActive) { + audioStream.startAudioRecord( + when (audioSourceType) { + AudioSourceType.MICROPHONE -> SimpleAudioReceiver.AudioSourceType.MICROPHONE + AudioSourceType.EXTERNAL -> SimpleAudioReceiver.AudioSourceType.EXTERNAL + }, + object : SimpleAudioReceiver.AudioDataCallback { + override fun onAudio(data: ByteArray) { + audioDataCallback?.onAudio(data) + xunFeiAsrHelper?.sendAudio(data) + } + } + ) } + audioStream.isContinuousRecognitionActive = true + return true + } catch (e: Exception) { + Log.e(tag, "Start Xunfei failed: ${e.message}") + xunFeiAsrHelper?.stop() + audioStream.isContinuousRecognitionActive = false + return false + } + } + + if (!isRecognizerValid()) { + Log.d(tag, "重新启动连续识别") + val callback = continuousCallback + if (callback == null) { + Log.e(tag, "无法重新启动连续识别:回调为空") + continuousCallback?.onError(currsessionid, 1001, "回调为空") + return false + } + setupEventListeners(callback) } + this.audioSourceType = audioSourceType + + try { + Log.d(tag, "startContinuousRecognition: ${audioStream.isWriting()}") + // 启动音频处理(若已启动则跳过) + if (!audioStream.isContinuousRecognitionActive) { + Log.d(tag, "startAudioRecord:$audioSourceType") + audioStream.startAudioRecord( + when (audioSourceType) { + AudioSourceType.MICROPHONE -> SimpleAudioReceiver.AudioSourceType.MICROPHONE + AudioSourceType.EXTERNAL -> SimpleAudioReceiver.AudioSourceType.EXTERNAL + }, + audioDataCallback + ) + } else { + Log.d(tag, "音频已启动,跳过重复启动") + } + + recognizer?.startContinuousRecognitionAsync() + audioStream.isContinuousRecognitionActive = true + return true + } catch (e: Exception) { + Log.e(tag, "开始连续识别失败: ${e.message}") + stopContinuousRecognition() + audioStream.isContinuousRecognitionActive = false + return false + } + } + /** + * 设置事件监听器 + */ + fun setupEventListeners(callback: ContinuousRecognizeCallback): Boolean { + Log.d(tag, "设置ssssss监听器:${speechConfig ?: "null"} ") + if (speechConfig == null) { + callback.onError(currsessionid, 1002, "语音服务未初始化") + return false + } - /** - * 开始连续语音识别 - * @param audioSourceType 音频源类型 - * @param audioDataCallback 音频数据回调 - * @return 是否成功开始识别 - */ - fun startContinuousRecognition( - audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE, - audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = null - ): Boolean { - - Log.d(tag, "startContinuousRecognition:${audioStream.isContinuousRecognitionActive} ") - - // 检查网络状态 - if (!checkNetworkStatus()) { - Log.e(tag, "网络不可用,无法开始语音识别") - continuousCallback?.onError(currsessionid,1000,"网络连接不可用,请检查网络设置") - return false - } - - if (audioStream.isContinuousRecognitionActive) { - return true - } - - // 启动前台服务(在开始音频录制前) - if (!isForegroundServiceRunning && audioSourceType == AudioSourceType.MICROPHONE) { - try { - AudioRecordingForegroundService.startService(context) - isForegroundServiceRunning = true - Log.d(tag, "前台服务已启动") - } catch (e: Exception) { - Log.e(tag, "启动前台服务失败: ${e.message}") - continuousCallback?.onError(currsessionid,1003, "启动前台服务失败: ${e.message}") - return false - } - } - - if (!isRecognizerValid()) { - Log.d(tag, "重新启动连续识别") - val callback = continuousCallback - if (callback == null) { - Log.e(tag, "无法重新启动连续识别:回调为空") - continuousCallback?.onError(currsessionid,1001,"回调为空") - return false + // 重设识别器 + if (!setupRecognizer()) { + Log.d(tag, "初始化失败: ") + return false + } + try { + continuousCallback = callback; + Log.d(tag, "设置ssssss监听器: ") + // 优化:识别中事件 - 添加文本长度检查 + recognizer?.recognizing?.addEventListener( + EventHandler { _, event -> + // 优化:只处理非空结果 + if (event.result.text.isNotEmpty()) { + val detectedLanguage = if (isAutoDetectLanguage) { + AutoDetectSourceLanguageResult.fromResult(event.result)?.language ?: "" + } else { + currentLanguage } - setupEventListeners(callback) + callback.onRecognizing(currsessionid, event.result.text, detectedLanguage) + } } - this.audioSourceType = audioSourceType - - try { - Log.d(tag, "startContinuousRecognition: ${audioStream.isWriting()}") - // 启动音频处理(若已启动则跳过) - if (!audioStream.isContinuousRecognitionActive) { - Log.d(tag, "startAudioRecord:$audioSourceType") - audioStream.startAudioRecord( - when (audioSourceType) { - AudioSourceType.MICROPHONE -> SimpleAudioReceiver.AudioSourceType.MICROPHONE - AudioSourceType.EXTERNAL -> SimpleAudioReceiver.AudioSourceType.EXTERNAL - }, - audioDataCallback - ) + ) + + // 优化:识别完成事件 - 优化语言检测 + recognizer?.recognized?.addEventListener( + EventHandler { _, event -> + if (event.result.reason == ResultReason.RecognizedSpeech && event.result.text.isNotEmpty()) { + val detectedLanguage = if (isAutoDetectLanguage) { + AutoDetectSourceLanguageResult.fromResult(event.result)?.language + ?: supportedLanguages[0] } else { - Log.d(tag, "音频已启动,跳过重复启动") + currentLanguage } - - recognizer?.startContinuousRecognitionAsync() - audioStream.isContinuousRecognitionActive = true - return true - } catch (e: Exception) { - Log.e(tag, "开始连续识别失败: ${e.message}") - stopContinuousRecognition() - audioStream.isContinuousRecognitionActive = false - return false + callback.onResult(currsessionid, event.result.text, detectedLanguage) + currsessionid = UUID.randomUUID().toString() + } } - } + ) + + // 会话开始事件 + recognizer?.sessionStarted?.addEventListener( + EventHandler { _, _ -> + // 直接在当前线程调用回调 + Log.d(tag, "会话开始事件") + currsessionid = UUID.randomUUID().toString() + callback.onSessionStarted(currsessionid) + } + ) + + // 会话结束事件 + recognizer?.sessionStopped?.addEventListener( + EventHandler { _, _ -> + // 直接在当前线程调用回调 + Log.d(tag, "会话结束事件") + if (audioSourceType == AudioSourceType.EXTERNAL) { + callback.onSessionStopped(currsessionid) + audioStream?.isContinuousRecognitionActive = false + } + } + ) - /** - * 设置事件监听器 - */ - fun setupEventListeners(callback: ContinuousRecognizeCallback): Boolean { - Log.d(tag, "设置ssssss监听器:${speechConfig ?: "null"} ") - if (speechConfig == null) { - callback.onError(currsessionid,1002,"语音服务未初始化") - return false + // 取消事件 + recognizer?.canceled?.addEventListener( + EventHandler { _, event -> + val errorDetails = event.errorDetails ?: "未知错误" + val reason = event.reason.toString() + + Log.d(tag, "识别被取消: reason=$reason, details=$errorDetails") + callback.onCanceled(currsessionid, reason, errorDetails) } + ) + } catch (e: Exception) { + callback.onError(currsessionid, 1001, "启动连续识别失败: ${e.message}") + return false + } + return true + } + - // 重设识别器 - if (!setupRecognizer()) { - Log.d(tag, "初始化失败: ") - return false + /** + * 停止连续语音识别 + * + * @return 是否成功停止 + */ + fun stopContinuousRecognition(): Boolean { + if (useXunfei) { + try { + xunFeiAsrHelper?.stop() + stopAudioProcessing() + audioStream.isContinuousRecognitionActive = false + + if (isForegroundServiceRunning) { + try { + AudioRecordingForegroundService.stopService(context) + isForegroundServiceRunning = false + } catch (e: Exception) { + Log.e(tag, "停止前台服务失败: ${e.message}") + } } + return true + } catch (e: Exception) { + Log.e(tag, "Stop Xunfei failed: ${e.message}") + return false + } + } + + if (speechConfig == null) { + Log.e(tag, "语音服务未初始化") + return false + } + try { + Log.d(tag, "停止连续语音识别: ") + // 停止音频处理 + audioStream.stopMicrophoneCapture() + // 直接停止连续识别(SDK内部已是异步操作) + recognizer?.stopContinuousRecognitionAsync()?.get(1000, TimeUnit.MILLISECONDS) + + recognizer?.close() + recognizer = null + audioStream.isContinuousRecognitionActive = false + + // 停止前台服务 + if (isForegroundServiceRunning) { try { - continuousCallback = callback; - Log.d(tag, "设置ssssss监听器: ") - // 优化:识别中事件 - 添加文本长度检查 - recognizer?.recognizing?.addEventListener( - EventHandler { _, event -> - // 优化:只处理非空结果 - if (event.result.text.isNotEmpty()) { - val detectedLanguage = if (isAutoDetectLanguage) { - AutoDetectSourceLanguageResult.fromResult(event.result)?.language ?: "" - } else { - currentLanguage - } - callback.onRecognizing(currsessionid,event.result.text, detectedLanguage) - } - } - ) - - // 优化:识别完成事件 - 优化语言检测 - recognizer?.recognized?.addEventListener( - EventHandler { _, event -> - if (event.result.reason == ResultReason.RecognizedSpeech && event.result.text.isNotEmpty()) { - val detectedLanguage = if (isAutoDetectLanguage) { - AutoDetectSourceLanguageResult.fromResult(event.result)?.language - ?: supportedLanguages[0] - } else { - currentLanguage - } - callback.onResult(currsessionid,event.result.text, detectedLanguage) - currsessionid = UUID.randomUUID().toString() - } - } - ) - - // 会话开始事件 - recognizer?.sessionStarted?.addEventListener( - EventHandler { _, _ -> - // 直接在当前线程调用回调 - Log.d(tag, "会话开始事件") - currsessionid = UUID.randomUUID().toString() - callback.onSessionStarted(currsessionid) - } - ) - - // 会话结束事件 - recognizer?.sessionStopped?.addEventListener( - EventHandler { _, _ -> - // 直接在当前线程调用回调 - Log.d(tag, "会话结束事件") - if (audioSourceType == AudioSourceType.EXTERNAL) { - callback.onSessionStopped(currsessionid) - audioStream?.isContinuousRecognitionActive = false - } - } - ) - - // 取消事件 - recognizer?.canceled?.addEventListener( - EventHandler { _, event -> - val errorDetails = event.errorDetails ?: "未知错误" - val reason = event.reason.toString() - - Log.d(tag, "识别被取消: reason=$reason, details=$errorDetails") - callback.onCanceled(currsessionid,reason,errorDetails) - } - ) + AudioRecordingForegroundService.stopService(context) + isForegroundServiceRunning = false + Log.d(tag, "前台服务已停止") } catch (e: Exception) { - callback.onError(currsessionid,1001,"启动连续识别失败: ${e.message}") - return false + Log.e(tag, "停止前台服务失败: ${e.message}") } - return true + } + + return true + } catch (e: Exception) { + // 强制重置状态 + audioStream.isContinuousRecognitionActive = false + Log.e(tag, "停止连续识别失败: ${e.message}") + // 停止音频处理 + audioStream.stopMicrophoneCapture() + recognizer?.stopContinuousRecognitionAsync() + recognizer?.close() + recognizer = null + audioStream.isContinuousRecognitionActive = false + + // 确保前台服务被停止 + if (isForegroundServiceRunning) { + try { + AudioRecordingForegroundService.stopService(context) + isForegroundServiceRunning = false + } catch (e2: Exception) { + Log.e(tag, "强制停止前台服务失败: ${e2.message}") + } + } + + return false } + } + /** + * 检查连续识别是否活跃 + */ + fun isContinuousRecognitionActive(): Boolean = audioStream.isContinuousRecognitionActive - /** - * 停止连续语音识别 - * - * @return 是否成功停止 - */ - fun stopContinuousRecognition(): Boolean { - if (speechConfig == null) { - Log.e(tag, "语音服务未初始化") - return false + /** + * 释放所有资源 + */ + fun dispose() { + try { + // 如果正在进行连续识别,先停止 + if (audioStream.isContinuousRecognitionActive) { + if (useXunfei) { + xunFeiAsrHelper?.stop() + } else { + // 直接停止,不等待结果 + recognizer?.stopContinuousRecognitionAsync() } + audioStream.isContinuousRecognitionActive = false + } + // 停止音频处理 + stopAudioProcessing() + // 清理网络监听 + clearNetworkDetection() + // 停止录音 + audioStream.recordfile?.closeFile(true) + + // 释放recognizer + recognizer?.close() + recognizer = null + + xunFeiAsrHelper?.stop() + xunFeiAsrHelper = null + + // 释放speechConfig + speechConfig?.close() + speechConfig = null + + // 释放音频配置 + audioConfig?.close() + audioConfig = null + + // 确保前台服务被停止 + if (isForegroundServiceRunning) { try { - Log.d(tag, "停止连续语音识别: ") - // 停止音频处理 - audioStream.stopMicrophoneCapture() - // 直接停止连续识别(SDK内部已是异步操作) - recognizer?.stopContinuousRecognitionAsync()?.get(1000, TimeUnit.MILLISECONDS) - - recognizer?.close() - recognizer = null - audioStream.isContinuousRecognitionActive = false - - // 停止前台服务 - if (isForegroundServiceRunning) { - try { - AudioRecordingForegroundService.stopService(context) - isForegroundServiceRunning = false - Log.d(tag, "前台服务已停止") - } catch (e: Exception) { - Log.e(tag, "停止前台服务失败: ${e.message}") - } - } - - return true + AudioRecordingForegroundService.stopService(context) + isForegroundServiceRunning = false + Log.d(tag, "dispose时前台服务已停止") } catch (e: Exception) { - // 强制重置状态 - audioStream.isContinuousRecognitionActive = false - Log.e(tag, "停止连续识别失败: ${e.message}") - // 停止音频处理 - audioStream.stopMicrophoneCapture() - recognizer?.stopContinuousRecognitionAsync() - recognizer?.close() - recognizer = null - audioStream.isContinuousRecognitionActive = false - - // 确保前台服务被停止 - if (isForegroundServiceRunning) { - try { - AudioRecordingForegroundService.stopService(context) - isForegroundServiceRunning = false - } catch (e2: Exception) { - Log.e(tag, "强制停止前台服务失败: ${e2.message}") - } - } - - return false + Log.e(tag, "dispose时停止前台服务失败: ${e.message}") } + } + + // 确保状态被重置 + audioStream.isContinuousRecognitionActive = false + currsessionid = "" + } catch (e: Exception) { + // 确保状态被重置 + audioStream.isContinuousRecognitionActive = false + audioConfig = null + recognizer = null + speechConfig = null + isForegroundServiceRunning = false + currsessionid = "" } + } - /** - * 检查连续识别是否活跃 - */ - fun isContinuousRecognitionActive(): Boolean = audioStream.isContinuousRecognitionActive + // 音频处理相关方法 + /** + * 停止音频处理 + */ + private fun stopAudioProcessing() { + try { + Log.e(tag, "停止音频处理: }") + audioStream.releaseAudioResources() + audioStream.pushAudioStream?.close() + } catch (e: Exception) { + Log.e(tag, "关闭麦克风流失败: ${e.message}") + e.printStackTrace() + } + } - /** - * 释放所有资源 - */ - fun dispose() { - try { - // 如果正在进行连续识别,先停止 - if (audioStream.isContinuousRecognitionActive) { - // 直接停止,不等待结果 - recognizer?.stopContinuousRecognitionAsync() - audioStream.isContinuousRecognitionActive = false - } - // 停止音频处理 - stopAudioProcessing() - // 清理网络监听 - clearNetworkDetection() - // 停止录音 - audioStream.recordfile?.closeFile(true) - - // 释放recognizer - recognizer?.close() - recognizer = null - - // 释放speechConfig - speechConfig?.close() - speechConfig = null - - // 释放音频配置 - audioConfig?.close() - audioConfig = null - - // 确保前台服务被停止 - if (isForegroundServiceRunning) { - try { - AudioRecordingForegroundService.stopService(context) - isForegroundServiceRunning = false - Log.d(tag, "dispose时前台服务已停止") - } catch (e: Exception) { - Log.e(tag, "dispose时停止前台服务失败: ${e.message}") - } - } - - // 确保状态被重置 - audioStream.isContinuousRecognitionActive = false - currsessionid = "" - } catch (e: Exception) { - // 确保状态被重置 - audioStream.isContinuousRecognitionActive = false - audioConfig = null - recognizer = null - speechConfig = null - isForegroundServiceRunning = false - currsessionid = "" - } + +//录音音频文件 + /** + * 开启录音 + */ + fun enableRecord( + audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE, + filePath: String, + audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = null + ) { + Log.i(tag, "开启录音:") + this.audioSourceType = audioSourceType + if (audioSourceType == AudioSourceType.EXTERNAL) { + Log.i(tag, "外部音频源不在这里录音") + return } - // 音频处理相关方法 - /** - * 停止音频处理 - */ - private fun stopAudioProcessing() { + // 启动前台服务(在开始录音前) + if (!isForegroundServiceRunning) { + try { + AudioRecordingForegroundService.startService(context) + isForegroundServiceRunning = true + Log.d(tag, "录音前台服务已启动") + } catch (e: Exception) { + Log.e(tag, "启动录音前台服务失败: ${e.message}") + } + } + if (audioStream.recordfile == null) { + audioStream.recordfile = RecordFile() + } + + if (!audioStream.isContinuousRecognitionActive) { + // 启动音频处理 + Log.i(tag, "开启录音:audioSourceType${audioSourceType}") + // Initialize if not already done + if (!audioStream.isInitialized()) { + audioStream.initAudioRecord() + } + audioStream.setupStream() + + + audioStream.startAudioRecord( + when (audioSourceType) { + AudioSourceType.MICROPHONE -> SimpleAudioReceiver.AudioSourceType.MICROPHONE + AudioSourceType.EXTERNAL -> SimpleAudioReceiver.AudioSourceType.EXTERNAL + }, + audioDataCallback + ) + } + + audioStream.isRecord = true + audioStream.recordfile?.closeFile(true) + audioStream.recordfile?.creatingFiles(filePath) + } + + /** + * 移动文件到新路径 + */ + fun moveFile(sourcePath: String, destPath: String): Boolean { + if (audioSourceType == AudioSourceType.EXTERNAL) { + Log.i(tag, "外部音频源不在这里移动文件") + return false + } + Log.i(tag, "移动文件到新路径:") + audioStream.recordfile?.moveFile(sourcePath, destPath) ?: return false + return true + } + + /** + * 重命名指定路径的音频文件 + */ + fun renameFile(filePath: String, newName: String): Boolean { + if (audioSourceType == AudioSourceType.EXTERNAL) { + Log.i(tag, "外部音频源不在这里重命名文件") + return false + } + Log.i(tag, "重命名指定路径的音频文件:") + audioStream.recordfile?.renameFile(filePath, newName) ?: return false + return true + } + + /** + * 停止录音 + */ + fun pauseRecord() { + if (audioSourceType == AudioSourceType.EXTERNAL) { + Log.i(tag, "外部音频源不在这里暂停录音") + return + } + Log.i(tag, "停止连续录音:") + audioStream.recordfile ?: return + audioStream.isRecord = false + } + + /** + * 继续录音 + */ + fun resumeRecord() { + if (audioSourceType == AudioSourceType.EXTERNAL) { + Log.i(tag, "外部音频源不在这里继续录音") + return + } + Log.i(tag, "继续录音:") + audioStream.recordfile ?: return + audioStream.isRecord = true + } + + /** + * 关闭录音 + */ + fun stopRecord(isSave: Boolean) { + if (audioSourceType == AudioSourceType.EXTERNAL) { + Log.i(tag, "外部音频源不在这里关闭录音") + return + } + Log.i(tag, "关闭录音:") + audioStream.recordfile ?: return + + if (!audioStream.isContinuousRecognitionActive) { + audioStream.stopMicrophoneCapture() + + // 停止录音时也停止前台服务(如果没有其他音频任务) + if (isForegroundServiceRunning) { try { - Log.e(tag, "停止音频处理: }") - audioStream.releaseAudioResources() - audioStream.pushAudioStream?.close() + AudioRecordingForegroundService.stopService(context) + isForegroundServiceRunning = false + Log.d(tag, "录音前台服务已停止") } catch (e: Exception) { - Log.e(tag, "关闭麦克风流失败: ${e.message}") - e.printStackTrace() + Log.e(tag, "停止录音前台服务失败: ${e.message}") } + } } - - + audioStream.isRecord = false + audioStream.recordfile?.closeFile(isSave) + } -//录音音频文件 + /** + * 一次性识别回调接口 + */ + interface RecognizeCallback { /** - * 开启录音 + * 返回识别结果 + * + * @param text 识别的文本 + * @param detectedLanguage 检测到的语言 */ - fun enableRecord(audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE,filePath: String, audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = null) { - Log.i(tag, "开启录音:") - this.audioSourceType = audioSourceType - if(audioSourceType == AudioSourceType.EXTERNAL){ - Log.i(tag, "外部音频源不在这里录音") - return - } - - // 启动前台服务(在开始录音前) - if (!isForegroundServiceRunning) { - try { - AudioRecordingForegroundService.startService(context) - isForegroundServiceRunning = true - Log.d(tag, "录音前台服务已启动") - } catch (e: Exception) { - Log.e(tag, "启动录音前台服务失败: ${e.message}") - } - } - if (audioStream.recordfile == null) { - audioStream.recordfile = RecordFile() - } - - if (!audioStream.isContinuousRecognitionActive) { - // 启动音频处理 - Log.i(tag, "开启录音:audioSourceType${audioSourceType}") - // Initialize if not already done - if (!audioStream.isInitialized()) { - audioStream.initAudioRecord() - } - audioStream.setupStream() - - - audioStream.startAudioRecord( when (audioSourceType) { - AudioSourceType.MICROPHONE -> SimpleAudioReceiver.AudioSourceType.MICROPHONE - AudioSourceType.EXTERNAL -> SimpleAudioReceiver.AudioSourceType.EXTERNAL - }, - audioDataCallback - ) - } - - audioStream.isRecord = true - audioStream.recordfile?.closeFile(true) - audioStream.recordfile?.creatingFiles(filePath) - } + fun onResult(text: String, detectedLanguage: String) /** - * 移动文件到新路径 + * 识别错误时调用 + * + * @param code 错误码 + * @param error 错误信息 */ - fun moveFile(sourcePath: String, destPath: String): Boolean { - if(audioSourceType == AudioSourceType.EXTERNAL){ - Log.i(tag, "外部音频源不在这里移动文件") - return false - } - Log.i(tag, "移动文件到新路径:") - audioStream.recordfile?.moveFile(sourcePath, destPath) ?: return false - return true - } + fun onError(code: Int, error: String) + } + /** + * 连续识别回调接口 + */ + interface ContinuousRecognizeCallback { /** - * 重命名指定路径的音频文件 + * 返回识别结果 + * + * @param text 识别的文本 + * @param detectedLanguage 检测到的语言 */ - fun renameFile(filePath: String, newName: String): Boolean { - if(audioSourceType == AudioSourceType.EXTERNAL){ - Log.i(tag, "外部音频源不在这里重命名文件") - return false - } - Log.i(tag, "重命名指定路径的音频文件:") - audioStream.recordfile?.renameFile(filePath, newName) ?: return false - return true - } + fun onResult(sessiond: String, text: String, detectedLanguage: String) /** - * 停止录音 + * 识别进行中调用 + * + * @param recognizing 正在识别的文本 + * @param detectedLanguage 检测到的语言 */ - fun pauseRecord() { - if(audioSourceType == AudioSourceType.EXTERNAL){ - Log.i(tag, "外部音频源不在这里暂停录音") - return - } - Log.i(tag, "停止连续录音:") - audioStream.recordfile ?: return - audioStream.isRecord = false - } + fun onRecognizing(sessiond: String, recognizing: String, detectedLanguage: String) /** - * 继续录音 + * 会话开始时调用 */ - fun resumeRecord() { - if(audioSourceType == AudioSourceType.EXTERNAL){ - Log.i(tag, "外部音频源不在这里继续录音") - return - } - Log.i(tag, "继续录音:") - audioStream.recordfile ?: return - audioStream.isRecord = true - } + fun onSessionStarted(sessiond: String) /** - * 关闭录音 + * 会话结束时调用 */ - fun stopRecord(isSave: Boolean) { - if(audioSourceType == AudioSourceType.EXTERNAL){ - Log.i(tag, "外部音频源不在这里关闭录音") - return - } - Log.i(tag, "关闭录音:") - audioStream.recordfile ?: return - - if (!audioStream.isContinuousRecognitionActive) { - audioStream.stopMicrophoneCapture() - - // 停止录音时也停止前台服务(如果没有其他音频任务) - if (isForegroundServiceRunning) { - try { - AudioRecordingForegroundService.stopService(context) - isForegroundServiceRunning = false - Log.d(tag, "录音前台服务已停止") - } catch (e: Exception) { - Log.e(tag, "停止录音前台服务失败: ${e.message}") - } - } - } - - audioStream.isRecord = false - audioStream.recordfile?.closeFile(isSave) - } - + fun onSessionStopped(sessiond: String) /** - * 一次性识别回调接口 + * 识别取消时调用 + * + * @param reason 取消原因 + * @param errorDetails 错误详情 */ - interface RecognizeCallback { - /** - * 返回识别结果 - * - * @param text 识别的文本 - * @param detectedLanguage 检测到的语言 - */ - fun onResult(text: String, detectedLanguage: String) - - /** - * 识别错误时调用 - * - * @param code 错误码 - * @param error 错误信息 - */ - fun onError(code: Int,error: String) - } + fun onCanceled(sessiond: String, reason: String, errorDetails: String) /** - * 连续识别回调接口 + * 识别出错时调用 + * + * @param error 错误信息 */ - interface ContinuousRecognizeCallback { - /** - * 返回识别结果 - * - * @param text 识别的文本 - * @param detectedLanguage 检测到的语言 - */ - fun onResult(sessiond:String, text: String, detectedLanguage: String) - - /** - * 识别进行中调用 - * - * @param recognizing 正在识别的文本 - * @param detectedLanguage 检测到的语言 - */ - fun onRecognizing(sessiond:String, recognizing: String, detectedLanguage: String) - - /** - * 会话开始时调用 - */ - fun onSessionStarted(sessiond:String) - - /** - * 会话结束时调用 - */ - fun onSessionStopped(sessiond:String) - - - /** - * 识别取消时调用 - * - * @param reason 取消原因 - * @param errorDetails 错误详情 - */ - fun onCanceled(sessiond:String,reason: String, errorDetails: String) - - /** - * 识别出错时调用 - * - * @param error 错误信息 - */ - fun onError(sessiond:String, code: Int,error: String) - } + fun onError(sessiond: String, code: Int, error: String) + } - /** - * 检查当前网络状态 - * @return true表示网络可用,false表示网络不可用 - */ - private fun checkNetworkStatus(): Boolean { - return networkMonitor.checkNetworkStatus() - } /** - * 检查是否是网络相关错误 - */ - private fun isNetworkRelatedError(reason: String, errorDetails: String): Boolean { - return networkMonitor.isNetworkRelatedError(reason, errorDetails) + * 检查当前网络状态 + * @return true表示网络可用,false表示网络不可用 + */ + private fun checkNetworkStatus(): Boolean { + return networkMonitor.checkNetworkStatus() + } + + /** + * 检查是否是网络相关错误 + */ + private fun isNetworkRelatedError(reason: String, errorDetails: String): Boolean { + return networkMonitor.isNetworkRelatedError(reason, errorDetails) + } + + /** + * 处理网络连接可用 + */ + private fun handleNetworkAvailable() { + // 网络恢复时重置计数器 + networkLostCount = 0 + lastNetworkLostTime = 0L + if (!isNetworkRecovering) { + isNetworkRecovering = true + Log.d(tag, "网络恢复,准备重新启动识别") } - - /** - * 处理网络连接可用 - */ - private fun handleNetworkAvailable() { - // 网络恢复时重置计数器 - networkLostCount = 0 - lastNetworkLostTime = 0L - if (!isNetworkRecovering) { - isNetworkRecovering = true - Log.d(tag, "网络恢复,准备重新启动识别") - } + } + + /** + * 处理网络连接丢失(带防抖机制) + */ + private fun handleNetworkLost() { + val currentTime = System.currentTimeMillis() + + // 防抖机制:如果距离上次触发时间小于防抖间隔,则忽略本次触发 + if (currentTime - lastNetworkLostTime < networkLostDebounceInterval) { + Log.d(tag, "网络丢失事件被防抖过滤,距离上次触发仅${currentTime - lastNetworkLostTime}ms") + return } - - /** - * 处理网络连接丢失(带防抖机制) - */ - private fun handleNetworkLost() { - val currentTime = System.currentTimeMillis() - - // 防抖机制:如果距离上次触发时间小于防抖间隔,则忽略本次触发 - if (currentTime - lastNetworkLostTime < networkLostDebounceInterval) { - Log.d(tag, "网络丢失事件被防抖过滤,距离上次触发仅${currentTime - lastNetworkLostTime}ms") - return - } - - // 更新最后触发时间 - lastNetworkLostTime = currentTime + + // 更新最后触发时间 + lastNetworkLostTime = currentTime - //这里启动一个3秒定时器,3秒后检查网络是否恢复 - // 启动3秒定时器,3秒后检查网络是否恢复 + //这里启动一个3秒定时器,3秒后检查网络是否恢复 + // 启动3秒定时器,3秒后检查网络是否恢复 Handler(Looper.getMainLooper()).postDelayed({ - Log.e(tag, "网络不可用") - val isNetworkAvailable = checkNetworkStatus() - if (isNetworkAvailable) { - // 如果网络恢复,重置计数器和防抖时间 - Log.d(tag, "网络已恢复,重置计数器") - lastNetworkLostTime = 0L - isNetworkRecovering = true - } else { - continuousCallback?.onError(currsessionid,1000,"网络连接不可用,请检查网络设置") - Log.d(tag,"网络仍未恢复,继续检测") - networkLostCount = 0 + Log.e(tag, "网络不可用") + val isNetworkAvailable = checkNetworkStatus() + if (isNetworkAvailable) { + // 如果网络恢复,重置计数器和防抖时间 + Log.d(tag, "网络已恢复,重置计数器") + lastNetworkLostTime = 0L + isNetworkRecovering = true + } else { + continuousCallback?.onError(currsessionid, 1000, "网络连接不可用,请检查网络设置") + Log.d(tag, "网络仍未恢复,继续检测") + networkLostCount = 0 stopAudioProcessingImmediately() - } - }, 3000L) // 3秒延时 - } - - /** - * 立即停止音频处理(网络断开时使用) - */ - private fun stopAudioProcessingImmediately() { - try { - Log.d(tag, "立即停止音频处理") - stopContinuousRecognition() - // 不改变isContinuousRecognitionActive状态,保持识别意图 - } catch (e: Exception) { - Log.e(tag, "立即停止音频处理失败: ${e.message}") - } + } + }, 3000L) // 3秒延时 + } + + /** + * 立即停止音频处理(网络断开时使用) + */ + private fun stopAudioProcessingImmediately() { + try { + Log.d(tag, "立即停止音频处理") + stopContinuousRecognition() + // 不改变isContinuousRecognitionActive状态,保持识别意图 + } catch (e: Exception) { + Log.e(tag, "立即停止音频处理失败: ${e.message}") } -/** - * 清理网络检测相关资源 - */ -private fun clearNetworkDetection() { + } + + /** + * 清理网络检测相关资源 + */ + private fun clearNetworkDetection() { networkLostCount = 0 lastNetworkLostTime = 0L -} + } } diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 51e15ad21..18da0e3ae 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -4,11 +4,12 @@ import android.content.Context import android.util.Base64 import android.util.Log import okhttp3.* -import okio.ByteString +import okio.ByteString.Companion.toByteString import org.json.JSONObject import java.net.URLEncoder import java.nio.charset.StandardCharsets import java.security.MessageDigest +import java.util.UUID import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec @@ -16,77 +17,62 @@ class XunFeiAsrHelper(private val context: Context) { private val tag = "XunFeiAsrHelper" private val appId = "43d87d22" - private val accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec" + private val accessKeyId = "83f063755e8d342670002f50a4471d42" private var webSocket: WebSocket? = null private val client = OkHttpClient() - // Status: "UNDEFINED", "CONNECTING", "OPEN", "CLOSING", "CLOSED" - private var btnStatus = "UNDEFINED" + private var currentSessionId = "" - private var resultText = "" + fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) { + currentSessionId = UUID.randomUUID().toString() - var onResult: ((String) -> Unit)? = null - var onError: ((String) -> Unit)? = null - var onStatusChange: ((String) -> Unit)? = null - - fun connectWebSocket() { val url = getWebSocketUrl() val request = Request.Builder().url(url).build() - changeBtnStatus("CONNECTING") - webSocket = client.newWebSocket(request, object : WebSocketListener() { override fun onOpen(webSocket: WebSocket, response: Response) { Log.d(tag, "WebSocket Opened") - changeBtnStatus("OPEN") + callback.onSessionStarted(currentSessionId) } override fun onMessage(webSocket: WebSocket, text: String) { - renderResult(text) + renderResult(text, callback) } override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { Log.d(tag, "WebSocket Closing: $code / $reason") - changeBtnStatus("CLOSING") webSocket.close(1000, null) } override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { Log.d(tag, "WebSocket Closed: $code / $reason") - changeBtnStatus("CLOSED") + callback.onSessionStopped(currentSessionId) } override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { Log.e(tag, "WebSocket Error", t) - changeBtnStatus("CLOSED") - onError?.invoke(t.message ?: "WebSocket connection failed") + callback.onError(currentSessionId, 1004, "Xunfei connection failed: ${t.message}") } }) } fun sendAudio(frameBuffer: ByteArray) { - webSocket?.let { ws -> - ws.send(ByteString.of(frameBuffer, 0, frameBuffer.size)) + webSocket?.let { ws: WebSocket -> + ws.send(frameBuffer.toByteString(0, frameBuffer.size)) } } - fun close() { - webSocket?.let { ws -> + fun stop() { + webSocket?.let { ws: WebSocket -> ws.send("{\"end\": true}") - changeBtnStatus("CLOSING") - } - } - - private fun changeBtnStatus(status: String) { - btnStatus = status - if (status == "CONNECTING") { - resultText = "" } - onStatusChange?.invoke(status) } - private fun renderResult(resultData: String) { + private fun renderResult( + resultData: String, + callback: AzureAsrHelper.ContinuousRecognizeCallback + ) { try { val jsonData = JSONObject(resultData) val action = jsonData.optString("action") @@ -120,16 +106,15 @@ class XunFeiAsrHelper(private val context: Context) { } if (st.optInt("type") == 0) { - resultText += resultTextTemp - onResult?.invoke(resultText) + callback.onResult(currentSessionId, resultTextTemp, "zh-CN") } else { - onResult?.invoke(resultText + resultTextTemp) + callback.onRecognizing(currentSessionId, resultTextTemp, "zh-CN") } } "error" -> { Log.e(tag, "Error: $resultData") - onError?.invoke(jsonData.toString()) + callback.onError(currentSessionId, 1005, "Xunfei error: $resultData") } } } catch (e: Exception) { From 1d86246b85f2a3405ae2fe2cd6d7dacc074f251a Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 8 Dec 2025 17:35:37 +0800 Subject: [PATCH 134/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index 34ec10deb..ed74769ee 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -114,7 +114,7 @@ class AzureAsrHelper(private val context: Context) { this.supportedLanguages = supportedLanguages } - this.useXunfei = supportedLanguages.any { it == "zh-CN" || it == "en-US" } + // this.useXunfei = supportedLanguages.any { it == "zh-CN" || it == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 this.isAutoDetectLanguage = supportedLanguages.size >= 2 From 40d4147c9e2b0ae3775fc2725505110f480b3526 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 8 Dec 2025 16:53:41 +0800 Subject: [PATCH 135/177] =?UTF-8?q?refactor(=E5=95=86=E5=93=81=E6=A8=A1?= =?UTF-8?q?=E5=9D=97):=20=E5=B0=86goodstrade=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E4=B8=BAgoodstrans=E4=BB=A5=E7=BB=9F=E4=B8=80=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E5=95=86=E5=93=81=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构商品模块中的翻译商品相关代码,将goodstrade统一更名为goodstrans 更新路由、绑定、控制器、视图及多语言文件 修改相关页面中的引用和翻译键名 --- lib/core/translations/language/ar_sa.dart | 65 +++++++++---------- lib/core/translations/language/de_de.dart | 60 +++++++++-------- lib/core/translations/language/en_us.dart | 18 ++--- lib/core/translations/language/hi_in.dart | 64 +++++++++--------- lib/core/translations/language/it_it.dart | 61 +++++++++-------- lib/core/translations/language/ko_kr.dart | 60 +++++++++-------- lib/core/translations/language/pt_pt.dart | 61 +++++++++-------- lib/core/translations/language/ru_ru.dart | 62 ++++++++++-------- lib/core/translations/language/zh_cn.dart | 18 ++--- lib/core/translations/language/zh_hk.dart | 18 ++--- .../common/widgets/recharge_dialog.dart | 2 +- .../goods/bindings/goodstrade_binding.dart | 9 --- .../goods/bindings/goodstrans_binding.dart | 9 +++ ...roller.dart => goodstrans_controller.dart} | 4 +- lib/modules/goods/utils/goods_i18n.dart | 12 ++-- ...dstrade_view.dart => goodstrans_view.dart} | 13 ++-- lib/modules/goods/views/goodsvip_view.dart | 2 +- lib/modules/settings/views/settings_view.dart | 2 +- lib/routes/app_pages.dart | 10 +-- lib/routes/app_routes.dart | 2 +- 20 files changed, 294 insertions(+), 258 deletions(-) delete mode 100644 lib/modules/goods/bindings/goodstrade_binding.dart create mode 100644 lib/modules/goods/bindings/goodstrans_binding.dart rename lib/modules/goods/controllers/{goodstrade_controller.dart => goodstrans_controller.dart} (88%) rename lib/modules/goods/views/{goodstrade_view.dart => goodstrans_view.dart} (97%) diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index 305c3d04e..7b4f91430 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -1208,36 +1208,35 @@ const Map arSA = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'transHeaderDesc1': + 'ترجمة متزامنة فورية وترجمة نصية مع بث صوتي منخفض التأخير.', + 'transHeaderDesc2': 'مناسب للسفر والأعمال والخطب والتدريس.', + 'translateZhEn': 'ترجمة صينية-إنجليزية', + 'lowLatencyVoiceBroadcast': 'بث صوتي منخفض التأخير', + 'multiLangTextTranslation': 'ترجمة نصية متعددة اللغات', + 'termOptimizationContextPreserve': 'تحسين المصطلحات والحفاظ على السياق', + 'lexiconTourBusinessLife': 'قواميس السفر/الأعمال/الحياة', + 'personalVocabularyMemory': 'ذاكرة المفردات الشخصية', + 'conversationSubtitleLargeText': 'عناوين المحادثة / وضع النص الكبير', + 'colorHighContrast': 'تباين ألوان عالٍ', + 'transDisclaimer': + 'تعتمد جودة الترجمة على الميكروفون وزمن الشبكة والضوضاء المحيطة.', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'نظرة عامة على المزايا', + 'higherQuota': 'حصة استخدام أعلى', + 'lowerUnitPrice': 'سعر أقل لكل وحدة', + 'priorityService': 'خدمة ذات أولوية', + 'exclusiveSupportChannel': 'قناة دعم مخصصة', + 'fastResponse': 'استجابة سريعة للمشكلات', + 'eventsAndDiscounts': 'فعاليات وخصومات', + 'memberExclusiveEvents': 'فعاليات حصرية للأعضاء', + 'longTermDiscountPlan': 'خطة خصم طويلة الأجل', + 'generalPrivileges': 'امتيازات عامة', + 'earlyAccessNewFeatures': 'وصول مبكر إلى الميزات الجديدة', + 'crossDeviceSync': 'مزامنة عبر الأجهزة', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'تعتمد الفوائد الفعلية على تفاصيل الباقة وقد تتغير مع الإصدارات.', // Goods names by id 'ai_001_name': 'الذكاء الاصطناعي الأساسي 100', 'ai_002_name': 'الذكاء الاصطناعي الأساسي 500', @@ -1245,9 +1244,9 @@ const Map arSA = { 'meet_001_name': 'اجتماع أساسي 100', 'meet_002_name': 'اجتماع أساسي 500', 'meet_003_name': 'اجتماع أساسي 1000', - 'trade_001_name': 'ترجمة أساسية 100', - 'trade_002_name': 'ترجمة أساسية 500', - 'trade_003_name': 'ترجمة أساسية 1000', + 'trans_001_name': 'ترجمة أساسية 100', + 'trans_002_name': 'ترجمة أساسية 500', + 'trans_003_name': 'ترجمة أساسية 1000', // Goods descriptions by id 'ai_001_desc': 'يشمل 100 استخدام. الوصول إلى ميزات الذكاء الاصطناعي الأساسية.', @@ -1258,7 +1257,7 @@ const Map arSA = { 'meet_001_desc': 'يشمل 100 تسجيل/نسخ لاجتماعات.', 'meet_002_desc': 'يشمل 500 تسجيل/نسخ لاجتماعات.', 'meet_003_desc': 'يشمل 1000 تسجيل/نسخ لاجتماعات.', - 'trade_001_desc': 'يشمل 100 ترجمة (صوت/نص).', - 'trade_002_desc': 'يشمل 500 ترجمة (صوت/نص).', - 'trade_003_desc': 'يشمل 1000 ترجمة (صوت/نص).', + 'trans_001_desc': 'يشمل 100 ترجمة (صوت/نص).', + 'trans_002_desc': 'يشمل 500 ترجمة (صوت/نص).', + 'trans_003_desc': 'يشمل 1000 ترجمة (صوت/نص).', }; diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index dc0f1d699..c8beb4b1c 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -929,34 +929,42 @@ const Map deDE = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'transHeaderDesc1': + 'Echtzeit-Simultandolmetschen und Textübersetzung mit Sprachwiedergabe bei niedriger Latenz.', + 'transHeaderDesc2': 'Geeignet für Reisen, Geschäft, Reden und Lehre.', + 'translateZhEn': 'Chinesisch-Englisch-Übersetzung', + 'lowLatencyVoiceBroadcast': 'Sprachübertragung mit niedriger Latenz', + 'multiLangTextTranslation': 'Mehrsprachige Textübersetzung', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Terminologieoptimierung und Kontextwahrung', + 'lexiconTourBusinessLife': 'Lexika für Reise/Geschäft/Alltag', + 'personalVocabularyMemory': 'Persönlicher Wortschatzspeicher', + 'conversationSubtitleLargeText': 'Konversationsuntertitel / Großtext-Modus', + 'colorHighContrast': 'Hoher Farbkontrast', + 'transDisclaimer': + 'Die Übersetzungsleistung hängt von Mikrofon, Netzwerklatenz und Umgebungsgeräuschen ab.', + + 'trans_001_name': 'Übersetzung Basis 100', + 'trans_002_name': 'Übersetzung Basis 500', + 'trans_003_name': 'Übersetzung Basis 1000', + + 'trans_001_desc': 'Enthält 100 Übersetzungen (Stimme/Text).', + 'trans_002_desc': 'Enthält 500 Übersetzungen (Stimme/Text).', + 'trans_003_desc': 'Enthält 1000 Übersetzungen (Stimme/Text).', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'Übersicht der Vorteile', + 'higherQuota': 'Höheres Nutzungskontingent', + 'lowerUnitPrice': 'Niedrigerer Stückpreis', + 'priorityService': 'Priorisierter Service', + 'exclusiveSupportChannel': 'Dedizierter Supportkanal', + 'fastResponse': 'Schnelle Problemreaktion', + 'eventsAndDiscounts': 'Veranstaltungen und Rabatte', + 'memberExclusiveEvents': 'Exklusive Events für Mitglieder', + 'longTermDiscountPlan': 'Langfristiger Rabattplan', + 'generalPrivileges': 'Allgemeine Privilegien', + 'earlyAccessNewFeatures': 'Frühzeitiger Zugriff auf neue Funktionen', + 'crossDeviceSync': 'Geräteübergreifende Synchronisierung', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'Die tatsächlichen Vorteile hängen von den Paketdetails ab und können sich mit Versionen ändern.', }; diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index b241b7ee6..40309df74 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -215,9 +215,9 @@ const Map enUS = { 'meet_001_name': 'Meeting Basic 100', 'meet_002_name': 'Meeting Basic 500', 'meet_003_name': 'Meeting Basic 1000', - 'trade_001_name': 'Translation Basic 100', - 'trade_002_name': 'Translation Basic 500', - 'trade_003_name': 'Translation Basic 1000', + 'trans_001_name': 'Translation Basic 100', + 'trans_002_name': 'Translation Basic 500', + 'trans_003_name': 'Translation Basic 1000', // 商品描述(按ID) 'ai_001_desc': 'Includes 100 uses. Access core AI features.', @@ -226,9 +226,9 @@ const Map enUS = { 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trade_001_desc': 'Includes 100 translations (voice/text).', - 'trade_002_desc': 'Includes 500 translations (voice/text).', - 'trade_003_desc': 'Includes 1000 translations (voice/text).', + 'trans_001_desc': 'Includes 100 translations (voice/text).', + 'trans_002_desc': 'Includes 500 translations (voice/text).', + 'trans_003_desc': 'Includes 1000 translations (voice/text).', // 商品页通用页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -252,9 +252,9 @@ const Map enUS = { 'Use in quiet environments; performance depends on microphone and network.', // 同传/翻译商品页描述 - 'tradeHeaderDesc1': + 'transHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', + 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', @@ -264,7 +264,7 @@ const Map enUS = { 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': + 'transDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', // AI 商品页描述 diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 7bd8c16df..3e7084f5e 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -897,36 +897,36 @@ const Map hiIN = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'transHeaderDesc1': + 'रीयल-टाइम समकालीन व्याख्या और पाठ अनुवाद, कम विलंबता वॉइस प्रसारण के साथ।', + 'transHeaderDesc2': 'यात्रा, व्यवसाय, भाषण और शिक्षण के लिए उपयुक्त।', + 'translateZhEn': 'चीनी-अंग्रेज़ी अनुवाद', + 'lowLatencyVoiceBroadcast': 'कम विलंबता वॉइस प्रसारण', + 'multiLangTextTranslation': 'बहुभाषी पाठ अनुवाद', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'पारिभाषिक शब्दों का अनुकूलन और संदर्भ बनाए रखना', + 'lexiconTourBusinessLife': 'यात्रा/व्यवसाय/जीवन शब्दकोश', + 'personalVocabularyMemory': 'व्यक्तिगत शब्दावली स्मृति', + 'conversationSubtitleLargeText': 'वार्तालाप उपशीर्षक / बड़े-टेक्स्ट मोड', + 'colorHighContrast': 'उच्च रंग-विपरीत', + 'transDisclaimer': + 'अनुवाद की गुणवत्ता माइक्रोफोन, नेटवर्क विलंबता और परिवेशी शोर पर निर्भर करती है।', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'लाभों का अवलोकन', + 'higherQuota': 'उच्च उपयोग कोटा', + 'lowerUnitPrice': 'कम इकाई मूल्य', + 'priorityService': 'प्राथमिकता सेवा', + 'exclusiveSupportChannel': 'समर्पित सहायता चैनल', + 'fastResponse': 'समस्याओं पर तेज़ प्रतिक्रिया', + 'eventsAndDiscounts': 'इवेंट और छूट', + 'memberExclusiveEvents': 'सदस्य-विशेष इवेंट', + 'longTermDiscountPlan': 'दीर्घकालीन छूट योजना', + 'generalPrivileges': 'सामान्य विशेषाधिकार', + 'earlyAccessNewFeatures': 'नई सुविधाओं का प्रारंभिक उपयोग', + 'crossDeviceSync': 'क्रॉस-डिवाइस सिंक', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'वास्तविक लाभ पैकेज विवरण पर निर्भर करते हैं और संस्करणों के साथ बदल सकते हैं।', // Goods names by id 'ai_001_name': 'एआई बेसिक 100', 'ai_002_name': 'एआई बेसिक 500', @@ -934,9 +934,9 @@ const Map hiIN = { 'meet_001_name': 'मीटिंग बेसिक 100', 'meet_002_name': 'मीटिंग बेसिक 500', 'meet_003_name': 'मीटिंग बेसिक 1000', - 'trade_001_name': 'अनुवाद बेसिक 100', - 'trade_002_name': 'अनुवाद बेसिक 500', - 'trade_003_name': 'अनुवाद बेसिक 1000', + 'trans_001_name': 'अनुवाद बेसिक 100', + 'trans_002_name': 'अनुवाद बेसिक 500', + 'trans_003_name': 'अनुवाद बेसिक 1000', // Goods descriptions by id 'ai_001_desc': '100 उपयोग शामिल। मुख्य AI सुविधाओं की पहुँच।', 'ai_002_desc': '500 उपयोग शामिल। मुख्य AI सुविधाओं की पहुँच।', @@ -944,7 +944,7 @@ const Map hiIN = { 'meet_001_desc': '100 बैठक रिकॉर्डिंग/ट्रांसक्रिप्शन शामिल।', 'meet_002_desc': '500 बैठक रिकॉर्डिंग/ट्रांसक्रिप्शन शामिल।', 'meet_003_desc': '1000 बैठक रिकॉर्डिंग/ट्रांसक्रिप्शन शामिल।', - 'trade_001_desc': '100 अनुवाद (वॉयस/टेक्स्ट) शामिल।', - 'trade_002_desc': '500 अनुवाद (वॉयस/टेक्स्ट) शामिल।', - 'trade_003_desc': '1000 अनुवाद (वॉयस/टेक्स्ट) शामिल।', + 'trans_001_desc': '100 अनुवाद (वॉयस/टेक्स्ट) शामिल।', + 'trans_002_desc': '500 अनुवाद (वॉयस/टेक्स्ट) शामिल।', + 'trans_003_desc': '1000 अनुवाद (वॉयस/टेक्स्ट) शामिल।', }; diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index 6ad878537..f28849a72 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -916,34 +916,43 @@ const Map itIT = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'transHeaderDesc1': + 'Interpretazione simultanea e traduzione di testo in tempo reale, con voce a bassa latenza.', + 'transHeaderDesc2': 'Adatto a viaggi, affari, discorsi e insegnamento.', + 'translateZhEn': 'Traduzione Cinese-Inglese', + 'lowLatencyVoiceBroadcast': 'Trasmissione vocale a bassa latenza', + 'multiLangTextTranslation': 'Traduzione di testo multilingue', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Ottimizzazione della terminologia e mantenimento del contesto', + 'lexiconTourBusinessLife': 'Lessici per viaggio/affari/vita quotidiana', + 'personalVocabularyMemory': 'Memoria del vocabolario personale', + 'conversationSubtitleLargeText': + 'Sottotitoli conversazione / modalità testo grande', + 'colorHighContrast': 'Elevato contrasto dei colori', + 'transDisclaimer': + 'Le prestazioni della traduzione dipendono dal microfono, dalla latenza di rete e dal rumore ambientale.', + + 'trans_001_name': 'Traduzione Base 100', + 'trans_002_name': 'Traduzione Base 500', + 'trans_003_name': 'Traduzione Base 1000', + + 'trans_001_desc': 'Include 100 traduzioni (voce/testo).', + 'trans_002_desc': 'Include 500 traduzioni (voce/testo).', + 'trans_003_desc': 'Include 1000 traduzioni (voce/testo).', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'Panoramica dei vantaggi', + 'higherQuota': 'Quota di utilizzo più alta', + 'lowerUnitPrice': 'Prezzo unitario più basso', + 'priorityService': 'Servizio prioritario', + 'exclusiveSupportChannel': 'Canale di supporto dedicato', + 'fastResponse': 'Risposta rapida ai problemi', + 'eventsAndDiscounts': 'Eventi e sconti', + 'memberExclusiveEvents': 'Eventi esclusivi per i membri', + 'longTermDiscountPlan': 'Piano di sconti a lungo termine', + 'generalPrivileges': 'Privilegi generali', + 'earlyAccessNewFeatures': 'Accesso anticipato alle nuove funzionalità', + 'crossDeviceSync': 'Sincronizzazione tra dispositivi', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'I benefici effettivi dipendono dai dettagli del pacchetto e possono cambiare con le versioni.', }; diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 27f5922c8..24b74e0c3 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -833,34 +833,38 @@ const Map koKR = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'transHeaderDesc1': '실시간 동시통역과 텍스트 번역, 저지연 음성 방송.', + 'transHeaderDesc2': '여행, 비즈니스, 연설, 교육에 적합합니다.', + 'translateZhEn': '중-영 번역', + 'lowLatencyVoiceBroadcast': '저지연 음성 방송', + 'multiLangTextTranslation': '다국어 텍스트 번역', + 'termOptimizationContextPreserve': '용어 최적화 및 문맥 유지', + 'lexiconTourBusinessLife': '여행/비즈니스/일상 용어집', + 'personalVocabularyMemory': '개인 어휘 메모리', + 'conversationSubtitleLargeText': '대화 자막 / 큰 글자 모드', + 'colorHighContrast': '높은 색 대비', + 'transDisclaimer': '번역 품질은 마이크, 네트워크 지연 및 주변 소음에 따라 달라집니다.', + + 'trans_001_name': '번역 기본 100', + 'trans_002_name': '번역 기본 500', + 'trans_003_name': '번역 기본 1000', + + 'trans_001_desc': '번역 100회 포함(음성/텍스트).', + 'trans_002_desc': '번역 500회 포함(음성/텍스트).', + 'trans_003_desc': '번역 1000회 포함(음성/텍스트).', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'benefitsOverview': '혜택 개요', + 'higherQuota': '더 높은 사용 한도', + 'lowerUnitPrice': '더 낮은 단가', + 'priorityService': '우선 서비스', + 'exclusiveSupportChannel': '전용 지원 채널', + 'fastResponse': '문제 신속 대응', + 'eventsAndDiscounts': '이벤트 및 할인', + 'memberExclusiveEvents': '회원 전용 이벤트', + 'longTermDiscountPlan': '장기 할인 계획', + 'generalPrivileges': '일반 특권', + 'earlyAccessNewFeatures': '신기능 사전 이용', + 'crossDeviceSync': '디바이스 간 동기화', + 'vipDisclaimer': '실제 혜택은 패키지 세부사항에 따라 달라지며 버전에 따라 변경될 수 있습니다.', }; diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 2c9792ce0..0b8a4d31f 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -190,6 +190,14 @@ const Map ptPT = { "usageStatsInfo": "Visualize as estatísticas de uso da sua aplicação", "scene": "Cenário", + 'trans_001_name': 'Tradução Básica 100', + 'trans_002_name': 'Tradução Básica 500', + 'trans_003_name': 'Tradução Básica 1000', + + 'trans_001_desc': 'Inclui 100 traduções (voz/texto).', + 'trans_002_desc': 'Inclui 500 traduções (voz/texto).', + 'trans_003_desc': 'Inclui 1000 traduções (voz/texto).', + // 商务会议助手页 "startMeeting": "Iniciar Reunião", 'edit': 'Editar', @@ -910,34 +918,35 @@ const Map ptPT = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'transHeaderDesc1': + 'Interpretação simultânea e tradução de texto em tempo real, com voz de baixa latência.', + 'transHeaderDesc2': 'Adequado para viagens, negócios, palestras e ensino.', + 'translateZhEn': 'Tradução Chinês-Inglês', + 'lowLatencyVoiceBroadcast': 'Transmissão de voz de baixa latência', + 'multiLangTextTranslation': 'Tradução de texto multilingue', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Otimização de terminologia e preservação de contexto', + 'lexiconTourBusinessLife': 'Léxicos de viagem/negócios/vida', + 'personalVocabularyMemory': 'Memória de vocabulário pessoal', + 'conversationSubtitleLargeText': + 'Legendagem de conversas / modo de texto grande', + 'colorHighContrast': 'Alto contraste de cor', + 'transDisclaimer': + 'O desempenho da tradução depende do microfone, da latência da rede e do ruído ambiente.', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'Visão geral de benefícios', + 'higherQuota': 'Maior quota de utilização', + 'lowerUnitPrice': 'Preço unitário inferior', + 'priorityService': 'Serviço prioritário', + 'exclusiveSupportChannel': 'Canal de suporte dedicado', + 'fastResponse': 'Resposta rápida a problemas', + 'eventsAndDiscounts': 'Eventos e descontos', + 'memberExclusiveEvents': 'Eventos exclusivos para membros', + 'longTermDiscountPlan': 'Plano de desconto a longo prazo', + 'generalPrivileges': 'Privilégios gerais', + 'earlyAccessNewFeatures': 'Acesso antecipado a novas funcionalidades', + 'crossDeviceSync': 'Sincronização entre dispositivos', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'Os benefícios reais dependem dos detalhes do pacote e podem mudar entre versões.', }; diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 86b6ff85f..a7fc40969 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -188,6 +188,14 @@ const Map ruRU = { "usageStatsInfo": "Просмотрите статистику использования вашего приложения", "scene": "Сценарий", + 'trans_001_name': 'Перевод Базовый 100', + 'trans_002_name': 'Перевод Базовый 500', + 'trans_003_name': 'Перевод Базовый 1000', + + 'trans_001_desc': 'Включает 100 переводов (голос/текст).', + 'trans_002_desc': 'Включает 500 переводов (голос/текст).', + 'trans_003_desc': 'Включает 1000 переводов (голос/текст).', + // 商务会议助手页 "startMeeting": "Начать встречу", 'edit': 'Редактировать', @@ -903,34 +911,36 @@ const Map ruRU = { 'Use in quiet environments; performance depends on microphone and network.', // Translation goods page (placeholders) - 'tradeHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'tradeHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'transHeaderDesc1': + 'Синхронный перевод и перевод текста в реальном времени с низкой задержкой голосового озвучивания.', + 'transHeaderDesc2': + 'Подходит для путешествий, бизнеса, выступлений и обучения.', + 'translateZhEn': 'Китайско-английский перевод', + 'lowLatencyVoiceBroadcast': 'Голосовое вещание с низкой задержкой', + 'multiLangTextTranslation': 'Многоязычный перевод текста', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'tradeDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Оптимизация терминологии и сохранение контекста', + 'lexiconTourBusinessLife': + 'Лексика для путешествий/бизнеса/повседневной жизни', + 'personalVocabularyMemory': 'Память персонального словаря', + 'conversationSubtitleLargeText': 'Субтитры беседы / режим крупных шрифтов', + 'colorHighContrast': 'Высокая контрастность цветов', + 'transDisclaimer': + 'Качество перевода зависит от микрофона, сетевой задержки и фонового шума.', // VIP goods page (placeholders) - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'Обзор преимуществ', + 'higherQuota': 'Более высокая квота использования', + 'lowerUnitPrice': 'Низкая цена за единицу', + 'priorityService': 'Приоритетное обслуживание', + 'exclusiveSupportChannel': 'Выделенный канал поддержки', + 'fastResponse': 'Быстрый отклик на проблемы', + 'eventsAndDiscounts': 'События и скидки', + 'memberExclusiveEvents': 'Эксклюзивные мероприятия для участников', + 'longTermDiscountPlan': 'Долгосрочный план скидок', + 'generalPrivileges': 'Общие привилегии', + 'earlyAccessNewFeatures': 'Ранний доступ к новым функциям', + 'crossDeviceSync': 'Синхронизация между устройствами', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'Фактические преимущества зависят от деталей пакета и могут меняться с версиями.', }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index a0204ca8f..e41b28528 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -209,9 +209,9 @@ const Map zhCN = { 'meet_001_name': '会议基础 100 次', 'meet_002_name': '会议基础 500 次', 'meet_003_name': '会议基础 1000 次', - 'trade_001_name': '翻译基础 100 次', - 'trade_002_name': '翻译基础 500 次', - 'trade_003_name': '翻译基础 1000 次', + 'trans_001_name': '翻译基础 100 次', + 'trans_002_name': '翻译基础 500 次', + 'trans_003_name': '翻译基础 1000 次', // 商品描述(按ID) 'ai_001_desc': '含 100 次使用,覆盖核心 AI 功能', @@ -220,9 +220,9 @@ const Map zhCN = { 'meet_001_desc': '含 100 次会议录音/转写', 'meet_002_desc': '含 500 次会议录音/转写', 'meet_003_desc': '含 1000 次会议录音/转写', - 'trade_001_desc': '含 100 次翻译(语音/文本)', - 'trade_002_desc': '含 500 次翻译(语音/文本)', - 'trade_003_desc': '含 1000 次翻译(语音/文本)', + 'trans_001_desc': '含 100 次翻译(语音/文本)', + 'trans_002_desc': '含 500 次翻译(语音/文本)', + 'trans_003_desc': '含 1000 次翻译(语音/文本)', // 商品页通用页脚 'appNameProvider': '应用名称:VoiTrans · 服务提供:VoiTrans', @@ -243,8 +243,8 @@ const Map zhCN = { 'meetingDisclaimer': '建议在安静环境使用,效果受麦克风与网络影响,具体以实际表现为准。', // 同传/翻译商品页描述 - 'tradeHeaderDesc1': '多语种实时同传与文本翻译,低延时语音播报。', - 'tradeHeaderDesc2': '适用于出行、商务、演讲与教学等场景。', + 'transHeaderDesc1': '多语种实时同传与文本翻译,低延时语音播报。', + 'transHeaderDesc2': '适用于出行、商务、演讲与教学等场景。', 'translateZhEn': '中英互译', 'lowLatencyVoiceBroadcast': '低延时语音播报', 'multiLangTextTranslation': '多语种文本翻译', @@ -253,7 +253,7 @@ const Map zhCN = { 'personalVocabularyMemory': '专属词汇记忆', 'conversationSubtitleLargeText': '对话字幕/大字模式', 'colorHighContrast': '颜色高对比度', - 'tradeDisclaimer': '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', + 'transDisclaimer': '翻译效果受麦克风、网络时延与环境噪声影响,具体以实际表现为准。', // AI 商品页描述 'aiHeaderDesc1': '更长对话额度、更多工具调用、更强上下文长度支持。', diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index c1664eba1..5bde904e6 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -185,9 +185,9 @@ const Map zhHK = { 'meet_001_name': '會議基礎 100 次', 'meet_002_name': '會議基礎 500 次', 'meet_003_name': '會議基礎 1000 次', - 'trade_001_name': '翻譯基礎 100 次', - 'trade_002_name': '翻譯基礎 500 次', - 'trade_003_name': '翻譯基礎 1000 次', + 'trans_001_name': '翻譯基礎 100 次', + 'trans_002_name': '翻譯基礎 500 次', + 'trans_003_name': '翻譯基礎 1000 次', // 商品描述(按ID) 'ai_001_desc': '含 100 次使用,涵蓋核心 AI 功能', @@ -196,9 +196,9 @@ const Map zhHK = { 'meet_001_desc': '含 100 次會議錄音/轉寫', 'meet_002_desc': '含 500 次會議錄音/轉寫', 'meet_003_desc': '含 1000 次會議錄音/轉寫', - 'trade_001_desc': '含 100 次翻譯(語音/文本)', - 'trade_002_desc': '含 500 次翻譯(語音/文本)', - 'trade_003_desc': '含 1000 次翻譯(語音/文本)', + 'trans_001_desc': '含 100 次翻譯(語音/文本)', + 'trans_002_desc': '含 500 次翻譯(語音/文本)', + 'trans_003_desc': '含 1000 次翻譯(語音/文本)', // 商務會議助手頁 "startMeeting": "開始會議", @@ -854,8 +854,8 @@ const Map zhHK = { 'meetingDisclaimer': '建議在安靜環境使用,效果受麥克風與網絡影響,具體以實際表現為準。', // Translation goods page (placeholders) - 'tradeHeaderDesc1': '多語種實時同傳與文本翻譯,低延時語音播報。', - 'tradeHeaderDesc2': '適用於出行、商務、演講與教學等場景。', + 'transHeaderDesc1': '多語種實時同傳與文本翻譯,低延時語音播報。', + 'transHeaderDesc2': '適用於出行、商務、演講與教學等場景。', 'translateZhEn': '中英互譯', 'lowLatencyVoiceBroadcast': '低延時語音播報', 'multiLangTextTranslation': '多語種文本翻譯', @@ -864,7 +864,7 @@ const Map zhHK = { 'personalVocabularyMemory': '專屬詞彙記憶', 'conversationSubtitleLargeText': '對話字幕/大字模式', 'colorHighContrast': '顏色高對比度', - 'tradeDisclaimer': '翻譯效果受麥克風、網絡時延與環境噪聲影響,具體以實際表現為準。', + 'transDisclaimer': '翻譯效果受麥克風、網絡時延與環境噪聲影響,具體以實際表現為準。', // AI 商品頁描述(佔位) 'aiHeaderDesc1': '更長對話額度、更多工具調用、更強上下文長度支持。', diff --git a/lib/modules/common/widgets/recharge_dialog.dart b/lib/modules/common/widgets/recharge_dialog.dart index be622f53d..1dd6562b4 100644 --- a/lib/modules/common/widgets/recharge_dialog.dart +++ b/lib/modules/common/widgets/recharge_dialog.dart @@ -40,7 +40,7 @@ void showRechargeDialog(String type) { if (type == 'agent') { Get.toNamed(Routes.goodsvip); } else if (type == 'translation') { - Get.toNamed(Routes.goodstrade); + Get.toNamed(Routes.goodstrans); } else if (type == 'meeting') { Get.toNamed(Routes.goodsmeet); } diff --git a/lib/modules/goods/bindings/goodstrade_binding.dart b/lib/modules/goods/bindings/goodstrade_binding.dart deleted file mode 100644 index 70f119608..000000000 --- a/lib/modules/goods/bindings/goodstrade_binding.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:get/get.dart'; -import '../controllers/goodstrade_controller.dart'; - -class GoodstradeBinding extends Bindings { - @override - void dependencies() { - Get.lazyPut(() => GoodstradeController()); - } -} \ No newline at end of file diff --git a/lib/modules/goods/bindings/goodstrans_binding.dart b/lib/modules/goods/bindings/goodstrans_binding.dart new file mode 100644 index 000000000..696eaeb7e --- /dev/null +++ b/lib/modules/goods/bindings/goodstrans_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import '../controllers/goodstrans_controller.dart'; + +class GoodstransBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => GoodstransController()); + } +} diff --git a/lib/modules/goods/controllers/goodstrade_controller.dart b/lib/modules/goods/controllers/goodstrans_controller.dart similarity index 88% rename from lib/modules/goods/controllers/goodstrade_controller.dart rename to lib/modules/goods/controllers/goodstrans_controller.dart index d0a218c5b..fabab8ae5 100644 --- a/lib/modules/goods/controllers/goodstrade_controller.dart +++ b/lib/modules/goods/controllers/goodstrans_controller.dart @@ -4,7 +4,7 @@ import '../../../data/models/goods.dart'; import '../../../data/services/network/api.dart'; import 'goods_base_controller.dart'; -class GoodstradeController extends GoodsBaseController { +class GoodstransController extends GoodsBaseController { @override Future> fetchProducts() async { final resp = await Api.getGoods({'usagetype': UsageType.Translation.toInt}); @@ -25,6 +25,4 @@ class GoodstradeController extends GoodsBaseController { } return []; } - - // Future purchase(DBGoods item) async => super.purchase(item); } diff --git a/lib/modules/goods/utils/goods_i18n.dart b/lib/modules/goods/utils/goods_i18n.dart index bb7274c55..7900ce242 100644 --- a/lib/modules/goods/utils/goods_i18n.dart +++ b/lib/modules/goods/utils/goods_i18n.dart @@ -29,11 +29,11 @@ String localizedGoodsName(DBGoods item) { case 'meet_003': return 'meet_003_name'.tr; case 'trade_001': - return 'trade_001_name'.tr; + return 'trans_001_name'.tr; case 'trade_002': - return 'trade_002_name'.tr; + return 'trans_002_name'.tr; case 'trade_003': - return 'trade_003_name'.tr; + return 'trans_003_name'.tr; default: final name = item.name.trim(); return name.isNotEmpty ? name : 'unknown'.tr; @@ -57,11 +57,11 @@ String localizedGoodsDesc(DBGoods item) { case 'meet_003': return 'meet_003_desc'.tr; case 'trade_001': - return 'trade_001_desc'.tr; + return 'trans_001_desc'.tr; case 'trade_002': - return 'trade_002_desc'.tr; + return 'trans_002_desc'.tr; case 'trade_003': - return 'trade_003_desc'.tr; + return 'trans_003_desc'.tr; default: return ''; } diff --git a/lib/modules/goods/views/goodstrade_view.dart b/lib/modules/goods/views/goodstrans_view.dart similarity index 97% rename from lib/modules/goods/views/goodstrade_view.dart rename to lib/modules/goods/views/goodstrans_view.dart index b361b9243..bbc41ee1c 100644 --- a/lib/modules/goods/views/goodstrade_view.dart +++ b/lib/modules/goods/views/goodstrans_view.dart @@ -3,11 +3,11 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; -import '../controllers/goodstrade_controller.dart'; +import '../controllers/goodstrans_controller.dart'; import '../utils/goods_i18n.dart'; -class GoodstradeView extends GetView { - const GoodstradeView({super.key}); +class GoodstransView extends GetView { + const GoodstransView({super.key}); @override Widget build(BuildContext context) { @@ -29,7 +29,6 @@ class GoodstradeView extends GetView { centerTitle: true, ), body: Obx(() { - // 访问刷新信号以建立依赖关系:用户信息变化时触发重建 final _ = User.refreshTick.value; if (controller.loading.value) { return const Center(child: CircularProgressIndicator()); @@ -109,7 +108,7 @@ class GoodstradeView extends GetView { ), SizedBox(height: 6.h), Text( - 'tradeHeaderDesc1'.tr, + 'transHeaderDesc1'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -117,7 +116,7 @@ class GoodstradeView extends GetView { ), SizedBox(height: 4.h), Text( - 'tradeHeaderDesc2'.tr, + 'transHeaderDesc2'.tr, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -351,7 +350,7 @@ class GoodstradeView extends GetView { ), SizedBox(height: 12.h), Text( - 'tradeDisclaimer'.tr, + 'transDisclaimer'.tr, style: TextStyle(fontSize: 12.sp, color: subColor), ), ], diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index 3efa834d5..c35ad014e 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -892,7 +892,7 @@ class GoodsvipView extends GetView { isDarkMode, icon: Icons.translate, title: 'simultaneousTranslation'.tr, - lines: ['tradeHeaderDesc1'.tr, 'tradeHeaderDesc2'.tr], + lines: ['transHeaderDesc1'.tr, 'transHeaderDesc2'.tr], colorSeed: Colors.indigo, ), ], diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index 36db557fd..d9181ac8f 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -277,7 +277,7 @@ class SettingsView extends GetView { iconColor: isDarkMode ? Colors.indigo[300]! : Colors.indigo[600]!, textColor: isDarkMode ? Colors.white : Colors.black87, - onTap: () => Get.toNamed(Routes.goodstrade), + onTap: () => Get.toNamed(Routes.goodstrans), ), _buildCategoryItem( icon: Icons.people, diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 81f7dd385..569511599 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -74,8 +74,8 @@ import '../modules/picture_translation/views/picture_translation_view.dart'; import '../modules/picture_translation/bindings/picture_translation_binding.dart'; import '../modules/goods/bindings/goodsvip_binding.dart'; import '../modules/goods/views/goodsvip_view.dart'; -import '../modules/goods/bindings/goodstrade_binding.dart'; -import '../modules/goods/views/goodstrade_view.dart'; +import '../modules/goods/bindings/goodstrans_binding.dart'; +import '../modules/goods/views/goodstrans_view.dart'; import '../modules/goods/bindings/goodsmeet_binding.dart'; import '../modules/goods/views/goodsmeet_view.dart'; import '../modules/goods/bindings/goodsai_binding.dart'; @@ -348,9 +348,9 @@ abstract class AppPages { transitionDuration: Duration(milliseconds: 250), ), GetPage( - name: Routes.goodstrade, - page: () => const GoodstradeView(), - binding: GoodstradeBinding(), + name: Routes.goodstrans, + page: () => const GoodstransView(), + binding: GoodstransBinding(), transition: Transition.rightToLeft, transitionDuration: Duration(milliseconds: 250), ), diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 22253b289..dca714c61 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -74,7 +74,7 @@ abstract class Routes { //商品购买页面 static const goodsvip = '/goodsvip'; //vip商品页面 - static const goodstrade = '/goodstrade'; //翻译商品页面 + static const goodstrans = '/goodstrans'; //翻译商品页面 static const goodsmeet = '/goodsmeet'; //会议商品页面 static const goodsai = '/goodsai'; //ai商品页面 } From d9c5433ffa332049bf62e27d7a03dbd169334965 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 8 Dec 2025 17:52:24 +0800 Subject: [PATCH 136/177] =?UTF-8?q?fix(translations):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?AI=E5=85=85=E5=80=BC=E7=9B=B8=E5=85=B3=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E9=94=AE=E5=90=8D=E5=B9=B6=E4=BF=AE=E5=A4=8D=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将premiumMember统一改为aiRecharge以保持一致性 修复商品页面标题显示错误问题 调整返回按钮样式和颜色 --- lib/core/translations/language/ar_sa.dart | 2 +- lib/core/translations/language/bg_bg.dart | 2 +- lib/core/translations/language/cs_cz.dart | 2 +- lib/core/translations/language/da_dk.dart | 2 +- lib/core/translations/language/de_de.dart | 2 +- lib/core/translations/language/el_gr.dart | 2 +- lib/core/translations/language/en_us.dart | 2 +- lib/core/translations/language/es_es.dart | 2 +- lib/core/translations/language/et_ee.dart | 2 +- lib/core/translations/language/fa_ir.dart | 2 +- lib/core/translations/language/fi_fi.dart | 2 +- lib/core/translations/language/fr_fr.dart | 2 +- lib/core/translations/language/hi_in.dart | 2 +- lib/core/translations/language/hr_hr.dart | 2 +- lib/core/translations/language/hu_hu.dart | 2 +- lib/core/translations/language/id_id.dart | 2 +- lib/core/translations/language/is_is.dart | 2 +- lib/core/translations/language/it_it.dart | 2 +- lib/core/translations/language/ja_jp.dart | 2 +- lib/core/translations/language/ko_kr.dart | 2 +- lib/core/translations/language/lt_lt.dart | 2 +- lib/core/translations/language/lv_lv.dart | 2 +- lib/core/translations/language/ms_my.dart | 2 +- lib/core/translations/language/nb_no.dart | 2 +- lib/core/translations/language/nl_nl.dart | 2 +- lib/core/translations/language/pl_pl.dart | 2 +- lib/core/translations/language/pt_pt.dart | 2 +- lib/core/translations/language/ro_ro.dart | 2 +- lib/core/translations/language/ru_ru.dart | 2 +- lib/core/translations/language/sk_sk.dart | 2 +- lib/core/translations/language/sl_si.dart | 2 +- lib/core/translations/language/sr_rs.dart | 2 +- lib/core/translations/language/sv_se.dart | 2 +- lib/core/translations/language/th_th.dart | 2 +- lib/core/translations/language/tl_ph.dart | 2 +- lib/core/translations/language/tr_tr.dart | 2 +- lib/core/translations/language/uk_ua.dart | 2 +- lib/core/translations/language/vi_vn.dart | 2 +- lib/core/translations/language/zh_cn.dart | 4 ++-- lib/core/translations/language/zh_hk.dart | 4 ++-- lib/modules/goods/views/goodsmeet_view.dart | 10 +++++++++- lib/modules/goods/views/goodstrans_view.dart | 14 +++++++++++--- lib/modules/goods/views/goodsvip_view.dart | 12 ++++++++---- lib/modules/settings/views/settings_view.dart | 2 +- 44 files changed, 71 insertions(+), 51 deletions(-) diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index 7b4f91430..db74d7492 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -419,7 +419,7 @@ const Map arSA = { // 设置页 "systemSettings": "إعدادات النظام", //系统设置 "vipRecharge": "إعادة صيغ العضوية", //会员充值 - "premiumMember": "عضو مميز", //AI充值 + "aiRecharge": "عضو مميز", //AI充值 "translationRecharge": "إعادة صيغ الترجمة", //翻译充值 "meetingAssistantRecharge": "إعادة صيغ الاجتماع", //会议助手充值 "cloudSync": "إعادة صيغ مزامنة السحابة", //云端同步 diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index 2dbbb3034..7a3d5d277 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -203,7 +203,7 @@ const Map bgBG = { // 设置页 "systemSettings": "Системни настройки", //系统设置 "vipRecharge": "Преплащане за VIP член", //会员充值 - "premiumMember": "Премиум член", //AI充值 + "aiRecharge": "Премиум член", //AI充值 "translationRecharge": "Преплащане за превод", //翻译充值 "meetingAssistantRecharge": "Преплащане за Сообщението", //会议助手充值 "cloudSync": "Преплащане за синхронизация в облака", //云端同步 diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index 67c41a489..252c757e4 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -202,7 +202,7 @@ const Map csCZ = { // 设置页 "systemSettings": "Systémová nastavení", //系统设置 "vipRecharge": "Přepayka VIP členství", //会员充值 - "premiumMember": "Prémiový člen", //AI充值 + "aiRecharge": "Prémiový člen", //AI充值 "translationRecharge": "Přepayka překladu", //翻译充值 "meetingAssistantRecharge": "Přepayka asistenta schůzky", //会议助手充值 "cloudSync": "Přepayka synchronizace v cloudu", //云端同步 diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index 17caef9c9..bdd1c77b6 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -202,7 +202,7 @@ const Map daDK = { // 设置页 "systemSettings": "Systemindstillinger", //系统设置 "vipRecharge": "Opladning af VIP medlem", //会员充值 - "premiumMember": "Premium medlem", //AI充值 + "aiRecharge": "Premium medlem", //AI充值 "translationRecharge": "Opladning af oversetning", //翻译充值 "meetingAssistantRecharge": "Opladning af mødeassistent", //会议助手充值 "cloudSync": "Opladning af cloud-synkronisering", //云端同步 diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index c8beb4b1c..b07a82736 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -207,7 +207,7 @@ const Map deDE = { // 设置页 "systemSettings": "Systemeinstellungen", //系统设置 "vipRecharge": "VIP-Mitgliedschaft-Recharge", //会员充值 - "premiumMember": "Premium-Mitgliedschaft", //AI充值 + "aiRecharge": "Premium-Mitgliedschaft", //AI充值 "translationRecharge": "Übersetzungs-Recharge", //翻译充值 "meetingAssistantRecharge": "Meeting-Assistent-Recharge", //会议助手充值 "cloudSync": "Cloud-Synchronisierung-Recharge", //云端同步 diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index d039d57f9..a39a65cd4 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -204,7 +204,7 @@ const Map elGR = { // 设置页 "systemSettings": "Ρυθμίσεις συστήματος", //系统设置 "vipRecharge": "Περιορέωση VIP μέλους", //会员充值 - "premiumMember": "Premium μέλος", //AI充值 + "aiRecharge": "Premium μέλος", //AI充值 "translationRecharge": "Περιορέωση μετάφρασης", //翻译充值 "meetingAssistantRecharge": "Περιορέωση βοηθού συνάντησης", //会议助手充值 "cloudSync": "Περιορέωση συγχρονισμού στο cloud", //云端同步 diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 40309df74..320bc97ed 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -587,7 +587,7 @@ const Map enUS = { // 设置页 "systemSettings": "System Settings", //系统设置 "vipRecharge": "VIP Recharge", //会员充值 - "premiumMember": "AI Recharge", //AI充值 + "aiRecharge": "AI Recharge", //AI充值 "translationRecharge": "Translation Recharge", //翻译充值 "meetingAssistantRecharge": "Meeting Recharge", //会议充值 "cloudSync": "Cloud Sync Recharge", //云端同步 diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 0c05d6429..76bbcc07a 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -205,7 +205,7 @@ const Map esES = { // 设置页 "systemSettings": "Configuración del sistema", //系统设置 "vipRecharge": "Recarga de VIP", //会员充值 - "premiumMember": "Miembro premium", //AI充值 + "aiRecharge": "Miembro premium", //AI充值 "translationRecharge": "Recarga de traducción", //翻译充值 "meetingAssistantRecharge": "Recarga de asistente de reunión", //会议助手充值 "cloudSync": "Recarga de sincronización en la nube", //云端同步 diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index a3189593c..ca977d0f2 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -200,7 +200,7 @@ const Map etEE = { // 设置页 "systemSettings": "Süsteemi seaded", //系统设置 "vipRecharge": "VIP liige varundus", //会员充值 - "premiumMember": "Premium liige", //AI充值 + "aiRecharge": "Premium liige", //AI充值 "translationRecharge": "Tõlke varundus", //翻译充值 "meetingAssistantRecharge": "Koosoleku assistendi varundus", //会议助手充值 "cloudSync": "Pääsyvaraus cloud-synkronointiin", //云端同步 diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index aeab553e0..aa577fcbc 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -419,7 +419,7 @@ const Map faIR = { // 设置页 "systemSettings": "تنظیمات سیستم", //系统设置 "vipRecharge": "شارژ عضویت ویژه", //会员充值 - "premiumMember": "عضویت ویژه", //AI充值 + "aiRecharge": "عضویت ویژه", //AI充值 "translationRecharge": "شارژ ترجمه", //翻译充值 "meetingAssistantRecharge": "شارژ کمک‌کننده جلسه", //会议助手充值 "cloudSync": "شارژ همگام‌سازی ابری", //云端同步 diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index 84f02f47b..b1d4c535a 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -202,7 +202,7 @@ const Map fiFI = { // 设置页 "systemSettings": "Järjestelmäasetukset", //系统设置 "vipRecharge": "Premium-jäsenvaraus", //会员充值 - "premiumMember": "Premium-jäsen", //AI充值 + "aiRecharge": "Premium-jäsen", //AI充值 "translationRecharge": "Käännösvaraus", //翻译充值 "meetingAssistantRecharge": "Kokousavustajan varaus", //会议助手充值 "cloudSync": "Pääsyvaraus cloud-synkronointiin", //云端同步 diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index f2f0bd78a..079135fa0 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -207,7 +207,7 @@ const Map frFR = { // 设置页 "systemSettings": "Paramètres système", //系统设置 "vipRecharge": "Recharge de VIP", //会员充值 - "premiumMember": "Membre premium", //AI充值 + "aiRecharge": "Membre premium", //AI充值 "translationRecharge": "Recharge de traduction", //翻译充值 "meetingAssistantRecharge": "Recharge de l'assistant de réunion", //会议助手充值 "cloudSync": "Recharge de synchronisation cloud", //云端同步 diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 3e7084f5e..2b7578a1b 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -200,7 +200,7 @@ const Map hiIN = { // 设置页 "systemSettings": "सिस्टम सेटिंग्स", //系统设置 "vipRecharge": "प्रीमियम सदस्य रिचार्ज", //会员充值 - "premiumMember": "प्रीमियम सदस्य", //AI充值 + "aiRecharge": "प्रीमियम सदस्य", //AI充值 "translationRecharge": "अनुवाद रिचार्ज", //翻译充值 "meetingAssistantRecharge": "बैठक असिस्टेंट रिचार्ज", //会议助手充值 "cloudSync": "क्लाउड सिंक्रोनाइज़ेशन रिचार्ज", //云端同步 diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index 1fd2dde95..a98916deb 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -204,7 +204,7 @@ const Map hrHR = { // 设置页 "systemSettings": "Postavke sustava", //系统设置 "vipRecharge": "Ponuda premium članstva", //会员充值 - "premiumMember": "Premium član", //AI充值 + "aiRecharge": "Premium član", //AI充值 "translationRecharge": "Prijevod ponuda", //翻译充值 "meetingAssistantRecharge": "Asistent sastanka ponuda", //会议助手充值 "cloudSync": "Synchronizacija u oblaku ponuda", //云端同步 diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index 3e0de253f..375f8a3f2 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -205,7 +205,7 @@ const Map huHU = { // 设置页 "systemSettings": "Rendszerbeállítások", //系统设置 "vipRecharge": "Prémium tag ponuda", //会员充值 - "premiumMember": "Prémium tag", //AI充值 + "aiRecharge": "Prémium tag", //AI充值 "translationRecharge": "Fordítás ponuda", //翻译充值 "meetingAssistantRecharge": "Megbeszélés asszisztens ponuda", //会议助手充值 "cloudSync": "Synchronizációs ponuda", //云端同步 diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 4d4cd7c1c..5fc4c3983 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -200,7 +200,7 @@ const Map idID = { // 设置页 "systemSettings": "Pengaturan Sistem", //系统设置 "vipRecharge": "Pembayaran Premium", //会员充值 - "premiumMember": "Anggota Premium", //AI充值 + "aiRecharge": "Anggota Premium", //AI充值 "translationRecharge": "Pembayaran Terjemahan", //翻译充值 "meetingAssistantRecharge": "Pembayaran Asisten Rapat", //会议助手充值 "cloudSync": "Pembayaran Sinkronisasi awan", //云端同步 diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index 3e4df74ed..2e8e5a424 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -201,7 +201,7 @@ const Map isIS = { // 设置页 "systemSettings": "Kerfisstillingar", //系统设置 "vipRecharge": "Premium meðlimurinnsla", //会员充值 - "premiumMember": "Premium meðlimur", //AI充值 + "aiRecharge": "Premium meðlimur", //AI充值 "translationRecharge": "Þýðingsponsoring", //翻译充值 "meetingAssistantRecharge": "Fundarasistentsponsoring", //会议助手充值 "cloudSync": "Synchronisering með skýjaraddþjónustu", //云端同步 diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index f28849a72..743d63ff3 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -206,7 +206,7 @@ const Map itIT = { // 设置页 "systemSettings": "Impostazioni di sistema", //系统设置 "vipRecharge": "Ricarica membro Premium", //会员充值 - "premiumMember": "Membro Premium", //AI充值 + "aiRecharge": "Membro Premium", //AI充值 "translationRecharge": "Recharge traduzione", //翻译充值 "meetingAssistantRecharge": "Recharge assistente riunione", //会议助手充值 "cloudSync": "Recharge sincronizzazione cloud", //云端同步 diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index 184235148..4e9bffa4f 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -196,7 +196,7 @@ const Map jaJP = { // 设置页 "systemSettings": "システム設定", //系统设置 "vipRecharge": "プレミアムメンバー料金", //会员充值 - "premiumMember": "プレミアムメンバー", //AI充值 + "aiRecharge": "プレミアムメンバー", //AI充值 "translationRecharge": "翻訳料金", //翻译充值 "meetingAssistantRecharge": "会議アシスタント料金", //会议助手充值 "cloudSync": "クラウド同期料金", //云端同步 diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 24b74e0c3..948a00c07 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -194,7 +194,7 @@ const Map koKR = { // 设置页 "systemSettings": "시스템 설정", //系统设置 "vipRecharge": "프리미엄 회원료", //会员充值 - "premiumMember": "프리미엄 회원", //AI充值 + "aiRecharge": "프리미엄 회원", //AI充值 "translationRecharge": "번역료", //翻译充值 "meetingAssistantRecharge": "회의 어시스턴트료", //会议助手充值 "cloudSync": "클라우드 동기화료", //云端同步 diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 517781efc..9bcdaca54 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -204,7 +204,7 @@ const Map ltLT = { // 设置页 "systemSettings": "Sistemos nustatymai", //系统设置 "vipRecharge": "Premium naryso užsipirkimas", //会员充值 - "premiumMember": "Premium narys", //AI充值 + "aiRecharge": "Premium narys", //AI充值 "translationRecharge": "Vertimo užsipirkimas", //翻译充值 "meetingAssistantRecharge": "Susitikimų asistento užsipirkimas", //会议助手充值 "cloudSync": "Synchronizacijos užsipirkimas", //云端同步 diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 534fabb8e..97f316618 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -203,7 +203,7 @@ const Map lvLV = { // 设置页 "systemSettings": "Sistēmas iestatījumi", //系统设置 "vipRecharge": "Premium biedra pārrakstīšana", //会员充值 - "premiumMember": "Premium biedrs", //AI充值 + "aiRecharge": "Premium biedrs", //AI充值 "translationRecharge": "Tulkošanas pārrakstīšana", //翻译充值 "meetingAssistantRecharge": "Sapulces palīgs pārrakstīšana", //会议助手充值 "cloudSync": "Tīkla sincronizācijas pārrakstīšana", //云端同步 diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index dd4b08331..e1b998b45 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -202,7 +202,7 @@ const Map msMY = { // 设置页 "systemSettings": "Tetapan Sistem", //系统设置 "vipRecharge": "Pembayaran Ahli Premium", //会员充值 - "premiumMember": "Ahli Premium", //AI充值 + "aiRecharge": "Ahli Premium", //AI充值 "translationRecharge": "Pembayaran Penterjemahan", //翻译充值 "meetingAssistantRecharge": "Pembayaran Pembantu Mesyuarat", //会议助手充值 "cloudSync": "Pembayaran Sinkronisasi awan", //云端同步 diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index 0c4f7a8cd..cc35187fb 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -202,7 +202,7 @@ const Map nbNO = { // 设置页 "systemSettings": "Systeminnstillinger", //系统设置 "vipRecharge": "Premium-medlemsinnskudd", //会员充值 - "premiumMember": "Premium-medlem", //AI充值 + "aiRecharge": "Premium-medlem", //AI充值 "translationRecharge": "Oversettelsespenger", //翻译充值 "meetingAssistantRecharge": "Møteassistentpenger", //会议助手充值 "cloudSync": "Cloud-synchroniseringspenger", //云端同步 diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index cb66130fb..d03e9f0ca 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -203,7 +203,7 @@ const Map nlNL = { // 设置页 "systemSettings": "Systeeminstellingen", //系统设置 "vipRecharge": "Premium lidspayering", //会员充值 - "premiumMember": "Premium lid", //AI充值 + "aiRecharge": "Premium lid", //AI充值 "translationRecharge": "Vertalingspayering", //翻译充值 "meetingAssistantRecharge": "Vergaderassistentpayering", //会议助手充值 "cloudSync": "Cloud-synchronisatiepayering", //云端同步 diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index 0adc00c42..c00f8046d 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -204,7 +204,7 @@ const Map plPL = { // 设置页 "systemSettings": "Ustawienia systemowe", //系统设置 "vipRecharge": "Płatność Premium", //会员充值 - "premiumMember": "Członek Premium", //AI充值 + "aiRecharge": "Członek Premium", //AI充值 "translationRecharge": "Płatność tłumaczenia", //翻译充值 "meetingAssistantRecharge": "Płatność asystenta spotkań", //会议助手充值 "cloudSync": "Płatność synchronizacji w chmurze", //云端同步 diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index 0b8a4d31f..f3113f40f 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -214,7 +214,7 @@ const Map ptPT = { // 设置页 "systemSettings": "Definições do Sistema", //系统设置 "vipRecharge": "Recarga Premium", //会员充值 - "premiumMember": "Membro Premium", //AI充值 + "aiRecharge": "Membro Premium", //AI充值 "translationRecharge": "Recarga de Tradução", //翻译充值 "meetingAssistantRecharge": "Recarga do Assistente de Reunião", //会议助手充值 "cloudSync": "Recarga de Sincronização em Nuvem", //云端同步 diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index 0b18b9f60..fe9b4158a 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -205,7 +205,7 @@ const Map roRO = { // 设置页 "systemSettings": "Setări de sistem", //系统设置 "vipRecharge": "Recarga Premium", //会员充值 - "premiumMember": "Membru Premium", //AI充值 + "aiRecharge": "Membru Premium", //AI充值 "translationRecharge": "Recarga de traducere", //翻译充值 "meetingAssistantRecharge": "Recarga de asistent ședință", //会议助手充值 "cloudSync": "Recarga de sincronizare în cloud", //云端同步 diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index a7fc40969..a420b6848 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -212,7 +212,7 @@ const Map ruRU = { // 设置页 "systemSettings": "Системные настройки", //系统设置 "vipRecharge": "Пополнение премиум-члена", //会员充值 - "premiumMember": "Премиум-участник", //AI充值 + "aiRecharge": "Премиум-участник", //AI充值 "translationRecharge": "Пополнение перевода", //翻译充值 "meetingAssistantRecharge": "Пополнение помощника встречи", //会议助手充值 "cloudSync": "Пополнение синхронизации в облаке", //云端同步 diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index 97bfcc2b2..2e33a37ad 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -203,7 +203,7 @@ const Map skSK = { // 设置页 "systemSettings": "Systémové nastavenia", //系统设置 "vipRecharge": "Nákup prémium členstva", //会员充值 - "premiumMember": "Prémium člen", //AI充值 + "aiRecharge": "Prémium člen", //AI充值 "translationRecharge": "Nákup prekladov", //翻译充值 "meetingAssistantRecharge": "Nákup asistentu stretnutia", //会议助手充值 "cloudSync": "Nákup synchronizácie v cloude", //云端同步 diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index 8060c79d8..4bd16b7b9 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -203,7 +203,7 @@ const Map slSI = { // 设置页 "systemSettings": "Sistemske nastavitve", //系统设置 "vipRecharge": "Nákup premium člana", //会员充值 - "premiumMember": "Premium član", //AI充值 + "aiRecharge": "Premium član", //AI充值 "translationRecharge": "Nákup prevajanja", //翻译充值 "meetingAssistantRecharge": "Nákup asistenta sestanka", //会议助手充值 "cloudSync": "Nákup sinkronizacije v oblaku", //云端同步 diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index 684574993..6dd585a23 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -202,7 +202,7 @@ const Map srRS = { // 设置页 "systemSettings": "Sistemska podešavanja", //系统设置 "vipRecharge": "Nákup premium člana", //会员充值 - "premiumMember": "Premium član", //AI充值 + "aiRecharge": "Premium član", //AI充值 "translationRecharge": "Nákup prevajanja", //翻译充值 "meetingAssistantRecharge": "Nákup asistenta sastanka", //会议助手充值 "cloudSync": "Nákup sinkronizacije u oblaku", //云端同步 diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index 45f242a2a..a44d13fe2 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -202,7 +202,7 @@ const Map svSE = { // 设置页 "systemSettings": "Systeminställningar", //系统设置 "vipRecharge": "Premium-låntagning", //会员充值 - "premiumMember": "Premium-medlem", //AI充值 + "aiRecharge": "Premium-medlem", //AI充值 "translationRecharge": "Översättningslåntagning", //翻译充值 "meetingAssistantRecharge": "Mötesassistentlåntagning", //会议助手充值 "cloudSync": "Molnsynkronisering", //云端同步 diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index a0cbc2e82..3f828f4f6 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -196,7 +196,7 @@ const Map thTH = { // 设置页 "systemSettings": "การตั้งค่าระบบ", //系统设置 "vipRecharge": "การเติมเงินสมาชิกระดับพรีเมียม", //会员充值 - "premiumMember": "สมาชิกระดับพรีเมียม", //AI充值 + "aiRecharge": "สมาชิกระดับพรีเมียม", //AI充值 "translationRecharge": "การเติมเงินการแปล", //翻译充值 "meetingAssistantRecharge": "การเติมเงินผู้ช่วยการประชุม", //会议助手充值 "cloudSync": "การเติมเงินการ đồng bộ hóaคลาวด์", //云端同步 diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index e697b10d5..ee9c6d87d 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -205,7 +205,7 @@ const Map tlPH = { // 设置页 "systemSettings": "Mga Setting ng System", //系统设置 "vipRecharge": "Pagsasalin ng Recharge ng Premium na Miyembro", //会员充值 - "premiumMember": "Premium na Miyembro", //AI充值 + "aiRecharge": "Premium na Miyembro", //AI充值 "translationRecharge": "Pagsasalin ng Recharge", //翻译充值 "meetingAssistantRecharge": "Pagsasalin ng Recharge ng Pulong", //会议助手充值 "cloudSync": "Pagsasalin ng Recharge ng Cloud", //云端同步 diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index 7ffdaa604..c981bdeba 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -200,7 +200,7 @@ const Map trTR = { // 设置页 "systemSettings": "Sistem Ayarları", //系统设置 "vipRecharge": "Premium Üye Recharge", //会员充值 - "premiumMember": "Premium Üye", //AI充值 + "aiRecharge": "Premium Üye", //AI充值 "translationRecharge": "Çeviri Toplantı Recharge", //翻译充值 "meetingAssistantRecharge": "Toplantı Asistanı Recharge", //会议助手充值 "cloudSync": "Bulut Sincronizasyonu", //云端同步 diff --git a/lib/core/translations/language/uk_ua.dart b/lib/core/translations/language/uk_ua.dart index 71a933928..fd1d08b77 100644 --- a/lib/core/translations/language/uk_ua.dart +++ b/lib/core/translations/language/uk_ua.dart @@ -203,7 +203,7 @@ const Map ukUA = { // 设置页 "systemSettings": "Системні налаштування", //系统设置 "vipRecharge": "Підписатися на премиум-членство", //会员充值 - "premiumMember": "Преміум-учасник", //AI充值 + "aiRecharge": "Преміум-учасник", //AI充值 "translationRecharge": "Підписатися на переклад", //翻译充值 "meetingAssistantRecharge": "Підписатися на допомогу з зустрічю", //会议助手充值 "cloudSync": "Увімкнути синхронізацію в хмарі", //云端同步 diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index 2313247d2..bc96afa82 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -199,7 +199,7 @@ const Map viVN = { // 设置页 "systemSettings": "Cài đặt hệ thống", //系统设置 "vipRecharge": "Nạp lại dịch vụ Premium", //会员充值 - "premiumMember": "Thành viên Premium", //AI充值 + "aiRecharge": "Thành viên Premium", //AI充值 "translationRecharge": "Nạp lại dịch vụ dịch", //翻译充值 "meetingAssistantRecharge": "Nạp lại dịch vụ hỗ trợ họp", //会议助手充值 "cloudSync": "Chuyển đổi đồng bộ hóa đám mây", //云端同步 diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index e41b28528..602d29489 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -549,7 +549,7 @@ const Map zhCN = { // 设置页 "systemSettings": "系统设置", "vipRecharge": "会员充值", - "premiumMember": "AI充值", + "aiRecharge": "AI充值", "translationRecharge": "翻译充值", "meetingAssistantRecharge": "会议充值", "cloudSync": "云端同步", @@ -1271,6 +1271,6 @@ const Map zhCN = { "insufficientIntegral": "积分不足", //余额不足弹窗 - "insufficientBalanceDesc": "餘額不足,請前往對應充值界面進行充值", + "insufficientBalanceDesc": "余额不足,请前往对应充值界面进行充值", "recharge": "前往充值", }; diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 5bde904e6..b1a13c479 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -216,7 +216,7 @@ const Map zhHK = { // 設定頁 "systemSettings": "系統設定", //系统设置 "vipRecharge": "高級會員充值", //会员充值 - "premiumMember": "高級會員", //AI充值 + "aiRecharge": "AI充值", //AI充值 "translationRecharge": "翻譯充值", //翻译充值 "meetingAssistantRecharge": "會議充值", //会议充值 "cloudSync": "雲端同步", //云端同步 @@ -899,6 +899,6 @@ const Map zhHK = { 'vipDisclaimer': '具體權益以實際套餐說明為準,可能隨版本迭代調整。', //余额不足弹窗 - "insufficientBalanceDesc": "余额不足,请前往对应充值界面进行充值", + "insufficientBalanceDesc": "餘額不足,請前往對應充值界面進行充值", "recharge": "去充值", }; diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index 31fbd64b5..b33a36071 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -18,8 +18,16 @@ class GoodsmeetView extends GetView { appBar: AppBar( backgroundColor: isDarkMode ? Colors.black : Colors.white, elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + size: 20.sp, + color: isDarkMode ? Colors.white : Colors.black87, + ), + onPressed: () => Get.back(), + ), title: Text( - 'conferenceAssistant'.tr, + 'meetingAssistantRecharge'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/goods/views/goodstrans_view.dart b/lib/modules/goods/views/goodstrans_view.dart index bbc41ee1c..c7d8fee28 100644 --- a/lib/modules/goods/views/goodstrans_view.dart +++ b/lib/modules/goods/views/goodstrans_view.dart @@ -18,8 +18,16 @@ class GoodstransView extends GetView { appBar: AppBar( backgroundColor: isDarkMode ? Colors.black : Colors.white, elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + size: 20.sp, + color: isDarkMode ? Colors.white : Colors.black87, + ), + onPressed: () => Get.back(), + ), title: Text( - 'simultaneousTranslation'.tr, + 'translationRecharge'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, @@ -99,7 +107,7 @@ class GoodstransView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'simultaneousTranslation'.tr, + 'interpretation'.tr, //翻译 style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w700, @@ -276,7 +284,7 @@ class GoodstransView extends GetView { borderRadius: BorderRadius.circular(20.r), ), child: Text( - 'purchase'.tr, + 'purchase'.tr, //购买 style: TextStyle(fontSize: 12.sp, color: Colors.white), ), ), diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index c35ad014e..94f1c5fb5 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -16,19 +16,23 @@ class GoodsvipView extends GetView { return Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: AppBar( - backgroundColor: Colors.blue[600], + backgroundColor: isDarkMode ? Colors.black : Colors.white, foregroundColor: Colors.white, elevation: 0.5, leading: IconButton( - icon: const Icon(Icons.arrow_back_ios_new), + icon: Icon( + Icons.arrow_back_ios, + size: 20.sp, + color: isDarkMode ? Colors.white : Colors.black87, + ), onPressed: () => Get.back(), ), title: Text( - 'purchase'.tr, + 'aiRecharge'.tr, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.w600, - color: Colors.white, + color: isDarkMode ? Colors.white : Colors.black, ), ), centerTitle: true, diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index d9181ac8f..521632bff 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -260,7 +260,7 @@ class SettingsView extends GetView { children: [ _buildCategoryItem( icon: Icons.workspace_premium, - label: 'premiumMember'.tr, //AI充值 + label: 'aiRecharge'.tr, //AI充值 iconBg: isDarkMode ? Colors.amber[900]!.withOpacity(0.3) : Colors.amber[100]!, From c3bfbfe0e51e0b0e3ce8fb5d919beca7e82376fa Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 8 Dec 2025 20:19:29 +0800 Subject: [PATCH 137/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/AzureAsrHelper.kt | 6 ++++++ .../azure_speech/XunFeiAsrHelper.kt | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index ed74769ee..3f6aaed83 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -289,6 +289,12 @@ class AzureAsrHelper(private val context: Context) { this.audioSourceType = audioSourceType if (!audioStream.isContinuousRecognitionActive) { + // 确保音频流已初始化 + if (!audioStream.isInitialized()) { + audioStream.initAudioRecord() + audioStream.setupStream() + } + audioStream.startAudioRecord( when (audioSourceType) { AudioSourceType.MICROPHONE -> SimpleAudioReceiver.AudioSourceType.MICROPHONE diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 18da0e3ae..3c4253dd0 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -25,6 +25,13 @@ class XunFeiAsrHelper(private val context: Context) { private var currentSessionId = "" fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) { + try { + webSocket?.cancel() + webSocket = null + } catch (e: Exception) { + Log.e(tag, "Clear previous websocket failed: ${e.message}") + } + currentSessionId = UUID.randomUUID().toString() val url = getWebSocketUrl() @@ -64,8 +71,15 @@ class XunFeiAsrHelper(private val context: Context) { } fun stop() { - webSocket?.let { ws: WebSocket -> - ws.send("{\"end\": true}") + try { + webSocket?.let { ws: WebSocket -> + ws.send("{\"end\": true}") + ws.close(1000, "User stopped") + } + } catch (e: Exception) { + Log.e(tag, "Stop Xunfei failed: ${e.message}") + } finally { + webSocket = null } } From 2d4e5782cba3bad508714ba45311cd49985936d5 Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Tue, 9 Dec 2025 12:36:21 +0800 Subject: [PATCH 138/177] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dopus=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8D=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ble_service/BleCommandSender.kt | 27 +---------------- .../yunqiinnovation/ble_service/BleService.kt | 29 +++++++------------ 2 files changed, 11 insertions(+), 45 deletions(-) diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt index fba29431d..d91351069 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCommandSender.kt @@ -85,17 +85,6 @@ class BleCommandSender { */ fun notifyWakeupSignalReceived() - /** - * 获取录音文件对象 - * @return 录音文件对象 - */ - fun getRecordFile(): RecordingFile? - - /** - * 获取重新压缩录音文件对象 - * @return 重新压缩录音文件对象 - */ - fun getRecordFile1(): RecordingFile? } private var callback: CommandSenderCallback? = null @@ -382,21 +371,7 @@ class BleCommandSender { else -> "未知状态($codecStatus)" } - // 处理录音文件 - if (codecStatus == BleConst.CODEC_CONTROL_DECODE_ON || - codecStatus == BleConst.CODEC_CONTROL_A2DP_PLAY || - codecStatus == BleConst.CODEC_CONTROL_CALL_RECORD_PLAY || - codecStatus == BleConst.CODEC_CONTROL_ENCODE_ON - ) { - callback?.getRecordFile1()?.closeFile() - callback?.getRecordFile1()?.creatingFiles() - callback?.getRecordFile()?.closeFile() - callback?.getRecordFile()?.creatingFiles() - } else if (codecStatus == BleConst.CODEC_CONTROL_CLOSE) { - callback?.getRecordFile()?.closeFile() - callback?.getRecordFile1()?.closeFile() - } - + Log.d(TAG, "收到设备响应,channelMode: $channelMode") // 声道模式描述 diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt index 1fc62da1b..10378a4f2 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt @@ -212,10 +212,10 @@ object BleService { scanHandler = Handler(Looper.getMainLooper()) recordfile = RecordingFile(this.context) - recordfile!!.fileName = "不拆分" + recordfile!!.fileName = "耳机端" recordfile1 = RecordingFile(this.context) - recordfile1!!.fileName = "重新压缩" + recordfile1!!.fileName = "手机端" // 初始化Opus音频管理器 if (!opusAudioManager.initialize()) { @@ -325,19 +325,7 @@ object BleService { this@BleService.notifyWakeupSignalReceived() } - /** - * 获取录音文件实例 - */ - override fun getRecordFile(): RecordingFile? { - return recordfile - } - - /** - * 获取录音文件实例1 - */ - override fun getRecordFile1(): RecordingFile? { - return recordfile1 - } + }) } @@ -875,14 +863,14 @@ object BleService { // 统计接收到的字节数 bytesReceivedInCurrentSecond += data.size processAudioData(data) - Log.i(TAG, "lxm--收到音频特征数据, 字节数=${data.size}") + // Log.i(TAG, "lxm--收到音频特征数据, 字节数=${data.size}") } BleConst.CALL_RECEIVE_AUDIO_CHAR_UUID -> { // 统计接收到的字节数 bytesReceivedInCurrentSecond += data.size processAudioData(data) - Log.i(TAG, "lxm--收到通话音频特征数据, 字节数=${data.size}") + //Log.i(TAG, "lxm--收到通话音频特征数据, 字节数=${data.size}") } // 通知特征数据(命令和控制) BleConst.NOTIFY_CHAR_UUID -> { @@ -1119,6 +1107,8 @@ object BleService { sampleRate: Int = 16000, packetSize: Int = 40 ): Boolean { + recordfile?.creatingFiles(); + return opusAudioManager.startDecodeStream(hasHeader, channel, sampleRate, packetSize) } @@ -1204,6 +1194,7 @@ object BleService { if (audioChunk != null) { // 发送音频数据块并等待回调 + recordfile1?.saveAudioDataToWav(audioChunk) sendAudioChunkWithCallback(audioChunk) Thread.sleep(AUDIO_SEND_INTERVAL) } @@ -1259,7 +1250,7 @@ object BleService { isWaitingForWriteCallback = true callWriteChar?.value = chunk - recordfile1?.saveAudioDataToWav(chunk) + //recordfile1?.saveAudioDataAsUtf8Hex(chunk, true) val isSuccess = bluetoothGatt?.writeCharacteristic(callWriteChar) @@ -1439,7 +1430,7 @@ object BleService { fun openA2DPDecoder(channelMode: Int = BleConst.AUDIO_CHANNEL_STEREO): Boolean { Log.i(TAG, "打开A2DP解码器...") startOpusEncodeStream() - + recordfile1?.creatingFiles(); startOpusStreamDecoding(false, 2, 16000, 80) val cmdData = byteArrayOf( BleConst.CODEC_CONTROL_A2DP_PLAY.toByte(), From 8ac3c3944405b12ee3901afb0a0f35977148e145 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 9 Dec 2025 15:33:55 +0800 Subject: [PATCH 139/177] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A3=B0=E9=9F=B3?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/agent_service/AgentServiceImpl.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index abefc56bc..8db661378 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -1707,14 +1707,16 @@ class ChatApiStreamCallback: StreamCallback { return } + if (responseBuilder.isEmpty) { //关闭声音 + try agentService.audioPlayer?.stopAwaitSound() + } + responseBuilder += token - if speakResponse && reply && broadcast{ try agentService.azureTtsHelper?.speakStream(sessionid:sessionid,token) // 在开始流式TTS时立即停止气泡音 } if (reply && token != "") { - try agentService.audioPlayer?.stopAwaitSound() try agentService.sendEvent(name: "assistant_token", data: ["sessionid":sessionid,"token": token]) } }catch { From 6cda70547d1b85df557682decaf8c17c175c15aa Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 8 Dec 2025 20:01:06 +0800 Subject: [PATCH 140/177] =?UTF-8?q?refactor(=E5=95=86=E5=93=81=E9=A1=B5):?= =?UTF-8?q?=20=E9=87=8D=E6=9E=84=E5=95=86=E5=93=81=E9=A1=B5=E8=84=9A?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将商品页脚部分抽离为独立组件 GoodsFooterSection 更新多语言翻译中的版权信息和公司名称 修改 totalCount 为 totalQuota 以保持术语一致 添加内购客服QQ信息显示功能 --- lib/core/translations/language/ar_sa.dart | 3 +- lib/core/translations/language/de_de.dart | 3 +- lib/core/translations/language/en_us.dart | 6 +-- lib/core/translations/language/hi_in.dart | 3 +- lib/core/translations/language/it_it.dart | 3 +- lib/core/translations/language/ko_kr.dart | 3 +- lib/core/translations/language/pt_pt.dart | 3 +- lib/core/translations/language/ru_ru.dart | 3 +- lib/core/translations/language/zh_cn.dart | 8 +-- lib/core/translations/language/zh_hk.dart | 9 ++-- lib/modules/goods/views/goodsai_view.dart | 39 ++------------ lib/modules/goods/views/goodsmeet_view.dart | 51 ++++--------------- lib/modules/goods/views/goodstrans_view.dart | 51 ++++--------------- lib/modules/goods/views/goodsvip_view.dart | 41 ++------------- .../views/widgets/goods_footer_section.dart | 48 +++++++++++++++++ 15 files changed, 92 insertions(+), 182 deletions(-) create mode 100644 lib/modules/goods/views/widgets/goods_footer_section.dart diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index db74d7492..5208c374b 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -1188,8 +1188,7 @@ const Map arSA = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index b07a82736..ccc28727f 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -909,8 +909,7 @@ const Map deDE = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 320bc97ed..15c5c1829 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -189,7 +189,7 @@ const Map enUS = { // 商品页面(AI/翻译/会议) 'availablePackages': 'Available Packages', 'remainingQuota': 'Remaining Quota', - 'totalCount': 'Total Count', + 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', // AI 功能卡片 @@ -232,8 +232,8 @@ const Map enUS = { // 商品页通用页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'iapCustomerServiceQQLabel': 'IAP customer service QQ: @qq', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // 会议商品页描述 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index 2b7578a1b..187bc6c3e 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -877,8 +877,7 @@ const Map hiIN = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index 743d63ff3..fece149d3 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -896,8 +896,7 @@ const Map itIT = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index 948a00c07..5067aae43 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -813,8 +813,7 @@ const Map koKR = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index f3113f40f..4404d9d2b 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -898,8 +898,7 @@ const Map ptPT = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index a420b6848..95674fdc5 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -891,8 +891,7 @@ const Map ruRU = { "guideSmsEnd": "Message sent—voice control is convenient", // Goods pages common footer (placeholders) 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'moreInfoViewInSettingsAbout': 'For more info, go to Settings > About', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 602d29489..2b5504527 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -183,7 +183,7 @@ const Map zhCN = { // 商品页面(AI/翻译/会议) 'availablePackages': '可购买套餐', 'remainingQuota': '剩余额度', - 'totalCount': '总次数', + 'totalQuota': '总额度', 'remaining': '剩余', 'featureDescription': '功能说明', // AI 功能卡片 @@ -225,9 +225,9 @@ const Map zhCN = { 'trans_003_desc': '含 1000 次翻译(语音/文本)', // 商品页通用页脚 - 'appNameProvider': '应用名称:VoiTrans · 服务提供:VoiTrans', - 'moreInfoViewInSettingsAbout': '更多信息请前往 设置 > 关于 查看', - 'copyrightVoiTrans': '© 2025 VoiTrans', + 'appNameProvider': '应用名称:Voitrans · 服务提供:Voitrans', + 'iapCustomerServiceQQLabel': '内购商品专属客服QQ:@qq', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // 会议商品页描述 'meetingHeaderDesc1': '录音转写、关键词检索与自动总结,提升会议效率。', diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index b1a13c479..535bb5f11 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -835,10 +835,11 @@ const Map zhHK = { "guideSmsInput": "Text Dad: I’ll be home for dinner", "guideSmsSend": "Lily will send the message", "guideSmsEnd": "Message sent—voice control is convenient", - // Goods pages common footer (placeholders) - 'appNameProvider': '應用名稱:VoiTrans · 服務提供:VoiTrans', - 'moreInfoViewInSettingsAbout': '更多信息請前往 設置 > 關於 查看', - 'copyrightVoiTrans': '© 2025 VoiTrans', + + // 商品页通用页脚 + 'appNameProvider': '應用名稱:Voitrans · 服務提供:Voitrans', + 'iapCustomerServiceQQLabel': '內购商品专属客服QQ:@qq', + 'copyrightVoitrans': '© 2025 Voitrans Technologies', // Meeting goods page (placeholders) 'meetingHeaderDesc1': '錄音轉寫、關鍵詞檢索與自動總結,提升會議效率。', diff --git a/lib/modules/goods/views/goodsai_view.dart b/lib/modules/goods/views/goodsai_view.dart index 4926f2049..74dac96bc 100644 --- a/lib/modules/goods/views/goodsai_view.dart +++ b/lib/modules/goods/views/goodsai_view.dart @@ -6,6 +6,7 @@ import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsai_controller.dart'; import '../utils/goods_i18n.dart'; +import 'widgets/goods_footer_section.dart'; class GoodsaiView extends GetView { const GoodsaiView({super.key}); @@ -61,7 +62,7 @@ class GoodsaiView extends GetView { SizedBox(height: 16.h), _buildFeaturesSection(isDarkMode), SizedBox(height: 16.h), - _buildFooterSection(isDarkMode), + GoodsFooterSection(isDarkMode: isDarkMode), ], ); } @@ -212,7 +213,7 @@ class GoodsaiView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${'totalCount'.tr}:$totalAi', + '${'totalQuota'.tr}:$totalAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -334,40 +335,6 @@ class GoodsaiView extends GetView { ); } - Widget _buildFooterSection(bool isDarkMode) { - final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; - return Padding( - padding: EdgeInsets.symmetric(vertical: 12.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - width: double.infinity, - child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), - ), - SizedBox(height: 8.h), - Text( - 'appNameProvider'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'moreInfoViewInSettingsAbout'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'copyrightVoiTrans'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - ], - ), - ); - } - Widget _buildFeatureCard( bool isDarkMode, { required IconData icon, diff --git a/lib/modules/goods/views/goodsmeet_view.dart b/lib/modules/goods/views/goodsmeet_view.dart index b33a36071..a32c306c5 100644 --- a/lib/modules/goods/views/goodsmeet_view.dart +++ b/lib/modules/goods/views/goodsmeet_view.dart @@ -5,6 +5,7 @@ import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsmeet_controller.dart'; import '../utils/goods_i18n.dart'; +import 'widgets/goods_footer_section.dart'; class GoodsmeetView extends GetView { const GoodsmeetView({super.key}); @@ -64,7 +65,7 @@ class GoodsmeetView extends GetView { if (index == controller.items.length + 2) { return _buildFeaturesSection(isDarkMode); } - return _buildFooterSection(isDarkMode); + return GoodsFooterSection(isDarkMode: isDarkMode); }, ); }), @@ -195,7 +196,7 @@ class GoodsmeetView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${'totalCount'.tr}:$totalAi', + '${'totalQuota'.tr}:$totalAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -256,12 +257,12 @@ class GoodsmeetView extends GetView { fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), - SizedBox(height: 4.h), - Text(localizedGoodsDesc(item), - style: TextStyle( - fontSize: 12.sp, - color: isDarkMode ? Colors.white70 : Colors.grey[600], - )), + // SizedBox(height: 4.h), + // Text(localizedGoodsDesc(item), + // style: TextStyle( + // fontSize: 12.sp, + // color: isDarkMode ? Colors.white70 : Colors.grey[600], + // )), ], ), ), @@ -429,38 +430,4 @@ class GoodsmeetView extends GetView { ), ); } - - Widget _buildFooterSection(bool isDarkMode) { - final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; - return Padding( - padding: EdgeInsets.symmetric(vertical: 12.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - width: double.infinity, - child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), - ), - SizedBox(height: 8.h), - Text( - 'appNameProvider'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'moreInfoViewInSettingsAbout'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'copyrightVoiTrans'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - ], - ), - ); - } } diff --git a/lib/modules/goods/views/goodstrans_view.dart b/lib/modules/goods/views/goodstrans_view.dart index c7d8fee28..9ac127551 100644 --- a/lib/modules/goods/views/goodstrans_view.dart +++ b/lib/modules/goods/views/goodstrans_view.dart @@ -5,6 +5,7 @@ import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodstrans_controller.dart'; import '../utils/goods_i18n.dart'; +import 'widgets/goods_footer_section.dart'; class GoodstransView extends GetView { const GoodstransView({super.key}); @@ -63,7 +64,7 @@ class GoodstransView extends GetView { if (index == controller.items.length + 2) { return _buildFeaturesSection(isDarkMode); } - return _buildFooterSection(isDarkMode); + return GoodsFooterSection(isDarkMode: isDarkMode); }, ); }), @@ -194,7 +195,7 @@ class GoodstransView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${'totalCount'.tr}:$totalAi', + '${'totalQuota'.tr}:$totalAi', style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.grey[700], @@ -255,12 +256,12 @@ class GoodstransView extends GetView { fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, )), - SizedBox(height: 4.h), - Text(localizedGoodsDesc(item), - style: TextStyle( - fontSize: 12.sp, - color: isDarkMode ? Colors.white70 : Colors.grey[600], - )), + // SizedBox(height: 4.h), + // Text(localizedGoodsDesc(item), + // style: TextStyle( + // fontSize: 12.sp, + // color: isDarkMode ? Colors.white70 : Colors.grey[600], + // )), ], ), ), @@ -431,38 +432,4 @@ class GoodstransView extends GetView { ), ); } - - Widget _buildFooterSection(bool isDarkMode) { - final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; - return Padding( - padding: EdgeInsets.symmetric(vertical: 12.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - width: double.infinity, - child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), - ), - SizedBox(height: 8.h), - Text( - 'appNameProvider'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'moreInfoViewInSettingsAbout'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'copyrightVoiTrans'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - ], - ), - ); - } } diff --git a/lib/modules/goods/views/goodsvip_view.dart b/lib/modules/goods/views/goodsvip_view.dart index 94f1c5fb5..4cc881e3b 100644 --- a/lib/modules/goods/views/goodsvip_view.dart +++ b/lib/modules/goods/views/goodsvip_view.dart @@ -5,6 +5,7 @@ import '../../../data/models/goods.dart'; import '../../../data/models/user_Info.dart'; import '../controllers/goodsvip_controller.dart'; import '../utils/goods_i18n.dart'; +import 'widgets/goods_footer_section.dart'; class GoodsvipView extends GetView { const GoodsvipView({super.key}); @@ -68,7 +69,7 @@ class GoodsvipView extends GetView { } } - children.add(_buildFooterSection(isDarkMode)); + children.add(GoodsFooterSection(isDarkMode: isDarkMode)); content = ListView( key: ValueKey(userTick), padding: EdgeInsets.all(16.w), @@ -223,40 +224,6 @@ class GoodsvipView extends GetView { ); } - Widget _buildFooterSection(bool isDarkMode) { - final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; - return Padding( - padding: EdgeInsets.symmetric(vertical: 12.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - width: double.infinity, - child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), - ), - SizedBox(height: 8.h), - Text( - 'appNameProvider'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'moreInfoViewInSettingsAbout'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - SizedBox(height: 4.h), - Text( - 'copyrightVoiTrans'.tr, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 11.sp, color: subColor), - ), - ], - ), - ); - } - Widget _buildTypeHeader(UsageType type, bool isDarkMode) { final titles = { UsageType.AI: 'aiFunction'.tr, @@ -442,7 +409,7 @@ class GoodsvipView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${'totalCount'.tr}:$total', + '${'totalQuota'.tr}:$total', style: TextStyle(fontSize: 12.sp, color: subColor), ), Text( @@ -701,7 +668,7 @@ class GoodsvipView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${'totalCount'.tr}:$total', + '${'totalQuota'.tr}:$total', style: TextStyle(fontSize: 12.sp, color: subColor), ), Text( diff --git a/lib/modules/goods/views/widgets/goods_footer_section.dart b/lib/modules/goods/views/widgets/goods_footer_section.dart new file mode 100644 index 000000000..00a7afabf --- /dev/null +++ b/lib/modules/goods/views/widgets/goods_footer_section.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../../../../data/models/appconfig.dart'; + +class GoodsFooterSection extends StatelessWidget { + final bool isDarkMode; + const GoodsFooterSection({super.key, required this.isDarkMode}); + + @override + Widget build(BuildContext context) { + final subColor = isDarkMode ? Colors.white60 : Colors.grey[600]; + final qq = AppConfig.env('iapCustomerServiceQQ') ?? ''; + return Padding( + padding: EdgeInsets.symmetric(vertical: 12.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: double.infinity, + child: Divider(color: isDarkMode ? Colors.white24 : Colors.black12), + ), + SizedBox(height: 8.h), + Text( + 'appNameProvider'.tr, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + if (qq.isNotEmpty) ...[ + Text( + 'iapCustomerServiceQQLabel'.trParams({'qq': qq}), + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + SizedBox(height: 4.h), + ], + // SizedBox(height: 4.h), + Text( + 'copyrightVoitrans'.tr, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11.sp, color: subColor), + ), + ], + ), + ); + } +} From 217c9d7e0f81c14677a634012f3374b12a1a9f6a Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 9 Dec 2025 15:00:08 +0800 Subject: [PATCH 141/177] =?UTF-8?q?refactor(=E6=97=B6=E9=97=B4=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96):=20=E4=BD=BF=E7=94=A8Duration=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=B9=B6=E7=A1=AE=E4=BF=9D=E7=A7=92=E6=95=B0=E9=9D=9E?= =?UTF-8?q?=E8=B4=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了两个视图中的_formatHms方法,使用Duration类进行时间计算,同时添加了对负数的处理,确保时间显示始终有效 --- lib/modules/meeting/views/meeting_home_view.dart | 8 +++++--- .../middleware/views/translation_middleware_view.dart | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/modules/meeting/views/meeting_home_view.dart b/lib/modules/meeting/views/meeting_home_view.dart index bf9cf58e4..36c5d610e 100644 --- a/lib/modules/meeting/views/meeting_home_view.dart +++ b/lib/modules/meeting/views/meeting_home_view.dart @@ -513,9 +513,11 @@ class _MeetingHomeViewState extends State } String _formatHms(int seconds) { - int h = seconds ~/ 3600; - int m = (seconds % 3600) ~/ 60; - int s = seconds % 60; + final sec = seconds < 0 ? 0 : seconds; // 确保秒数非负 + final d = Duration(seconds: sec); + final h = d.inHours; + final m = d.inMinutes.remainder(60); + final s = d.inSeconds.remainder(60); String twoDigits(int n) => n.toString().padLeft(2, '0'); return '${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}'; } diff --git a/lib/modules/translation/middleware/views/translation_middleware_view.dart b/lib/modules/translation/middleware/views/translation_middleware_view.dart index 678efb2d5..9e1de5067 100644 --- a/lib/modules/translation/middleware/views/translation_middleware_view.dart +++ b/lib/modules/translation/middleware/views/translation_middleware_view.dart @@ -212,9 +212,11 @@ class TranslationMiddlewareView } String _formatHms(int seconds) { - int h = seconds ~/ 3600; - int m = (seconds % 3600) ~/ 60; - int s = seconds % 60; + final sec = seconds < 0 ? 0 : seconds; // 确保秒数非负 + final d = Duration(seconds: sec); + final h = d.inHours; + final m = d.inMinutes.remainder(60); + final s = d.inSeconds.remainder(60); String twoDigits(int n) => n.toString().padLeft(2, '0'); return '${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}'; } From 46e3046b511b3ac782e6263af9cdcf249be758c7 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 9 Dec 2025 16:23:00 +0800 Subject: [PATCH 142/177] =?UTF-8?q?fix(BleManager):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=BC=96=E8=A7=A3=E7=A0=81=E5=99=A8=E7=8A=B6=E6=80=81=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加等待状态标志位来正确处理编解码器开关操作,避免状态更新混乱 同时优化翻译控制器中的日志标记和历史记录判空逻辑 --- lib/data/services/ble_manager.dart | 31 +++++++++++++++++-- .../controllers/translation_controller.dart | 7 +++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 1a1daabd1..357f3ccf3 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -202,6 +202,8 @@ class BleManager extends GetxService { final _isCodecActive = false.obs; bool get isCodecActive => _isCodecActive.value; RxBool get isCodecActiveRx => _isCodecActive; + bool _awaitingCodecOpen = false; //是否正在等待编码器打开的成功应答 + bool _awaitingCodecClose = false; //是否正在等待编码器关闭的成功应答 // 订阅 StreamSubscription? _statusSubscription; @@ -267,7 +269,9 @@ class BleManager extends GetxService { state == BleConnectionState.error) { Logger.info('lxm--BLE设备已断开或发生错误'); _isConnected.value = false; - // 更新设备信息Add commentMore actions + _awaitingCodecOpen = false; + _awaitingCodecClose = false; + _isCodecActive.value = false; Logger.info('lxm--断开连接时重置设备信息为0'); _updateDeviceInfoIfNeeded( batteryLevel: 0, @@ -376,7 +380,16 @@ class BleManager extends GetxService { print(" CONTROL_CODEC: $commandId,$data"); final bool codecSuccess = _isCodecControlSuccess(data); - _isCodecActive.value = codecSuccess; // 更新编解码器状态 + if (_awaitingCodecOpen) { + //如果正在等待打开编解码器 + _isCodecActive.value = codecSuccess; // 只在等待打开时更新状态 + _awaitingCodecOpen = false; + } else if (_awaitingCodecClose) { + if (codecSuccess) { + _isCodecActive.value = false; + } + _awaitingCodecClose = false; + } if (codecSuccess) { print("lxm--编解码控制成功 (rawData 第二字节非 0)"); @@ -991,19 +1004,27 @@ class BleManager extends GetxService { /// 打开解码器 Future openDecoder() async { try { + _awaitingCodecOpen = true; + _awaitingCodecClose = false; + _isCodecActive.value = false; return await _bleService.openDecoder(); } catch (e) { Logger.error('打开解码器失败: ${e.toString()}'); + _awaitingCodecOpen = false; return false; } } - /// 打开解码器 + /// 打开A2DP解码器 Future openA2DPDecoder() async { try { + _awaitingCodecOpen = true; + _awaitingCodecClose = false; + _isCodecActive.value = false; return await _bleService.openA2DPDecoder(); } catch (e) { Logger.error('打开解码器失败: ${e.toString()}'); + _awaitingCodecOpen = false; return false; } } @@ -1021,9 +1042,13 @@ class BleManager extends GetxService { /// 关闭编解码器 Future closeCodec() async { try { + _awaitingCodecOpen = false; + _awaitingCodecClose = true; + _isCodecActive.value = false; return await _bleService.closeCodec(); } catch (e) { Logger.error('关闭编解码器失败: ${e.toString()}'); + _awaitingCodecClose = false; return false; } } diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 1d0a4c32d..b31f7dbe3 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -1008,7 +1008,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { if (event.text.isEmpty) break; //通话模式下:己方语言即为源语言,无需判断 detectedLanguageCode = sourceLanguageCode.value; - Logger.info("处理己方识别完成:${event.text}"); + Logger.info("lxm---处理己方识别完成:${event.text}"); handleFinalResult(event.text); break; @@ -1126,10 +1126,11 @@ class TranslationController extends GetxController with WidgetsBindingObserver { /// 处理最终识别结果 /// [text] 识别的文本 Future handleFinalResult(String text) async { - if (text.isEmpty || translationHistory.isEmpty) return; + if (text.isEmpty) return; // 更新当前项 - if (translationHistory.last.isIntermediate) { + if (translationHistory.isNotEmpty && + translationHistory.last.isIntermediate) { translationHistory.last.sourceText = text; translationHistory.last.isIntermediate = false; translationHistory.refresh(); From 9d1e35b95155a5ee7d5d1d74de2a80a398db5006 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 9 Dec 2025 16:49:05 +0800 Subject: [PATCH 143/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/XunFeiAsrHelper.kt | 90 ++++++++++++++----- 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 3c4253dd0..7f0919df0 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -17,12 +17,14 @@ class XunFeiAsrHelper(private val context: Context) { private val tag = "XunFeiAsrHelper" private val appId = "43d87d22" - private val accessKeyId = "83f063755e8d342670002f50a4471d42" + private val accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec" + private val accessKeySecret = "ODU3OTUyYjhjMjY5NDhkMmMxYWY2Zjlm" private var webSocket: WebSocket? = null private val client = OkHttpClient() private var currentSessionId = "" + private var sessionId = "" fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) { try { @@ -73,7 +75,7 @@ class XunFeiAsrHelper(private val context: Context) { fun stop() { try { webSocket?.let { ws: WebSocket -> - ws.send("{\"end\": true}") + ws.send("{\"end\": true, \"sessionId\": \"$sessionId\"}") ws.close(1000, "User stopped") } } catch (e: Exception) { @@ -89,10 +91,15 @@ class XunFeiAsrHelper(private val context: Context) { ) { try { val jsonData = JSONObject(resultData) - val action = jsonData.optString("action") - - when (action) { - "started" -> { + Log.d(tag, "-------------------$jsonData") + val msgType = jsonData.optString("msg_type") + + when (msgType) { + "action" -> { + val sid = jsonData.optString("sessionId") + if (!sid.isNullOrEmpty()) { + sessionId = sid + } Log.d(tag, "Handshake success") } @@ -127,8 +134,13 @@ class XunFeiAsrHelper(private val context: Context) { } "error" -> { - Log.e(tag, "Error: $resultData") callback.onError(currentSessionId, 1005, "Xunfei error: $resultData") + Log.e(tag, "Error: $resultData") + } + + else -> { + callback.onError(currentSessionId, 1006, "Xunfei unknown msg_type: $msgType") + Log.w(tag, "Unknown msg_type: $msgType") } } } catch (e: Exception) { @@ -137,27 +149,57 @@ class XunFeiAsrHelper(private val context: Context) { } private fun getWebSocketUrl(): String { - val url = "wss://rtasr.xfyun.cn/v1/ws" - val ts = (System.currentTimeMillis() / 1000).toString() - val baseString = appId + ts - val signa = md5(baseString) - val signatureSha = hmacSha1(signa, accessKeyId) - val signature = Base64.encodeToString(signatureSha, Base64.NO_WRAP) - val encodedSignature = URLEncoder.encode(signature, "UTF-8") - - return "$url?appid=$appId&ts=$ts&signa=$encodedSignature" + val baseWsUrl = "wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1" + + val params = java.util.TreeMap() + params["audio_encode"] = "pcm_s16le" + params["lang"] = "autodialect" + params["samplerate"] = "16000" + params["accessKeyId"] = accessKeyId + params["appId"] = appId + params["utc"] = getUtcTime() + + val signature = calculateSignature(params) + params["signature"] = signature + + val sb = StringBuilder() + var first = true + for ((key, value) in params) { + if (!first) { + sb.append("&") + } + sb.append(URLEncoder.encode(key, "UTF-8")).append("=").append(URLEncoder.encode(value, "UTF-8")) + first = false + } + + return "$baseWsUrl?$sb" } - private fun md5(string: String): String { - val md = MessageDigest.getInstance("MD5") - val digest = md.digest(string.toByteArray(StandardCharsets.UTF_8)) - return digest.joinToString("") { "%02x".format(it) } + private fun getUtcTime(): String { + val sdf = java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") + sdf.timeZone = java.util.TimeZone.getTimeZone("GMT+8") + return sdf.format(java.util.Date()) } - private fun hmacSha1(data: String, key: String): ByteArray { - val secretKeySpec = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "HmacSHA1") + private fun calculateSignature(params: Map): String { + val baseStr = StringBuilder() + var first = true + for ((key, value) in params) { + if ("signature" == key) continue + if (value.isEmpty()) continue + + if (!first) { + baseStr.append("&") + } + baseStr.append(URLEncoder.encode(key, "UTF-8")).append("=").append(URLEncoder.encode(value, "UTF-8")) + first = false + } + val mac = Mac.getInstance("HmacSHA1") - mac.init(secretKeySpec) - return mac.doFinal(data.toByteArray(StandardCharsets.UTF_8)) + val keySpec = SecretKeySpec(accessKeySecret.toByteArray(StandardCharsets.UTF_8), "HmacSHA1") + mac.init(keySpec) + val signBytes = mac.doFinal(baseStr.toString().toByteArray(StandardCharsets.UTF_8)) + + return Base64.encodeToString(signBytes, Base64.NO_WRAP) } } From 149bb07fe27676d6e32a9b87da08cc5cff0cee43 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 9 Dec 2025 19:31:02 +0800 Subject: [PATCH 144/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/XunFeiAsrHelper.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 7f0919df0..a7786bad2 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -107,11 +107,14 @@ class XunFeiAsrHelper(private val context: Context) { val dataStr = jsonData.optString("data") val data = JSONObject(dataStr) + val ls = data.optBoolean("ls") val cn = data.optJSONObject("cn") ?: return val st = cn.optJSONObject("st") ?: return val rt = st.optJSONArray("rt") ?: return var resultTextTemp = "" + var punctuationCount = 0 + var wordCount = 0 for (i in 0 until rt.length()) { val j = rt.getJSONObject(i) @@ -122,13 +125,27 @@ class XunFeiAsrHelper(private val context: Context) { for (l in 0 until cw.length()) { val lObj = cw.getJSONObject(l) resultTextTemp += lObj.optString("w") + if (lObj.optString("wp") == "p") { + punctuationCount++ + } else { + wordCount++ + } } } } + if (ls && wordCount == 0 && punctuationCount == 1) { + return + } + if (st.optInt("type") == 0) { callback.onResult(currentSessionId, resultTextTemp, "zh-CN") + currentSessionId = "" } else { + if (currentSessionId.isEmpty()) { + currentSessionId = UUID.randomUUID().toString() + callback.onSessionStarted(currentSessionId) + } callback.onRecognizing(currentSessionId, resultTextTemp, "zh-CN") } } From e840e25d4cc2821b0369e466f4c155886fca985e Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 9 Dec 2025 19:54:45 +0800 Subject: [PATCH 145/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index a7786bad2..491c3dbaf 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -25,6 +25,7 @@ class XunFeiAsrHelper(private val context: Context) { private var currentSessionId = "" private var sessionId = "" + private var lastIntermediateResult = "" fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) { try { @@ -35,6 +36,7 @@ class XunFeiAsrHelper(private val context: Context) { } currentSessionId = UUID.randomUUID().toString() + lastIntermediateResult = "" val url = getWebSocketUrl() val request = Request.Builder().url(url).build() @@ -56,6 +58,10 @@ class XunFeiAsrHelper(private val context: Context) { override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { Log.d(tag, "WebSocket Closed: $code / $reason") + if (currentSessionId.isNotEmpty() && lastIntermediateResult.isNotEmpty()) { + callback.onResult(currentSessionId, lastIntermediateResult, "zh-CN") + currentSessionId = "" + } callback.onSessionStopped(currentSessionId) } @@ -141,11 +147,13 @@ class XunFeiAsrHelper(private val context: Context) { if (st.optInt("type") == 0) { callback.onResult(currentSessionId, resultTextTemp, "zh-CN") currentSessionId = "" + lastIntermediateResult = "" } else { if (currentSessionId.isEmpty()) { currentSessionId = UUID.randomUUID().toString() callback.onSessionStarted(currentSessionId) } + lastIntermediateResult = resultTextTemp callback.onRecognizing(currentSessionId, resultTextTemp, "zh-CN") } } From 841b0e9de183ac9e31c6715cc9382b8d06837964 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 9 Dec 2025 20:28:29 +0800 Subject: [PATCH 146/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/AzureAsrHelper.kt | 4 +-- .../azure_speech/XunFeiAsrHelper.kt | 35 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index 3f6aaed83..793193be7 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -114,7 +114,7 @@ class AzureAsrHelper(private val context: Context) { this.supportedLanguages = supportedLanguages } - // this.useXunfei = supportedLanguages.any { it == "zh-CN" || it == "en-US" } + this.useXunfei = supportedLanguages.any { it == "zh-CN" || it == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 this.isAutoDetectLanguage = supportedLanguages.size >= 2 @@ -285,7 +285,7 @@ class AzureAsrHelper(private val context: Context) { } try { - xunFeiAsrHelper?.start(callback) + xunFeiAsrHelper?.start(callback, currentLanguage, isAutoDetectLanguage) this.audioSourceType = audioSourceType if (!audioStream.isContinuousRecognitionActive) { diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 491c3dbaf..7a5450452 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -27,7 +27,10 @@ class XunFeiAsrHelper(private val context: Context) { private var sessionId = "" private var lastIntermediateResult = "" - fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) { + private var currentLanguage = "zh-CN" + private var isAutoDetectLanguage = false + + fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback, language: String, isAutoDetect: Boolean) { try { webSocket?.cancel() webSocket = null @@ -38,6 +41,9 @@ class XunFeiAsrHelper(private val context: Context) { currentSessionId = UUID.randomUUID().toString() lastIntermediateResult = "" + currentLanguage = language + isAutoDetectLanguage = isAutoDetect + val url = getWebSocketUrl() val request = Request.Builder().url(url).build() @@ -59,8 +65,17 @@ class XunFeiAsrHelper(private val context: Context) { override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { Log.d(tag, "WebSocket Closed: $code / $reason") if (currentSessionId.isNotEmpty() && lastIntermediateResult.isNotEmpty()) { - callback.onResult(currentSessionId, lastIntermediateResult, "zh-CN") - currentSessionId = "" + val detectedLanguage = if (isAutoDetectLanguage) { + if (lastIntermediateResult.contains(Regex("[\\u4e00-\\u9fa5]"))) { + "zh-CN" + } else { + "en-US" + } + } else { + currentLanguage + } + callback.onResult(currentSessionId, lastIntermediateResult, detectedLanguage) + currentSessionId = "" } callback.onSessionStopped(currentSessionId) } @@ -144,8 +159,18 @@ class XunFeiAsrHelper(private val context: Context) { return } + val detectedLanguage = if (isAutoDetectLanguage) { + if (resultTextTemp.contains(Regex("[\\u4e00-\\u9fa5]"))) { + "zh-CN" + } else { + "en-US" + } + } else { + currentLanguage + } + if (st.optInt("type") == 0) { - callback.onResult(currentSessionId, resultTextTemp, "zh-CN") + callback.onResult(currentSessionId, resultTextTemp, detectedLanguage) currentSessionId = "" lastIntermediateResult = "" } else { @@ -154,7 +179,7 @@ class XunFeiAsrHelper(private val context: Context) { callback.onSessionStarted(currentSessionId) } lastIntermediateResult = resultTextTemp - callback.onRecognizing(currentSessionId, resultTextTemp, "zh-CN") + callback.onRecognizing(currentSessionId, resultTextTemp, detectedLanguage) } } From 1a6dff7d078ae93aea6827503ff302e93120a425 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 10 Dec 2025 11:20:22 +0800 Subject: [PATCH 147/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/AzureAsrHelper.kt | 2 +- .../azure_speech/XunFeiAsrHelper.kt | 21 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index 793193be7..a7fc47c20 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -114,7 +114,7 @@ class AzureAsrHelper(private val context: Context) { this.supportedLanguages = supportedLanguages } - this.useXunfei = supportedLanguages.any { it == "zh-CN" || it == "en-US" } + this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 this.isAutoDetectLanguage = supportedLanguages.size >= 2 diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 7a5450452..80326614b 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -143,15 +143,32 @@ class XunFeiAsrHelper(private val context: Context) { for (k in 0 until ws.length()) { val kObj = ws.getJSONObject(k) val cw = kObj.optJSONArray("cw") ?: continue + // 如果resultTextTemp中第一个文字是标点符号,则去除第一个文字的标点符号 for (l in 0 until cw.length()) { val lObj = cw.getJSONObject(l) - resultTextTemp += lObj.optString("w") - if (lObj.optString("wp") == "p") { + val w = lObj.optString("w") + val wp = lObj.optString("wp") + + if (wp == "p") { punctuationCount++ + if (resultTextTemp.isEmpty()) { + continue + } } else { wordCount++ } + resultTextTemp += w } + // 不去除resultTextTemp第一个文字的标点符号 + // for (l in 0 until cw.length()) { + // val lObj = cw.getJSONObject(l) + // resultTextTemp += lObj.optString("w") + // if (lObj.optString("wp") == "p") { + // punctuationCount++ + // } else { + // wordCount++ + // } + // } } } From acded27f80d50df41968d11c561b86c57a03472c Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 10 Dec 2025 16:55:16 +0800 Subject: [PATCH 148/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9iOS=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/azure_speech/AzureAsrHelper.swift | 91 +++++- .../azure_speech/XunFeiAsrHelper.swift | 280 ++++++++++++++++++ 2 files changed, 368 insertions(+), 3 deletions(-) create mode 100644 local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift index 8fe11e856..a2a5063bd 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift @@ -57,6 +57,9 @@ public class AzureAsrHelper: NSObject { private var subscriptionKey = "" private var region = "" + private var useXunfei = false + private var xunFeiAsrHelper: XunFeiAsrHelper? + // 音频源配置 public enum AudioSourceType { /** 使用设备麦克风 */ @@ -112,6 +115,9 @@ public class AzureAsrHelper: NSObject { self.supportedLanguages = supportedLanguages } + // 检查是否只包含中文或英文,如果是则使用讯飞 + self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } + // 根据支持的语言数量决定是否启用自动语言检测 self.isAutoDetectLanguage = supportedLanguages.count >= 2 @@ -413,6 +419,43 @@ public class AzureAsrHelper: NSObject { self.audioSourceType = audioSourceType print("startContinuousRecognition:准备启动") + // 如果使用讯飞识别 + if useXunfei { + print("Using Xunfei Recognition") + guard let callback = self.continuousCallback else { + print("无法启动连续识别:回调为空") + return false + } + + if xunFeiAsrHelper == nil { + xunFeiAsrHelper = XunFeiAsrHelper() + } + + // 启动讯飞识别 + xunFeiAsrHelper?.start(callback: callback, language: currentLanguage, isAutoDetect: isAutoDetectLanguage) + + // 创建代理回调,将音频数据转发给讯飞 + let proxyCallback = AudioDataCallbackProxy(original: audioDataCallback) { [weak self] data in + self?.xunFeiAsrHelper?.sendAudio(frameBuffer: data) + } + + // 异步启动音频处理 + startAudioRecordAsync(audioSourceType: audioSourceType, audioDataCallback: proxyCallback) { [weak self] (success: Bool) in + guard let self = self else { return } + + if success { + self.audioStream?.isContinuousRecognitionActive = true + os_log("讯飞连续识别已启动", log: self.log, type: .info) + } else { + os_log("音频启动失败,无法开始讯飞识别", log: self.log, type: .error) + self.xunFeiAsrHelper?.stop() + self.audioStream?.isContinuousRecognitionActive = false + } + } + + return true + } + do { if recognizer == nil { // 检查continuousCallback是否为空,只有在不为空时才设置事件监听器 @@ -464,6 +507,23 @@ public class AzureAsrHelper: NSObject { * - 返回: 停止操作是否成功 */ public func stopContinuousRecognition() -> Bool { + if useXunfei { + xunFeiAsrHelper?.stop() + + // 关键:取消尚未执行的启动任务,防止 stop 后音频又被启动 + cancelPendingAudioStart() + + stopAudioRecordAsync { [weak self] (success: Bool) in + guard let self = self else { return } + if success { + self.audioStream?.isContinuousRecognitionActive = false + os_log("讯飞音频停止成功", log: self.log, type: .info) + } + } + self.audioStream?.isContinuousRecognitionActive = false + return true + } + guard speechConfig != nil else { os_log("语音服务未初始化", log: log, type: .error) return false @@ -545,8 +605,12 @@ public class AzureAsrHelper: NSObject { print("释放所有资源:") // 如果正在进行连续识别,先停止 if audioStream?.isContinuousRecognitionActive == true { - // 直接停止,不等待结果 - try? recognizer?.stopContinuousRecognition() + if useXunfei { + xunFeiAsrHelper?.stop() + } else { + // 直接停止,不等待结果 + try? recognizer?.stopContinuousRecognition() + } audioStream?.isContinuousRecognitionActive = false } // 取消防抖任务 - 只取消开始操作的防抖 @@ -560,6 +624,8 @@ public class AzureAsrHelper: NSObject { speechConfig = nil audioConfig = nil audioStream = nil + xunFeiAsrHelper?.stop() + xunFeiAsrHelper = nil // 确保状态被重置 audioStream?.isContinuousRecognitionActive = false //externalAudioStream = nil @@ -739,6 +805,9 @@ public class AzureAsrHelper: NSObject { self.supportedLanguages = [validatedSourceLang, validatedTargetLang] self.currentLanguage = validatedSourceLang + // 更新是否使用讯飞 + self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } + // 重新配置语言检测 self.isAutoDetectLanguage = (validatedSourceLang != validatedTargetLang) @@ -1084,7 +1153,7 @@ extension AzureAsrHelper: NetworkStateMonitor.NetworkStateListener { self.handleNetworkLost() } - // .MARK: - 启动任务管理 + // MARK: - 启动任务管理 /// 取消尚未执行的音频启动任务,防止 stop 后仍然触发启动 private func cancelPendingAudioStart() { audioStartWorkItem?.cancel() @@ -1093,6 +1162,22 @@ extension AzureAsrHelper: NetworkStateMonitor.NetworkStateListener { } +// MARK: - AudioDataCallback Proxy +private class AudioDataCallbackProxy: SimpleAudioReceiver.AudioDataCallback { + private let originalCallback: SimpleAudioReceiver.AudioDataCallback? + private let xunfeiCallback: ((Data) -> Void)? + + init(original: SimpleAudioReceiver.AudioDataCallback?, xunfei: ((Data) -> Void)?) { + self.originalCallback = original + self.xunfeiCallback = xunfei + } + + func onAudio(_ data: Data) { + originalCallback?.onAudio(data) + xunfeiCallback?(data) + } +} + diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift new file mode 100644 index 000000000..19aa162fe --- /dev/null +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift @@ -0,0 +1,280 @@ +import Foundation +import CryptoKit + +class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { + private let tag = "XunFeiAsrHelper" + + private let appId = "43d87d22" + private let accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec" + private let accessKeySecret = "ODU3OTUyYjhjMjY5NDhkMmMxYWY2Zjlm" + + private var webSocketTask: URLSessionWebSocketTask? + private lazy var session: URLSession = { + let configuration = URLSessionConfiguration.default + return URLSession(configuration: configuration, delegate: self, delegateQueue: OperationQueue()) + }() + + private var currentSessionId = "" + private var sessionId = "" + private var lastIntermediateResult = "" + + private var currentLanguage = "zh-CN" + private var isAutoDetectLanguage = false + + private var callback: AzureAsrHelper.ContinuousRecognizeCallback? + + func start(callback: AzureAsrHelper.ContinuousRecognizeCallback, language: String, isAutoDetect: Bool) { + stop() + + self.callback = callback + self.currentLanguage = language + self.isAutoDetectLanguage = isAutoDetect + self.currentSessionId = UUID().uuidString + self.lastIntermediateResult = "" + self.sessionId = "" + + let urlString = getWebSocketUrl() + guard let url = URL(string: urlString) else { + print("\(tag): Invalid URL") + return + } + + let request = URLRequest(url: url) + webSocketTask = session.webSocketTask(with: request) + webSocketTask?.resume() + + print("\(tag): WebSocket Connecting...") + receiveMessage() + } + + func sendAudio(frameBuffer: Data) { + guard let webSocketTask = webSocketTask else { return } + let message = URLSessionWebSocketTask.Message.data(frameBuffer) + webSocketTask.send(message) { error in + if let error = error { + print("\(self.tag): Send audio failed: \(error)") + } + } + } + + func stop() { + if let webSocketTask = webSocketTask { + let endJson = "{\"end\": true, \"sessionId\": \"\(sessionId)\"}" + let message = URLSessionWebSocketTask.Message.string(endJson) + webSocketTask.send(message) { _ in } + webSocketTask.cancel(with: .normalClosure, reason: "User stopped".data(using: .utf8)) + } + webSocketTask = nil + } + + private func receiveMessage() { + webSocketTask?.receive { [weak self] result in + guard let self = self else { return } + + switch result { + case .failure(let error): + print("\(self.tag): WebSocket Receive Error: \(error)") + self.callback?.onError(sessionid: self.currentSessionId, 1004, "Xunfei connection failed: \(error.localizedDescription)") + + case .success(let message): + switch message { + case .string(let text): + self.processMessage(text) + case .data(let data): + if let text = String(data: data, encoding: .utf8) { + self.processMessage(text) + } + @unknown default: + break + } + + // Continue receiving messages + self.receiveMessage() + } + } + } + + func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) { + print("\(tag): WebSocket Opened") + callback?.onSessionStarted(sessionid: currentSessionId) + } + + func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) { + let reasonString = reason.flatMap { String(data: $0, encoding: .utf8) } ?? "Unknown" + print("\(tag): WebSocket Closed: \(closeCode) / \(reasonString)") + + if !currentSessionId.isEmpty && !lastIntermediateResult.isEmpty { + let detectedLanguage = detectLanguage(from: lastIntermediateResult) + callback?.onResult(sessionid: currentSessionId, lastIntermediateResult, detectedLanguage) + currentSessionId = "" + } + callback?.onSessionStopped(sessionid: currentSessionId) + } + + private func processMessage(_ text: String) { + guard let data = text.data(using: .utf8) else { return } + + do { + guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else { return } + print("\(tag): -------------------\(json)") + + let msgType = json["msg_type"] as? String + + switch msgType { + case "action": + if let sid = json["sessionId"] as? String, !sid.isEmpty { + self.sessionId = sid + } + print("\(tag): Handshake success") + + case "result": + processResult(json) + + case "error": + let errorMsg = "\(json)" + print("\(tag): Error: \(errorMsg)") + callback?.onError(sessionid: currentSessionId, 1005, "Xunfei error: \(errorMsg)") + + default: + print("\(tag): Unknown msg_type: \(msgType ?? "nil")") + callback?.onError(sessionid: currentSessionId, 1006, "Xunfei unknown msg_type: \(msgType ?? "nil")") + } + + } catch { + print("\(tag): Parse error: \(error)") + } + } + + private func processResult(_ json: [String: Any]) { + guard let dataStr = json["data"] as? String, + let dataData = dataStr.data(using: .utf8), + let data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] else { + return + } + + let ls = data["ls"] as? Bool ?? false + guard let cn = data["cn"] as? [String: Any], + let st = cn["st"] as? [String: Any], + let rt = st["rt"] as? [[String: Any]] else { + return + } + + var resultTextTemp = "" + var punctuationCount = 0 + var wordCount = 0 + + for j in rt { + guard let ws = j["ws"] as? [[String: Any]] else { continue } + for kObj in ws { + guard let cw = kObj["cw"] as? [[String: Any]] else { continue } + + for lObj in cw { + let w = lObj["w"] as? String ?? "" + let wp = lObj["wp"] as? String ?? "" + + if wp == "p" { + punctuationCount += 1 + if resultTextTemp.isEmpty { + continue + } + } else { + wordCount += 1 + } + resultTextTemp += w + } + } + } + + if ls && wordCount == 0 && punctuationCount == 1 { + return + } + + let detectedLanguage = detectLanguage(from: resultTextTemp) + + let type = st["type"] as? String + let typeInt = st["type"] as? Int ?? Int(type ?? "") ?? -1 + + if typeInt == 0 { + callback?.onResult(sessionid: currentSessionId, resultTextTemp, detectedLanguage) + currentSessionId = "" + lastIntermediateResult = "" + } else { + if currentSessionId.isEmpty { + currentSessionId = UUID().uuidString + callback?.onSessionStarted(sessionid: currentSessionId) + } + lastIntermediateResult = resultTextTemp + callback?.onRecognizing(sessionid: currentSessionId, resultTextTemp, detectedLanguage) + } + } + + private func detectLanguage(from text: String) -> String { + if isAutoDetectLanguage { + if text.range(of: "[\\u4e00-\\u9fa5]", options: .regularExpression) != nil { + return "zh-CN" + } else { + return "en-US" + } + } else { + return currentLanguage + } + } + + private func getWebSocketUrl() -> String { + let baseWsUrl = "wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1" + + var params: [String: String] = [:] + params["audio_encode"] = "pcm_s16le" + params["lang"] = "autodialect" + params["samplerate"] = "16000" + params["accessKeyId"] = accessKeyId + params["appId"] = appId + params["utc"] = getUtcTime() + + let signature = calculateSignature(params: params) + params["signature"] = signature + + var urlComponents = URLComponents(string: baseWsUrl) + urlComponents?.queryItems = params.map { URLQueryItem(name: $0.key, value: $0.value) } + + return urlComponents?.url?.absoluteString ?? baseWsUrl + } + + private func getUtcTime() -> String { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" + dateFormatter.timeZone = TimeZone(secondsFromGMT: 8 * 3600) // GMT+8 + return dateFormatter.string(from: Date()) + } + + private func calculateSignature(params: [String: String]) -> String { + let sortedKeys = params.keys.sorted() + var baseStr = "" + var first = true + + for key in sortedKeys { + if key == "signature" { continue } + guard let value = params[key], !value.isEmpty else { continue } + + if !first { + baseStr += "&" + } + + let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? key + let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? value + + baseStr += "\(encodedKey)=\(encodedValue)" + first = false + } + + let keyData = accessKeySecret.data(using: .utf8)! + let msgData = baseStr.data(using: .utf8)! + + if #available(iOS 13.0, *) { + let authentication = HMAC.authenticationCode(for: msgData, using: SymmetricKey(data: keyData)) + return Data(authentication).base64EncodedString() + } else { + return "" + } + } +} From fa0116a1b568fb7e38c5255b25d55e26287dc631 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 10 Dec 2025 17:44:42 +0800 Subject: [PATCH 149/177] =?UTF-8?q?feat(i18n):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B9=B6=E5=AE=8C=E5=96=84=E7=BF=BB=E8=AF=91=E9=94=AE=E5=92=8C?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加用量统计模块的翻译键和文本 完善图片翻译模块的国际化支持 统一各模块的时间范围和统计项翻译 更新翻译控制器和视图以使用翻译键 --- lib/core/translations/language/en_us.dart | 110 ++++++++++ lib/core/translations/language/zh_cn.dart | 102 ++++++++++ lib/data/models/translation_usage_stats.dart | 41 ++-- .../common/widgets/language_selector_bar.dart | 2 +- .../common/widgets/recharge_dialog.dart | 8 +- .../controllers/meeting_home_controller.dart | 3 +- .../picture_translation_controller.dart | 87 ++++++-- ...cture_translation_history_detail_view.dart | 60 +++--- .../views/picture_translation_view.dart | 192 +++++++++--------- .../text_translation_controller.dart | 8 +- .../views/text_translation_view.dart | 8 +- .../translation_middleware_controller.dart | 2 +- .../dialogs/language_selection_dialog.dart | 8 +- .../translation/views/translation_view.dart | 4 +- .../widgets/translation_item_widget.dart | 4 +- .../controllers/meeting_stats_controller.dart | 72 ++++--- .../translation_stats_controller.dart | 34 ++-- .../usage/views/aichat_stats_view.dart | 4 +- .../usage/views/meeting_stats_view.dart | 22 +- .../usage/views/translation_stats_view.dart | 76 +++---- lib/modules/usage/views/usage_view.dart | 2 +- 21 files changed, 571 insertions(+), 278 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 15c5c1829..3868f975a 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -186,6 +186,52 @@ const Map enUS = { "usageStatsInfo": "View Your Usage Statistics", "scene": "Scenarios", + /// 用量统计模块 + "aiChat": "AI Chat", + "translationStats": "Translation Statistics", + "meetingStats": "Meeting Statistics", + "today": "Today", + "thisWeek": "This Week", + "thisMonth": "This Month", + "history": "History", + "currentSessionStats": "Current Session Stats", + "translationCount": "Translation Count", + "sessionDuration": "Session Duration", + "characters": "Characters", + "recordingDuration": "Recording Duration", + "totalApiCalls": "Total API Calls", + "sessionCount": "Session Count", + "totalCharacters": "Total Characters", + "apiCallStats": "API Call Stats", + "translationApi": "Translation API", + "asr": "ASR", + "tts": "TTS", + // "aiSummary": "AI Summary", + "dataVolumeStats": "Data Volume Stats", + "sourceTextCharacters": "Source Text Characters", + "ttsTextCharacters": "TTS Text Characters", + "effectiveAudioDuration": "Effective Audio Duration", + "totalSessionDuration": "Total Session Duration", + "costStats": "Cost Stats", + "estimatedCost": "Estimated Cost", + "dailyCostThreshold": "Daily Cost Threshold", + "monthlyCostThreshold": "Monthly Cost Threshold", + "usageBehaviorStats": "Usage Behavior Stats", + "mostUsedLanguagePair": "Most-used language pair", + "mostUsedMode": "Most-used mode", + "asrApiCalls": "ASR Calls", + "totalAudioDuration": "Total Audio Duration", + "audioFileSize": "Audio File Size", + "transcriptBytes": "Transcript Bytes", + //通知文案 + "loadFailed": "Load Failed", + "statsLoadFailedTryLater": + "Statistics failed to load. Please try again later.", + "cleanupComplete": "Cleanup Complete", + "cleanedOldData": "Cleaned data older than 90 days", + "exportFeature": "Export Feature", + "exportInDevelopment": "Data export is under development", + // 商品页面(AI/翻译/会议) 'availablePackages': 'Available Packages', 'remainingQuota': 'Remaining Quota', @@ -1150,6 +1196,7 @@ const Map enUS = { // 翻译主页 (translation_view.dart) "translationHistory": "Translation History", + "historyRecords": "History Records", "enableRecording": "Enable Recording", "viewAudioFiles": "View Audio Files", "headsetUser": "Headset User", @@ -1162,9 +1209,15 @@ const Map enUS = { // 通用对话按钮与选项(用于统一语言选择弹窗等) // 翻译键代表的中文文本内容:取消/确认/自动检测 "autoDetect": "Auto Detect", + // Text translation & language detection + "languageDetectionFailed": "Language detection failed", + "translationFailed": "Translation failed", + "pleaseInputText": "Please input text", + "textTooLong": "Text too long, max 5000 characters", // 翻译历史页 "noTranslationHistory": "No translation history", + "clearResults": "Clear Results", "clearHistory": "Clear History", "clearHistoryConfirm": "Are you sure you want to clear all translation history? This action cannot be undone.", @@ -1173,6 +1226,57 @@ const Map enUS = { "deleteSessionConfirm": "Are you sure you want to delete all translation records for this session? This action cannot be undone.", + // Picture Translation module + "selectImageSource": "Select Image Source", + "imagePreview": "Image Preview", + "translationResult": "Translation Result", + "recognitionResult": "Recognition Result", + "translatedImagePreview": "Translated Image Preview", + "translatedImageLoadFailed": "Failed to load translated image", + "pleaseSelectImage": "Please select an image", + "imageLoadFailed": "Image load failed", + "imageQuality": "Image Quality", + "maxSize": "Max Size", + "close": "Close", + "setImageQuality": "Set Image Quality", + "currentQuality": "Current quality: @value%", + "setMaxSize": "Set Max Size", + "currentMaxSize": "Current: @pxpx", + "waitingForAction": "Waiting for action", + "pleaseSelectImageToStart": "Please select an image to start", + "chooseImage": "Choose Image", + "openingCamera": "Opening camera...", + "openingPhotoAlbum": "Opening photo album...", + "cancelled": "Cancelled", + "userCancelledSelection": "User cancelled selection", + "translatingImage": "Translating Image", + "callingImageTranslateService": "Calling image translation service...", + "savingRecord": "Saving Record", + "savingTranslationResult": "Saving translation result...", + "translationCompleted": "Translation Completed", + "allStepsCompleted": "All steps completed", + "processingFailed": "Processing Failed", + "imageProcessingOrTranslationFailed": + "Image processing or translation failed. Please retry.\nError: {error}", + "imageTooLarge": "Image size exceeds 4MB limit", + "imageTooLargeHint": + "Image size exceeds 4MB. Reduce quality or dimensions and retry", + "emptyTranslationResult": "Image translation API returned empty result", + "imageTranslationFailedTryLater": + "Image translation failed. Network issue or rate limit. Please try later", + "imageTranslationApiException": + "Image translation API exception. Check network and retry", + "permissionRequired": "Permission Required", + "cameraPermissionRequired": "Camera permission required to take photos", + "photoAlbumPermissionRequired": + "Photo album permission required to pick images", + "translationDetails": "Translation Details", + "originalImage": "Original Image", + "sourceLanguage": "Source Language", + "targetLanguage": "Target Language", + "translationTime": "Translation Time", + "shareInDevelopment": "Sharing feature under development", + // 翻译录音文件列表页 "translateAudioFiles": "Translate Audio Files", "noAudioFiles": "No audio files", @@ -1382,6 +1486,9 @@ const Map enUS = { "justNow": "Just now", "minutesAgo": "@minutes minutes ago", "yesterday": "Yesterday", + // Time extensions (used by picture translation) + "daysAgo": "@days days ago", + "hoursAgo": "@hours hours ago", //补充 "insufficientIntegral": "Insufficient integral", @@ -1390,4 +1497,7 @@ const Map enUS = { "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', "recharge": 'Go to Recharge', + // 会员到期提示(中文注释) + "aiMemberExpiredDesc": + 'AI membership expired, please go to the membership recharge page to renew.', }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 2b5504527..64db2449d 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -179,6 +179,50 @@ const Map zhCN = { "usageStats": "用量统计", "usageStatsInfo": "查看您的使用统计数据", "scene": "场景", + // 用量统计模块 + "aiChat": "AI聊天", + "translationStats": "翻译统计", + "meetingStats": "会议统计", + "today": "今日", + "thisWeek": "本周", + "thisMonth": "本月", + "history": "历史", + "currentSessionStats": "当前会话统计", + "translationCount": "翻译次数", + "sessionDuration": "会话时长", + "characters": "字符数", + "recordingDuration": "录音时长", + "totalApiCalls": "总调用次数", + "sessionCount": "会话数量", + "totalCharacters": "总字符数", + "apiCallStats": "API调用统计", + "translationApi": "翻译API", + "asr": "语音识别", + "tts": "语音合成", + //"aiSummary": "AI摘要", + "dataVolumeStats": "数据量统计", + "sourceTextCharacters": "源文本字符", + "ttsTextCharacters": "TTS文本字符", + "effectiveAudioDuration": "有效音频时长", + "totalSessionDuration": "总会话时长", + "costStats": "成本统计", + "estimatedCost": "预估成本", + "dailyCostThreshold": "日成本预警阈值", + "monthlyCostThreshold": "月成本预警阈值", + "usageBehaviorStats": "使用行为统计", + "mostUsedLanguagePair": "最常用语言对", + "mostUsedMode": "最常用模式", + "asrApiCalls": "ASR调用次数", + "totalAudioDuration": "音频总时长", + "audioFileSize": "音频文件大小", + "transcriptBytes": "转写字节", + // 通知文案 + "loadFailed": "加载失败", + "statsLoadFailedTryLater": "统计数据加载失败,请稍后重试", + "cleanupComplete": "清理完成", + "cleanedOldData": "已清理90天前的过期数据", + "exportFeature": "导出功能", + "exportInDevelopment": "数据导出功能正在开发中", // 商品页面(AI/翻译/会议) 'availablePackages': '可购买套餐', @@ -1067,15 +1111,68 @@ const Map zhCN = { // 通用对话按钮与选项(用于统一语言选择弹窗等) // 以下翻译键的中文文本内容如注释所示 "autoDetect": "自动检测", // 自动检测 + // 文本翻译与语种检测 + "languageDetectionFailed": "语言检测失败", + "translationFailed": "翻译失败", + "pleaseInputText": "请输入文本", + "textTooLong": "文本过长,最多5000字符", // 翻译历史页 "noTranslationHistory": "暂无历史记录", + "historyRecords": "历史记录", + "clearResults": "清空结果", "clearHistory": "清除历史记录", "clearHistoryConfirm": "确定要清除所有翻译历史记录吗?此操作无法撤销。", "unknownLanguage": "未知语言", "deleteSessionRecord": "删除会话记录", "deleteSessionConfirm": "确定要删除该会话的所有翻译记录吗?此操作无法撤销。", + // 图片翻译模块(Picture Translation) + "selectImageSource": "选择图片来源", + "imagePreview": "图片预览", + "translationResult": "翻译结果", + "recognitionResult": "识别结果", + "translatedImagePreview": "翻译后的图片预览", + "translatedImageLoadFailed": "翻译图片加载失败", + "pleaseSelectImage": "请选择图片", + "imageLoadFailed": "图片加载失败", + "imageQuality": "图片质量", + "maxSize": "最大尺寸", + "close": "关闭", + "setImageQuality": "设置图片质量", + "currentQuality": "当前质量: @value%", + "setMaxSize": "设置最大尺寸", + "currentMaxSize": "当前: @pxpx", + "waitingForAction": "等待操作", + "pleaseSelectImageToStart": "请选择图片开始翻译", + "chooseImage": "选择图片", + "openingCamera": "正在打开相机...", + "openingPhotoAlbum": "正在打开相册...", + "cancelled": "已取消", + "userCancelledSelection": "用户取消了选择", + "translatingImage": "翻译图片", + "callingImageTranslateService": "正在调用图片翻译服务...", + "savingRecord": "保存记录", + "savingTranslationResult": "正在保存翻译结果...", + "translationCompleted": "翻译完成", + "allStepsCompleted": "所有步骤已完成", + "processingFailed": "处理失败", + "imageProcessingOrTranslationFailed": "图片处理或翻译失败,请重试。\n错误信息: {error}", + "imageTooLarge": "图片大小超过4MB限制", + "imageTooLargeHint": "图片大小超过4MB限制,请降低质量或尺寸后重试", + "emptyTranslationResult": "图片翻译接口返回空结果", + "imageTranslationFailedTryLater": "图片翻译失败,可能的原因:网络异常或接口限流,请稍后重试", + "imageTranslationApiException": "图片翻译接口调用异常,请检查网络后重试", + "permissionRequired": "权限需求", + "cameraPermissionRequired": "需要相机权限才能拍照", + "photoAlbumPermissionRequired": "需要相册权限才能选择图片", + "translationDetails": "翻译详情", + "originalImage": "原图片", + "sourceLanguage": "源语言", + "targetLanguage": "目标语言", + "translationTime": "翻译时间", + "shareInDevelopment": "分享功能开发中", + // 翻译录音文件列表页 "translateAudioFiles": "翻译录音文件", "noAudioFiles": "暂无音频文件", @@ -1266,6 +1363,9 @@ const Map zhCN = { "justNow": "刚刚", "minutesAgo": "@minutes分钟前", "yesterday": "昨天", + // 时间扩展(图片翻译模块使用) + "daysAgo": "@days天前", + "hoursAgo": "@hours小时前", //补充 "insufficientIntegral": "积分不足", @@ -1273,4 +1373,6 @@ const Map zhCN = { //余额不足弹窗 "insufficientBalanceDesc": "余额不足,请前往对应充值界面进行充值", "recharge": "前往充值", + // 会员到期提示 + "aiMemberExpiredDesc": "AI会员已到期,请前往会员充值续费", }; diff --git a/lib/data/models/translation_usage_stats.dart b/lib/data/models/translation_usage_stats.dart index 6d73b1958..db420c771 100644 --- a/lib/data/models/translation_usage_stats.dart +++ b/lib/data/models/translation_usage_stats.dart @@ -1,5 +1,3 @@ - - /// 翻译模式统计数据 class TranslationModeStats { final int apiCalls; // API调用次数 @@ -46,7 +44,8 @@ class TranslationModeStats { return TranslationModeStats( apiCalls: apiCalls ?? this.apiCalls, sourceCharacters: sourceCharacters ?? this.sourceCharacters, - effectiveAudioDuration: effectiveAudioDuration ?? this.effectiveAudioDuration, + effectiveAudioDuration: + effectiveAudioDuration ?? this.effectiveAudioDuration, ttsCharacters: ttsCharacters ?? this.ttsCharacters, cost: cost ?? this.cost, ); @@ -158,7 +157,7 @@ class TranslationUsageStats { final double estimatedCost; // 预估成本 final String currency; // 货币单位 final Map costBreakdown; // 成本分解(ASR/TTS/Translation) - + TranslationUsageStats({ required this.id, required this.date, @@ -196,7 +195,8 @@ class TranslationUsageStats { final languagePairStatsMap = {}; if (json['languagePairStats'] != null) { - final languagePairStatsJson = json['languagePairStats'] as Map; + final languagePairStatsJson = + json['languagePairStats'] as Map; languagePairStatsJson.forEach((key, value) { languagePairStatsMap[key] = LanguagePairStats.fromJson(value); }); @@ -219,9 +219,15 @@ class TranslationUsageStats { asrApiCalls: json['asrApiCalls'] ?? 0, ttsApiCalls: json['ttsApiCalls'] ?? 0, aiSummaryApiCalls: json['aiSummaryApiCalls'] ?? 0, - sourceTextCharacters: json['sourceTextCharacters'] ?? json['sourceCharacterCount'] ?? 0, // 兼容旧字段 - effectiveAudioDuration: json['effectiveAudioDuration'] ?? json['audioRecordingDuration'] ?? 0, // 兼容旧字段 - ttsTextCharacters: json['ttsTextCharacters'] ?? json['targetCharacterCount'] ?? 0, // 兼容旧字段 + sourceTextCharacters: json['sourceTextCharacters'] ?? + json['sourceCharacterCount'] ?? + 0, // 兼容旧字段 + effectiveAudioDuration: json['effectiveAudioDuration'] ?? + json['audioRecordingDuration'] ?? + 0, // 兼容旧字段 + ttsTextCharacters: json['ttsTextCharacters'] ?? + json['targetCharacterCount'] ?? + 0, // 兼容旧字段 totalSessionDuration: json['totalSessionDuration'] ?? 0, asrNetworkBytes: json['asrNetworkBytes'] ?? 0, ttsNetworkBytes: json['ttsNetworkBytes'] ?? 0, @@ -328,12 +334,14 @@ class TranslationUsageStats { ttsApiCalls: ttsApiCalls ?? this.ttsApiCalls, aiSummaryApiCalls: aiSummaryApiCalls ?? this.aiSummaryApiCalls, sourceTextCharacters: sourceTextCharacters ?? this.sourceTextCharacters, - effectiveAudioDuration: effectiveAudioDuration ?? this.effectiveAudioDuration, + effectiveAudioDuration: + effectiveAudioDuration ?? this.effectiveAudioDuration, ttsTextCharacters: ttsTextCharacters ?? this.ttsTextCharacters, totalSessionDuration: totalSessionDuration ?? this.totalSessionDuration, asrNetworkBytes: asrNetworkBytes ?? this.asrNetworkBytes, ttsNetworkBytes: ttsNetworkBytes ?? this.ttsNetworkBytes, - translationNetworkBytes: translationNetworkBytes ?? this.translationNetworkBytes, + translationNetworkBytes: + translationNetworkBytes ?? this.translationNetworkBytes, sessionCount: sessionCount ?? this.sessionCount, modeStats: modeStats ?? this.modeStats, languagePairStats: languagePairStats ?? this.languagePairStats, @@ -345,7 +353,8 @@ class TranslationUsageStats { } /// 获取总API调用次数 - int get totalApiCalls => translationApiCalls + asrApiCalls + ttsApiCalls + aiSummaryApiCalls; + int get totalApiCalls => + translationApiCalls + asrApiCalls + ttsApiCalls + aiSummaryApiCalls; /// 获取总字符数(精确计费基础) int get totalCharacterCount => sourceTextCharacters + ttsTextCharacters; @@ -354,19 +363,21 @@ class TranslationUsageStats { int get totalAudioDuration => effectiveAudioDuration + totalSessionDuration; /// 获取总网络流量 - int get totalNetworkBytes => asrNetworkBytes + ttsNetworkBytes + translationNetworkBytes; + int get totalNetworkBytes => + asrNetworkBytes + ttsNetworkBytes + translationNetworkBytes; /// 获取最常用的语言对 String get mostUsedLanguagePair { - if (languagePairStats.isEmpty) return '无数据'; + if (languagePairStats.isEmpty) return 'null'; return languagePairStats.entries - .reduce((a, b) => a.value.translationCount > b.value.translationCount ? a : b) + .reduce((a, b) => + a.value.translationCount > b.value.translationCount ? a : b) .key; } /// 获取最常用的翻译模式 String get mostUsedMode { - if (modeStats.isEmpty) return '无数据'; + if (modeStats.isEmpty) return 'null'; return modeStats.entries .reduce((a, b) => a.value.apiCalls > b.value.apiCalls ? a : b) .key; diff --git a/lib/modules/common/widgets/language_selector_bar.dart b/lib/modules/common/widgets/language_selector_bar.dart index 495a01a00..4b7878287 100644 --- a/lib/modules/common/widgets/language_selector_bar.dart +++ b/lib/modules/common/widgets/language_selector_bar.dart @@ -58,7 +58,7 @@ class LanguageSelectorBar extends StatelessWidget { isDarkMode ? AppColors.primary.withOpacity(0.2) : Colors.blue[50]; final swapIconColor = isDarkMode ? AppColors.primary : Colors.blue; - // 规范化特殊项的翻译键,例如:自动检测 -> autoDetect(翻译键代表的中文文本内容) + // 规范化特殊项的翻译键,例如:自动检测 -> autoDetect(对应中文:自动检测) String _normalizeKey(String text) { switch (text) { case '自动检测': diff --git a/lib/modules/common/widgets/recharge_dialog.dart b/lib/modules/common/widgets/recharge_dialog.dart index 1dd6562b4..b3f6d15b8 100644 --- a/lib/modules/common/widgets/recharge_dialog.dart +++ b/lib/modules/common/widgets/recharge_dialog.dart @@ -2,6 +2,9 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../routes/app_routes.dart'; +/// 显示充值弹窗 +/// [type] 充值类型,可选值为 'agent'、'translation'、'meeting' +/// 分别跳转对应ai充值、翻译充值、会议充值界面 void showRechargeDialog(String type) { Get.dialog( Dialog( @@ -24,7 +27,10 @@ void showRechargeDialog(String type) { ), const SizedBox(height: 12), Text( - 'insufficientBalanceDesc'.tr, //'余额不足,请前往对应充值界面进行充值', + (type == 'agent' + ? 'aiMemberExpiredDesc' + : 'insufficientBalanceDesc') + .tr, // 会员过期描述 / 余额不足描述 textAlign: TextAlign.center, ), const SizedBox(height: 20), diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index fcea611a4..7eaab1b26 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -410,7 +410,8 @@ class MeetingHomeController extends GetxController { Logger.error('importFailed' .tr .replaceAll('{filePath}', filePath) - .replaceAll('{error}', e.toString())); // 翻译键代表的中文文本内容 + .replaceAll('{error}', + e.toString())); // 对应中文:导入文件失败: {filePath}, error: {error} } } else { effectivePath = filePath; diff --git a/lib/modules/picture_translation/controllers/picture_translation_controller.dart b/lib/modules/picture_translation/controllers/picture_translation_controller.dart index 9f25c0350..abd55af47 100644 --- a/lib/modules/picture_translation/controllers/picture_translation_controller.dart +++ b/lib/modules/picture_translation/controllers/picture_translation_controller.dart @@ -34,8 +34,8 @@ class PictureTranslationController extends GetxController { final isProcessing = false.obs; final pickedImageFile = Rx(null); final currentStep = ProcessingStep( - title: '等待操作', - description: '请选择图片开始翻译', + title: 'waitingForAction'.tr, // 等待操作 + description: 'pleaseSelectImageToStart'.tr, // 请选择图片开始翻译 status: ProcessingStatus.idle, ).obs; @@ -152,13 +152,17 @@ class PictureTranslationController extends GetxController { if (source == ImageSource.camera) { final status = await Permission.camera.request(); if (!status.isGranted) { - Get.snackbar('权限需求', '需要相机权限才能拍照'); + Get.snackbar( + 'permissionRequired'.tr, // 权限需求 + 'cameraPermissionRequired'.tr); // 需要相机权限才能拍照 return false; } } else { final status = await Permission.photos.request(); if (!status.isGranted) { - Get.snackbar('权限需求', '需要相册权限才能选择图片'); + Get.snackbar( + 'permissionRequired'.tr, // 权限需求 + 'photoAlbumPermissionRequired'.tr); // 需要相册权限才能选择图片 return false; } } @@ -194,8 +198,10 @@ class PictureTranslationController extends GetxController { try { isProcessing.value = true; _updateStep( - '选择图片', - '正在打开${source == ImageSource.camera ? '相机' : '相册'}...', + 'chooseImage'.tr, // 选择图片 + (source == ImageSource.camera + ? 'openingCamera'.tr // 正在打开相机... + : 'openingPhotoAlbum'.tr), // 正在打开相册... ProcessingStatus.picking); final XFile? image = await _imagePicker.pickImage( @@ -206,7 +212,10 @@ class PictureTranslationController extends GetxController { ); if (image == null) { - _updateStep('已取消', '用户取消了选择', ProcessingStatus.idle); + _updateStep( + 'cancelled'.tr, // 已取消 + 'userCancelledSelection'.tr, // 用户取消了选择 + ProcessingStatus.idle); return; } @@ -217,23 +226,39 @@ class PictureTranslationController extends GetxController { pickedImageFile.value = file; // 直接调用图片翻译API(包含识别+回贴) - _updateStep('翻译图片', '正在调用图片翻译服务...', ProcessingStatus.translating, + _updateStep( + 'translatingImage'.tr, // 翻译图片 + 'callingImageTranslateService'.tr, // 正在调用图片翻译服务... + ProcessingStatus.translating, progress: 0.6); await _performImageTranslation(file); // 保存历史记录 if (sourceText.value.isNotEmpty && translatedText.value.isNotEmpty) { - _updateStep('保存记录', '正在保存翻译结果...', ProcessingStatus.saving, + _updateStep( + 'savingRecord'.tr, // 保存记录 + 'savingTranslationResult'.tr, // 正在保存翻译结果... + ProcessingStatus.saving, progress: 0.9); await _saveTranslationResult(file); } - _updateStep('翻译完成', '所有步骤已完成', ProcessingStatus.idle, progress: 1.0); + _updateStep( + 'translationCompleted'.tr, // 翻译完成 + 'allStepsCompleted'.tr, // 所有步骤已完成 + ProcessingStatus.idle, + progress: 1.0); } catch (e) { Logger.error('PictureTranslation', '处理失败: $e'); - _updateStep('处理失败', e.toString(), ProcessingStatus.error); - _showErrorDialog('处理失败', '图片处理或翻译失败,请重试。\n错误信息: $e'); + _updateStep( + 'processingFailed'.tr, // 处理失败 + e.toString(), + ProcessingStatus.error); + _showErrorDialog( + 'processingFailed'.tr, // 处理失败 + 'imageProcessingOrTranslationFailed'.tr.replaceAll( + '{error}', e.toString())); // 图片处理或翻译失败,请重试。错误信息: {error} } finally { isProcessing.value = false; } @@ -286,8 +311,13 @@ class PictureTranslationController extends GetxController { // 图片大小限制:4MB(文档要求) const int maxSize = 4 * 1024 * 1024; if (bytes.lengthInBytes > maxSize) { - _updateStep('处理失败', '图片大小超过4MB限制', ProcessingStatus.error); - _showErrorDialog('处理失败', '图片大小超过4MB限制,请降低质量或尺寸后重试'); + _updateStep( + 'processingFailed'.tr, // 处理失败 + 'imageTooLarge'.tr, // 图片大小超过4MB限制 + ProcessingStatus.error); + _showErrorDialog( + 'processingFailed'.tr, // 处理失败 + 'imageTooLargeHint'.tr); // 图片大小超过4MB限制,请降低质量或尺寸后重试 return; } @@ -301,8 +331,13 @@ class PictureTranslationController extends GetxController { ); if (result == null) { - _updateStep('处理失败', '图片翻译接口返回空结果', ProcessingStatus.error); - _showErrorDialog('处理失败', '图片翻译失败,可能的原因:网络异常或接口限流,请稍后重试'); + _updateStep( + 'processingFailed'.tr, // 处理失败 + 'emptyTranslationResult'.tr, // 图片翻译接口返回空结果 + ProcessingStatus.error); + _showErrorDialog( + 'processingFailed'.tr, // 处理失败 + 'imageTranslationFailedTryLater'.tr); // 失败原因提示 return; } @@ -322,8 +357,13 @@ class PictureTranslationController extends GetxController { } } catch (e) { Logger.error('PictureTranslation', '图片翻译调用失败: $e'); - _updateStep('处理失败', e.toString(), ProcessingStatus.error); - _showErrorDialog('处理失败', '图片翻译接口调用异常,请检查网络后重试'); + _updateStep( + 'processingFailed'.tr, // 处理失败 + e.toString(), + ProcessingStatus.error); + _showErrorDialog( + 'processingFailed'.tr, // 处理失败 + 'imageTranslationApiException'.tr); // 接口调用异常 } } @@ -362,7 +402,7 @@ class PictureTranslationController extends GetxController { actions: [ TextButton( onPressed: () => Get.back(), - child: const Text('确定'), + child: Text('confirm'.tr), // 确认 ), ], ), @@ -403,7 +443,9 @@ class PictureTranslationController extends GetxController { void copyText(String text) { if (text.isNotEmpty) { // 这里可以添加复制到剪切板的逻辑 - Get.snackbar('成功', '文本已复制到剪切板'); + Get.snackbar( + 'success'.tr, // 成功 + 'copied'.tr); // 已复制 } } @@ -413,6 +455,9 @@ class PictureTranslationController extends GetxController { translatedText.value = ''; translatedImageBytes.value = null; pickedImageFile.value = null; - _updateStep('等待操作', '请选择图片开始翻译', ProcessingStatus.idle); + _updateStep( + 'waitingForAction'.tr, // 等待操作 + 'pleaseSelectImageToStart'.tr, // 请选择图片开始翻译 + ProcessingStatus.idle); } } diff --git a/lib/modules/picture_translation/views/picture_translation_history_detail_view.dart b/lib/modules/picture_translation/views/picture_translation_history_detail_view.dart index b2fb50c8a..bf664acbc 100644 --- a/lib/modules/picture_translation/views/picture_translation_history_detail_view.dart +++ b/lib/modules/picture_translation/views/picture_translation_history_detail_view.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; +import 'package:intl/intl.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../../../core/theme/app_colors.dart'; @@ -20,8 +21,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; return Scaffold( - backgroundColor: - isDarkMode ? AppColors.darkBackground : Colors.grey[50], + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], appBar: AppBar( leading: IconButton( icon: Icon( @@ -32,7 +32,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { onPressed: () => Get.back(), ), centerTitle: true, - title: Text('翻译详情', + title: Text('translationDetails'.tr, // 翻译详情 style: TextStyle( color: isDarkMode ? AppColors.textPrimary : Colors.black87)), backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white, @@ -56,9 +56,15 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { SizedBox(height: 16.h), _buildLanguageInfo(), SizedBox(height: 16.h), - _buildTextSection('识别结果', item.sourceText, Colors.blue), + _buildTextSection( + 'recognitionResult'.tr, // 识别结果 + item.sourceText, + Colors.blue), SizedBox(height: 16.h), - _buildTextSection('翻译结果', item.translatedText, Colors.green), + _buildTextSection( + 'translationResult'.tr, // 翻译结果 + item.translatedText, + Colors.green), SizedBox(height: 16.h), _buildTimeInfo(), ], @@ -89,12 +95,11 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { Padding( padding: EdgeInsets.all(16.w), child: Text( - '原图片', + 'originalImage'.tr, // 原图片 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: - Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + color: Get.isDarkMode ? AppColors.textPrimary : Colors.black87, ), ), ), @@ -122,7 +127,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { size: 48.sp, color: AppColors.error), SizedBox(height: 8.h), Text( - '图片加载失败', + 'imageLoadFailed'.tr, // 图片加载失败 style: TextStyle( fontSize: 14.sp, color: AppColors.error), ), @@ -161,7 +166,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '源语言', + 'sourceLanguage'.tr, // 源语言 style: TextStyle( fontSize: 12.sp, color: Get.isDarkMode @@ -170,7 +175,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { ), SizedBox(height: 4.h), Text( - item.sourceLanguageName, + item.sourceLanguageName.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -187,7 +192,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( - '目标语言', + 'targetLanguage'.tr, // 目标语言 style: TextStyle( fontSize: 12.sp, color: Get.isDarkMode @@ -196,7 +201,7 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { ), SizedBox(height: 4.h), Text( - item.targetLanguageName, + item.targetLanguageName.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -245,11 +250,13 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { icon: Icon(Icons.copy, size: 20.sp, color: color), onPressed: () { Clipboard.setData(ClipboardData(text: content)); - Get.snackbar('成功', '已复制到剪切板'); + Get.snackbar( + 'success'.tr, // 成功 + 'copied'.tr); // 已复制 }, padding: EdgeInsets.zero, constraints: const BoxConstraints(), - tooltip: '复制', + tooltip: 'copy'.tr, // 复制 ), ], ), @@ -287,12 +294,11 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '翻译时间', + 'translationTime'.tr, // 翻译时间 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: - Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + color: Get.isDarkMode ? AppColors.textPrimary : Colors.black87, ), ), SizedBox(height: 8.h), @@ -300,7 +306,8 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { _formatDateTime(item.timestamp), style: TextStyle( fontSize: 14.sp, - color: Get.isDarkMode ? AppColors.textSecondary : Colors.grey[600], + color: + Get.isDarkMode ? AppColors.textSecondary : Colors.grey[600], ), ), ], @@ -309,17 +316,18 @@ class PictureTranslationHistoryDetailView extends StatelessWidget { } String _formatDateTime(DateTime dateTime) { - return '${dateTime.year}年${dateTime.month}月${dateTime.day}日 ' - '${dateTime.hour.toString().padLeft(2, '0')}:' - '${dateTime.minute.toString().padLeft(2, '0')}'; + return DateFormat('yyyy-MM-dd HH:mm').format(dateTime); } void _shareTranslation() { - final shareText = '原文:${item.sourceText}\n\n' - '译文:${item.translatedText}\n\n' - '翻译方向:${item.sourceLanguageName} → ${item.targetLanguageName}'; + final shareText = '${'originalText'.tr}:${item.sourceText}\n\n' // 原文 + '${'translatedText'.tr}:${item.translatedText}\n\n' // 译文 + '${'sourceLanguage'.tr}:${item.sourceLanguageName.tr} → ' // 源语言 + '${'targetLanguage'.tr}:${item.targetLanguageName.tr}'; // 目标语言 // 这里可以调用分享插件 - Get.snackbar('提示', '分享功能开发中'); + Get.snackbar( + 'tip'.tr, // 提示 + 'shareInDevelopment'.tr); // 分享功能开发中 } } diff --git a/lib/modules/picture_translation/views/picture_translation_view.dart b/lib/modules/picture_translation/views/picture_translation_view.dart index 491204cc0..b53acb156 100644 --- a/lib/modules/picture_translation/views/picture_translation_view.dart +++ b/lib/modules/picture_translation/views/picture_translation_view.dart @@ -21,8 +21,7 @@ class PictureTranslationView extends GetView { Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; return Scaffold( - backgroundColor: - isDarkMode ? AppColors.darkBackground : Colors.grey[50], + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], appBar: _buildAppBar(isDarkMode), body: SafeArea( child: Obx(() { @@ -85,7 +84,7 @@ class PictureTranslationView extends GetView { IconButton( icon: const Icon(Icons.history), onPressed: _showHistoryBottomSheet, - tooltip: 'historyRecords'.tr, //历史记录 + tooltip: 'historyRecords'.tr, // 历史记录 ), PopupMenuButton( onSelected: _handleMenuAction, @@ -157,12 +156,11 @@ class PictureTranslationView extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '选择图片来源'.tr, //选择图片来源 + 'selectImageSource'.tr, // 选择图片来源 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: - Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + color: Get.isDarkMode ? AppColors.textPrimary : Colors.black87, ), ), SizedBox(height: 12.h), @@ -277,12 +275,11 @@ class PictureTranslationView extends GetView { Padding( padding: EdgeInsets.all(16.w), child: Text( - '图片预览', + 'imagePreview'.tr, // 图片预览 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: - Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + color: Get.isDarkMode ? AppColors.textPrimary : Colors.black87, ), ), ), @@ -377,8 +374,7 @@ class PictureTranslationView extends GetView { ), ); case ProcessingStatus.error: - return Icon(Icons.error_outline, - color: AppColors.error, size: 20.sp); + return Icon(Icons.error_outline, color: AppColors.error, size: 20.sp); case ProcessingStatus.idle: return Icon(Icons.check_circle_outline, color: AppColors.success, size: 20.sp); @@ -423,25 +419,24 @@ class PictureTranslationView extends GetView { Padding( padding: EdgeInsets.all(16.w), child: Text( - '翻译结果', + 'translationResult'.tr, // 翻译结果 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, - color: - Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + color: Get.isDarkMode ? AppColors.textPrimary : Colors.black87, ), ), ), if (controller.sourceText.value.isNotEmpty) _buildTextCard( - '识别结果', + 'recognitionResult'.tr, // 识别结果 controller.sourceText.value, controller.sourceLanguageChineseName.value, Colors.blue, ), if (controller.translatedText.value.isNotEmpty) _buildTextCard( - '翻译结果', + 'translationResult'.tr, // 翻译结果 controller.translatedText.value, controller.targetLanguageChineseName.value, Colors.green, @@ -449,22 +444,22 @@ class PictureTranslationView extends GetView { if (controller.translatedImageBytes.value != null) ...[ Padding( padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Text( - '翻译后的图片预览', - style: TextStyle( - fontSize: 14.sp, - fontWeight: FontWeight.w600, - color: - Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + child: Text( + 'translatedImagePreview'.tr, // 翻译后的图片预览 + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: + Get.isDarkMode ? AppColors.textPrimary : Colors.black87, + ), ), ), - ), - SizedBox(height: 8.h), - Container( - height: 200.h, - margin: - EdgeInsets.symmetric(horizontal: 16.w).copyWith(bottom: 16.h), - decoration: BoxDecoration( + SizedBox(height: 8.h), + Container( + height: 200.h, + margin: + EdgeInsets.symmetric(horizontal: 16.w).copyWith(bottom: 16.h), + decoration: BoxDecoration( color: Get.isDarkMode ? AppColors.cardBackground : Colors.grey[100], @@ -491,7 +486,7 @@ class PictureTranslationView extends GetView { size: 48.sp, color: Colors.red[400]), SizedBox(height: 8.h), Text( - '翻译图片加载失败', + 'translatedImageLoadFailed'.tr, // 翻译图片加载失败 style: TextStyle( fontSize: 14.sp, color: Colors.red[600]), ), @@ -517,8 +512,8 @@ class PictureTranslationView extends GetView { decoration: BoxDecoration( color: color.withOpacity(Get.isDarkMode ? 0.15 : 0.05), borderRadius: BorderRadius.circular(8.r), - border: Border.all( - color: color.withOpacity(Get.isDarkMode ? 0.3 : 0.2)), + border: + Border.all(color: color.withOpacity(Get.isDarkMode ? 0.3 : 0.2)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -538,11 +533,11 @@ class PictureTranslationView extends GetView { icon: Icon(Icons.copy, size: 18.sp, color: color), onPressed: () { Clipboard.setData(ClipboardData(text: content)); - Get.snackbar('success'.tr, 'copied'.tr); // 翻译键代表的中文文本内容 + Get.snackbar('success'.tr, 'copied'.tr); // 对应中文:复制成功 }, padding: EdgeInsets.zero, constraints: const BoxConstraints(), - tooltip: 'copy'.tr, // 翻译键代表的中文文本内容 + tooltip: 'copy'.tr, // 复制 ), ], ), @@ -551,8 +546,7 @@ class PictureTranslationView extends GetView { content, style: TextStyle( fontSize: 15.sp, - color: - Get.isDarkMode ? Colors.white70 : Colors.black87, + color: Get.isDarkMode ? Colors.white70 : Colors.black87, height: 1.4), ), ], @@ -584,7 +578,7 @@ class PictureTranslationView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - 'translationHistory'.tr, // 翻译键代表的中文文本内容 + 'translationHistory'.tr, // 翻译历史 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -594,7 +588,7 @@ class PictureTranslationView extends GetView { ), TextButton( onPressed: _showHistoryBottomSheet, - child: Text('viewAll'.tr), // 翻译键代表的中文文本内容 + child: Text('viewAll'.tr), // 查看全部 ), ], ), @@ -604,7 +598,7 @@ class PictureTranslationView extends GetView { padding: EdgeInsets.symmetric(horizontal: 16.w).copyWith(bottom: 16.h), child: Text( - 'noTranslationHistory'.tr, // 翻译键代表的中文文本内容 + 'noTranslationHistory'.tr, // 暂无历史记录 style: TextStyle( fontSize: 14.sp, color: Get.isDarkMode @@ -629,8 +623,9 @@ class PictureTranslationView extends GetView { child: Container( width: 40.w, height: 40.w, - color: - Get.isDarkMode ? Colors.white.withOpacity(0.05) : Colors.grey[200], + color: Get.isDarkMode + ? Colors.white.withOpacity(0.05) + : Colors.grey[200], child: Icon(Icons.image, color: Get.isDarkMode ? Colors.white70 : Colors.grey[400]), ), @@ -642,18 +637,16 @@ class PictureTranslationView extends GetView { style: TextStyle(fontSize: 14.sp), ), subtitle: Text( - '${item.sourceLanguageName} → ${item.targetLanguageName}', + '${item.sourceLanguageName.tr} → ${item.targetLanguageName.tr}', // 源语言名/目标语言名 style: TextStyle( fontSize: 12.sp, - color: - Get.isDarkMode ? AppColors.textSecondary : Colors.grey[600]), + color: Get.isDarkMode ? AppColors.textSecondary : Colors.grey[600]), ), trailing: Text( _formatTime(item.timestamp), style: TextStyle( fontSize: 12.sp, - color: - Get.isDarkMode ? Colors.white54 : Colors.grey[500]), + color: Get.isDarkMode ? Colors.white54 : Colors.grey[500]), ), onTap: () => _showHistoryDetail(item), ); @@ -675,19 +668,16 @@ class PictureTranslationView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - 'translationHistory'.tr, // 翻译键代表的中文文本内容 + 'translationHistory'.tr, // 翻译历史 style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.bold, - color: Get.isDarkMode - ? AppColors.textPrimary - : null), + color: Get.isDarkMode ? AppColors.textPrimary : null), ), IconButton( onPressed: () => Get.back(), icon: Icon(Icons.close, - color: - Get.isDarkMode ? AppColors.textPrimary : null), + color: Get.isDarkMode ? AppColors.textPrimary : null), ), ], ), @@ -698,7 +688,7 @@ class PictureTranslationView extends GetView { if (controller.historyList.isEmpty) { return Center( child: Text( - 'noTranslationHistory'.tr, // 翻译键代表的中文文本内容 + 'noTranslationHistory'.tr, // 暂无历史记录 style: TextStyle( fontSize: 16.sp, color: Get.isDarkMode @@ -745,13 +735,18 @@ class PictureTranslationView extends GetView { final difference = now.difference(timestamp); if (difference.inDays > 0) { - return '${difference.inDays}天前'; + return 'daysAgo' + .tr + .replaceAll('@days', difference.inDays.toString()); // @days天前 } else if (difference.inHours > 0) { - return '${difference.inHours}小时前'; + return 'hoursAgo' + .tr + .replaceAll('@hours', difference.inHours.toString()); // @hours小时前 } else if (difference.inMinutes > 0) { - return '${difference.inMinutes}分钟前'; + return 'minutesAgo'.tr.replaceAll( + '@minutes', difference.inMinutes.toString()); // @minutes分钟前 } else { - return '刚刚'; + return 'justNow'.tr; // 刚刚 } } @@ -759,7 +754,7 @@ class PictureTranslationView extends GetView { Get.dialog( AlertDialog( backgroundColor: Get.isDarkMode ? Colors.grey[900] : Colors.white, - title: Text('设置', + title: Text('settings'.tr, // 设置 style: TextStyle( color: Get.isDarkMode ? Colors.white : Colors.black87)), content: Column( @@ -768,16 +763,17 @@ class PictureTranslationView extends GetView { ListTile( leading: Icon(Icons.photo_size_select_actual, color: Get.isDarkMode ? Colors.white : null), - title: Text('图片质量', + title: Text('imageQuality'.tr, // 图片质量 + style: TextStyle( + color: Get.isDarkMode ? Colors.white : Colors.black87)), + subtitle: Obx(() => Text( + 'currentQuality'.tr.replaceAll( + '@value', + controller.imageQuality.value + .toString()), // 当前质量: @value% style: TextStyle( color: - Get.isDarkMode ? Colors.white : Colors.black87)), - subtitle: - Obx(() => Text('当前: ${controller.imageQuality.value}%', - style: TextStyle( - color: Get.isDarkMode - ? Colors.white70 - : Colors.black54))), + Get.isDarkMode ? Colors.white70 : Colors.black54))), onTap: () { Get.back(); _showImageQualityDialog(); @@ -786,16 +782,15 @@ class PictureTranslationView extends GetView { ListTile( leading: Icon(Icons.photo_size_select_large, color: Get.isDarkMode ? Colors.white : null), - title: Text('最大尺寸', + title: Text('maxSize'.tr, // 最大尺寸 + style: TextStyle( + color: Get.isDarkMode ? Colors.white : Colors.black87)), + subtitle: Obx(() => Text( + 'currentMaxSize'.tr.replaceAll('@px', + controller.maxImageSize.value.toString()), // 当前: @pxpx style: TextStyle( color: - Get.isDarkMode ? Colors.white : Colors.black87)), - subtitle: - Obx(() => Text('当前: ${controller.maxImageSize.value}px', - style: TextStyle( - color: Get.isDarkMode - ? Colors.white70 - : Colors.black54))), + Get.isDarkMode ? Colors.white70 : Colors.black54))), onTap: () { Get.back(); _showImageSizeDialog(); @@ -806,7 +801,7 @@ class PictureTranslationView extends GetView { actions: [ TextButton( onPressed: () => Get.back(), - child: Text('关闭', + child: Text('close'.tr, // 关闭 style: TextStyle( color: Get.isDarkMode ? Colors.white70 : Colors.black54)), ), @@ -819,13 +814,17 @@ class PictureTranslationView extends GetView { Get.dialog( AlertDialog( backgroundColor: Get.isDarkMode ? Colors.grey[900] : Colors.white, - title: Text('设置图片质量', + title: Text('setImageQuality'.tr, // 设置图片质量 style: TextStyle( color: Get.isDarkMode ? Colors.white : Colors.black87)), content: Obx(() => Column( mainAxisSize: MainAxisSize.min, children: [ - Text('当前质量: ${controller.imageQuality.value}%', + Text( + 'currentQuality'.tr.replaceAll( + '@value', + controller.imageQuality.value + .toString()), // 当前质量: @value% style: TextStyle( color: Get.isDarkMode ? Colors.white70 : Colors.black54)), @@ -843,7 +842,7 @@ class PictureTranslationView extends GetView { actions: [ TextButton( onPressed: () => Get.back(), - child: Text('确定', + child: Text('confirm'.tr, // 确认 style: TextStyle( color: Get.isDarkMode ? Colors.white70 : Colors.black54)), ), @@ -857,7 +856,7 @@ class PictureTranslationView extends GetView { Get.dialog( AlertDialog( backgroundColor: Get.isDarkMode ? Colors.grey[900] : Colors.white, - title: Text('设置最大尺寸', + title: Text('setMaxSize'.tr, // 设置最大尺寸 style: TextStyle( color: Get.isDarkMode ? Colors.white : Colors.black87)), content: Column( @@ -879,7 +878,7 @@ class PictureTranslationView extends GetView { actions: [ TextButton( onPressed: () => Get.back(), - child: Text('取消', + child: Text('cancel'.tr, // 取消 style: TextStyle( color: Get.isDarkMode ? Colors.white70 : Colors.black54)), ), @@ -892,16 +891,16 @@ class PictureTranslationView extends GetView { Get.dialog( AlertDialog( backgroundColor: Get.isDarkMode ? Colors.grey[900] : Colors.white, - title: Text('清空历史', + title: Text('clearHistory'.tr, // 清除历史记录 style: TextStyle( color: Get.isDarkMode ? Colors.white : Colors.black87)), - content: Text('确定要清空所有翻译历史吗?此操作不可撤销。', + content: Text('clearHistoryConfirm'.tr, // 确定要清除所有翻译历史记录吗?此操作无法撤销。 style: TextStyle( color: Get.isDarkMode ? Colors.white70 : Colors.black54)), actions: [ TextButton( onPressed: () => Get.back(), - child: Text('取消', + child: Text('cancel'.tr, // 取消 style: TextStyle( color: Get.isDarkMode ? Colors.white70 : Colors.black54)), ), @@ -910,7 +909,8 @@ class PictureTranslationView extends GetView { controller.clearHistory(); Get.back(); }, - child: Text('确定', style: TextStyle(color: AppColors.error)), + child: Text('confirm'.tr, // 确认 + style: TextStyle(color: AppColors.error)), ), ], ), @@ -923,11 +923,10 @@ class PictureTranslationView extends GetView { height: 200.h, margin: EdgeInsets.symmetric(horizontal: 16.w).copyWith(bottom: 16.h), decoration: BoxDecoration( - color: - Get.isDarkMode ? AppColors.cardBackground : Colors.grey[100], + color: Get.isDarkMode ? AppColors.cardBackground : Colors.grey[100], borderRadius: BorderRadius.circular(8.r), - border: - Border.all(color: Get.isDarkMode ? Colors.white12 : Colors.grey[300]!), + border: Border.all( + color: Get.isDarkMode ? Colors.white12 : Colors.grey[300]!), ), child: file == null ? Center( @@ -936,10 +935,11 @@ class PictureTranslationView extends GetView { children: [ Icon(Icons.image_outlined, size: 48.sp, - color: Get.isDarkMode ? Colors.white54 : Colors.grey[400]), + color: + Get.isDarkMode ? Colors.white54 : Colors.grey[400]), SizedBox(height: 8.h), Text( - '请选择图片', + 'pleaseSelectImage'.tr, // 请选择图片 style: TextStyle( fontSize: 14.sp, color: Get.isDarkMode @@ -967,7 +967,7 @@ class PictureTranslationView extends GetView { size: 48.sp, color: Colors.red[400]), SizedBox(height: 8.h), Text( - '图片加载失败', + 'imageLoadFailed'.tr, // 图片加载失败 style: TextStyle( fontSize: 14.sp, color: Get.isDarkMode @@ -985,11 +985,15 @@ class PictureTranslationView extends GetView { } Widget _buildSourceTextBox() { - return _buildTextBox('识别结果', controller.sourceText.value); + return _buildTextBox( + 'recognitionResult'.tr, // 识别结果 + controller.sourceText.value); } Widget _buildTranslatedTextBox() { - return _buildTextBox('翻译结果', controller.translatedText.value); + return _buildTextBox( + 'translationResult'.tr, // 翻译结果 + controller.translatedText.value); } Widget _buildTextBox(String title, String content) { diff --git a/lib/modules/text_translation/controllers/text_translation_controller.dart b/lib/modules/text_translation/controllers/text_translation_controller.dart index 8b4b1ed5e..131a560f1 100644 --- a/lib/modules/text_translation/controllers/text_translation_controller.dart +++ b/lib/modules/text_translation/controllers/text_translation_controller.dart @@ -257,8 +257,8 @@ class TextTranslationController extends GetxController { if (detectedAsrCode == null || detectedAsrCode.isEmpty) { Logger.error('语种检测失败'); Get.snackbar( - 'error'.tr, // 翻译键代表的中文文本内容 - 'languageDetectionFailed'.tr, // 翻译键代表的中文文本内容 + 'error'.tr, // 错误 + 'languageDetectionFailed'.tr, // 语言检测失败 snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.9), colorText: Colors.white, @@ -288,8 +288,8 @@ class TextTranslationController extends GetxController { } catch (e) { Logger.error('翻译失败: $e'); Get.snackbar( - 'error'.tr, - 'translationFailed'.tr, + 'error'.tr, // 错误 + 'translationFailed'.tr, // 翻译失败 snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.9), colorText: Colors.white, diff --git a/lib/modules/text_translation/views/text_translation_view.dart b/lib/modules/text_translation/views/text_translation_view.dart index 723e3cd48..0c7dc317a 100644 --- a/lib/modules/text_translation/views/text_translation_view.dart +++ b/lib/modules/text_translation/views/text_translation_view.dart @@ -99,10 +99,12 @@ class TextTranslationView extends GetView { return LanguageSelectorBar( sourceText: () => controller.sourceLanguageChineseName.value, targetText: () => controller.targetLanguageChineseName.value, - onTapSource: () => controller.showLanguageSelector(isSourceLanguage: true), - onTapTarget: () => controller.showLanguageSelector(isSourceLanguage: false), + onTapSource: () => + controller.showLanguageSelector(isSourceLanguage: true), + onTapTarget: () => + controller.showLanguageSelector(isSourceLanguage: false), onSwap: controller.swapLanguages, - translateLanguageNames: true, // 翻译键代表的中文文本内容 + translateLanguageNames: true, // 是否翻译语言名称 fontSizeSp: 15, ); } diff --git a/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart b/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart index bf4202e54..ff336f4b7 100644 --- a/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart +++ b/lib/modules/translation/middleware/controllers/translation_middleware_controller.dart @@ -91,7 +91,7 @@ class TranslationMiddlewareController extends GetxController { void navigateToTranslationFeature(TranslationOption option) { // 不可用则提示用户连接设备 if (!isOptionEnabled(option)) { - // 翻译键代表的中文文本内容 + // 连接设备 / 请连接 Voitrans 设备 Get.snackbar('connectDevice'.tr, 'pleaseConnectDeepSoundDevice'.tr, // 连接设备 / 请连接 Voitrans 设备 snackPosition: SnackPosition.TOP, diff --git a/lib/modules/translation/views/dialogs/language_selection_dialog.dart b/lib/modules/translation/views/dialogs/language_selection_dialog.dart index 6bd5be25d..ccef8f120 100644 --- a/lib/modules/translation/views/dialogs/language_selection_dialog.dart +++ b/lib/modules/translation/views/dialogs/language_selection_dialog.dart @@ -65,8 +65,8 @@ class LanguageSelectionDialog { padding: EdgeInsets.symmetric(horizontal: 8.w), child: Text( isSource - ? 'selectSourceLanguage'.tr // 翻译键代表的中文文本内容 - : 'selectTargetLanguage'.tr, // 翻译键代表的中文文本内容 + ? 'selectSourceLanguage'.tr // 选择源语言 + : 'selectTargetLanguage'.tr, // 选择目标语言 style: TextStyle( fontSize: 18.sp, // 调整字号 fontWeight: FontWeight.w600, // 使用数字字重 @@ -94,7 +94,7 @@ class LanguageSelectionDialog { : displayLanguages[ hasAutoDetect ? index - 1 : index]; final displayText = isAutoDetectItem - ? 'autoDetect'.tr // 翻译键代表的中文文本内容 + ? 'autoDetect'.tr // 自动检测 : (translateLanguageNames ? valueText.tr : valueText); @@ -196,7 +196,7 @@ class LanguageSelectionDialog { child: TextButton( onPressed: () => Get.back(), child: Text( - 'cancel'.tr, // 翻译键代表的中文文本内容 + 'cancel'.tr, // 取消 style: TextStyle( color: isDarkMode ? const Color(0xFF6200EE) : Colors.blue, ), diff --git a/lib/modules/translation/views/translation_view.dart b/lib/modules/translation/views/translation_view.dart index 595126454..75df6b81b 100644 --- a/lib/modules/translation/views/translation_view.dart +++ b/lib/modules/translation/views/translation_view.dart @@ -314,7 +314,7 @@ class TranslationView extends GetView { onTapTarget: () => LanguageSelectionDialog.show(false, isDarkMode), onSwap: controller.swapLanguages, - translateLanguageNames: true, // 翻译键代表的中文文本内容 + translateLanguageNames: true, // 是否翻译语言名称 fontSizeSp: 15, targetSuffix: controller.currentMode.value == 'call' ? Icon( @@ -1019,7 +1019,7 @@ class TranslationView extends GetView { onTapSource: () => LanguageSelectionDialog.show(true, isDarkMode), onTapTarget: () => LanguageSelectionDialog.show(false, isDarkMode), onSwap: controller.swapLanguages, - translateLanguageNames: true, // 翻译键代表的中文文本内容 + translateLanguageNames: true, // 是否翻译语言名称 fontSizeSp: 15, ), ); diff --git a/lib/modules/translation/views/widgets/translation_item_widget.dart b/lib/modules/translation/views/widgets/translation_item_widget.dart index 56ae1b264..38840b00c 100644 --- a/lib/modules/translation/views/widgets/translation_item_widget.dart +++ b/lib/modules/translation/views/widgets/translation_item_widget.dart @@ -140,7 +140,7 @@ class TranslationItemWidget extends GetView { child: Container( padding: EdgeInsets.all(4.w), child: Tooltip( - message: 'copy'.tr, // 翻译键代表的中文文本内容 + message: 'copy'.tr, // 复制 child: Icon( Icons.copy, size: 20.sp, @@ -169,7 +169,7 @@ class TranslationItemWidget extends GetView { child: Container( padding: EdgeInsets.all(4.w), child: Tooltip( - message: 'delete'.tr, // 翻译键代表的中文文本内容 + message: 'delete'.tr, // 删除 child: Icon( Icons.delete_outline, size: 20.sp, diff --git a/lib/modules/usage/controllers/meeting_stats_controller.dart b/lib/modules/usage/controllers/meeting_stats_controller.dart index bbcb7f9f6..147c709c7 100644 --- a/lib/modules/usage/controllers/meeting_stats_controller.dart +++ b/lib/modules/usage/controllers/meeting_stats_controller.dart @@ -8,34 +8,32 @@ class MeetingStatsController extends GetxController { final isLoading = false.obs; final selectedTabIndex = 0.obs; - final selectedTimeRange = '今日'.obs; - - final Rx todayStats = - MeetingAsrHistoryStats( - userId: '', - allAsrCalls: 0, - allAudioSeconds: 0, - allAudioFileBytes: 0, - allTranscriptBytes: 0, - ).obs; - final Rx weekStats = - MeetingAsrHistoryStats( - userId: '', - allAsrCalls: 0, - allAudioSeconds: 0, - allAudioFileBytes: 0, - allTranscriptBytes: 0, - ).obs; - final Rx monthStats = - MeetingAsrHistoryStats( - userId: '', - allAsrCalls: 0, - allAudioSeconds: 0, - allAudioFileBytes: 0, - allTranscriptBytes: 0, - ).obs; - - final RxList historyDaily = [].obs; + final selectedTimeRange = 'today'.tr.obs; // 今日 + + final Rx todayStats = MeetingAsrHistoryStats( + userId: '', + allAsrCalls: 0, + allAudioSeconds: 0, + allAudioFileBytes: 0, + allTranscriptBytes: 0, + ).obs; + final Rx weekStats = MeetingAsrHistoryStats( + userId: '', + allAsrCalls: 0, + allAudioSeconds: 0, + allAudioFileBytes: 0, + allTranscriptBytes: 0, + ).obs; + final Rx monthStats = MeetingAsrHistoryStats( + userId: '', + allAsrCalls: 0, + allAudioSeconds: 0, + allAudioFileBytes: 0, + allTranscriptBytes: 0, + ).obs; + + final RxList historyDaily = + [].obs; @override void onInit() { @@ -72,7 +70,8 @@ class MeetingStatsController extends GetxController { final historyStart = now.subtract(const Duration(days: 7)); historyDaily.value = await _usageService.getMeetingHistoryStats( - startDate: DateTime(historyStart.year, historyStart.month, historyStart.day), + startDate: + DateTime(historyStart.year, historyStart.month, historyStart.day), endDate: DateTime(now.year, now.month, now.day), ); @@ -88,16 +87,16 @@ class MeetingStatsController extends GetxController { selectedTabIndex.value = index; switch (index) { case 0: - selectedTimeRange.value = '今日'; + selectedTimeRange.value = 'today'.tr; // 今日 break; case 1: - selectedTimeRange.value = '本周'; + selectedTimeRange.value = 'thisWeek'.tr; // 本周 break; case 2: - selectedTimeRange.value = '本月'; + selectedTimeRange.value = 'thisMonth'.tr; // 本月 break; case 3: - selectedTimeRange.value = '历史'; + selectedTimeRange.value = 'history'.tr; // 历史 break; } } @@ -117,15 +116,15 @@ class MeetingStatsController extends GetxController { String formatDuration(int seconds) { if (seconds < 60) { - return '$seconds秒'; + return '$seconds${'seconds'.tr}'; // 秒 } else if (seconds < 3600) { final minutes = seconds ~/ 60; final remainingSeconds = seconds % 60; - return '$minutes分$remainingSeconds秒'; + return '$minutes${'minutes'.tr}$remainingSeconds${'seconds'.tr}'; // 分钟秒 } else { final hours = seconds ~/ 3600; final minutes = (seconds % 3600) ~/ 60; - return '$hours小时$minutes分'; + return '$hours${'hours'.tr}$minutes${'minutes'.tr}'; // 小时分钟 } } @@ -149,4 +148,3 @@ class MeetingStatsController extends GetxController { await loadAllStats(); } } - diff --git a/lib/modules/usage/controllers/translation_stats_controller.dart b/lib/modules/usage/controllers/translation_stats_controller.dart index 099138941..7a3266136 100644 --- a/lib/modules/usage/controllers/translation_stats_controller.dart +++ b/lib/modules/usage/controllers/translation_stats_controller.dart @@ -9,7 +9,7 @@ class TranslationStatsController extends GetxController { final isLoading = false.obs; final selectedTabIndex = 0.obs; - final selectedTimeRange = '今日'.obs; + final selectedTimeRange = 'today'.tr.obs; // 今日 final Rx todayStats = TranslationUsageStats.empty('').obs; @@ -62,8 +62,8 @@ class TranslationStatsController extends GetxController { } catch (e) { Logger.error('加载统计数据失败: $e'); Get.snackbar( - '加载失败', - '统计数据加载失败,请稍后重试', + 'loadFailed'.tr, // 加载失败 + 'statsLoadFailedTryLater'.tr, // 统计数据加载失败,请稍后重试 snackPosition: SnackPosition.TOP, backgroundColor: Get.theme.colorScheme.error.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.error, @@ -180,7 +180,7 @@ class TranslationStatsController extends GetxController { switch (selectedTabIndex.value) { case 0: data.add({ - 'label': '今日', + 'label': 'today'.tr, // 今日 'apiCalls': todayStats.value.totalApiCalls, 'cost': 0.0, 'characters': todayStats.value.totalCharacterCount, @@ -188,7 +188,7 @@ class TranslationStatsController extends GetxController { break; case 1: data.add({ - 'label': '本周', + 'label': 'thisWeek'.tr, // 本周 'apiCalls': weekStats.value.totalApiCalls, 'cost': 0.0, 'characters': weekStats.value.totalCharacterCount, @@ -196,7 +196,7 @@ class TranslationStatsController extends GetxController { break; case 2: data.add({ - 'label': '本月', + 'label': 'thisMonth'.tr, // 本月 'apiCalls': monthStats.value.totalApiCalls, 'cost': 0.0, 'characters': monthStats.value.totalCharacterCount, @@ -222,16 +222,16 @@ class TranslationStatsController extends GetxController { switch (index) { case 0: - selectedTimeRange.value = '今日'; + selectedTimeRange.value = 'today'.tr; // 今日 break; case 1: - selectedTimeRange.value = '本周'; + selectedTimeRange.value = 'thisWeek'.tr; // 本周 break; case 2: - selectedTimeRange.value = '本月'; + selectedTimeRange.value = 'thisMonth'.tr; // 本月 break; case 3: - selectedTimeRange.value = '历史'; + selectedTimeRange.value = 'history'.tr; // 历史 break; } @@ -258,8 +258,8 @@ class TranslationStatsController extends GetxController { void cleanupOldData() { _usageService.cleanupOldData(); Get.snackbar( - '清理完成', - '已清理90天前的过期数据', + 'cleanupComplete'.tr, // 清理完成 + 'cleanedOldData'.tr, // 已清理90天前的过期数据 snackPosition: SnackPosition.TOP, backgroundColor: Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, @@ -269,8 +269,8 @@ class TranslationStatsController extends GetxController { Future exportStats() async { try { Get.snackbar( - '导出功能', - '数据导出功能正在开发中', + 'exportFeature'.tr, // 导出功能 + 'exportInDevelopment'.tr, // 数据导出功能正在开发中 snackPosition: SnackPosition.TOP, backgroundColor: Get.theme.colorScheme.primary.withValues(alpha: 0.1), colorText: Get.theme.colorScheme.primary, @@ -282,15 +282,15 @@ class TranslationStatsController extends GetxController { String formatDuration(int seconds) { if (seconds < 60) { - return '$seconds秒'; + return '$seconds${'seconds'.tr}'; // 秒 } else if (seconds < 3600) { final minutes = seconds ~/ 60; final remainingSeconds = seconds % 60; - return '$minutes分$remainingSeconds秒'; + return '$minutes${'minutes'.tr}$remainingSeconds${'seconds'.tr}'; // 分钟秒 } else { final hours = seconds ~/ 3600; final minutes = (seconds % 3600) ~/ 60; - return '$hours小时$minutes分'; + return '$hours${'hours'.tr}$minutes${'minutes'.tr}'; // 小时分钟 } } diff --git a/lib/modules/usage/views/aichat_stats_view.dart b/lib/modules/usage/views/aichat_stats_view.dart index a04fe6c44..728bc180f 100644 --- a/lib/modules/usage/views/aichat_stats_view.dart +++ b/lib/modules/usage/views/aichat_stats_view.dart @@ -29,7 +29,7 @@ class AiChatStatsView extends GetView { backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, title: Text( - 'AI chat', + 'aiChat'.tr, // AI聊天 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -70,7 +70,7 @@ class AiChatStatsView extends GetView { SizedBox(width: 8.w), Expanded( child: Text( - 'AI聊天积分', + 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/usage/views/meeting_stats_view.dart b/lib/modules/usage/views/meeting_stats_view.dart index 63ea4897a..140a40447 100644 --- a/lib/modules/usage/views/meeting_stats_view.dart +++ b/lib/modules/usage/views/meeting_stats_view.dart @@ -31,7 +31,7 @@ class MeetingStatsView extends GetView { backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, title: Text( - '会议统计', + 'meetingStats'.tr, // 会议统计 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -91,7 +91,7 @@ class MeetingStatsView extends GetView { SizedBox(width: 8.w), Expanded( child: Text( - '会议积分', + 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -127,10 +127,10 @@ class MeetingStatsView extends GetView { ), child: Obx(() => Row( children: [ - _buildTimeRangeTab('今日', 0, isDarkMode), - _buildTimeRangeTab('本周', 1, isDarkMode), - _buildTimeRangeTab('本月', 2, isDarkMode), - _buildTimeRangeTab('历史', 3, isDarkMode), + _buildTimeRangeTab('today'.tr, 0, isDarkMode), // 今日 + _buildTimeRangeTab('thisWeek'.tr, 1, isDarkMode), // 本周 + _buildTimeRangeTab('thisMonth'.tr, 2, isDarkMode), // 本月 + _buildTimeRangeTab('history'.tr, 3, isDarkMode), // 历史 ], )), ); @@ -186,7 +186,7 @@ class MeetingStatsView extends GetView { Icon(Icons.dashboard, color: AppColors.primary, size: 20.sp), SizedBox(width: 8.w), Obx(() => Text( - '${controller.selectedTimeRange.value}概览', + '${controller.selectedTimeRange.value}${'overview'.tr}', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -199,13 +199,13 @@ class MeetingStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - 'ASR调用次数', + 'asrApiCalls'.tr, // ASR调用次数 controller.formatNumber(stats.allAsrCalls), Icons.api, isDarkMode)), Expanded( child: _buildStatItem( - '音频总时长', + 'totalAudioDuration'.tr, // 音频总时长 controller.formatDuration(stats.allAudioSeconds), Icons.mic, isDarkMode)), @@ -216,13 +216,13 @@ class MeetingStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '音频文件大小', + 'audioFileSize'.tr, // 音频文件大小 controller.formatBytes(stats.allAudioFileBytes), Icons.folder, isDarkMode)), Expanded( child: _buildStatItem( - '转写字节', + 'transcriptBytes'.tr, // 转写字节 controller.formatNumber(stats.allTranscriptBytes), Icons.text_snippet, isDarkMode)), diff --git a/lib/modules/usage/views/translation_stats_view.dart b/lib/modules/usage/views/translation_stats_view.dart index 6fc3c706c..3600000b0 100644 --- a/lib/modules/usage/views/translation_stats_view.dart +++ b/lib/modules/usage/views/translation_stats_view.dart @@ -36,7 +36,7 @@ class TranslationStatsView extends GetView { title: GestureDetector( onTap: controller.onTitleTap, child: Text( - '翻译统计', + 'translationStats'.tr, // style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -143,7 +143,7 @@ class TranslationStatsView extends GetView { SizedBox(width: 8.w), Expanded( child: Text( - '翻译积分', + 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -180,10 +180,10 @@ class TranslationStatsView extends GetView { ), child: Obx(() => Row( children: [ - _buildTimeRangeTab('今日', 0, isDarkMode), - _buildTimeRangeTab('本周', 1, isDarkMode), - _buildTimeRangeTab('本月', 2, isDarkMode), - _buildTimeRangeTab('历史', 3, isDarkMode), + _buildTimeRangeTab('today'.tr, 0, isDarkMode), // 今日 + _buildTimeRangeTab('thisWeek'.tr, 1, isDarkMode), // 本周 + _buildTimeRangeTab('thisMonth'.tr, 2, isDarkMode), // 本月 + _buildTimeRangeTab('history'.tr, 3, isDarkMode), // 历史 ], )), ); @@ -245,7 +245,7 @@ class TranslationStatsView extends GetView { ), SizedBox(width: 8.w), Text( - '当前会话统计', + 'currentSessionStats'.tr, // 当前会话统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -259,7 +259,7 @@ class TranslationStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '翻译次数', + 'translationCount'.tr, // 翻译次数 controller.realtimeStats.translationCount.toString(), Icons.translate, isDarkMode, @@ -267,8 +267,8 @@ class TranslationStatsView extends GetView { ), Expanded( child: _buildStatItem( - '会话时长', - '${controller.realtimeStats.sessionDurationMinutes}分钟', + 'sessionDuration'.tr, // 会话时长 + '${controller.realtimeStats.sessionDurationMinutes}${'minutes'.tr}', Icons.timer, isDarkMode, ), @@ -280,7 +280,7 @@ class TranslationStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '字符数', + 'characters'.tr, // 字符数 controller.formatNumber( controller.realtimeStats.sourceCharacters + controller.realtimeStats.targetCharacters, @@ -291,7 +291,7 @@ class TranslationStatsView extends GetView { ), Expanded( child: _buildStatItem( - '录音时长', + 'recordingDuration'.tr, // 录音时长 controller.formatDuration( controller.realtimeStats.recordingDuration), Icons.mic, @@ -331,7 +331,7 @@ class TranslationStatsView extends GetView { ), SizedBox(width: 8.w), Obx(() => Text( - '${controller.selectedTimeRange.value}概览', + '${controller.selectedTimeRange.value}${'overview'.tr}', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -345,7 +345,7 @@ class TranslationStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '总调用次数', + 'totalApiCalls'.tr, // 总调用次数 controller .formatNumber(controller.currentStats.totalApiCalls), Icons.api, @@ -359,7 +359,7 @@ class TranslationStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '会话数量', + 'sessionCount'.tr, // 会话数量 controller.currentStats.sessionCount.toString(), Icons.chat, isDarkMode, @@ -367,7 +367,7 @@ class TranslationStatsView extends GetView { ), Expanded( child: _buildStatItem( - '总字符数', + 'totalCharacters'.tr, // 总字符数 controller.formatNumber( controller.currentStats.totalCharacterCount), Icons.text_snippet, @@ -437,7 +437,7 @@ class TranslationStatsView extends GetView { ), SizedBox(width: 8.w), Text( - 'API调用统计', + 'apiCallStats'.tr, // API调用统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -450,19 +450,25 @@ class TranslationStatsView extends GetView { Obx(() => Column( children: [ _buildApiCallRow( - '翻译API', + 'translationApi'.tr, // 翻译API controller.currentStats.translationApiCalls, Icons.translate, isDarkMode), SizedBox(height: 12.h), - _buildApiCallRow('语音识别', controller.currentStats.asrApiCalls, - Icons.mic, isDarkMode), + _buildApiCallRow( + 'asr'.tr, + controller.currentStats.asrApiCalls, + Icons.mic, + isDarkMode), SizedBox(height: 12.h), - _buildApiCallRow('语音合成', controller.currentStats.ttsApiCalls, - Icons.volume_up, isDarkMode), + _buildApiCallRow( + 'tts'.tr, + controller.currentStats.ttsApiCalls, + Icons.volume_up, + isDarkMode), SizedBox(height: 12.h), _buildApiCallRow( - 'AI摘要', + 'aiSummary'.tr, // AI总结 controller.currentStats.aiSummaryApiCalls, Icons.summarize, isDarkMode), @@ -530,7 +536,7 @@ class TranslationStatsView extends GetView { ), SizedBox(width: 8.w), Text( - '数据量统计', + 'dataVolumeStats'.tr, // 数据量统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -546,7 +552,7 @@ class TranslationStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '源文本字符', + 'sourceTextCharacters'.tr, // 源文本字符 controller.formatNumber( controller.currentStats.sourceTextCharacters), Icons.text_fields, @@ -555,7 +561,7 @@ class TranslationStatsView extends GetView { ), Expanded( child: _buildStatItem( - 'TTS文本字符', + 'ttsTextCharacters'.tr, // TTS文本字符 controller.formatNumber( controller.currentStats.ttsTextCharacters), Icons.translate, @@ -569,7 +575,7 @@ class TranslationStatsView extends GetView { children: [ Expanded( child: _buildStatItem( - '有效音频时长', + 'effectiveAudioDuration'.tr, // 有效音频时长 controller.formatDuration( controller.currentStats.effectiveAudioDuration), Icons.mic, @@ -578,7 +584,7 @@ class TranslationStatsView extends GetView { ), Expanded( child: _buildStatItem( - '总会话时长', + 'totalSessionDuration'.tr, // 总会话时长 controller.formatDuration( controller.currentStats.totalSessionDuration), Icons.volume_up, @@ -620,7 +626,7 @@ class TranslationStatsView extends GetView { ), SizedBox(width: 8.w), Text( - '成本统计', + 'costStats'.tr, // 成本统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -642,7 +648,7 @@ class TranslationStatsView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${controller.selectedTimeRange.value}预估成本', + '${controller.selectedTimeRange.value}${'estimatedCost'.tr}', style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w500, @@ -666,7 +672,7 @@ class TranslationStatsView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '日成本预警阈值', + 'dailyCostThreshold'.tr, // 日成本预警阈值 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, @@ -687,7 +693,7 @@ class TranslationStatsView extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '月成本预警阈值', + 'monthlyCostThreshold'.tr, // 月成本预警阈值 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, @@ -736,7 +742,7 @@ class TranslationStatsView extends GetView { ), SizedBox(width: 8.w), Text( - '使用行为统计', + 'usageBehaviorStats'.tr, // 使用行为统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -749,14 +755,14 @@ class TranslationStatsView extends GetView { Obx(() => Column( children: [ _buildUsageBehaviorRow( - '最常用语言对', + 'mostUsedLanguagePair'.tr, // 最常用语言对 controller.currentStats.mostUsedLanguagePair, Icons.language, isDarkMode, ), SizedBox(height: 12.h), _buildUsageBehaviorRow( - '最常用模式', + 'mostUsedMode'.tr, // 最常用模式 controller.currentStats.mostUsedMode, Icons.settings, isDarkMode, diff --git a/lib/modules/usage/views/usage_view.dart b/lib/modules/usage/views/usage_view.dart index 814b64ad3..7bf1c8ead 100644 --- a/lib/modules/usage/views/usage_view.dart +++ b/lib/modules/usage/views/usage_view.dart @@ -43,7 +43,7 @@ class UsageView extends GetView { // 4. 使用生成的导航项 items: (controller.showAiChat.value ? const [ - _NavItem(Icons.chat_bubble_outline, 'AI chat'), + _NavItem(Icons.chat_bubble_outline, 'aiChat'), _NavItem(Icons.translate, 'interpretation'), _NavItem(Icons.people, 'meeting'), ] From 08199b76336445a80e546b615cca1fe92e1b5c1d Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 10 Dec 2025 17:46:40 +0800 Subject: [PATCH 150/177] =?UTF-8?q?refactor(azure=5Fspeech):=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E4=B8=AD=E8=8B=B1=E6=96=87=E8=AF=AD=E9=9F=B3=E8=AF=86?= =?UTF-8?q?=E5=88=ABasr=E4=BD=BF=E7=94=A8=E8=AE=AF=E9=A3=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt | 2 +- .../ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index a7fc47c20..a7e61644f 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -114,7 +114,7 @@ class AzureAsrHelper(private val context: Context) { this.supportedLanguages = supportedLanguages } - this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } + // this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 this.isAutoDetectLanguage = supportedLanguages.size >= 2 diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift index a2a5063bd..25447f8a9 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift @@ -116,7 +116,7 @@ public class AzureAsrHelper: NSObject { } // 检查是否只包含中文或英文,如果是则使用讯飞 - self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } + // self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 self.isAutoDetectLanguage = supportedLanguages.count >= 2 From 886cf6a93c81a1d1fc2c13d001c70f3ef565eb4c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 10 Dec 2025 18:45:43 +0800 Subject: [PATCH 151/177] =?UTF-8?q?Revert=20"refactor(azure=5Fspeech):=20?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E4=B8=AD=E8=8B=B1=E6=96=87=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E8=AF=86=E5=88=ABasr=E4=BD=BF=E7=94=A8=E8=AE=AF=E9=A3=9E"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit e65cf32c9ff6e103ca54a0860670a12c68aafce8. --- .../kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt | 2 +- .../ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index a7e61644f..a7fc47c20 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -114,7 +114,7 @@ class AzureAsrHelper(private val context: Context) { this.supportedLanguages = supportedLanguages } - // this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } + this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 this.isAutoDetectLanguage = supportedLanguages.size >= 2 diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift index 25447f8a9..a2a5063bd 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift @@ -116,7 +116,7 @@ public class AzureAsrHelper: NSObject { } // 检查是否只包含中文或英文,如果是则使用讯飞 - // self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } + self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 self.isAutoDetectLanguage = supportedLanguages.count >= 2 From 8f149f7844a5a7f882feb13724d82295538a8fd5 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 10 Dec 2025 19:10:49 +0800 Subject: [PATCH 152/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt | 1 - .../ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift | 1 - 2 files changed, 2 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index 80326614b..c48bfbb76 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -75,7 +75,6 @@ class XunFeiAsrHelper(private val context: Context) { currentLanguage } callback.onResult(currentSessionId, lastIntermediateResult, detectedLanguage) - currentSessionId = "" } callback.onSessionStopped(currentSessionId) } diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift index 19aa162fe..44ece0896 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift @@ -106,7 +106,6 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { if !currentSessionId.isEmpty && !lastIntermediateResult.isEmpty { let detectedLanguage = detectLanguage(from: lastIntermediateResult) callback?.onResult(sessionid: currentSessionId, lastIntermediateResult, detectedLanguage) - currentSessionId = "" } callback?.onSessionStopped(sessionid: currentSessionId) } From cbcf16afcf39fc7449941ce5be8cbfc255b1f82e Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 10 Dec 2025 20:03:09 +0800 Subject: [PATCH 153/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt index c48bfbb76..f1095bafe 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt @@ -187,13 +187,9 @@ class XunFeiAsrHelper(private val context: Context) { if (st.optInt("type") == 0) { callback.onResult(currentSessionId, resultTextTemp, detectedLanguage) - currentSessionId = "" + currentSessionId = UUID.randomUUID().toString() lastIntermediateResult = "" } else { - if (currentSessionId.isEmpty()) { - currentSessionId = UUID.randomUUID().toString() - callback.onSessionStarted(currentSessionId) - } lastIntermediateResult = resultTextTemp callback.onRecognizing(currentSessionId, resultTextTemp, detectedLanguage) } From 03c4144179b9428286b49f88cec4ce744b67f298 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 10 Dec 2025 20:35:34 +0800 Subject: [PATCH 154/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift index 44ece0896..9b4c4455e 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift @@ -195,13 +195,9 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { if typeInt == 0 { callback?.onResult(sessionid: currentSessionId, resultTextTemp, detectedLanguage) - currentSessionId = "" + currentSessionId = UUID().uuidString lastIntermediateResult = "" } else { - if currentSessionId.isEmpty { - currentSessionId = UUID().uuidString - callback?.onSessionStarted(sessionid: currentSessionId) - } lastIntermediateResult = resultTextTemp callback?.onRecognizing(sessionid: currentSessionId, resultTextTemp, detectedLanguage) } From 620ac103c164e20f2d0b7bd0c2f3a0a22a373fcb Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 10 Dec 2025 20:32:58 +0800 Subject: [PATCH 155/177] =?UTF-8?q?refactor(agent):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E6=B6=88=E6=81=AF=E6=B8=85=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 清理了在会话切换时移除未完成识别消息的逻辑,因为该功能在当前场景下不再需要且可能引起混淆 --- .../agent/controllers/agent_controller.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 4f70d6674..b124cdbef 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -632,15 +632,15 @@ class AgentController extends GetxController with WidgetsBindingObserver { final text = event.data['text'] ?? ''; Logger.i(TAG, '[$sessionid]识别最终结果: $text'); - if (currsessionid.value != "" && currsessionid.value != sessionid) { - final index = messages.lastIndexWhere( - (msg) => msg.sessionid == currsessionid.value && msg.isUser); - //出现了为识别结束的消息 - if (index >= 0) { - //异除去当前会话的识别中消息 - messages.removeAt(index); - } - } + // if (currsessionid.value != "" && currsessionid.value != sessionid) { + // final index = messages.lastIndexWhere( + // (msg) => msg.sessionid == currsessionid.value && msg.isUser); + // //出现了为识别结束的消息 + // if (index >= 0) { + // //异除去当前会话的识别中消息 + // messages.removeAt(index); + // } + // } currsessionid.value = sessionid; // 查找是否有正在识别中的消息 final index = messages.lastIndexWhere( From deaae9c1bbb5019cc8f27e14878744fb1f38abd5 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 10 Dec 2025 23:36:42 +0800 Subject: [PATCH 156/177] =?UTF-8?q?fix(AndroidManifest):=20=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E5=AE=89=E5=8D=93=E5=90=84=E5=A4=A7=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E9=99=90=E5=88=B6=EF=BC=8C=E7=A7=BB=E9=99=A4SEND=5FSMS?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c2de8317d..4e946db0e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ - + From 7a73fb118488ff33ea2ad2df8027511719604920 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 11 Dec 2025 19:28:50 +0800 Subject: [PATCH 157/177] =?UTF-8?q?feat(=E8=AF=AD=E9=9F=B3=E8=AF=86?= =?UTF-8?q?=E5=88=AB):=20=E4=BC=98=E5=8C=96=E6=8C=89=E4=BD=8F=E8=AF=B4?= =?UTF-8?q?=E8=AF=9D=E6=A8=A1=E5=BC=8F=E7=9A=84=E8=AF=86=E5=88=AB=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改AzureAsrHelper中会话结束事件的条件判断,移除外部音频源限制 在AgentService中添加识别结果缓存,改进按住说话模式下的结果拼接和事件发送 --- .../agent_service/AgentService.kt | 85 +++++++++++++------ .../azure_speech/AzureAsrHelper.kt | 4 +- 2 files changed, 63 insertions(+), 26 deletions(-) diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index e931fc06c..710159297 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -149,6 +149,8 @@ object AgentService : CoroutineScope { private var isplaymusic = false; //是否保留最终结果 private var isKeepResult = true; + // 识别结果 + private var recognitionResult = "" // 打断防抖相关 private var lastInterruptTime = 0L @@ -643,7 +645,7 @@ object AgentService : CoroutineScope { // 根据模式启动相应的空闲检测 startIdleCheckForMode(mode) - // 设置当前识别模式 + // 设置当前识别模式 currentRecognitionMode = mode Log.d(TAG, "设置语音识别模式: $mode") return true @@ -666,20 +668,33 @@ object AgentService : CoroutineScope { val success = azureAsrHelper?.setupEventListeners(object : AzureAsrHelper.ContinuousRecognizeCallback { override fun onRecognizing(sessionid:String, recognizing: String, detectedLanguage: String) { + Log.d(TAG, "liwei-------- onRecognizing: $sessionid") if (recognizing.isNotEmpty()&&isKeepResult==true) { // 检测到语音,更新状态 _hasSpeechDetected.set(true) Log.d(TAG, "ai识别中重置定时器") restartIdleCheck() - - - sendEvent( - "recognizing", mapOf( - "sessionid" to sessionid, - "text" to recognizing, - "language" to detectedLanguage + var text = "" + if (currentRecognitionMode == "push_to_talk") { + text = recognitionResult + recognizing + sendEvent( + "recognizing", mapOf( + "sessionid" to currsessionId, + "text" to text, + "language" to detectedLanguage + ) ) - ) + }else{ + text = recognizing + sendEvent( + "recognizing", mapOf( + "sessionid" to sessionid, + "text" to text, + "language" to detectedLanguage + ) + ) + } + // 如果TTS正在播放或AI正在生成,检查是否需要打断 if (isTtsSpeaking || isAiStreaming) { @@ -709,45 +724,66 @@ object AgentService : CoroutineScope { } override fun onResult(sessionid:String,result: String, detectedLanguage: String) { + Log.d(TAG, "liwei-------- onResult: $sessionid ") if (result.isNotEmpty()&&isKeepResult==true) {//加入是否结束要输出最后的结果判读 - sendEvent( - "recognition_result", mapOf( - "sessionid" to sessionid, - "text" to result, - "language" to detectedLanguage + // 保存识别结果 + if (currentRecognitionMode == "push_to_talk") { //按住说话 + recognitionResult += result + }else{ + sendEvent( + "recognition_result", mapOf( + "sessionid" to sessionid, + "text" to result, + "language" to detectedLanguage + ) ) - ) - - processWithChatApi(sessionid,result) + processWithChatApi(sessionid,result) + } } - _hasSpeechDetected.set(false) - restartIdleCheck() + restartIdleCheck() } override fun onSessionStarted(sessionid:String) { + Log.d(TAG, "liwei-------- onSessionStarted: $sessionid") sendEvent("recognition_started", mapOf("sessionid" to sessionid, "status" to "started")) // 使用模式感知的空闲检测启动方法 + recognitionResult = "" + currsessionId = sessionid audioPlayer?.playAudio(R.raw.start) - } override fun onSessionStopped(sessionid:String) { - sendEvent("recognition_stopped", mapOf("sessionid" to sessionid, "status" to "stopped")) - _isRecognitionActive.set(false) + Log.d(TAG, "liwei-------- onSessionStopped: $sessionid") + if (currentRecognitionMode == "push_to_talk") { //按住说话 + sendEvent( + "recognition_result", mapOf( + "sessionid" to currsessionId, + "text" to recognitionResult + ) + ) + processWithChatApi(currsessionId,recognitionResult) + + sendEvent("recognition_stopped", mapOf("sessionid" to currsessionId, "status" to "stopped")) + }else{ + sendEvent("recognition_stopped", mapOf("sessionid" to sessionid, "status" to "stopped")) + + audioPlayer?.playAudio(R.raw.stop) + } stopIdleCheck() - audioPlayer?.playAudio(R.raw.stop) + _isRecognitionActive.set(false) + } override fun onCanceled(sessionid: String,reason: String, errorDetails: String) { + Log.d(TAG, "liwei-------- onCanceled: $sessionid $reason $errorDetails") _isRecognitionActive.set(false) stopIdleCheck() - Log.d(TAG, "recognition_canceled:") BleService.closeCodec() sendEvent( "recognition_canceled", mapOf( @@ -759,6 +795,7 @@ object AgentService : CoroutineScope { } override fun onError(sessionid:String, code: Int, error: String) { + Log.d(TAG, "liwei-------- onError: $sessionid $code $error") _isRecognitionActive.set(false) stopIdleCheck() BleService.closeCodec() diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index a7fc47c20..58fc353b3 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -421,10 +421,10 @@ class AzureAsrHelper(private val context: Context) { EventHandler { _, _ -> // 直接在当前线程调用回调 Log.d(tag, "会话结束事件") - if (audioSourceType == AudioSourceType.EXTERNAL) { + // if (audioSourceType == AudioSourceType.EXTERNAL) { callback.onSessionStopped(currsessionid) audioStream?.isContinuousRecognitionActive = false - } + // } } ) From 0830f859c4ef722fc8e509a5f97f158b62a9e3bb Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 11 Dec 2025 19:36:46 +0800 Subject: [PATCH 158/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=8D=A2=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/agent/views/message_bubble.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/modules/agent/views/message_bubble.dart b/lib/modules/agent/views/message_bubble.dart index 7a845e44c..ae545ae1f 100644 --- a/lib/modules/agent/views/message_bubble.dart +++ b/lib/modules/agent/views/message_bubble.dart @@ -166,6 +166,7 @@ class MessageBubble extends GetView { // 如果是识别中的消息,添加特殊样式 if (isRecognizing) { return Row( + crossAxisAlignment: CrossAxisAlignment.end, mainAxisSize: MainAxisSize.min, children: [ Flexible( @@ -177,7 +178,9 @@ class MessageBubble extends GetView { fontSize: 14, height: 1.4, ), - overflow: TextOverflow.ellipsis, + // 允许自动换行,不再强制单行 + softWrap: true, + maxLines: null, ), ), const SizedBox(width: 8), From 85837207a4946833067997467475b6c84e074ca8 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 11 Dec 2025 19:45:48 +0800 Subject: [PATCH 159/177] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=A9=BA=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunqiinnovation/agent_service/AgentService.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 710159297..67ca32066 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -761,14 +761,15 @@ object AgentService : CoroutineScope { override fun onSessionStopped(sessionid:String) { Log.d(TAG, "liwei-------- onSessionStopped: $sessionid") if (currentRecognitionMode == "push_to_talk") { //按住说话 - sendEvent( - "recognition_result", mapOf( - "sessionid" to currsessionId, - "text" to recognitionResult + if (recognitionResult.isNotEmpty()){ + sendEvent( + "recognition_result", mapOf( + "sessionid" to currsessionId, + "text" to recognitionResult + ) ) - ) - processWithChatApi(currsessionId,recognitionResult) - + processWithChatApi(currsessionId,recognitionResult) + } sendEvent("recognition_stopped", mapOf("sessionid" to currsessionId, "status" to "stopped")) }else{ sendEvent("recognition_stopped", mapOf("sessionid" to sessionid, "status" to "stopped")) From a86586708ecea71abe23caaa640cbb5ac8c71b38 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 11 Dec 2025 20:07:23 +0800 Subject: [PATCH 160/177] =?UTF-8?q?=E4=BF=AE=E6=94=B9iOS=E8=AE=AF=E9=A3=9E?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../azure_speech/XunFeiAsrHelper.swift | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift index 9b4c4455e..b9f703831 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/XunFeiAsrHelper.swift @@ -145,13 +145,29 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { } private func processResult(_ json: [String: Any]) { - guard let dataStr = json["data"] as? String, - let dataData = dataStr.data(using: .utf8), - let data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] else { + var data: [String: Any]? = nil + + if let dataDict = json["data"] as? [String: Any] { + data = dataDict + } else if let dataStr = json["data"] as? String, + let dataData = dataStr.data(using: .utf8) { + data = try? JSONSerialization.jsonObject(with: dataData, options: []) as? [String: Any] + } + + guard let data = data else { + print("\(tag): Failed to parse data field from result") return } - let ls = data["ls"] as? Bool ?? false + var ls = false + if let lsBool = data["ls"] as? Bool { + ls = lsBool + } else if let lsInt = data["ls"] as? Int { + ls = (lsInt != 0) + } else if let lsStr = data["ls"] as? String { + ls = (lsStr == "true" || lsStr == "1") + } + guard let cn = data["cn"] as? [String: Any], let st = cn["st"] as? [String: Any], let rt = st["rt"] as? [[String: Any]] else { @@ -229,10 +245,25 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { let signature = calculateSignature(params: params) params["signature"] = signature - var urlComponents = URLComponents(string: baseWsUrl) - urlComponents?.queryItems = params.map { URLQueryItem(name: $0.key, value: $0.value) } + // 手动构建 URL 查询字符串,确保编码一致性 + var queryString = "" + let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") + + // 按照参数名的字母顺序排序,虽然 HTTP 协议不强制,但通常是个好习惯,也方便调试 + let sortedParams = params.sorted { $0.key < $1.key } - return urlComponents?.url?.absoluteString ?? baseWsUrl + for (index, (key, value)) in sortedParams.enumerated() { + if index > 0 { + queryString += "&" + } + + let encodedKey = key.addingPercentEncoding(withAllowedCharacters: allowed) ?? key + let encodedValue = value.addingPercentEncoding(withAllowedCharacters: allowed) ?? value + + queryString += "\(encodedKey)=\(encodedValue)" + } + + return "\(baseWsUrl)?\(queryString)" } private func getUtcTime() -> String { @@ -247,6 +278,8 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { var baseStr = "" var first = true + let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") + for key in sortedKeys { if key == "signature" { continue } guard let value = params[key], !value.isEmpty else { continue } @@ -255,8 +288,9 @@ class XunFeiAsrHelper: NSObject, URLSessionWebSocketDelegate { baseStr += "&" } - let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? key - let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? value + // 使用严格的编码规则 + let encodedKey = key.addingPercentEncoding(withAllowedCharacters: allowed) ?? key + let encodedValue = value.addingPercentEncoding(withAllowedCharacters: allowed) ?? value baseStr += "\(encodedKey)=\(encodedValue)" first = false From 1c11deb40731ae095cd51a3e2bc8cff41ab6b31f Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 11 Dec 2025 19:12:08 +0800 Subject: [PATCH 161/177] =?UTF-8?q?Reapply=20"refactor(azure=5Fspeech):=20?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E4=B8=AD=E8=8B=B1=E6=96=87=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E8=AF=86=E5=88=ABasr=E4=BD=BF=E7=94=A8=E8=AE=AF=E9=A3=9E"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7c6bff98813d08e65708a9a8ca9e5411952e0fbb. --- .../kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt | 2 +- .../ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt index 58fc353b3..8be629ac1 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt @@ -114,7 +114,7 @@ class AzureAsrHelper(private val context: Context) { this.supportedLanguages = supportedLanguages } - this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } + // this.useXunfei = supportedLanguages.all { it == "zh-CN" || it == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 this.isAutoDetectLanguage = supportedLanguages.size >= 2 diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift index a2a5063bd..25447f8a9 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureAsrHelper.swift @@ -116,7 +116,7 @@ public class AzureAsrHelper: NSObject { } // 检查是否只包含中文或英文,如果是则使用讯飞 - self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } + // self.useXunfei = supportedLanguages.allSatisfy { $0 == "zh-CN" || $0 == "en-US" } // 根据支持的语言数量决定是否启用自动语言检测 self.isAutoDetectLanguage = supportedLanguages.count >= 2 From d7e6ad4f70ef87afffdcc06cdc2489108406242a Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Fri, 12 Dec 2025 10:34:34 +0800 Subject: [PATCH 162/177] =?UTF-8?q?=E8=AF=86=E5=88=AB=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BB=B6=E8=BF=9F=E5=A4=84=E7=90=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent_service/AgentService.kt | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 67ca32066..9a0b45252 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -151,6 +151,7 @@ object AgentService : CoroutineScope { private var isKeepResult = true; // 识别结果 private var recognitionResult = "" + private var pendingProcessJob: Job? = null // 打断防抖相关 private var lastInterruptTime = 0L @@ -669,6 +670,7 @@ object AgentService : CoroutineScope { AzureAsrHelper.ContinuousRecognizeCallback { override fun onRecognizing(sessionid:String, recognizing: String, detectedLanguage: String) { Log.d(TAG, "liwei-------- onRecognizing: $sessionid") + pendingProcessJob?.cancel() if (recognizing.isNotEmpty()&&isKeepResult==true) { // 检测到语音,更新状态 _hasSpeechDetected.set(true) @@ -685,10 +687,13 @@ object AgentService : CoroutineScope { ) ) }else{ - text = recognizing + text = recognitionResult + recognizing + if(recognitionResult.isEmpty()){ + currsessionId = sessionid + } sendEvent( "recognizing", mapOf( - "sessionid" to sessionid, + "sessionid" to currsessionId, "text" to text, "language" to detectedLanguage ) @@ -730,14 +735,22 @@ object AgentService : CoroutineScope { if (currentRecognitionMode == "push_to_talk") { //按住说话 recognitionResult += result }else{ - sendEvent( - "recognition_result", mapOf( - "sessionid" to sessionid, - "text" to result, - "language" to detectedLanguage - ) - ) - processWithChatApi(sessionid,result) + recognitionResult += result + pendingProcessJob?.cancel() + pendingProcessJob = launch { + delay(1000) + if (recognitionResult.isNotEmpty()) { + sendEvent( + "recognition_result", mapOf( + "sessionid" to currsessionId, + "text" to recognitionResult, + "language" to detectedLanguage + ) + ) + processWithChatApi(currsessionId, recognitionResult) + recognitionResult = "" + } + } } } From a27bf490a500826b3e6da8c6dcfe487cf2d5d0f4 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Fri, 12 Dec 2025 11:42:59 +0800 Subject: [PATCH 163/177] =?UTF-8?q?=E8=AF=86=E5=88=AB=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BB=B6=E8=BF=9F=E5=A4=84=E7=90=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunqiinnovation/agent_service/AgentService.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 9a0b45252..7c8b56e4f 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -734,11 +734,18 @@ object AgentService : CoroutineScope { // 保存识别结果 if (currentRecognitionMode == "push_to_talk") { //按住说话 recognitionResult += result + sendEvent( + "recognizing", mapOf( + "sessionid" to currsessionId, + "text" to recognitionResult, + "language" to detectedLanguage + ) + ) }else{ recognitionResult += result pendingProcessJob?.cancel() pendingProcessJob = launch { - delay(1000) + delay(2000) if (recognitionResult.isNotEmpty()) { sendEvent( "recognition_result", mapOf( From cca35aac0bc2af29f72ce0b32f21d78c29f1623b Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 12 Dec 2025 19:11:43 +0800 Subject: [PATCH 164/177] =?UTF-8?q?style(doc):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=BC=8F=E5=B8=83=E5=B1=80=E5=92=8C=E6=96=87=E6=9C=AC=E6=8D=A2?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加视口元标签和媒体查询以改进移动端显示 为body和文本元素添加溢出控制和自动换行属性 --- doc/ysxy.html | 19 ++++++++++++++++--- doc/ysxy_en.html | 7 +++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/doc/ysxy.html b/doc/ysxy.html index f384a3ed9..32abdf6ad 100644 --- a/doc/ysxy.html +++ b/doc/ysxy.html @@ -2,16 +2,27 @@ + Voitrans隐私政策

      C_3^S4NJ(kAUA-e@QL?qi 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%0A0HaPxl79u?EAg`7liKYE{bOqG2!;jR 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 PTTY*HIZ6E~@aF#jeIk5} diff --git a/assets/images/headphone_new4.png b/assets/images/headphone_new4.png deleted file mode 100644 index 7161868f8ba5cd922cbb1ea24a5fc9caec790f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926083 zcmZ6ycQ~7U_%?3UC`D#)^11IE*XJ7NbzbKk`9fRe&g}=c@$m5OsHrOI;^7e$;o;rl zASJ%Ja(VBu#LWR8qO0;8uW|&id2>Q!E3YMwhgTg(e);a!%{iHisv!gqPk`g^2j9C; z))No!x=>9~{*|}s4vs9>V_ttIveHw`HfL`;V}5A?$<0PaMEblypU6JBhWdrvtpfUz z;u3x7$4bDpdVSpM9Q|y>bgBOi zcl>(GlGqh?=qU;Si55Z``&B?k&vT%^wdWhO2twposY!|cJ;aIB2vGfZ`p=i3JW`8C z|NBRBtOqaUsrCNX>i>$m=hgpnf4SxS53EHuk6ZTobn=Gfe?6IsMqcw4 zK?wZ=kR5x;+aa;9Meo|M@$sr2CRKId?RNP8{#%_Sk(W{($5Jg8H#hfxGsY7NGPfwH z{9fOdRUs%q(#vzhZKmGwP^7GLFn=S8C~ zPP+I9ZH#8B{9j5i$Us)NAZFP^=ypFZTQ3h0(>eHj`(Zx`i65}#%cy{9hubEfmFi}# zj?5YTr|y*$RJP9_qnf-DO0<`0`r5C(-!Tq3f}%QzCeMpFQSi}ujDrCPg_%aRTh>VW zSZ(*l=os;@qj&Zkue%Ds#4}Z<7)^d-;6Ca}vTep+-C57z&vNbGTeR=9W z;f=kz!;9>dsWp!;E)mkBg3mlW*aZieqAo5kPY#yRalL%b`~ye3KB@I$l^}FVzA&yi zkDp~^@X(7Hpq2M8`mYy@x z5SmfcAH%Oz`~AE2z3!CavN;59#(A$TARyqVFSk$U8CdG^ksDk@KXuKT&nJuS;%$3c~_n}eQugecZ7trQPQC-H+ zlMW7uLv#0O2&<>#ji>xy$EBD4$L)Z0j*G1qjQNM>9V4h(gI7@(`-`))v+aSW12AVN zr%IEKK=6JK25#=>g*vi}4;s$}I8B|_NoE#b+r^9KaPUnI_WasxsEjIqxHR1`tUe)9 z{I!6whVPM9t#N9l0x#91h>T-~@6brGh}J|AnBE?K51ipK&8-2AtV*aC7^c^?rKhbo zcBAXe-_;b4_qLi&`qP)#o?PIUChe_X_ZFGej?pd(2W{`T3u7eh7vI+%oxuFJ08nD##c4z3Z}j?Z&=-oDrN$ap465u`S26wCxtW35MWbhPuIoYmRVl)}36i_tm86ig;8u4E-A@^bS4ynDtk%Bv*-yPUWk*r$$rAM`vq<~Y z{ir=fX+VLY#67B+Dn!%8+3@K!{qEi z1*fMijxi~=?Vgt4OQ_FR(=n1To=p+0#Jd#QlXdBP${#xK{y3>?p5sYdf7H+Ey!-;L zY0v7e=BTA!sBiGdp_97dQU8jK+(}$J99ON<-}r-x@2)zmCuej{KW?J4wPE3fwAPC&$)22X8}6^P(89Ef_MFY_ zio7A5_s3E1{*;iGEDf}52=FWvWWAjs88gw>^@3oQL9(w3w0a#sQ>({oM}rL5Bc;xo zSL{OkhziZ#RC0$pCceERRhSD&Ck9}p0khIAGhAL^doIJWeos#nw?(UU} zd5^fdfnrq1PU$|(7I6X&Z3WdioC!{!@4V)*^3H<2L_Ia&8AESuvT}>#(+6hb3o5&^K6!i znKg=~^);HW9@-jyZ>gFRYw!7N)p%k3Lry%*Ve783D7TyEW2i|Eo+SyLX5185HrYL) z@ao|s%a2xL_Sv=Afo;d6#3dhc4Nkp;t7$p3!^(_gVr$E-7wcW(9)Y4ZeS+nZe<-%Y zVzl9nxuvu+HRs{8GzlXLiEj4kC%jo2^G;uj%O;wo7$}_U>=PDe;Q@mIRG`aGOf!|> zZ0UgYQ~TGKNIQ|Qf1U^YFPBic`%l$1a#@9^jLy!tpJ^3~&4AW=hug%Q%5_ZBZ8twQ zmxilN9KG0omuP)lRNA!2zc#)cnWz$@%ghYr$WFG<-PmKNL8||x$;{dDoKJ>?ONzQKV37<3vrXf?# zz6GARBq_cy@JQqn>t$jeuoq6Vgv75|BZ@Ab9!uiV==Y%e;q*~HhRNMth*nqJ)7LY< zy{stovr*106vWb0eE*eN5c}WE&@||Z+ge*{Yz)9L&FExe4%>DsMiItF7bpA@yHbN5p zotgI$goE8&k=CMYUVwul&5AOz=9Dk{7xD7%NZtxB%U#07W*g0QlGc6Sh@iumB~zv= zM}O|)z*6{Zx${1{DX0qlZHktu>wScnztvW_5R3dyhKRoUBWv_4%5T4Rg8=$cmA^@P zUVCM>NVaCz=^G~OTmL$Uv=I0Ib5w{T<`ES&6@8m-JTe&K&42YNdCBJFky=4?HfIQ!xXcLg?Sk(N%frg$hn(tn%EHJBMV|FnZoJeo@_E|lkyI`$JtuZV6d}uR9sNZ>4=Q6(5s6xx( z@F_hM@T1`#uTGB6r`1z25s#-|8v8q>f)1~Mf4a`LnRqB|Yd2TCtxspHrDv>J8d;YA zgTdz}tP!Ph%apK{l`aJ=wk60h9<@K)?s^)RDG9wQRg&=4F&PFrZDWile{*=>`%SRO z-1C~_B82EA3&*ODdVK_|BZa1BQldjLgnXeEt2LpK=?4o-RyqY)kpV z$hJB_ZO`)1SKmOb66Wd?jfZoul|Bm5nc?7JELCFu5P!v>GHG-2ZPn3Z;7+5=M7Db) z-XD%NEZOE%@4!y^SVGvN8B0MR>1L}_hGyn2C5&&s0#!?HCc)8*Wbb2 zhqX!)O~{t-od3bB&VACqnZir_23{i3j+GUcUc(k3$9bE4Fx)kxjvRV6SYWTm%U6$= z@NOIbUc~N^+N?51Ogy9V8#P{yq~=Z4j98Zsc&;?-;>ntKpK*C8ssLdp(w%xUNvDLR z>=J5f%y7ltr^VjNDe&c{@YU5^T*OoYJ^1bZNvpAb$~tG`H{5w<$U|$LI()$- zsn|h(X+%!kFZnj-C1AI1ER~-qy%o!YI;hTtwROv;&e(TaKPknZcT%S$2$3XrDlGZp z5Buh)*N?8Il@gI2i6b@a9j{aK8>fdYTJ1gud97rVT+La4fcHaJXq8^_Pd)ix$$^we z=sxKJoA~UK-?+KBzwVL25T&QAmj|v#$JwLGz&HnTNV|<%{CWt7Xha^BoD{5?VN89M+A=(`h^i zmh%v5*?3Rb)h}@$fH42zm#db)L%X6Ebd|Yd;xipB&gO z2$T(O=HZ!Upj`z~I`(9=2SvA4BA0KwKXQ}KDDs;r%xLX{#^}QJd{AsnWAV^u`ns;- zNSS!33puN8w^J$=LZ9N(ep}$``k$R&*uWov=%P@!14Yw&X-cCx8o!p)k|_Rb>{$Nd zZPVphMDqnNwngmvq?C4>$9bX22V&`QS!(z-TXSM3w<2S>sKUS~z$V#bTU*n9?wqnh zL95`g*!<>dww(nex$^FBiuA7Tm?7el0~{WW;*bc6q(+G>Iku!LwON<$1^2zpKCood z9SP5c-rmrul%1FJh0g5>+9WZxl*w&^JpQqvS3e*pr^!2;m;=``*)WZye9&|QQ`*ep z2n00`^sEFVHMG$U_t9XgD;%k&<%+G=meVTP3cH-m zpN!F`Y(A$pgLBi}TjQjjiGQcY1wyq>=6OM^J&qUcQ`@Xs$8&#H4hOcR zS}yjYM$uWC|6+`$vcC}HfZ*2^VlThN$e<$-;&Bpw%-=R9s`Z;8s(K>fKJy`-;X7Uh zM1S3IV3bA1qjw2i>Rkr%(qk6QTM9@_Ft|Rr;0KCLqBM{A1IJR*(NSM zKm`LfXRtWHk~PvL9gPb3)8dpm`eAE(^J%)fZF~%w`KqKqu{val?uFSFKg4t>q&Y6D zrctT{0x(_&Wxis^-$_$UI^A?(#vGol0ql~9)(Xy`5xcFbdYHm6V$R7#x$a<1ZL+M0 z;5(kBpvvzYqW0+aLRJs$Hcx@#k#B&hW`Jni9hG9wqppKq^CwsJhSOJV{R0F1*02-= z{e%B{d6s}1Z=t84q@rS(ZSz^vsfr~Ds_RSg%V;(QGxdFX<)zT2z~H*f8BWWn4p9A| z_+&zUEpb_E43dp6(Et~CqD$naRCe2nvyWmKNlrxO;@9>p2K9VR+4lrTz?7dLVCp6J zMeY&v#pWqVyhDfPSIH{N_R^$>OMi?8)F1S>;x%-7sUDV9w#*}&4}F3V;TQRfeLVZc zd#WrO^o@trXmCR5oq$NHb<%h!3pB|ULI31& z6qu>ls4Ka@tXkt7JWBREAIh2vcrxL%ngG!pl~1>w_^PU4rNOQ9^=R#Q_`#r$BSpZLFovUmG$LTQzIk~2KwxYTs?tZem??^vX* z%6|Kqr&`yobB~2l-k*kYigK9`>BsRa2Yv=|(I%S(pWr1|?nSLzzh{FTd0O|*8 zW8%Ger!as=>(MdjHff$A;Mw9~Z&8Y8)-APO(=MU=k5?6RP@jS>80=ppclDibaINii z?SZGS95d(In-(=D{dtCuHtnqIn%kssYp26{*Y##IhO*46hwjlZA&pxOT<6&J66 z(1@sl$>ZN=UX8Lr9s#S@h`IKw@K1)vT0V)=>>;?)BKxOp7EBSr=r+%}$CgB4`(K4D z2>2n3BYBymjSi7=YcR6AJV4CZR95ac9NqKo*?0~kE|KKPCw@F8n6SR%6>r%hn;!C9 z9Z&iTN>&$S-20hgba-VW8iu@T8+M0+$E;35so?&B0YF66sI6LFy6p6QCYm!-uNSry zAQm)XtDvBz4wJ-zXd2Xca#f~U(rxC}cNO_S#&jD=kj?ZvX==kPV{63k!NpIjT_wqN zw3hwz0J@i~sQgU3<_h&!KC$V;3iD$#iLusfs~|w^>q=WCSE%;j^)_-7a@|x}Hl6oS z@V?SZkMIBEA~yg{;fB@d1QU?KNu@cr4mVc2>zs46gz`5a*Kd(>XzY!f+sv^g5@gc58%piG7nMoG z(9xkI7f=TDpY_`i-J4kfEjVA#;#V29T<9_GzJKq#r?N)il%iO~Nheqhe%t$SHC{CR zu_hhiJaaN%$IF|VJqJe^X12NPQ^gv*UV4b5vX&-Ebj175NVon^AmOD6%HX&%%GSiz z)UZcIV4d2{g0=RVhUp(2-yQ78V=kWcq>r>^9~07P5=fY$K9#$_;&3#Q(ZP<~)AP8WpjCf+; zV^+Z3Ao4&SW%k<^>CjA_#8^A}`Dop7{IVzgDXNm^*M@UNRh4t;U#j^3fEe#Cj=umu zKf>XrwLx@^3_FAT-s7fyQgc%9I;J#g=F=_HY*nPyk_9a8Gd!>kD`2%(ix9v2+_0ZO zZRe-!&*$6Bb1RC3$sgcelJP`+F@PFZ*8T1dd!1dy5TXSh36~F{igRn7r^ew|@rKMY zd_bPk;5eAI%?!6S*~&W{`*Axjb{6AC)6A*LzrJUc>MqEf?yPg}5`@IHtAa=l%Nsi9 zTba*=&Q|5;Rv_Hy_F(Ky1JHFm9kWq=!3;aTI0PB5p9!EZyn%Z&0qK6i*j67pxaR92bV9YZ43FB04cHi1~C@54xvL z=vVrHahWKb)zQE7OBvY<+e1^Pb;?<5RdVlYFj*B#bwC0&uN#v zRiSTd7l@R6^^ql8d&Ct_n*#bc0Dm;$G>*}?6Q;-nD)9@-#(<<%_COE)asn)1)=|Hn z2SAKiTbAW=f{%qP^8qpLDvV~KU7eV_Py_*wHT)n-XMZ%{1hwIIboHg0Fu5(u#Aqj& zV8g8}m)YTx;oYsVUsU~Z65!eM-8lB~;4u@9<*9101OtD#tyv$*uu{(~jjKgaWZk7DMs zD3*VN?o6~a-@<4Uo7Ylcn78DXF_eNy*vCN|=ev#pCU{*xIOXibjC8c+8fNnV|_%FGHWhv_fv7BZsPa8j$97;A|z^=)gE!(u-l>Yp%xMSDcRh%ooIA|*7 zM~gmj>S~dVCCZ2hx)xJ|JvJhWLv&Eqp<(jOPqgKjtYdAj#q~U|`!>44#&Jeh-pew% zdl)=sAk{^pcOG-j6-W>}HTWF<{kxMyTyx87>)-5Y5cxngdD$9W^;uzo-L$mKr|W!K zgLXEPkFaU<`#}e=HGkuB=gjj9TwB}d;L)Y*4J|I?0rOq#)~#pH z%JMJyqWIgYz+dYdz$a3BWVu{lQ(t@?@@(q+ID2bXIgg*vKf#u0eQ!oTS-$>77Z5od&3R^I|7T}gas-%hYZ?GGP%E?bjowGrR!_Mr>K1jQruSGrs_Pcho> zp_(VLukE!bl-2)WH=agkf>`TWeG8ifkD=Kqp%pcNow(j@swp*$zKI<09I(BEqSYs+RBf;IT%K;Fhz4mqHKQhtwF{kT}us`EMu}6B0?MnY0$OWlPqT zL2NN)<_4=*`u@mEpAeu%`|8K9AR?myZPElw1dv2(_)>oEWZUvkD0kaqrpp-D_ie1E z8VDzmga@V7Ax=NmVEPJyLT3^fS7IeLNU}lw#*U;VP-RKbBbM-V6{!^j5K!q5M1w+N zHBQ_sC%A8K(KZ22Aje>&b&j#y(p5W@f=RbSaM@$Bt8w_wxnJNy+>o3$+Q{0NB)T)8 zObg9jzcVn=e9Csq{R{v7X_&TSPZl%K(OYLNGx2xB@2iPAhUnL3IW|5rSpo>R6$BOp z5y`%E`)YIT56Zbt>oR|$7ye%r;rRTw#i7FIWEJ#uGR3W~N@Lgg9f0;3>sE=PjEcA9 z8y1TSK6`Fw53VVZ%ZmsHXD-7bf`n8*pDm=ix3-aw)l=9(ngm=dLVa^Ywy<6%jmIG7 zN{u7Q1J~8GR#}#1Pu9^x2VAaKCN=(4fN5PzG_oZ#c>coQe<-*H-M=syjSj2sTks|+ zXxqCh5^Q2fZLxzKH$ojO)l2y(xLNQBiaQCTtt3b=Cze|2hj!N>7UFN#*{4=kiH!;Q zIzMv;c~`sLCFw1~v(MP9nUh+}+v|9EN?RxQ2U|zm7hsCe>np&p23f(HvAs$Tk$ZWb zWlLV_KAFcgv7D;fPMg`Sv%GCg=YXgRcv1jqlDxOoyonfo1)Aw`(9?LiK6Qb_(RLYw zCmcZl3Ik<6hww6{;;Zder>iBUmscp(;(vMTxPJz~foV-gH}igfi;8n@vJly#(u}8W zT5B|(d~BVkg{}?8Ht}>slRfjz8KF0ZY}UZ#w&nPB>L6wy1f8c3TPP1imv`~9ID`v1 zT=6^x>ZCB9o%14NX`)M~t5zSdA0o`J0*qXy1On|KMo3N`&<>-bv~!6rbTlgb17zX* zZ8x4t6ZHUKvI+2u;5KYtb3}kEU8*~k4WrG$V^miad-5}FpfD?Zq?_#w`zAHrHR+y& z=RP+3<(X@OCD9Be{-lP^_Mys?~%kq+tK6BBr3 zGh4#eJQ?lwx+{0+*`(^;C%7J)N&uK|rb3vHZJ`%cm0-uqOLOt7(e4$O&vE}D!j*qu z&OSkSI0==_G$L-z9xF`tm7L7~^y`FTpCkXL>6BY+Y2-Q|EUoAqX(KXZt>Ot^|6ay0 z7@B`Z3e=h}Mz9F_#mZ70^e-Z?u8Vx*)1;!9xOIztwX7yxwo}!e=XI&D9?n!Etc&Ye&6eYh$MDKD`8Z^`g zwmNHfk!}SpL$`g~s`BIW_TNu@uRDbiJVcZ6p;4l^3uwiB5`cY8eXIsZAG`o8(dIk$ zFiN~gI#zwKrYQpS#pMoHe_I;q2;Nq)(oKPAnZ__Y^5a^Z8&OJdy|UUA;Ukd(e-#iN zUBFuNC7p`tNB#Q6KME8aoXGwJ{I^Jf`2P-@&Y3N|Y_}~*3~^}_zE>aZ;n6W+iJe~^ zwl(g zKm|Z^?miQgmalRf#2CJGlU1Ra&Dipc+on2J8<9X)D*NK4avr%f#UOP#JIY0Kx7hn( zx`q^q@2h`6BXagON(FF|L!S=C`g7-f3N7zRMeqeIao%4vHsX4QWa#&1AgnQ3C+|;~ z)n;Sv$Rr1eq3^tEEPMLFI5zaI1AxBeer3=QgA@#3!nbG}C+=F$*)Xe>iaNVuIpu(E z6AXxYI=(8f44HCckGtv{KVDrwJ{6_e0Fo>RBoLmMkmSM+CE34~cr|z8o*D=eGLsWk zZES(R%&O|m4`8_jtN84>M9=gh-|S2Y@zCp~TtwdSZO+%cU-o*W)E$Ss2;zkuTzXr( zm5zK`5>7Ag!@fksSI?UNhpfWy{T*HaIVsP)%xYQ!a1LVJ`GSA&QEGZ|oNrQ9=Tz}D z!nz*ZcL1`4of3#D0izpbm&<^{e*x0bBD47cAc>k?o z`osL3VikwAd#`XWJ3SC?Cbsw5aV_ODQ1#CIw{_THaEGzg2}fv>sD!D>4R4^40SFo& zzvv&E3+S%yT{@cW_u~R57Z!0QU{zpCBwNY-wSdJ!;PEfleRqbkSymMw>kPIx z>c!{+l$6B>BRVkprEOxI@bT$}N}Xz&xub7eov@WP(2vtv@f|k#6g=y7a8bj_w|%d-fI6^D$<2iD zUDDMM6he>i6gP6rX>r+?WuPDy>oG)$|A!eK{*{3p;9H2ww0fb|r>jhicsuI)YW?6v zh7R6{8sa*fVzA>(%Am9zy7|_e#-GlW-F+PrS#55-5580zi^Srt!O=A|Qdydb z(b9NIHd4?r>+lB{$+s7Uji{ASA=Z4sK0f=CLq1xCnY<|GFg-RhxAN(3tHwJ6tW$9k z!a=2=AB&y=jAVV-cQ637>6Ht=!=6MwKWIvaN|I9k(V~lHxd4b0C4OLjfZ}j+M`S(z z5xCn%)Yv+c7qGOq zjAX*+9`{x!i2~`tQ;U=@imL*dtZ9%mAn$7r*xTWG8(dBPXP?Mh@Wg!f!cVK5u-BaM zj^si$H5G}6x{kJPkvhk%M_BBlS*=tE0te=-<|V zd}YKTrCP(vtCnzId0=CYyASxRakZlHED~Tro~Kwa@hI@(G05lqJnyX?;~OW*lj=8b zm;_z(tz`$mwW20;1}oA? z;~PuQonu^Rn7}UrLNKY@N|AhPr8~ZV>LzVp^(U-Iyjrt6d1FdhX$tj(T>q4zx?G%| zu5awe);;`uL?$7dsuTI2vJ!aj?-UI|#kp)U*XDDoqxor5%*N0+$Y>_R4fpH@QWPnz)krrC~ffWqu@H|@cNWw%gXY{eqtqYNaTQ zc{O~LvFqP@C3mX3GhbxW9m|{%dt?~(^&!&8&l*`Fd zoyAHkzNG28uCSDRr19sBuQx_!C>Tg`l4*sn{l%qxwgS02F66`5k!TtESn~V`sw)ek zOdPETP`D2vs^YrWhg?I6k`5!v*VhHT*J*h6NSVEG#Po{CrLd73M~;%FSNL;zi(41ig6MmTjSB42wHMeH97vUOLbHbRU@ zjLo>_7DG03ID|zJdR#@#kZe(!Gfvqn?e~8|o6%a#O+&kQ62gM{tJcdP|LjcKOtIKH zDZ%O2J#|qj*<$fujdL6=EO**#$G%yPAE)FSN8L=q-dZsnn$A69J==^%rQKg0-ZxyD z^|q-l5vT%Z`Y(D*gI?JFw<(1Gu#rML`@0}X)uL4!(`&mq>EJlA9EpCIhXE=~lht7QQ{^WNFT? zOb~Ae>xKP{P6-}k1y20zz2zQGsi+AK>%Dt-tR5wLCuAB6#tF&UKq+!pcTeJEgn6tV zwgCGW`iMPcQiNITUnCCh#>SEP_3jG8H=~e{UW6KDOMo+UFy^9|S}&8#&DekDUYmU8 zyY0XY!k?PT<0$K9faviCm5cLE(ln5km#wA6T0w{1F@EegF-O|Rw{?~!itIs9|(v&1PU z+gZ3FTIvj_+JQy@)?76YV`7ka9OJ`&oZdM0>WJQktcFj(`(2&4b^kUk%0 zHwoVwB6o=T+!~Dcr?`)&{@1m6_653Kw`-Tf-rAc1=C_o7j3r-EzjK7Ibkx7X?{nwB zgQ(o_-3q20=|^Ap`{pqa&Q4}FsoP=Cc+MN~=+jAl5lyT3GE0k-u(%i|-iz~NztR>Tc=3_pEdUQ(y*rTcj}bGvaVRmh-0b&Lk3p%pWh%Fixl3NA7vBDv z@d}s<@Wdy8lw5j&V%El2Dh?@zP#U|5^()qU@%ai)xj9@R#B9GHU;KHfT7st1wjRgP zTI;ABBfYtXCaqoouiBSG(P~pMJ2Vl+9MIpou^du)>*~H^l;1+zM(4<$ut1Qb*8}7i zzubGEi7H1Q@baqUd10}K3Z2zYRVchcDIx7Gt2_e9F7H6iyfJisuhU{b#!7Ao$r+SO zsJI6TOCvEqJgTQHIUejBy>GGnu`zPT)8pOXIbdVkPp)uV12s1%S*?=gnx2>7hXFlB zj8HOK%kFh9@gQN~Sj^rI){Q2&Qu5ELok4!z;pRubO5S~00fs6Cv6mWk}^8+mk(nsn&Do8v9}x1XTi+1+ckaK>W9 zvTqb?#*y##Q%F4?CfK}B4kpfiQ1_hD?%>e|Ne?BJe*!wxhALW(Xg>b_x%?g`S*DYO z#fq@DS`^LqK(`Uk$ZNY(k~DdNRh%b}&U+5$6H7H9t*54(>S9E5#cGnvIonT2PvBOc z(7X|n+zH6&$*$;$1@uvFyOLoJeL}8;#6ij|pGJ1QsUJv3Kak-PkJtFnR85kok>#`f z*eGRF1K9ku~=_=wn{MlU_VNZVzljgl%%BO3n z*j?W|$7A~Yi5o|OTa~PsGqG2l06f@K@8Dsn2R{SWwWoNr?b`GM2XJD~dPZfmU$fCe zhADjWWic=u9oaUIKhWvXroFee+Kdx*b3EJ*n2<#!wj1b*j&+Qv-LX#2d+vw+MEdsS zJEr@nC{ho(#Xa82j0O|__0@jN)6nsOQAz{uV@cj?6fKXov4Q2J?9u)I>HijXZ??|SuKE+kvqZ@ zS?t2}Tmc93cS$>Uv8zQxd-S{;0(4v1!L-yduTq9o=X@-|Ck~CT=MD!>#A{YdRKMF? z>~Ikilzxm&dU;Z+7{Nwd=NU6s z3{u5eM+0gdXBlQ%+%3TkSy|cW%Zj&fI{&>ochODNNJRh_=iXVixC)d8%;Gz??Z7@^ z9tYk!+0{qr!8a7JE3J8uz^6HsAW%j}ma{;urEN2!xG~9ZDH)4{GLzlt=;V5%=5;Hw z9PA}>isWMj7tX&V_h>0;Arjv{P%;QqR0`}r|3UA;*x%j?o8Ib=x~4j;er7oDJ#YTR zzv{fxhbw@e>R(dCC5=6zw9_PV&e8Xs^Y+$EdCY*UDRQojW}`AvoMZVG%MkqZU5FSf zkGV<1V{4+-u%g!uos86WXtn(I%20E9^G1G!8h$TNJa~x|Y4Ds0QEab*cqRkcvN;9y zGbbZerXEWEq&@A4L-*rU;TBg``DoQd(zhQVZTgyjHZ=*HN#oayQ%CO+oDi}R`D^}B z!+j6(sZJths?e|~R|kFL^Bt2QI!~c7Upz;WND!F`tcKpx{UC?=IAnpM8?_P6@w{YA zN_;6C#2iVH&`|IU(}y+4Q;nmyOfvPSAm}Y>bh2-mdnm*y>}T*p_=tSNkCVV%QNP!^ zrO>?&^1YtT)>{Bafk24 z@o$5pYlG|tDlv~X0aqR>@flG!@<*kHF82KvDsayDshT9M-`dM<6h9N7EOH2{*8at8 zVNT*Oau)(prU*I$Q*;!SzaOji9|^q%{O;Tqo91PBuSUmUmRdYrgF}ghxw2#Ahb0T$OZs$cx0jb=W)hH_j(>y1!))0>2~yl$bhZg#t;bdzY^1WNC!mr%@k_ z1`2dO{k}Lh;q|Cj6=v+9q?U>R)PFdSKZF?1uCc>Dx;}t%gMahywwh5p3bUk3t-^AK znF$D(9jz87dUp-aZRu%(@j?rJTtroz+xQQ~yvwbEsb5CC$rLj4Bc>b8Jc7u@B@98$ zjR8Coik=!QyAwHy_N}&&AO-S(#r|$Zt9b2XSBf;$bAbRMme}Lxu&#G{6VZh5x$#ii z$C6GVIlu;~jo-)9$k#Su3$JGrL?mxid74)HjUA0nD%!vsX~@i?$pnw}F~mWb`FIls zo4;(rJ`UB8VG{HBv6CkMb}j%7p#ect?(6%zjx-0LYEzCCMyRttR`S>w>5GchS2*At z>(Q$I1J2M`zJxXV*G?7Anf}{WIHZm~7}IF*x;LeDKitBB@Xr5e6ZeE~`rIZyR+NMv zqsT$a39=<{YpDNJhu)Bl>}n--J9ybJv|nIsxA890H!D*zqy&ZQoDa2Zl;4wj7u!7_ zvgP4HwP&(-&>rDkAH>Kfr=rJwhuxwvb}-p70>{ih3YhUlL*|5!l?fJLVTR~(o!EM$?+}+t+U5_)ZKDWY zSr*T$5}s<{cZ5HPo@ujj+3?lS5=&j|W1=EiR20esUzRxjg(O|6LhOZ5K^D3<;H6i3 zj+h*bA4+4a`&##QjZRqfOdQZ9D4M*<*-ggw7AWXO*%9b}#huIoLKCi{ff;FTy(RQdPVs&hd$z!fVd4bWzKGi~Cz#!KwT!r3>T!eN_4zKn(e8>%&8GiL<_Q)!mWnZ0D9YTwdwMUeYsK zh(SUh9na&gEm`rPLj*8ml>XvIcXDk0UNFKScb;ckN)md@NTYsGSSPQYVI;Z z+I<{tyOg@2)s|6$)oJ8 zGI3awroZlep`LTZ5=ou&J0{wIOi=HY-tOS#f$7Gj(hiD7@pD5|v~Bq2EGOF4b)jT6 z#eS>u$yOHSe)Wvn>{xm>t#*wEiqp-Jxcgf>`sVeeZ|0UYK2L&b$GJb6QFX#l!O~kv z&$X4=q_pi4IJVJCX>;D?RLhoYsp{Klpr-cCNza^9n5R3y>VUhU8YAS@(fRw1R8^DG zE7tF#m6h!4oUzZ9jl}RA6!a*kJ%s=u2|%Us++qgEZ;6l!ciLrl`Q_Z0^55R1N#SN< zyd2wm^ET{N=hlx4gtP`Q9+Fi8nhs9Sts@tG{H%f~%~!_z1)R#QU&iGWbKK=|u+mkA z-AKcN`U21-o|GxTTYZCpCY1tQ%N2Y!iQN8W3_onOS5yeFv9YW!HXuj@w>{+NXQQq4 zD5$#)E+kM^j_hIe$0l7FA9+MX5siu@bz7bkqEi)9i_(x%Y=&_>P7uo$3>(X-iH2Zf4h@^m%YlFi9iT=jXix zn#kGB+PwF>3S>-u)Q1(}n!Sl@)Ne$UxdwZRX`V|4&M)Tgvk9h0u?R9g^&4h|Og#7R zBgeIxvnZP$A$c!HXFqZWyiWwBTqX*wl5Et*6qN6`O{I*{yjf~n^za2p(cF^h<#l6; zuY@FCr4zKQ#NP}+eA{WGTvu)sY5}Gju9*@I(V-0}4u6ct0H*!3Y=CS_!_}#|^*XQR zvj3Ks z8_OZ0BN9A7e9kmbQgl`7J$F$3c!1Y_($oV#4l4@JGM-{al;P_^ACvpPewZ$bU&u`Q zcVyibpMd4_h=@r?&#I4#jY1HPpqrsS5LU3|!A|BkTr>S1C zd@wjQcV@-ojzHnU%wg^u!rvpG++_E+&rTQV!AOB)&(Ugm6y0^nAwMsf3v_Lm(Ajo~CZbqtNC&UySRas;>Rp-U;rg3-*<7t37CPPe--N z#>Pn5h`R#|f$OVW#Y^8C3Dr?U*kG_Vp?-jW- zroBQLI!P(xpJNx>Jz}eE``ta`lL^};9*^ptp6}UW5c&a71gH#*$gxE6|C|8q`xB^vmQbM2LQQ_^#J44Cs`l z7{?)h7c-zLOSu2-Y(7CDa1YOFL)a7z1N#AVruAf%X-a|b6Q!nDgkMBf?_FAD{;>X| zq9%H{deeuBcAhe3bmZ)SK8R2HklW3GIA^Lo0!z>#GP|4ul{$u~X_I2WiM849j%_G2 zrg9YrsIpvLEg;JqoyWs$h(GkzhjHBB_cBaX_LebX!r)pP(=&`{b4>Ugos4$z4HpRvN;o4;sll@(WFNMiLnFM4))=+CjG)iRdF<32dT6v5_XG~sNOB-|`Xf%_o2sbT6XWn^HJdD7*? zw?%z7UIkO(AZcb{6;b&ykq1M;UEOGIy576%=|-{J^+%XkO_-nSnK)f^h++;v$RE;@ z!-D+^+Olf+!qe@RtXUl1Z!Z45;4v&e`f<+idcU1?f`nGmF+K2HC!D0E%H&m4V>B^e zm2q7Zn&S9~b#TxxJU?ZzdvUkRr3SMa?k8m?YB+y>7>di16)}{(fJ_Wt?Cxf)J$Wqa z+VBN8U?+kJ+w?z+C1LSB?C?3N_6pE9Or_F9dsSsgdhIg_$Y9TT*1(=NLDx3IEL9ED z776sB-$3q}#|1a9<-Bk=Jz^=S;FM4XphVKnT9eV8eGIXWTOuAI@Gi!ksWjID_F{Qq zzY#$a28smVh;8NR&ynYH4=$XTpD<8NH7>or{Zjc4K#sDsOCv{(tNld6yj3SJl!{4D zEKm&)wB(~iU-#1GdA~CmCq8;5*GZVsk{xy5Hu(F|pu4@-^F+zO5Y!%(j7zKF|HssK zI6~pae`k}7R3tluGKy>tNj9O#yfQ-eacACH6|(0k_oG$fOn(!pGqpGoy8Q;SQ)GiAtforrvuKc zB39=+I>1iQ8vlhQRcEWk25Z5wy2h74Ptk*WFn(O)FPb~CS=x_+{Go_|g31oqKg)CsR&TgSo4||WOnUkA*x)v-G?c6 z&o0&=c7Ygzmp(sd;O14j(b@9AM(_YbS)$=NdUxxlWduXLGN>e8J?aMo{nq6NNot<1 zAPkWW@_T(~!*`DEWqZ+-eviu-kuFZxHRVSjcN?2}lYXY{Ghg;oY^LAOd?vJRT7&EQ z`FJl~p;PK*bokUIU8Lco>wKLuAb2b*Zi?@|VBULa(%M05_PoCK7GZVB(>vQej?^Q%E;xWO7j_SO1RR_X0u7yf+jGB%0H(d>wz#^9R~Cl)ZufDXT?Z|9u>@T#pXQ z{k@>6c>e=I=rdWD=fAg_alnzN2vO0G%*!A)uctn8p+^vEJM9os!3DF8!^M^ZH-97+ za^pKiTZT(;s!WT3n_bc!((-r>5S1fW4CQC8JCs4QQ55prwyN>{M(1#@vmH7g7sf;e zV;#%=TaSg*MlwtjJg`)F_X{(JHaPjlZ0Sp;AY!)4L|9I_H?ckU>=X5>vf8V$jg5^j z!NK@#16$$C1v{I|_VG-gQDqTW`+PF{4y=m*3T`~!=w2@>E=jh^se)8mr ztgo-{rh|h6h9Q(=;G^q{)^$f2HX7ciO!L8If)o#nRS4HT4wcq#Xw1C?NAbZ6CqkID zb3^>~zn&DoG+Zngot>PYAAA(wUBz1dW@|b{(j`6N3i7hiWO-`!s-?wJ)OdDocGeuh zz6EQUp5B{HSTc>-AqBUO9#SCA$zS#05Ki{kIq8IbrALBjg$$yHYZ9 z1t%)EiZ$HK5mSaa@D%vYn<(&z#xa-M|nSYE8E_=;>Z zs~nI#6UHgO&`QP08QXmM`wCzfbCT} zHVha4Tg`(%_}9J`AUOd{4U%Hxx5&w$7Qd#-X7gn@4LU6WT5sk%Q_F`gtk|>QavI5Z zHkCHCvx?2V3qGEe%(h}?Xj$TIaAKvYTEOizBg?ct;~ z;%}O#!?g0KXile7&Iu`(?EAXwGF#iFGrrXIKIPngpyAsv1vQ$mN;*0&MC}qkl(AK* z3{?j&L^}2LfTZ3To7c(QkJR1P#th2%t}fedvuXKXZcVxC(ozKL3ilqQ*(b@vTwR|s zM|WPR=)DM62d*|nfIfdXXv&rimgV_9t6Vmo6<`g#fj6Z;s*Cc=jyw{ITPztndDb7< z7VtW#VhBU#y)GTIUXGNqJ*`sqRbZL*=5>jTi>gY5W}@P%U(YM z4A_+G=||wyrvnj#^{8V-Xy{#O;MyzL2f9nY$}-l+9g%eFm;t8&-+|bb51r&}TT%+( z0sUMB{p%07E_K*|ZyMx8c`gJU-8;*e+~j=4y5+2WV+U^C8Bi+Lx$>?)&Dy=f0d2Ep zXTI7Yl=|>3@Zp$M5ui-#$MhQ=ukHKL6C$BP)PRJXOC&A;Thr|;vefsj<;d@;AE*qr zDmx)5F`vNH{#N>HFUfyY>G}WyEoXr&lF)-A%9`AlSae*Fu&<^(}A*`JmXjv973q;zuoPW9#hV$~YwlD9##* z(nU1vW&ggOCJ3@MSmo+bsOzS02nZMq4!L2{QU1{W{Kc&tn;Fr>inKwja!=n+{%`G3ISg zG@ZvVp+nDewWE;MH_=3shZlzY`@FA%20BIuW#zjIwK7G%o2rr#OB+UL7CUTb^&BiF z-mx9H>e}d7Z!%9<5zCCuLjI=%TKE!3U?q#Z6I?A9>vzP0RVH9sBV$X#ecZ>gHwgv; z^jOr)NYY-Pz~eZ_kXW(|(zxGuM!g#lB*Y6awq%6OkY-)12IJ*OR2oK~&vDEYSsPHh z8xPrV4yKEP`m&HDlx{jxr-xg)%BTPQrQQ>FV&U;C)|BFH9*%5?gkCwolv+AuuYj%+E-G6l1w3MX>)yqp z#?1Xa#{KG4x^IUY0(nb4=X~o{#l_K$`!{Q01MwG?OSR4E@Q=V70qiAgK_+kf=M*HI zRnv?lm$M+&axrGndbt=I8TO%*EQ!;&Y&6s7gvreHB{y>p>b)xuc+T?c(1Z)8ojMX! z5_|XftJ=khf#*UiCS&)sD^yf1Vj^pw2=yX+zIbzU6kWE8*$yhCWw&p3EbS{{#r|dK zRd4@=X~@FP9DM)3!gnYkL|J5>ZLV>Wd1TPu8;r>jBch6jRgFBqC@=!U9s7 znazW|U0-T}J3G4sqUNjHx^#%8peu)|3IhtC0)5%%tBKn}Xaj9JdKgltNsX5~% zOjMhu5W=wK!|!6cnl}mup??hJ){VZ7rlt;JM_b-!)cv$Zin2Lt)yZ;oR>Um5?!9=e z@p$=kd34>Q4_88{H5%VPbiq3CK#gbLoR~HFoox*qSE_neRiPPi-{;mP5$p#G4$^uI zvqx{Ne>Gya{$WnA8Id^Fj!gYje^Of>7UIJfp4}HYCi>5pO(KRKcDdr(S?N%h*~GRQ z0nyNWjR898R+)JxEK^*#>GsfD@E1g#Du7TpF5mrCh%FBg#l91;TK%qmsLoQ=HJhG# zb)RJZ>u>0iL9CPL=0hBU-igPP>-;mzY z_?w!MNTR1Nw;Eq?uyriO^x`P*J{t!fwvG#QcGWebkhc#;L|>edt+$DxnFR(R%8z#G znC{OdI2wflLyKyiHZ5NRB)>ae!CPECV(vci-*4-VM-M-3|95V^aQs&*&2%@1z{8SI z`#3M6x6jS+=_5mwamggq%1}szD%n(uRRJZR!E;;Ahq;ELX^x!#!ujR`k*&hsQAUyk z4G)z>-Etr@jg6E2oU^+fFFhKQp53RzNaMtNuu>(mi+1ro z5DkzEa3sca!erzV0@a#E?Ll58h=i=45uTiEE4t}TyMeodUkk4D`!Itk{TPId`?28s z@00qMZx)n^=XMO|5N30}>{X54+tZc%Jv}`W$H&KE`>uP_Wr8DVgp#EJjN5<{O#j@5 zB>L5*Ne*&Mc!Krk>XZa_5vhoSIjnv9GTCQ(WaR1X*g1B)!B27SNjT#HNrfgUTd7^n z(8JWbR^#_dSX5u`HOc5JbpH5?`{q9AIHogTBR|OL*$y`stH>+J!bLyZr}>i5;L;4v zRaIW7t%xV#&azH5LxG^Re(ND-X734H?sK$IM!&mt1o~oJLa$Y)SUFFO55&Q}W=M`V z)H+P_GGy^ypZ+?r`2vp2UsLs`L%TawC*QN zPQuf^AZe-{spt<`lOLLCZ@*9#SU=M~2q2Ju)|9fB*$E?kq4#FfG5IRL2K(KhG_)$6 zP~tp|Sx0fsMA!0N^fLKYy?=9S?~$~Aes0}Ep00{nrYkuCNdDfQ)tMgfG$3Fj8VzN? zZJ-~*ZxwP+R+cmSaU(O5RbWc|egudA+OQFH-m>a?#n|xbB3R`@neBF^ud8cGEx`nX z4=>1l&>X^cV9{gRm2n5s-2)gk_>%=Hs(PhfgyGu0dJf{3>LS)EDW19zQXjegfir8kKh zmcy%9sjGT_YiG@<8I1YKsrX6_FokDB=fMX}Qy>Q$yarGgk^Ori>17>q>w()fZAVLK z22Eop$5)*L$O2wn3Ez8LdV~l`;0E4?%B-2rJ>2iVFEzl5Sb0`<4w~IN>n-fEncB2_ zJnY5^2iUBaiffaq8z|X@IT@P49WFOek1|<&B zX;x^>HhJm$JKrx1px;JT8)rMVsUG8xa{-RGNYhuT>3=hnd@2z>o>^T|svsZygTTPY zaw-ERw~|o&alRnw<2B)rIBS^|?=GRiaE*=v7Ndy?$!j-*i0iYda%}qC)YOz&nid2- zf!?hRNoZ2c;JY0>JZ{ii zUrFRc#HzFxRi3g6BE;Io5K^|%6ubuJ^U`E`B((9**5Nu8uyfA8w9{r)Cc=$!Hr?9ZuD3i{9e0rh zTOOS-8T%+%mc^2O6bR%{dX|e!ZA$&;T$5O`iZ+y2_LtzKicT|HzDQ zU_~6%LE{BIlLGBdf$wwZqMYOK4e|}M4pJ8C9r2a32DTzsqj=*ZyzOARZyZ*o`@XY0 zJ;7neYZac#=RiSmF>VR)U8yX9H|p!e4A1TK!?$;x2nvfHkEg85S;NWYZ-lu9N?*jw z=TbcgXOh!Q?_w6f-a{2llMG2K;LR%C%?BJP>Ad%yps5?LdHoDB82CU@nY}f1sm~7_ zNWEyeRuQu0xZ z|H_!pPnc61a~Gy}>pM^Igaj1Wa{&5bL-64PTn`LeZ>z3!;otfB{_Bmh08u3TY8aZA zw(G~okqYv{@h(YwXR%fGhM`T%T8Wf>kXvesxty-?TAozddD}5%YzF3vUw@L?rCAg^ zD)ERew6N7Q)>bvny2*p$D1ICkptQl9_bbeGNY}RHZp(VtM654N5WlB_{CY7|lROA^ zl*5EH$3u$TFX)bI%iAH<$wGmWvcEpjz;Z|Pe6UmcD$+qeK>hmvk7)c9vuM$aq z3LDV}k#S`uSiRDeZ#cS<_;N;ukXhMO)vc;OmmWhoJnD1iVh63;z8a)hLO}*<(z*QM zYT1K~H^YOXj*skek+4{$9@nDK2po$v-XUcTb5z3Pv0bHHhumf%tznE9Y8g0+)%&Q` z+_-JWcitd)l}Y7dn1 z3mKq~mh6kBAz>uyT^xQk#!=LZ`E;~nN^gpP`1SdB+KzZn=hT{A3|~Qki{-tZgUg(V zSfc-sQ4Y7i$mljfo~=-&_VN089<9RHeiDXy^#xus=(%W1W}AttKE3{fzS&ykZ#SYj zix9q3B(D#%KLwgm&}|Lvmtnk{omXsFT%l-iwM!RIs4!+$F~hD_=40Lq#oHd1-2?Q* zo~TN|nr27g>=Z6b@U$w8vr+S#XlK~f@=)KPS@mv+#o>q%9xDAxjLK2fmx4mq#nIU! zF+-AgNcKMX?Y-~yoqr+Dam!=oI!R~0^~5KGm$9v_v-ai51heDV=uU2FKKF+41ROPh zK*vw8`y*!~8K3T{KjE?)yhP9cp|^(LW;ykuIqYr&ZLP!Yd10(v&aKkcvrp)sx8)&G znl71GfSleg5NJU@W>3+%ZO46b+{ijqjGlD?!pkl^s&zAJe!KHj({7&%LZz2w-YDo) z)yxC-$ilwZ?v8@}%uZKMm0szQ0~j|vmTaV77{&_px`3x3kjcHR+8pP6zo)hJRi*px zPvRpRETzsA!a;il2aTQE(0?DgXeomDWJV&!y>xP_ao;BE;Tg_m+D~hA>`QvOhT3iO z+iDNEd7EPM%+yna@2~nDyZ&LM6ri7e5V!9jZ0(x z(*}_aP4zgug~&;IpMFL8l8I4Vqs$aHiC5fHU!Z-aV(dr%`Wrx&?FQ7#RRfUH?5DQ#vS z$NneV-`uW&TjMCHWoJ4wQk04f&G&Ze;7-%r4y+&It<6pFSV3`T(Xc_Nl(LCB7V0>e zMWDY~rHK=0#uzen$Bd`5mOM_BPB@2?^ESSeEjEd#(l8mDb*E_DZwtcwBjwe~xa_oGWY0I@26o1G- zVK|1MZ?n2FVh~#QosV%+K(6=-GH;Gcc`3!fqkAT3(UEi;73GjmpG2{-0# zqF^73=48z7jt*NNRK?rwT;P_vr&HQE_y(fZFvLv%GSU3*|Lu&cn)^466dY_)VMein z7NZjOv6ala5pj3Mh#v<%rS6N!SPy!xV-dL{7qhu+Lc!SPy-*{Ej;)EZ%5zY9XhZx0 zH2>@UQ~55T<+lxfzn^snDUW_heGx*#|DZz5x^(5|D(ONDF)3c+-UXvbTr~Vy?X4zy zgRK}#zVVLLFl#F-F#**Ag(k?Kv6F%PWw>s-ocDK(o3&qWH#u=C5uF?W`fO{AUZpKcwYCV-S@H&^ndj7R3TG69zF z<6~wBNKrMw=JUh=ty0a7Y|}gC>{D7k51E7Z>Gda@kdI(!jqb+U>FIL5xTvZk%lzlg z%Psv}01GrWv_oFw#>qh6e8%#qYHbrdRUITXq`?%<_K_lko>OD?g zapjnBH;26$GF0VQDfj!rNgFOvh>E?i(nEYqYDDHOu3v+(amNG)$jebaT?7>C`no>* ze&OZb(Ka3-?|rcBPSDRkzH*U&8rY0e94HU8-fn5Rx_-UNe3A&LY^uA+MByijFTYfo zqzd9%#ka{f9vs_UV;eKBX@{ak82VFerrah!%3<&i= z{Y>B07p|K%tU2rjFTffU8eT2S{E;?P#rGa9x5aM~UuG;pa$F=ND9V4%pkucv>HnNo zNcf4MnXM;s-U?XNZ5eo4bW_WBzacNl?K{2OC5x!20fzM6JspO%g}gbcY9A1JjnH2~ z+6t`|4T{>aMIZm{@u^;BG6FXG6-cpd0U$B zUPdV$b#gxn<^8nwmWImQE-?JiwuS$LMBo$2;ZU_s-Iy-relR?tUXWkMBR8>s&|^+0&b zun>d0D!f>ev%~mkd}90JfTWqvYS?(o```0_;JI=<^15XYbq{uo^~g+b1g3(`Sj?*B zLT*}iH4eK_HL*)K9ZBng1`H^CM-mHvB{>Ip+0F%oTag=pEFu+M5J)1s8 zBTWP0HRLrPoy?}QtH}LCihUPk+x^nqYJeyS;nKUZ=U)q7>7+>7)*d`nWHR{fNlRb^jEe<|gmuqOKA?q05go}{X=I|d}xD19GUZ-rm3 z*-b7)UgxB8WB%CIgp&UY3H*=F_w@G%--}fTqk|2OTqj)UOSSK$DpgQowV1KJU6|63 zZ>cfr18?bOP6q*^gi?pXdv53D-LM-G63d@0@c{$w47EFh!Ab$N-Ow%(nuM_RLx(?9 zRV!c2zcZ;9S;1k$D%#UikoUEDq_gj}-6dR*8~gpXB6BBe zR~7gOCi#OdmjhSJQgs`-+dSle>=@iGA^GC!U?Q>raW-bPD@=ES5-}XleD68xWuwB8 zK%1a6z#FTX5~l%TRQ`0gJx*=$$Npyc^4hM>i)b0tW~u2nhi_OjF6>Qg;MKbgFsP5> zbHs*v&}DnZJOUH5M*Xg4eD*yoEh{8q86`q|@)H*$12kEfFTn!rP0y>$KbT><8vF-` z#mahCoib)8KJ%)pU_eMD<|J3-wlevTND|_ns4rCxhzViHLRWMYPy--b`^GXKa}Pb% zZz=cP4B&P=$6-7#cc%Q%=Lt`a4E4W5SHMfc&~;BQFx689T#Y9&7Q42j3V6jp? z3Vmtt(1Dl#;pezh^%Dxaj5hxxJcKQy%qq}OgmSbD-EB^8#>6~ScFHH^&gP!QCw71>cB;RTB0~G?C9XIdFUkv)1IixNQZVJ6vdx;=$WyglyXsSA9@BjBP;BH=jm26et(#Ef ze$DPfsr>d!l}DN)nqs61hI-8_xEhJXQlGg z#qgY{kUT5+$Fu(K>GPGu%28lbZR1%lsBkI#-hYSwFX{g@)aqh2QkNax4eXEKsAOO$ zV#rbt^}HKKa8L~(`=DI%5&N6WfH7M-3N3EOU9#~)oQ{52DRPL~iy3+nIOj&-x6|EX zvlj+8^XiM?QqO@#-A2#mCqh72f5l3)z_ocgeUE~9>#MWG9@h^Fh?wp9z zsRuJIz%0}8W!y!+%RZ5ot+$pyI6d#^9pH0$yc7G)Kd6;| z(dbyL@95y^TI_7LJ85&qk3xV42fGO;tH#!=T>s)&r)dNS#b#Ajc)AyMb0FR9T2T6; zgJzLo-@x<1r;=aSN2rCkW=gV+bhAMcT{LgN!m`5`NvYH&7d#GxSo zx`3*eI;lZU+FPT!(P`Tr58bXV#8t`w)#=+3QcVMPSr+QE&de1AJ!-Ip1MNv5FjTM! z!d1v0A8=v|eVW4?_<5$|OCN;$rz*iHIO@zwCxV69JjPFOXApWa%n^UFyGbJAD{Hff ziH5J+&rOw)OPj$V=pz}aq^x!(J`Ht88`wzk+#GgqziTriv3+YU#Nt>%#}>yzC?)Vz z!?T-X|DNZ-`P+n6z^|iGrGk!X#IS*&pWDBf+=E*)5Sg@yQ!e6whpIg9emlD{JrM+Y4p9 zf@4+e!`JqN{9^QQWb+k9{W|FlSVUUgiHbi^#@~;CRpd;Pa^0&=iy?46TaJ$>!V>pS zuRNQU`V~O9jg@ghd)*%Cl;Xm|wOL!g6bk|LJ*<~7nhYIbq42#+llu$)!OIW{Q1j7m zh`COX*`MishquDA4UHuvs>dUSz2faopXWk0U!y8{heN7;=K-`6L5r@xw=?qG6Vb}=v zleNHD?^b%8cgO#0i~o1w_YSRGeDP;ud=|WXvoBw8MQ2j3FY^Y*>_jodk}5W~hQ3r> zR=T@aMiD+1z4^!J=3{qg4`ZsmhzW#1+>+i)V^JkatLGfDo6x=!$GE1b;a&HlgG^w2 zmRvbT^A96{5;^6U!$SbexU^BqBho~UuUvb-2r(I1$HZ|%-p z7FHFZ=kZnZmpI&d3sritgt58y!9&gJS>58WS4e@z`7A6wlNRkMr1?nUN25r`HZNpf_mAW3 z?ZHo2iMinK-Cn<~-7eUOMI}y_A`I7v7}OVSB>iyV()vJ5D{d zhr!kd1V4`10rnK`5f$tFC!pEy*>$N}gP2$4i1Cn#);brc*>`QtcO8Wbv7q! z&yJPk;YYz%nae407Dxx^ci?a=yr(^?b|-Y>U}+Bk&AkWF0Dv2Bh%)RgeR2{F@1tzU zf;f-ZuxEM*geK8T8LMwcE3XrI`S+8%Pn$9G>~A7A8f|GUg>}yNc28maMxAX7lBkEtIDTZ zVmR59;y{tTN1ft)VGjSeq;R{<##VP+`fT;8n_()rDa>5PsE3Q% zI93{2^&fn_1x0E?Y|dnEZ2iEVi?hYr>1-6!tqm(Et~yZn(_6@S_FTS8IdPF;Gaj2- zGvNeBg;e5JDDkt}Rafh^E&Cfs+5?(YJo_XBTLP=q?7Aav_twReadAp}jlX zv@7Lwna}w>N^#?~fDxC?8igWnZ5hX%$e)whCkY>9`kBn}UHEkT*QKKVCgagPN%z?` zo%32e%rnwR<o?!7%1(`t7s$%%c&BJc_TW@$7exdILnM4vBxA5LsgI?~h4s z15)4L_Evbhi9O{tUU+Q9AWigMNIEdBBA@*{S&)aHyK9xJ9{^w&v{VXl!K7$53q-{& z+N~5}cf9vF44wAl{|*Rl>T8_)T&a^1i_i-)hU*U;!Ds6sD|JY7*oHeHv99!k;c|Bg z>!T;}_h#+w2GjqT9&SAl)MS6t$fJ;;xPdgV*7<$7*<5VPFi%NIMWfz_EAsk!7tM99 z=&9C2tZqwC_ zfj_Qq_1vLcj*TJl-4Jg}6sZKM*#k;-QhqS68kN3KlejA}qu`HJQKcWXn;)hgDcLY_ z>O&OR1CDH(mpMV`rpe%0>!|kFDC>t}vEJO+gYo=)AoTbjd30GOD}lXqw0`(n_$9X#NR7)| zJkeZvY-J;EvvY!M0sRA*3lk#dE42%uoJdrH(-$a@R0~PhruWTFD+0+69{@}Y3j3X) z=C0OrZi80g zBM*X3S_Bna^Go9eSmx22roL$leU}yJ%lhO&k)5p>zr(%vKA`99iIzw2^b$(l|J7>k z!G8KXk`r@i)Z zx1MJWxrP2CBJ{WfRburK!G?e~l$)-xUh7X16WxfJGl8O|;;;$P+Q0E}VQCLzzxog; zm~SnS(({gI?@4b#itWx>;A7@XF^HNrA>eGkf%QG7E0%M1ZVn*M9?j8RzC|}f2vo$( zT@1{d$WCJBSZ;-+cw2O>JRSPd9L58A>*l?_@(3;<+Jvkj7q}4D&5R(pIW{?W=hZa; zg2Pyuvr&b-cs7FoQJ6dACCI6uX~elTv8vIZq6|iBXA_dWSzFY)Z9akCFMH&X@Y{5N z?hxESJM^=UmDRab=2gvnrwg{VGb*aLp0*9RX#?LpFVwAugI^oHn%=5`dP`3V^|Z*U z7V!BmY@LN)>qni5m;N+xw=7Zm_siS)^tVBYvGnnB^_Q8y`Yxx5=D*w8jb!y4Pk zZk5hEB9GJxkYx|aJ4yjTMx1e3Qz^KzR*k)2taULjU;Lg`VpFN_|;6L16-0b=WFoK+sdFkw}zE6xxEq(fo{Sp4Nf(lI1( zqHPSDhvKTloX(EZ*abk2LLQ%m)s1~e;(h0SZB@AQFWk7>V0eoicB`G@ieO`Ywhwyh z)%yPF`~BsGMZYPf{{^EKkSc#)U*^-}hK~>&*cem)Dl`6}wosowEG)nvh!c&g7 z*B5u+f2PLnJ=J-gsFH$TSRc(r#9ncq-kf5k4Q~EQ?9`=n{h(bEEiS4% zBf-Bp8VgvCH%Xov{?UxfZ&U0R1I<5Mx8kHQLGMqV2eAj2$(u+}n43CgKnjWlKSz*Z zvc%OcV#FVngS$Iv_(@P)o@_4Mozca>IhUrigzjfq{<|y-gV7Xg7;j)R_LiUE^Gd0^ zuNm_S_fADwDihnvo1}8QrM;YOM2!p6>i4!;QuwaRD}eEhaB8RjR`%83l_h_vwY&RS zy`XirDRqp(-{Sd1T!o&6MyoiDel`yo)u*Td=>u5Ca>h>gCM_{{Nc^jG%7OFkN%da6 zAvA>#^!k+efi*#_ToMqu@BMz&iud;NxqDeoxv?lhM}=FPJj)HVF$3*h$DK6R^7qc) z_3!;HOkYjSg;tY642H^@H`7wOyBWsv*?I4Qfvys5^l zy!L|9S3RahqxSWt@XA%Cj&WEz`){kxoeqF;J6MawhVP@DJ13gWT%+QCg$u+UlD1hX zB9iF2d7~s(SUtTwYI6GLQryQ`z4r5m(p6nh8YSAmB|u=YI{w+k57o38>==6dXh13} z%WWMg)b&K(xrIr}*nFzO-)@5=jpm z8016*Hnw?)Su&JT$aS~;MA(@Z5N^SNOnVzzB;@`+~}@~ID4_&_m5}AZ@|#q z9_ypk@!mm;1VZGePo&{n)mjhK;avzpHR(ESQ-zm)gnBYAu+O%;uuyu@LLaYT6;U zBL)CiD86h^wRcCgBS$1p?4v+(+H(3im|`WXh8v~KKijP@vJ1x?MgKh416TgycUWnu z!8dG&^t8P9wY^yFjeqV>$c{-a`2X(yR`ShDWNA5gNxao@pAMJpZ4<{!mXgV%#r0-* z;U&XR8JR6)&U=rnz9Bb@C~A|FZ*6^3dT29cFD5;Y3hF**e@nk;DcGrgL903{ z^lXDVWq_^*!#Y()qVbJhy|Pd~B5S9M^AN0K4wOL-F!`tgWX#dri_sHTItCme9Mp$q zIajgjY0~Ua~~xDkI1k}b z@dS&$;?Qkhom4{pU(ga|1#uuY(2T{@##rNloagaO!?lf%*J+-liv>rkjV-S%>-Llm zy}ViY`D@o2L+=170?tktszdu-3Ena*sQ8WHE- zTfDO{(yur{q1$OGG#u+$mYSA+$k%vV+V~YP&YpQKdCh1!#$obeT6wOi;l8R5<~^F? zO5DDGL&|eLK(yQGhUCcEJA2&HBH_f#iJbjzl7L zQ551)SLFt*NX)#t(rhq)5Rbpzei6vGS`^&%nC9?J2-}UE=nSMOFQP2Tg`P(-@oJgu znRtqk=&rYDnoj%$yVo)kF0o(1ZSkM>&NhEDHA40)QO(zm;FgTPd4|R2KF4`X=HAD7 z3Y<*X>ibExDY*fuu}o;`x}=Q`c8i@lM0JiahZpRwt7yCX^hF*WFJig&I2AGoHUD6r z+4m}=tU^RC!yMl`Zc*CU-P=j*h>APv{E>+o3KO=n&W+jVj)wJGV0+Pg1Xqj_iQ(eg zddHV_Nfe>I?}oqpQKEZ~U4iX@MB+=1jvJ#YHss96>uFfhM8E>LRKXtTA+#oP%;_mH z+`h*CSKuS&=)zoY=~_edTi?Y%xZk+zQ=c5xsJTa-k16y2xB05OMc{7%?8e?!Rza6~ z5GKsaz$g0?1e*DqHRG`~%^3Zc+zb(Fq^-iF%d`G{WTXP@Z2>TyfTb4tGohA@43|x! zY!uP7IQIKel020Qfdv;9KkVsg{yHa<;|n z!Hl4;fVJBye3{jcwjW6R`BGNQl@R_AF8)s!>jG#487`7Uf#ddm4C2+Pb=irpExy;> z?dYe(`KzqsHDDu{M+S0XuDTUkQM_~oW=dQ;JtuwlB(0A_?K%L~7AVcM5dO@23NI5Q z{mEH(rz2?Q0#|lv>7j}uuWf3iBdB$Zng*8|3CEWgTyn^#(%AlHbA*q@F1Osi)_bE* zM66~1eCqmYY<(1C>CZ3IOY*NZOLf-Yd3f+Y6aAYA3E>~RJ@Mx@p!3wY*Pla`GZ|pU zoFjA=lw~~4oHy5l7zZR}v4!{vTruzj(x;wKDJ(**A5HP)mK8H=Da(txo#uC5Q3+8h z7H!GXh|2}y5sl6#qQv5j9^crAx1#=VVJ|Kyx}k)1<>u2#$Im?$m@BQR={8Ci;jSR$ z&&$4e`?j4BkTJlP?*o9sIXJ#8=AW>t@udP2VvQ#YAkOHT)!p4-3A#Yd6WPdoO zt?j~sDvrUe=o=pUT*R=$S_=D{fn?oIpKk%wY8?cuXaZB?o>*L#uX=HO5?RW)RimB8 zrmuN(ZsIAl%L{D;S9j+1J3CcB4S8ex%%-rSbV8bH@PX>=5&S*dbK-uChw$mfZG+Rz z!C_AiHjeUEd`%iApEgG$8w^#at>2+HcOqD;#c0an)P9-tx-oqroA;1OO+9aPXA-vP z317S>aKxZ2EB||vo71AbI{vP7|C2#N#@_GK=K@I0_y07tZ(mO{c&V+mNCo%3`ctg?w+X9c_2VSilPe=J9|>|QPf_DK z$obY8lP=vcnhxS=$QZ8DA>??>n){OKv8mW^7Nu6%?f0^Mk(Cr`@aV`vR4;>bad3s z947diT~Cbk!8ylXc4F7duykbmi-*Kay6npy*J?)Ju{_gqlJe9bGxFzlcYIHN9Sx)} z6UC9It#waE1@ZpjOy_u8&eB4xo%smDn<17mNMOv3`~6^LW#y48{$vBj8|^^Xc>T`~ zzq=Plha3_*Yxb^6Ga6OGz)lXjQ`7Eu^_c zA@ZpI{t&KG13P>)?n074wB3B+`MYS08G&pvsj7|Aj28xwfu$Bf^;Ad{oR?Y@tr)(|iL zMg3B*VNHb{5yqwdrc&=eW5u^ZTJxfx(Np@_aiP~Tk(=1n@D1(wqdU84T916oj^#{* z7Y7S~jQc2PB z;0jT^a~OkEn2p1|r8Nms``PIvE0T)5x!8Hr&R0R9FG2tp*$J3;{(qD^enZ3hE=ci} zvCB3f-KqhTx@eBFo+#YN#GUi5KseW8R8J;}97PxJdKQTqD+@p};0hNIS#=1{gHDf) zZ!BKz;LF#qm~y;JMNH)GLO(G63unpF>__A^yHHCjl>N;n>$FaWo^iVD#=BaMThay5 z5;GH{Y+`r=BN4Cj?!k%Z_sXVNFm9BI{d9_l1A0`0!y*!3e$Ir? zt2LsvwKcKUWX2yiy;2OjoOQvE;DhlOud?(2?6fP>1CH1Pv))=?4dJu0=a!#0Q#>}K z`29a7KnoDX%3W#}xip+s<{$9GZy#-^@3)!osJ|gQv;lJ$aCU9A%oQ5U6=O~xv^&98 zTa)g%oK!}prLO69AX+;^S?3FF!aud#ENHvCwA_hj=Lqh-fUy=9X^kJ9%fMLkI3o2x z0(QkFJ1yX`koqAIn>A;AWkq~gW<7MIX>u(f#^L|)^c4ff{26|NRAFc5JaRy zx&`T$5Rs0NgMp}Ymvnb`mo$jr+o`AoZE3qXwMB^##Vo z&*G9XEvH^*M*Nv`;{PYU=^V`Hp?crnNP8BYqiG8ET+xkI4&a+o40P_pB`apypduFH z-eu_Ay?fL7NIyh423Rxrs^^g_S+=&qH-1-J&6b7Bktk;HnT+|?CEMV_0@2ZVqxjxO zKPAzgobLv|*usA_xQ)`oW>!`*@h$T@h_58jw+N9Nt{q-uFJqJ`DOMF9G}l9#;`(|{ z8F8jpR+`E4IXH_ygFd3!5jilHTfZYOE#$_y*gJXn{0*xo%<$^1WlOJZ%Vscs@zpS8 zcWNN*;M{2R950mD9RA2Za>y0SYGNpLG(iL;N4!q%l>05R<+FVZ0ZtzzlesHEcYs#V zi!H(K+iOq{qJeR`1qfX8xupf%vUI_MfwLeysHfD{bQtZbI_#8~Qov%;V|kbNINp-w zA!7bOHl^r_jG$L@Ill`lD>5f+O~(755%ALEe}IQYi<^NhCz{V=JBsA5<3f6H9}oi` zD6>dNzdv_*TAeR8tz<^+%`Kf_o;xl2P)bbEHRZm@^FA+{mivPAiYe)?T}OUCfJbu< zIKr-0C!clhGwRr-j(r|p@2MB}JnqFDbW(O)FV?zlt)>h6UfL2p81u%4rI7cPho6OL z=_{Smy)0_^kt{8aRmTVR8K&H&?>!|#Ny!AEaI=@*ouFM|SyE`*>|rbKXze0)%#~N) zVZ_BDDt#YRaq?E)(^lzdw+Zj+Q_Ew%?#2F~Bp^_RfC@i{g%`292i)>sP4FWug;QyM z-V~Y&%(l5b9KdZK8-(z-z1nmU55B@%B4zM2VJ|@O$0hf-{e=RZ*ZtjJj%dHK-qru? z=P9cTfjD&5`E9a>mm0()0xN9Bhi;md)Sv$!w$MxZ-w6Gt{~xr_(pV5IZSkF0mYjld zhz#euJjI#J>*82~ef%elAH$LxjjB&UTmG-N9A=d0okJTTbO|-n4BFY_Qn8f4E2Wht z9EDrpVffMIi-S2<9X(>dHRQT`QaV<|!^fx`v^noa3AVJhw$=d6ui;`X{zzPJ>1qEw zm+YwVK6~fc)Fg3i4hARM89v7`;bO2FX-{ZRf*Xv;VaXt`+yQ2Ft^Y-8^O9AI{aaIqW))aMZ#YZ-%2^!I}mwM#-B0y zUkKI2!AP|E@h9)__~HG9wtVr<5T^fyAFPr7!<$`&+l@=y@j{@wri`C(-jynTmkMBJ z@cJ_M(z+)!yA9|>CVf0FSyR$7OUlH9-8X$(E89Rn zr_|3vS#;@k@crrV+H{E8+4gnP%>N~ploAKLeNx$kM7U>V$=3v(7s<+EA7DP2UMDj4 z=Fh%G@pv`gZ}jc{Mnv{GiXG-BURP%xey`7!=!-x*|F6jVW~N0cBIC(D;j4u*X*-t; z7nNpIZp=VjUH2V?H@}hgu-ENOngV?1?vHajDxPBZPkoRSgR@bf9ilUs9+?*1iJo1p zZuH+c?YEdzB_oY5{2JE}%ISM-_e>?Mf~%8so*ED2z_4eS>m#3_Z*u*wiH)cOu7<~SCU*MFoX|#(K&Ir2{V#e?TKpdQinc^g4g;m=CMeAvX72Wk z7Sd^d>-xPRE%8ms_vpYXPE=I3h>H_SL^sX1CyQjSMoG%6l3uSlGfWFBGZAiRMAjVM zoG#rYZ@yhwU6r_5`gn{SXe==k5Et{(N1v+I{1>DtIV=XX*Zit~X_&QW&8)KWO?wkD zvOJxL31QgZWS))H>LZ#Xf306F-EHF#urx|q=XPrp^z0j1Q_drlh~thmVcX;O zpPh?X1JC&GL>r|~J`6ZmtU}oO^%Ndi*FjaLgzph0R->T)_#OF!CDS1UTHf@j9$De^ z6P@XHkWaJdaQITD13Oeiud4EimgoD>w@RT2j(#{WWmP3n+1QH5+TM_-ZCUmm)r%*Y_Zj>~@s@rIVG@KSDEgt5uuZdJt*q4S@6u2*Axxd(##WpD*y&e-AT$d6H7H>^am zV*~M;Fv7ME7%QD`w0GXZ)Hk1ZkNxGSDa(f^CSC%CfMyDKqOL8I3tRzY?rpVY{! zwph=AAM-)V;{F_mH>(4LIWsEvDVd-^DY^cEd5M`q5iep1SE|gjbCv!0#@Rq}$VHgn z@mNM)YTIFmGW-YI5NAk9!`L*&yV_&h?r*v{87DBrk%7F~FV@^oXRrVjUbxndFee_MNMa7`nKfs7qP(i6jl$QZO0Q zTSuk3GQ9Cdj(Qh|k=*9*E5R^@MaNmamTWWAs0ze5MjE!&SlLuQinA?kQbJqCJzgr; z(9-0GkaJi7eQO^dpH)MxFwuw6|8J}~`G#fh;>dl3Zua+FcD=9)uZoqtHA`qzVwA>t z9MH*q7MRZ@HNmjX;dL)Tyc#zlnvjwwZ^h}O5sCAJ0RbPrMK^F6;xMO{9cT*O_8Dj2 zOcIyJVU+WJi9`+T!B(&UFPrgE`VG#S{Lf<6aLLgRDw;)3Gfe!+$k+-`y30RZ{I(tyCK6G;LJ_XA~|2 zO|~T-efdS|0qX|d2svuZe*`}|(i(7uNo|=NRW@*sScv{oBU9%kB|Fl<;vMOt2Z=R* zv}>pRS2!R3GdvCp>Nu3tXQ^{ax_6NNoo(qAqtL@@fw-7^>choH$G3T1sMyEN7lD7C zoOs{@KolWfYqA|#SCeE3OOV@3KU%`WT@h~`Jso~CZVDpP_@LWcD+k039N-1B>};T| zKtD25z<~U)jHX3O*RjU@^)Kjacfp&ET7I$Wwz>=%RhPFnshjX02?9Hp;%4u@n#d&K z6S+bui9m7R2(v7mM!#1`J8rtpQnth&>}$jwiWoK`MIdHvOIcO65~M>ci%MTDU5!dg zDw9N8dY#}hq#V9yHo7ffD+LK()bV%|R`*e*`}W?5kFPZpn?D^1O2O$Uw;ays_iadd zOpCB)eIpbODPkqBX$`v4y|8B5IkA|dvZe;D&c630v zkwJ)R0HG>uh^Tex=e-GZxKHxOEZ$Ps1|F|6y*F|Yt&ump52lSC^xe3D^k7$u@)3+$ z!fQ8H0TWFrj^Z1K$?=(SKY#T-zFf;^Y_v3+*FZK3@*MKeanHKL+>enk6W+?gtErbJ zW+VP2>+JW+#h1EtVBtXE$e*eU+rx8*rcIoMrRQK%f}=&K%mU;546kUV$m&tA$NLM= z2${9n$G{s;Dr|37FcYu`6zvUY@?M_Q9wn@6t621ns?d%a;kmlIAu9GKG-|rl|MhL} zY(SAJur;}5+dvDpwdTCD02ROb<9nAb zSw2)dn{ce0EQ$0D#Koi^IWA7S6LU7q7#&eCc#Ezk64>yu0+(q^RR zWUrwi@)j%70LU0C43ZXBc5Uf2Fw>W}XP=CF`e}?~lz+HHWj~&^n!fdN*XJ7ysD-`mtzR;Z8Fbf7zF0I2-6#R~ZK02&T{-IHC{vB@ ziL-L0lRA=E3p5^#Rs(GJy6d|w6J92WUkt9hozrQPx}%0aiH^BPD2!MXWl3(xMb|05 zC~JK4`Bc2T47qPEq+V&#hDsgYN2MXeB(-P%yPOW;QO*yRekkrB=4EExZ?a$xh_HGG zLD)FBv&}e&*OiDxKsSb*u>ms&U@v&^lDnE=_jSsB=FEELSmY~~gvkr@er?BD@uTq5 zYf=sm!t1{rWJ&frLHC`2Cbm>mZEV+7ce$l;K|vj`^<@8p)dlf#@Y>RRokpc9Tg}Ip ztxPlspo9B2q{m4>94VGxN+=qBI$aj=-2Yd7A7t(rWZ{JcBiA|Rw=DDL1TBpJ)S4sLSqWd7Exhq)M0p+Aj!ytB+kl~iX*s( zMv_s7<~<-EN)CLO{qWOl^2bY&KzwU5*$2AqW3I%zQk2eLjitiou6q+hgmdt9-vrm1JFE`GqQ^YxGb+<*1Ln{nGCG;()~+-OD}HiT^zm4_=2$ zSWIV369;Vrqux}F17y2yZ~No1_l+muz~OdW6iaX`{15EhO!v5N#^j-+_m@K7EcPGI zkanGk0q-#@J4#v<$|rHV0d!g&0g7?=X>MI9$=#*=X{i;~j24EHMV}_&{33kiCoW|W z-yY+QA^0XZq87JhtEE@}DU0oyXu)$G{wz9{E$4*x>t|KSjho{xOvcoB1s*9rt|z{g z-8D!YrdC!h0h1eUFi2@TM1mz5MtY&PkHU>u z9B}lxHaR*oe80oVs^83Y+3LX$l$Rq@@kkSn$p( zCF3ISkycn{Y|5%Jr2jpvNdk}7b=bkLa}LjyHKXs#XVNaJb&AdV=soaY*i+q)3t%oTLxLY zA3Rt5&dWxlqjZ`qxKCX%PGZ@rv?hY;;a4SB-es3i?6e@4&(2@kG3LW_=&chzY8P87g1ATxSt=oqr3;WyIi${ zZaVpsy>R?7I=Ry|pI|aRO7DJe#PoQS3J-I-lSDtcWlD8n68A z57M5|wsNnBvg>Rx&HcplZ>IQ71U{Ew3AP&6%jO>KHy3Jc`9*iv6Li}_WECOFKy&sx zzJjw+-g`OoqYVoQe{kHpIEFq4TjPcON=}ovk>>2)X`?5Hx6(XHasw)XgfI1!KRJ2ZgofzN zcm=?ytD%F2_oP$R(|ZZTo;F(Y#=i;=dK^8?=<32E>GKXCAv`dZrS0SQIeh-S@7(;V zpp1rnm4n$X-^FNQ)9wFwAZvo%H)0ba&NiDZSns@zhEF$SXSqU&D)=lpAE3Fg`0o8> z@0?gXYqHVlQyWs zfeIb3TlRHP*yxh(_8;jwZx`YnP^Nvl#LZ7vA#6{{sCJ*3sf`>Zn4#IU_`YV-f<1<8b z(Eh0Xi2q8(V9OyxpkbKk0b?0M(RR3PZIfqA`?WRT%1=$=&g|cLtiLuSWy9WX;N0T! z?KP819R?LHiKtrm>H#(&o$4{?c(s)KIsd6$)Dz8YZWXn1uJSkJ2Hc(r;?n2UNp#B+ z?3b;?%H1McckWF^akBgGdmKEJlN71w6xkopKVWx!mrxoNzN5KE9TIu{raFGa!|@Xy z)sGAc%c*@-L^!VBYY7w6Q+BT0@;PNM96L*r!N!&?03n+hg?Kl-+0t=l($gdkj)QI! zM{KBY#^6A4Dm~lBtdABK1Ecb=YL13{Etl;3Dn_ug`G%PB7}OnQ#|9irKDg_`_DyoA zvE@d02HEq8tz0T>5#987L$|XHAKTHkf3t`*GSC9cXBOZw7aWjzxUPZQJ(Ye`Zl1W> zpd%FXJRzFfmA)pH^9dI>er%Hn5&D^pA$$6yT0=44otezHW(%vd(z_PChND zs_arsGI+H8AiErKXuo${ywZTvBq_p!dlmF2I*kr*`cy>7@%SGG1GML|Sq)rti!J-P zhlqZTU%xe_FgY_T4y`o1m5HCdFyjq7V|!WrZ&m3YL8Oe@vCrt5Ahs>xN#wZFjJ6^4 zzF~)rBj5fGl)tNn8oj>8Gkd2p56)CVKVD7YjPYJ+uv>N`K00Z7L@hSQ;C*80^L*`M z-Dk}U@Vq!BfP7BWsS-ipxya!j4F*Gsp-8d^K zx(g|%Ok+}y{2tdJmqZO=fjsm0u;rc87sD;AU>6_H8_@8;Zvnfe%NnR9c1TI1kxzaG zo!q_=dLy2HF%7+VGt*UEo3!`$)hW(!KJ23bTkok5Re405tAOgm62z-KgTTL1o~qKO ztmkDcPpyZI_NuCvwa?4)4d0QmmiL74oiw!YlK%rMb)A^-+^TR|!J$m9z-ZVy z4eZyrHg=ea?YsyX-jkF9y+#4bkI4uC>Z|{9=@28TZ{2j^%W2Rq)!h6iXYYIlvf$qz zofY{iCHIdT)cCQKGQz#}HXxYc_vq)kNA9Ry=;SGWdIIiUqybFK z?kgB9X&~vc4Lt^*Ogj0W^aQWG#4#-h!{!wepMVaV;_Tx~2=GX1196Vp2F+!*wmV7C z1i83YLp7@`^wk1O&0RIU@M#a;)Fk9W)yd%qBF(uI^L}5t3>Q(pN}xZC`k|f_ZW{O0 zJE^=p0;`anUT$B`X2&kbYNjy&FH>SX0|_bCy8g=VkMVuP3SepZ zIRnz|;OX@OEF(t5o7i-zk>tt~_4MCq_UI0FRdY2%f9f!{0{doPts7HXj$vT~3Rv)) zCr+mC_Asw_jRdMzOhxY^uod?<$V9^NAlm!xH*}oi)^bHUtw;jJ?_s!JRuxXBWj6jz z3UMfM>#^2G+FsrheuV!T;~11KVD{%F>gK zGKe5YlI}2F_d>tnKQEX-rxr~7p>8OE=-KTY6_-lZHXKHCUvf!nQ`;PMdOMN>2c1ycl{lf|gC zQQ`3Q%IWY9^saj~H+gQ>>FK@$8`zVIL}Kd!ubfXU1HhQ^(q{&kn0L!4ePx4M4+dM7 zt&vpZ;4wPF$`T3EPZWr|a8uj=I7y>Y>7&JyS}4Jal(nksw{S@{Ubvq4-E`?jn>(H~ zyY-C@`_K=PlSy_3)wI=J)Ic+RQB_%3eYMaaesOki=}xOmw}ie_5s}wi%Pr0^4gtf} z_Y6$zD#mhkF$%6JL5fR0+1jtS3UO#3ldi_|Dtzj&AwIvls76XkRz{3f86bwI?STD- zGSP<(4Gj)D{|2F!F%8V%L8Dc)O{OD;h-x|Aa71kfwmBRR6bUdqSi~L}HcGj>E55;ji zZ&+9~SsB0a7)oj#@*ZmUJ91u12jw2M3IY(89+y-B#zf+z`S*MSNDl|sJKHOKvu5;f zHg6N+7ChZH8{%DgaBqp{5h?XY{ zO%qfb1w2Qx9~>NldgkBQG}e|EFE*|ubpG9zLq?^&t0aLyq2nyJr{Z$LAm!)ddZT7r zt2|r>qK->*BZ3i8p1T!0)|KMmyh$2Fu2&dI8GmB%wUH^r z;(4m8E*0}^hgu&*HU*dYX2Sw(xYT>?fyY^;IJ*x`_E5y;tD$~kBeqM_vig0&ArS z%lLrK>jw5mZwq;whU9uE4v73gae-lJQqK(y+-~yY%hO^+X2kg@S&Q@4fUtL4oqze) zAshJ2KkfY*KYcJ;*mvYcqMQ4Z6BvJk9Bh1AdsRkgWhe&!N)jrz{{2X~dPil^SQr!u zpGxkcoWb!E3f(%4OUn-W!?^XrIbZk}2=VD7-$3EAkPE745MBg6%Dkb!4z}<$L3Q*C zVnde%u6fapK7`?ctHDEfVrl7-*&iFSXn8#3?r;`1x%3;xIyepwe=OpmJHje{2Awe? zjlH}xw?x%G?x@uXu_KiX?wPS1H3B2;x9zyY40MeXw;VY{infBvIcwLehAB)1#}1yr zn2)8Bh7tu!9vXZgM!Jjc-mUZh3FeZFD+n?xfg>s3&Yn+OkEMt4PJSYG@->ja)!phv zgk4uoi)H02b+Z0+iW?zIuy#>?zTl)(hn7u!hPl|j{JZrejXg7A_=K}MrqkbayPeDK z=&lBsTp$8jms;b&Qu#bzz;0(M>h-VzpsM2O1vJUKakz`wYmV!4_oxFZc~)?M zqe%JX0ZLd&Vk~N*-`H(`D3Fj>SI{-|dq}{*VZfrVs~?#K?NF?D*TJvSQnq=?ISq(L zrvJ??Sto297IcbbN#Y>`{%mx;!Um$IALYz@vpbo$VV-wb!I(qtadncgKnhJU)%4&j zN^+f6$n4opV}+i~Bu*=2Si~A$5=+xKAiYrCY2Au93a#rYR@K#ILzQ#v+v+O+hInX8 z@4k?+uq)P$vg#&cF*2IYYlX#dsj=!9$*{(0PKEOGnyEy`HCj4|#+O4yR@THkJANDS55}U(hzBf+JEYO(?cIyQbLf@z&_5jkeyPa;t*6uamWouK*5 z=VeUlnNMySzq_#E6whW=>fXpcYMq()rumqHclBM0>gCKous-MogWbdjNL#p$&N5dS zq!M%#fzKTW;DXO?zH>D8oA(j`$)yyee(N0~5q>(eU9qR+){M;Uhlr#=>^2XNmZlvd~r=irayaG!T<{1q)IdzqnkgOcC5x|sG*C;y0wg2ln zF<@UC8|l??q&+I-(Bg_PuKyed8Du8$^7>e^thpU}=GmN(zYi{Mq8OhOo{*&Eh!+ca zy}b2`BEcj$8&^1#pI@qj!%Ap1|R8xeU05Si_Ej+GiD;P&;sQPNS1 z*Yn@7@pq7TfeBAcOng9(P0k4)5#g$L?2$-b4PZxLH}ac_`7x4tNI@|OmE%slu0pESMBS)SH9f3t(OHqDs^HEHxpg>Y26lAgoe*`d)}YdSQb4kGun}n zUe*%}ypBn1FRPZ&I=W+nN(KCSKQdK>&(2gD`GO+lNQgCAaB4D@nD4vlK8ophL6+ko zI>e+(jrqlFli+P&Ge6gKY>Ss9OY#*wyGq93p{%*A!~40YJV><|Ag#GJ(d)r<^wuH68(T0=X}RCwK=G6s}aHHK*&o?A`o(NJWGw>}D& zOsIa6QXIm<9`A3}p<^O3er>PK^+TQ-l&jblva=E7FbE2LFBQxu1(LQy*FzbiQ9c5|kf7?&jPR!M!jA}X??-F3gJ({VX-}U{(IYD#L zeZ_{3b*#&<=%eud4Q=s74B;5)ikP*Kx=9bSKLkP#5{f1-9ffG=(&&64?B%-hF?k^;9M_rn!W-d}bFMsHo zt(8^!H+8?+9NIP`xnSk9@%u)%#q|0dLhtv!2BZnyh6YBO@0GKR5|eWWSO3^sv9i}t z$LSY>tnp`*YLA9Tf8!{f4R#USE1%~MiFsS=xW6zTtJSI=R{7)&WZSM4*7`lS$7f-f zg?&#^mgVg<^s|2~)(?*$HAW?63H?HQWh>La4J*N0)L!n^p7x`WLYS_TD-{; z&o90CO%ew`?Ud$LrgA3){8o;tXx_vKCW6f0s?Ca>P3d9APWQJxt12s9eM5o&kXQhQ z!s)$R@61MTQ)8!npNkV`%%=4#;e=TS-Tbl9w6Axig_&T81z($4((l-ESs$A;Zk<|g zLF+;cT_FEE9|c_zWJFwp21~n@OWoTjSGKJC%N6T0)_$UfH|NYDx#boIbNx?c$}+X>5Kl&TgH-jeIwewqy|MmVEx;bPZezO&-BtRrU_z&Cp(cv#BZKbmJgFK zCwmZSPmS_pY!+L66bYJ>t%8bRZYSSgL?A3q9BU;0jGU%5HF{h^-)Ttb&0aWtw(X3k z?0<{oo{Mc+4E}^YN7B-vq1_pHM5=-|ZP3*i?K%aP?l_Hz`b0THOyzdv{o&{#j>q(V zma(HkG~C&I!ctM0;2~gRsxNjLegS)zRjt4u&<+S8=bk8PI{l>omN=Gq^cs?HRZ|?V zJaz7zUxaZk*JBB%0 zC@7N5;czt_HaG8!!+)$KEyfU#Z?QMkp!(2WYHMCApkY+EL4Yb+Ax<}LeS~8e%R9&U zCXaWiVR0jqS#M03Tn(JMi?9)XgIj9L)exZb)h@Q~vj@DeB5TO{5XQPqF4uaKsJt`f zI9As{ckL4$HN`&_C95VvmwTUU!=M{&&>O25Fl z6HY+mq*v1}*1!a?sZX@gUATb8A-*R%unB&kzS9 z+6GC}wN+QxpVSa_QFHSr79hdP5O6J~?6!e}l#TPyb-!R$A2xV!*o#ADMVV!s8?0Dw zn;r18w^ZefjR|VKRnD5glRQq3|>Y^zP(?*xlb&r%(-g(32@Khqvmr@ z?kQs9VbJA*Sk|!3nMW!KeLVVW>NCBmcCV|RdK5-{ykgFs)e-xRhhf+;&TCq1CND3t ziljUn$Q*M;zA!&cF3`s%cBF-p{nXAXt9hi4+L6MLdEI#_tYSir;f#blh;|HN*ClJo zc2DgY(~wlvaWdJ52OOBf;%}Hg^$i5ih?l=6veh9~<7RB!VtM0SZ-3i#?&|<?{87|RFCQ-KboGkGvC{3R%0=wD%*gpMjFRr; z2URI6@EaN0;9bUBROupeZzS6c+g zdK8%YSmc*t=3pb&hV?Ag#9f_3XMq(16H#RA8%hAW@d>+zsb28E4$b<>$=b)Qx@^wT z4LJvsu0n_BJ7xXn1!uv>ijY(#lQDMN)Nw1KjkGge>&LYiQg+T&^CCM^IM(!QcMyLx z7Ua15FkE$iLboxUaUUYU3Fi;ti;UABi5g{~A#CM~w$* zV{$COZM=-G17!rcQ58~yQLn5ecneg=7dqSv&nfT*ba#HI^KH8oAqK4ywBvJ?MZd6b z7!e-mAmzY5w5-#F+-!-335o4OOX9_t)BS-^!0?%chJ+-vhAv9}9SpIqv|!tJY>WP_$upaduRN~r5&E@ZM7U%|mkSK~NVrcGGbAkJO3 z9$3qBbvMqK^1~HF_A$+etL^|Y4%Wi2L>||_)_PSW75YuBbbe$RUR-&2#?9L&rMF$J z14LYoIwgIvqNZ0w6x#@7HTP&s1grW!HsUS5hZK)_c3nhvxg4I=U6GA24HF(Dyu66E zS1jhYxwW86c*`?ZV9N5=F6#kdu4raCOZ==3YyMe})YF#bz^-d#P^Qt9eI!d0zJ6*H z``z^*FIU5ipWk<}4Js{I zgsRT8nNQ-Tt=n5)zeOO=W9utAS*vWKXVieL4*Q`zjB0O2rjmSztwM+2_&#ms2}0}j z>b`)`E7CyxOT~I)Bu(TpPbu3Y1`4pB^$jA7JD=n_U-+ zqnJkf&ai+-LRMk0cys;Dd+q$;fxP?qrDZ9g?L8ZT5d(kL;h&PP61^9-ueQB4-`ZZD zue+ZD>gt>M3|6n@PJO=&{A=a?tJ@xIPxmH6>ka`9W%HxWN+!=gnT!Cjen~?>@f|vw z@fx08RLdN9x`WzSc|GKS@^c32^1TC%7sGj1R^M_m{biZ9%R|A3AF77tHP%=wsIa_3El z6DBf#Gcoiq?&ZT{R128$H|9UWx(T z4ipOG@fQ8FI(prPo?oYWW zvwOCHQudrAe4%y?3Hqy`iW^s^uk)ShU0u=L4uN}bNKbw9tHwiZd6%x%G?eWxAi?yY zQ_tkQ$w@a7>@1Fs*aRPTJRXlg9&9S~uHQ$BdC3{+b-8SAU-%NpT@u!crOhCM^pqJI z;y%B^q7Ovrz*{%uHFM^aLx2E#1fzc55SmvUkt^W&|)q-QZt zGV_R`UP=X2Ycjvfx3xUwyx&X52m>5bQQ!t1*4S9`1u0R5%{DCU(Qn1ohpK%#d)Fax zq??v6`BBs4-~vGM^5cs7wp>*A)5$tZ`8=W7bOI!+icoN%@Ch&dLQ15+7~62BEVq^e zR^MU=#xy?SIjU^7)0+r3d5erzYOl}Q>YpAw?*6x(bl8F}crAr}^+w~J-WhM~g-`mH zu$dc9h=$dxq#s$}48^|~kpsyM7ROO@9Co2k;!O3GbHKU5bHSxar*KxZp11`oK5GgpZvY*fEOKWF;Lsv+fz(zlzH2O z?mZtq{T`RQzP+79p`qkJ*_$zz3+vzR>j_Ejlj;1O+}W8-;aolzkM94eo%AH0D7QK! z2OYyzb19gi^_9%M&r~^*J7yC0c)adROJm4322M51R?Gnp$XgLm$-j;g6O2RW2^JQW zPyC4gYq`kluPWM-4j%f{A!J(ey5eE*5Y>Zr+&`RN}M!s^mk83xA?+2j7*~2z? zd&V+l>>OV=utjD6=o6bo06 zi@DFS{~hAtC;p6Q!NG*5 zx&3+_mt$RyZdV83xw*LslJ}}gbRyWp!)GZ*55BX|1n=Lh-ny;&du=XwXC_Qp)X&XX zOovu|(~&FT*HEu9Xy~Y;;}zQB0*mjR*#i68uD^cEieuUe$zEi!IQuH|awBI0z_jXq z{aI>~-=R{V#x;@SNmGrj*H_%um$LIiwi8LhJUiAKHItBWH|MyY@`lpN-Dd- zvA!C&dA92acV-Xn z_D*}sb}m$d!2VShQ`t~n!c(%>UN-%+5=Ekm9SMv^Q)%7A)K^TK2Ol5YccKpvdI<*i?BVmsp-WCO4vUh?t zqb2PGs2?Gn(>>)M$0^eEYUcFYx_q^1dg0*sw7pE1%e2Cuu-}+?&7UuUJ+TGnaq18! zIpWa<^*aLFk1rjVPGzH9CqK!6`Uz%#s?&S~2{TT*#Q$#8m_wxbhg8h5yxS0Pr`dku zuP$hxb&-@CFc72@VnGa5K zpWUAeXIfGCV|=0=%@%YXb?l`|IPRB;)+-6c3TIHb5Q{`B{Pc!-^J`HtB?by@2>+F< zdrvCqZ;}+1W3d~Iqrbn#e7YpBH4#ZYWNW@G_D*$2?3wx;-tcBu@Vko}SyzaRkuZ&> zV9<6zGc?rc`cqCBBVg`(muZ*T8NKJ^5}x#z!q2#Re=nxEzY)*>aF(coJ9C}7ukcpB za+fJERJdIq7{46BLjO+B%?>g}Zoqphwk$<@I`2qxd$4=zwLRgW+EG23Mh^hlHGq+6 z&zv;44tP*_N9n&lSg0#!?K_7)`(!yKHNm10*WEtxn77OO0Ua`=-9AvAY+6 zGct70zn8aTv*<24a&k8+a_qeRDe;opWSeMP|KCfG8oq^zuevxD3E8j?t)=v8P7USJ zCF=uX4oCUQm{~E_XQ$D>7W<_6EbxLYzR$(d&gqnoS-S2vnr9+H7D-(F1}(Jc zlOsLmFK|Z}gx}sT;77(q$uiD98GM$@A}X9*P7%Uh;4X1S!e+j3_z*C)$rii0F8{qM z@n%kJ5VkW8$iAj!3`)+TLAcR(qPCom&r=Wp?^*cj`P;LT>E$*h?02l2^GkHvfk4-V zpSm!uk%!A!!ksQ#SATZupgPmTcpWPizNR|NDI*j| zG0h|QmY9*KDrAjYNY!~D{-sycKtfrS^N+l>7fD#L%f_L&@~wwL(H^d5}l;`9Qnr4em52wvZ`=L_24UQqN$&p`GGa{Yn=Dz@^^wJyE+ z(scSyPk#-=_PI=NwHgnZ*w#*vg`HiV zP>1hJ!GaJcygN93jpq5cJ~s4#ryU_-~$HpSX9?MwNX9DFuPb z1}&?_cAxqJ3JB1y7#Xmo4Ktb(pL+@%<#zB0sr;hn+cAoh-Ml*rD5RyN<(+cIPyLuV zF?BzwI_iRY^c-5Nt$!AgPQWFu73Lkxk#B(3%C9XZ4vw+SO4)y}S@LWNK?jQVs)xs`97kXz{O;&zJ{-Jp z(Bh^sqW4t_`}-ndL0;E*$2TU?;^@e#Z zhQd?8bqKhIGx2v8UVLtrMao8YS8Y-Ab4``{hn$Tfj&WSu$i3obs+{t4{SaFE5dFpX z*N*-B9>T%a<{7m0$ONTNT#pY0%I)Zw7cv=>U7VhyL^x01?C86Y__+oRd*rO1sO=16 z`QF=nJ6`l>=qGN`XIr#vFtbBuMs`m+VcxwW!OPK}NWHH0Y0O#4n;pzgG!Ro#B@?_u zB;aTX&P^Trt2f=dDv(9%pE7`)y)$wp+uM6)P{!~(=7Cw3(y~+}iE^D2`j%oQ* zZ8E_Q%P-6!S=(vc&9@jS;hJqKrHN@fgeVd8v=or|Z>HauZ0=!ZXQOH4)4p`n?o|>| zZv9Noxq@dxBOEPn{zQcFgWQx-n`SN+2F!Ij)fM)w;ujD6%aeFqgBcpsS*{yt{A$V! zTR6RjrbCAb1dytY0OtXJUqnWZU5!|&vSOc<>)lCg__>#3SJ;-@Z%0}sdFdx7?rrO% z^-}zm^^cH@(KSG`2rN zrR{P#lVVZdLd83CgkVIyzT2aa)^OqMfQeOrNGwdB=7?tYyT=>z;W3+p{C2M-&!)%{P-N7e(6~~?cENr?mhA0=xo#<#>E6B9P;?*BR6bw{ zCj-O~+9fJLCR8%ykG}X%fpc-(`*;rI#FPG?w|RGea(}P;oNJsD!RZl=0#%8SpZ^kpd)rKKRh@*<-xX|=-L(N2 zR+(@Aean9Tz~sXT>DhUEZR)|T&UduiFk`?y`{o?-cNut9c+LK`?y#PrzF2lzz8QQ_ z)6>=$y1$|ykx2pe=Dyxbgg&aSybQhld@6_~5%J$OD9KYdc@N+L?wRr(`0bQo`*z&C z?gnuym`xsq{I4XTKAKaKx)Hk8Wxgb)r@zJ6Xh3)s^GSNE%{A@K7f@so5BR2E3CB}f z{?I0Wru~{_GU9V<{?9i+^>K4t^^k3)mKjA)xY_gm8NW-~xW2g5qnl0ioGoU-b>nkG zXS;01>{dw5#(6<&g({4{@+KiwIyEWXO;I1T-FImx)oHu+^x`Z5iMN1N%Q$2(-cl5X zSVV8shAS~5Sgr6DoJJu9_b&b{OAQuJ?d(Oj9Dt6kt9-g4oDs(mM<*x7P}hIY<=am> zzYTR0R*Dr4m+E#VP_M$S$qIf=w&+dQVQ!Z#a^hOel17G_8n@pz2vt*w2<}-*zay-< zeY(;1<37hH1-$U^1kYJH&ijn?+V4+?8wu$2@zV1^(T6<&`6YJGb$?oA#K+lsmjZsf z>34ucP*q2ttnp$fvAMl;E$tasL@*@^CQSmnzMC zz(Z~Q<9|w=U)#*r!c-x`>Ejdbq%8BV`~m#Mi47fdZr^CMJ5F6YzTcq)>5jA^GHkR3PLUt9hmT!N!EC269vHYxEWnKqy^a}(y>lO)}Bwi{jdBH&ZYHOTd*X%-K#c&kEz0b zm=a*$GMheLRh|fX#wY0opK>m@dt}3j$^Y?5kbka52auUx@Q@nNI|Qm*dq)3>+j>4z ziFLsx2|h3k8&&NE@D|rjoF%cOY@WrI9S=2P*v1{Ag*q;)O<4>d(p750rH8XSB=pY+cmeJY?FC{`IBqhw1u-*31BlXDU$YCkdnL z?JHz|3)9si2dy~$JvO^U+BeA@fmzrNVPWCsLpv|r{nPKA=!zPH zFq>W@t@Yu`+>E4`RlWpl>!r^?b$wBKsec@_UrjOJR$8!b>Zq7bXg~S%Qfi&W6=*x& zl{bhHMP1k}mogNtK1X?Xo(*Jh0v|QvBTnBT1umj7PHDsHnPuLOOD6`cdD*{KW~jY_ zLEy9IA{wB~?oY@cZgUqA&_cTukP~D48VM(Ym4FeGm5+4GMOk#J=nr;mp(A|!1&WeG1@{}bkX$hgz}O@~{b?Nh>c(6Zx8sgI=k1KO>z zpNHuEglv>0mYxi2Js~BybV(uxA|n3t$i^wMmOHC--BN@3FDv~; zCoXY$jRvROh}<1ne)K;&b;g#j`0t+VKqg4k&U015NXMQEo;B_^H|M;#N^fg(s6y!| znHGuq)l}M?a}5ArTRrh@lQPtBWbL)&<*yeK2EAl|OxH|T_js0nymuQdfT2XM*8SJJ z`Z><%q5ju&myVw+_cU~lE%kp{yRfel+=SXlXevt&l{Gm*EtAdDC^i|k>616lWG#y^ z<7ej0SrP}J3NlElO$Nh%+JLC0g}-sv_TAVD)dR~0Y{lODG!p>&i~hk|#E=5_V%7&E zMfTpKRbiiD0bOn5;PWUp9Ich)zOD2!!9QK8pz>e}sc>nJclT3;F-q|((t~xU#s^tW z>x9i1PN_Ok&+0fK+w%A=K?}qV%*-SsaOm--IjV$)mg#c*8jIe^TBG53v8?$wvX;SC zC0vc;mGL`^^bc$?4jI&oJ9OG-tco&GKYr`~WC=-eRG$AE}jpPR#9RRsGnX7WFjz@9>< zBuoWqlNWCmw`)O=#LumE_`|xF;USZ3)r#(H--OWoVWPS8S1Mp9XIZTetV~5-yZ@_;-K{0x z0WZD}T4_liMa+T^XJCETB3``y$h5aMm2Bq!nm@u5!6Fkku=`QEEVRiqWPgf1Y*wmj zmMaY7;}g~gmx)}N6Z&FXH_>T8D_C4s9-q-n8-)y_H-UxH}9d%(K4dftX4q{69 z)mYcUsJYa{(ewWOp|aX-_e*Ig{U40?2D#kX4+;4ju-st`vexKU=}VuiKZ$;yZ?PNKS>M zMjNGBkc}Qj!V3)zF6tjNgc*ia*m3#SC4dXBeAa5oZ+4SsnZuKP5N!R;TZf)4O2BUd zrp+^kO#$eBTS-!JVU~YW+NiThYuAG@{{`gZi_9J(x%#U0lGQFvF*>H!Jssy89vWUa z8ba7@?(^v%Z?8dIH-EBc1@Q0A;g+h(j$RQLTMp=MP0!YW&uMWl%`|C0)vtES`I^H| zr&0H`HX{n}@y&ZVvsG9IdKdzJ5q1ycQ_GR3O2P6qX`RtJAUwlLMK7PVCycb`N3}Ab z`Y%ZfZjgGo`H$a!-zJMcC;OAV#?Ve5sWM1Pf4vp1 zT>TLpRXVVt)b@5_vfBh(Ff{+zCQ=M@k9kSj2$+qnyY1T2(7{|q9H5wV+RCcRaWc$H z`9}WJdqI`jC6BJE)JZF`u-e%bHTvTS&&R*Obz&BbDFVhCk0w37?>I1Ma9M*b?3v(< zb6NQWPQJm7<`TmLZsLgaxJfI>$rOe5&Z{U5y`rf{5CNKvow!}De&m7ArlINCaY~2w zDJv3(X4^+kHYUgdj#L|mt}>MJySS((c~5)@&I(>`oq`$@H!_E0G(Y4%G2qvH{z?0Z zJhcdKk3{eA+#AjH(C<+f+`@E!H)%6Um0_#Txi0OyGKcryA}iz$*vDqOjx*bnDv@}x zD48m*gk<4ok#51v(0Ja!Z<8U4I_w!3Cq`7lu^Kz(LjnOtIfti8!L0`zl^_OdzP!9= zqyZFkw9$)!^4^q25T_hm(s(W1MM!_e8P$fP3~)#S3~8?P6!Z@5Cz@?vIt z6Xba}XU=zLp?gPQMV(Qm^8VSoFa@0@<<3ZY4z&StIwUxlweaB|^0AlCo`D%tgY1sO z6G@g}ivmMi&j&J7|7zD8PlvT%9zC2(MnBRL%CP%Sfa}YYzUH)!%MR?i{d}*t1v`Is z=80QU@lQT3Uz;GqPD+dYZbR>c$buq7P6}^tgDjH1jsA&$|NAG1y#IyPO$2?eB4ru^ zUE*D#N1LIg!`-@ZtEKi+aPO^@LXwcRh1HNQ$6$g9Y;0mH4TfoG<#9-HL(~Gs;ubeS zFr0DMlaV{nW8<&vsR?r=!F;G1cGJ_9A5UD6s-OT@Dq9AtHv>yrYbi|k z2GQtYSa!=re*S0$PU!BGaBq?%1@5)kOVI}mf`$DS(b%M_N}B{C8XZ3a^4O(yT8BOL zYYxh&x70~(3eVxR&1wg8j3G6H&moTQK-v*%KTW{lIkb$X9SPG~Gmb;C61nuCe9JZf zSwI@VF)<`F#(%0D4}dI+tIC&cPX?kS8TDcS#TW)XAk*o)mfJ1*L_5{xnbq7BG`Kx> z9$68~ytseD`g7!Tu>%y>zw(W(Dv7{$3qzGP^eg=A%NIncWg6c#zPP#Cxfa=K#|ZD1 z;46<$w?D|5-`tB_wzD(I9J3+&rPR@yejcD6!Ekin&U<%!P2oOSE$Nu$HXX^AgnVg% zdEXmD$_n*URkcxoKw-`@1oiApOUAMK=kihJlVF=@qskXeneOFEFoZeX$Fo_+^20#^ zs7gYW$Kksj6zR=6NSTu~>#r)>eplxVMhK{9Xc>U}C~^@y zTsD^!rCiK|-$hJUA&G3_$lop!^Zk#(K1>5hg2oA#W$O^vMbh$3G(`sZLNX-_nca$WfP9iHeI_n0c3R7t#Dj9 z%Y-#n`aHX9S6V=CeO2OW(o(w`cW;ZTo&V3JN=Eso5>t~QL+)2NfsX9NC&Y_cqYMI< z^4JQq0tNC>O1OLT=PaiB;LA{S87JHhub9TfNGVJStw>C?R;>1aVsuHY8dov{@IUIt z6quzpnD~@(=xO%7LhB~DZb-zUo(Ad%QW!za1B+K4HvIrD6V#fqltu_Z97e6WDYO#? z>zjO>sxC75z>Ci5=R*N4Q0V-vSHwTwjm!I-@1`f99ThDhWi7hxjF$HUTfeI*t9nz) z_7eXs59QQ5fu+<=?Mw=Ccah8Q{?BM03u6jrmKpQ!{)9v7+Xz>T^Y_KU1>0+X z&K#6*RmkloDC5v|UDmMjIcI?a|2CNgZ#YeqYTub~%_JE|;K}F6I3WBUH903HLmI zwh#_q(f>jaCC*Jp@lzsmOe&(wRwS2r{qyxo;|P=Si^d?J>U=pCi(WPf8D|GiMqz+$bZ z7||7>j}vopvBml(w!EX#1aIu70lrDWFRf?iXJ)A7#w+HlIRpJ*ing>=c`{+}gDYB6^g zd)|i~(>K*w7IZ-$@Z-}0KhAu3IF2A~-5>0+ooX0lCr5U=%49Ff!!+csi||Zm)I^-u z2OlsyqDw9vKT|37Z&=jV7{fgdZ>Kf}Pl!ZBL}K!BO*9TcLch9uA5F3|U60Q~=9h2c z&F7`5uCELLyDd0n6SnChS+2 z+pFK}N2@PjS=1{v12Jx?m-!4>jvk`^ab-ox8J5P%s_u$d(_)Y2_GA~i{}_kxm(Xx?nL{H^KkifUfZ`z4s2&JSx!>pu#9kPlK(371ZM?i&cV6h#)+uh*q9 z(65d*pB9)*j^4&>9-b15&p58p1cy9KAqNM>|2dUnqmg7CDFsL zf2I1{Gemv|o-XWn_Q`Brz29%Z`4<3V=BCm8D0kPKlty1hHQ+*fl#ycgEKO?>P>orEXJ=Og!4Ri1WKqKZshurDJJSAUraM1>xmqN^P{?Ic{j<#1J3c-)yC(X_hwrIUw4O$7C)bBZku#23tiK&$VZY?y z*rqf~fJ0~-L&T3lDLO+D;vd5JF1N~j$LsX3KAUV0CT12F9tow5M4+x`BXnDLqwa2& ziA=7tJeKahcbR?sF8e)mayq}Pg$BM{hk z*%J*v;S`z;Vy+kyI~}phoBWcyt%7;doZXnYfXy!b(6U3!&}iK$!oN+s-Ps6h{VX9! z1l)Jjb-t({!+t)6cGT3>b$2{C9AE1VUOweY>ClsF*qh#1(Ho0i5rF6-DJA$$slkR- zfAP{Oz?K;$%w%z|`{d!dkKfp$Hci>2_f?QdjYFOFytI@~qPn$~)i@}DK`x|ibiF~-Rl zIYfk=gR6?aaQ}-7Y(1OQy?)2O_4w2oxIJgL%XjhWCo=tr+wZqQ?XmJwP*Pjh7Ma@a zF|(snlvN$tQfs-}=F{JQe!XV)qHN^&eX;bY^E+t+fev|DZYibpm`?5)dDy^-4OKZl zK5P@9vGs`KV-ey9Zll!TmqMj#HX>3ibbr^u&n_48B4E8ZiX%H&oRb$08VlGa(YRfk zDjvJFXylm2p_vVBTd&pK;YnmKJ)t$U*H>v>s#yB{+WQ}DFQAqTAlhdu7dlKon7y}W zBAn3EZ3!8)4a9APmyCYa6wAw#}_b#|8|#^E5p|D3|UyQq!vx&f6{SD)yUnA!yYlh5NCpYD=voGQy+{9H3~l^l2~g=yHNU^34p3|a zu1~48cQO;2K9NCxI2RPA`ZZbfm(v=hp;bp{EX6oI(8^&gv%sstbS}on$0EX~REg8z zUXJa!zyBe;?r2rZ!0x179`p*jyaj*ox!CamN}|`OsE3Fj%FKe?^hkB4Lo{z`!uCHT zxK#x012_9?g~#g6nV@5Gc@z3szQceRf@8QYY2#wEBKTt=eBT8^Z2D<#T%`sY0hANT z8_>NKZE9|qi0+L}Z~L7(%SV5LbmlEeFfEHHMc4ZyzY3=3E#R&Q1&%*Micwaha5zI1 z;m$YpEe^Z*x=X0HMv+LSA~+YL7#nQdEfTv4K*eVe&J40s1V$6Qk%2`$5I=HDo56Eo z(H(>48d4I45%oGqpX%Op)!B^Qxu5^R{Hsh7y!YbBI-GpmZ~6FkcWhpNAtmZQshv1k ze#WCn6%(!t$|NxPMQD1(OVqSxj&D$W*E}2Ta;Bi3*KP$FYE(guCpYfIJb=c;5H;Ep zy9D%}L-(j~D|o!ObIB+>j$mGthkkc*y>7YHNBAND|Gs z;;KNH|4EN_|LI>Pf+w%}3ZN4@;vTuUjoQ zgeAyB*(uGB;JS`E*4vI^5LxV3-oU?)c_%hIIHt=xY-hIUarulh!^S^bq^h&`j&*Dp_iEgZj8RFS)^&WmIhJGQT)rD8iXij9 zh+CIq_Ww}qNp8BixUd}U*7BR569$nseL^U*B1)^NF~a9!_i{EZMvWu3al^{@vp>*d zZ)SAOf${d2>>|6EhPAw@9i0L(`RsJLsTw<3X3N(dq9NC>`c55CT*+n9Ik(bs*1U_; z>S#{)M*FXIu`(Xui|3fj_4s=`A6eck?|u0CmyAFtYW{m4KD}1Yh<9dEh6{N!M}P6- zq76buZ|+JiK1k@$Q1o7R=CqGw97EDhZAqfNp!IgiIKQM zF~TGZQZkdO)(f)01=sajr>sS?H*Lo*Zj1PWNEl$4C&Z>5r0Sokd!ubKJx?eedW(Pk z%;OyqqTPsjRiMH8#kpOlgn7n}-ptIHM}_5r->)?x`j0>FHwP>P+ItUOyw!cM7HOny zcoA(wfw1t^J6i^S^#&}!m#@Uo-ekmg4~VmH#~#P&x!L_qKAXoj(Gl}^ReLmEiELBQ zSK%fdX_8dIlpzq4bM&^dnie%_s?hU9n30ct&d^ecuynEcp3)ckz%wFB*{ppB;LI}n0CZX6 z%EBkdXXz5sAmuII+OXmgc<8nxunJ~iWTufm+mJT7X<@#aSYPTmX)rjq0pd=kvg*lAGsX*o$q`&kEn=>TAwV8?6nnq%-n9mwX(y=DCW9zUTI$Gt|SZfuzcld#Vzf;hV0GO8S_L>MCLqmSze`92nC zF0WmNX1_X5p{@(L1AV0SA|D8s!vxbnXV6ZRD&!3xfq9faRyQB9J?PB9B&iMY5X^1K zY$^AP@ieOI>+4=QGQa8z^xX|bukSKu7&lZYvINFIU37Lt^}(1JR_7{QJqZQIZ`VRh zXz6)2$*!URJBz?xrHPXWq&S7sTy!Rg_ewS^;A&JzOB_wb@+iqdii&yB$K;&Zf4i+i z|5a5<=@8!pjC;TW@kLl{IkzMu&;P#=z^jO{oLiD zUtiTQLhQA~e4}|YBeT|%_X5JqTG`RPHKk6zlg{ggF>rqNSpqTX^E7tMxX{PnQTuzu z_p8LXndKHuO%$2aH+o`*3lJSHuio(esWFL%l&^S#(!P;Cy1z7#fD1ui*94eKT=U15 zxjW&Bcg_wD+}4|S3>;gT%8Gz?9m;(6-kLbPlU8exoRA!Sq)G=JB3_axp)V8Rs^Xg8 zHYqJd5>shQP-7%egKLK+{b6@Yw*1&LkPs;HVu#`%XyxcBRFaOdb4Qbs`TNahbQp=e zXA4Rx5eJq(RzqspTKvL3%XyfsmQyPOYRNQ$1kSiq1gY28peag< zJ2~ge*Og1s5Z3oM?1edC*%ARwHEp*Z34@wgj|DrmhzJ}}pkQTSWnsTUo?!Vqq z7JEr7!eK7+1J(tGK_GS@1?1J<@Tn%ZQvUiCR+FE}fp^?v{O2D>whsFkN=}{z>7y<( zs*a;*Q|=+$!ovCa&#*5ERYVyYHzJn_PKsZ|lmpy1;;DtY>dFTfuUM-q9VNR3!O@Xe znRt03`j?D`o(Xv^%c6Z3#7Fwn{bAQ$Qt0jOyCp0Zn`Y*4bvtu$vFcFNFM?e~ zFKTv)x!?@CgCyfp*>Q*&DlGZV}AsS9r&OpjJl5 z%mK3dmFqDAbdCIgcN92SC(d5aAXoz4?R6@ z&Uu{ZV= zQom#H-7zS8_!-)vn98Y> zKzsLkNVel8T z{&)UuZ*lwD@7^-gQ!~xog}(-#JuW@j-it(hb;bhvP)*@>NTqkF4rY($s)Vr4xGZ9#N~zk!)raw*IIB+Wn%ltxx>bPu;t#^yioEwo!SU`Qa2Sta0%lLWS#|&3y)}_%{CB{Urv{%+9VBC%Ir7 zV_Wx8me_Qp%;6)7PRp*&0_sS7HameNs<#iu1`$o7zE~}no%R&QCrbHuI$vUjW(PxY zK9}5XrJ(Lxl&LU;5xdoE;oq=F7M>)p)LSzBC&jg=@q+wiQQ?D<)6Dp}49zmDf~FLU z0?e_yk#ohi{lHRGq_rw~@e-uA$YA-y?C@7ml$LTA9jVY^3hN~ox!~Xz z_$DY!%hK~%z6_n96#?bV_!0#=cBoV5P?s}I!Hr%OPZ2N!(a)F?4bNP94$02@AhOxH z-yVCWo*BtI{_tps=J^voQayS*_X-&&%DnYF8yUQ^%|qeDT6_>nlUp8ink-Jjx3Dk} zczZpUb?i2-e(9nu44m0Wo#dZ;73P!xj7Od}KS_f*!CL02KMFf%wd2S5w3-ZfEWY78 zkK0L`N2rV4&2Hrlcuw4Ft8@M9|XU&7UuB9(NevLPPs z$BkEr;F*GpaF~jEtW_6YLKV9A{H8Ypwre3=7J){)xSZee-ASZW9r$g)4h~vEyUovg zKK&1w7#R0EaEU7H@9r)$u56S46nkGLdM8nj$(M!e$BS)|_kZxsC1y+?Rg2!hMeR)4 zs2k%mSD%CC(HKwLVK>8#5-@G$;pYYvm|mkX+T&{$LKel4Egq2TJ=o^e9{}HI)A}^1 zI^pHz8Ht;&v#wL+Q+*M^cNf1tC4Cw-$uR|Zrh1rw@f&pY zE?bvVfA;eo^6bts9-7|vZQ%Cnfc4H+;9OfYdA?I|pdjeIN}qOGJ#zQy(WFV*aC0x$ zr(F)ACUnwe=xup;?{daRS&UmRVenfe9569eL|0 zcaWIkmY&#X(;I2=Lih(AsHF|zFEAK*)*32Rk6GPmYVyo}t6-M2KzYO&*W>#A5A0GNLQal|8KN04V@*@lG3zQaJb`O>sFUR! zlOCz7)PRSpze$lF=(+eg$2XbQS1~n(p*zv4_B-@7qcj^HqHCqEVRrW+h9fr4iMye| z(*RBOwtpM|ZuDk}LKu=5R~JdOh&N-;sZY^mKDV{HiZ8v30^@^qUk+kWDH_??KL;5v zCck`o9Jv2u#($MM1d?bm8m z-bY=gu`$#3|IY}hyoNb~FXYH>Yh3xUrJ5byW^ZT{zX>jHZlq2hlD%ZA@fb&-G^k!Q>&DzH~NSgV^Vq^~%18pFkwI0o(PQdR*?XVb- z;-aphzp5GglBe%gzNY5bm)`?g0GW_NuKAIY4|>h25g)CN>i(4kT(I6#0I8!5L!} zMViAPQhCGjH2eOPUE0qLxpZd#C7cULf-oZ^CNH@jCk(20y)a%p2O6~;mqqy8Bw?DH zon664pHFw*Hs9);TdS&|A3b&xuMZ{iqIhpb$2B@vrSkE0VAg8QeOlE4^`rFB*Hb{o zV{kra<0E}x-nO9085fBUi-dDF2Q3vE*&zZhD?WITnZ_uO*iFp0AgDAq%*m>USL-4<%o3(NtKyi@6(Re_l#p zTyIjBLhp`!YT;U$Xuz!?-&BZ|2^0`RE(4{WN^4<}11R)!}_Wkz? zm~a)Ns)vAK2c-k6R8O-)hAomYC@4@MD5`38(D2B0WjimwSx&f&lk(lx193sMiZ4mx zx<0P<04YvVva>Rc%W~7(X=|~ol%0&&&I%J3u5iAh~^gytl6g@ z8bPS>8G^=1W1>ZRD04MT*RYtRAamoWO_2%$=Z0N%TY%j^ewtG53ZSFg$FbNU{`_=K zl)Z@ozk<;AQp0Y=ts_GAQwUYM=d+)!I{;}8^n6^-l`ay${eHX69=0dR1ZYFF*4vn| zL&^+|@ez;sA+zZ$HVLL^v5qST5l{77NIFFfy&cY9x+d<)0=Vj^id`iNe784QbAK>M4Xw!H|zqrapz?B$mvd5_0)om@jWsg z#z%4s`+jQ$x=+5EEhT9nLTp<)m^O^MVX}ZaMN*q<1J+FDn-{Tee zq9+gLsc%EDwy5i?Zta!7%ugzZ2LEDlnrVCPHRlTENxGF%o6oWEgBwPvHC=TEt;$5f zmv7jBk3(VfpU1blhlim|IeRisR=Vh$S~JJLQMA{}L@h^j7*y+?wx+80_a4lvN=w4$ zZX=7wGNH+{EC0ZbnWxgofBkL02=5)PWA~d5+|+|;Jf_l34Ch13W&Y@?TBnROqjp#6 z%+TI3;q0pU$u61Ot(&l}J*X$oeruG>-Y=U!>WumbL^_#7!(%WF%i<={i-Uoi`^__5 z0>Dtwer~U|G{|)@XHty&L1Sa%zZ9K?+b>ig=^>judkNpZ%mK?m3^ZG|s#1Y|_^Ob7 z^HX$pE@PR4Oa_D(=pps`?csmXGv5I_tn^t)qJrpHj?psvH(Bb3ZSFe<0lK7wvx`zV zBukbJGxYTDZJSub{;sNst_-lOq6-*oO>dXYI!kQcm*M9#;UItYB&*tNPXQ7|T3NGA z3J%^PvkdGR1q0$1y!E1Gt=0|425SuqjerXSb}>BO{GZ?Y4KHkr)jaqr>c0>wFVrr4sD)&6D6TM(H7An*E0m zmCln%C9NkHP45}bCyV0ZeocW+BGSj#1$6**z|At`Q0fq8zIhz zJf*X*zdA7HbdYyanNm8w8!8(mbT~Bd4$)x1xx`$zT*+L~G7>u4>o00Ua z14^r*(vE!Kfp za@?0`bGE%+lz;%i5^x=}Drhz+}DKw_=(d+#VQD%fp4j$dm*B zj)T?Z`OzpwDRSDF{&U=!mi0zonSxu-duFGn(8VLDU3gw2Z3%nXiUXC(E90euV*&cp zFYSswqCe30wht#7jZMz{{+s!(uP;CJeJ=JTsh}%6IPkT|nV75bu&d-^LW_S&RHm@# zPeq|U+Wu{GXM^Pb!eA8Dq$Of(s!czuJcJQIuKGm=SJzu^dGBmu>DP0*-Hp;uXG=ogeq4l1~}ZMMh>GW$XeiEK5yx zx5H(4(;Ip+@ggyuF_hzxijTHiD$34^+{6QuqZjG0FEwrgAA(o;z&-rJw*~sdc#iRa z(c26B5_N|1gCBv5G6MU}BpA1*Ow6KqrJ>9V7eJhCyLTzqUxev*Geh}Y-6u4dE9=PK zy{HiE`rDx{+afu?_f8plb-2Qx;9ucS&MS@HX6A|96?x6%)bADk=!hJsRnEE>USV-B zh>OgGR7-5kouW0*Q4%xoD3ibBVbR*k5RH3cGGJ*OO&DbmfUY3y*JUf!cL6Zb2ZiQI?neBs_x-yljl8 zce>P0!f!3MOu^*%aW}qOBnl^yU*s^%ul=?!hD>czcV$nJl^FBT2zH(Fw~9)2J^BXk z7x%7w@}6yUjEjD$#pYCTS@fB%0ycK6tQjCK4jx=OZ$n%U)%x0(cDv#7KVTb4$qSZ# zUk&i^#p+d6McMrAZV-$3FGUS*(W(7bagVAh^@lA&yvKWD z_oS!Ca+%4R$Fh><{Y3D2D3T^2c9`8mo<0HaOy!+@Rdm}#)Ph2PO=v=rS{|ra>uP~< zUmvY|^`er4J&s|8C(TcbtUu+`Wd@9+7Jv<7A{u`&s|K=f^rN345L>B+@7v|0!(KSO zE3A;x;_QuMlZYxWSTS`x+3Gz2OSR-@t4UeDfdlqVhshkkj04l9vW(*3dvS{DVaNwK zPp4lcFv64S36;jf)SgEV5)`g-gkB}R8ppe*Mv?gvKRA~lJubzGz%^sKC(R0Rma(X< z9whp}>9)_S4+$SZ139I1G{KoV+EhXu(;ocrIiLQSnVD=y4dL?tsez9HI8Je;txn(n zvd{Kwdd_=*N?oc&oWBKH<&nPuq)?PlS1eNAf@X3~ZJe(rrrvg$r#B%ll;*dIQFG?a z3SD#^6xi})!QTjoacUujj-1l*A{!d>+~$-HX7y~QaMHPx3~Ymou`$>$j@`!tw!UEP zI@Bpb2p!RQfZ#AzLhS5_E%%#4_=|=DkW`8!?RBzMkB6J32m zy9o&_G^wEdvk;}LtZB7IV=PHU&n;4r7eJv=ClE*@Mz5B)5i}4@qi9=yj1!YWO8FTB=Cp&w~WAalKBB>t&@B1g=*MiNmeAe}^ zv+|FYE}o@%tJD)Sxi5d|#s;1~kw2Mgt<<^QG1f`s>Cm^?q}Q8u&#VhY-goYWoadAj zSMFx_&AdAaKKDe&{F<99oYk3b)t&Zm);zz8^zoV9J35B^Vh=OThuVnXnDRAH;Pfxl z(W8HtWQ_Exm(?QqUVfg%(WBS*wcCZtFI?||VqMd6ln!dm+d-&%1s)GuolKY>s?E0I zWetWsQrC13T&KVLM^|`qyUYES;5^h7T=>DRa_Rmla__{> z2b>x+BT!T!9Dl5b6CP_KAmbq#A5`zG1#iOl=bBXP{@b;htBUI%F(RuUb}}TuR#=&3 z?Rj3kNNL2qXTKM1JNto4{Ao5eps0Qm;Tvwz&^-AzFHWN1z+p!!5(v|B<$X#3Mb^PAvXk5BpG#4vx zV{*okG(3-9vsr069x!EI@jh;8R~MG zN6Agr9=4Rv4Sh+3M69C>a#^%d+^27)RZZjwQj{I>(vYpjjs3+QftSnQ@DOwHIm*H{ z>IaJeGe1mgiELWa%iV9JXM;3OUjfR4*2pW0xNe$<{*E#@Pl{_o|CWaKS%0T|R<-P( zBu6l-G{aUO|ipT zd)%%vK-foSZjqNOA;cZ^f`4gDPk-M*FCS(wtz0aHg@r9`eZnEy$6(Dz#`F9YM*G|!ODr@p%*b}Vk@>O(gv&2xJbkBV(LQHWV1LfIxraM zhZu0m9_pAlvuyEb(D)8d*-!KOfRxJRaXSViO)Y;lU~{(~i#fhfVtIPcb?Pi_YVeiD zKs;bcu*-0?11{Pb@`dTu_e#>ZcBQ4+O2FmnZ!Qh6wU^uY+Vj4mE90ut(mEkK0qhBS z?NnM+s_D#nDxcmohsm290_c4J0gWrQYwe`ST^`&LZ8D?F& zVs1`_xG8vCr?C!oOwXa?BOR9) zs|z9w3=El%!|YuXaMD<2zHk3u%za#3cil}yDYEMM2~qKea-fuH_y!2?JKw$ZmjW@W z3P)`u48ML>I|cvuqS#S}qUqruC}}mL>%B%h*OOeAq-72^>BqHo`c#nLBb4{qaUNew z-{K}@knaDHbe@51cz+kCiY`>m)<|1w7qw?lt9DUE?Y&oGuP80GVvmYdvvzH<)!x+J zD@MeQ5c|pR|Ge_X8*y{*cbxM%(E2*BWzgn8(j6F=$S0MK^E3bIoakDv?G1!E7u^0% zj!bz?ZNJnNEKWT*{962LYLYE=ei!fe;vX=(%Em8G#LwLLDdCRhYfUvOl@tBE`^~s` zwWWn$WnSV^ZXcd?g73lAp>^s_dy6%3DKq^YVwqpLq@eWm)efD3jtN(W+cV8|duOqu z1r@6qVumqxm*Imd($-TS_{rDbeA!p}p3e{v(fHS;`rRfxy{)(qf~)%p&RY?iD}{7I zw_vA@8eGpp2ga0D>=w*GTTyciGjW&xdcNY{#jRQ)?g7}Fk~k!{SBI~Tif^r8@aF&oFP6|5Ubl9Ke0dlb8n#s_%tWBe4-m?g^nqiPvTSPUzjDuH`HGi$-Tyws|bP z60RCURc~|Vd#0~Xzsgm;dgUO+Yx+`nZzHcF;fCtxt6MER-5lBhw}XubAvEvR<*&J@ z3l%y~1UHTw(uP^iqZD$#s&k`1`qG!+I)JB3J(H}AEedWW``4ctGDy7S_adn~^r>KSgg~s;g zx}`=?#2$xmFO7SFALrf6y_voRt1QJoBRv8>nIL1>t==jsd8Tb73k6Ra5)Je>90B)* z+$x7zx)fxQCrk=nS=j+m#wj2+ zf-k4nD-{`U|6O<=#^82uSAtXSC)u+G=Dq7N+$wjGt;MjhNx|CGTu3O}xA3RPR=S(U zjtJ5zyynfu$~Ydh9)BhRCgl9aAq8D0?Z<$sOz!k8@iFs|7=Gaw-i2-koiyN7}L`w*-&Y0ByyZ>ua>NuMXNjg zrC!atzq%1&IQ#^-|K@v)g7CB3zxGqsz^>4(FW-1x?anL?CWx0)WY;?qw3b#Z@`0rE z5n_EA<`ldxbP;MzO2E%h!X@ndt1sr?TFiN1E{oM&p+$0ao3!!jCu)*Gb(b$L7w=0A zfQDPNrmf@6=Fd>Ju?u?Ynb1vy2yZFt5o=~<1eiQ$EJb8K!P1SJI!BZVy%a5TSKC>I z!O*+1KF#+hIbpAr zmD%S7IyPBeDs16BVoNZ@71}~uK7R>Bv!2Y$ym&4{6A-s9D5KX_#j)GSVO@>WOdPj! z8l(LN)_Ndw3kz4Hxc?t~o)G?@Y?MK@C&3TkhlrDEOJ(#2YigKGO)!W*e*am&Jr5ZV{9&%|H(lZmVg?DL4)l7}C| zI(r|V_@W!77e>6r{3m>F>Z=UG3UedXudwsIc(De;y^Ug}7IVe)KWVX|K8Dk7ndcN} z=|za#yNzzu2Ky|`QX3o3%}1m7^K%zNKV%D!&&6FXtZ6X5g5GoI=(Iy^+f?j%8=_~q z)dR*2zz&1t3d3zBA8raf@ZrMw=*z<@@ ztH8`S8SU~@uoC3ova&BUMO$>)kwutza@ao~C9vs)^)*UD@$K4Usc<4^GEv?o`g)Cm zNs6rIUqw&E#I)Jq(d5-RB+tG@FCMq6S4sn!iNiO{bV=7EE!h3+6j_7Wo@3P ztVPmb&=lLR=dSz}w#lT%^Ts0i%6dNIR5iNsL?&`oxssW5c{DoZZJ9L++|I( z>B_8d+^vT9->pVljXcd)yh^!~uKdlz&cR8-1qW%bsNkc7yMzT8}nN?yRJ&*-Ttgx5yy#MqL+L=ymTJj{3mroHLoW({YOs@zv|k z-W(VF-k{o>&pF5RKNFfz5)|Nrh+<|-s6SHEQpz_Y+@wJ1Z2^-%Q z5Y_?)gKa3_B>WRSj$&|!DhS3QhOFXd%~vSUKoZs}6X2A0D<7ua7TGTQZ8D4Y>OMZ< z`?LHUViY5Q?~;R#;@F+=hDvVeQ~h^E<#z((>bOaai}F|hn{fL1Ms5QI`%W>GKf-?^ z9Dv&|4-+e8X(PN-uYyvv(*Nd@{vpev(C;Gp(ahp^bN{Vm{VPN?V21pm37Rs&Nbw*+ zZ1z&WU$<9nPJ=Tp$j;Jrh`36LhbF;dp@i#@Q~XV~?KF1cxP*S+u=dr|;fB&Sul-}l z4#C#Gmaxcgro2GpMB7s|MiZVAu$zEvutNDod;3OQVm5sD#gD7`oIZg}RL+owxv7Y7 zjm|l?UDP5zn%6P3Lo4e`Hhjj74o_mB=6T-6hZ(NjA?dkZB1eMwEN0@71>owor|7E9 zW%!3pY)F!OUR7xrY0yjV)?yyPf-o_kb6iJB&{%tAm9fg|;s3vW;C@Nm)EY(bO^bsG zUzXZ|@~^@R{lp;)a;cM`Nm9Awi-~8k+iRNP?atB$y^;4=aW`k)U-xDILE2Ud-@v&y zPC{5O)Vun(yX*hic5ixmwq%%g|I>RF%IWCXlpDiOR>=G?x>021>42ln7NAMDO3Y&Q z1H!JCtKO6~d`VTb$>wyC3Ovkl&iQH(vwG;d8>cL!=OgZ)1vTSeEUC1j1m!WBkmn9)sjr5N{<(6I|;n|!ih(k3?M zt!H8ym%|vD^t&zkOT+l?8Q3X5Ti6Yb+?#c^?;#iv(j(KTje8;Oq;IUeB!Ipb$G1}} zz7~ha6#&2iWaJdPL$Vu8$38ixKULU0wxfF_~1nVJ>QA{5D)TGRO>#- zk3?C@WLLPkZ_UQaRPuU`G%ayZt$xi@&w4>ZpEQHOn2}Dz`AYxzv-Gz`Hvxav*B4p` z!%u?JNyvdNTeC7)r(I@vYhS+huCli*)0^eBt^}>{!-{;0ihtITh~WeUXPygJ5mgTX zKD0%MVo!hlsfRtA3O$L^e!N;0OwnLR2Je8{PhfSl9ki>GwT&OKYfCvHbuT)j2(BH86%{tr$vPiRrE=}zvh?F6) zStC-7!#*ctviF?;%xcVAdej5XLwh8ut0YK@l6&7Ks-_0}cTpo%86TtCyYcr=2GY~M zHr#C}avW}hVt>2)gD}lx<40tM|4}&{SE>hPpG0ON0SpmH%K=_zjWX~hy#~wUK?)Rk1<7nNG)FmC-tR9 z(I?WqBv7RsygQYC$)x+Sq+lY4)|vXeb#H2=s-*?}IE}WEW(QZMt=X*&BymEv7m?Z~ z0UNuyDFf!qy0)L_|E=>0739T!_8SmtEGq(i;T>;3DXR9QtVmM)wNzw*?v}e)*{g& zbYxIr`HU*H$ubwPRk>PoQrjLX=AK)&tv;psk&Q@|C?V!y#7z^Yim!q?%!* z^&K6z(Yj~UQ#2z`=j+zon?VyzT};5Pp)7{~_3O%5b>%kg_T15)+@o>rIp(i1Kg<(W zCS#UNNKWU)ME||uo8!W~SZQyDxxe`6X&|jm&=WCJS&7VDtZZHqT3`Wctah=4YrOy` z*CyaQK?>e(yUf#S-psz;rnpktUsIHu+y*s@*;zaUEFY~764qIbM3S)27fH;g8}>u% zR0?p6!VTry2OR6&+Df#QYwhVfYUz`iN$SNsPPE}u2{AiN9JZG_ut}Ty^Z(odX&Or> zx*w!=&A`MDhvPY+8E1uQIi&N!1fm6?iy&*M4{A})((EIZ*Q*s#g+;TX9a2K-u@9&sc8|R1oBa@2-LBt}24!fuu&t9_5xI$TdvRU5D1q@x^K zWQRu&JIsx@f_PsKB#zud%!sk8r7|Hndm#2>ap{OdSfHE$y(8G{1R+H#aW(zLOKSO_F@?d+~K2|P)S_#b(GyZvY`O^K21t4tF}yn%k$c>kZlC34rC0E*46U_WwfYDut8g@N>E~rRb#k zA-=vpoIjood>=qhjwI%&Z+__<)a%XV$Ojw{Kl_;C=qs_<1=Kv{z%VVzXTR8wuFFSf zs|K>uI07+pCwX!9SvkvPss*+FpV^bZ83{_FJ8D*aHz5T9OL?b$ky_gv zBXqqLU*Ih1#Q7pUR`!|k<`YS3%#d#K*sQTPPcH$ZSsbR%M^4I3{2{_qyrucPY4$292LH9Nh)|H?=hy&8=P-$q`(F+&F2fhJv zi*9-tVYWRy?1e-x1w*>A3)Gm?$Cgc0RR0ao%>@67No=zXc3^xYS3d29>&v}LmXb>{ zcD$AgN<5`@4XTVlN{I5x7yug5?>X!e>FB&ml51yGgi40L$SE~VvV8RAc0MzR`0s|f zjH^M^A>^V2GMKND!uVNI>3`~?Od?!RM!@d)T6FYRYX8ML&RyFzHvD&y-M>Mf+qz!L zr}r^bBtKv{ZhlJnSW?UXsPWS)^=BqiOatyo9KbE(@s$tkn<^RiqB=DyrabO3N#v4Vv zsno|6K@t@XMHLrM0@j0zqdkOR^lw(;$7&-kVI<^2;(uB8&=!s-1@xHMl7Y2seYh}R zruS>iptXfP?+14YRh{$M!RMrYEvJI;KnS?Vo5k9t-|`PneM* z-?62W?*Q#ob}Fv{{vQ1GFPlc(LZpC%btE9+F_PZ9Gop^o3-?i>BP-mUlFa6hj(dNO zTvm9GsWCiM%0I5RCv$BfvO=gpf^S4MJy$**-*;MZ;<<<@;-{cHNSpCX9bsh;Yb-0c=?TQ zX(w-%sO%;4zFdNRU3bV#@Oq*E<%E{1rG@0|Kegl1aKGoHR;KgsY8X^Vc05b3^-TS6 zYtw@n9|P9Kb`D;6lYquo|Hy2s3 z47`J&0-G8iIM;ke0oux7@$<8QcmUPM@TkPI;>&Jt&?m#T!2RlCBx0)3ZfALa{1x$G zxM)l2D32=Xd8?1F_lEG))M+r*zwL)6#myjt#*I1yPb;_lTzDX@sO9O5V9<&>GTdj~ zS(~L?q1b|gqyO{S!Cm=?r-Jdw&5MGCvqasn*jUt;(MCt*($(1%f9Z<#zr*$NK8tuG zZunWUj?4dQ6Y+QcBt$JbeelTMZj56M@LsEy*@8~Lj#Q&Y7Ax1)_&y$vlLYq3u;8CR z1;L<3@4BfllQy$au@q_9D}nk?Ea~Yii}^C`pLO8MrgHZzKBxJ70;3`7$h4bZTfUKB z5<~2bPdSC=Y$hx+|7hO*{_FYcw*6s_3GdzX6qk_HWk^+l)ou=jj(06RX)!M6M4Rf{ zQaIFN+~icjsttk9f7Uku`uNW zDtrR%Fhxg2%bGNa0EQDBQ;!l;Il4bU>Ae1JhToe=zpMHACh)Vy4tu^s+-@GAfg3M6 z!%T8U9;*K3uJp3TDi1py5$_YaSuof2S4#9o#xBlSw3dFxQ4TW;PpSwXxTFA}q?+l>8Q&Z*%lj z3t&NGuRJe8AF_U;_KmN4Npd5X3+ruL7;kqw{>(Qa`d?K*=(uo}g_>0~j=@9~ax8cn z4OBvHQX!o1IMin2KA&yMOote5@VfQsXI7RtzzeobX%#5PJy_q@A@&pc$h=<#Q+Y%d z9ZEi0yF;pcd9Yozp%8S?Q0sTwG?Fd~?(W6$0dTC~4oBSj134aD0mK;;#7WP&A;-;` zOTW0gI@x}+{Ta_~cn9Tci5_7yHqU;LJ@e|YQyn$1%DgWTU6#G!GBHKBKmnqAC>j9U zBK$FTrj&_dB7jT9qGo&8&o@BjiqG4evhYN0a3PuObG(HDqUP<_l;EhX*Q4S?7G3v+ z1ZeL>W2@)z(uBAqGzfFlG*{lY=B8Q8-cLIx2v_oYFy`fJWq$PWlWl*9Ih6YF@w%EQ zb;?pi{BWtfk;b6$9N>x2Z*P->a=w)%!8h~xg&g47PfO%=;dscCrL8Z-g_S8J>9dG+ZO^eytb%W zfJncJ?^vDP_DkfybM;F?k`@VP+m!ybe5ZHExpOK&G5VqJnsa``mSRnHJ4uHd$l9?3 z+-VLLw+P#&O=IRhF!I6nqK=O_i6eyUynxT%y()j4MPtkNQBIGrR)RGsRvh1({3E6_ zI@L_nHCs--3IOsPk4vb(Fr!GIg?&U$JQXTPon=YTe^>OMLU<-JrFECYWn~t4j^Z|I zJhj!f`mew(?PiLRIBDWpayxD_ZaV2IgyOPXQWSE>38`nTo|EBygHorFmtbGqdj+kK zdb&Jo{~CDgaX*BFeffFEy?1ZTCs+e##WTq_nq5^QTlBIC>Cc~}^n>+!uRX+^^jPcP zfgtl&+~@1v zS`=VMG!C0(g5kwjUf|p&Flb*XSsxg)O_1g(c#@q2-iV(sKieG%Z#B@h$Hh7syBOa@ zj0P+$sAmAtfY8oYF&ysRaTbunc^fs{bg2@Fz*bXE)J^KwO+v6yA8+K3)s5IOg|xD} zpLX@0MG*h(jqeL8zOqVH${!vaB)XY9m~V6f-~|K?)tJ#O&N0^$DiL2z4Y#6%4b`0< ztM7=mb_lW)C;NvKw?Nv7>%m?pUUK}6}D zkz%gwSHG`>t>H8c78INhz3=^=u@ScJ+fvaMb_%nODe9%@eH|{#-(B(R5ns-FIHh8x z*VLh;CMj{tc+bx}J>7|n#>{=ky-YuG4T<5xiKc-L(|NilD|0-GfKQzVA=+GSF6J5Xi~LnS zDb3olm56*wEY{>9S#goF^=MLz=Q<^UQT$V+k6=YDGn=2-jFyh&)SRYj(r-Og8*RZ? zBX2ccD+l-Nrd7xF`Mw_EOcMN{!Sg09>W~gJwGk4CT#r3|aO40f(wGHeswag%pX(>0 z8)M;WH5PLaJ|Ns@^)v1iz$6moN*uZxe*+xY#;a^S@g{N|b~&4I`Ng#m5n9LQ?S|dE zTJ3G_TNUKNMlPvVYfBIJ@alwBE^a9Bs=x08dnJmJj~|blsfFs{5S+zgQ;?=`B$6sJ*OdSy;WNg zofo^xC{)jwfBZjadjlc2)CJaLmXV~@^=_Wx9BCct-3PuJR75eE?vlaQ9fi6`q`~|h ze`5$gapjCfSJCKHt#J}Y=#~(&;?u75hY9D?-#HWZ$^Ju0* zOy8EG_*&B!NPlWW7nj`!*onpQM*EO;ZJrm%m*+U3@x;qoB;q)@?k!GcBRS}A{9!C8 zJ<&y^Y+zCK#}?=ARDU!luCcjN^S8YY2cR9}Yf)Z5&*ZN#;$!>C#Zl+}lW6_p2;G)j zKaF=!EuPTU{h*Dqug1o#H7UiBzUzSyiv`6>M z@6^F~;`8Wj+CRQ1g6t-}fHEI*GX6oLk>)f2H zn@rqtyBcN{xOhl5@>nI_w(p%jK0dbO zrB%gpq@>L)%+1ZwWZmJ3KC4)lDB902cVUOI^9kmNh>3CGpxgClXJ@`Po?Z^eUXz)^ zzq@&~t3|hl=Nv)C4A|@Dv=-lYSx%s5mmwW~1&YFf`3FDB&xkj}wlRBx>tvH(52iZy zRN4$FLvC?{i_b%oYey|pKRUo8F~#Lms-6b4FN$qPP%S!=e}N`WT(#=STi*T|#V zHyzn~Uc53JNo1P=`#)xuo6U{L-J~2Z#*r>U+;%k7j(nj;{OYq0*6HQiV!@{$4k+yR z;)$1Vz^|V^3I~JzR$tHKer;^%o_|2Gz3ssc{N9N_pwqbM|NR-rL!5g~RyX2*o_BDQ zyT89LOYeb8`pdy_-wwz%O?~~3q?Wu-)+#1GtgKy4RC1PO$KE62ALcXViZkJ~A&s`8C75tage5eWRc6-$|a$= z_s3l?gj2WNu<;BV*6QMAfwkLo2Q6E9R z_1gJ(B(jD**8N8XxdT(CXaT-0sun54HE7mi2+1&B;IW#Qb$%||`*^I{`3tsu_uZ00 zxkVe$Iw&hWWkzLSpNn7zM}Y$}AZ{}UMjEFFoxts0u>OF|QjG%yT3NmLg!NaK4R9hu z<;dH-IKrze?;<`OfwqBgvwpdrP5rXuy)8CPkc?8^MR07Nf=apY^Z02=V}KZb;9-4+ zB;VQTyRq^mIwml>!G`(^6DXyOuE$%QK&QK7wMbD={PUBq z0z_kxfm8SRo~<`KW?r!eZU3iI_~n#xCAi2^D732IYh{`lAXZqOZWCaxvwUlq1v|Ju zKNfpWOx?%Fs09xwynjroR1mpBX^_AOR-aFePu~`u3KgK)#JDY6E=_JqbQ>b*SxYI| z22zCr6CsB$VcvEPX^&gqmRA2FdcgC-*ecdGj zRk=}R`}@B}2EV3Pn^B&>nyly|>OQgl%6C%WeXl-#(|-a%GE4yp$<58}-rCyg>A1c1 z2Roq3tM)RIx<3$uSwCZNZT6g{zsT(Db%lpy6U2C?kQK*MHDm}>41?zr$iKZk-NM|Y zi!qR~M)UU+JoT7rZdPWsDdmU%M#0tB%=2=Yc_*S6>2M~5b>A}qo-yk^Tdz|(+mNc+ zIMzNK*`xC3Z}qH89D}4{{qx*nxeMLXE~A*q&f+z)f;<6*MqBs;&JM7Y zORM5e_gp#+)$lD#UWHGHeviwy4t&PBL?$)~!C!{9CQWNF7FX3Bx`xf(l~+f3o&3Q# z#XFq1dg!{P4U3lY@NDu2i_)GE=O1({6B2i8Mf)MhX%j!kmC7($(mx%xkfFzywHh4D zRjnfF*pibT!g3WDjcjr)B3IHP`O%ekK>A2d!6`xS=0l zpLzoKooHYnJ#&$0I7f8e6?0Kns5!i%*7)*-eMUJh$!I5EFOmAHi&=Weyjw0#gLy7B z;(OE6N{)rp_g+ZxdYag6=}dI#$}~S0ah;J3SiG&SauN0_$ny*IAqPD0r1N+U{HA{C z+1Q$el?~i(;p>@y?1))B{zC9%s0}sNL@B2>3tVjJaWK$fiWfZZ zSk#|n@3^Qrle>?M+HLPt{d!g_EY=a?j3o+S;M!Cs34uYo5*n3RH%U%dHaK|*PF*6L zf>8v?39H*qGFzY__J1kN*mAPx=;WlV`rhGw9#1wQLO%^X}e|;Oe$a+jqcdq z9`ok_DJdAyiXzt|>Ot6?9x$l)G{&hSbJDLYp= z8#4uOGi{n~gfTNPGH5Kna=7fprGTNHuGp{G$6wrM5{xFv_06^j_p+1$chS+&*?3Tw zN<*s${0xUFD&Tdvs0pPwkg4$BAkrJBK)i)6(Tq)IrC5AlDRe8z|$XntMb$!*pi zO*QdV2)+w&^q#_Rxo@QV)F-ITRZHoOu$KxsQFPm(PN0Pc=^Wxd&%Te60EE4;Q58oI zv9bjZUjfZN?{J)vIaAUcHr6-Xb<6-rh;lVjvd%wLpiKXJ4I(*pGqI{~x$bNTyM;O2 zqbWTo4gNvu-_cLdccz1x0DRpgUz1_bU;k{^Y3Uvz?P#%m8EmY={WM~tjtL%}miy86X_kNYN|k+%YkcyO~90kMOb>T>%^ATZ&%gK_9 zPtaV)Kl6$Mg#ks>_VZYopKbooad|VfzZCzV_ z`H>Y|aKt&0cK+!YBU>IH=tuDo`zh+Xe3qA%Af2FFboh;XNW*6}lfK>uzD1A%2S(p} zNzadlg#X|l5cpQeS-0s@003b*?HrIpO+ zW=&{3Kie51>Wn^*Qa8HZvR}T68@Ek#ekSgYr5(S~ZPmadC3E(-6I{NFe(mLLndto# zKPWGY#Wk<*l_la~yO*my?jSQn^?{ANFY@e-GeMHJ#saG9%J?3dss+{SSlhOStFOe7 zWlQ{GiMOMwED0v@&gTF+ocQ9;w{?Z)DSu#vh8k(bU8S%8_4kmf#Rx%fM_xO8O1H3v zh6t6eKI>nUkD1rse7NQVE-5HTn7;z>xFj)1JcAh_w^l73o2W`H=HHDv*)nbasvl`J z8u1CLGRvTcPH{G5);v{5BFriOB*ti*RX0i-hanLzREPMFj|@rE>)kkSdxPsLngc_s z5-LYXQ`;oUS%_JE?99l*RVq&=nl&ovjuzq6c@`w1TJIMB}|yoC{%_vnfP#ql-h@z34(PEqH-I(~8 z+1P(RNx`N0w5Z5ZH6Qb9wuIKJ)JNCrZyzSl@Y~Bx&&Iz`-Ze;G@IQZOnrR07lYvn> z0?Fy?$O_kup(IkhFcR%}9NCp9SAYsC-OmGf_Ln zEKTeeSf6yEF`)jR!aW$b85vZHsUoeviZ zhT~B5e#?JuikFkraDRgoqXZq01e##UORS~pe>r8ZK7=j|sUv}GXuIB&qC4F{=)uwD z+7hz#Hg9Cx6Gb`zf~Z;(d88C^(}HUA1-WjY~Z8wKg%UjaT4W0YRw^zYdI zzQz0Kc7ZD;t)59nQM?PsG#mAc^aU=91@xXLbw+!+WWdopWI`G@2_3HJFdNMJwg3;X zv89E9PIFd(one-hT?A;vAN}<W)*H-%MDu#6qhk$A> zz!=A~Dv$-5#v?w)!;KL|Hh|1A-m#}*!juV}Wm{kRjrpicGc~-)pvvkNIsUl_9N$nX z>Pspv=CDrKF!wt*biDQ*n~MX%pp=`unb+Ugth zl4X~_NC!nUB$z+7U5`tatbA!tZQdSPRf9~Vb}waSQfFtWWZ%SwmfqA*^6pp3%+-Zr z=m|(rdYPR-P%E+yLSSsH*z^R%=x*$cQvRK1=r{rZohIy9W_AWD&B}clA;XR5Cwjz| z`M(!#TouiGiKk0sg~?%STB9WpGXODQI1Jc7#rD{sUc1;?Q7U((aj#by{RZXHJJo8zD zczfv%4>TVm6kFE=svT9=6oFSE%EpZI5@6&ZiGqQY=)CA%%3yREAYIi)iU~q?K5$}+ z(?`fxs4qrRq_4pLy=T301%uHawmmgY1v5IsSf#t}xAwe!TPkj-LMB zcaB0$+Fnvj&qpJChTnff^`^`;u*ZvIf*Z6AhH`t0ptK>o6y`nJ+B*VHKLXc)Bk4+o zu_V+Tk*IRS)!VrNrGH-wHEV0g^erqJ+R{=6@j#|chCDn3J5~n#O+?4v^j;3iS31z# z*~-uhibEM568l?!JTu8}g%^Tvmc5J1a2ow*|BVBqiqj-T=l}s1Icdw}hp|lS-7{L0 z-;&+FuEw1Rt%}B`I$JQ1$&DpMWfP?nEQlx)sjXYbKz^zPu)FqnEreKW7pJL39Ag_A zu3A&53P+b-830{VO%jnYA8b^B&`pNM*lu z**;q-7eB{mtC$cR?Z5Waj|g`jU|zU)C9q1dpvDt7eg+noNV=YrzPe5w0e4!Rrk{ZB zxnEn!KzZF#P7*%&qe@TvTs(m00X&*JESNEmyS2`&=<%IpzXQM3yMq*h+lBqe8=}($ zl9t?%K@(xo*{hH#?5axPMyD_rbxYa%$8v-M&bD*aA6I@1KOvD&($)wk&A-JHx2Hw2?xjwRTPvNzqhgj==ol z#Rmv_vPogVrp>Pgeg%0F3X>}GK9ZRN{e*Dkc@E3gcRs|X?_75gmH&H3r_%`b@e-vC z^tM1vY8>aBcG#ji(Y|K`AOT;0V1{w5RX$39hj>q}o9L6_xR$UTrdgd(M)Gw}PPvui zKY<&9`&of0mukC(O0ByqCk*a2d_eC6XmjCJ$s}=nz`w_Wr``2YRX&ORWey0;7T?12 zI^wqg^TLgHZwYry$FD+CEKfrG0|Q0ajD>%G4hvb^d6D)RxU-LwPI)wBCtdiy~j&Ki$+$queEJM?OZ^L@Ev^Lsj( ztO(L?jr%GIg=zXzj$e*5i}c^Yrn_${yge%640i$wLfrwyhckl!n0CxStAQ%cxAVFe zgI~kZG*rZ)T%UFRmqnc{oR{=J1 zLvW1%L(Q6gKW^OYg(Gb!>PtGE{y^>Koif)p2EnXJ?u?1Tg{Bz?!|hT+CBC4R{I|j* zh+!5-gRtB8+83ksozZKEjv4=fyF3&qf9aN#$8gf4MGyzzD-JT?y~86+WEyniX9*< za5z=GjR-$IBPCo(0xiVP1K-!a>d+` zH8Y5@9~e7F-ChkHd^uw`h$oRUbDUu#Rw*-u_><(FlfaY7XOw?i!fYMjJeviXc5SGf z;0cS-@d%JVIbi(LIq@Es07Y-X2W*6ZYR<)pZ2PE-DI_9klowW-sbkkiMeI#<$fk#*q*K> zGST)OtSbUf;@VudhJHG~Tf$|N(Z@)h^yyNe=d$PlhHVCsN4MGZ1@drn*+<%4JQq|7m1!3`@P#PTgYm z-ldU7xdq(ECv#$l3&~X{?sD}9=;Mr9ymoh{z!?v-96sJDE)<--YfL}cqGyw5@0;?$ zF92WVyXV(U8qC}9sg=fM*m5#k-Kg6n9N+K+Y{vW^Yq8l)xL-ZD_ZNHAlR|F@*)y=I zJ`Q;SqiejCll~kWdrCnyH~3UQwL3poPIH6jWC0)DGg{^HeUKW&DB$**!`{)QPQd^yWGS0>0ObE)4NAlpB3w-*Fv~SwA;-GNNh$@uDz_ik)Q>5U&Q0Gl0F?4NpwZ z#NEsNuspB4F6Z{$JTGiRHn@Lg2&3`jueTU`F zC0cx1Xio>111qFN5;qGjwTfE18W8p%{O!xBq^Q7#X0MQ~7uw0oe1(uo?qlE3!cDoZ zP%0^Z+pp?aazM6?G(Su1hE(*g$t;o?2L{W$qq)AXxY$3*69tz|y$2axh4%)c)1#`} zp;P`g?_kZXQuIqAjH7|}78Vxq?zjo(|L|_KF@abD$ZxLQQJtaZ`FGM&G41m7KVFqd zUH7!RXhG98R$Y(q3K&d5A`kRw^hSk_y^8{8U4wfkK5~7$rVP$`J8u?3DpWm}m#W^= z4UhDq+U8j*bN!@lr6PANzj@bb%8NZdSPApo8I!48f7}~31Ib9%TwpSGFX!!OQ-F?j z1rWo{l_NAuypskv)AXoKAkgo$EMKziUTuF*!~CPrDIuKWDD#h#7PsCC{E)mY@TcX1 z8<)#Ov){KreKClx%c^Sy_j)kZ%Q_pO7exDR5UoxrsIA`dU4=Q${D9^nrb8)1#&sKw*)kgdtgLAS?^_;7p&G{*^diyTq5_8LX+3bbIe$<&N zvIkuooN-HCEAGynQZ?>23aX)a4t5(F-H8tlb5u=CtM5anqYUq`6Yo!9g*$XUfct~M zlx__)u3te}Ix)n~#4XUm)eMN{-AJ(3i~-NY&eRUvtA>W#{O1(V3b@<`8sHp#e5RH} zSxy22?A|~AS+8~)UnQyjhIi)_+$Rh%v6d%9gH6iV7~&K zpS`$<-k&&}z+g2tT{lh~#R9{7dOx-#qh<;tk-;-x8vZ=&rYb=HnA&c;#J~L7_~8_M zD@P+!7AGGJ4Sd;hx(3;W9AQ|!^$LN>J&!!w1^V5&HCl6Bh{(j8Oy2}zS+alBwK`S4 zYx_Ry{#f!Sit*hd@MfCRX%I zxzlpdTruK^ciWIdyx!q;d)GjfM0-k3PEY&bJ~JK<*^4cL!FkZc{WtMzFKcVUJxlLt zw|+F^%XgZrTkYOfZoYc|9TyMtr@{UFW=1`u<)}B$OaJn2p_5GNx-hJBEyf9#jSauW zt-PAO-Eh&A|1J=#PMuY4Mm;^aRTukN-uHxi5#AwVUVHu8T)QcB>c1%2yXz<)<6zhY zK^hHIRGp+ECSi3@lrb^3ujL2$XJU$z2Gp5b7{pL01Ttw41R(-X=o>Qd7Ca3=Mkz*x zG+m;}m|Th(Gpjosk!3M727j?QdMg(tXL9nc9Lx1r2m0I<7f?aA!5kp2pEGl8F8WgJ zzz$`wrBJ3ew8CE3dF{vG$gL0aW=yj7(ga>AqBgeOUdz1p)F+l zpNaDO887qkxMI&4m?$dt4MGPiryT~E_x3x*65rzDTnZ2lD(D~#7=l|tD@twGn?dSE zG5r~a*5$DZi(KOBZ(v>DHHIB=QpN<~`?1=@=rEKkh%P;n3QRka=IK@lbr9moEA(i& zX4e0Lk|iTL+Uhn%Pu?xiIT|tUr{9!!^o*RJU50qsF&eZ=ad135WXN>d@#pc@ujgLz zZq+m79PA)2@jb@<-n4Az_>P{gt4fAtZaHgHqxU-n_}=AP4;>2#yO`Xr;}LwPDC@0v zM1MhnEV0rx~%eSAYO|63ZaL*elwXWLe66C!iD99J&O}3+WjcoQEP$+B`MXJ-l&xY21Ocu14Yz!!vE_ zoo51fkCOExUgmr)$+yY+I&$#o#f83fkmnz~g8nkanxd#*KHiZI=|`b9US3ogw(-W;J*l3SXagtw&;I4!%W$qdM*3>`CTSC)Wjk z8+5opQPqn+jKpZmR?a~KBOi072;bGSp)l9y|$Mz@O z?gitjt3&*>A~OPZo*Y4?6kKBnTg$jAgCX zNfn=(S8U_U>Hq8mGj=_j#?KAom+f{M*WxB$q*(RAqs4OgrjHxsOI83Mh7w$g-}wJ9 zA%*&eMBi1x{f;5@jtAF+{WZ6hYpxBfB?oONNwRjqsoGRznySZ51#)@I<|<^o6Sg1@ zYq>Qw94CgTq?$W)Wt&e&h4)*0f49Q}nTSWedXy5|&J1v$yS=9w`!W0DuZ~vE zE!()YfT^R4(-ULKlC79%q52h0=X1oTFoX4J&MneWkuw*=yV}O*v)2FCWyfg8*Zuai zcpuW^Nk^S?;TSL$4{@a5g}LqUiiy~eYi*vvwaQmiCM(+6rP~O3iFZ0W{A!CK=G&(~ zA--pObFAEk4M$xE2M5v4p#8C51hY+-h?IkN$U=W_fe?bB=f?%l1Q0@WG!}M3;^)7#@ZUrucUf^gD?HkQ*hbl0wnr}2&G)TY;_V0$i>u#b+n1R!nMedlo(c6S^WK*jTdXiz~ zUD4K^{CXBneFA@_@A+9wg6!#x?2MJ~?qrbzoq@R2C#dJ`?E$>06*GAues??qkG!j- zf09Y>tMDTw4K4WZVtHs+E@i zN78xtQ~kbwoD`LeQe+-wM@|&SIL;xV%tA)SDO>ijIaZQAGP6nc-up=QJoY;F=2*wE zImhpOzQ6zBe!SoJeO<5D^Eu2>`m9>#H2=5fxV6j1N!gi=r>Cc6PlIgWvCi=(HA;f| zw8W=`d^5h~zCzI3t@Y0iql64?8Y->wXHv4w>-P$@;r_2Ji z%|gu+(43*kx~PreJUL0~<&E_%wbed2hcW5Q59jW8!m8gyaFdl(GfO8DsGqpmy&6N? zg^3;<7ptXLb3L1MDat3M|A-1xqW+cRI<@pe5HqbJ;^ss1q|$6b`mEEIQwE=XB1e8} z2y^i5uakthtJA^iK6J`+8HFP5fO@7^4@RBjYL}N4u0LCMotb?eSi$=1u*$>4r`^B5 zI?<~Ci3=u`FPW_2;;9GT=%T@pn6$HFbmP%nMJDw$@LIkdX14C*sQR>&Tqto&Wlv_O zvk=UDlCmFua&!aNneHY;qZ=6RODn^pw}=}an|oz&Z!MyaW$5#Zp!4T8!lxlJ;70<0 z(8TqEufsrvN%>qs#Dc};tShy=-nElqEVPEG1&QG+5$%F4@y*letk&69wuqt25= zpDNFjkp+kscD|(~?E~f$pg*^Z!FdV#bX>P(2bQCUm3n+kpO&evwmH7-6W2hyf3MBd z$=*4sDnI{W^E2Ay#BUeT7i+#$ywmM!PJ?4me`RD6oQY%V@i0+q(^YL5bx9IWw!vOo z4)DuuV`8Lv-oNol(!!FyA$s8au0*m1C4P4xrz;(@Ii8+7q9wLH^o2^Rxwfq`-y0iYqlAbB0=i~3EK`SW)(cT$`_Sg;WfR+blqnnO($KHY%33bmz(nWHX`faK*r7Y zeN+XZu5*{AAW$v!>;D=xz^}Yo*02_D{HZce7tCWVSi$>rt2lh}_!6ruIm|_PAoja| zz&9rotYvv8mR`Frmi{6_!Sk4ng5QDN6|6B~xPJXYJYMDc49Mhm0?`H{r zu>YL2{yL>5EymqlN%g?AD?H8}gIJeF@%2j3cR6Aly=C_JQRU@Qw|xf0zo=T!XMFH3 zDcjS*xojMYrt;t{TKfKOa4Kx)&Tm)`MpEq-9)~x$IyFhZNDKq2QrjWcTB{2e5ca#hc4;gCq$-0~42CUP&FR(!Nxh(m z&!)NfA>q*J=T&JZ)U>Oj3HHg1Y4v!mL43%8ReT1?3Q*mwz0$M&_1{ykxbnBQG0mzI zTkYt2)MQ@|OeZD~e69q$wq1R;!m+A2B_UWRrSdzoS-o?~pHr*pbI1uFAfg7qM%;41 z!UpH@=JI;x1h~PG_q%`0ZA($w21V3WZ8)|D!Ah(P-h8p<1D>3(VGOgk-e& z{#omiy>Uy4*)}KQ>2OQtAHIrpq56=Laem@R8?T6W$O#=Z<78GJ{;;KV1Xv^}Fx_+0 z&H-h=W&(T?ds9Z}xy<(}yZLFPH#s*xer1_c>zJt~AW%inahf2YF>h?cp4J_g>di9Hl#8wopxt&y} zRqX!zcz;8Ix`XIXBjvM1izVYa^Uc?76`Zi=W+dXI+~1Tph3iqFU$wBm%!CrdLobO- zx0cHCdi-dU*o(0LO^4fw!|=R3tP~n82@@A@Ah^fi3+*&?>UHjo{*y9duyUy2o-d*| zwUm*!P!zw4%_wHT22{hlIfJ^I6VUSqnAW6ily8P9&|TzGL0O@=1B z>?Q@CrlQx6SB0ZZ&uVFUpTQVPe>+L!I1Zbq0 zcts~{rQ~VEyqYeimC&UYOD6$=&go_a2kkz7?ARJLXCq>v8hy$D*ELOTIL45G+|EFd zcNdW@yr4-mMp;nR6&HTme%5tsvU*MJhzDlRHX+kb`StZYJ4b@fBy8qfVoDI@h@>+m z!Yun7SB3v$y`H&=j*74-z;!DHsEHo17=)>8s=L5lcVk&L(D4nmm!wWV*Y2!3-l@N; zXr--C22z)WQDnQZ$`|NqS$an+uN)nACMqp>9bYWLwi2!ax5K+GO{a@vV2eY}h6ia- z!`0@^W56?o7J z3+AAZgad(+p+AM7yZVu%2pDZt}_3LS^dd*^zQR5Hq+r7e*zxLE3g>Cb{0}`iNGJKEAzoiq(1KPU zX5hXjvUQJX%p!P5T8_;rrnbB)cOQHUo?6q=v_n{*wLs6R0)Zf_*&$->zQ^rdL|R_9 z6yIs;=%C+P6;XtN|68mB51nlN+zQh|T~G#3N-bOY@>O9;!2GL#s4?#r@Idp~g%9 zrRw3%6XS*nZD*S5*7i(KWWmmH?O2?mGaLE$hA&R<@hX=hHxL&I4Ij5h`5tzC#45;BdaP>a{s}*8zs#N z`@|rytww=tAcJ_7z0d3Etu{-9a#Dv3_Xk;gdAl4?$1bTdV5d%)WD=ER#OG zboV_c!Jju7WkHu83QxGM*0b5Oyqq!poIE@4QPp;ZK8N2Ma6h>Pm&mAK2r|4^L2~O1 zp8BKDz1PocnFoehg}|&|td*5GZlfXtIlpvg6el20q6Z^w{?JxzJg|*HS5wEIyG?A> zxW|rq`JaROY$~fh(j&Zub(38f1x&Fq(#+0g&O#&S-%;nOD&|*}KU3#M86ZQ?SJM~j zT+XpT$r;Z>3^9f$BNti47pH|F?GU0multLQ@H{5V_
      ?dI3s$awSR8$AXIBN>f}1ye>bvsK80kveJ6>7B(5z69M#@6_BskE;>6v9ZkFEy~wB zf#08F3~PUihcJ7&hgUc)%EEf^1=Xmx8W>e9^AHUs?p>8W#N|7OSaQT9P(w}581%I#ttJ)n;^f8rN1(8aRszO32^U@ zc*Vmi9m(tpe+HTG>!6T^*D6BElf;@`N^Ze74YhIq-sPh$+_fz+Kgs+5f5iZ!uEdqL zW~(j=?W&=tf&1eqEzZE#(pRzYm5vi(G^Bh zH}FwQtl2lcobedMQicPq^?$f9)>-RPUkbzPZQ$uj?rjw7YZ9vUUh|O6hY56xq?bnn zI?M-%v>pQr-7-j+XuD%NqnI0{o`nJ}7Zx={|^YE&UY&yTY9 zSeQ$x7S0=1aTM*rDKGDIxSN5?67!C|x_MT%+$0!bL)EGaazr3wTOi~BS^A4@&kOH_ zIQldf6kZ|p57Q?6-B*c~!4Ut1t@T~==YXb2-+tIprs$&NT3uYp3RAc9j&W*gE7NdU z$uauG2HJfObK}x}#}emgTDUa$XsRZQ-MuQeVN3sdagV^U0r$=AV1O!uStO0UAE$ zyJSGM?q8?w-%{+#-Bf7tDS@;}1e(Z{F>*+XWTu@!*QWzb^A!diK2IR8Z!py^Z19VFKevx|+Aq*$4wqMb^)1>gq z^90N6eGq(chRYz)hcL1~NRqav18x{^2$uoeYF6HTpH&!Y5AKWz5CROv}!Tk ztA*6Ly1B`b0>z1windVt5HjsZni7-kw)-gkjIoEh<56$g{nZ@Df%UVREg_o#LL>%MVdNg*7KA$ONd*?^O=^}wO5ahPOo zSc2-5IbS-R@&-Yp#-iq#8n_>8k_r7rFuAs>1e$A@rzroHVrimLjw&;!J!Dc_bmaN@%Gowwr|FD zKLzGI=h<$0M0F5@X|&dn@5NL{oadmgY9McMuakHdJGHHy+3>G;8}3I6UveEVm#7=` z1Nz%l#lbV1sD357#pwT z?I6Ei{tocCove9$vbW{aSnha|ZnK+q89e8BdWAXv?Ngiv>{L&rxo9SH5eX*SHroye z_49xi6Er)R@&&NvJNx~uDllcd%Zs4z0^^D6cpd2dPf5sq@H7|T#F!wVgX(GWRi436 zMcJrk3*`-WdT}IcM0boR_^hx!fP^*{Ftu1}p3J{W9+3YswImlgmL&1z_dCGM~UTdn-RGRwuw(pwfDaB4};&q=JKi=M82z6 za(Wwbatr>pU8}D4b>1xDv)m zQD^EBkxz;1clY|(j|ax52K#J~KQD$o+zUk4CK@08Lk8ceFLg<=Ps2=s&c7BF9fdbh zt)A>+fA)>Uuq)H_0NnFeV=N4INKB*Ae=VvYJ`a_uPp0dYWy9%yZB6ZIb^_Dzk{s1>BAIhi`cA?ca5n{V3RH#F zZ4jNB;T0v%F2raa4vabQAFtNiQt5Wy8}D2HL^gf|YS5{C_b8Z}JuKC{0 z6jo&v7F=kGLoedDu&o~T5X0w#34*4MPt73rJhzhi&B6b%N`s?g_vDTGt zM`4wi?0vn1Cn0~-`E=3Qoxzs*VvR;dA31R z0+l;v*@SFP>O}ynP7;ybS#|B|wU!j2>b1cE*=w5jR0^u5P?SPuvox`IN**EyVLao^>~9AirCqxwWg* z;!tdj3JN!PaHxY0F^7TuZoCHC2#T1Q)F^0gygC2uc zWTvb%e(5dV3TAM^p_hxgt{-)sy=+OZciLaTocPxuI8_qsn5TZA%{IU7(rNA_k zcE4HfNyj~!zV8+{nRRO>mj;QXY9)pEdGQW1W1OJ~tB*^I#Kp@>>{97NJIWPmpy4c- z-^HynQ>LN3vff?hrAfZb;Oz@9lg2X7j1ssPA(24$2I^(eWf5)LagL6 zr4Uy|I}Ib2i(Xd+{2)lu`bXJB@Y$$h=QCTbq*#v0f#DNV$x99yPb>wTxi8#Q*M_`( z9liCFIS1!vtFzEl)4bJAqs8tuQh#WPkJ}qi!#>{nB+c3UreufeGCM+z69LY#3(Os% zw7hx;s&}$LuZn%4d6!GQnIfPDb95|98LLylL&Ks~&v-UUNZmCi;wZ(h-!9@?uJ#tR z2Dt6EkQWD6f5S1_-sAIY3N6MSh$G8}{pD2k2F*{KTg%&r4tEk#$zLaw*Dv4E*XGEz zyLH;?+#rtf7?eSaq8!mp)=YY%_5FwoS2l$df9Kt8%RHvzP=3z^=?6IT1Z^SWbIa7U+tux;uq~5H@wEJX9}HTvXP?N2=lnnNpOMO zsL=;%&n8DjgUG$dYWvxcl85+DcOXGN!gOH6IO*E8y#cRuapi`ABuacRChTW1PMqmW`4tM}yZG=wUswz;nSlb?&* zM8;oSMaORsX_>6CPuaDLMOG;wV?4Lm?Z<2f8L1qOUvYnX{#JXii04v$QvlD;9<)WU zB;I(3_{f0>4lMB=Oldqb$W=?PXQTfA85ITF#o7Y$7c0T%vblpAlc&Sbaib$N{-M7* zc=+}AaQET%q#%%R5a%P{pQOJr^rH7&4`P<}z!kPqoGM`)pwtyD1iE&3eYBIM8z+HY z13$64bQC{r3~Q9I%gGV|#P*Pa(bF_9Y?v{jKjEziAUC=vgG$`U*5ayx4fnPxm$>Py zdNt{e{MWU8l1#2NeHfX!^7>CK0OmdaVv$12BPr66sNq}xc@%TC#q)u`v?tO-X7jJw z{_wDr!?0vabETKTMpNT`!p)WcV7Yb?r={L_6Zn-@K)#CL3+Wv1)(Lq!lDc2-CXN`o zO?_U>CZs@FS4GuK)x3x$W@fk!3fo;q)91G)j;eAlmQ@voMsjhk`#xL|bFgHwf62;) zUD@L0X56}!$75}2UZI2-AMSs`8TXA9@ZEw+xw*Ya(>$bnU`A*B$n$DL$^;8ZKP&m@ z?q2735-5+(CG1XY;e6bPv-isKatDFbaT(XmGB$*YlQ-e&yf16G(^J%SkPwG+ZMg#4 z?xwlBy8+q@Nu$Co82O`@x(0*Cwzo1UK|q zsP<`ryVS3bmD-czJ5TZxwuIv{_$nj%d5rbrl3k}Ig zie;#MQ%l3i45HlGH%f1Ox+{I=n?NSTy_=CQ`|d-y83Q6;zO$n#$!pLJJby3yzaQRa zM%{}k9p#qt+B{g!YsUSsk>x<<+emL7s*cAUL>bv_z^rE3dv$?ey>M=b9Qf`h@aqo( z`d^<{JiGe@)=?BgNsK(Ciy!{FJ*P_kNxRrY-b{gpLmdbmX3v121b#iB9AmSba~fWWe;V7rW`{NfpfvW z3MdOTvGa+EpAiO&8Oo=nnkkE6ZjKqM1jIK$m^^5y0?lpdsMSpTF7%5et z)EkVF_DXcUBQGh@~oy+5a0P*MAROYn(Z5L)Do6vmLB)bjO-a=+{>Y3`A}ON9;uSBdcYR$^qKS9txpf-Z>{R1PqB$yM#wa%1!0KOnk5H{`2J^kIWK0GN zx20o>Vs5;B<~dS5+v6v{dPf|xGMbfRQ!nV~1*1bWS(&uD290WHGbih5OqVhdC-i{~ zkLFKHYJE^fLY^!38IPod-n|=^g@y8fjEbd2Uz7@}P!e;+?LOG|1yFBmJG#!e3vX0Spc>ScjCAB}ZlV$-!wqwsYAC7- zqLS6r9HG86?D~cqlOF6wKBJ---L$j9bF#UR+??1ANSf7Z*RZXEcM363&HEtETl1zPs8i!~J1kR=A(wQpw<{dJ9qLW2Fsjv2<}e zR@1D+>Q%GN(3zsb8?kjr9H(a=ZFCVerZ&J&aKIWAGRaDJHXCX?Rz!G6^jdkjO&- z;4Y|K)#SH~gqc|dVd*nw7RvhH#wEmVzj!?~oh@8`j$c3mq5Qrj2}1}j-D1@|UWUde zH!gVX4JKUWYY;B5;eWmMiwyNMdoKBV^?zxvx{VU}lU8jj6C1-+bu|(dL zoVv(mk{40-en8-u5oI zC^l|(q5efjH&P!22<~a^HC%h4h&Dx`=CFN9*$$yv)GNIYr-uAvXG~b}&lRz>Q>cok=2f8(j)A z@x`z8c&w_5TPJt@1-tg*NiaoZ$QhwW5|Ii^wc-YDVH%0k0mT-+S|fH59CduiTd(8m zl76VNA8BN*c&Q%}L*``&4pt*B#Jw69g1enD#_ppt-dptHe?nb9>p=6HOT62UW$Bjk{k%S`yn@B?o9P5jr#Gfk=PChtHtuHJkM#&Vdv66Wu z9x#IAOO?9e|gz9MyZ?@Z5d!AYO%Hsg=bvqh7I`Q(K0uk?) zfD=Vo{I`{>>Z|uw^-qzXyf}&3h@bAPNZCl43Y!&LkT_Y<8Fa4_v{%kexqO4Fsi{rv zli{b>B|E2`nu#|y@H})}bh`1Zg0E`!y#YpJBcLTb44Kq+Rr9>teOIOQ z(TKCDF~fOlYdGqcGWVSJX1eUAM8deqRYRLqByJ&#z#Qk=aZ-qlaijSPDPy{v&$GUqoEPI7iBA74JNSm#0= z4KHkjdXzZOCTnij4m+HGVlnQvzaE@ab-cwL&i-e(rPzGcxZC*qYI&R6saTIAPnHVE zQoQqkF8`c1n#Le1TV&O!P(tGBWAikjR)u&xQU}CNsDboF9-jlvsnozHKT9W~B&nL2 zMtJ=F%A-r7a7K&5A1G^F*&Rqosd>p=PRJIjj(IQn_^!I>K3;v!g$o1?>mIn|KfDsH z6%`!ZsBARtYMCQKvfDy$23~^Z8(s<^P2QgvmgsyqJT{yVzYlr{q^~x*8FKe!n#of( zY#}&Og`ZO#o2{F|S>nd0nwnDbRMgbNX7x(6d9c%_;p1h0txeh}a@HK}vxmYq?si>? z9-d_QdwWuM+c@glQflo=xFhOSZDk|Ecg0kZY-PWbY51AE#`2(cD4x5vwP>@VL7CTj z-iL0g+c$7K08ack_@3lx%xLZFS!+sfIOBp1GyMS*OUJY$gSQj0yH)qa)s5O7QFi@< zd6Ml~wu{2^dH`WqnWn@Lh-ts2?HWXx-kO|fvpRX~;$s8Z=VsQF3VQu%kHDV{!)v}(RS!#rQiHbc7rN+K}Gqbv!%lJOr zeeAx(w?ntyKYrbR)!BBp9>uh-@15Rr9mJ0}Y_?>1rW4IZH`Y_QL=G~4abX3^=RC4Gi?1k!PnT{r9(}5DpW@2}#DHlUVO?}PNzmmx8^Xue zI;C4(_;jS2BE;DKjjeZBcrNb-n5@B4O-xhw%geOr-*<+okpXS;AKTDH#0t0M=0}(} z0@38J639TIZnt|-WMqf}evOS|+Gg@9l(7wp_~!mxmy?2m#0KKmZu%JsO6;c?+KgW2 zzx&{v`-bkt-3Y|9&mFl7c(|!-Sxk77!u!IFj~`TW_0;r{7x%XgU6%j50N*Zi#cwA^ zoTQy4$Mg*2i_C9Z;vv9AlaAO44@KLfS<~dS@r+I^^w(w=bFp{NPtLx{83N0l~f8bxyABuc-ZuL#6%o9tw zkv<8`Qt+7vlNzr;t3(dekZBtAX?e?_AXE)S-D9uF$4R#Jh)9ft3H(3ro ztq8KG{n&!5eEaZrrR^;y6sXu_R9Iq`UQsU8z>EL5#tO+FHrU)Ck<3-QHdk?L;{EB& zl?A;MD?)bB9^_K~Gxat(IfBMbU9XEMvD!+>-0u)6gMe7Eum@wxy%Q8WCY5k@->5(|@OuqbIzN}a<^-OL^vm+h+$X3@ZMFSOwn?*^Eg+aCGtYSN zLHA`sc8LJeA+U!hMCnzI>7JC=c7G(!ZkyR9(ENU2AO#Hz zQ8~ZzALzHFq!4G6TKBg>p46cIZ1(3LOuqfE5`KHzjJ?@c-N&54fC3y%!9;oS?vkY6 z?0)ff_Yz^VdQ}3}2d86zvqoW-0uPI4zA)bL8U@F-98sn_ex7@wss7f9b;5a>Oj9&x zhzNyxu-uXJ&;{@2UiIpuVMoV-BwLt^&u1&lRqX(UzpE>30dt@)i-(suxvMiQ7=+ba z_YO{n?z4r}08$6d?gc4&x#pxn_pzqPTl+Hm3~jCUImlj>PuoX|g*13AMTd7WM92K^C)#)h;xqR}yZw$8mPtL##)scRoGpQA*N&Vzt^~TAWN;iY-qA`k5?k%p)$ystt!Tzw^}lCLLNq!vnuWElw$2>7j7N?jgtb_O`2`33#Ij2)xm#;wIarYyEvypz$ zo=U#HBI}`qp2fCx&GI00X8T^{%YW3n zGZ9O9yIg4`_y@pwK+JwMP`uViI?c$oFftfDU}q;beKFWGUk^2Ry@pykF6@nxuo{Y_ zNO_*DJ8kq|TQxZnXi~j)R2GEi#4oc1mZmJ5%j$liE&BuF={)+~Z8tDRVvnEWAA-m? z8rE;I0YnlVIa<7!7dhAOc6+Q-co~r$y1n#vRH1?SLj2D98BBQC-b*Hs)BpME#lb8L z^RsoS39hTT?kug@=mNEvIe1*s026S1W-tY}z)7A7^J&&SNxgoQ-45yEXDZobjsbci&Dh^Ab`*{U*Y)T2MH^;$^ztUOeF6!qP%7`wZ z&c6f9AY!*1iUqW6EeGJ#Xvk%g`)Ho0{{)8R#p$;-x~|@SvK`LyrX(2g?+qt6w2r&m|B_Z@)YF`@7>mKy6hYO*TO!#xA07|Eg@xcP2UyjkVdE1PCl7@`$^1H zip`YXMc_v7?7tGhrmc3_yV4L6$j#?(T1RJ#sX8R!+avsllyd1c6L4d-eo+$)&Fz!^ zU~X;O+8KeFe6D7DrPjB$Bm9Gic()j=p+2R$1eM}%G@96U6}hl-=@#92*!_AKD{}e8DvC8d=g)A`dfMF{ zHoDC2SM@ii)70@dwwa*9Z_%9Wj`ia|H?HojY9KAhu$mOnJ>+$)`yh3Xmawc%rVsO( zu+A{SY?Id$RNvFCq?MmqVrEE{;aw+Ci&dMso4YhJX#e2t>@VNb;@-7Top!9(YQmw< zL`r6TZ>#%ZnH^$Qxgg1gntbMo*SE;>R|zI}xe0 zE*4+V*!mTn&Bs3A?gr;(NK?CBK2vvscbnN)C(19Q?T4vRhHTsoRl&OFQ-4O~C;Ux- zjV^aq6)s2&*JaDy_KG^^HHVgsSG*sFxxH*ZR*^=R0!#Y5gCc4B*c?`$?o;LjKZRB< z4l=Wco)>{;<}X2do(Y7FujAJc2)C7lP#tmnVM?SHjbhyn>0It!CvWX>`1Ee>>(S0K z-J{5LDbS{;QbKBHw&;iNhV(PY59|t@ZixFCMc@qW&fMpI`{mwG>`P2C=wpBc^2#hb z&_AI&{c$if>YOU!OS6V)KKc_wYDbsoozBxN(1ktI)Mc-9nEpi{y0&+9u&E7HJGovR zNCpYgYqJ^#>ZCKe)&Vw&DPUl25L&|*luePRV8i#7_x&B0>RViaMY1DN5!N?*WF{C^ zfj;^uu%pOnGW9fjt>KQT#6(9&pPF|UG2N2M{GZ<2nK)B}U0iLsozwR{Xlx@4jmQYR zUIjmm;`coy=QP;4^33n=Z+SNL_cdnv7 zM>)TuUmF5b%XlUKrF1e0ESaeouz4~`>hXRD&AY{Ow%Mgq<--UNmge&*kX0J(LCY|^ zN$s{=J&co1oRyUHap(8b{g?rL_H_rRmFh6iUixo;vg$P3-XH;Far9RFg=~8BaG5dcaS3Z}e z+EQ@QKkxNPcvoUvAl&!eMY7HGQ*6b*qAcnnCbgueEu+^n;u<~c~AXq+1u!xh}otw<8bU7+hK1kkIR6;Sr{@u0aDkN{R+KF=N>k| z)cL7oy%0M%??Y_nY+k=F_E?ZiwPj7TVU!D`rlHtLNeS;-NnE=IEI?eh)Rb#bR~(WF zk@73p9t*LgX+{9g1zdz}+R5q_lV;meP!GvQQ#wk&@`*I!z)OQbo?*zQAfNLZ&5#oW zt30{&Tdv(H_&J5mI%NT!UI@OwuR>G~#moHM{i5&O%;;W2u72^wINZU^Tlo4GadHru zjBvbxIY?4){k#vo7~L9lq}T2rvXmeGOD0SqkwN7y9bZGD29N3!;8+Z(iCA2q(O}n8 zggjX0-*E9VQ+>hGp>i81wCYypzS3JNB>|qL#QgU(Gj!PPrEIYof~8g7iCW-{QjO*3 zeR3@rC5m$HsH7YmI#d2$SN}Bfg^(_m^TMO#EA)9lGdmkCwC|-F9RO=WQDIm@ITj}i z+WIydzn|jDm7r={>n@Gven4Zwn!zkF(`})#F4R@ib#ke25dvdnI43!@`^HOE0=v4= zt1Q%GQ=>--J1o2<=qA19|E~+3UPE(M^MR?H$H2(8YJeT%ze&Nx5mMGbwz(!$jW>Ba z0l0S_qL)$;gf=hVpAAqT>^e#8dh_i-{t`2TUxhpuj3Az4d*REz@_gRe{s{_qRbq6NAQMqW5+LlN)|!SI7^lhx9# zsbYe2E${f!moEEP1>B>l=`)RI?SSOH)N5+VL{I$EV*C2X+(K`kR&mGr~&bL~t94@_k9?g!M-TJyxIFRcF0^KS2k@By33B{i z$?}5uEL!p*Ei=G`ahQO4Bz1f)tol<&X_nE{(s96Xp<3Xj-`cp9_R3_TqVVlk&Nt}3 zW`R9+y5U@p+{PULl2yk&{KGMwq{2vkCph_@+lYwLX!Y#6BIkp&q>7tn&exBEu&a&4 zkz6B;oTwLb4wL)1yQfNYwYD%>Pv7juk&1uUe{!RI(WKt*j_T~~F^{QfpXh{*hl+Gl z)>-bt6t7%9e4FvXat)E|rY#vi*^l>_2%Nc?c4ZzR@}&%hME!Tv#2=kEck)-6vR~R@ z*1bt3oY_DS=j$M)WeVW-rj-ww^&9rnclkX6C$o#{2@%|-?5Ctd?$w#Q-M+P=qBVj4 zt{Gx+%qD;jK!lH6n919Pg{dA0-QLl=YeITNIOC<$i^nClhRr7dJUl$;!Oeq^%z}cK zxR@-UxOmesBs3wII(S0>7HDKSv@Id+?~Q=E4->C15w&Z(HH|eTb-FSAD4x=h4=J*{ z9f;drZ*6*f5#x{;B)h?vn8>10+gi-iFT`Y?;P?~NlLH$!}PdotolXVmb3$oqn<8PSfr{|!FQeVC>bucDfuE-n!fG1vqjs|`Q zgMjWUly52OOYjvvCx0)MO)f;=ggRg%JvtIHU$!jD+{pp9pBt6Ggf<*w5^z}yWqIoi z10@bqOU`~`SrW6_EUdF0g>$~)&kw<8B;&kUsbt!V-wJAuZq9UT76>xZs=Z0(e4Wpe zeRMmAhfIk?urk!eQ3eD(`6T$vO5u=^iaWmWM>7$dciqq3HJ6Z1WUxpC4BVB!1bCjH zB7ZdJ1{x!S{~iW%eRG?XfQMjy^4_bemgYJO_tm8iFTFCRwm011Ch^f2bWHDA;5IRM zvW=-3Av-+`W;<-0{wmp?waQ^vkritllddd%*xz?7+C5JDIsH!7aJSbxZU74qkbs?m zOO10Hl7o9>PPDVmjMGWz8YAvBg$vA(p1Zy8zJ#opcKN2X{5H>ufcvMiez^po9~}=B zMixF&&87y7xZlhKKG+;Jba-+Sa62?>I1f5Kb1|tmYI&M7#2<)E-PkbWQGnI@>~<`O zOGcE{<+BSPJFl@esChR&Y3TNa#aST(0 zq6-AYcXue>Qdcw?l$Mfa7kfn9DtUrTe~ya!nAf(UlvJ5^P3v1-ZK2<}P93VcuEYk!!eiDkRd41 zB=GV_Wb@fS2AG)7UW&mz%-`U}@SGcrv|;SHo41a+8Ka&@MJSpy{35ciOvRSVU&y82 z6reOtTN z0)Iuv{I}icd6y3B$j!iH(v9$SUgoc7-)eXF_aLufhYirn(ClzuIg-j<5tC&7Z-i&a z`M02LLM-uFldPP>683)kfUj+E+EN6H{|G7tUrI*UE}SV#<`919rI4RQLgy1pUC%F& zsIGhVs_pJrESXnF1g&@8FQ1Fgx%+nzza2PDe|f=iacL{_&;u?#+!AL?z*K*+Jh(1?VX!QC=j% zLY07+=`eB-VF?3s2Y(4_m_zAabzJrT9{5+#{`9^H@}ccurk_@@!CUM=vTm$zAmd@O z9-9x>x}Wuf^JPu2P_MtCs0RkzDYvENPrS2OdN*BD;X8J;6I%>iCy1XKN%Lk_!w>p( zZrH9LD@$R2Z?G+rMna$6wTQd>>E{EI464I{H=FH$zTcF+v!u}EJSWdx&xZaEivt!N z=RWO^fH^#-R_Ltk>980|M$0t|SM*fit<)<2GcI|Mz}%2NE9X!vS2DE-g;7G89UUX` z(P+gtpBJTnxYizIT>Y7?Fsv1x$9}baTf{1%9MLV8$&Xff4|u&d>c!k+Skd3e@TU}f z*Q5}f)LLiC;T4B0vy&DCj67<0d}dQrnRexu(kF)mg!*KZ%N}wtMj;hrCg5?pJm__A z-cU~pVHIgUW|%`$C4kne#be0rQ0zC`ZeFLu{VIG#CfjZ&j0&dwbx~W9qomrf!}ZCN z%M7y*%OaEh#t?-SA!r}*1#%lAR7{*r@aWFAkeCnKB-%ynbUjK8GM{Yx;cc?5^CV@x57!C5XyEA&V_&6eqG zF;MY59(G7};4++ltfGx9!+~Cv@x+G^3z+yb2R2Dz6+w>izc_@yhB4@pF7dvVA*hSk zf+-ljuGyi1eD!j+D|2yE`8PPXMto@x&p9R_vHjnHi>n6+`3`GZEV{)szKm-&!#4Nsv~mxbBezPyS1RP zM9-e05z}3hQ-xaf|JjZRhWj<}<_- zq&a?dpR(Q$`bFB89Q_w9BZR~9DrMggk!=Mgs+}m&DoASO-B}MyA^DShe309I^GVhl z)u%7y?Os&$e8crGu+-axP4{o)wz$4xftZQ9QWKqE)TO3JmwlrPB0A3(#F-*~G`zRB z>a1K=zA9b=uhFzD35v_-;X?1zG5^^NGJ5*ZLuN^-PS1<3Ti1s5V&Y6RlTCrNfyC>> z52s4jfSD+G2|Kj6K4UjQ)T@z(ZrJuR>bj|$BdsQ;<3-O{y5jlb%5#m%4d-_?N@j8 zTc)~E@@MYvZ66^TKCc{tzLTTrqXFxz2fwG6H2yBN7NZ*6*UlHb5cVshHa?N~Uu7-s zKS!rtM`FCpbC&JsmJySh()ohOBZm4eswdBv0Y}6e2 zZQC&agi+juos$xWSh-ITVB~d{56?-Q&=A?whc2q5dC`_m4&|@c!_4 zf=}s!1RmEse;^y*)*!Zhkn|(4LbbVha8xvO= zUn|hxAxlPKg`kvqT!3&gXTe~Z|ZHn?9voSbDlC&G|BYd}OpJiI1YpIq}s!lTs& zYraI_ceQk-@+s@Rtwd2kqf1T?Lt#voUV38+z^B#PMZ%ea)esj{_&V@1@T1)qQmM+a zBU;X~+cwMknMwXGbl~?&Ll26gw#5(7oCaGfvJ6g;WT0nrqgNm_E~+%_rFZmVS#8n! zY;2gqO1V$`bohS>!KAKGAo!HO1aiIP1BT9DoBA)=Z|@tS!De6H2p-(IL-{uC$x|BL zoFM30=xg^(&I*ND1TRlO8hzvhP$7J->(0>}Eaq~Lya(;o&5iDQ42tA32~Rz&$|%2m zI6kXW9C<$t&tFU;ahC1$49sm7d&t8&omb+0^onlJG{N+SjZGlHJl8B;9aOx`kB||nZU}Xcxw=74`3GcFC@|qY`*h&^9`7a z9gBkY<@T^fA8nf`w92JCS0;Ab_-jfVbHNa~**cfwN*X(T{KYhOiD8;;et22plDWda zRlxmoO6y4Vj)MRXhqjKIFEg@^+; z|B;AlnPs?1lL&t+e@5lCc6&>*$R4UW>el??5IM_jg1wJ@Z0El1vj+78Os2Y3{U%Ax zWDMhp@yDJ_{~t%!;Rxmb$CFhNNe&rDiey|ywnIYZkz`XwgtNDEXH=A#nd~HFX586Q z_TGoH&)#R8<2b+j{{DpLc|Onk^M1eHuhHU%TWVixP%C06XLaAj$ii(O&k|RM@pUZ~ zCMEt8U02HxHoPxPy(h<@Pt3|v{tY`y0%Ib)#M74|oKc-$nC6W%HP3H3!=sFCVpFq{ zo<@kD#my*pbwfTLg)AkAcLoSK)T$6H&<>&o-XdMahXN7k%dU;?;Z&dbfb+9IXKAC0 zES+}s$4r+jskOk0C(y!0lN-P;R(L)r61^H#(5%eepmkyi zD`Zsk$rtcpH=bim`sLhrKs~)u{2`E-Q4RcJQsgDb#?dMj_^v$8&)kmkZu){+`9Mjg z$L!5d$8XC0n)W1G?EU;sUOktGRmv#TUi6)>PoT58XGzJv+!?6g?ZFCSSPrws-z6UI zle{a=ow6v5_|Qau{!$(^?=Y`aBMn-~`Mfj2d0~bIYKaEbD+lJJq}JP{)}LQ(m-_+t zQet0nIOTfaAWiCtIu&%c5-R`dq|m?Tc93ALBXA6vWi9EOVcYE`L@q^TbS471V`-Em z)1n>b$X@;BeB=zcx0eTrgXb|`soA7a-_1eR-gdnEW4W3-i<%OE5M5So`$6G6P*m8L zV3JLJb4tWUFX}~~^g%{A#w45JcHFB2?EvUAPAOOz!-!AHh^ZVy0rHvc4`t*$I*mt7U(G}?%ADg&EO7)m?E!MRNKmRXYpnj?yqUp z-asxHqNJ6n4JHOV;F0jd;Z~Blh^oEQOWS)kr%xd)50#!xEwf$GmIifw#qgY1 z7#+on;d1XZaqj+1?ZjfA485}IliI@0%s8y}LNMrhNb)<*SH{-qSx126sfaxrUj+twl}itm+S6aKUL5VP84y6 z7okF}5)&!MBvzV3{Gsf}zTDrFTpP%!Q1?U2c|3>{koJ_e`2vN^`h0`Ry7A*)Fu`v% zNscAU{culh8`KXvoLpR2ibW2>4!g-)7dYb9b+Vin&A#0@KMy8$S(9PAB67@EbeWki zhq-XSi`9ZPPovq(f9>Dznl=iD*Q%o-x??=>5L5r|CLXa4&c~Fp^|ySyAN~`yd4axE zVAaBzF$aRz9-e(bTbqeWkv>beo5X#FOf@JGQFk-B=ShvYoRg@Af}d7I6Qu^Z#-&=H z!yeG@*K;CnyHwCC6hC>WZw&P@UxO2Fkmzxh(J!v6x0WH#qZnV?*KH9z1J=K=q(rsj zS2TcYL863&rvDH+b+Pn*?gr159$S-0&dvx`_p_*0)mX*mbJvUWBvk_zcG ze0uT}&kU)N1dmyJ<&8(TC<3|{%Qpa7)5@M#AXL>#p@f6D>>1Fpf(q4621vdKsT6O2 zFnGbUriP4AMzRc1LPv4?^f7e!yQjS@7H-UypdF=sPfX1_`s*G~0q^@dcJ}U^ z1RegWcamn?qAmX?K$V`jBT}5`SN`g-iqjrbY9D8a^ZEfk-=~^9&G%7*y`YM`A$4kGTw`egI;&a%vX0>&I^Z$TPsFLW$MLQ){&2dpn6{S`0OF;CAum# zi;#FhBB(V;nJ2LIiSR%2Oz-a`$i#g33DOG~64W!A4$ew#V}Gr;W|;Y%@=jpSyM6Sb zdDk#=O=vSgla}__uWiczy6>L(SyCCLpTSOFoGbi;;00$Qly7~1x-HZA2SfQo?m9x- z{9XDE)Wt>mZD+uXMtO%zN9l*H>lCGOIhI!|Xc~32Zl6V}A=hRPXMSc;n&Y(|j_``q zg4W#m{@KX;FqZ(T5)=QC(U&UH4(h+LS$A=w)SL_u~TCN~hduoM2*~WrEe|Dv|BcRg=Ynyf=%g2C;eT;A^F)0yk0dzS!1D0{1*Fxc%x`{?doF$I@|9_5*xZ1FKok_u?_@?7yF{ zF!e{h$uV6uS*@P8?qg8$nn}O3!W;?cw6MR9K;NmS^vm|R*o?AXh3Evxs6EH6h4vOx z<%T6A{drIloQO>~UkXx*@97Umm6(|0$?G(EpKMmI$G z>{ymx-hWkOb$`Zd@FK-)Z2&&iTDq0WK=#k^2UoPb>88Umn0lpk$x^o2@g2}62>|tf zFdon{Cs*85+$bU9VTPMe%htN}R~?qkV@pP(-!%bo(_OGl3fHje*?t?Y$K?ZwqT<(b z_!LFNi$s8xz4b95|3$jU@(UF~;4SF2`H|dMoqT03^B9(DBJI+Ow31!bF0*X?@AXbu zyR60?bn?=gigGY?GqKL4!q(h7cG}?3cz;*y6~-Hbu?jY|R83jCFjGBX`&#t=#0)(N zOL7ZxSo^qx-u+YrxoTvzLr$C_jiZ(D!%B~{GZi+1(q?ywbG|{QUnIw9yNtA=Y$>jD zj_N?|tQr{X5!HNIB|8Ow>fyVrU7g=bChc0T?v%8=QR)2jb!AnecVhcSkx1QULa}J| zRvkK0CbdCM^B!q0xc zR-?aRC4jum$Z@Gsnjr1iY5Yer1oWb$_~wFr=KG_uv0p7FUmXms(iG>7wUjC?g}$ zDlC5_B52B(Ez&Y}sNymKhtd?8z~7V7t2{>lgNh7N6W`V88q} zR~fk7F}|h{`w7u22ROtTC`4XEcUC3QC9&Rh0ysY#i4yp9kM;xiL6`i~0SV~*(kJms zSDI3v{vnnhkRq6%)xf8Na=9qh!q!A3EuFn@RABs(_?SAN zGp}wj(Q=i&taUWZV=4*?sAdc~>pPH|uv;%^wh^0T8xfOL#Y`y%Z5{{V#I8I<_jz!acf*Gw2DgXX zySsC9@`w!#UR3cSA|kIe+oI1Qk>vEG()rl)@%EuZ?j7Z9|B(~=s#g#}8;VC|#GmVj zyq=nAhDnq8u|knDW5<959p#CS{*}^%r8|dg&csB+K)&wkCW}dB)~43KJt{tdL^M7y z%8Sj{e}}j11=lWz9y!J+g?g#2EMwyHYpjSIojqLzzZ~D6ySEze)ldX}dsfYBm1U>@ z`N{)NR{#YoJZky-R>=^EnJ)*dyVU(zswMVumQD+Z(-yBx6OSF0%XTYxrJADWhP6CU5JNK%I%wKe`mQQoNAo$N*e4iBf z%z-9{IhsqCotK?%;0iF!*(ToaLmDI)XdU4W;-FCLAjkkb0yW_D<^pw`Y;)g!2o-m2zNZh|5tJUYKNrEf#x!Lg78^s zP>k(|^K<=S%3>Dl1eXuvx{u2NKf%qib83ocvBjMHXW(N-pZ$p!h*TXMRuuXZa>^usot(A|0ZdZJls^g1C? zffr?RUEtbQW&XPIA4K1yvb09xa~1ONX5g~7eO^4(-HP+Bw?9EYfIMawyC*G3`%awq zVZoSBFEh!`$W-BaL(fhK;Ca|x^EZa_CmNP=N%wNVV=0-097Vi^Rtj;*;u%1>fM$|n1WoS`vfDyKzL90toD)d!ZrQ zi>cC5Z#4C1bV}00SxS#{bj_|p=Ql4d7da(m7^=LR;N>(BIumi$C%*AnBkgz^N?Z%P zV)YSr#c9rU9M2YjN`>uY<0TGoy;mgo~Y6BS!rpVeYu;|fzUV|TksfcvZs zQ=beMw>sT&BQ9N00-&RC6H`EL-Jh3ZWgZ%iWNMmvJ2~-o!xjRYzHIhc{mXd#>R+OL z%{FN5P{pVpB^+|5YMpb?E{KjZ;fuY86#S&R`6oN$AVPTi+rX2guVql(?2soVxX+BZ zm-TUf-L_swAh5q3JFX_JFd*b}*D?Ov)-5QuN@e@+hrSJGFUJ*4&%Zs(@F7=n-_Z}L-G85xn% zY+Xee-S!Z87pW~clI*{U=Fx*dM1$7_F8`tEiBX-j!p|n}hf@pE`Ep13W_D4w+BWY& zi&e9P7R*IMCRp=#Gk!R#+_+tSv%4x&>(m)7QK``Ta{dSCA?tTO#p!svFz=__3d!57 zQ`GHCN<><&-Gb%p;Hwp1AP+q~8kusKdb7Q2-(cTSt~fC1lfj6_!LBV+#-2aYr;2kS zL-)n-QT&BsWo*SAl#-&OR)_t_d%YNDc<(^qm7H?ji%)~Kl0Qu{#I4fw*Mi3g&xy5- zAkYpb!N;@tvyaaG~asoK?!vsJN zS?~|&*tX4GU0rB{I6WDv{(NBwq&uxONOejdJiT8%tBLx($df8j^s4DFqn(jTsdomk zNjcSY=BM=PI~revJbK?pTZeG=N2JB04h4T$u)O8P@_ks2k)g@A=If?>b;9a+5Rq)f zhdNtISt(k)m0c(jl-NCxTq?2FGV5A*nYi+o>;%R&H&o$o7TbZ{o0AP9xw&KpEGwCA zmjK4YjDU3gi;?bCf(x9Awttc`QSKpnKV;pFR$sFYGCwN{?@R65@?CkA`GT3o)wj(7*Yn7SgR9W&Ws?(p zI(;|mLV9%Ls7-$TKMd{$8NwZ&2j4wXvXz@f-fNat#_1(|Kbl0P+S3l+%#we$OyA3w z#oEPaq1QLI)6)+R?})8emOqQC=V?B%CYUmeO+3@=A}#Z+X(@kd++ns;($+s!P=)%*~U$Dtf0e{{sJ=P!DDfM0gn;*M{0m_ zOC6s~?ku>w$oTrE+RA6ht?^E86J^jUV9~Gv%lH*|qZu@lnMot2SxY{>@ZmY1 ze(FxzXW5S@Bl@p4pXa*9mb_Eo01=0sTov!?riL#P{vDp4Pr7`gAfxFWZNKJ$bKGPD zeXqUq6*tak6!^yAsxPS+26*=GLG~*95da?-Vm_5&v*L9le3kaIA~RZ2k}vD-TB@yw z@~eByN#6RMrJL*royIpMBiW1@5@JvB?M3ZQvin;|bpJ#|Xbj6Tru|^4TACPMg$=i^ zDfw0PwrcKOL+a39IvvEV0Y=}c20XX#_}QF;jNumzxXOp| zy*}hjyjscflGPeKX0?V>TUeBs?g~aH!zJ|&pgQ}7W6gaubzt$B7(l>KzwJjY0iSeI zxKW4o%dh%Qyxqt5iW`)!shv0=z6Lh&WVt(al`f*;q-QN9I z7^B+=q23{}p~yt?8v4pqj~R6&$D8ksipt>VDYN*>dL~r6D5JiIr`10{E{Bc&H`3L% z8$07E!-_N$yja5ees|)(^p*|x%T17}a4JTs1*h5(yCd|rryH0c?+4|4AF^3ke`Z;s z$&Y!0fZvcTv_Gk6p?s(FXbYF7v*yojh+(ZPNz_KzOz@oYTgC2`U?GbD(*}s`xA32C zF{8#Q+jsW7By<>#KA5d$FG}m=(a%pa8!H#~es3dmXKt4dNU$r|aMzaQ76!=o778h?_umHvhyW(uce3fAU4*#^UOc_+ z=V{%q@$>W_i+3A-TB$}BYm=!E7?dk~*Yo$}L8QdzD=|68f2u|($0wOwm~xa`={>og zGd7E!^I+)q;|&jXi?4G2S^M~VLafgFus`C0E^TVxQn2K6b_-$B4+?ej%f|dSdA)Zw zE{EYgeF@_Zz6B5+e!dnO!p#OXzh|{8)LnnUfDHY22OpGY#p7DuKWC9`X|sCo^+xe}RmetnyA2>(DHm#p-zn9sE8p9Ju z;Zk|r{(#SaX>=m}))g?Feo_Eu*_X2}umx&cm5G+BrOW}kN9i@{C2`40j5#B#o+JQ=Q)_)|hngPai@Xu5id?(QqE_(p zJ%&y!C4UMj|J#Ecs`6xH7|YC#IztyN+5Z!N9duiL=C$$-??CS~%f@_%8)_dV&+FlJ zt;;{(OMH+zW&%Dfd)qX%u^3eUntZHk!n03@Xc6-}9L6LR&T+qaCzA`@uqI8>CO}O6&#;~$u>$;L}F~55bxG% z;4X0JEpcUdOO5errGX`;zyHfo{71cYCozq^)m+MW74oKw2c6GX$oTx+*Aj>cEfBC) zX?kqG(+IVobTm%psuEw!D{X%;t@0ak1!`i>@^!E1Ons!r~X~7xwwr^@;B7D_5Tx;?MT#<+|O8yqCN%b&TU>cf( z6`rQ5f8m#OGD2-?40$97d7csq8hE!LrKS;VhuD`oEwmqtDMa}cX%CWETq&n&72X&k zmhZI;+gtTS?O-3LLHkr=6!dz@2(qs|tYZm5X#J^V(of9WIFxqVwXQiww`)f*_}SE; zP=3xQ+aLBO<$_M#@HAKs9YdOnMJEMLakAz85L4{9r+wAGNPF<~n%9l1j}LAcJin#h zCozvjpWi7aF)0a&B=l!)ym5rCJlrS}?SY0cyxcA^^DKCh^Wi}t`dHzO7ZYGYIKsqB zQmOgaM@l6iaY}t@dtX0K{`m)IR4LzWs=4f?VTyDJ9=Gj{C>Z-o| zDn&96I@I+R&+KEF9-bLDQ>w$j;i}JKurP<)p3KrR7jup-n%#D)>5r|0aCt3m2*f3m z^nbfe)tJ%I(I~9JrSwd5z)ogR0|vWTcy9JsHt)T{9SPb^z)24)wXW!!H~%(Mn5jIe ze{kMcEFSj-(XQm^Cp?i z5Rlc1Ig?zjnzEpP%gE6mctsE1z7pDKdaJm!?fo_5uu&lNMOKY-L_>Oo_?LB zD`ZW)TiFku&L2X~liMOHH-TpFWyraOo9ac++fwN1Q=cgfi#si9qIN+ljS8aMNl^=^ zi-3l8IyhAGeo)s@C`JtI|EJTb$`Melj?K*ergK8-z~k{yR&t!v8$Mz6*q`za%^Qw$ z#1QHgm_fhk`(Fyb&Wgnr<+&MHeHphxwS}LyW#3D=h1a})+2m+r3T(HWtVyvRrrVdBiS*6DhH39A_U=t+KanSWhr8k1|Id}(-PgCh(E4u! zJ~uaaDYktKA&9?@d!BB1R!ntQe^#`~DkZ8MU6r*E`jxOQWN>YSi7^v7uj8?Z8f|SW zGxWa|_bef-Vp+-FUiv;@IqS}U%nA2@WfPxP4YrrFX~J2@Pv2br`mztW1G z4Edxey*1XwYO$P5%hOutS; z4rMA`vC?P5&Aqm_LmS}UpKU9gTRc+8MrMYMg+vDb%q7Iq@ z(raKB|1J%QzT<{*S2KNRv%j@)P)?xELJzgOI6laA;i|SZ4WV7oRxdh#7%-4JlQ;4J z?PvY%>3raEd&P$fYrJo9VxqM;_f2jIkHkqig`{6(%hJO0vPjm(+rHzHYIE*+u1bn2>Gx&N zJ#R^C#oPodPZ%P`GPRVu3Hkb2Fe!zSL`R~XKLN~d$)CRj) z3j!!RF~XV#YoVVVPwIXSI7GC#`vekbS;x->vE>3I42&%G;a>B&JVg7t>3 z&o|?N$u!_4dC;38+p7h^e&|AX6GpIZj8FG;Vk(}q=vVTIX&iVlF8bJZ}FwhA4z{4 z%>>qL4d0AH;T)(x`7 z6@X$oMz1a3R<7T??LEZ5{D)Zz_gmdA0Dhd9&3W`%;dN2 zPEjj`xVV0f;r|ZN)j?7pgmn7G4ac1>Nw2soVx#ETyUdeg!St+2_nTv+uqL@B0r1R( zAF66VLlm~I;COH$N4p!hJvD$y9#~uB6nIhj(eepI@(@48{0!i91mNiL~ zJTcq@v5sR?%CuCVF4e)0#>?&EHKk}3mH^9?P?*yrk)ReI~C9FT9AJ#l<_t6W4O2UM+OR9Y`9r6QksmMX~Mc78f zt7t>GWKgWY=u=mBMiMpt6-R7mQ*WH&X=y`41Fh&z1(VT}7I**J%N2ow2qiRrfnn4< zlR@F*+n}#2UcL?4T>R@^I^O3pVeq7L*fq5UhM9Z*i#dzeKQ~D&3%C~mizVfXvS$i- z=R@*EUz z9Zl^G3+x!VJ?69)>)-mx(OvytFb&<3{bNom_Sk~?K+?e|;?3i^)3_3B+{f^7M@jHq zhBNIlP4XJm{tc?~HitDQzdGgemG-yan8gID^)=$^l50NeEnk1`QIc^B?a0@Av!lfR zUiWy4Zdcep`zNp=Ww$z%j4UBJ@6Bb?gx`sNyXxn+6H|-Lufg)cPF75&@71UTnXm@f z;}>;wl^Hw(NdfCCw-4;}H}6edlP$6{e_i8bR{vD)5l}vKh9@1}xMBHK0opxlqbSQuF+q}x zz%+OzoO>IhXM#PIt%FwvL?Jx5@8t`3{_{Wua(Idm&Cs;B%D<(0XEr7ux?>ruiALu5 zU&TqlLCq|VZ@B0D=3g%8f;VY4D-%T)Xbk19q;3Bwkjp=pNdPwAed>2F<7Cj@ zqI=)!O`#G(+)3uhzbH6Qk#lZtTJdBsHa515tz7flf8B(siSX&t*u(&tOG-L0y!6ZoWhwbC?|+3kAbtMDr0Zo6UA#7SLLI5b-;Tej|&ys$R!i?$#Ams1w`K zjaThdqYf1ouelzjFI-L1r^27LJ>=_sc%3BgQX)Uio?s95aW(NCy|=&|+%k;wD|w1E zF+vKSA9NE0IwYkw1bcpN_nw69MXna*{Kn5b{Y(~76eT>TO4Q$M(Dsy)1;KDyq`r2&kG{3K# zjnpcPbgD3BOSOEJcFze#4Lu0_BN+_}7Qiyl zv=&5zJInE< zE>`-8j1;!&GxDKB(n9-aZQ)pJn5$fKR~vO~%Wcf$FNT-KjSi+XzE=XeQK$V}DY2bIk6XiPg-~DyN*eZ}DWZcwln1_>rZ=sgyY2Ott)3+-IDAVaLhvXCn-SB!1 zv0CUD%>L2={Y`g!v-$RZ>3Q|_NxQ3+9^B<$-`CRHHT4ai4nV&om*Mg}s*UZyCggh;Qf^LzPdfcs=@MxNiR2Oe-*Kw~ z`dnFpJGtKVIW-s}v5?U10Aq9_^byknkI>s7+$4?iEXji5)1}ta3!E5lM`_%Fm}zOb zGyV4vMi5Z2Dq)8$CWW27r!OZFk#k(e<#THqt}vkuAhlNFM9-%7`Wz?+2}t4 zIrV&-FZ%L3NyDDMIge7Cc(=fS3P3dJ!qr#sSoSs@xc%*)&hxL5?P1C7l^^m!BxkU) zI|uqWbSNtdSkIYREh)@MY_r(j$Z|4G7(ujwAF#}ZvoHd` zO_3#fVH*?p2*1J1OMzY^pJ)5GRk>dPyl&`G=V(z|$}3}zEgqS${7AD7^zM?*$-?|G z{tC^Q^cwAcZzIWh@{#0W!GCQPZ8y{Ps%naF9ENAc;_Ltu|CLn}_lr&K?0NGH(&nOj z1vc(QYQ|8=Ddi!eS4eEb?~jDuJN9@+zLWQHT@qR5Ln7zu+&riu*R`)wR(cG}oxQJR zfYrnqsx=M+t%#Wkno3^=7CWJY4Dqc5K3m+HUYC?=6dxg8hctaQHlA&FD^VH!$k$9~ z>?Uu#NK42{fCBGU#YNIYWrEy1FJSG4waX1eU5N#Vd*^zWs0+I)Azadm7v)vt0sHkQ zwa_YF{8!6ACey_w26TzybmAtjhqME>h5u}(VMX!X3g zQ@Yg4O6b3vSYO9h{7RdvO!LC)OLCfAc9w#z!=N%T)o-m7a5Fs99PY^i_u`~??p)z^ z#MrIRuw)Ys(nDU<3V9 z3%%-cm6TJo3pB5G>LtCfDDw5iHzW4Qx;|TUZ&UmCX`43=rlsltzeE*8-Cg=uba9&LkcU9` z{^EI;@X)>o+{L8d;By&)m0S9Mrx(TI7!$u(Cq1TIk=#8{-&%?)pIr-$MBAg!dVBK|z6`@z#H! zVWs8@N1SWbplGYU(d1D z?>FRJUGq1UFWjC^IHSj1F&$7?9>_9Ag*nASYcO~Un0S9P@JuW4;6Z{;Qf`4^enI^o z|10E?&4iJLZxo8`*5-?0DlFdyp^R8(B2+3zj_Ls#Y;@>rbFkMlm0v(HERvNnp!Lsc z4{^i!bI8zYE;$YHgD}fEhH>lbj+{eh-(N<@s0kjAZMU+;J%`2=v12lAUs_lGlLs2@ zpEyA;pCI9kmRnKtW5;6e*U_$2fer)PB5|=0#2@}afwGx5H+^AbY9?Okgs{F)xg!C{ z-+oN+^P!+l+FSq2Y{4_uS=LUwWN$jrk`AiSbmbg~cU=CE`s}mN)Qh(*BN8g5d;zY~ zfbO4TE2D=`Kik?ogC#>FLBMzdPn^(2;eYZ4Lh}du*$(3p zRcvf^mK7czZtbcF-5^mtfJHUfIOv@W{<$KUs4b1Vpy%L1-0-z-*S+m>Sn_f`jNzP zbricqu)XQ1#=)C=8&M%zFh}`?cZ)Y`1Af10?R5Gu??Q{5qS5cie*aMlWv=WmxC)Fr zeH)Dv0|NrQ8+AMUd6aThfhBRWn+c`4h418*ML7_K0HwwSj4N5qNoVytUyUd2hV_S5 z=3Z8i5~&FzFHf8>e&}QJ54YGV&*(NwxQg*I^p%QwvHb=UyuCJgnlG7~+B~=y8q^&{ zM|-SWpN5`br5Lz=3n-!sFDdh#7&MxNiQ|02{^NyrZcuXj?r%Cg6leLH@#RZK=V$oduDXm#usD>q^^TPA1` z*W#AgI_0P!SMybV^|PJiU3y~im-dW)=DLzctED;7Y%$-tE(d-cUacmnzc`=v;$yUw z7CNV2QyZ6rKAu22uk*}B-bk~&4Cor!>;*d;Moo3glQYH*C(x@JGxCj()&W1cuZSw) z+fdU+M5=|a{5BINW@uI22OhO-}TRg3dqEqN$)E@ ztUjhLFD2g`JMpE2&GdG)ng^+jQ`h#D_wyJa*ih>|Y33-%r>yM{+q90A*DK-p%kHb@ zOiEH=kb%R8F_R|~nP&?v9^XZ+9`VM+y-*Mq#HIPbIG#q^BFGkYo)+agu@~ipqHcc5 zVggNVR)2~v8vi93i~Di1Oh%5;CwRPTU4`mRj9Ykkx-@uep+mc6{9x9>EbFcYcV%#Q z6c@*SxNYY{h8Hi}4=)(+9xpf)id>YWdq~6a0$gj!HR>zO8@Z~M7Zl?UoK??Vgqkeg zB9wRf2CG-gyQniSm0>l>hwrx|oL?yTxWVY|Xq72`9ij7!CDCXOdz2+_f|^}zriuYZ zleKxty6jj5&l5i@)J5h-4u8n zH?Ve?z0OZVX5-8GY@ZLYJ2Uhg(g@PJi#w^zcBKmFoBh`@1Mv6eJHz=)~>+Y1~00K=Dj|ejNCp4 z+>ZyFCzVNkfni6y<7wWSAUh8U^;z=9;^j%O%P(YlR9Sj*V3kOW>u3uEuQP!BswPqu zBt;zb4IDk)*|BeZz97z0`S72$GT0uH?s27tBLBRY>LB^}y+sS_5atIRgh*|Ze*Q^t zQ|DzbxGweL=WRPH^Rk^2q*Tqs^|bH{TM#Y$CGF3*ztv3Yb)RG(4`es^`;)%(Ubc`! zMMl4m=f1A9*yaSz5EKhKQHUw0IvEZD)2UPLoPaeN??&+hS)oP?j%Ba<7~#BTO;)Q$ zSvHUFjptYcW&YpFSlLBX^C`0T{TJdwk?`t`=GQgS@^Xan;?vf>=3pYeZhvTT zTwPW|ZU&OkvcK*(Rl0aHEQ;s8$-N{6&)UWb_so}%)*V%Mc&Mm;yYlc-`&=KW&)j-M z&5x`0LXguwLai{57s*nCCMOTM;H6KUG-PTU;b5f~6y1s4J*+36ts7(+Zx3tCS??vh zrVx&_$9uf5Y_A6K5A%HN7W7a#@%PPYuV0DtH}2i+Sos@|td)4oQ|2y4(v52oo=}Jj(0H8{w9|( z4WpXEIj2s1<4$!bBC^dFwWH)K$C$ejdOy}yE`F=4^I=|pL6ascT9$!lW5pGt>WJz# zpHwT+^z~CRO_j@UN#HEZ>@{oIXH$Z-tXbdcmpf1^lDpRMRpYIAzWi}?C5Vxh&sDEI zAxml2e1SyoZ^sxghXYbe1ZNzjoF4$JUA!Jo%@JF>?O@B~f8X0*O^j0)?j)&rSnx4# zBWBzM9^i=1ha+TA`W9w0w-@;6y6sKfZN5Cp`uH8H1>X_I(RWdQ0XhCz3}g$ah$SX) zdV+cPRGy|#OaZvuOi1hIn1slryai)obWMYdB59D^aUnCO7L7VHB}y2|Wkjv&j~G#Y z$gCPR6L&Gd`M)x1+1DxzNKQvtNAy+i*+!bP^=e8k{c*dHAHyHdJTnts!meV^CJ;62 z{i_9WnOVNY{p4dcEmP~WBc07{f!K2Fs(Jxvczp2`5*uO@2<#5?M{!W+eSQ2ano&EW zyk(0Ed=K~xeB%aigmR~T-BlTI`Yc$iga5>iD6cgi+vQLL$35W6X%y67(-t58M7o>i zvI5!XbOIgjzJKOL{KFLBbZ zCVe@aJ*&C};O6eUS!p+(Q#5iFqMX!SYiw(M$?%&wA-=7m~fF#gcf+FKuRe-_*Uz}O=M?N8Si73ox=kj)9&*2@fo4rgV^)G`Bk#qbI zrnNqKY}8QZiulU)mRQt5>9yvr0E<_;KJR3Cx2Aw;)q7LS$A3S=f(%#=X7fbpR5rZTU5@kj z{^Lrzi+EJ2a7x`Pj8X$(t^J42(*X+HOFG$muKOJ90X)l4;0ROYo<+I9ZS~56vh%BL ziGvnTyXtCkcTbDFO)&|C0tbH@*v1YGhJpBRz$Tztv5Jn6HZ@=^ci;&_+MX?o! zk$&!_HY-l=?$~w^H((P%=S9+p^}afdW(T=U-NKYKonh$-pHPA)3Z0jpc5Sz(CgRP&PW*p@{a2zHJ>dAyFY28PXkJ6Sngx9f70_$k0W3uKWDuN|hEIj@6n7=r)D(Rs$R*|1TZD%w)2ilT(7 zRU@qxd)6qmirP|JOQ_f+W{p~*T4`%nmD)3Q?7jDhy*IIA#GB{!Dc^j^{kwBr=Q`(q z2<3B|d`RXv-Rwu~y0JnDtPM7s6zg-b+eEBz;@Lb+ zhWT&u`jpmq;vhYBkveCy4={c6POL$?0`^Hh!h}+gJY+1wq4GjqTkn>-tYym*bcNYU z>@W~~7A-wla9=U|Sz_=Y1n z!^T9_x%A~}-Cz=fW!Rnhs?-0}1=FS-g1Qi*Xkf5jWR9EMM_)9DikkaN1+#o8KWij;=OG4=Vk0AG;*ie?%T8i z>KEKEs3QjywTWH2ob_hyKhZ=5e9o4fA;235q-CyzuFcc_y|Y;EggGl&42yQ9oK<{) zNRiS0CPF}wyk+PIH`8vSZbKPkb>OA)D*J%J3i7K|r%11|wCdx$++UzO8J(OlvT>Ab z9pRO|4K~LX1Ga|z0WEg<2WI0%aRNxhUJMc}W7O9WR?}s@z``oN^n7R$-5h){{i*c2 zKrCJ|;&G`1kAfb@1jVy6K4{EZ@O{{!qwi1Ee|H1P8!F0D$v^!InW0Vy%ny-aAXqqL zBf;)$TxB$jva|OwzqC}YZY9lcc=xtjk22um&l!@gQ1PPO)k)T4#yx4Ohl_5D`o`=AvpxT?I$6ma7R|; zw%7gHaIvA^7cyxns9c4Qq3A0kBXh~GW6Q` z4f8L;?hjUpP&M9S?8J+ZVTn8&8{WfoQSqVLKTd(L@Bn+dn=Os&@k@>qt z>RW|DO|RPJ^Gkhm)B|gp`R&u@@ydD+${fd;TPG$1Is81qKVD4Kj7}*hQ`~_x7+IS8 zR+p8P{bzn^Sny+3Y6y8DCE=6%Yd{d=&jgL0j4Fw$aI@C!wh0tFe8B0n1X08qm=Jsa z*6bAX*t|(XIeqA25L!R7&vx1{$)EK34SMuyc>ViPClfp0HIcVtR=qU$H}OZM_vP*E zCBHZGmbmzCsLNfw%5Nc<93%zysK#Q?qf3efj+cE^&asGPlP=8yaON9kw*(x*$mDOz zeU;3B0B`SJ;GxISAmJGkZXekVkdpDkQEL;p5tTkYuU$m&>9%uvOJA!ha*Fta3ApID zinKl5){PimRryhcR^Js`Y_sg~DE+3%PL{=2#-FG{igr^f`tiY$t+?y5Z=?Ib+^x3+ z6ANdHCE@Hs$KvI^u;F<{5@^nkT*fZEuHB-lW;av1OPMrrd07)ouED##@ES6<+b}`O z)pBp<$snX&^Pu&8mpuGaf~6?M2j|uw4nGFIKHdm!eJN6HfSVdb?x+7prg~gxUVo9b zKClOCkJ$!VBuA@;5H~d1(|Sc|Ma`EUw0>^jk9%dYpu#4*`#zU5F@z{rUHlgG8=G*mFMB|UG^@!H zU2J>|zRmN?w~m>Bq4g%-Tu^#ezeDZtLU;<8t1@v0sqH ze3{txzZ)faK2~k&|6Y%)Kpc?@7VoUzIPpKkd}63g-Iq$^0baHm-Fd8iHQ8woJ6*@0 zOx0cB_rhO|yE@*q*Cvi_t_!Rm39Pa2yqtH9{SmMs&UOMXAp12QHocy7p6e#~nyi#k zO=W8BUrGk(=yQI;wnqbArT!|+#iH34a8P25&{m)I{+Gi0qse9c37hOG6Ebb8E6u4? zKv|EPF%Hn)^;bFic3cJqJSFaJ%)**GX>ITNHmM3&TX3B0{L<#EkzOoS`#(St3oFsN z+I+RDAgp7G0)dzD&wnqzGhb{}Z~0Pv_^0Xnew^~XJsJU8?Z z$p`;l;Xb1lB#6zwD#lavBkOd6#}4bR z4gq-r5eVn(s}tW&!ZqvSbzILP0iJ^1xx>$6gc@oLuPkV$lvSdJXBI?XPvB~$QH z>>wrHW8W_GdeH_y75;OQKCDTtv@mdfhOB}rU}yYkVrsjh>193YWvjcl7EwD*oqY$vgJ|K+g#SuzddnLnu*FR z@GUMvb#RP|*ucvA`p^kE<*uzvM{rt2cxD&gq4YX`lW-;`a6j27$udKR#;aXeVk(h6 zxSfKKv5!_x8lX3V`EzIU1Le_nLl8#ed5Ns#hY=`c0y2I{ZtY$b8}|xqc;(ACsVlk% z)Xd(-fW~kby5bmoB=Vuo3>AS+jM^$u7G3}HZ%v9*Qd&pEFrUD&_bf$RgbYDnJTc8P z`*xR%o7RsFr-xwIXc{FG+PqtSmp}cXcX5{3-9{3GakPTa4!ey)6ZcPXSgFnHtT*mN zN;b_c3<3jdW!yVlKJ!az2px305=U$H;G_LfKP*asqJ~^Pnmlh>w2Rac|%&gZ8{1r$sQ!Ei+N4`l< zfgFjqGH73aZm^q=0K(O~CbhMpKS2Kh_Q^!`cppU1_s7)k=A{j zlmfV*Lvj7?qUj(Npi9G@(dBgm?>P>*X;P;3h{er0QNnwmCjYDh^Hfy!L!TO3OU$Rm z;nnLTkPF%Yi^YYpC;3CDnREFPA| zVvrDh=Q~Yy;Gf8|sPni>UUa%I<{llzNG8OdSIcSw2CB*P~AbgG=9%)Fye&CBwT$;?RcX&``!BA=?)rSKd2^Qi07#KxifUy` zNXNz4zZQ59X|I(ylbj>14w|)}q$z~`cQ_I6;^U_By9ex~dw<^sX_#NIAs0EeN`sEu zYNr4|ZB{Yf(Yh{pbpW3O=4QwSWD<@V{+Rbg*iNte*Pqp>-)6WueY{*#eU|5deXUz|fI#o|O-ZofHtcb+< zY}ozek|pxz?=CpYf;=KVm*0&R(>_fX$V}<@Q*)&!B#YKifHdA0hq)i&GgCV>X6JEy zvb?+CT~$!q=9AW5Z*qJ3ZLbXmK+{ zNyox}23}@!!RdeHwB3Ijl26?ky5c=M6Dsr45c+zNME!io8Or(zz^TO>v{J6TG@^~N zrRgiLzyF7%xYkeY!bDyI1x-HksioJTle`pYVT+pA@M=-09B#31%y{|3txwXlo%EYMMSb+Ozqy<><>MS)k*ZbF>77`UR zxa5orzrb6$7f%ptc(+Q=63$oZKMv+YR+bgU^~{@cYtk1cY!rMU_v(w;s}?iTARG6f z*NTF|b2}RgSNIbodWjG_0M`8%(DZM19%ZfEzWyYXqVgs&iFWmK#PSLA1Mo2qLXQM7 z4?PNg!m}6Dqbb_Wh86w;WHa2;G3~@3wLVok&1&m|kD6TP7C^qGM2Hc}JmmkOdE1cn zY|J=na34OH2%<}dn$iCPoG&HWB9TeDJtmo6Q1r6$G8dz=p^{WOQao%n{YpW2`H;7cB80@x#oT6)_^a4>z`t%2HE6WV;6{M3pB4lbwRIcSz+9M z)h1sw3Jv}yT~b~<=rM?v+5wiWM2(aq%i3Z7$3G10+V9x^C-J;5cDy(uNK`k~UE_06 z*F)!W0?51(e0MNx%)Ydw{6|3*o5_bo7It<1$}c=;LTxe=C&{#*%~S<%b&e*cPSm%n zF~NIW#OlkpUotGv`9vz1%$f417HT2TGdlxe#^K~&?80Ui(NM79-+`resC3*#Z?9pbw5~S_?VZ; z5XF3MbT-z>{1EZh`r!ic3dF`w4MPl*{sL4he2e-u`C_ftTJ8ge?L4@)`0w$UwlnCW z&+`@}d*yk&UN%@wj48@{sYff2TXr5UpR#X4%%nY@;bb!jl1N55y$URm|5)35Jow$^ z0cJ9q+QWTT_GI~H7c7lap!j&2vNK9HISgh#SgtcAhwYSDHWdF@k9xa@M2}YrpJmlt z=u2%!a<5#ElQ|L{XmU)ejKZC?w*6DiU9#xrEPk-&y&ZERC{oz$8+e5YyfN18EaB`f zIU&;8w7GL`o|tnUp*DrwQB0JA-5vCCbP(MSliJz4m9iYXQwqmS%)+*>Mye^Fwiho_ zMnZ0Hly|Lq_CHwuySQ%2JZTU3sK-#MjkQhiFnHL1Tp(thSb%8A;pG;`KF{iV)Izp& z|7&UAVmOv}e~^k1!b}0G5OFYFat*q)k?#43AAMi4lJ~5J`!C`7X)LZPYh-!ioK}5M zYk`_b}N7JCk3m|%uPwL z`Yt0(4WoTUUbY_KKSF+~Uk}ZKsU{$`T-58~mFSvEaa`7a$)^o3?@tlJzgyrP)kh5Y zrt#CC)J8;xe6<^eckWBw(21~3kWO>PZoT!*GTyeC6k6KPaMS*^<#yB3ju|7~)&3kk`m>ZoPYh5^A{7Zxfqe8OfV`48?t}!VfyPlMw!ARj!9Hw02kS`N8-ZU3x*u1!@HR#%i~S5!q9a!l19Y<gT9W%rr(t9hS`TpXJxj@{&}$!IBDtn<%TcZ zWp~m)chL2O#4v6<5I<^fN{G(cb*J-M>?I5jNHtByHzY~R&(!2hmIoEm#|~yVB@j4j zH3K4I>T}88dRN&S8>z{j{oEd@yr1lSK>B=nlZn>Fzi>cRiIs1Z|5sAML|=2V$&S%Y z=FoW4cV>|G8?Pf3um1+qW~=>ioAqAsw2a@PDnryqu_uMj1ROLY_Txn77iCcj13q+u z_>v5L(s$->6P@>27s$N3?;D5Lq}P#8qs7LuIPS3{v7uSWbCHC(nNo`L>NY}}x4mUC zwL&zXikfKKFo-ZxFJsSJO#SQwnw=l7d5)XD5K*|h#a2!6j9ZO#OQK4FNV{`j*K zciK09x3}KTj$EVH=AVus>g<%p@j`PB(re~MxGXKTtg0nwL~)ZIb43VEgJ*K^e_^(aW~|bfa$hQPj_Rq%|J|+8px!^zOF& zm=MmkNus{VV}I8eb$4k50c=mN(T2Qe`oBD!N63CB(*+1zzDP6~YL&XC%g~Q61m= z@?f+HDei&i-<~@9P&$yeF6p&8umay_NG((O95SO<2d3-p4OkkqQx0OWQu7xTRzpmL zqq}@#vD|=y>?g9NOYZ$lX)%OXf-zuibkFOHR8)GC_j$6!UaHW};G#ir+e-7_KXSrT z5@(>Zez}XH3j)!LDOwdE+Emh(%jwwjG2V;+kHAE{P`701I^|&~p*2#_L%q{YktP#} zw#g0QuO;97z^k6*ekzdi>5{2B0=!e!bGUVUFg`J91aM2CqNa3J-aKF{F8&g1*-2M{ zW`ACCdN(Bf;oTXcPa(wPT-0R8cO256#c>NBjui5JkjKB2W$i>s^39_!AhXd|u05-5 zjsU+sM=C0+{wi034q)-J*RD(>L3h7$K+Cxv^R}}bR9aQOkmvF^I&g{M@P`11;%WIY z{MlqJ%fywtwLm~Ob>WC&67o|2XFTqkJZGneywtV=E=(COOl?y;gMp7ewmFz9$=uJ4^t*Jei*zJU=kln4G|NdG6_o>|zs(%P!-qwIeD zkxUx?%qi*Iwq$QvjSOR$*@6M#8yEZXZrXnT0vDT!8bRlnaI)psKhLT&+uo-&Jn44D z5+Jbh7>o6sV`wcLJzA>oq6A;}Z~nV6J*9X_mDV*;)2nX(_6sTwV!MoW-hF}?UaVmk z-xtIo9tP~??NUn}tA9z|{uKeBsJ0u86I~pTGv4rPut0|M8WODocGD{i{E?%BCknB5P-4=X0=s%<#yXtx+Ly z^)?&p;Q`CM*Ahs4#>uFNFy9*V;H1`%aIOE}`srG}6PiMH37S&C-h0u(g+Nj_$k5jz0B6iD2-@gg$Uno!N=2aEC*f6*s0Tkx3H}wdibA& zc(|=8)@A}V@mW>6>-zFOEc|iC$J+phB@O`E+cHkZmMhvVSce3fLlmBGBfmlE0TX zu3rg^Etd6ZN-6ms0$Z!Pjq-~^PgVg5WhI8+D+==GH%eT?J>^k~yGYrc&>tD9GAL0F zl)yRUXB=*Cb{c-PDc0v-elN}8jt2omLcKk9VRZc0R4UI6VRj)!h+WNgoZq7#yXq~L z6EAi1vS-ZOCs4(H)rM7A--lwnj%AAdE!rixnY+zgtP}7oJoqvyvF^Ly6i>5BCkT6Z zS7^-jZ&krRkwCerdkvHJUmujd1yDA7@1TiW`f57^;eRpd|@%d!W0hml&xcc1qE1eDO$ zm5#{Wx*c?@nI|Oh;iET%LYzMnB(~*O z{G^~=;&>n>G0lsO4nJ{e-0a9tZy@kHnH>MnJXj^y6Gt6<_n}JJz ztc1*POZ4`n2Jix<^se(p#Va&-xVzZpldP@iTpa6ii&phyFP!28gpO8DcFJ}EFI=I3 zxT#HX68-ql&>MBF=&nG(7Vfglh;pdvchP}%D8jy@RcEeSTtiQckttJsWmMTX?c=!N z^=cp@@@Vw*gDs|TANf1RYgcuUHLbWG;rcIN%eWB5v;A+hIduYl`}8@jnf2o~pXKEh z(s_JtWcI?Or&Mga-xcAT+r$@`4ovx@g+I*&=H%k0mNQMkr2$7-V9WI_s>?YS`l}}~ z6T@2I=aMBp375;n9gPUWC867O2@*^Yy$@XJQv0c~J86}qUBc7S(~i<+gEksd#N&wp zo4z-v&Akwr0aY0b*B0*1eh*p)M~gc!=Fdyi7AwJaNd}SA6D+DF6TfLwzuc*8LbgGj zoEkmU!7)W~Ez5D2dh~+AfRG`tlgk#zze!~O`PU6e{OnKB+gDi~H@K_w<4xs?Nsewm z^mE%q$Dr=;uzWU>Ds)GAyu6Vxb;imxqqHLfydgEQj$@E)X(;RuAAy&+spev-2dZVo z2slq3Y-fix!8{ME^QQ0tASszm|Cw##3<+k*886C?WyFlEbdBYrHFpE)1D67mVqS4E zc5*wxP!uB+_D^3Xq>a-X>l*xn=uWlVouBR-k<7%GF23!{ZLe%zpdidA7Uu`rc$KI% z?p{?di~r2h3&$%fUuFwR%pXw;63Qg!8XKgctKg@OL%S4Otm}U@)GeD`g0_VgTzg4V zNS*A+>^eTrrA_ib z66F31vHOz+u5uQ;&{Jf{(iE2A`nhO^93oTw%s+D^npVe9YJ!0AP+B7ar4WCet(}C9gPdN*WT#Z=Qr=8g_EkgIE0kdAFN2CPpGX|z zw8ESuw0t`f5DQ~4zt`GvF5ibwUj8yM>j*A#4cSrhfOT42lUX{&ZyQ9Q zP8&iO2$4s7)`IFCO|FqSVHdv+kcYO0XmRpcbw{NO{JN{D;B3;k`6xw3!^iW<2*L4;c~iGCU~PWo-EWedcu$8Kt)QLR zaNN84=)SkQEz6q&Lk<@S1_ms~wTy)8EQNX}SbCDw!oXw{^u#E*jCL z?YWhrauQdoEvsDsQ36?wYFI|XBaOyhA)Gw4>63^zv?O1Jp6s+^4?*;$(FkZjK6=+8 zJxWNLI{j8d^$Q!Rsm|1g^*h>u1U!iFfQthKAe#SWG&$@~(L8f3S3QQja?W!%%f4Z) z_%fAnT(Y1cL>q4+O(%+^twBq5vu5C&dS_8;<)yi4vm9fG;)nw4@h{o$jf_6AI9`TY zfJR&w-@zO+h;KcoJ33QD(H^$4UCINGc*@|XA=DKZu^McVOW;ExZAqfk!@qJqdRIYL z&mQ{ncfOBe*dlhJyH^#v&1@_;jR;1Fo^ZhBEJ6p)*}8a+uo-&*YrYG`4Tm~cRvT0G zbE5h<&_qm4!>~#hhQ}{Kx$Z#M$U|<2Wb2sbDozx&sA2svvroxTe$9pe2ZderHPGf- zB}F^EDJ}BQlTxxiEU_~54tA;-ctyl|U2vqyP+HRi=kN0uV|zulC2VUk<@tj`@H#uY zqy8)aKX9XDDkXJ8AZrgqb~Ce9x>(%oj3k8E=S!BbZ1p_ntJN(L?xl_Zw4rVJq)r^N zJdhVZ;L>r0fHZf(z*?LFHGzSM4XU{6(uzZ%EW#Y!w!`G20K*8_ZGx|}bM=rLdB`#m zO?FTQkgxr+IGnB9>fNGe&e^)jzYtC;T!f*hj+w#GczJHMw5T!`T|6jf`9{$r^Nu{n zkLp1j#$(sL`p53nwB zX|8&lN1%}a_-9ha+R7*P#=nGAhC zeBR}7H2My&gHG>_<5z;<9Jh0{{JTMd#sfVftm!Z^5!oQgL(MC*TPK;<){0f4fSlXY z$io62A!^4ARe$~^laXJxCHkOmA@}!p?p9S0bY8Q19YV1sHTmmcrKVna7D+|h5 z9pTfy!_UuHE(i#`bslD)OzqcF3F&AyaGa1yZ=TVQ(z`jpJB+WrXs7X8D7w-v+gibE z2N0;0%6mtNnc-1}afd#jISH6n<$HeY6*om~C-qoc8{oIJxj%`KavK@_eFPGxa-R3K z^M@X^Wvh}iSi`N`mRHfWA3o_=A)wOlhaCEkG~+0rw>x&$X+nt_X36WsY*T8xNF7y- z4|iE!7;MriVqJH{JIv;{@Ion0MK8~JS0yz8PdAAx%FLemuLR0tsB-pv-<{wW%RY9d zQUAtD@mI6APaS`U>rLocX4oH!^F9&WKe6v=TY}IV&L)=;qMWzs%PvQD>l?gJo2_rc zXKCkHHBlBT%dq(S@2;Ak-?bX6{LmVg^?dDbqSQC)A7GtkggCW7SN#_?mh{TI&S^GD zTWguPr|x;TnHwgjPwGI$AJi%!Cy1%ZUtU0|83qxrtL z-augjubX~{`{ZFZR<9pHWYyb&>!MKgF~{1&c;PGIJxL^eq!-?5C_p;a@A(O-HlFCB zoD@4mEryQe2TdZMc|baWhyFE{T z6s~3MQJq41?`0a;`|_K237K(s>1GIAhB=wiOarV}{!TIU9bzr> zRmkY`W)OYdmq#Dx{CZ61aV}?PXGPO!i03r(6N1J(j@vn}_f*up2%#bG!6lw0qA+#+ z{wFDWyK6tl6#<{;Bo|hXZmR*eD?M(XC)r49H*wwg`3?se2rl|nLS z2*)z>oF9_&2C5NjB@XjBfb*^U-}CcaojyiA+Ly=6uh~i+C)LQ!Y`gvyKLM%5F~`4K zNdRe-7R>-TpBaA}dM^bJIJ=Z;_paGOUuF>=G&1^1ji^-wKiTsB_L*vS52^Ok6SBMo z%x8y+$CTl2d0*M37wFDzVfW@mZGms(d!>H)js2ho;nZ+IsPehK49AiFnKCc58`_5C zGNqMs9smkXnzaZnM&YKg4x{jI`?4IdAH&JR2>sj3grQK&7kxeooUy%E!fOQm*F~Z8 zKrd2^z30cM%W$?<+(@_@F;$KR`O@EeU%1IQRy@}USOJ-{jI{HZ>#?o7WxM?aR4lTu z>kh8U8rE3=TY|KX^Z#q>U0olpIoHL9Pp+kxbNi^e#o`oU|pN?(YlzVXwRyS{%6S1{{vOGg zu@~Yt?AVlt%PJIe@D>SH4Rzi^@7U^YLBN4fXEu7j-ltl8A#LT`wgm^A0phBn-d4(? zC29;G5e7O=B&z_LC=JEQ$sd!qCMqFWXE_%rUay)$?5ryGOHna}fBaO}1L+V$Gdn7z zfh|%J%}BEU-xbK{y=$$w*Iv8}K+{WBl3;qpx%i)4dAalTEON0L-Fv~mYd3U=gc7Y( z2i>WJsX8Bl>|z!!nHA&7-hiN58>;5%g>|I5XE>!HhSwAB8;wvt&p#)Fp^z!tVzU#& zvJl6c-CW6Q<@R}K3!x5S+i;rdj71y0`LjXtmzHeZbAq!r-u6#dOmNZN$E55BY%d$L zSxd@UZGye;oons~>e<=c1Yg8c=2z73oSj405;8-)=4xD5Cs3;EFu=yd*ZSvl0vw;-bFsA0SlLy1G8FCN{j zvdO4xJ`B8SB4N_oQ;jRQLw&HKAzQxN{b4vhHFYbfID`7TJVk))YjqSvhRr`w5BY|3 zMQA;p0r!|WzCG!>Gu)l1l+wNU{`G=w0F&_k?e0ngvo$d#=J3j9D#nJd%De!1j}!9W z^TixFW3- zG1LF&<(K6BWnRw9R?I3aLwnm-w~ZF;88w^Kw^o1Vzczr!Ak4gv{dRu&Y_Xu5EIYg| zR}M~*Gv1rk^XS|)dl>gLahXiJ|4Mpm5H|QIOTwN>jlN@6BceqoKlD>Iqon zm*bNWguWB$M~|ab0FNR2*Dagl<0p#_7wi<1v^_8C7{r(;!=o18m$PX<7;P2dacy9t z470h9I5X;vHCvIp(mM>{0XmRuSx)paf3P2<*Y+rlA9(SuN0!2_$?H2hCZoZKUlQ#pGj_vcQQheng?_)G>$YTk*{fVV8d2HZNF<~9({6kc5WWx_Dmv8Iw1eU z(b)hE`Hx1#$E<)>F4=gHK(4U-+v)N*DG-q%lj=lLYz@tn-E=Gf>ve?hls9a9e*Hpi z8AW;Xt(-ISJ}wx!-P&=s(sC)PPj{w26s{&KWW(WqN~{5!(rfp3ie*d?yy@pkgVC{Y zaQQ{QA(&^lSMZu|&lGs;J-PB?EQdKk6HM&*Bpy=uvt(4zTEW(1U|hf{|=m<{2c-k z-+3ZA+u(CFvd-P%vQMpQ?O*qL{hpMX6mP7mTU~wiUm776(4_wrmcxR=-z;VnFjx(= zF`bCNv?4E+AxOz{qA+#GBj`KS*$uwqXTmys!;ew9pr@JT06XR%`E>zuH5K5+xV&hm zRieQQy}zt5E!&l&k;={@pwr>~Am_dR7j4g(3$)6_35B$n#>h#2gsU>(*7KE3{CjUl z!k<;&NyvX`QA4`SAqUsJ_^2Ciq1jYSh0E|Z!dW%{$dNuVkpHhhdrAV72%%?8LS{Hv zg&$dRq>|<~O6g6XS)5pCpWD*hyZtpZO@%tYk5nDw_-CToizSnQTl)db1sRrQ0%av6 zrWEEDzpElU0WZAm*UvXLMs{1%M)!$KH=7<3zaKlHs1RI&_!m+f4ASMey|jP(;1nB= zeo(l*PIN!X4w{4N+2u@46?zdi&ri6Z%q=c9C24EN;%{95%{Ic6i$=-l|-o7+ikN^=#iK11I%JAdC_8S#iIka!NUndY)Im&=*$kJ5j) z2<{~C)Y#IjfQ&i+j2g^78kZv71p!fdWIC8mEraNc^jWMIP z8E_-~hp@~%`(I<~;wkd&66O<1KuG-Y?R7f1*o5yXWDAqQA*d+obRFv76W&fyexHa1 zJ>4c!U~*g#?FB_5d#Sa7BC-E%Z!a2yt8e15r`2*VnY6X|wZNrsrWUzsA~)8X@R3v0yCJmLO$Q=I!w*t3Bgk+R2Wvs22- zU||lUdvQ-_fmmPOyk?3FJ{{>A5Izy8{zfaJXpKyZ_Vx(_YMa)(>oI>RJ0Sq$oO5pR z9qXRw_34w_oH7!DEY7we&YNwWut+>#1(%|sC0tLRZhnexxAx?|t!zWAA(v&mhR?5V#8?UjxU?pE^k=(6 z6g&DZ;M)`sKzFFjn>I~a8Y6F-uElrRT@$?4ag=zqB~UT5r%ND z(V1p{(elkgXy9rxx~(GA_uy*cvy3WPC-H^uomIuFwzH6$u*xjQb`R6e-5Ra%bD@2+ zamd=D51Crh8dO)t@+e`CoMDf4yyzAS>z%nPl-E`0qRpYO*oPB7S?;=9nJoM?`u7UW z=6DAZpx6S`U!}MSq3wHsLy~`~+#C>z1EDFu!xz(Yb6Z$uy(rwy=y6iaCgF%K;|hgc zZHzI<9zw3i4p}@)D&(R@9=fr5Qt*AzSn3!2NkUz8_$an5Rr%joHEv;Pj{k8ue8x!W zz^H0?>APB|$EH1NAa#UaoJVQl%J4v`nW5abYQnl=2#pU+MyK;<3Ya!sf57zICi76& z&vd#lyqm)ZT7ywIlr3UHUIBt**qoVq@VBP8c9tHaa1SO$ECQ2Ds+=ADNNqmm z2{y2~X!t9&z`0~_5wc8x>eLhA;#Y|5NJ7~!@Gb(ZU;}-8Z-*Nab#bd4v;NCfV~Xf! z`@RRqRoCA|kYtG(-Fx5<)R7g~1mg}r+$zKxSoLkeJ`a?`7G3=%x8ZB+u(`D9=_%Y^ zmyHkwf`zQ53F-+uh$19{OWOiNb>RJzTE`zpGj+uSpVw5Nk&L3*oikbS7etWS(Hj$9 zS=$vm7s*m;q+g%+>yB#ANRvn^unJmDuU}3oFFCHMWkxHDX=|QAo`z|mn%af#{ML{9 zxbIh$D1o&ww?`Z{UzJ9K&YxcBm_xto@}c{RfWBq%f?wi?V-NnYxN-zYsIGfD847a& z(ssSBh-ao^b|)XUSywvGE=hfSw)G!2=JVnwZ#M$DzoG4T5Q?zP8EbCF2*#$$MN63+ zz9(@TKKyGAh;)?nX~t7?oOY3$*>6ke{|Uc!_+u{plJ)GrAqkaqGP{-*w5=?H-PHH9rm6W%G};y>J4Q!Uxre}LhWy?EoIFXAjm{8z?5>5ktue3+H zQMHZeQuvbIL8-GdemLU~KppqTIi^B3M+109O|3@NS%CkhGZa$n)<9MvT>L%YJKN4b z(d$Se>Ec4b#2xIRcUgf!T^uW?5Z8CM?OYqD3OL1N)J6h4{koA>kMesL`@F>JNT1*N zhn{AaCoNE)L&fU~nkzGEzsi>r39e=nC~@!hL8*NHLQAQ~_x%WZ2y;w(y)a_u zIjxId-CB&B)cV1Y}6Ska3E{+{x`oi8PUpC3+4dgwfSV7_tvqw zU1-0-nV!5U_6LDyf-CF^*1?kaIME-16r=6ElH2;-i}_BxX>V&!1GjNJ-ZX~kYZyMO z=$L5N+TJ|f%98tQWyZFs4Uv%l)6Geu#>VF6ruL=X@WXP&`o$yQf-w5&+p-#{bbLM!q>z<9}o`pIyLRS~ZH( zP&F8FQm>(T^(#(?tD+TfA$JthxKccF3|0`b@(eV6ZI=| zotsk9Tn#`j!yhNVS0-`p*GsDSKqt&XGKiY8Cqfdqq;^=`0<=BuIsFXW2e6FT3++Ic zBH$@b3iS?5w1$rDx0v^DorPz1@1+>Jz}NloU0q#=${3(ec76O1Sb%=N0bhc^gOOub z(iA(`6b1j=!^9`m6x_6Dci)ZC@VE7(zq`5Z3X+N~3)FJXvp}L5RmRcV)g6!SK8H;7 z+22`u*b&@L&*`blFn=lFIR_nyQ`(&j+k5P{g{W}~T$*{T)gN1E*5MH~=L>dKVvK;N z`>&YR1WItm#kPGnd`iC@{v;Y3uX|QOLs&^i2`j1LU%z#H|LI(Hz!-DvSvUdAz4M;N zh1P(sT zt4La_=KIepN2PDzahip+xJc{BT&&!ALk^Z;Jq47Bm-HSL5KXY=r zvM_+%y{lzyfYX6VZn9KaM)wu9JvNoiG+by~2Rs9PQ3F|V7>J+EQ?{Sbdn*#1-WzIj zrx~87++W{RQ>C4QfEBSe@;=%q9cPj)#;>onA?g(Ki= zoC)Tq3715>kOcqoTf447()3d~g+h8^?!+f`Jjxh`u$-hPrp%TFwRaCVk0f>VFWki# zOtQg`F$ew*;mU-g>aERX+;YPgxHKAM=Z zB$t{S%NiMJ0lWG_51cXf9D7g1Ep|Yc_DuP2T`4(?-mImkE?xjbP(P=q-eJGS?|z(p z=LJde1fw|xINX#x$j6k|eXEWcmbfE)p9I2Q8vrIync3!_0 zH1C3@OrC*+r^L3yL9aJ7E@@=yr(Uy|7GcC%Pq^tT7j(ZO3XDbs0I$jS${I0o`we4T zg!t^ysw6H8-B&#;U88_e8~S}`RPZ)ch;(c z5#p6F`Pr*ajN#|cDc*hQ^R)G4{dc|6;`(o3wvXIxNXT0l0obDWZ( zdvjej6%7CruHYHfUp>6jz1Md4|5Nuj!Wx!oxqZsyzw?ksZ-0L)Wb|e(OEnI4B5&bC zC1rj-!Ac8*~ua(##$qw0@lr<4^b+j?d4lE?@Uiv52MT z=4v;dyn=NM^d6gZHLcv4)P@c8%p$#@*+gn5eg| zN`pGFu4BT~ot1%Rl2eAYDL8o#TxJXaTLw;h^hgGKo_0yP!WxIk)kCdTQ$`Y+=h5;B z=#nwIeALu4=?lZ}yNsW0sfU z^2wlJ9BF@q&MNY?rk!|Dk%0`ky7Z3bVV`@sYO>l92vYC;?!KFb^r7r`$tcK#ugK3P z+trFzHx+$vcVpow?7@?Ly}T#2by$F9ZmHQ3&e%P=HoA&@Y}9YR+>z!x0+PEv9sv|D zW8eyIO)xRP!}EjjfzsKPm z>-&Egw;;Bk^A3!1^bYEjm*48J;L9N8#a;axyGGP7j)_F^Ciwl0$jXHT^{D4f!P`IE z%Hwnh|MNeZ(!_KSEH8VEG3Iw$nTbW9=JC)IJ%j*#xJJ@VY0203N4_q`G7?4wT&4ew zE-iPXrVqypPc9d^6-hQhTkK3Ua*59zX+ zl1%Q9cdX3CvGViw)=LJpQXW^u=fN~JvZ^nxaaT(=lb8R2O9;Z3g~B&Jqj2(=k%RTj%B}f zz@4zUQB8f_>QZWaVcib?f0DMfr{QuVJm7B){IaGky5ic}hhC0e6)j$zul~eM`57vr z>kjAALvKo^6JzNdOeDlf3BY4#&W)w3WVCEx9kFE4F_$z>WcQ07pq_gQqk zzF79=^Em?h8}v?2XT3+CcL~S|+G0a4qpRqli zTrjb+a)(b5-Hv><(C^){Q+rVdOJRGx1WvBs4a81;kv7m437IE0b=fH>;i=DDhtP#b zU{;Ixd31;gJA6Ug+yk#-Qug~(4 zhOte?E#@qS2rc_x$6qWqDQ2xr=y4+e`S(&qEXGqGO)Nuk^AU9*zL4u6>nYxI8>qY+ z(AC%h`Z?cZ-)f6M?kCq}XBFqUPk2_BEc*eqjlq9b*!EAeUmO1d`&#yrD`#pU2xJ|` z!QzV7i@X%Bhkf23!HcJoYTrDDV30p_WDC?rF5kv=U40yTUFXhmY7ElFmb&-nS}`FM zADwIis6*|#^mDrnWbh#$cTFtDYX3F1*@x=#4>(rXdq5cZ`HvodoNkD$%}elhBJpww zsPk()td>x3ll}9Or=(bv;tSh{qoE&*>DE^7{h$8@zvii@p8lYXw{iLghaIcQa(?oK z^V6ftb|mA(HrPID4(dJdajM-F*!!_dfY)B20rhc?mg&X$ogp1R2U9y^)0p9j@NFK9 ziJ>>R3~KZQ+EEiyYP+E-Q6EsR?FStXmn(= zACl0(QpUpMmNe`dUcT3f>nb?_@=xoO^uj!gh6ldqoyfg_I<^A!I^lW6SYIgGZ!~XKK=Cc_;NZ;WVKs_Po@L;jEz59cU-tb>o@SViz z-b@65f}_pLWd`8`WgGDnq!D7x#a{&4cB-ocvWp2q*qMjghv0o#IUWs$JA3C|u*pUD z#grX7w6K5k+E-Sy!?VM|n5Z;jQNUhI@~sW=9UB&49#h0|GwFAB=u;AxuBTWwUB4rb zxR2OvCjB7CHvD#5P(8~d2Q(#+Jo;bHT_EeqCuQzC+rsBYQFgKYag(E*Mi~ou!OJ=j zpv*o2I@YM$l50_^&3FCOw!gX!&=)agtU02#``xy&3zB~jizwkM?6tkohL8!S?PGWM zg-_}I7X3B}sMFSd0<`l!R!_2(Um@4m#%1;F3y25hvDQ?^!G33ZIcHhWi_?64yW3dz z1A`q>wt;UcOMux{ed`?M zFbmRa#%Fbl1$2-#HqG3~QTSO$1mHt{z8S0LmvhvcY=D*UXp_4gc8<%|eZp#u1*i?> zkI$j2I>@#npc1rYg69S02IS&df6))VV-Z|AL3Op|m$t^1<%&hx?J<~l@6!gs_qKH( zk?qjoH2{m{#on2--?w+}!VeC|lb;+Ivz7#t$2TRL10I&rA$wZ+AD${lziZ< zn(0ukfczRwt}T3gsVx}@@M}E8m!Q+1{kMPCr^y$~)z+dq{hZ-oaNg|J2h!n_ zLb=*?c+l9|+B$yvO>g^iqtWEUcJecgE|LI&aW6=o^{9KG-USh)IVi(clK|}7eihsz zY(sy2!U3cMk4G<$PfvQ)a#_La(4j+v#C+(yn&9wBz1^*o+Gxh&XLxCt`~j z^Oo}{{G$~{5og3OcIDk9DjJM`3{JZ|}xo}jk;Qq~KAMV9-|_8dz9Px~VKGfBIxwvX3{#hh4_qFwpZM*f{R z$&OMa)O9QTbhk0Oj=kFB5ZZn=)ftE2GQ>s4(AR>LbRo58bH2yb&I3FC^Q!7yy8QUT zGw=NL|NHs#=dTv~4u;c{<2T>B{^B30PEX%tdv^U``A)BSJPlK-*0{@Y&B*$G?Cyd! zy@WPj?M;14*0!k!pUz={HiXROCBM}$W7BY1ou`afcVE2N&xST&!Ytrm8hXj2-?BqK7E#XnT%3=t6DQ-o&&yB4?d zpL9WOPo6A!B_;u^OZWli&fBfV$%QZfMJCiX$_W=>XZN51=}H#wQ<;PeO`n)MMLn-7H;K z5Pwst@n``m+r^FBdjCMB#wKJRyg>X^I{lSxDmQ~(FJ;c_KqWl&K^;(U>w$WEk`0i) zNIJPKJ>YWlr8<5&=2aC7Qt`#->-)3~_aVMtQtq6>WIO4v*%_#7oFI=;Wv2SriYFb{ z_8&4Zot1y#dF=CL@9DR^?f+?h|J`Ub>VBQJ!1md&n$O;OdV2Jx#j={%5io90*`0A9 zT4*1iO^~eCxreThZ8*k4J~sq(YTpIzHdymx@gksmH^1;aw%B}g89bMUzBj_I?E{-W zUvE-aKCQcBSnS^>KeDUu@MHB&`vA(@DW2*ztQt9}$n>2oveVNA+#mt!zQSD+#n#q#@8IV3cV55x!dD(19_~4_Lx(pw zKJ?Qc_{zy(@v|(BCfvBx@t9)HOAA+zFW#Lga9xY9!4N(4&E9VYEWRxcJ#VDN2yPIF z*YF#@kpXzrrQ7CHhFu`b+hz8l{E%%yZd0Y5Z2@(Wav;dMeCGhjGOuTyl9OV8Xn{!k zA#4CVp6+Bnf>_jx{sq<1jRmE3AAo)!c;d?g=IcIKu+!L@{oJPZcr`BS{!|?zbjz4T z?$_io9yhP;G>%*cZ8@d-mro)4fZ9MVe_01J^J>1D{l(;+*LA(u(QR8r*>H3l7(s7=3 zYbriIlNvAjcMa3eeNk_>8Ml09-*@z7FXI`L@1W`NG``1MH9vi`={#a0enH~yJE=p5 z4i63Z)X?tUxu04smdB&Ph()Q@!mhf*^8FQM-sZti3Lx}7{H;-6mrX|gAV-B>$`_@s zHZb$r56HTt4(Y2O$=1oPVP0Vjrng+!G;Xn4RP(1M!@(Dwo}PBU(Dx}Kj%J5f3;pfA z^FM48+f&YSpc3SIhWI(az$PDnrUH#p@4ka*$Haq@@6BFgu% zcq?wYSeP;;Z*#-9y|q1h{@D+HwN2HYG`sG6>+pug?OXfr8uh9_Fdh!hbNwx$;&G(~ z27SDPr=px+$m7)bdeV^_0$&8i#@c=(P3)F9wLi3K`;2yu09i+MO6j&s(3UesO7WFH zlr!LEeV&w2y-o6gEu*3CFg`pe>q0pQYThYk-d9)0S~-#nU3kL{{j zSy0=3aBuEm-XB!{VFCm5VEs6Z-(MEcCNGdX$q{+}MyUrU0CGqIrha$E9j7dI_Y&-Myf%BJ4<1OAH$2ISn#VNV@*(qn>dR$d4GDEo5x%<;kg z*Bl%ibf3TN@P@|z^($Z1TO7Z6Jh00q7gBrGu|te=0VF`n;zGn|xtJQyB8s3Q2tBs2 z?c4pFMQ!L{YjD2l5yNeSY&|akjU)POF3RG2tha2koVqUH8CeHp-@e#Wkojr@+B}ts zZ#dG+a@hd!f$EglYca%m^$k%>Y?QVlziAS~HW^V`i!%FU|K{=fF|?+1G&bc@>Y)Q~ zxHfre``Wa>#n;ny5aSBJk&pQ}*_y5qb#!C{G1&v~CCj>!3DOZ{C&+KsS@*^H&3mF8 zgE$U;JWTG_C4V)3Gll*7Sj@YXu`faHTXuOY;$;GHO>EkfTJZ7#)jS&3r@iQka#4Oo za5Nmd?(Fom_tcx-{C&sAC;y@Q!t*=6vd7JJT0fO~+dW z`S@i>#SK$EgX6;=*yJbc%THS`x2dbGvh4$8Jx6M1eRy>)N;;}TJ}!%J$w03A4x_MA zHo+)G;jP=)7*acrTP4&UYn#Yd{*iJ&jN&Wbz?UR)D)8+wk`K)(8=q!nw&?K2D1P8e z2WRZFWwl&c_tt~w5ESOd_f+W09XfP)=rNscKX>;0r5~^6vw3gWziK&Uwp#jk%FTxZ zo7pNScut8tkn@MjORgbPN(V5v!VZ0i001{FMO*!&+lI9t`;3$HQ4>>;dFcV$f}&`ex7s2$2E2x3K9hfKrgq299+~T zhb?{h>PI{%_f0zje0>6866brp_(GQr2zkIJ=RHe0!-HGbzj}Ln`&?mn=Bm zEdVdaImq>lO>+4KZ5#2kPP-0R3{f4Zu0@$P$p>}dInqdz6_D$)p-r8AqI&Sd7j;DA-L7Revfqp3H}r^=V6{ zQr8;l(&d^)&fnzIeWhIIJo5pMxn*1{n(+YgN7(w)#jQ3&ph;iblnXJ!0OT$m_!KJ z#iSxutG$2IUsQ{0RwJ9lfI4(|gW;$C(~tbGi|XV(77|0k0*b{bi!TccUc`(=mtB#I zoW%xf3|Ita5^pbmv>Bc$xVh;wVFyi|M;Z0aXA49PT9kao2aT7OlCEpfM$BsoHweh9xgm9pKSscnx zze4CYP+yx$5n!D7k-xP?Db8DS>o?veM<@5YsZZ&M=tlJn+UnQ-HD%h)urWROyvpPi zK36LEK7lQ|v0%l%@Ac;Mh4sy~ZrrOX+sDIE_2##}^S>XCCg0ONEwv8YcO%=KpSN7h z-(~fwP2_Et+Bw3~I{&O;N0Q^~@O_;q!^BRXDBAwyqwNp*CjWUHoBV)Hw&FRZTr3{Q z{_6A3h*%{bAaPZzn3d}R=RxGNVvkSNLEX1eTo=lsk=Gj%RL?RIekpxi9tS?Mnxw}- zrN<&tl#!oQhF+j<+n@T7oDv(aTd#H9*;WYt^;hCk7e|=J| zo?TVTbA#ddit+5i+Ot?*5$j9d#3klEZ}_kE@e$t06YF`#@`CY{`^clrHIz^4xqyK- z1mHsexk!B382q~AJf?&Jj7WqwS6G-+hB)}q(P(s9Y&v`rXs(hSUKLny{M5;8{%@+P zIw>4G&!fgk?8w351z4-jE-`k$NXE^AO{p#gW5I4O&yAJd5rj?OJsV_JYLng4G z;^Tf)E#~Ydcr+Y&OnKbm!SqCm<&fvedmwx^kbdT8e}d}m5@;;C$pLM9ARZU>JSJWI z^8`YsYUjxTZOk*zOSfzKpbTH3LoQM~eDYBdfBMDsf&2FSYktavC;RXnPGP(nwx6XV z-;^QH+eVI7bTWdEXWeD4EZF|GCLSLkp~_*Du9 zZQHND-;C&%NVMy9Z$6*fd1VZX-`V`6_tv+){U^3|_WsV9GiPqv_^|F!VEgOI)8m6L zo1Gr*`A)PQ?2GZN@UgINyNi8p$D`hF)KjwtyiI%{S(|{)nfAGJFSKm|Jhiibm2IF~ z`zdW8KiM}>TP4>6JxSzgoh3ZCv#Q6c@$S+$C~myJJVvVRF({vBNJqA6+n~JdKbUSJ zc-SL{a?AqBAwhiwzsx^PUAB_rL$<~P#8=Ed8Kg$pe?4UcS$H%?AYkIiowbohkPTp>EVD&U>fx4h%M ze`YWoy~H>B`=r=TX9Z3UhFrEGz5*==oS+*Z5P{yUYzpsd|2LN2SJ|;W@|b zls}N8lJ(S2$bxcT(xsjAROmIfs%so-Q>yOcFn6@G57pbhj))bLA$@_n^s`S8d3RkV zc^va*I{|fk33=Zk!v=!qPt7IY(gE5ZknB}5CW!L~#5m+5wl~{o44X(g8S)i=gS03W z3xXyyo-g{KYiD}BaFp!T-sHax`OdazvEUIOfwekq<9olf*atPw?2UYER$7J9L}eUh z3@jk?h3CDYZNJ%{&Q5!8e#_f`^zH9{=hr>)#FIZ`V{J~94vwS4gU{c;apj9_e{NgO z^IdK`vP|zO+Q+vXx{u?ygZdb4z}?PG>2I=Y^JwEI+X2oKwUNJEoCxB{Z@cXaQHkg0 zu9dueSNY;p`0+heARETfAo`ZCOdk*AQv}ww+g>ZWEB-@cy+7G;+v!kv%bm;IJ!nsE-{=cW&dmmWNt4saW@;ph+Qrv*4f?bnW zaUJ#)!xKq;%OjL-8*>Y;B+XZ2D6a_2H9UV9pL`*5rv=p8Z6V2+y<1(pNIr~S!P|W?T!%Ld zUV8DluR1+Gc(X;@fCmQs2HfwInQU8(_{V{!5r;A1wj1Oo7EQx+)^Aqq&!Je1IAsDK za*NzhxC?R&tCVjb9)Kr($;AV0S-h*Y&eyo41Ds!OQ~+%j3^J6p3l8L8jgKl zYMa!1`@7%wXNRNR|1cVjDp&4M!}jG?Z&iK%$>FWX>==;)*`b_R90U7{ipe+;{81S8 zHnvgU3`C+ZHCSPeqi(4A8<1VAj=l)2$4sN6eu3(0XSDmz?M*iF%_d}-bY)M;qNwUB zWh0(DvU8Sw;x{ryCu*4*SW&l^veKVBQ=SIFB6gRnsyhA!=J|r@Hyw27(BU-!yKdeXOtyY-QOzH>>&4K*er~Cv zvdCsK#zzVKsVSQ?^_e#j`}}YMJkJ+gKnln^%2y#@&*98LRL`XAzmVHm&%3hJ!;H@7 z5=Pv)$KCsCSj|sAYdY$GQMWMl$)ii+4*@L5PM6jE5u3aZ;>%T=;80*>h*z%FYdX}$ z2h?*LNME|^6Nk`M9i4b*yP32DmFQ#{NyCziCx?;W27< zSvT&`;dPF~gWGTKFXvxsak4Y8I3SiRXzY(KKPSGpskRvMi=|yehk21;Jr)Cszlcc) zxK6nUQzsT>qu9)l&#VKot?KH-`Bv&eFIymeubW){D8t8k?vM}3S-4OhsTVJ-?u!O# zJK+KB+kA~ie0U(Y+VsEB1$# zrC;Zz{i3l^W{=r_yMKp?rBeGaH79&oKfVlNC3W{#Wbm9k2Ft!Fd~B$ip0Ufgj24UX z5xx=U%Bo-4F@N)0-u{oOW&fW{r(4G{k`5VFRXuZhc>Ddf@3!o&!uIpZrUy$t$;XLR zA5=dk4g8ZCnb(rnSUWG`n0YlHx4YT4k#*a4_)}lGZ1e8rL%0`@GRO5=U%XoVMbvYrBEDM$RG1Bao2WdS(4h7PFJjpN>aQnqBu0#wUT8fp>USF&d4ZpDz|aU}yVjeZmtQ_EL~! z0;(fdKuHF~YnRedpb@mN)JBf3^a=P)KrWj*bWG;`;Kx7iz)JUs3F_ebl^1{Aaz1~b z)%mPahYqi6eCQ{B^siN?$M5ndk6CoGc<{NpUo=bXrI_<4OFVR5$froTNB+2Buu3hz7ux-*)J=)}f~YsS2Q>Q4wn$D1sApn7w)Iqp zfEJIGy9AfpALCO#lT9u)e%13n;&=+u)8ZANjV_Q~egX@~uk15Vzal6;_V7X2H~Urg z?f%3IAM6Jg8&5eLeVEO*pd0!P+U+*zBWT&HtP_YgU0B$mPiC1Wv||?I%8+mI+kMG* z)Ysd3Q^(t7fhpR>54t`8V^H_9C=ip>0oA2H*690A`;SE_#p7%~>s@~IiD%#Ovp)TQ zxp3ja$BZZI4h`&tTfF!1_Vu?}Wn_D(JTK+PV(q}{I9pi|RcCI1MEUrG=pZ23J={2u zL-LdT37dGb6Rjcn6Ye&a%-iV8a5p~4IfFi;pCY6z`vke?@dWwIwrX!A6Z@i6xz^PB zE!!AF*a%s!@oMb&lrC+R(gD=nZ?IVuV_~Ylsw~5-mT$9p<=7QFbm;I}0#6)$WPA7A zi`9HiCa{SDAC~Vi$%^Q=1}Vm?Xe81by4G+7avW(cuG?jjWAHpfPT^&`nm5T0Aio4Z zpqzDQ={k}0{7-Y4)oL+6{_Npk^%*u_=AX>+0(5}%)DOrDZ}J5w+E;#%a>A0%9n5d&y5=qYl_%=$67lg&OYb-nBBuCF5F=W zlgaqv)fb-r_LJkIyUatl46!L`W6w@1r(frH>FKDO;l<=^^psMJlX|SI&=Y+XAH9rK zb?HcdNhaBYE}rDtG<*&~%XUF6o6J+^o^eyyDK1Ua?aD|~52!Ah^12V`5i9sh{ZhXn z$(lBZUCU(hN0tTEozEOH%_FmY06pHAF}@o`hOf@Igy_5)PAB8Hj>qFQSLo28!|jD$ z@9ELz*}u2GzIJIgpU!<=G@sdhVQy2A-fZBv2#byG@C~>pJ1kW2rjdsOHi=58Q4CS6 zA-3q=9TkTyCUQqC5Nelbe4|F&af*}F4yZa1O&d-DEk>4Q$+Z~C4ydx6nnXDk(y3l17FfXX zUC(@%xf35%+1OaG#?upvHIsMR1fu(C-wv;8yzuO2ziWLsI=41jvl|r@^92jJ_=qOp zPL*HTi!v`O)I231f6F&g*~=RVlFzyz+sQK7Cbj@H<++@JEc)oeYg%gB0%`-eoYmED z%HosayPTpg>QlpO>h{0TntrKGAxqqg`GUKUHDame%~%Ya-4KH>2;n@x-i$+LN3 z%q5!iNOA16t0&>2ELq8C==!#8g|4nc=)k9bTA8YHj@>xU2aSB_v;hy9ReW`?~pZX25t#%G1C%YM5=dbWc-fwG<$!na8Mla{S5oJ8TPqh>MBS*5>Ws=Os zl%F%RF_}!OC*Jz*4{Yz8{m{n7#-Y)}c!wo0LAR^SM=}^_Ho>qnWhc;2EElIBs;49K z-GD(fzb1tSpo^Ewr$M@HyKTK}OSyF9f0-_xkoB`HIF0UhR`{W8>*+moY8pDJEaWnv z&%!F*45ycVNG8is_LydqJr7gfpO_1}k0zO{t1|tM$WQA1T7#_-Ow- z?5=l@(Yl!Q64Bh5I(%8dPiDU6wXgdJ{lRFLcbOUBOrDwC<2V}hawgRUIp`{cTq7F} z9cA=nKTjHz0CYVSC5SJlhR37W*oj}|3c0~>WNGNZWNkF^@0}X1ZG6xs^WFDxba>U` z7eD&5e`$8I|NCs=upJw?<`8~=iiGdTpLhgV{^GKYSol>*@^>89Q*SLA2AlhvJ zO>L_!K^t1)3+$!n@pI&J0@673k`v*1Vn!zKFkMP;`u>06#Hnn@$uzKTL-umCzxqjZ-Ym9WL zVdrgdbh!UD$4C3`u&X=rhj-HTwSPW{p*7bmpmTp3GGF%EI@wpjQriit-;A#QiI#1h zX15LGlq5?|Kif7W2aFnd;foHkymBumnN>h0wh)$s3H|DGPQY`UR}d|jv-x+18cneWAVWNn4s#_CbM!_IP!}!d z5wE>!@rX8=sxB(1&PfogrFkT{-XSW@`tk~bZ_6@_qa1&?o#bX)# z#U~tcC_&C6$5{n*atd0|H9-hkGg*-wP@TjE6~GZq(sfDFi!Tu7m#!=@3@redEPVfk zKBEl>qw49;{Oa%O&1Y|!cHcAA;Z=zJz3Xq>ULX8{wbAfi^B2E&F-NDsjnaWn88NE( z7k*;=@)PvHzugtT^Ex-axG9D_y5YYn1LbXGx-YO(UA`-*th_Cob9gr^ldD`Gdx2zm znuapT<4TL(-1Gy`uxYK7ypfTerFP5lw&NT+p&x)I=qV=ePdeX%Y=%zsg`(`{KIix- z8@a9AFX@uhrhj~;$jc51z4kGYFZT_drakC@s>*`;oaxeQqph2P4z?CNC1v-r`8+-X z2c7+>Y!Mo^l+*`DX+!qd?Q$C>X}+3K%No>2vaBZ^mDwb7n*XsW)$sTNd%I7$4-Q8| z_hGvpvv2sO-}=|a|Ol>d2-;WmZ&{`|~^yZ*hc6%WkMk9p&fA38Aa=N>T+_n$BLK`q6J zh#?U-NF^Fol!yy#IzbnZ7o@8>H^63w>ck?&qeAQX8*J7|Td#{`Etek5CmYkF-9Ngw zzkd!+hg(N;wK{y+v9*2X$85@W%?7slUQBjuI^;Y}epCk8!Nh9=x{?r1>K<+>WUz%@ zIjZEO>zic=8`Q4)L|ruU(4kJw$5z<6?)%c305G3TFTC)~lYe4wZ?ALM4zDVF;^QCx z&o6)OQ~z>yeEdcm^L9%u6LRwj+sd^AtNoksLO#uXrPxY-c)vuDp?J;v%`qfUc{Wc{(QS zV}so1J|(H$rj5qF@+b$7K7`)#53tC-%cQ4vWLHUcm+8?@%Hk=PT@tz~lR(>^%6UO5 z$QB5m7i$~2tyK^mdEF1l`Cch~**Q;wL5ow+oCmc*u9WMb?i=SiE?e-+CRMv%($y1e zIf)m1tCtjezR+FH8$!nInH@H!coL9fnT(ICH@^98KX(4&UH@czd;7Wzbyx{Ik+aF< z_@bS}kzFXR760w!gTOBwB%Ny^*LA%z+I6g+24wZbob+Tf+flh~3%d6@(Nz{b^FX_v zk=xF8R<*+z&9s~&--cQB-J70`XCx($-!I=QtX$4X8`*X(k4@_K5>NdlJ`g*bHyuhW zMGhIGAg7e$iHaQy}K=iP=^j3ZaeIp zIrjsbJLiAZ)`@+>K)>(bA3j+07L&oS&vV#|;lO{|btw*cj37REj6llb3#D>DC*CLl z#Te@K9JR;^l2H!Cx7?-=rfZXgqU!SmLaULX_U7~1{afp!H%+JAm!Q8C#0N-#xOejD*woxaJ6?V-7T+gUC{XYr zTAev}p?dRM-}PTlr?V&R94=qz4jH|}{oU`J93DPlCwRaKEZ3vCf>zfU%2-7Ms7gKO zq_&Rek^@;*@|iER7z##xN(WUtr+tL$ev@!QCBm$#SN5H06|WUXMeroRDb!GlJ^ z7j=(m?30$^^g2a-9zGJhx($QXjY5H-$76B+Mr7Cys7y`_^7~sU1NB8;9YIR89(8|e zADaE6?DSrLF+DlFyWfwG=5*-L;r7I!Ke%@G{JsBbFkJhLMVsU4Y(B9lGqXrBSoja+ zlH#7MI3W-xB3{@$j(L|QHn0g(4X?>bis#To&vhY}f$ApJvzX{lPsP_m&^PwfdW+d~ z^7_$W@%6{YCmSx@;g--`(GFjBm_r<2xc9;D9jvWAAKx=&Q{v(r%aiWYokmV2K$ioa zh9zD5bH_43*W@7E$aL{CL@Q=3cnsaHQ7q{6tI@_ai*Y~_jq3WhS!45O*AUVQ>SP*RK4+Q!uVYF)7X$|{8Bt}>TQS* zBv0OsDZ8b|xKgl^~*i*ue zY@vos$ngky{Q4Rb4%ty(m4kR9Xj){V55RTJwrG&Oy%Jx|g3B~=&2jjpFLpw=xn{Bt z=!0yCmu0d|L9#+FgUlyy_YJh|lap@Pl(J(*ghem~$qCp|8vvec3vAL!$D~at_-Z5D z%(mM!&-t@lDfKhuKRgm&ifVhOXmJ-rRD3}hOSo|?QwxznE2%^(^l$XPHx2=#}{AfLHjC z%u6ahZ$pKJA)8aa31_DPtNKWPAOEttNVJq9t_7niJlLFBN z1q0PU=-FIo*!M}k|6-M4|N510IX>L~%I+tAJG>h3vmgG@f4-O={>Js;V8aHzQNkDS z5#2NaxqsZj6ZC=qNWjAU0tx@F21znW3_H1A@FPc$h$x=o`=9*~!J+{-nJvUt{#m+K8Gf|!9a zNxvM(24wKn7biPS$BSJyJk%ecg<3u*AZ!#P1=M3q+_*>+D9g4Vuhqqep4%o@n^_J} z){_iTj%h;H2eRSGc<{L{=4k zVkmKH<557)_veNB`Y|X9@_1Q=RlK&H7y}J0+f==cB{@s=m`k$K%lc|d`oUZ7BedLp z8>?tQwn3I@)9R1G*b6wF3k1zF$?;z@F7I^H<-e7AfWgZaFYKSu!e5Ju%g7c!<@TXj zU2#SH9N)wP{svD%(+}@xl#Mo@%`Q$)j=%Z%_-HdEJ9Ox9yTSZ%pL@PP_QC^uX zu+1CE~oG(KT z)8?xPU6UvA^JIWL>#D3a+YX$8oa;5sy1agIi^W~f7kZH?(;WN#`+itz6`dQrq*I zHK#?5$1Vs3xgEtd?4lp#w4qowX(T5-Jy{A*eLubk{i=`fa^G(Osd&*>K_A`O{;3> z?1d*Ee9a^Om;3L(zxxQ^i(|3BxA)*=d~&y4QGYhauM4Nzi}8$&UBBky7x=YE$YX+} zYYy`D2g-#uuPvv%jVudjr`_&paG9dtmXn=aR=rrReM87HfO77~sy?Zl`{1%R#%n3@ zLfyX)&Iq1}cmBqS@w`9CAdfcf*@X;Uou^3H_NN8x@^b5nH(w%tx?M|10)N5`8wT~0 zq^&uZRFW(Fr6H~c4K4xF7x#W)*U)@xb0x~-Rqm%XFqu6{Jr1b z?+y0mGvAG}7_e9jER67^q^%__Bp9vC&jiI2LQ_Nx!jIxf!1Y{45h?UkR~!;DPju>5 zwjKrDf>Gb%4w6=;4$2beGr{&jZ^%v}2LZWkQY)RX4asDil$B@~hn3T^Xv#7;q3lWq9hbEQH}ZXcozHlq z0pEwZs16VIzTTuBHo4_*4(`z5Ho_-9_V544esA%*!LZ+7Fc}|NXf1xx_BDJ07}xod z2|sBj=F;P$q^eajXcQhNLIYMO{=Rd<>G;+&E|3p{EjbbaaDa9}U*oxig^XiFry!&qt*Vcb_G#X7@sl%z*-M#*%ljHs0IGv8S z8SBJDKgD)E4R*n}ZZ7KQ{Z^pstaAHWgG?uv&S`prWXUsMb zonmhNWV|z0Eg`c?FY5}m9b<`4)|A7J;z3P!1^c55@Yry&7qb54=-71I#>2eJ8P9TL zd0~lOTj2CMh`t$z3|qXcO@EbhNDg#P)hFQXm%29QO9G)|FM8JN#hU^B!Eo*$>zj_B z7!C&a+p%`@$qpTEQ<$GmhNID^*0;7lG1%DpWeXU`{lUn;)Dw4SZs9lUf)W=N#0EeN z@p+NQj|fGAVj=TB&2a_nz{|7@(Pg95>&+>O77XD)v=U7(`m^!D?_A8rU)_B==++Qd zvBN6~N287H|H1MXrc?jEe{R55#R+h*_|L~w01nYOMN?lz!|8GYaxM~O(Lq};gSv5R zzE2idbXg$KWCN(o&j9n(6m@=fn~(G%%Zz5Qwzg+MWO)_Up~G#0>({S6zPUDdY<+!g z$UcIPcW#irppJ<%U_+($6^Q&5Hw_;TDTz0+*m*nU$6(j#%4A>Z8aNx5y6$&qQ$v?J@Xp@|1N(icz2?P#-tbC~G>J+-TI zj7*k`YZW#`&w9QY1-t0^rkc}{3whZDzTC62#!RH9eSj$ReBGtrwzmpxnP{UqZjkF) zmYieLBu~fc_bpOcz~^RMZ*T9GW;)yiS6+DLJCF9R{$>kdJo;@X zIIgRmPT#AH@!yP5A=h8qUkR?9A#U+z0V4*xKs`-XWbV(yyS1ow?_JBIKd^CxGrxfpcf*TN35XY)A{=ZuZV z%I0=-U{Ul#r<_kq*z<}Q{^I0t z?-3KeU~=8YREG|?HF~?l(fZgtd}`}mLeH4nhRrgj77y$;9_v-h*^nZ@5K#OF5fno_ zo<*1`UrgS_c4A&TK2jG=bwNDZ6{t6xTf{KWJ$QP|v&ww7sHT&X*Nu9U|9C!|zI8gC z#>a>{oQk+}ba=(UoMCb1?D?O&aM%6cXQTblX3VxYvEgoG-6zymnAt2EM^IXYpqumI zm<2c*$a?OeMaCVu$N=i~;=trXHXL3w*^#r#R=X|gNcy_XScB1^8jUup*<@^K@~|xc zI%n;0TjGUhpZcz?&5d)6eJ0VKJ4cHKCeV#vxGxmHp=@3kivnIQ7B|pH;a6@4-$Jg~ z$Pi6-fouSHwQnXrhu_xAH(rqK2#OWbm%WHl5v$Zgk0XU9JBlN+6X!0&mFWcpvcJ%`?s@Rb(fF~LCO$l04c5w&woWrYSt?qWn?Z0o7wBS`hnYJ$eg3b6@9IU(C5$(ARx6SUxC z2iqojqijk`*Td(8(WckSLR?SPS)#JAo2c_*11!!x_36a!wpL{rO(v6SV`t~^-UlB1 z-n;I)>ly3A^1*bt0d~$VtPT6WZa$k_oU@AHWcm!oVP}x5X=j&L0+;19l!-48U^CmzyvP~%mN9k<{Z=8nI-#Xnx6wWx?lbh#pJ2BI zoZkz0({Qv_4c3~}UmI1u(Xi@SxwpPv^(|FvR$n(d$@rD=DwFAtsIQy6(T0QN#QqTR z)$)bqwt|dKs-N^m$6z^$_~bDPGBgT}j*AcMpDjSGJn-!=)ACW(ujXr$n*&j9!I$F%8{KSnpfen27v&j)pSvMZh0uIt7oG0ivI#GZ!EYWgKV$mkY z#NnE9IIZ58lAib^*DpZ;d3}tcJ{GIn`e6IgGf(|-le=hQVWdNc+XNr^xu5zktI6TF z+r4LtaLTs>F+H}?Z&kiDy9mlZND!&}OqzuPMVnZg4oPkhV&OxzKbFlKpj@DyeJ_^* z{!1BO6ivDJspKjH$u>5^@8#D(d{VaKPp%Ys=_?01E|sn2CA+}mh9$ShmzndCIBO#6 zW#T}xde}-EMO_|cYZ=s0yx@;Y*EE$r3FWME_(BK5y=teoTNbZU!qoBwj(Ghh3L zU;kTw&uDG)C;7!M7wT{-?7a4E0r8gOgZ+ohKP*%L0YU!0+0|l*agyUdm&nd}T!7CP z<@)7oS?6tN94i-A>53MeUZIz0tMq~Nh0K#(=}Ok+?awGq3m0RhgTr>cdvh~dD`Zf!EVEtX&vJnpMf9azHt`HIf3jb0H@7$CNXj-Acu^b zf5?hPSx*sU`Z7QCYJDac206b;x(y35Mzx93Xi%-MZ}cxc|GBT9oE-kzlarHmSLo2; zHo)$+t8YEKIrtCP20gyy*XHjrzQadMAT1Jjl4DlhMe%oPkSiX-=C2prEy6cqff4$U z@Uhc2rR0+&AfEf&iZcIIR|0OsVgdDROXUpFWXE-roP6H-R!0V!a&0u^7zHmshAp@a zfW~1$z@BElbT<6(DiWvR&ECpx!=5(o-%v`a&*?pP}~IaEeVS%je~n z_&CRwXw|P4?N}K*`I1(#y!>jO%eTtQwQ6X!-gAWU}q7Ls<#5`;hBx9)Onh1?upmBbh7CUj69*j&Xf_nVdGh5 zUd(0}al+T7*jmijcDA?fw|Ha+)}cd(+ZE>5duK1+{WHD(@Uq3PX9*76Q#^Y1`xY`h zX82Q6=K3XML>%$2k6{DcfE;l$$624dV9#SlGe>|fInl%is%H>*0A-6m9;qUzIfbvA zGX3c}ll)xwCfAE2?hqYbaX5eRp6?rt)-JL0I-O5#!apqwD|3$doPln>5e_0J!7nHm z|EM8;$!cdSUgPpokv-`k3qNlB%L!z8lG=vvUmjb^-Uhi1ITqObIv;^!v}Uw^Z~Mtl z{Ni`-?(Ul7cIfcR$0tAe$-j1dc>RByO(&1dYy@*ZWG{))&nAcG?kD(``36t>aAPwW zrq%8%l#4uaE?@iyJ_vupM##v&z_Lt0Wq9&CKn_hh@PO#58zFLoWOYLZk_Y6}b%RIF zkG+*bI^>CAQ7&~)PI6GslL=CW+cO$DpiL4ql?Be1HhrA8!j|OKminx7C!MArz?ttq|7erGzBg+fODGAcgHl&;7GC#|=lX$#Dvw!v%;}jlnzlp8iT8HoO zTpNvSPGxDd#+!bzAvGMv_j+2aaP1N=9CXQ(*|CB}2`@X%5UrJdc+qlhbSf9UNRn^z z8l{h3lr7(&vIN~?wT=aC-|WV`)$mcLn&@DFoxTY!*sQWCr78IFAOX#eV0v=jaM=6i zD}%#e8~~&6TUc{m;Oy+jHLS_4~V=K@Q>E5MFXV@#T~x95U|fyero5k(G>W0m%S# zGTfFW=>qB2wAz*hjUEdsn=lPV)!N#6?{M$RS03$M`Ic@n(czU28_&ZBAGq)L9v@zR zlTD3>Y_c+@Nxb65#8_wC$M~lT&lkcr}LfdD3 zQlI3-TavM|{2EZd!H$)cGEa3S`&aWo^t++?=5&&WZ&sY2ZBeFAY9XiRXLYfO91xl$igmJOgHG{3g=(`H$;52P1; zijNKg(aBW?Dy#2+Tyi?L%u|wXwxNEsqlSvhJX0bYhLrK zcJ1pgNa}EN%xAOvPL2=0X|b4W+6A_YY=3@T>>s=HF9D2?jC_4>6|&LR&9=pRv9Z4j z=(O9&KD7#JBPZF(w%F`-$c&kXF8hpAHlld*k0+wm*4F%EdTdIq@l=$>Gat)!tSHHB zkg(-|N87xdW^t%I??|0;yjfyA{D-{k05AAOJntCZ1PwCvQa1SUMalm=>i$GI&H;R# zhhTXDzP#+d6V9?FJ*3?S~t z{GpMfta_rmvc(|lq(gL%s?(#rKfahxA2VCs=G09PXT8HK4!yzPc=P7_2XrhNHpy{?+Hct9xpy!z&#}hX-GOc>VJE#bn$c@%Y!a_V+Mq+#tuCBylD7!&>9=i z+IrB)RfZ!zpbQTvZ_~0pofDAdns!ROFi>YBL^fmxH0PRom5%b$08f1K_IS&nMHYzq zg`2oWQHIHk(RxN96kY_mZ*HT&FE_K#vMHsuG$ug2Q35Y$A=6xIhl%=vw&i&lw`Se4NyzZZFZ*T7xD;;hDM@I)X;hrt{t{)rkc2zmqzL4Mw z8^Qf&^}uRD*Z4GuPoBrmX?mG1`I`ZmRdQ-Wyj6MDQ@gqSY-5$4%E&No^RG$a=h}!` zUt6z6!!>_%FMjbj^flJWYhR#wE0S@mVbiJZk(DDaWq6_$MZcDwyJJQ@)`Sge9YZeD ztx}E6FAB{$iZ&w_0v%_3Q9kFv*yUKzCj#>uT-flB#rx9{mKbtuOqtH~`0%~Py5DrV z1z?8`wR1IMN2N=G0b_r>E!sE2lJCZzQ4bJCU_lIVR<&&;T46A zjqQ&P)_1ZTRy|j+U~wrMYLl|fDSV(S{qcT|54XCZQeL?l`_2$V( z$%AZ{RQs~g6e9%bx>B}b6|aX}Y-m#t9p1%nbdBVotTvD{BVK1SN{BXyRoVb* z;O&(dg^ik4Yyy?Z`92i!0p*;aH)R(wa30toyU{+!m~}{!k(?l&AU$E(P9Yj3v&xoV zJEM!&$a=Ps?Upj)y(z!v#GTey!98e#?js3w!oL3Mw!*0!| zf8@r8R@$|BuC014O~%t|GT~bEs@Zg2-S^<5Prc#scl^Qi_4Qw}^V2;o^%8L9(hI+3 zHl03TSBjrYGm2f?zHftsz$xIm2)PVY$6g)_Ks@rco&deA2eMt2@dwGab+TLr<7o*= zPx4uhGPaaJyNryIaXe1&Q9L%J{9}2RxWDj(pY+;2lTGnM!s299yy}}%#b4}SNo4jf zL%bDmDs9y5EW^nmv~0K5v14Qc$i}^sn&bEWhq5nJ$_Ej>FL*R@#uleM`Dj8sLB`id z*j4Ng7K_Q@qvrhg*!AhwI2}6N#;`bWFj-VTZ;rp$>-P^Az5X%pP0nXNN#N}(2T_2S zK^#{sk9gu-k1t*%c9giSSW_onmc!Tl24DvR@bqS<=#obl6dq4Z**t?j7Td@yW}CC= z_+48DWDx9dBf6md3dV3WnmqLIV}HLl7+x7qPJD6We!{?aKVfCexaTI_INE7&=O`&0 zEwD;QG&v@a6O!Zj%{-w@B3d>{?y#jCT@BfoT*btyKV(wD_aLl|j&?8q>0WPkm&tWb z+u;=l8<&I6J@u)-y0f)$pH1q0XKKNt7FJ;RYkU{kI=O$8g+zE(eCf46(bQY^UB9v7 z7wDKN*#mXia@o$vva8_j7oFUm^x8LMARo>&wY}uug)U$d+t4Vhp6N=^$oa?~8&Q4^ zimbO`FSP}tFJY4e#8VD}XDP`6Zwnhn3+v5!Ai=L?45&hv%qmDnDS*AO?X_ZCHdI!f z_IzW9YN3I)Uan``fv}flayg@22cjV_9WPtorqgNt5kBv$C1Y7)pU0JJT~OOE8%^qK z?n_<9P8njXlZp8u?JcU4lcVZQ zkH6*bZES4*{Ae^97tsnH;E0g3lrbnt0GCliZhyFuqYW ztR|D=H($H_?C(E3IN0${bm;I3!r{UGQp5LRO{Xe7 zrz;hmc6?A>JjDr*4+&WZu(2TI*o2JdMi(v1gpDXOp#ic>0(^82T7#y4)(bCVPqsrZ z`X?H)K;NH2@-~f5%vD<%E{P47Yue9!2hydkgbX=6^+AX>wsWDUgZF`Xme4m z@ryArp|FKwe|Yuzr~lM^K7Fm(?7knM!z&7xo_qQa*#hi78|OWK?wWyUT#5#Q4f} zl4Jn3DYtD=S7Ln9E?>$_t|XnDXS&<9T>8r`1R9+}Fvv!>rv!36XgAUUM`(v{b+a*_ zm!s!8E~@clz8H>%i^+6Wt*>ofded9p@n79@@4cV3^U>VcI=m>xC&%|6A0K_)Y&P9w ze{fb`W#u)R3zeX8n9-)`dY%Tqs!3;+{L;86@>xe^$uaJrt1->cOqSb&Wz9sH;RtO$t z>3JJbj?F8JMgGygI99qyGz6$<6N3EvBKkr#l?t$QTK;BN?2k} z#(ai)=#-dK;5RTWROp_etm^?*UbaL^sO(B9n z$hhNMx!>cLW!8K_>Jzj6z!r|<*X&<=;ScWb?{`m4b$G?#vrj$wt&5X`-)ncntp#s% z%;P3ygO?{SY+}u%*v7YwVf>MC4r*WFWwiVx6!PIKjlVz-{<8n6oc&F?$^!MQV}!b{ zo4E8SM^alZ=8z6@`Nk{VoP_obns?xhP}>4oCqEekt*!5U;;wFxo-cllPMOU+bdbw& zNuVs7;sd8yQZCzor#yi+7o(kcl8QJL^*C=$PyH}!8|srjenZ_XdRh7$dzO#B1TQ}Y zL{i_SD>?{U(O11H_3`xJd6ac&LF# z;g)fHbo7?J-OKN>iN4*)Z5+lmT-dd=3lZ1caO2==LD#K~)93)+Dn4zNcI#YFJ?pKa z32l9FTDt)Gwmr#1&wA9uZx#v=b~@L9+pU^Mcq}T;u%=up!uB|^~Za&4+{Y|%sUKVZ^e8i8UD+t6Pe`CsWrUAqU zVo1ah;%v+lc#=9SA+U@bn?1~|kP%F#Zo*(wCwdm))wBl``)iwjvp*dDiuJeq9?KPo znQn(yG;kcdaZecEGv4iIf?azL!=HhlCM1S-U5*7PD*@zG&UBS!N4Zbq<)@A*$E3`1emwy@wv@Z{+*5yaJ{!Nu7D3G;8XY=(8F1ywmEZK_ zr#|^F=O?@W-F!ZItxc5sz8E(@WMh>DwR@x$_?8Ra@CEW00Wv;4B$Ta85OCaLz4ZlK_0r|JKb~W z^eb$reU3eJ1GyY+Mjr$nACL{TFL}|FOTI0Wk=qqq*4kq-$3~QINO4XJopI0Ls?TxS zV9ae%cKd}UQ1s0=lGE*2ef4Q{H{L+DT*lfHWKVo0?~|pe8L#_mwih;5_y`~OQ9cYb zolL7I-uj*ozTts~|H;|2XRla4n+|rkCD{4CFrQ9$c_i&pfMmw4ya8fA(vP6CG#VW+`PZYV~2jY-}o4e`4F*Aae~~WYx`uSr~Y4npZg%R z>E4bTF)OX(kX$WKPWPbAUL@}kppg1Nyuej-9fJIUyZmQA}^|+8<#;I zg2@z}xIWEsQ|F#)XVi|vDU=3_>B*Zm)bzs-gMm&yC z63*fL0+r=7s!LY#@#Vvf)2U3tiAnl3KIsD45M8qi(WFZmn2*I)RK{r&y3F4UpJml)TsUHi39Km9Zd*6%%kX5%-FkM|z5VLD*(>~my3SFm6* zADadJ{*VFhi))Q}a!~seK4W7XvU!TtjTvs>2))LaNZHQ-b@`5Dz^OD+(idcht+Q4)>%EFEOy(o;T=SXv?r=D&9(~;#{@dC1_EUB~ zVt{nGW!QNgEasEnIGK#?K5f_3FRqtd~Duhp+$cGDhuPW z&*_FR>Y7pV_)3j0f1ICu)o3)h+iW%`y+el%w;lS!;qx{pzc8E6hju$3_j|p$-N!AQ z^!-E2n$M7r{7cW5=V-(Q_JKV9l*p0!y!az-GS~6=RFKO8G|4F`wi@EQrTAkjiZXGO zm_4u7X48|e+}IfIm`v$Ohm0;*-v(G)TRVB^;m7`gjqlIe0>Q>U6L50`7KlSF#`@LOOV9p+ z#cce99W%eZ-=V{o410Tf@7dYj`P&aZ@Zj&ZRrw?P*Irof_l7p~8JjkSZTQB}wQznV5U;lFwv5jGhdx>z zo}0I1gs^Y<$;rfZyc>4E`MPiVE#KK241Z`i9Cp9L_jzDE9>4u?|LS|@)5*49+~RA% zzk|qN=X?1A7G!cWE*cu;RjPS>0c7enlbx&&T`AX9jz!C|4UlcL0Ug;aqq2NQGD~r! z(4~`6w{4kZtY<+h5S`@X+(51}fR}UirJa^gA9whs0GXQ0(?(MBHwWxbeXMQP<6yb( zOUelzLtHk_r^Bi`ALP7(V++n;I^E>$ls3m-R4gAXdh_Y#e0uV&hlkxSV0GwlJHvdv z|Ij0kePlK>cc1b7!)0U0qLA^lG36m5-e`3ls!OrX=kTTM(##Kx56$U~sOu?qY7Qji6(49I-88&(p${F{^aDO`vRV zSqIQY8_<@{pX*p1y^{Fa#D&EGuOm{D_ZNPlJC(X>R>tSTtx6(pKu50h$F;r8y_FRG z5?tP1cIK>X{lJ%vhM;pyHa_m>vc5rOWQQ#TZMACm=JCPrS{n_!H#j?VxQ$_PVZOO_ z=4ULfZ1j5lL-Tc;j^Ol*HH!h|I}Mwd$r{t2hA;CrC3t%C&*QS?#4|nY0VFG+Lz3;_ zH@r5~PJE}OMIw4?^jdPUI5$4L{+H*|ldqdhCToS-p&+hKhgUqzxn_^O@rnQY_Sp+h z+5{Vyw6VlANNf7+7Bji4TtQ+;_c+`%!!N!t}5g$_~Bnuih z(Z}XEgvM6WrsR>Oe3}lqZ$O!@Qf%Jwj$yoOs3hb%{a0DXD1MZk6*T(in}?Kd98VNw zPl>u{TEJTwEVV^)o{gfJmHF|I;i&J&a`E2#_nvsiyZ^#ncir`@=`;;?xMkS&Iy;+8 z-a4I*H|@m7Aoh&|&bfiQUxPTkT$_ws*R^WXR>|nvim$SGg36KsXZxsb`jces+nDfZ9XflsKj#{E8OMZdGs z9qzeyPKl53xFw?tm$+HYr}wQ7`@i}4_;?GG9XfQl?SRW$;O_tI#ry96mup*_KVfln z?DHS@_l4c!>-kWGjyk4P3vEsTk9C%aA`xG0?uQU1t80#g9FQGoya2R3x5_cLpa@2Z zHoRc*%hXJC-dl`M-ncgEKVg0Ael@g(nALW;Ento@z5Ct=e`G$J9WlAa5%@A!D@56y zrJ0xjm6hDNRyZAi4#cAlUv(fEx5MWomMTB4WMGfU z#Ar0~@0Xd)rsuCb|J0u}JLg@nLx(Q`Z0t=f`zOEp%OBmHk0;>+Hdc8DnQ`lrU=s*$ zh%t~#~AlIFZ8%SajWuGfPAv}R7rpwU8OcMot!>q-vz3}m%S|0ZcF}3 zJ>>A`kO67~84^%g_9zpdVl$)ZQ`SK)Kau4;FD(N$eIgd119G0rvIUwlZPM@PlaS?Q z$FEVzbsi82+31H78}iTvKSq~RyNyj~Iv2T3l_L&%(IKAic@{X$a_mvAWs<#|K;{eW zdK4PtMJC2i+6PM!`$ENee?2*^L@ox=B8$V_DneHQepC=BF4&HF}^7G#~8BaF-^5-Go zWs3={CHy*5zjfp>yb5`|tr~mKl-hvC#_Nk=m9Eg{F}6rRF#@#Zs6)y0RWbm3K7MbK zfO3%OKxNrdE*g-I)2;0&LvQ#dO~Dd0yQaRO%;L@kEKx9Z{$ZB{-7@Z(ti}NT=Q5lJ zHzC;~&l@?4aaPxv(Y@44mh2c%wz^4r|G1t#n~>U>H#>|v%ScAIXf~Xk?ERr?G5rnQ zM`t>8xGjM@6BwTEk2XGFjy<*Vb&Fw4lL!V&F}<0)SOlVYBs;i+U=g?Y@yqjx{Y9i|73G}=cA+b z^|2Oy+`9edo{$|QgSs3}Xv^VX?MaoKj$8?#R^~1@$i~MsVzF?uiJC9+H4(8yaPg;1 zj7DD}AM9QE4abMO?;VfF-6M}3z9g_4*YL`vr~j*sVgH^8lQ#aDR5N~yyJ*a6ddUQ%2rPD%j};Z*Cj^|xbFegZ$Po#2DG-V=$CVs`kB%0 zo8rq-pRAnaL?>_Cqn>q5+gfjAw7E1Twph;jMLuFhqXXKpPEcReFX_coPBGy?S2q1A zxN_{0&yRu!t*HZOoHz9)bfO)y#!lD_`377^UwajDn@`_F%lb_lO|F#Dt_PZP85?PQ z;W?YKRwka)guX*~xjT+kZK!X#k1EF#U=1DQGN9hJBf3z^80%Tzy%W&5mvAhT$;2nB z+-r`GkE?gS=d0hhxqa>*@9gYcN4CS~huL)6KR!C>@q;Ctel7q5)-Nlt^KX7(RpVPZ zUo+6IgPYNAHimN<`L--HlKi+WpYygZkWQ9mY-x_u){%U>ob^=(jlD>#>VRY@|r z4zgW=j|Kz!2T$z>khNngm(%M60rF#@sMDn>PB%QzNZG`Z+6=Ch;MY_9iz%Wyd4 z$8<2%p+kq;3q1KWn@*%6~8FRUqrx92D zVF+Tg{h_NE*hc1MzUY}xUf`W@p1o!ZYb{tk<|fwkbTK*p>Z@0;cAo}nq0BNn+$NY@ zyL!3ryTK%!fLCz}rHniw@*BJ*%345CR~Z!XT2DGcw!^f5KCmd04Yi+ja@jwUlG+x} z?f5i<&8m^h@stFM37fE-yY%dn-?O*7+dVba;Y)&}qr-P>jC#LqFc@wzUi%e~0{gu$ zZcH{%8S7p)A7p{TordAe7&eOAL09hpbFb7#7P6Njqc8oIZ-DGKg8U1t;^URjCFgx) zQBdIhOM38WGs{!t2_x6F<0Az?3o2tbnzpo~;ohn!=SoQ@TFU%pxrj~sf2>~T|f zoBWx$=%i>1JJBX>ET7Ym7u06taom(e2SJbXK!Q##Ig&{^UAE$BxW-1?UQ>=-*PxbT z24gwrC5|DEN6>La+hM1DzCiRPWO6wJ-8z|#nJpYyAjalYIp*@iGA6+YGdo4OAlnes zpVQjpTnkwbWLs@n?~i!)vRahUF*)%=Z(faU@jJBp2+}*}&R@OnzK8z$z4zYR{R-a~ z2wNQ7XP&=3=nrgg@H=RhnRD77GkzN+egBx1rxoL66&NdRp2p8)D5d z++LQ4PSUuBr*SDA$pGoEN*beitO}y5e6y5gZbe6^>*aVN_U@_XpQe*u*98cA_C`e!E167k&5GrIPo zW_M@qudyR#$21@z)$@BY;drnZAAUo>H~)(64bBc7ZcBJ5+1ft)xzS)W>@RvFyZ6j& z=41{I`g{p`EoWuEf{wuBNnbhRan2;XY;qp+pp{qyU2?^a=Rk21)V9zsb+Agt5}om= z7p&gGqGf+N8^3*h)PGy|RW-|KX6zka@vuR@xci<5{#n%@eqv^`0=`(88#YTsoFhBL zX=R`?y2){Bnjm`cw1|wl7DhmROI=@Xt~&PV8=GlvD`LhH55S{791JaJ%$Rog_e=qs z@bnILuYSY$W%gAQL3JooG~e|Ycem3wV`+OUip6{yR_O&GU~VMxuGW-M#dHZ~Th zhmGPa2HAoPA71#{GBQnmqOw3ao=uRy23*z>eQ~<|sVuo{FZ${#HD9v1j*jYa3~?N_ zj3qq{sq^6UVApl&qO3O1A!Yl@q46%4&n);e+icQ{Pg}&AKKP|M7c!0|L%u$&rJEB&z z^{Nd)1|K8Q{)}UpwLP6YIzQR{Q}gNZyX?5SgMHU7n z6N#}8w}Iq<`vm$)=LQ%}Dp^jlm&M~PBq@y;0WO!FxPd$?0>&Y785lwLp)TR(- z*f?qI$v(&KPk|auZDWItoDAB7=9?P^fA<}E+T&H)jLjn244Z)V`IJ|*zkEKFoMvsn zS3fc&1A?EgS+T?~s2e2|KZ z4KXg@OGI0ZYk8}9F?a?LhSgw=AF3HveVe28N5=C_D3ZnBk}Qzf z39>{E&GJRrsPf)f-s6XE*qkyRn_Ji!3`b_OY+`vE@GXLveDvM)Et`5g;JyUS_{OvT z^Va6V=aaVnL%{c}s%khN@BjMI{P3?WX4BW(u`S+CANc@yGC3jM%15ZD7nxstB#)HrV!z!(NW!CMK7~? zX3WruJ$?SoN7M1qH?6M?UT^WY`>v@1yF49kGc4}D@4^4&;OOLIHgTA0lEKjTM7cOc zo`8ssPOA2#E63G>G6KT#kQ0s6^Udve>T1myJStj946XagUA(EK(rM}eF$2# z8S>bTg_scb$Rk$4^LCsX$D_@qY!6TuP4%2NblPpxmu(oa9y{^Bk(Z3xmR)kuf#fno z|GHDbI9ZHGjgPw$Vx;=PI)))|9OeX43w9o%0T@ zY)08XCx*P8P(E5To}5%8A1w3U&Y7K~H$L&szjgop_djXZF$O?~&l{8R$wfQQI~F4Q z3qG>PwXu_LnU_Ialt3O2r$N^`W0jud{Ia)n+T*c376oY1Z`*0>_&7^GunN$T$!N=F z8%nEaq_#X|)x`tt;{cM&Ix6EAs)xTfn^2--2D`*NzD~hYn!kCRCvl(SG|?=(L+Dwz zOw-HwJihOAWI&POF@HbDI?voU>be~ZIkDT4Z+6){kWDb|0lqQDW>}dkvalo~TfB%p zQ4gs64rhVes(Mh2wPCz(7%Yzd+xdL@upM*hK!*+;ZU=DxUSHq*rQTq4y+0fr_Xnf7 ztq+Mt1B)qEia8$}Quuz%NiC|F{}XdOwlUwdm(!e!XcJ2TGL#i3Gf$w7o*)_GXaO@$ z7+x`6JZMUt4)o@|#q{K@Hc$C&W~X~FhSSk z!-l^*M|L!K1UQ8*sGeyVsA+*98-jEQ1Z{oMq!;bPa1&37y4$wDcv7HjYT2A&z@)@p zHU;4eGuIEUJ^wvbHND&9S9iEWhc5v8d%KTMPWJw0f6!x$`J|Vj-Hca_T_2^UfzQR$ zQ$SCc1mFHKrWwEJ*w{ul_)Q*V^5O@H-mU{^r_rMx8zq$SBk|MCvPPrR*df==UF`tb zB2o5_&>3HJ^^4?uJ1>oX#3jke4hWg1pXAyM7bs#=wguT*=Aj$yijGWdA}ya&wG*3C z(3-ddhlB<_8)S#P0V;`0ty z)wn$EL5F9y@cx>w{|*1i_L+14dVPKU#Eo|NLSW~6_V~&8=zd%5TWI4t+F7@u(0Ha{ z`O>Zg*Q||IG(kM&r;Q;2eg?cY4M1OIC&th+WJBpR-BmQ~DM_X+Cmv|?sJHt>-RFRX zE*bJ{2O55)g;v&S;$Xaq$oH|t_a4T5KxfRYagX!ZZ)F(Tb@H|%(Vm}Ya%URQa~ag^ zMbT-puWK27K{o1^=%4jVPh0Wvz}TQ#^RItk^Q`hsD%Pf`%=>=-;Z^!))@cXB8`X6D zYX`mg?>;&@>=uI^I^1Tk7&YG5+P<`yRTJ~;IX*u#pSS2{fr&U0p@V!8{(nz&RSHz!z?ujJ4}o2OeeBGd(Y=1j@l{ z7D}qO9W>j7r>7v0Uvg?Y9-l1v5XFs|kMyg_@!{L|uV1za#nF}vcj)jk;@XuL{_yN@ z_YHOvv3W1=5;IAT@u_jnPvw2iKnMaPDIH%}0$AVpw6%Cw==#O*-`YBuJ zQ)bMd8xth8i(HPC(GIX)#H;kRvFTMu(?%fr9!d3Rr|BDzj3#c8M;W>urEf^3rj~5T zzS_^%MPic4Ir6k2KvSDhZe(5F%68ONHd@02R*!2DA9w7mQ10+~!^X(@>G=3-r<3CyyNrHDeU{C|uuFst*Q?N|*7+*jj3;Q!Wm(ab z-wN9OK{x9|XDlhT<#HU!+Z-{|&>=-Ujo3r3 z%_v&I2bXk==q*JTA~$+{u?q>B_X*yq2tAkJM(Ln-6CGEHm*9tP*Mz6I*qpMvwypXG zzVZXsZ#wT~?pHj`>|LEt&sLL@U$?%#vE$4R9Xi}L=$oGphiewsCc~=FH{S7Ou#2h9 zyC-Z>mH4K-PK1L%)a_s7HWl$0M>#=y{wn1NDaeLS%;U^Np(_!lJgyT*Df3-eOnD-% z+CK|L)^RIMt^AZ7$C24r2k&S!v&as&75e?P-E$Wn{+s3!ybUNLdo$UW+Ti9;<`0WjRGK^pGjtaxL?@tFeJ|JjJlR%7Rt#8`;l*HqDR;e+&CSKAQEFGF`d*t*MGfU2TTlumQ5J_>vb7W1|+fe$b_?37@xDbfRsi8!2S1VekKBGVw(y^tJW1YOrzkFIxGt z)~_Pi;S0g|_~?QC-K+1gQMuOd@oRhr9~uNPD|y{2Ek6))ov|XQoN0n|!rzyDp^dDs zF@`KjdgM6%7}WjEv%Ml+B=O8+T|>t%R;+P)OCCSo@gX|!R~2M_Z3l`8_pqb z2(ocYu5${s83l45@IhSCX(cu|N@fP^UsU}6s#BZJo67za=n}c9)cq(az&$Bs)DAWD zcyqvx#U_f(9c{hZAMia>+#USO+W9CSp(2iJ-kTloenW41@KZcQm?%{cVi#$;pHL{&2|T z!+)XAZ@4k8mE$OYx)M$!h?YSeJ?RS65fv}XDS>QHZHY%l8OH}%Hrr5O;3H5>pgf@X zJ7T;GK7QT7^~>LOc-TFL-QnfKr$70ze=$BedctmQz9Yk(gBKHC#wm;NSQy9HgofYw zjf{^Ml<})^%Zp*|>$S8nXc9L-`B>1Rok-My>KT$1sK*Vn(F4@84=RDStRR`pmu;TT zB+qtp4qas+{cKN3c4Vuq1EiDXj9SX@k+F6W#CREEwqQaln5 zKo7on)EO&{3}8|M*T+dpjSOwEaVGtst37g+(aUJdWV_-4@dac^oD<)e%1>1Id5Uv~ zDcKWWhOjGv3zh@CC!-;mEGRdArhmy9hS0Y_b=57$g@jkL!$8Gy&deI-=*ccrsP=oQqFl9!PR|^J&T11@gE+ zKgoG23c!`V*IRZo{7l$CY%Kvf7GQ`wzrbyz_^WHB9KGCx(fxdjZ&-PKAsO9OOWEso z3@&YUJzkjqGbWA3XHDVwlT!ZG7ryZh7H4M1*Z&XIbpNkS#z$|mbJn~w(xF3#S27Nd zPbQxn3`Z~UMa%x<2lM&5dHm4s{r+Z^#jpqy=KsXFCax(FE+Y5MDhm_&BYldi=;v4z z<i+u^o?O}wuThiiCc zEG}y2<0$~`?1oF=Ou=iMB|96mRgNfnu4ll@IecU_5y~{4f>K=zEa>zdU<2#$r4xDs z{}q_>j+n)d-r&-+pZOE>>G(0z=_V5$zF-_4>_0Nv)I;{ z4&Pz{?sYA|Et$5BQyc5>iaZD(i7~BB4eF;MYz0&f-Nv`b;mQAi`Td(FVs2zp;^JWLwB|@uEM= zI=M`{l2<<{`x_gjT+4FI-t(sKKr*tM0gLshA47;a^ifBkwt?Er?JCDUe12nVZpoV~ zvhhZY^`E*?us@ki{b?!A_tDW&_2^@7`kD2uv;TnaWOSn)zF^q7XV(AjgM;f2*?BKt z=;MCm7o56M&~A>N~)iRHjjGl!)Y`Do|5W-G1S&kE*T&>km*45HjvY1NxNP0 zY)5sZb36GB0?K*5N1uGoq&M`+MwGgPZ?5t??6;4_b9m~K<#k_*OynVF))@`17p98L zDwvGgaiBo*P0j|?Y$+ENz&(}wf*q#=fuiHr!^r+1A8e~zX`%1qgGA&h){L?^SDozr zzQOe1FHR@N-NLX#huZ+=%Zs(O^{Y&~Egnp4{_Qhu^XECdh&>Sx6bprjaS`v}$6O?0 ztmb)&OPb#!OA=i&qPKY&R=2)6-@k*=Iu{b?lUIx3VtV{_v+2=y@9piKbG+LI*(0z^Oo+E`60Vs7o(9rB4isqbew{ z8y&Qe<(E{XpA+)_q=_Z?qzD>SHN=J%sg_SpPVV2m^4#w~*c_epUz6|K#z7SHL#e35 zfFUVJNI0Yhh=NFow4`*5ZWxUq-5nz&q#LOrl4GPa118-uV8meX?ECxy`{CZ}dfoSV z9p`bp5A-3NEw7t48aXPB&#A{Oivc>Y?CHG%o^L=oLm_{fA;c!^a?$VmxX?Bvf5@Qm zzQJl#bN!WEDQ0rTlruK6@Ov)w0qRV?!4PXq5aU1-cNG8a-2n}4L!r7URU*A9EmB6H z&)8c3bTCH_d2f8N{W^ObS$mS!LvapOFJ2kuwsBEYleO{GJ)%=h&e20BZ{Wv4AsL^t z-8U=kV`M6jjV7Y#8)B?*vl5IuDpz!o)fxO@JVz4Do>UuI+~h#YM7?P@IMK8qu}3F) zX-TbM=J#5!G2i1yxzNMWAJKGfIb2?U5k4gxuNYz_JAJTUu&4E-nrYPrRRmRFXVIv6rED~~U8HyP!ghhc44540u-;`*v4DbexBVDot&0n!a?`nn1J z=4J2>HxvXF1=*WbJq4^?dI8$LRVf)5vEc8wAXwRKu$s9JzHdEQe%NsS94=Y~>+YGY}Z3&#!19g=+P z_2u(XcZ}j237RL3mA!e)X-{TL2ixX3_r(ssV~{T)+6lAS1x!o#7-Qt|<)eNF63^-p zyA?SHKYvoeXd!!$S=~KDpPLLv!=Vj{cC$Z(0}h1-jnG*#&d;6->KkLMijnzG((cJ)x5?U*SZyK{>KRNV%&F!XBSFj z&CcSpQ9g>zl$;}Lks92I+?otwb}#p4ws#uoj%AT}TNQp|OOJWSHB*~lS%0kVRGkG^ zdJQ5LXP?uMlEWAZ{T;`;*_e)qshaS!)$T z2N;sDPqE>4_mBi*R{tUHuPt3ZHO7;iFL|Ez6SB&!#>>8XU%QH%(2lV6`rN;> zSj0=wyZrYv5|Efr~wIZX+oR+qWYQe0iOH^-uq_^H{_=O;_5iuUxxt%&tiGL<=( zK^ylK`_F*~rq^=l*bc})B^Uuk#$|%YK2Z6?Q`o<^2I$K`H-|_Z9sW#-7(2S&My>_7tv> zz2Bld15B(o7vj!vAvEB=e{pWR&OLOe&Dnpf5s}^8WR1!}&sgtZ_wu$fEoR6iROYt1mhtT81htk$l6Q<|5QL_ALY}C-3zJ!RJ zEojoxzGY8(4i{M1lYGIiu9KCU{begv&W^45o-ru;K8KegW$yflJI79ycP3*VxPJ@_ZadZDyzZN>V}rZoKPe|DaO0e~NZU zfY;+Yv;mm3^4%GaN{y-D^uy!#GY?bVrl%fGFI%maB-voYL_5|I_`+>MyHHaus7G^Rb)6T}bmAd3n74@&bXpa0%>e@!lt-)mRyxxw@{W1@`t+IO%B)%lq;%usIr%V1 z0z2E{1WOLDnhR__LgsvmGdAHnCLzng`+=>Rhf7C{vIaoL?eeFL-p_}uv>y%o6Cbga zaG-;8^nCTM4cvWNs=vbC%^kX?rns6AqjhD0r)2I#N9WYn2=4OuA&_{s-04O=;tT@4 z7`7|C(fR*kksSi+=_O56FJdn0{02WPyy^dYWp%(ou1RF?B!p~)8xaK=}S(2@{#h+$xxID(kC&T&|8%D%{JDJ`r$eCc;7brNa9z2 z03i1dfcI*f9IhM3Wl4RGh}+kn2+I6>P(#s}gh~onF|*YWnJcole^<|)cP2=pve`eH zpHiemrJW=F+@)|8<90b@-bhe2H38)fG0!!i5(%Vz@V?6-^r#NU=*Wq!a|E$9S zM?uoO`(Dhn{FDal$^eT$y!ySO;J?Q;WaL=e(g>fOoh=24f}pO0ds)9w2R1Zu;%Xnf z=bjzf6^=I&#IV-ez2$J=B?kZ~dZ6oZ5nSWDzf;}mzdeVBYz8DH{5GC4lkPMkRCNsY z$^U-*y2kd}yy3Dr7(#+4(E9rd*OIGk?NTbWT=Mb-PEf~_PfP0X3taKoH97XJx`ZS> z@~ob#5+p*<_^r*@z!M+-7iT||CAP`svMG9u8w!(eS5 z>pK!$;o*mM4;TQ5<;7>-L#uoryoY|5`+aU=)X8jNaDCv#EF4MUrgjz?Qw3P1X)(=5 z*^GC%%OzlJ^G`-Nsq@4$Qn!MK5&W~V`+A)R7v9JiVH`oPIcj#LJ-{tj=F|iCu%!Li z;BItBEJ8t|@=k2yf8|?s&yDu~$1l)f>=hfd|R05QR<6E?ZHV#@|!-o86tMA9PQs+SZwfPSevcT48 z`_F!b5AsOHWkxP6L$ByOI-Rs9$&ItL{@Sr!y#QC7-_Z!0{~SwU zp*9_My6C79%9R_8?xAhgKRxn|-)6^VC0_>b_}}2d#!n z<|DXZ>@e&UZKIauBPxUi*jsh~Bp&r&tJMgN$~te_WuQwIY27u?cQrJg3A}5}=xQJw ztJeQ(@R`V(EATy;$E4ASUsCpCoJ`9D)Sof)eQ{~*sqj=MF6dlG`Z}Ll2ViFxML^zt zs-#qy+Srh9tZf+wU{+}dvZ_#ZwF)^Z>N^Y67m26+=$qUC$uES42><}lKmH*+ji&z6 z4OulCp90=Q%Yy(9nHiS#A@#&2Eru&}_e6ttIex_?JCI^fbv#yW_U0KCS;T4}ZG^gx zElFff#EYy4bFxj$hxbb6hz1gm)N|>IqIoePTz#%X>H#UCS|WKqZTn4-rU2pJ)%JXI z%0A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
      3mk2x>oi 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