Full Code of SlotSun/dart_simple_live for AI

master 23a09a35b30e cached
561 files
2.7 MB
744.3k tokens
3656 symbols
1 requests
Download .txt
Showing preview only (3,032K chars total). Download the full file or copy to clipboard to get everything.
Repository: SlotSun/dart_simple_live
Branch: master
Commit: 23a09a35b30e
Files: 561
Total size: 2.7 MB

Directory structure:
gitextract_7g62ejnc/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yml
│   │   ├── config.yml
│   │   └── feature.yml
│   └── workflows/
│       ├── docs-deploy.yaml
│       ├── pr.yaml
│       ├── publish_app_dev.yaml
│       ├── publish_app_release.yml
│       └── publish_tv_app_release.yaml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets/
│   ├── app_version.json
│   ├── tv_app_version.json
│   └── update-linux-metainfo.dart
├── docs/
│   ├── .gitignore
│   ├── .vitepress/
│   │   └── config.mts
│   ├── README.md
│   ├── contributing.md
│   ├── index.md
│   ├── package.json
│   └── user.md
├── flatpak/
│   ├── flatpak-manifest.yaml
│   └── libplacebo-python-3.14.patch
├── simple_live_app/
│   ├── .fvmrc
│   ├── .gitignore
│   ├── .metadata
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── android/
│   │   ├── .gitignore
│   │   ├── app/
│   │   │   ├── build.gradle.kts
│   │   │   ├── google-services.json
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── debug/
│   │   │       │   └── AndroidManifest.xml
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── kotlin/
│   │   │       │   │   └── com/
│   │   │       │   │       └── slotsun/
│   │   │       │   │           └── slive/
│   │   │       │   │               └── MainActivity.kt
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   ├── ic_launcher_background.xml
│   │   │       │       │   ├── ic_launcher_foreground.xml
│   │   │       │       │   ├── ic_launcher_monochrome.xml
│   │   │       │       │   └── launch_background.xml
│   │   │       │       ├── drawable-v21/
│   │   │       │       │   └── launch_background.xml
│   │   │       │       ├── mipmap-anydpi-v26/
│   │   │       │       │   ├── ic_launcher.xml
│   │   │       │       │   └── ic_launcher_round.xml
│   │   │       │       ├── values/
│   │   │       │       │   ├── ic_launcher_background.xml
│   │   │       │       │   └── styles.xml
│   │   │       │       ├── values-night/
│   │   │       │       │   └── styles.xml
│   │   │       │       └── xml/
│   │   │       │           └── network_security_config.xml
│   │   │       └── profile/
│   │   │           └── AndroidManifest.xml
│   │   ├── build.gradle.kts
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   └── settings.gradle.kts
│   ├── assets/
│   │   ├── fonts/
│   │   │   └── fonts-manifest.json
│   │   ├── io.github.SlotSun.Slive.desktop
│   │   ├── io.github.SlotSun.Slive.metainfo.xml
│   │   ├── io.github.SlotSun.dart_simple_live.desktop
│   │   ├── io.github.SlotSun.dart_simple_live.metainfo.xml
│   │   ├── lotties/
│   │   │   ├── empty.json
│   │   │   ├── error.json
│   │   │   └── loadding.json
│   │   └── statement.txt
│   ├── distribute_options.yaml
│   ├── flutter_rust_bridge.yaml
│   ├── integration_test/
│   │   └── simple_test.dart
│   ├── ios/
│   │   ├── .gitignore
│   │   ├── Flutter/
│   │   │   ├── AppFrameworkInfo.plist
│   │   │   ├── Debug.xcconfig
│   │   │   └── Release.xcconfig
│   │   ├── Podfile
│   │   ├── Runner/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── LaunchImage.imageset/
│   │   │   │       ├── Contents.json
│   │   │   │       └── README.md
│   │   │   ├── Base.lproj/
│   │   │   │   ├── LaunchScreen.storyboard
│   │   │   │   └── Main.storyboard
│   │   │   ├── Info.plist
│   │   │   └── Runner-Bridging-Header.h
│   │   ├── Runner.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   ├── project.xcworkspace/
│   │   │   │   ├── contents.xcworkspacedata
│   │   │   │   └── xcshareddata/
│   │   │   │       ├── IDEWorkspaceChecks.plist
│   │   │   │       └── WorkspaceSettings.xcsettings
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── Runner.xcscheme
│   │   └── Runner.xcworkspace/
│   │       ├── contents.xcworkspacedata
│   │       └── xcshareddata/
│   │           ├── IDEWorkspaceChecks.plist
│   │           └── WorkspaceSettings.xcsettings
│   ├── lib/
│   │   ├── app/
│   │   │   ├── app_style.dart
│   │   │   ├── constant.dart
│   │   │   ├── controller/
│   │   │   │   ├── app_settings_controller.dart
│   │   │   │   └── base_controller.dart
│   │   │   ├── custom_throttle.dart
│   │   │   ├── event_bus.dart
│   │   │   ├── log.dart
│   │   │   ├── sites.dart
│   │   │   ├── utils/
│   │   │   │   ├── archive.dart
│   │   │   │   ├── document.dart
│   │   │   │   ├── duration_2_str_utils.dart
│   │   │   │   ├── dynamic_filter.dart
│   │   │   │   ├── dynamic_sort.dart
│   │   │   │   ├── listen_fourth_button.dart
│   │   │   │   ├── permission_handler.dart
│   │   │   │   ├── sandbox.dart
│   │   │   │   ├── string_normalizer.dart
│   │   │   │   └── url_parse.dart
│   │   │   └── utils.dart
│   │   ├── firebase_options.dart
│   │   ├── icons/
│   │   │   └── live_icons.dart
│   │   ├── main.dart
│   │   ├── models/
│   │   │   ├── account/
│   │   │   │   ├── bilibili_user_info_page.dart
│   │   │   │   └── douyin_user_info.dart
│   │   │   ├── db/
│   │   │   │   ├── follow_user.dart
│   │   │   │   ├── follow_user.g.dart
│   │   │   │   ├── follow_user_tag.dart
│   │   │   │   ├── follow_user_tag.g.dart
│   │   │   │   ├── history.dart
│   │   │   │   └── history.g.dart
│   │   │   ├── font_model.dart
│   │   │   ├── fonts_model.dart
│   │   │   ├── sync_client_info_model.dart
│   │   │   └── version_model.dart
│   │   ├── modules/
│   │   │   ├── category/
│   │   │   │   ├── category_controller.dart
│   │   │   │   ├── category_list_controller.dart
│   │   │   │   ├── category_list_view.dart
│   │   │   │   ├── category_page.dart
│   │   │   │   └── detail/
│   │   │   │       ├── category_detail_controller.dart
│   │   │   │       └── category_detail_page.dart
│   │   │   ├── follow_user/
│   │   │   │   ├── follow_app_setting/
│   │   │   │   │   ├── follow_app_settings_controller.dart
│   │   │   │   │   └── follow_app_settings_page.dart
│   │   │   │   ├── follow_info_setting/
│   │   │   │   │   ├── follow_info_controller.dart
│   │   │   │   │   ├── follow_info_page.dart
│   │   │   │   │   └── readme.md
│   │   │   │   ├── follow_user_controller.dart
│   │   │   │   └── follow_user_page.dart
│   │   │   ├── home/
│   │   │   │   ├── home_controller.dart
│   │   │   │   ├── home_list_controller.dart
│   │   │   │   ├── home_list_view.dart
│   │   │   │   └── home_page.dart
│   │   │   ├── indexed/
│   │   │   │   ├── indexed_controller.dart
│   │   │   │   └── indexed_page.dart
│   │   │   ├── live_room/
│   │   │   │   ├── danmu/
│   │   │   │   │   └── danmaku_mask.dart
│   │   │   │   ├── live_room_controller.dart
│   │   │   │   ├── live_room_page.dart
│   │   │   │   └── player/
│   │   │   │       ├── player_controller.dart
│   │   │   │       └── player_controls.dart
│   │   │   ├── mine/
│   │   │   │   ├── account/
│   │   │   │   │   ├── account_controller.dart
│   │   │   │   │   ├── account_page.dart
│   │   │   │   │   └── bilibili/
│   │   │   │   │       ├── qr_login_controller.dart
│   │   │   │   │       ├── qr_login_page.dart
│   │   │   │   │       ├── web_login_controller.dart
│   │   │   │   │       └── web_login_page.dart
│   │   │   │   ├── history/
│   │   │   │   │   ├── history_controller.dart
│   │   │   │   │   └── history_page.dart
│   │   │   │   ├── mine_page.dart
│   │   │   │   └── parse/
│   │   │   │       ├── parse_controller.dart
│   │   │   │       └── parse_page.dart
│   │   │   ├── other/
│   │   │   │   └── debug_log_page.dart
│   │   │   ├── search/
│   │   │   │   ├── douyin/
│   │   │   │   │   ├── douyin_search_controller.dart
│   │   │   │   │   └── douyin_search_view.dart
│   │   │   │   ├── search_controller.dart
│   │   │   │   ├── search_list_controller.dart
│   │   │   │   ├── search_list_view.dart
│   │   │   │   └── search_page.dart
│   │   │   ├── settings/
│   │   │   │   ├── appstyle_settings/
│   │   │   │   │   ├── appstyle_setting_contorller.dart
│   │   │   │   │   └── appstyle_setting_page.dart
│   │   │   │   ├── auto_exit_settings_page.dart
│   │   │   │   ├── danmu_settings_page.dart
│   │   │   │   ├── danmu_shield/
│   │   │   │   │   ├── danmu_shield_controller.dart
│   │   │   │   │   └── danmu_shield_page.dart
│   │   │   │   ├── indexed_settings/
│   │   │   │   │   ├── indexed_settings_controller.dart
│   │   │   │   │   └── indexed_settings_page.dart
│   │   │   │   ├── other/
│   │   │   │   │   ├── other_settings_controller.dart
│   │   │   │   │   └── other_settings_page.dart
│   │   │   │   └── play_settings_page.dart
│   │   │   └── sync/
│   │   │       ├── local_sync/
│   │   │       │   ├── device/
│   │   │       │   │   ├── sync_device_controller.dart
│   │   │       │   │   └── sync_device_page.dart
│   │   │       │   ├── local_sync_controller.dart
│   │   │       │   ├── local_sync_page.dart
│   │   │       │   └── scan_qr/
│   │   │       │       ├── sync_scan_qr_controller.dart
│   │   │       │       └── sync_scan_qr_page.dart
│   │   │       ├── remote_sync/
│   │   │       │   ├── room/
│   │   │       │   │   ├── remote_sync_room_controller.dart
│   │   │       │   │   └── remote_sync_room_page.dart
│   │   │       │   └── webdav/
│   │   │       │       ├── remote_sync_webdav_config_page.dart
│   │   │       │       ├── remote_sync_webdav_controller.dart
│   │   │       │       └── remote_sync_webdav_page.dart
│   │   │       └── sync_page.dart
│   │   ├── requests/
│   │   │   ├── common_request.dart
│   │   │   ├── custom_log_interceptor.dart
│   │   │   ├── http_client.dart
│   │   │   ├── http_error.dart
│   │   │   ├── sync_client_request.dart
│   │   │   └── webdav_client.dart
│   │   ├── routes/
│   │   │   ├── app_analytics_observer.dart
│   │   │   ├── app_navigation.dart
│   │   │   ├── app_pages.dart
│   │   │   └── route_path.dart
│   │   ├── services/
│   │   │   ├── bilibili_account_service.dart
│   │   │   ├── core_api_service.dart
│   │   │   ├── db_service.dart
│   │   │   ├── douyin_account_service.dart
│   │   │   ├── firebase_service.dart
│   │   │   ├── follow_service.dart
│   │   │   ├── history_service.dart
│   │   │   ├── local_storage_service.dart
│   │   │   ├── migration_service.dart
│   │   │   ├── signalr_service.dart
│   │   │   ├── sync_service.dart
│   │   │   └── window_service.dart
│   │   ├── src/
│   │   │   └── rust/
│   │   │       ├── api/
│   │   │       │   ├── danmaku_mask.dart
│   │   │       │   └── simple.dart
│   │   │       ├── frb_generated.dart
│   │   │       ├── frb_generated.io.dart
│   │   │       └── frb_generated.web.dart
│   │   └── widgets/
│   │       ├── desktop_refresh_button.dart
│   │       ├── filter_button.dart
│   │       ├── follow_user_item.dart
│   │       ├── keep_alive_wrapper.dart
│   │       ├── live_room_card.dart
│   │       ├── net_image.dart
│   │       ├── none_border_circular_textfield.dart
│   │       ├── page_grid_view.dart
│   │       ├── page_list_view.dart
│   │       ├── rectangular_indicator.dart
│   │       ├── settings/
│   │       │   ├── settings_action.dart
│   │       │   ├── settings_card.dart
│   │       │   ├── settings_menu.dart
│   │       │   ├── settings_menu_check.dart
│   │       │   ├── settings_number.dart
│   │       │   └── settings_switch.dart
│   │       ├── shadow_card.dart
│   │       ├── status/
│   │       │   ├── app_empty_widget.dart
│   │       │   ├── app_error_widget.dart
│   │       │   └── app_loadding_widget.dart
│   │       ├── superchat_card.dart
│   │       └── ui/
│   │           └── after_post_frame.dart
│   ├── linux/
│   │   ├── .gitignore
│   │   ├── CMakeLists.txt
│   │   ├── flutter/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── generated_plugin_registrant.cc
│   │   │   ├── generated_plugin_registrant.h
│   │   │   └── generated_plugins.cmake
│   │   ├── packaging/
│   │   │   ├── aur/
│   │   │   │   └── slive.desktop
│   │   │   └── deb/
│   │   │       └── make_config.yaml
│   │   └── runner/
│   │       ├── CMakeLists.txt
│   │       ├── main.cc
│   │       ├── my_application.cc
│   │       └── my_application.h
│   ├── macos/
│   │   ├── .gitignore
│   │   ├── Flutter/
│   │   │   ├── Flutter-Debug.xcconfig
│   │   │   ├── Flutter-Release.xcconfig
│   │   │   └── GeneratedPluginRegistrant.swift
│   │   ├── Podfile
│   │   ├── Runner/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── Contents.json
│   │   │   ├── Base.lproj/
│   │   │   │   └── MainMenu.xib
│   │   │   ├── Configs/
│   │   │   │   ├── AppInfo.xcconfig
│   │   │   │   ├── Debug.xcconfig
│   │   │   │   ├── Release.xcconfig
│   │   │   │   └── Warnings.xcconfig
│   │   │   ├── DebugProfile.entitlements
│   │   │   ├── Info.plist
│   │   │   ├── MainFlutterWindow.swift
│   │   │   └── Release.entitlements
│   │   ├── Runner.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   ├── project.xcworkspace/
│   │   │   │   └── xcshareddata/
│   │   │   │       └── IDEWorkspaceChecks.plist
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── Runner.xcscheme
│   │   ├── Runner.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   ├── RunnerTests/
│   │   │   └── RunnerTests.swift
│   │   └── packaging/
│   │       └── dmg/
│   │           └── make_config.yaml
│   ├── pubspec.yaml
│   ├── rust/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── api/
│   │       │   ├── danmaku_mask.rs
│   │       │   ├── mod.rs
│   │       │   └── simple.rs
│   │       ├── frb_generated.rs
│   │       └── lib.rs
│   ├── rust_builder/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── android/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── settings.gradle
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── AndroidManifest.xml
│   │   ├── cargokit/
│   │   │   ├── .gitignore
│   │   │   ├── LICENSE
│   │   │   ├── README
│   │   │   ├── build_pod.sh
│   │   │   ├── build_tool/
│   │   │   │   ├── README.md
│   │   │   │   ├── analysis_options.yaml
│   │   │   │   ├── bin/
│   │   │   │   │   └── build_tool.dart
│   │   │   │   ├── lib/
│   │   │   │   │   ├── build_tool.dart
│   │   │   │   │   └── src/
│   │   │   │   │       ├── android_environment.dart
│   │   │   │   │       ├── artifacts_provider.dart
│   │   │   │   │       ├── build_cmake.dart
│   │   │   │   │       ├── build_gradle.dart
│   │   │   │   │       ├── build_pod.dart
│   │   │   │   │       ├── build_tool.dart
│   │   │   │   │       ├── builder.dart
│   │   │   │   │       ├── cargo.dart
│   │   │   │   │       ├── crate_hash.dart
│   │   │   │   │       ├── environment.dart
│   │   │   │   │       ├── logging.dart
│   │   │   │   │       ├── options.dart
│   │   │   │   │       ├── precompile_binaries.dart
│   │   │   │   │       ├── rustup.dart
│   │   │   │   │       ├── target.dart
│   │   │   │   │       ├── util.dart
│   │   │   │   │       └── verify_binaries.dart
│   │   │   │   ├── pubspec.lock
│   │   │   │   └── pubspec.yaml
│   │   │   ├── cmake/
│   │   │   │   ├── cargokit.cmake
│   │   │   │   └── resolve_symlinks.ps1
│   │   │   ├── gradle/
│   │   │   │   └── plugin.gradle
│   │   │   ├── run_build_tool.cmd
│   │   │   └── run_build_tool.sh
│   │   ├── ios/
│   │   │   ├── Classes/
│   │   │   │   └── dummy_file.c
│   │   │   └── rust_lib_simple_live_app.podspec
│   │   ├── linux/
│   │   │   └── CMakeLists.txt
│   │   ├── macos/
│   │   │   ├── Classes/
│   │   │   │   └── dummy_file.c
│   │   │   └── rust_lib_simple_live_app.podspec
│   │   ├── pubspec.yaml
│   │   └── windows/
│   │       ├── .gitignore
│   │       └── CMakeLists.txt
│   ├── shorebird.yaml
│   ├── test/
│   │   ├── tool_test.dart
│   │   └── widget_test.dart
│   ├── test_driver/
│   │   └── integration_test.dart
│   └── windows/
│       ├── .gitignore
│       ├── CMakeLists.txt
│       ├── flutter/
│       │   ├── CMakeLists.txt
│       │   ├── generated_plugin_registrant.cc
│       │   ├── generated_plugin_registrant.h
│       │   └── generated_plugins.cmake
│       ├── packaging/
│       │   ├── exe/
│       │   │   ├── ChineseSimplified.isl
│       │   │   └── make_config.yaml
│       │   └── msix/
│       │       └── make_config.yaml
│       └── runner/
│           ├── CMakeLists.txt
│           ├── Runner.rc
│           ├── flutter_window.cpp
│           ├── flutter_window.h
│           ├── main.cpp
│           ├── resource.h
│           ├── runner.exe.manifest
│           ├── utils.cpp
│           ├── utils.h
│           ├── win32_window.cpp
│           └── win32_window.h
├── simple_live_console/
│   ├── .fvmrc
│   ├── .gitignore
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── bin/
│   │   └── simple_live_console.dart
│   ├── pubspec.yaml
│   └── test/
│       └── all_live_console_test.dart
├── simple_live_core/
│   ├── .fvmrc
│   ├── .gitattributes
│   ├── .gitignore
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── assets/
│   │   └── js/
│   │       ├── a_bogus.js
│   │       └── douyin-webmssdk.js
│   ├── example/
│   │   └── simple_live_core_example.dart
│   ├── lib/
│   │   ├── simple_live_core.dart
│   │   └── src/
│   │       ├── common/
│   │       │   ├── binary_writer.dart
│   │       │   ├── convert_helper.dart
│   │       │   ├── core_error.dart
│   │       │   ├── core_log.dart
│   │       │   ├── custom_interceptor.dart
│   │       │   ├── douyin/
│   │       │   │   ├── abogus.dart
│   │       │   │   ├── douyinRequestParams.dart
│   │       │   │   └── douyin_utils.dart
│   │       │   ├── http_client.dart
│   │       │   ├── js_engine.dart
│   │       │   └── web_socket_util.dart
│   │       ├── danmaku/
│   │       │   ├── bilibili_danmaku.dart
│   │       │   ├── douyin_danmaku.dart
│   │       │   ├── douyu_danmaku.dart
│   │       │   ├── huya_danmaku.dart
│   │       │   ├── proto/
│   │       │   │   ├── douyin.pb.dart
│   │       │   │   ├── douyin.pbenum.dart
│   │       │   │   ├── douyin.pbjson.dart
│   │       │   │   └── douyin.proto
│   │       │   └── twitch_danmaku.dart
│   │       ├── interface/
│   │       │   ├── live_danmaku.dart
│   │       │   └── live_site.dart
│   │       ├── model/
│   │       │   ├── live_anchor_item.dart
│   │       │   ├── live_category.dart
│   │       │   ├── live_category_result.dart
│   │       │   ├── live_message.dart
│   │       │   ├── live_play_quality.dart
│   │       │   ├── live_play_url.dart
│   │       │   ├── live_room_detail.dart
│   │       │   ├── live_room_item.dart
│   │       │   ├── live_search_result.dart
│   │       │   └── tars/
│   │       │       ├── get_cdn_token_ex_req.dart
│   │       │       ├── get_cdn_token_ex_resp.dart
│   │       │       ├── get_cdn_token_req.dart
│   │       │       ├── get_cdn_token_resp.dart
│   │       │       ├── huya_danmaku.dart
│   │       │       ├── tar2dart.dart
│   │       │       └── types.dart
│   │       └── platforms/
│   │           ├── bilibili/
│   │           │   └── bilibili_site.dart
│   │           ├── douyin/
│   │           │   ├── abogus.dart
│   │           │   ├── douyin_request_params.dart
│   │           │   ├── douyin_site.dart
│   │           │   └── douyin_utils.dart
│   │           ├── douyu/
│   │           │   └── douyu_site.dart
│   │           ├── huya/
│   │           │   ├── huya_site.dart
│   │           │   └── utils.dart
│   │           ├── readme.md
│   │           └── twitch/
│   │               ├── models.dart
│   │               └── twitch_site.dart
│   ├── packages/
│   │   └── tars_dart/
│   │       ├── .gitignore
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── analysis_options.yaml
│   │       ├── lib/
│   │       │   └── tars/
│   │       │       ├── codec/
│   │       │       │   ├── tars_decode_exception.dart
│   │       │       │   ├── tars_deep_copyable.dart
│   │       │       │   ├── tars_displayer.dart
│   │       │       │   ├── tars_encode_exception.dart
│   │       │       │   ├── tars_input_stream.dart
│   │       │       │   ├── tars_output_stream.dart
│   │       │       │   └── tars_struct.dart
│   │       │       ├── net/
│   │       │       │   └── base_tars_http.dart
│   │       │       └── tup/
│   │       │           ├── basic_class_type_util.dart
│   │       │           ├── const.dart
│   │       │           ├── object_create_exception.dart
│   │       │           ├── request_packet.dart
│   │       │           ├── tars_uni_packet.dart
│   │       │           ├── tup_response.dart
│   │       │           ├── tup_result_exception.dart
│   │       │           ├── uni_attribute.dart
│   │       │           ├── uni_packet.dart
│   │       │           └── write_buffer.dart
│   │       └── pubspec.yaml
│   ├── pubspec.yaml
│   └── test/
│       ├── douyu_sc.json
│       └── simple_live_core_test.dart
└── simple_live_tv_app/
    ├── .fvmrc
    ├── .gitignore
    ├── .metadata
    ├── README.md
    ├── analysis_options.yaml
    ├── android/
    │   ├── .gitignore
    │   ├── app/
    │   │   ├── build.gradle.kts
    │   │   ├── proguard-rules.pro
    │   │   └── src/
    │   │       ├── debug/
    │   │       │   └── AndroidManifest.xml
    │   │       ├── main/
    │   │       │   ├── AndroidManifest.xml
    │   │       │   ├── java/
    │   │       │   │   └── com/
    │   │       │   │       └── bgylde/
    │   │       │   │           └── live/
    │   │       │   │               └── MainActivity.java
    │   │       │   ├── kotlin/
    │   │       │   │   └── com/
    │   │       │   │       └── xycz/
    │   │       │   │           └── simple_live_tv/
    │   │       │   │               └── MainActivity.kt
    │   │       │   └── res/
    │   │       │       ├── drawable/
    │   │       │       │   └── launch_background.xml
    │   │       │       ├── drawable-v21/
    │   │       │       │   └── launch_background.xml
    │   │       │       ├── mipmap-anydpi-v26/
    │   │       │       │   └── ic_banner.xml
    │   │       │       ├── values/
    │   │       │       │   ├── ic_banner_background.xml
    │   │       │       │   └── styles.xml
    │   │       │       ├── values-night/
    │   │       │       │   └── styles.xml
    │   │       │       └── xml/
    │   │       │           └── network_security_config.xml
    │   │       └── profile/
    │   │           └── AndroidManifest.xml
    │   ├── build.gradle.kts
    │   ├── gradle/
    │   │   └── wrapper/
    │   │       └── gradle-wrapper.properties
    │   ├── gradle.properties
    │   └── settings.gradle.kts
    ├── assets/
    │   ├── lotties/
    │   │   ├── empty.json
    │   │   ├── error.json
    │   │   └── loadding.json
    │   └── statement.txt
    ├── lib/
    │   ├── app/
    │   │   ├── app_error.dart
    │   │   ├── app_focus_node.dart
    │   │   ├── app_style.dart
    │   │   ├── base_focus_model.dart
    │   │   ├── constant.dart
    │   │   ├── controller/
    │   │   │   ├── app_settings_controller.dart
    │   │   │   └── base_controller.dart
    │   │   ├── event_bus.dart
    │   │   ├── log.dart
    │   │   ├── sites.dart
    │   │   └── utils.dart
    │   ├── main.dart
    │   ├── models/
    │   │   ├── account/
    │   │   │   └── bilibili_user_info_page.dart
    │   │   ├── db/
    │   │   │   ├── follow_user.dart
    │   │   │   ├── follow_user.g.dart
    │   │   │   ├── history.dart
    │   │   │   └── history.g.dart
    │   │   ├── follow_user_item.dart
    │   │   └── version_model.dart
    │   ├── modules/
    │   │   ├── account/
    │   │   │   └── bilibili/
    │   │   │       ├── qr_login_controller.dart
    │   │   │       └── qr_login_page.dart
    │   │   ├── agreement/
    │   │   │   └── agreement_page.dart
    │   │   ├── category/
    │   │   │   ├── category_controller.dart
    │   │   │   ├── category_page.dart
    │   │   │   └── detail/
    │   │   │       ├── category_detail_controller.dart
    │   │   │       └── category_detail_page.dart
    │   │   ├── follow_user/
    │   │   │   └── follow_user_page.dart
    │   │   ├── history/
    │   │   │   ├── history_controller.dart
    │   │   │   └── history_page.dart
    │   │   ├── home/
    │   │   │   ├── home_controller.dart
    │   │   │   └── home_page.dart
    │   │   ├── hot_live/
    │   │   │   ├── hot_live_controller.dart
    │   │   │   └── hot_live_page.dart
    │   │   ├── live_room/
    │   │   │   ├── live_room_controller.dart
    │   │   │   ├── live_room_page.dart
    │   │   │   └── player/
    │   │   │       ├── player_controller.dart
    │   │   │       └── player_controls.dart
    │   │   ├── search/
    │   │   │   ├── anchor/
    │   │   │   │   ├── search_anchor_controller.dart
    │   │   │   │   └── search_anchor_page.dart
    │   │   │   └── room/
    │   │   │       ├── search_room_controller.dart
    │   │   │       └── search_room_page.dart
    │   │   ├── settings/
    │   │   │   ├── settings_controller.dart
    │   │   │   └── settings_page.dart
    │   │   └── sync/
    │   │       ├── sync_controller.dart
    │   │       └── sync_page.dart
    │   ├── requests/
    │   │   ├── common_request.dart
    │   │   ├── custom_log_interceptor.dart
    │   │   ├── http_client.dart
    │   │   └── http_error.dart
    │   ├── routes/
    │   │   ├── app_navigation.dart
    │   │   ├── app_pages.dart
    │   │   └── route_path.dart
    │   ├── services/
    │   │   ├── bilibili_account_service.dart
    │   │   ├── db_service.dart
    │   │   ├── follow_user_service.dart
    │   │   ├── local_storage_service.dart
    │   │   ├── signalr_service.dart
    │   │   └── sync_service.dart
    │   └── widgets/
    │       ├── app_scaffold.dart
    │       ├── button/
    │       │   ├── highlight_button.dart
    │       │   ├── highlight_list_tile.dart
    │       │   └── home_big_button.dart
    │       ├── card/
    │       │   ├── anchor_card.dart
    │       │   └── live_room_card.dart
    │       ├── highlight_widget.dart
    │       ├── keep_alive_wrapper.dart
    │       ├── net_image.dart
    │       ├── page_grid_view.dart
    │       ├── rectangular_indicator.dart
    │       ├── settings_item_widget.dart
    │       └── status/
    │           ├── app_empty_widget.dart
    │           ├── app_error_widget.dart
    │           └── app_loadding_widget.dart
    ├── pubspec.yaml
    ├── test/
    │   └── widget_test.dart
    └── windows/
        ├── .gitignore
        ├── CMakeLists.txt
        ├── flutter/
        │   ├── CMakeLists.txt
        │   ├── generated_plugin_registrant.cc
        │   ├── generated_plugin_registrant.h
        │   └── generated_plugins.cmake
        └── runner/
            ├── CMakeLists.txt
            ├── Runner.rc
            ├── flutter_window.cpp
            ├── flutter_window.h
            ├── main.cpp
            ├── resource.h
            ├── runner.exe.manifest
            ├── utils.cpp
            ├── utils.h
            ├── win32_window.cpp
            └── win32_window.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: BUG报告
title: "[BUG] 请填写简短易读的标题"
description: "使用过程中遇到了BUG"
assignees: SlotSun
labels:
  - "bug"
body:
  - type: checkboxes
    id: terms
    attributes:
      label: 提交前确认
      description: 在提交前,请确认以下内容
      options:
        - label: 先去Issues列表中查找下是否存在相似的Issue,如果有了就不要重复发了
          required: true
        - label: 我正在使用最新版本的 Slive
          required: true

  - type: textarea
    id: description
    validations:
      required: true
    attributes:
      label: BUG内容
      description: 请详细描述你遇到的问题

  - type: textarea
    id: steps
    validations:
      required: true
    attributes:
      label: 重现步骤
      render: plain text
      description: 请详细描述重现步骤
      placeholder: |
        1. xxxx
        2. xxxx
        3. xxxx

  - type: textarea
    id: screenshots
    attributes:
      label: 截图或视频
      description: 请上传BUG截图、或视频

  - type: textarea
    id: logs
    attributes:
      label: 日志
      description: 请上传日志文件
      placeholder: |
        可以在[其他设置]-[开启日志记录]后获取日志文件
 
  - type: dropdown
    id: release-type
    validations:
      required: true
    attributes:
      label: 使用版本来源
      description: 使用的是什么版本,从哪里下载的
      options:
        - 正式版(Releases)
        - 开发版(Actions)
        - 上游仓库(xiaoyaocz)
      default: 0

  - type: dropdown
    id: platform
    validations:
      required: true
    attributes:
      label: 运行平台
      description: 选择你当前运行应用的平台
      multiple: false
      options:
        - Windows
        - macOS
        - Linux
        - Android
        - iOS

  - type: input
    id: os-version
    attributes:
      label: 操作系统信息
      description: 请填写你的操作系统信息版本
      placeholder: ex. Windows 10 21H1 / MIUI 15 Android 12
    validations:
      required: true

  - type: input
    id: device
    attributes:
      label: 设备信息
      description: 请填写你的设备信息
      placeholder: ex. PC / iPhone 12 Pro Max
    validations:
      required: true

  - type: textarea
    id: remark
    attributes:
      label: 备注
      description: 其他信息


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: 功能请求
title: "[Feature] 请填写简短易读的标题"
description: "请求开发新的功能/优化某项功能"
assignees: SlotSun
labels:
  - "enhancement"
body:
  - type: markdown
    attributes:
      value: |
        你的Issue大概率会搁置很久,除非是那种我能随手解决的。
        暂时不会添加新的平台支持(因为我自己用不上)。如果你有开发能力,建议的自行开发后提交个PR。

  - type: checkboxes
    id: terms
    attributes:
      label: 非重复的Issue
      description: 先去Issues列表中查找下是否存在相似的Issue,如果有了就不要重复发了
      options:
        - label: 已确认没有相似的Issue
          required: true

  - type: textarea
    id: description
    validations:
      required: true
    attributes:
      label: 功能描述
      description: 请填写功能描述,如果你有多个建议、请求,请分开提交Issue

  - type: checkboxes
    id: platform
    attributes:
      label: 平台
      description: 这个功能针对什么平台
      options:
        - label: Android
        - label: iOS
        - label: MacOS
        - label: Windows
        - label: Linux

  - type: textarea
    id: additional
    attributes:
      label: 附加信息
      description: 可以附加相关截图、视频或链接(好让我知道要我抄哪个APP)



================================================
FILE: .github/workflows/docs-deploy.yaml
================================================
name: docs-deploy

on:
  workflow_dispatch:
  push:
    branches:
      - 'master'
    paths:
      - 'docs/**'

# 设置 GITHUB_TOKEN 的权限,以允许部署到 GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# 只允许同时进行一次部署,跳过正在运行和最新队列之间的运行队列
# 但是,不要取消正在进行的运行,因为我们希望允许这些生产部署完成
concurrency:
  group: pages
  cancel-in-progress: false

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: pnpm/action-setup@v3
        with:
          version: latest

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm
          cache-dependency-path: docs/pnpm-lock.yaml

      - name: Setup Pages
        uses: actions/configure-pages@v5

      - name: start build
        run: |
          pnpm install
          pnpm docs:build
        working-directory: docs

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs/.vitepress/dist

  # 部署工作
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    needs: build
    runs-on: ubuntu-latest
    name: Deploy
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

================================================
FILE: .github/workflows/pr.yaml
================================================
name: PR Check

on:
  pull_request:
    branches:
      - main
      - dev

jobs:
  build-mac-ios-android:
    runs-on: macos-latest
    steps:
      - name: Checkout PR code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'
          java-version: "21"
          cache: "gradle"

      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true

      - name: Enable Flutter Desktop
        run: flutter config --enable-macos-desktop

      - name: Restore packages
        run: |
          cd simple_live_app
          flutter pub get

      - name: Install appdmg
        run: npm install -g appdmg

      - name: Install fast-forge
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate

      - name: Setup Xcode
        uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: latest-stable

      - name: Build APK
        run: |
          cd simple_live_app
          flutter build apk --debug

      - name: Build IPA
        run: |
          cd simple_live_app
          flutter build ios --no-codesign

      - name: Build MacOS
        run: |
          cd simple_live_app
          fastforge package --platform macos --targets dmg,zip --skip-clean

  build-linux:
    strategy:
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
          - runner: ubuntu-24.04-arm
            arch: aarch64
    runs-on: ${{ matrix.runner }}
    steps:
      - name: Checkout PR code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          channel: master

      - name: Install Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y clang cmake libgtk-3-dev unzip libasound2-dev gcc g++ autoconf automake \
              debhelper glslang-dev ladspa-sdk xutils-dev libasound2-dev libarchive-dev libbluray-dev \
              libdav1d-dev libdvdnav-dev libegl1-mesa-dev libepoxy-dev libfontconfig-dev libfreetype6-dev \
              libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgsm1-dev libharfbuzz-dev libjpeg-dev \
              libbrotli-dev liblcms2-dev libmodplug-dev libmp3lame-dev libopenal-dev \
              libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev \
              libsdl2-dev libsixel-dev libssh-dev libsoxr-dev libspeex-dev libtool \
              libv4l-dev libva-dev libvdpau-dev libvorbis-dev libvo-amrwbenc-dev \
              libunwind-dev libvpx-dev libwayland-dev libx11-dev libxext-dev libdrm-dev \
              libxkbcommon-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev \
              linux-libc-dev nasm ninja-build pkg-config python3 python3-docutils wayland-protocols \
              x11proto-core-dev zlib1g-dev libfdk-aac-dev libtheora-dev libwebp-dev \
              unixodbc-dev libpq-dev libxxhash-dev libaom-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev

      - name: Enable Flutter Desktop
        run: flutter config --enable-linux-desktop

      - name: Restore Packages
        run: |
          cd simple_live_app
          flutter pub get

      - name: Install fast-forge
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate

      - name: Build Linux
        run: |
          cd simple_live_app
          fastforge package --platform linux --targets deb,zip --skip-clean
          cd build/dist/*
          mv simple_live_app-*-linux.deb simplelive-${{ matrix.arch }}-linux.deb
          mv simple_live_app-*-linux.zip simplelive-${{ matrix.arch }}-linux.zip

  build-windows:
    runs-on: windows-latest
    steps:
      - name: Checkout PR code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true

      - name: Enable Flutter Desktop
        run: flutter config --enable-windows-desktop

      - name: Restore Packages
        run: |
          cd simple_live_app
          flutter clean
          flutter pub get

      - name: Install fast-forge
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate

      - name: Build Windows
        run: |
          cd simple_live_app
          fastforge package --platform windows --targets msix,zip --skip-clean

  # 打包 Flatpak
  build-flatpak:
    strategy:
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
          - runner: ubuntu-24.04-arm
            arch: aarch64
    runs-on: ${{ matrix.runner }}
    permissions:
      contents: write
    steps:
      # 签出代码
      - name: Checkout PR code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}
      # 安装依赖
      - name: Install dependencies
        run: |
          sudo add-apt-repository -y ppa:flatpak/stable
          sudo apt-get update -q
          sudo apt-get install -y flatpak flatpak-builder ca-certificates gnupg software-properties-common
          flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
          git config --global protocol.file.allow always
      # 构建 Flatpak bundle
      - name: Build flatpak
        run: |
          flatpak-builder build-dir flatpak/flatpak-manifest.yaml \
            --arch=${{ matrix.arch }} \
            --repo=${{ matrix.arch }} \
            --force-clean \
            --user \
            --install-deps-from=flathub \
            --ccache \
            --disable-rofiles-fuse


================================================
FILE: .github/workflows/publish_app_dev.yaml
================================================
name: app-build-action-dev

on:
  workflow_dispatch:
  push:
    branches:
      - 'dev'

# If previous workflow is still running, we push again, we will cancel the previous workflow
concurrency:
  group: ${{ github.workflow }}-${{ github.ref_name }}
  cancel-in-progress: true

jobs:

  # packing android on ubuntu, macos slowly
  build-android:
    runs-on: ubuntu-latest
    permissions: write-all

    steps:
      # 签出代码
      - uses: actions/checkout@v6
        with:
          ref: dev

      # APK 签名设置
      - name: Download Android keystore
        id: android_keystore
        uses: timheuer/base64-to-file@v1.2
        with:
          fileName: keystore.jks
          encodedString: ${{ secrets.KEYSTORE_BASE64 }}
      - name: Create key.properties
        run: |
          echo "${{ secrets.FIREBASE_JSON }}" | base64 --decode > simple_live_app/android/app/google-services.json
          echo "${{ secrets.FIREBASE_OPTIONS_DART }}" | base64 --decode > simple_live_app/lib/firebase_options.dart
          echo "storeFile=${{ steps.android_keystore.outputs.filePath }}" > simple_live_app/android/key.properties
          echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> simple_live_app/android/key.properties
          echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> simple_live_app/android/key.properties
          echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> simple_live_app/android/key.properties

      # 设置 JAVA 环境
      - uses: actions/setup-java@v5
        with:
          distribution: "zulu"
          java-version: "17"
          cache: "gradle"
          cache-dependency-path: |
            simple_live_app/android/*.gradle*
            simple_live_app/android/**/gradle-wrapper.properties

      # 设置 Flutter
      - name: Flutter action
        uses: subosito/flutter-action@v2
        with:
          channel: stable
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true

      # 更新 Flutter 的 packages
      - name: Restore packages
        run: |
          cd simple_live_app
          flutter pub get

      # 打包 APK
      - name: Build APK
        run: |
          cd simple_live_app
          flutter build apk --release --split-per-abi

      # 上传 Artifacts
      - name: Upload APK to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: android
          path: |
            simple_live_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
            simple_live_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
            simple_live_app/build/app/outputs/flutter-apk/app-x86_64-release.apk
      

  # 打包iOS、Mac
  build-mac-ios:
    # https://github.com/actions/runner-images/issues/12541
    runs-on: macos-15

    permissions:
      contents: write

    steps:
      # 签出代码
      - uses: actions/checkout@v4
        with:
          ref: dev

      # 设置 JAVA 环境
      - uses: actions/setup-java@v4
        with:
          distribution: 'zulu'
          java-version: "21"
          cache: "gradle"

      # 设置 Flutter
      - name: Flutter action
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true 

      # 打开 MAC Desktop 支持
      - name: Enable Flutter Desktop
        run: flutter config --enable-macos-desktop

      # 更新 Flutter 的 packages
      - name: Restore packages
        run: |
          cd simple_live_app
          flutter pub get

      # 安装 appdmg npm install -g appdmg
      - name: Install appdmg
        run: npm install -g appdmg

      # 设置 Fastforge 环境
      - name: Install fast-forge
        run: | 
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate

      # 打包 iOS
      - name: Build IPA
        run: |
          cd simple_live_app
          flutter build ios --release --no-codesign

      # 创建未签名 ipa
      - name: Create IPA
        run: |
          cd simple_live_app
          mkdir build/ios/iphoneos/Payload
          cp -R build/ios/iphoneos/Runner.app build/ios/iphoneos/Payload/Runner.app
          cd build/ios/iphoneos/
          zip -q -r ios_no_sign.ipa Payload
          cd ../../..

      # 上传 IPA 至 Artifacts
      - name: Upload IPA to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: ios
          path: |
            simple_live_app/build/ios/iphoneos/ios_no_sign.ipa

      # 打包 MAC
      - name: Build MacOS
        run: |
          cd simple_live_app
          fastforge package --platform macos --targets dmg,zip --skip-clean
      
      # 上传 MAC 至 Artifacts
      - name: Upload MacOS to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: mac
          path: |
            simple_live_app/build/dist/*/*.dmg
            simple_live_app/build/dist/*/*.zip
      # 完成
      - run: echo "🍏 This job's status is ${{ job.status }}."

  # 打包 Linux
  build-linux:
    strategy:
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
          - runner: ubuntu-24.04-arm
            arch: aarch64
    runs-on: ${{ matrix.runner }}
    permissions:
      contents: write
    steps:
      # 签出代码
      - uses: actions/checkout@v4
        with:
          ref: dev
      # 设置 Flutter 环境
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          channel: master
      # 安装依赖
      - name: Update apt-get
        run: sudo apt-get update
      - name: Install Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y clang cmake libgtk-3-dev unzip libasound2-dev gcc g++ autoconf automake \
              debhelper glslang-dev ladspa-sdk xutils-dev libasound2-dev libarchive-dev libbluray-dev \
              libdav1d-dev libdvdnav-dev libegl1-mesa-dev libepoxy-dev libfontconfig-dev libfreetype6-dev \
              libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgsm1-dev libharfbuzz-dev libjpeg-dev \
              libbrotli-dev liblcms2-dev libmodplug-dev libmp3lame-dev libopenal-dev \
              libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev \
              libsdl2-dev libsixel-dev libssh-dev libsoxr-dev libspeex-dev libtool \
              libv4l-dev libva-dev libvdpau-dev libvorbis-dev libvo-amrwbenc-dev \
              libunwind-dev libvpx-dev libwayland-dev libx11-dev libxext-dev libdrm-dev \
              libxkbcommon-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev \
              linux-libc-dev nasm ninja-build pkg-config python3 python3-docutils wayland-protocols \
              x11proto-core-dev zlib1g-dev libfdk-aac-dev libtheora-dev libwebp-dev \
              unixodbc-dev libpq-dev libxxhash-dev libaom-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev
      # 打开 Linux Desktop 支持
      - name: Enable Flutter Desktop
        run: flutter config --enable-linux-desktop
      # 更新 Flutter 的 packages
      - name: Restore Packages
        run: |
          cd simple_live_app
          flutter pub get
      # 设置 Fastforge 环境
      - name: Install fast-forge
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate
      # build Linux DEB \ ZIP
      - name: Build Linux
        run: |
          cd simple_live_app
          fastforge package --platform linux --targets deb,zip --skip-clean
          cd build/dist/*
          mv simple_live_app-*-linux.deb Slive-${{ matrix.arch }}-linux.deb
          mv simple_live_app-*-linux.zip Slive-${{ matrix.arch }}-linux.zip
      # 上传 Linux 包至 Artifacts
      - name: Upload Linux APP to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: linux-${{ matrix.arch }}
          path: |
            simple_live_app/build/dist/*/*.deb
            simple_live_app/build/dist/*/*.zip

      # 完成
      - run: echo "🍏 Linux job's status is ${{ job.status }}."

  # 打包 Windows
  build-windows:
    runs-on: windows-latest
    permissions:
      contents: write
    steps:
      # 签出代码
      - uses: actions/checkout@v4
        with:
          ref: dev
      # 设置 Flutter 环境
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true
      - name: Enable Flutter Desktop
        run: flutter config --enable-windows-desktop
      - name: Restore Packages
        run: |
          cd simple_live_app
          flutter clean
          flutter pub get
      # 设置 Fastforge 环境 和 Inno Setup
      - name: Install fast-forge and Inno Setup
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate
          choco install innosetup
      # 添加中文安装引导
      - name: Add Chinese language file for Inno Setup
        run: |
          cd simple_live_app
          Copy-Item "windows/packaging/exe/ChineseSimplified.isl" "C:\Program Files (x86)\Inno Setup 6\Languages\ChineseSimplified.isl"
        shell: powershell
      # build Windows ZIP\MSIX\EXE
      - name: Build Windows
        run: |
          cd simple_live_app
          fastforge package --platform windows --targets msix,zip,exe --skip-clean
          cd build/dist/*
          Get-ChildItem "simple_live_app-*" | ForEach-Object {
              $newName = $_.Name -replace '^simple_live_app', 'Slive'
              Rename-Item $_ -NewName $newName
          }
        shell: pwsh
      # 上传 Windows 至 Artifacts
      - name: Upload Windows APP to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: windows
          path: |
            simple_live_app/build/dist/*/*.msix
            simple_live_app/build/dist/*/*.zip
            simple_live_app/build/dist/*/*.exe
      # 完成
      - run: echo "🍏 Windows job's status is ${{ job.status }}."

  # 打包 Flatpak
  build-flatpak:
    strategy:
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
          - runner: ubuntu-24.04-arm
            arch: aarch64
    runs-on: ${{ matrix.runner }}
    permissions:
      contents: write
    steps:
      # 签出代码
      - uses: actions/checkout@v4
        with:
          ref: dev
      # 安装依赖
      - name: Install dependencies
        run: |
          sudo add-apt-repository -y ppa:flatpak/stable
          sudo apt-get update -q
          sudo apt-get install -y flatpak flatpak-builder ca-certificates gnupg software-properties-common
          flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
          git config --global protocol.file.allow always
      # 构建 Flatpak bundle
      - name: Build flatpak bundle
        run: |
          flatpak-builder build-dir flatpak/flatpak-manifest.yaml \
            --arch=${{ matrix.arch }} \
            --repo=${{ matrix.arch }} \
            --force-clean \
            --user \
            --install-deps-from=flathub \
            --ccache \
            --disable-rofiles-fuse
          flatpak build-bundle ${{ matrix.arch }} Slive-${{ matrix.arch }}.flatpak io.github.SlotSun.Slive

      # 上传 Flatpak 包至 Artifacts
      - name: Upload linux flatpak to artifacts
        uses: actions/upload-artifact@v4
        with:
          name: linux-flatpak-${{ matrix.arch }}
          path: Slive-*.flatpak

      # 完成
      - run: echo "🍏 Flatpak job's status is ${{ job.status }}."


================================================
FILE: .github/workflows/publish_app_release.yml
================================================
name: app-build-action-release
# 推送 Tag 时触发
on:
  workflow_dispatch: # 允许手动触发
  push:
    tags:
      - "v*"
jobs:
  # 打包 Android
  build-android:
    runs-on: ubuntu-latest
    permissions: write-all

    steps:
      # 签出代码
      - uses: actions/checkout@v6

      # APK 签名设置
      - name: Download Android keystore
        id: android_keystore
        uses: timheuer/base64-to-file@v1.2
        with:
          fileName: keystore.jks
          encodedString: ${{ secrets.KEYSTORE_BASE64 }}
      - name: Create key.properties
        run: |
          echo "${{ secrets.FIREBASE_JSON }}" | base64 --decode > simple_live_app/android/app/google-services.json
          echo "${{ secrets.FIREBASE_OPTIONS_DART }}" | base64 --decode > simple_live_app/lib/firebase_options.dart
          echo "storeFile=${{ steps.android_keystore.outputs.filePath }}" > simple_live_app/android/key.properties
          echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> simple_live_app/android/key.properties
          echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> simple_live_app/android/key.properties
          echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> simple_live_app/android/key.properties

      # 设置 JAVA 环境
      - uses: actions/setup-java@v5
        with:
          distribution: "zulu"
          java-version: "17"
          cache: "gradle"
          cache-dependency-path: |
            simple_live_app/android/*.gradle*
            simple_live_app/android/**/gradle-wrapper.properties

      # 设置 Flutter
      - name: Flutter action
        uses: subosito/flutter-action@v2
        with:
          channel: stable
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true

      # 更新 Flutter 的 packages
      - name: Restore packages
        run: |
          cd simple_live_app
          flutter pub get

      # 打包 APK
      - name: Build APK
        run: |
          cd simple_live_app
          flutter build apk --release --split-per-abi

      # 上传 APK 至 Artifacts
      - name: Upload APK to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: android
          path: |
            simple_live_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
            simple_live_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
            simple_live_app/build/app/outputs/flutter-apk/app-x86_64-release.apk

      # 读取版本信息
      - name: Read version
        id: version
        uses: juliangruber/read-file-action@v1
        with:
          path: assets/app_version.json
      - name: Echo version
        run: echo "${{ fromJson(steps.version.outputs.content).version }}"
      - name: Echo version content
        run: echo "${{ fromJson(steps.version.outputs.content).version_desc }}"

      # 上传至 Release
      - name: Upload Release
        uses: softprops/action-gh-release@v1
        with:
          name: "${{ fromJson(steps.version.outputs.content).version }}"
          body: "${{ fromJson(steps.version.outputs.content).version_desc }}"
          prerelease: ${{ fromJson(steps.version.outputs.content).prerelease }}
          token: ${{ secrets.TOKEN }}
          files: |
            simple_live_app/build/app/outputs/flutter-apk/app-x86_64-release.apk
            simple_live_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
            simple_live_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
      # 完成
      - run: echo "🍏 This job's status is ${{ job.status }}."

  # 打包 Linux
  build-linux:
    strategy:
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
          - runner: ubuntu-24.04-arm
            arch: aarch64
    runs-on: ${{ matrix.runner }}
    permissions:
      contents: write
    steps:
      # 签出代码
      - uses: actions/checkout@v4
      # 设置 Flutter 环境
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          channel: master
      # 安装依赖
      - name: Update apt-get
        run: sudo apt-get update
      - name: Install Dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y clang cmake libgtk-3-dev unzip libasound2-dev gcc g++ autoconf automake \
              debhelper glslang-dev ladspa-sdk xutils-dev libasound2-dev libarchive-dev libbluray-dev \
              libdav1d-dev libdvdnav-dev libegl1-mesa-dev libepoxy-dev libfontconfig-dev libfreetype6-dev \
              libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgsm1-dev libharfbuzz-dev libjpeg-dev \
              libbrotli-dev liblcms2-dev libmodplug-dev libmp3lame-dev libopenal-dev \
              libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev \
              libsdl2-dev libsixel-dev libssh-dev libsoxr-dev libspeex-dev libtool \
              libv4l-dev libva-dev libvdpau-dev libvorbis-dev libvo-amrwbenc-dev \
              libunwind-dev libvpx-dev libwayland-dev libx11-dev libxext-dev libdrm-dev \
              libxkbcommon-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev \
              linux-libc-dev nasm ninja-build pkg-config python3 python3-docutils wayland-protocols \
              x11proto-core-dev zlib1g-dev libfdk-aac-dev libtheora-dev libwebp-dev \
              unixodbc-dev libpq-dev libxxhash-dev libaom-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev
      # 打开 Linux Desktop 支持
      - name: Enable Flutter Desktop
        run: flutter config --enable-linux-desktop
      # 更新 Flutter 的 packages
      - name: Restore Packages
        run: |
          cd simple_live_app
          flutter pub get
      # 设置 Fastforge 环境
      - name: Install fast-forge
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate
      # build Linux DEB\ZIP
      - name: Build Linux
        run: |
          cd simple_live_app
          fastforge package --platform linux --targets deb,zip --skip-clean
          cd build/dist/*
          mv simple_live_app-*-linux.deb Slive-${{ matrix.arch }}-linux.deb
          mv simple_live_app-*-linux.zip Slive-${{ matrix.arch }}-linux.zip
      # 上传 Linux 包至 Artifacts
      - name: Upload Linux APP to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: linux-${{ matrix.arch }}
          path: |
            simple_live_app/build/dist/*/*.deb
            simple_live_app/build/dist/*/*.zip

      # 读取版本信息
      - name: Read version
        id: version
        uses: juliangruber/read-file-action@v1
        with:
          path: assets/app_version.json
      - name: Echo version
        run: echo "${{ fromJson(steps.version.outputs.content).version }}"
      - name: Echo version content
        run: echo "${{ fromJson(steps.version.outputs.content).version_desc }}"

      # 上传至Release
      - name: Upload Release
        uses: softprops/action-gh-release@v1
        with:
          name: "${{ fromJson(steps.version.outputs.content).version }}"
          body: "${{ fromJson(steps.version.outputs.content).version_desc }}"
          prerelease: ${{ fromJson(steps.version.outputs.content).prerelease }}
          token: ${{ secrets.TOKEN }}
          files: |
            simple_live_app/build/dist/*/*.deb
            simple_live_app/build/dist/*/*.zip
      # 完成
      - run: echo "🍏 Linux job's status is ${{ job.status }}."

  # 打包Windows
  build-windows:
    runs-on: windows-latest
    permissions:
      contents: write
    steps:
      # 签出代码
      - uses: actions/checkout@v4
      # 设置 Flutter 环境
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_app/pubspec.yaml
          cache: true
          channel: "stable"
      - name: Enable Flutter Desktop
        run: flutter config --enable-windows-desktop
      - name: Restore Packages
        run: |
          cd simple_live_app
          flutter pub get
      # 设置 Fastforge 环境 和 Inno Setup
      - name: Install Fastforge and Inno Setup
        run: |
          git clone https://github.com/SlotSun/fastforge.git
          cd fastforge
          dart pub global activate melos
          melos run activate
          choco install innosetup
      # 添加中文安装引导
      - name: Add Chinese language file for Inno Setup
        run: |
          cd simple_live_app
          Copy-Item "windows/packaging/exe/ChineseSimplified.isl" "C:\Program Files (x86)\Inno Setup 6\Languages\ChineseSimplified.isl"
        shell: powershell
      # build Windows ZIP\MSIX\EXE
      - name: Build Windows
        run: |
          cd simple_live_app
          fastforge package --platform windows --targets msix,zip,exe --skip-clean
          cd build/dist/*
          Get-ChildItem "simple_live_app-*" | ForEach-Object {
              $newName = $_.Name -replace '^simple_live_app', 'Slive'
              Rename-Item $_ -NewName $newName
          }
        shell: pwsh
      # 上传 Windows 至 Artifacts
      - name: Upload Windows APP to Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: windows
          path: |
            simple_live_app/build/dist/*/*.msix
            simple_live_app/build/dist/*/*.zip
            simple_live_app/build/dist/*/*.exe

      # 读取版本信息
      - name: Read version
        id: version
        uses: juliangruber/read-file-action@v1
        with:
          path: assets/app_version.json
      - name: Echo version
        run: echo "${{ fromJson(steps.version.outputs.content).version }}"
      - name: Echo version content
        run: echo "${{ fromJson(steps.version.outputs.content).version_desc }}"

      # 上传至 Release
      - name: Upload Release
        uses: softprops/action-gh-release@v1
        with:
          name: "${{ fromJson(steps.version.outputs.content).version }}"
          body: "${{ fromJson(steps.version.outputs.content).version_desc }}"
          prerelease: ${{ fromJson(steps.version.outputs.content).prerelease }}
          token: ${{ secrets.TOKEN }}
          files: |
            simple_live_app/build/dist/*/*.msix
            simple_live_app/build/dist/*/*.zip
            simple_live_app/build/dist/*/*.exe

      # 完成
      - run: echo "🍏 Windows job's status is ${{ job.status }}."

  # 打包 Flatpak
  build-flatpak:
    strategy:
      matrix:
        include:
          - runner: ubuntu-24.04
            arch: x86_64
          - runner: ubuntu-24.04-arm
            arch: aarch64
    runs-on: ${{ matrix.runner }}
    permissions:
      contents: write
    steps:
      # 签出代码
      - uses: actions/checkout@v4
      # 安装依赖
      - name: Install dependencies
        run: |
          sudo add-apt-repository -y ppa:flatpak/stable
          sudo apt-get update -q
          sudo apt-get install -y flatpak flatpak-builder ca-certificates gnupg software-properties-common
          flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
          git config --global protocol.file.allow always
      # 构建 Flatpak bundle
      - name: Build flatpak bundle
        run: |
          flatpak-builder build-dir flatpak/flatpak-manifest.yaml \
            --arch=${{ matrix.arch }} \
            --repo=${{ matrix.arch }} \
            --force-clean \
            --user \
            --install-deps-from=flathub \
            --ccache \
            --disable-rofiles-fuse
          flatpak build-bundle ${{ matrix.arch }} Slive-${{ matrix.arch }}.flatpak io.github.SlotSun.Slive

      # 上传 Flatpak 包至 Artifacts
      - name: Upload linux flatpak to artifacts
        uses: actions/upload-artifact@v4
        with:
          name: linux-flatpak-${{ matrix.arch }}
          path: Slive-*.flatpak

      # 读取版本信息
      - name: Read version
        id: version
        uses: juliangruber/read-file-action@v1
        with:
          path: assets/app_version.json
      - name: Echo version
        run: echo "${{ fromJson(steps.version.outputs.content).version }}"
      - name: Echo version content
        run: echo "${{ fromJson(steps.version.outputs.content).version_desc }}"

      # 上传至 Release
      - name: Upload Release
        uses: softprops/action-gh-release@v1
        with:
          name: "${{ fromJson(steps.version.outputs.content).version }}"
          body: "${{ fromJson(steps.version.outputs.content).version_desc }}"
          prerelease: ${{ fromJson(steps.version.outputs.content).prerelease }}
          token: ${{ secrets.TOKEN }}
          files: Slive-*.flatpak
      # 完成
      - run: echo "🍏 Flatpak job's status is ${{ job.status }}."


================================================
FILE: .github/workflows/publish_tv_app_release.yaml
================================================
name: app-tv-build-action-release
# 手动触发
on:
  workflow_dispatch:
jobs:
  build-tv:
    runs-on: macos-latest
    permissions:
      contents: write
    steps:
      # 签出代码 
      - uses: actions/checkout@v4
        with:
          ref: master
        
      # APK 签名设置
      - name: Download Android keystore
        id: android_tv_keystore
        uses: timheuer/base64-to-file@v1.2
        with:
          fileName: keystore.jks
          encodedString: ${{ secrets.TV_KEYSTORE_BASE64 }}
      - name: Create key.properties
        run: |
          echo "storeFile=${{ steps.android_tv_keystore.outputs.filePath }}" > simple_live_tv_app/android/key.properties
          echo "storePassword=${{ secrets.TV_STORE_PASSWORD }}" >> simple_live_tv_app/android/key.properties
          echo "keyPassword=${{ secrets.TV_KEY_PASSWORD }}" >> simple_live_tv_app/android/key.properties
          echo "keyAlias=${{ secrets.TV_KEY_ALIAS }}" >> simple_live_tv_app/android/key.properties

      # 设置 JAVA 环境
      - uses: actions/setup-java@v4
        with:
          distribution: 'zulu'
          java-version: "17"
          cache: "gradle"
    
      # 设置 Flutter
      - name: Flutter action
        uses: subosito/flutter-action@v2
        with:
          flutter-version-file: simple_live_tv_app/pubspec.yaml
          cache: true

      # 更新 Flutter 的 packages
      - name: Restore packages
        run: |
          cd simple_live_tv_app
          flutter pub get
        
      # 打包 APK
      - name: Build APK
        run: |
          cd simple_live_tv_app
          flutter build apk --release --split-per-abi
    
      # 上传 APK 至 Artifacts
      - name: Upload APK to Artifacts
        uses: actions/upload-artifact@v3
        with:
          name: android_tv
          path: |
            simple_live_tv_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
            simple_live_tv_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
            simple_live_tv_app/build/app/outputs/flutter-apk/app-x86_64-release.apk
    
      # 读取版本信息
      - name: Read version
        id: version
        uses: juliangruber/read-file-action@v1
        with:
          path: assets/tv_app_version.json
      - name: Echo version
        run: echo "${{ fromJson(steps.version.outputs.content).version }}"
      - name: Echo version content
        run: echo "${{ fromJson(steps.version.outputs.content).version_desc }}"
    
      # 上传至 Release
      - name: Upload Release
        uses: softprops/action-gh-release@v1
        with:
          name: "${{ fromJson(steps.version.outputs.content).version }}"
          body: "# Android TV \n${{ fromJson(steps.version.outputs.content).version_desc }}"
          prerelease: ${{ fromJson(steps.version.outputs.content).prerelease }}
          token: ${{ secrets.TOKEN }}
          files: |
            simple_live_tv_app/build/app/outputs/flutter-apk/app-x86_64-release.apk
            simple_live_tv_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
            simple_live_tv_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
        
      # 完成
      - run: echo "🍏 This job's status is ${{ job.status }}."


================================================
FILE: .gitignore
================================================
simple_live_app/.vscode/settings.json
simple_live_tv_app/.vscode/settings.json
.idea/
.vscode/
.vercel/
.flatpak-builder/
.crush/
CRUSH.md
build/
dev-tool.ps1
*.py


================================================
FILE: CONTRIBUTING.md
================================================
# 开发贡献指南 / Contributing Guide

感谢你对 Slive 的关注!欢迎各种形式的贡献,无论是修复 bug、添加新功能、改进文档还是提出建议。
## 贡献须知
- 因为一些原因,**dev** 作为Github Flow开发流程的主干
- **master** 分支发版时 通过 merge squash dev,会在停更时删除dev分支并脱敏
- 所以仓库的贡献者包括贡献代码统计都是不存在的

## 🎯 贡献类型

欢迎以下类型的贡献:

### 🐛 修复 Bug
- 在 Issues 中查找标记为 `bug` 的问题
- 如果发现新的 bug,请先[创建 Issue](https://github.com/SlotSun/dart_simple_live/issues/new/choose) 描述问题

### ✨ 添加新功能
- 查找标记为 `enhancement`的 Issue
- 对于较大的功能,建议先创建 Issue 讨论设计方案

### 📖 改进文档
- 修复文档中的错误或不清晰的地方
- 添加使用示例和最佳实践

### 🧪 添加测试
- 为现有功能添加单元测试
- 改进测试覆盖率
- 添加集成测试

### 🎨 UI/UX 改进
- 优化界面交互体验
- 修复界面样式问题
- 提升易用性

## 🚀 快速开始

### 前置要求

确保你的环境中已安装: 

- **Flutter 3.38.6^**
- **Rust 1.28^**
- **Visual Studio**

### 安装 FVM

```bash
# macOS/Linux
curl -sL https://install.fvm.sh | bash

# Windows
choco install fvm
```

### 安装 Flutter

```bash
# windows
fvm version
fvm list
fvm install 3.38.6
```

**Linux**
[详见官网教程](https://docs.flutter.dev/install/manual)

### 克隆仓库

```bash
git clone https://github.com/SlotSun/dart_simple_live.git
cd dart_simple_live/simple_live_app
```

## 🏷️ 认领任务

### 查找任务

1. 浏览 [Issues 页面](https://github.com/SlotSun/dart_simple_live/issues)
2. 查找带有以下标签的 Issue:
    - `help wanted` - 需要社区帮助的任务
    - `bug` - Bug 修复
    - `enhancement` - 功能增强

### 认领流程

在你想要处理的 Issue 下评论:
```
/assign me
```

或者:
```
我可以解决此问题
```


## 💻 本地开发

### 1. 安装依赖

**Flutter依赖**:
```bash
fvm use 3.38.6
# 安装Flutter_rust_bridge
cargo install flutter_rust_bridge_codegen
flutter pub get
```

### 2. 启动开发服务器

**启动APP**(支持热重载):
```bash
flutter run
```

### 3. 构建项目

**安装 fastforge**
```bash
git clone https://github.com/SlotSun/fastforge.git
cd fastforge
dart pub global activate melos
melos run activate
```
**Windows-安装 innosetup**
```bash
# 打包 windows
choco install innosetup
```
**构建APP**:
```bash
# bash in simple_live_app
cd simple_live_app
# 打包 windows
fastforge package --platform windows --targets msix,zip,exe --skip-clean
# Linux
fastforge package --platform linux --targets deb,zip --skip-clean
# Android-need key
flutter build apk --release --split-per-abi
```

## 📁 代码结构

### 项目目录速览
- `simple_live_core` 项目核心库,实现获取各个网站的信息及弹幕。
- `simple_live_console` 基于simple_live_core的控制台程序。
- `simple_live_app` 基于核心库实现的Flutter APP客户端。
- `simple_live_tv_app` 基于核心库实现的Flutter Android TV客户端。

### 技术栈

**Flutter**:
- GetX(状态管理、路由)
- Hive(持久化)
- Dio(实时通信)

## 📝 提交规范

我们遵循 [Conventional Commits](https://www.conventionalcommits.org/) 规范:

### Commit 格式

```
<类型>(<范围>): <简短描述>

[可选的详细描述]

[可选的脚注]
```

### 类型 (Type)

- `feat`: 新功能
- `fix`: Bug 修复
- `docs`: 文档变更
- `style`: 代码格式调整(不影响功能)
- `refactor`: 重构(既不是新功能也不是 bug 修复)
- `perf`: 性能优化
- `test`: 添加或修改测试
- `chore`: 辅助工具的变动
- `ci`: 构建过程的变动

### 范围 (Scope)

可选,指明改动的模块:
- `platfrom` - 直播平台
- `Windows/Linux/Android` - 用户平台
- `ui` - 用户界面
- `ci` - 构建系统
- `docs` - 文档

### 示例

```bash
feat(api): add layered agent support
```

## 🔍 Pull Request 要求
### PR 流程
```bash
git clone https://github.com/SlotSun/dart_simple_live.git
# 基于dev分支创建 Type-Scope的分支
git checkout -b fix-xx origin/dev
```
**完成测试后,向主仓库的dev分支提交pr**
### 提交前检查清单

- [ ] 代码通过格式检查
- [ ] 对于新功能,添加了相应的文档说明
- [ ] 对于 UI 改动,提供了截图或录屏
- [ ] Commit 信息遵循规范格式
- [ ] PR 描述清晰说明了改动内容和原因

### PR 标题格式

PR 标题应该简洁明了,建议格式:

```
<类型>: <简短描述>
```

例如:
- `feat: add WiFi device pairing support`
- `fix: resolve video stream crash on device disconnect`
- `docs: improve quick start guide`

### PR 描述模板

提交 PR 时,请使用以下模板:

```markdown
## 改动说明

<!-- 简要描述这个 PR 做了什么 -->

## 相关 Issue

<!-- 关联的 Issue 编号,如 Closes #123 -->

## 改动类型

- [ ] Bug 修复
- [ ] 新功能
- [ ] 文档更新
- [ ] 代码重构
- [ ] 性能优化
- [ ] 其他(请说明)

## 测试说明

<!-- 如何测试这些改动? -->

## 截图/录屏

<!-- 对于 UI 改动,请提供截图或录屏 -->

## 其他说明

<!-- 其他需要说明的内容 -->
```

### Code Review

提交 PR 后:
1. 维护者会审查你的代码
2. 可能会提出改进建议
3. 请及时回复评论并根据反馈调整代码
4. 所有讨论解决后,PR 会被合并

## 🤝 行为准则

### 我们的承诺

为了营造一个开放和友好的环境,我们承诺:

- 尊重不同的观点和经验
- 优雅地接受建设性批评
- 关注对社区最有利的事情
- 对其他社区成员表示同理心

### 不可接受的行为

以下行为被视为不可接受:

- 使用性别化的语言或图像,以及不受欢迎的性关注
- 骚扰性评论、侮辱性/贬损性评论,以及人身或政治攻击
- 公开或私下骚扰
- 未经明确许可,发布他人的私人信息
- 其他在专业环境中可能被认为不适当的行为

## 🎉 感谢贡献

感谢你花时间为 Slive 做出贡献!你的努力让这个项目变得更好。

有任何问题?欢迎:
- 在 [Issues](https://github.com/SlotSun/dart_simple_live/issues) 提问

---

================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================


<p align="center">
    <img width="128" src="/assets/logo.png" alt="Simple Live logo">
</p>
<h2 align="center">Slive</h2>

<p align="center">
我就默默看你表演
</p>

![浅色模式](/assets/screenshot_light.jpg)

![深色模式](/assets/screenshot_dark.jpg)

## 支持直播平台:

- 虎牙直播

- 斗鱼直播

- 哔哩哔哩直播

- 抖音直播

## APP支持平台

- [x] Android
- [x] Windows
- [x] Linux
- [x] iOS `自测`
- [x] MacOS `自测`
- [ ] Android TV `请自行打包` [说明](https://github.com/SlotSun/dart_simple_live/issues/89)

#### Arch Linux: 
```bash 
  yay -S slive
  yay -S slive-bin
```

只保证Android, Linux和Windows可用性

请到[Releases](https://github.com/slotsun/dart_simple_live/releases)下载最新版本,iOS请到上游或者action下载体验

如果想体验最新功能,可前往[Actions](https://github.com/slotsun/dart_simple_live/actions)下载自动打包的开发版本

Windows建议下载UWP版[聚合直播](https://www.microsoft.com/store/apps/9N1TWG2G84VD),体验会更好


## 项目结构

- `simple_live_core` 项目核心库,实现获取各个网站的信息及弹幕。
- `simple_live_console` 基于simple_live_core的控制台程序。
- `simple_live_app` 基于核心库实现的Flutter APP客户端。
- `simple_live_tv_app` 基于核心库实现的Flutter Android TV客户端。

## 环境

flutter 3.38.6

## 参考及引用

[AllLive](https://github.com/xiaoyaocz/AllLive) `本项目的C#版,有兴趣可以看看`

[dart_tars_protocol](https://github.com/xiaoyaocz/dart_tars_protocol.git)

[lovelyyoshino/Bilibili-Live-API](https://github.com/lovelyyoshino/Bilibili-Live-API/blob/master/API.WebSocket.md)

[IsoaSFlus/danmaku](https://github.com/IsoaSFlus/danmaku)

[BacooTang/huya-danmu](https://github.com/BacooTang/huya-danmu)

[TarsCloud/Tars](https://github.com/TarsCloud/Tars)

[5ime/Tiktok_Signature](https://github.com/5ime/Tiktok_Signature)

[biliup](https://github.com/biliup/biliup)

## 声明

本项目的所有功能都是基于互联网上公开的资料开发,无任何破解、逆向工程等行为。

本项目仅用于学习交流编程技术,严禁将本项目用于商业目的。如有任何商业行为,均与本项目无关。

如果本项目存在侵犯您的合法权益的情况,请及时与开发者联系,开发者将会及时删除有关内容。


================================================
FILE: assets/app_version.json
================================================
{
    "version": "1.8.7",
    "version_num": 10807,
    "version_desc": "- 一个非常重要的过渡版本 \n- 修复huya搜索 @GH4NG \n- 引入Firebase \n- 大量数据错误和潜在问题修复 \n- 一些细节调整  \n- 关于linux的一系列修复 @pugaizai \n- tips: ios和macos用户请到action更新测试或者下载上游仓库版本",
    "prerelease": true,
    "download_url": "https://github.com/SlotSun/dart_simple_live/releases"
}


================================================
FILE: assets/tv_app_version.json
================================================
{
    "version": "1.5.0",
    "version_num": 10500,
    "version_desc": "- 永远的1.5.0",
    "prerelease":true,
    "download_url": "https://github.com/xiaoyaocz/dart_simple_live/releases"
}

================================================
FILE: assets/update-linux-metainfo.dart
================================================
import 'dart:convert';
import 'dart:io';

String _xmlEscape(String s) => s
    .replaceAll('&', '&amp;')
    .replaceAll('<', '&lt;')
    .replaceAll('>', '&gt;')
    .replaceAll('"', '&quot;')
    .replaceAll("'", '&apos;');

void main() {
  final projectRoot = Directory.current.path;
  final jsonPath = '$projectRoot/assets/app_version.json';
  final targetPath =
      '$projectRoot/simple_live_app/assets/io.github.SlotSun.Slive.metainfo.xml';

  final jsonFile = File(jsonPath);
  if (!jsonFile.existsSync()) {
    stderr.writeln('app_version.json not found: $jsonPath');
    exit(2);
  }

  final targetFile = File(targetPath);
  if (!targetFile.existsSync()) {
    stderr.writeln('target file not found: $targetPath');
    exit(2);
  }

  final map = json.decode(jsonFile.readAsStringSync());
  final version = (map['version'] ?? '').toString();
  final desc = (map['version_desc'] ?? '').toString();

  final date = DateTime.now().toIso8601String().split('T').first;

  final releaseBlock = [
    '    <release version="$version" date="$date">',
    '      <description>',
    for (final line in desc.split('\n'))
      '        <p>${_xmlEscape(line.replaceAll("\r", ""))}</p>',
    '      </description>',
    '    </release>',
  ].join('\n');

  final content = targetFile.readAsStringSync();

  final releasesReg = RegExp(
    r'(<releases\b[^>]*>)([\s\S]*?)(  </releases>)',
    multiLine: true,
    dotAll: true,
  );

  // 直接替换第一个 <releases> 区块(如果不存在则 content 保持不变)
  final newContent = content.replaceFirstMapped(
    releasesReg,
    (m) => '${m.group(1)}\n$releaseBlock\n${m.group(3)}',
  );

  targetFile.writeAsStringSync(newContent);
  stdout.writeln('Update Done: $targetPath');
}


================================================
FILE: docs/.gitignore
================================================
/node_modules
.idea
.vitepress/cache

================================================
FILE: docs/.vitepress/config.mts
================================================
import { defineConfig } from 'vitepress'

// https://vitepress.dev/reference/site-config
export default defineConfig({
  base: '/dart_simple_live/',
  title: "Slive Doc",
  head: [
    ["link", { rel: "icon", href: "/favicon.ico" }],
  ],
  description: "Slive Doc",
  themeConfig: {
    // https://vitepress.dev/reference/default-theme-config
    nav: [
      { text: 'Home', link: '/' },
      { text: '开发指南', link: '/contributing' }
    ],

    sidebar: [
      {
        text: '文档',
        items: [
          { text: '开发指南', link: '/contributing' },
          { text: '用户指南', link: '/user' }
        ]
      }
    ],

    socialLinks: [
      { icon: 'github', link: 'https://github.com/SlotSun/dart_simple_live' }
    ]
  }
})


================================================
FILE: docs/README.md
================================================
# Slive Docs

基于 VitePress

## 部署

安装依赖

```shell
pnpm install
```

运行

```shell
pnpm run docs:dev
```


================================================
FILE: docs/contributing.md
================================================
# 开发贡献指南 / Contributing Guide

感谢你对 Slive 的关注!欢迎各种形式的贡献,无论是修复 bug、添加新功能、改进文档还是提出建议。
## 贡献须知
- 因为一些原因,**dev** 作为Github Flow开发流程的主干
- **master** 分支发版时 通过 merge squash dev,会在停更时删除dev分支并脱敏
- 所以仓库的贡献者包括贡献代码统计都是不存在的

## 🎯 贡献类型

欢迎以下类型的贡献:

### 🐛 修复 Bug
- 在 Issues 中查找标记为 `bug` 的问题
- 如果发现新的 bug,请先[创建 Issue](https://github.com/SlotSun/dart_simple_live/issues/new/choose) 描述问题

### ✨ 添加新功能
- 查找标记为 `enhancement`的 Issue
- 对于较大的功能,建议先创建 Issue 讨论设计方案

### 📖 改进文档
- 修复文档中的错误或不清晰的地方
- 添加使用示例和最佳实践

### 🧪 添加测试
- 为现有功能添加单元测试
- 改进测试覆盖率
- 添加集成测试

### 🎨 UI/UX 改进
- 优化界面交互体验
- 修复界面样式问题
- 提升易用性

## 🚀 快速开始

### 前置要求

确保你的环境中已安装: 

- **Flutter 3.38.6^**
- **Rust 1.28^**
- **Visual Studio**

### 安装 FVM

```bash
# macOS/Linux
curl -sL https://install.fvm.sh | bash

# Windows
choco install fvm
```

### 安装 Flutter

```bash
# windows
fvm version
fvm list
fvm install 3.38.6
```

**Linux**
[详见官网教程](https://docs.flutter.dev/install/manual)

### 克隆仓库

```bash
git clone https://github.com/SlotSun/dart_simple_live.git
cd dart_simple_live/simple_live_app
```

## 🏷️ 认领任务

### 查找任务

1. 浏览 [Issues 页面](https://github.com/SlotSun/dart_simple_live/issues)
2. 查找带有以下标签的 Issue:
    - `help wanted` - 需要社区帮助的任务
    - `bug` - Bug 修复
    - `enhancement` - 功能增强

### 认领流程

在你想要处理的 Issue 下评论:
```
/assign me
```

或者:
```
我可以解决此问题
```


## 💻 本地开发

### 1. 安装依赖

**Flutter依赖**:
```bash
fvm use 3.38.6
# 安装Flutter_rust_bridge
cargo install flutter_rust_bridge_codegen
flutter pub get
```

### 2. 启动开发服务器

**启动APP**(支持热重载):
```bash
flutter run
```

### 3. 构建项目

**安装 fastforge**
```bash
git clone https://github.com/SlotSun/fastforge.git
cd fastforge
dart pub global activate melos
melos run activate
```
**Windows-安装 innosetup**
```bash
# 打包 windows
choco install innosetup
```
**构建APP**:
```bash
# bash in simple_live_app
cd simple_live_app
# 打包 windows
fastforge package --platform windows --targets msix,zip,exe --skip-clean
# Linux
fastforge package --platform linux --targets deb,zip --skip-clean
# Android-need key
flutter build apk --release --split-per-abi
```

## 📁 代码结构

### 项目目录速览
- `simple_live_core` 项目核心库,实现获取各个网站的信息及弹幕。
- `simple_live_console` 基于simple_live_core的控制台程序。
- `simple_live_app` 基于核心库实现的Flutter APP客户端。
- `simple_live_tv_app` 基于核心库实现的Flutter Android TV客户端。

### 技术栈

**Flutter**:
- GetX(状态管理、路由)
- Hive(持久化)
- Dio(实时通信)

## 📝 提交规范

我们遵循 [Conventional Commits](https://www.conventionalcommits.org/) 规范:

### Commit 格式

```
<类型>(<范围>): <简短描述>

[可选的详细描述]

[可选的脚注]
```

### 类型 (Type)

- `feat`: 新功能
- `fix`: Bug 修复
- `docs`: 文档变更
- `style`: 代码格式调整(不影响功能)
- `refactor`: 重构(既不是新功能也不是 bug 修复)
- `perf`: 性能优化
- `test`: 添加或修改测试
- `chore`: 辅助工具的变动
- `ci`: 构建过程的变动

### 范围 (Scope)

可选,指明改动的模块:
- `platfrom` - 直播平台
- `Windows/Linux/Android` - 用户平台
- `ui` - 用户界面
- `ci` - 构建系统
- `docs` - 文档

### 示例

```bash
feat(api): add layered agent support
```

## 🔍 Pull Request 要求
### PR 流程
```bash
git clone https://github.com/SlotSun/dart_simple_live.git
# 基于dev分支创建 Type-Scope的分支
git checkout -b fix-xx origin/dev
```
**完成测试后,向主仓库的dev分支提交pr**
### 提交前检查清单

- [ ] 代码通过格式检查
- [ ] 对于新功能,添加了相应的文档说明
- [ ] 对于 UI 改动,提供了截图或录屏
- [ ] Commit 信息遵循规范格式
- [ ] PR 描述清晰说明了改动内容和原因

### PR 标题格式

PR 标题应该简洁明了,建议格式:

```
<类型>: <简短描述>
```

例如:
- `feat: add WiFi device pairing support`
- `fix: resolve video stream crash on device disconnect`
- `docs: improve quick start guide`

### PR 描述模板

提交 PR 时,请使用以下模板:

```markdown
## 改动说明

<!-- 简要描述这个 PR 做了什么 -->

## 相关 Issue

<!-- 关联的 Issue 编号,如 Closes #123 -->

## 改动类型

- [ ] Bug 修复
- [ ] 新功能
- [ ] 文档更新
- [ ] 代码重构
- [ ] 性能优化
- [ ] 其他(请说明)

## 测试说明

<!-- 如何测试这些改动? -->

## 截图/录屏

<!-- 对于 UI 改动,请提供截图或录屏 -->

## 其他说明

<!-- 其他需要说明的内容 -->
```

### Code Review

提交 PR 后:
1. 维护者会审查你的代码
2. 可能会提出改进建议
3. 请及时回复评论并根据反馈调整代码
4. 所有讨论解决后,PR 会被合并

## 🤝 行为准则

### 我们的承诺

为了营造一个开放和友好的环境,我们承诺:

- 尊重不同的观点和经验
- 优雅地接受建设性批评
- 关注对社区最有利的事情
- 对其他社区成员表示同理心

### 不可接受的行为

以下行为被视为不可接受:

- 使用性别化的语言或图像,以及不受欢迎的性关注
- 骚扰性评论、侮辱性/贬损性评论,以及人身或政治攻击
- 公开或私下骚扰
- 未经明确许可,发布他人的私人信息
- 其他在专业环境中可能被认为不适当的行为

## 🎉 感谢贡献

感谢你花时间为 Slive 做出贡献!你的努力让这个项目变得更好。

有任何问题?欢迎:
- 在 [Issues](https://github.com/SlotSun/dart_simple_live/issues) 提问

---

================================================
FILE: docs/index.md
================================================
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home

hero:
  name: "Slive Docs"
  text: "我就默默看你表演"
  tagline: 基于Flutter开发的直播聚合软件
  actions:
    - theme: brand
      text: 开发指南
      link: /contributing
    - theme: alt
      text: 用户指南
      link: /user

features:
  - title: 目标
    details: 只需要一个软件就可以观看多个直播平台
  - title: 直播平台支持
    details: BiliBili/Douyu/Huya/Douyin
  - title: 平台支持
    details: Android/Windows/Linux
---



================================================
FILE: docs/package.json
================================================
{
  "name": "Slive Docs",
  "version": "1.0.0",
  "devDependencies": {
    "vitepress": "2.0.0-alpha.15"
  },
  "scripts": {
    "docs:dev": "vitepress dev",
    "docs:build": "vitepress build",
    "docs:preview": "vitepress preview"
  },
  "dependencies": {
    "Slive Docs": "link:"
  }
}

================================================
FILE: docs/user.md
================================================
# 用户指南 / User Guide

# 必知必看
## 提交问题前必知必看
- 随着用户数增多,问题反馈数增多,作者时间有限不能逐个回复还请见谅
- 与之伴生的是,很多人不能正确反馈问题导致作者不能明确复现并定位问题,浪费了作者有限的休息时间
- 一定要有一个共识,开源社区开源软件作者是在无偿贡献自己的业余时间和精力,出于技术学习和交流目的,是在作者自认为是正常人的认知范围内进行技术开发
- 更要明白,你的私人需求不一定能够得到满足,问题的解决是有优先级的
- 一定要先搜索仓库内是否已经有类似问题
- 一定要详细正确填写设备型号,系统信息
- 多次可复现后录大小低于10mb的视频
- 详细说明复现过程
- 例如观看直播问题,具体在什么手机什么系统什么直播平台什么房间使用什么流,出现了什么问题,使用硬解,硬解参数是怎么设置的,开启log后发送,无log不解决
- 例如非直播问题,具体在什么系统什么界面使用什么功能,如何操作导致此问题,有无排查硬件兼容,软件互斥,鼠标失灵,键盘卡键等自身问题
- 提出问题前使用AI或搜索引擎尝试解决并归纳问题
- 其余我还没想到但可能提高解决问题效率的注意事项
## 风控问题
- 不要快速手动刷新,一定要把更新线程切换到4
- 尽量减少搜索使用频率,最好使用链接解析,很多平台的不准确搜索涉及到推荐系统模型;普通接口CDN很快,搜索走内部系统一次的成本大概是普通接口的几十倍,风控会比较明显
- 发现进入直播间报错,尝试切换账号切换网络重试

### 安全问题
- 一定要在仓库或可信源下载软件
- 被作者签名的app hash对的上 签名对的上就表示没有被篡改,否则被篡改藏木马病毒你安装后可能有损失
- 开源软件不代表绝对的安全
- 一些二次封装收费的,那都不是我干的和我没关系;我再次声明,我自身有良好的本职工作收入,我对大家没有任何经济上的要求,甚至帮忙扫支付宝红包的需求都没有;我只是学习并提升下自己的开发技术,大家帮忙测试下就好,不用感谢也不用宣传

## 用户账户配置
### WebDav
### BiliBili
### Douyin

## 播放器设置
### 播放器参数
### 弹幕参数设置

## 关注功能
### 标签功能
### 主播信息
### 关注清理

## 链接解析

## 外观设置
### 字体设置

## 其他说明

================================================
FILE: flatpak/flatpak-manifest.yaml
================================================
app-id: io.github.SlotSun.Slive
runtime: org.freedesktop.Platform
runtime-version: '25.08'
sdk: org.freedesktop.Sdk
sdk-extensions:
  - org.freedesktop.Sdk.Extension.llvm21
command: io.github.SlotSun.Slive
finish-args:
  - --share=ipc
  - --socket=fallback-x11
  - --socket=wayland
  - --socket=pulseaudio
  - --share=network
  - --device=dri
  - --talk-name=org.freedesktop.ScreenSaver
  # user settings synchronization feature requires this D-Bus
  - --system-talk-name=org.freedesktop.NetworkManager.IP4Config
cleanup:
  - '*.a'
  - '*.la'
  - /include
  - /lib/cmake
  - /lib/pkgconfig
  - /man
  - /share/man
  - /share/doc
  - /share/gtk-docmodules

modules:
  - name: rustup
    buildsystem: simple
    build-options:
      build-args:
        - --share=network
      env:
        CARGO_HOME: /var/lib/rustup
        RUSTUP_HOME: /var/lib/rustup
    build-commands:
      - chmod -v +x rustup-init && ./rustup-init -y --profile minimal --no-modify-path
    sources:
      - type: file
        only-arches: [x86_64]
        url: https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init
        sha256: 20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c
      - type: file
        only-arches: [aarch64]
        url: https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init
        sha256: e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c

  - name: Slive
    buildsystem: simple
    build-options:
      build-args:
        - --share=network
      arch:
        x86_64:
          env:
            BUNDLE_PATH: simple_live_app/build/linux/x64/release/bundle
        aarch64:
          env:
            BUNDLE_PATH: simple_live_app/build/linux/arm64/release/bundle
      append-path: /var/lib/rustup/bin:/usr/lib/sdk/llvm21/bin:/run/build/Slive/flutter/bin
      prepend-ld-library-path: /usr/lib/sdk/llvm21/lib
      env:
        RUSTUP_HOME: /var/lib/rustup
        CARGO_HOME: /var/lib/rustup
        PUB_CACHE: /run/build/Slive/.pub-cache
    build-commands:
      - cd simple_live_app && flutter build linux --release
      - install -dvm755 ${FLATPAK_DEST}/bin
      - cp -av ${BUNDLE_PATH}/* ${FLATPAK_DEST}/bin
      - install -Dvm644 simple_live_app/assets/${FLATPAK_ID}.metainfo.xml -t ${FLATPAK_DEST}/share/metainfo
      - install -Dvm644 simple_live_app/assets/images/logo.png ${FLATPAK_DEST}/share/icons/hicolor/512x512/apps/${FLATPAK_ID}.png
      - install -Dvm644 simple_live_app/assets/${FLATPAK_ID}.desktop -t ${FLATPAK_DEST}/share/applications
    sources:
      - type: dir
        path: "../"
      - type: git
        url: https://github.com/flutter/flutter.git
        tag: 3.38.6
        commit: 8b872868494e429d94fa06dca855c306438b22c0
        dest: flutter


================================================
FILE: flatpak/libplacebo-python-3.14.patch
================================================
From 12509c0f1ee8c22ae163017f0a5e7b8a9d983a17 Mon Sep 17 00:00:00 2001
From: Nicolas Chauvet <kwizart@gmail.com>
Date: Tue, 29 Jul 2025 11:42:35 +0200
Subject: [PATCH] vulkan/utils_gen: fix for python 3.14

Python 3.14+ has added more type checking. This patch fixes usage

Fixes: https://github.com/haasn/libplacebo/issues/335

Signed-off-by: Nicolas Chauvet <kwizart@gmail.com>
---
 src/vulkan/utils_gen.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/vulkan/utils_gen.py b/src/vulkan/utils_gen.py
index 9a97d35f3..9b803d82b 100644
--- a/src/vulkan/utils_gen.py
+++ b/src/vulkan/utils_gen.py
@@ -202,7 +202,8 @@ def find_registry_xml(datadir):
     if not xmlfile or xmlfile == '':
         xmlfile = find_registry_xml(datadir)
 
-    registry = VkXML(ET.parse(xmlfile))
+    tree = ET.parse(xmlfile)
+    registry = VkXML(tree.getroot())
     with open(outfile, 'w') as f:
         f.write(TEMPLATE.render(
             vkresults = get_vkenum(registry, 'VkResult'),


================================================
FILE: simple_live_app/.fvmrc
================================================
{
  "flutter": "3.38.6"
}

================================================
FILE: simple_live_app/.gitignore
================================================
# 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
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
/android/app/.cxx

/windows/out
/windows/.vs

/ios/Podfile.lock

.fvm/

# firebase
firebase.json

================================================
FILE: simple_live_app/.metadata
================================================
# 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: "adc901062556672b4138e18a4dc62a4be8f4b3c2"
  channel: "stable"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
  platforms:
    - platform: root
      create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
      base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
    - platform: linux
      create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
      base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2

  # 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'


================================================
FILE: simple_live_app/README.md
================================================
# simple_live_app

基于核心库实现的Flutter APP客户端。


================================================
FILE: simple_live_app/analysis_options.yaml
================================================
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
analyzer:
  errors:
    unintended_html_in_doc_comment: ignore
include: package:flutter_lints/flutter.yaml

formatter:
  trailing_commas: preserve

linter:
  # The lint rules applied to this project can be customized in the
  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  # included above or to enable additional rules. A list of all available lints
  # and their documentation is published at
  # https://dart-lang.github.io/linter/lints/index.html.
  #
  # Instead of disabling a lint rule for the entire project in the
  # section below, it can also be suppressed for a single line of code
  # or a specific dart file by using the `// ignore: name_of_lint` and
  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  # producing the lint.
  rules:
    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule
    constant_identifier_names: false

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options


================================================
FILE: simple_live_app/android/.gitignore
================================================
gradle-wrapper.jar
/app/build/
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
.cxx/

# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks


================================================
FILE: simple_live_app/android/app/build.gradle.kts
================================================
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.util.Properties
import java.io.FileInputStream

plugins {
    id("com.android.application")
    // START: FlutterFire Configuration
    id("com.google.gms.google-services")
    id("com.google.firebase.crashlytics")
    // END: FlutterFire Configuration
    id("kotlin-android")
    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
    id("dev.flutter.flutter-gradle-plugin")
}

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
    namespace = "com.slotsun.slive"
    compileSdk = flutter.compileSdkVersion
    ndkVersion = "28.0.13004108"

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    kotlin {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_17)
        }
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId = "com.slotsun.slive"
        // You can update the following values to match your application needs.
        // For more information, see: https://flutter.dev/to/review-gradle-config.
        minSdk = flutter.minSdkVersion
        targetSdk = flutter.targetSdkVersion
        versionCode = flutter.versionCode
        versionName = flutter.versionName
    }

    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = keystoreProperties["storeFile"]?.let { file(it) }
            storePassword = keystoreProperties["storePassword"] as String
        }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

flutter {
    source = "../.."
}

================================================
FILE: simple_live_app/android/app/google-services.json
================================================
{
  "project_info": {
    "project_number": "000000000000",
    "project_id": "com-slotsun-slive",
    "storage_bucket": "com-slotsun-slive.firebasestorage.app"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:000000000000:android:0000000000000000",
        "android_client_info": {
          "package_name": "com.slotsun.slive"
        }
      },
      "oauth_client": [],
      "api_key": [
        {
          "current_key": "0"
        }
      ],
      "services": {
        "appinvite_service": {
          "other_platform_oauth_client": []
        }
      }
    }
  ],
  "configuration_version": "1"
}

================================================
FILE: simple_live_app/android/app/proguard-rules.pro
================================================
-keep class org.videolan.libvlc.** { *; }

================================================
FILE: simple_live_app/android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- The INTERNET permission is required for development. Specifically,
         the Flutter tool needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: simple_live_app/android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <meta-data
        android:name="io.flutter.embedding.android.EnableImpeller"
        android:value="false"
        />
    <application
        android:label="Slive"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:networkSecurityConfig="@xml/network_security_config"
        android:extractNativeLibs="true"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".MainActivity"
            android:supportsPictureInPicture="true"
            android:exported="true"
            android:launchMode="singleTop"
            android:taskAffinity=""
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:extractNativeLibs="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
    <!-- Required to query activities that can process text, see:
         https://developer.android.com/training/package-visibility and
         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
</manifest>


================================================
FILE: simple_live_app/android/app/src/main/kotlin/com/slotsun/slive/MainActivity.kt
================================================
package com.slotsun.slive

import io.flutter.embedding.android.FlutterActivity

class MainActivity : FlutterActivity()


================================================
FILE: simple_live_app/android/app/src/main/res/drawable/ic_launcher_background.xml
================================================
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/ic_launcher_background" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>

================================================
FILE: simple_live_app/android/app/src/main/res/drawable/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="1024"
    android:viewportHeight="1024">
  <group android:scaleX="0.73333335"
      android:scaleY="0.73333335"
      android:translateX="136.53334"
      android:translateY="136.53334">
    <path
        android:pathData="M0,0h1024v1024h-1024z">
      <aapt:attr name="android:fillColor">
        <gradient
            android:centerX="512"
            android:centerY="512"
            android:gradientRadius="512"
            android:type="radial">
          <item android:offset="0" android:color="#FF3193CB"/>
          <item android:offset="0.3" android:color="#FF2B84BD"/>
          <item android:offset="0.6" android:color="#FF2675AF"/>
          <item android:offset="1" android:color="#FF1E6BA0"/>
        </gradient>
      </aapt:attr>
    </path>
    <path
        android:pathData="M234,388Q234,280 342,388Q450,496 558,388Q666,280 882,388"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
    <path
        android:pathData="M234,568L234,748"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
    <path
        android:pathData="M342,568L342,676M342,604L342,604"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
    <path
        android:pathData="M450,568L504,676L558,568"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
    <path
        android:pathData="M666,568Q612,622 666,676Q720,622 774,568M648,672.4Q828,658 846,604"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
    <path
        android:pathData="M306,478L306,463.6"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
    <path
        android:pathData="M648,469L702,451"
        android:strokeWidth="36"
        android:fillColor="#00000000"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round"/>
  </group>
</vector>


================================================
FILE: simple_live_app/android/app/src/main/res/drawable/ic_launcher_monochrome.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="1024"
    android:viewportHeight="1024">
    <group android:scaleX="0.67833334"
        android:scaleY="0.67833334"
        android:translateX="164.69333"
        android:translateY="164.69333">
        <path
            android:pathData="M234,388Q234,280 342,388Q450,496 558,388Q666,280 882,388"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
        <path
            android:pathData="M234,568L234,748"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
        <path
            android:pathData="M342,568L342,676M342,604L342,604"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
        <path
            android:pathData="M450,568L504,676L558,568"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
        <path
            android:pathData="M666,568Q612,622 666,676Q720,622 774,568M648,672.4Q828,658 846,604"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
        <path
            android:pathData="M306,478L306,463.6"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
        <path
            android:pathData="M648,469L702,451"
            android:strokeWidth="36"
            android:fillColor="#00000000"
            android:strokeColor="#ffffff"
            android:strokeLineCap="round"/>
    </group>
</vector>


================================================
FILE: simple_live_app/android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: simple_live_app/android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?android:colorBackground" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: simple_live_app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
    <monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
</adaptive-icon>

================================================
FILE: simple_live_app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
    <monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
</adaptive-icon>

================================================
FILE: simple_live_app/android/app/src/main/res/values/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ic_launcher_background">#206CA1</color>
</resources>

================================================
FILE: simple_live_app/android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             the Flutter engine draws its first frame -->
        <item name="android:windowBackground">@drawable/ic_launcher_background</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.

         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
</resources>


================================================
FILE: simple_live_app/android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             the Flutter engine draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.

         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
</resources>


================================================
FILE: simple_live_app/android/app/src/main/res/xml/network_security_config.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>


================================================
FILE: simple_live_app/android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- The INTERNET permission is required for development. Specifically,
         the Flutter tool needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: simple_live_app/android/build.gradle.kts
================================================
allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

val newBuildDir: Directory =
    rootProject.layout.buildDirectory
        .dir("../../build")
        .get()
rootProject.layout.buildDirectory.value(newBuildDir)

subprojects {
    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
    project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
    project.evaluationDependsOn(":app")
}

tasks.register<Delete>("clean") {
    delete(rootProject.layout.buildDirectory)
}


================================================
FILE: simple_live_app/android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip


================================================
FILE: simple_live_app/android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true


================================================
FILE: simple_live_app/android/settings.gradle.kts
================================================
pluginManagement {
    val flutterSdkPath =
        run {
            val properties = java.util.Properties()
            file("local.properties").inputStream().use { properties.load(it) }
            val flutterSdkPath = properties.getProperty("flutter.sdk")
            require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
            flutterSdkPath
        }

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id("dev.flutter.flutter-plugin-loader") version "1.0.0"
    id("com.android.application") version "8.11.1" apply false
    // START: FlutterFire Configuration
    id("com.google.gms.google-services") version("4.3.15") apply false
    id("com.google.firebase.crashlytics") version("2.8.1") apply false
    // END: FlutterFire Configuration
    id("org.jetbrains.kotlin.android") version "2.2.20" apply false
}

include(":app")


================================================
FILE: simple_live_app/assets/fonts/fonts-manifest.json
================================================
[
  {
    "id": "judousansui",
    "name": "句读黑体 UI Hans",
    "files": [
      "judousansui/JudouSansUiHans-ExtraLight.ttf",
      "judousansui/JudouSansUiHans-Light.ttf",
      "judousansui/JudouSansUiHans-Regular.ttf",
      "judousansui/JudouSansUiHans-Medium.ttf",
      "judousansui/JudouSansUiHans-Bold.ttf",
      "judousansui/JudouSansUiHans-Heavy.ttf"
    ],
    "desc": "句读黑体,基于思源黑体和 FiraGO 等字体,商用免费的多文种混排字体。",
    "official": "https://github.com/JudouEco/JudouSans",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "judousansuihant",
    "name": "句读黑体 UI Hant",
    "files": [
      "judousansuihant/JudouSansUiHant-ExtraLight.ttf",
      "judousansuihant/JudouSansUiHant-Light.ttf",
      "judousansuihant/JudouSansUiHant-Regular.ttf",
      "judousansuihant/JudouSansUiHant-Medium.ttf",
      "judousansuihant/JudouSansUiHant-Bold.ttf",
      "judousansuihant/JudouSansUiHant-Heavy.ttf"
    ],
    "desc": "句读黑体 传承字形版本",
    "official": "https://github.com/JudouEco/JudouSans",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
{
    "id": "frex-sans",
    "name": "械黑",
    "files": [
      "frex-sans/FrexSansGB-Thin.ttf",
      "frex-sans/FrexSansGB-ExtraLight.ttf",
      "frex-sans/FrexSansGB-Light.ttf",
      "frex-sans/FrexSansGB-Text.ttf",
      "frex-sans/FrexSansGB-Medium.ttf",
      "frex-sans/FrexSansGB-SemiBold.ttf",
      "frex-sans/FrexSansGB-Bold.ttf"
    ],
    "desc": "将 IBM Plex Sans SC 中成部件的大量不必要修改还原成字体的原有风格,并修复了其中的一部分错形,部分零碎的字形也已恢复到繁体版和日文版原本的设计。",
    "official": "https://www.maoken.com/freefonts/26125.html",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
{
    "id": "chilldin",
    "name": "寒蝉德黑体",
    "files": [
      "chilldin/ChillDINGothic_Regular.otf",
      "chilldin/ChillDINGothic_Medium.otf",
      "chilldin/ChillDINGothic_Bold.otf"
    ],
    "desc": "源于德国工业标准字体“DIN”,基于D-DIN的修缮。",
    "official": "github.com/Warren2060/ChillDIN-ChillDINGothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
{
    "id": "zhiyimaru",
    "name": "致一圆体",
    "files": [
      "zhiyimaru/ZhiyiMaru-Regular.ttf",
      "zhiyimaru/ZhiyiMaru-Bold.ttf"
    ],
    "desc": "基于旧印刷字形的「霞鹜晰黑」修改而来,并制作了圆体、粗圆,以适应现代阅读环境对多样式、多字重字型的需要。",
    "official": "https://github.com/RiyipuSipino/ZhiyiSans",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "chiron-go-round",
    "name": "昭源环方",
    "files": [
      "chiron-go-round/ChironGoRoundTC-300L.ttf",
      "chiron-go-round/ChironGoRoundTC-400R.ttf",
      "chiron-go-round/ChironGoRoundTC-500M.ttf",
      "chiron-go-round/ChironGoRoundTC-700B.ttf"
    ],
    "desc": "现代笔形风格,平衡标准字形和印刷体惯用笔形的免费开源仿圆体字体。",
    "official": "https://github.com/chiron-fonts/chiron-go-round-tc",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "copperzhengkai",
    "name": "汇迹正楷",
    "files": [
      "copperzhengkai/CooperZhengKai.ttf"
    ],
    "desc": "Cooper 搭配汇文正楷,更楷体。",
    "official": "https://www.maoken.com/freefonts/24749.html",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "fusion-pixel",
    "name": "缝合像素字体",
    "files": [
      "fusion-pixel/fusion-pixel-12px-proportional-zh_hans.ttf"
    ],
    "desc": "该项目为「方舟像素字体」的临时性过渡方案。使用多个像素字体合并而成,因此以「缝合」命名。",
    "official": "https://github.com/TakWolf/fusion-pixel-font",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "chillroundm",
    "name": "寒蝉半圆体",
    "files": [
      "chillroundm/ChillRoundM.otf"
    ],
    "desc": "寒蝉半圆体,基于日本开源字体 Zen Maru Gothic 进行调整的圆体字体,更新为符合 GB2312 标准的字符集,使其应用范围更广;修正部分字形和补充部分字形,调整到更均衡的排版。",
    "official": "https://github.com/Warren2060/ChillRound",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "huiwen-hkhei",
    "name": "汇文港黑",
    "files": [
      "huiwen-hkhei/HuiwenHKHei-Regular.ttf"
    ],
    "desc": "特里王系列精品免费商用字体,字形主要参考自照排时期香港广泛使用的港版岩田黑体。",
    "official": "https://zhuanlan.zhihu.com/p/12669052378",
    "license": {
      "name": "其他协议",
      "url": "https://zhuanlan.zhihu.com/p/12669052378"
    }
  },
  {
    "id": "huiwen-mincho",
    "name": "汇文明朝体 GBK",
    "files": [
      "huiwen-mincho/HuiwenMinchoGBK-Regular.ttf"
    ],
    "desc": "特里王系列精品免费商用字体,字形主要来自五六十年代官方各种汉字改革文件。",
    "official": "https://zhuanlan.zhihu.com/p/12669052378",
    "license": {
      "name": "其他协议",
      "url": "https://zhuanlan.zhihu.com/p/12669052378"
    }
  },
  {
    "id": "huiwen-zhengkai",
    "name": "汇文正楷",
    "files": [
      "huiwen-zhengkai/HuiwenZhengKai-Regular.ttf"
    ],
    "desc": "特里王系列精品免费商用字体,字形来自大名鼎鼎的「汉文正楷」。",
    "official": "https://zhuanlan.zhihu.com/p/12669052378",
    "license": {
      "name": "其他协议",
      "url": "https://zhuanlan.zhihu.com/p/12669052378"
    }
  },
  {
    "id": "huiwen-fangsong",
    "name": "汇文仿宋",
    "files": [
      "huiwen-fangsong/HuiwenFangSong-Regular.ttf"
    ],
    "desc": "特里王系列精品免费商用字体,字形来自新华字模厂的老 59-4 仿宋体。",
    "official": "https://zhuanlan.zhihu.com/p/12669052378",
    "license": {
      "name": "其他协议",
      "url": "https://zhuanlan.zhihu.com/p/12669052378"
    }
  },
  {
    "id": "blix",
    "name": "卜力士",
    "files": [
      "blix/Blix-Thin.otf",
      "blix/Blix-ExtraLight.otf",
      "blix/Blix-Light.otf",
      "blix/Blix-Text.otf",
      "blix/Blix-Medium.otf",
      "blix/Blix-SemiBold.otf",
      "blix/Blix-Bold.otf"
    ],
    "desc": "基于 IBM Plex Sans 汉字系列的合并字体,尽可能减少规范字形的󠄁影响。",
    "official": "https://drive.google.com/drive/folders/14naJSasVxrPstbWkHtK696LLGAb5H-vm?usp=sharing",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "plix",
    "name": "普力士",
    "files": [
      "plix/Plix-Thin.otf",
      "plix/Plix-ExtraLight.otf",
      "plix/Plix-Light.otf",
      "plix/Plix-Text.otf",
      "plix/Plix-Medium.otf",
      "plix/Plix-SemiBold.otf",
      "plix/Plix-Bold.otf"
    ],
    "desc": "基于 IBM Plex Sans 汉字系列的合并字体,尽可能减少规范字形的󠄁影响。",
    "official": "https://drive.google.com/drive/folders/14naJSasVxrPstbWkHtK696LLGAb5H-vm?usp=sharing",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "ibm-plex-sans-sc",
    "name": "IBM Plex Sans SC",
    "files": [
      "ibm-plex-sans-sc/IBMPlexSansSC-Thin.otf",
      "ibm-plex-sans-sc/IBMPlexSansSC-ExtraLight.otf",
      "ibm-plex-sans-sc/IBMPlexSansSC-Light.otf",
      "ibm-plex-sans-sc/IBMPlexSansSC-Text.otf",
      "ibm-plex-sans-sc/IBMPlexSansSC-Medium.otf",
      "ibm-plex-sans-sc/IBMPlexSansSC-SemiBold.otf",
      "ibm-plex-sans-sc/IBMPlexSansSC-Bold.otf"
    ],
    "desc": "IBM 的开源字体。全球性,多功能,且像 IBM 一样独特。",
    "official": "https://github.com/IBM/plex/tree/feat-plex-sans-sc/packages/plex-sans-sc",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "yozai",
    "name": "悠哉字体",
    "files": [
      "yozai/Yozai-Light.ttf",
      "yozai/Yozai-Regular.ttf",
      "yozai/Yozai-Medium.ttf"
    ],
    "desc": "一款基于 Y.OzFont 的手写风格的字体。",
    "official": "https://github.com/lxgw/yozai-font",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "childfunsans",
    "name": "游趣体",
    "files": [
      "childfunsans/ChildFunSans.ttf"
    ],
    "desc": "一款开源简体中文字体,基于 Fontworks 的 Stick 衍生。",
    "official": "https://github.com/Des-Magmeta/ChildFunSans",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "tsuipita",
    "name": "晓声通秋茄体",
    "files": [
      "tsuipita/ToneOZ-Tsuipita-TC.ttf"
    ],
    "desc": "基于随峰体扩展,开源免费可商用的的手写字型。",
    "official": "https://toneoz.com/blog/tsuipita/",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "kaisei",
    "name": "江城解星体",
    "files": [
      "kaisei/kaisei.ttf"
    ],
    "desc": "不同于传统的印刷,通过在右侧添加加圆型衬线,使字体左右更加平衡,同时也为字体添加了不一样的特色。",
    "official": "https://toneoz.com/blog/tsuipita/",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "xuandongkaishu",
    "name": "玄冬楷书",
    "files": [
      "xuandongkaishu/XuandongKaishu.ttf"
    ],
    "desc": "基于开源字体《马善政毛笔楷书》的拓展字体。在原版的基础之上修复了错误的字形并添加竖排排版的特性。",
    "official": "https://github.com/Skr-ZERO/Xuandong-Kaishu",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "misans",
    "name": "MiSans",
    "files": [
      "misans/MiSans-Bold.ttf",
      "misans/MiSans-Heavy.ttf",
      "misans/MiSans-Light.ttf",
      "misans/MiSans-Medium.ttf",
      "misans/MiSans-Regular.ttf",
      "misans/MiSans-Thin.ttf"
    ],
    "desc": "MiSans Global 是由小米主导,联合蒙纳字库、汉仪字库共同打造的全球语言字体定制项目。这是一个庞大的字体家族,涵盖 20 多种书写系统,支持 600 多种语言,字符数量超过 10 万个。作为 Xiaomi HyperOS 系统默认字体,我们以简约/清晰,人文/易读,统一的视觉风格为基本原则出发,构建多语言信息体验一致性,旨在帮助为 Xiaomi HyperOS 提供互联的通用体验。",
    "official": "https://hyperos.mi.com/font",
    "license": {
      "name": "其他协议",
      "url": "https://hyperos.mi.com/font/faq"
    }
  },
  {
    "id": "alibabapuhuiti3",
    "name": "阿里巴巴普惠体 3.0",
    "files": [
      "alibabapuhuiti3/AlibabaPuHuiTi-3-45-Light.ttf",
      "alibabapuhuiti3/AlibabaPuHuiTi-3-55-Regular.ttf",
      "alibabapuhuiti3/AlibabaPuHuiTi-3-75-SemiBold.ttf",
      "alibabapuhuiti3/AlibabaPuHuiTi-3-95-ExtraBold.ttf"
    ],
    "desc": "阿里巴巴普惠体是一套全球永久免费正版商用的字体家族。阿里巴巴普惠体 3.0 为一套符合新国家标准 GB18030-2022 的简体中文字符集,包含 GB18030-2022 强制规范三个实现级别:实现级别 1 + 实现级别 2 标准规格的 7 字重、实现级别 3 标准规格的 Regular 单一字重。7 字重共 194460 个全形汉字。包含拉丁字母、希腊字母、西里尔字母、标点符号。",
    "official": "https://www.alibabafonts.com/",
    "license": {
      "name": "其他协议",
      "url": "https://www.yuque.com/yiguang-wkqc2/puhuiti/nus9wiinq4aeiegy"
    }
  },
  {
    "id": "lxgwneoxihei",
    "name": "霞鹜新晰黑 屏幕阅读版",
    "files": [
      "lxgwneoxihei/LXGWNeoXiHeiScreen.ttf"
    ],
    "desc": "一款基于 IPAex 黑体的中文开源字体,是将日本写法的字体改造成中国大陆规范写法的尝试。",
    "official": "https://github.com/lxgw/LxgwNeoXiZhi-Screen",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "lxgwneozhisong",
    "name": "霞鹜新致宋 屏幕阅读版",
    "files": [
      "lxgwneozhisong/LXGWNeoZhiSongScreen.ttf"
    ],
    "desc": "基于「IPAex 明朝」「IPAmj 明朝」的中文开源字体,是将日本写法的字体改造成中国大陆规范写法的尝试。",
    "official": "https://github.com/lxgw/LxgwNeoXiZhi-Screen",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "chillroundf",
    "name": "寒蝉全圆体",
    "files": [
      "chillroundf/ChillRoundF.ttf"
    ],
    "desc": "寒蝉全圆体,基于《小杉圆体》《justfont 粉圆》《猫啃糖圆体》进行调整的圆体字型,更新为超大字符数量的字符集,使其应用范围更广。综合考量各版本字形的使用并挑选合理的字形。修正部分字形和补充部分字形。调整到更均衡的排版。",
    "official": "https://github.com/Warren2060/ChillRound",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "hmsans",
    "name": "HarmonyOS Sans",
    "files": [
      "hmsans/HarmonyOS_Sans_SC_Black.ttf",
      "hmsans/HarmonyOS_Sans_SC_Bold.ttf",
      "hmsans/HarmonyOS_Sans_SC_Light.ttf",
      "hmsans/HarmonyOS_Sans_SC_Medium.ttf",
      "hmsans/HarmonyOS_Sans_SC_Regular.ttf",
      "hmsans/HarmonyOS_Sans_SC_Thin.ttf"
    ],
    "desc": "华为全新品牌定制字体,HarmonyOS Sans 字体版权归华为所有",
    "official": "https://developer.huawei.com/consumer/cn/design/resource",
    "license": {
      "name": "其他协议",
      "url": "hmsans/LICENSE.txt"
    }
  },
  {
    "id": "xwwk",
    "name": "霞鹜文楷 Lite",
    "files": [
      "xwwk/LXGWWenKaiLite-Light.ttf",
      "xwwk/LXGWWenKaiLite-Regular.ttf",
      "xwwk/LXGWWenKaiLite-Medium.ttf"
    ],
    "desc": "An open-source Chinese font derived from Fontworks' Klee One. 一款基于 FONTWORKS 的 Klee One 的开源中文字体,保留「亠」「宀」等起笔的直点和「㇙」「㇜」等笔画折角处断笔设计等。",
    "official": "https://github.com/lxgw/LxgwWenKai-Lite",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "xwwkgb",
    "name": "霞鹜文楷 GB Lite",
    "files": [
      "xwwkgb/LXGWWenKaiGBLite-Light.ttf",
      "xwwkgb/LXGWWenKaiGBLite-Regular.ttf",
      "xwwkgb/LXGWWenKaiGBLite-Medium.ttf"
    ],
    "desc": "在霞鹜文楷的基础上,尽可能严格按照中国大陆的字形标准(G 源字形)对字形、笔形作进一步修改。",
    "official": "https://github.com/lxgw/LxgwWenkaiGB-Lite",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "lhzt",
    "name": "小赖字体",
    "files": [
      "lhzt/XiaolaiSC-Regular.ttf"
    ],
    "desc": "一款衍生于「濑户字体」的中文手写字型。",
    "official": "https://github.com/lxgw/kose-font",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "knmaiyuan",
    "name": "荆南麦圆体",
    "files": [
      "knmaiyuan/KNMaiyuan-Regular.ttf"
    ],
    "desc": "麦圆体萌系可爱的手写风格,字体每个笔画的粗细相同,两端圆润饱满,凸显可爱风格。虽是手写字体,笔画分明没有细小的连接,使字体更加清新俏皮。无论是做食品类还是母婴类,抑或是儿童类的设计都特别适合。",
    "official": "https://github.com/maoken-fonts/KNMaiyuan",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "mizukigothic",
    "name": "水木黑体",
    "files": [
      "mizukigothic/MizukiGothic-Regular.ttf"
    ],
    "desc": "一个还原未被楷化的大陆字形项目。",
    "official": "https://github.com/enderseven1/Mizuki-Gothic",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "mizukiming",
    "name": "水木明体",
    "files": [
      "mizukiming/MizukiMing-Regular.ttf"
    ],
    "desc": "致力于打造印刷体风格字形的项目。",
    "official": "https://github.com/enderseven1/Mizuki-Ming/",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "yrdzst",
    "name": "杨任东竹石体",
    "files": [
      "yrdzst/yrdzst-Bold.ttf",
      "yrdzst/yrdzst-Extralight.ttf",
      "yrdzst/yrdzst-Heavy.ttf",
      "yrdzst/yrdzst-Light.ttf",
      "yrdzst/yrdzst-Medium.ttf",
      "yrdzst/yrdzst-Regular.ttf",
      "yrdzst/yrdzst-Semibold.ttf"
    ],
    "desc": "杨任东竹石体于 2017 年 4 月 26 日世界知识产权日正式发布,本字体版本为 1.23。字体按照 GB2312-80 书写,并增补了少量常见汉字;整套字体有 7 个字重,共计 50000 余个字符。本套字体授权全社会免费商用,意味着您可以将其无限制地捆入您的商业产品中,如海报、包装、logo、网页、APP 等。",
    "official": "ttps://mp.weixin.qq.com/s/7kv3i_YEs7x9_9IrCDYvBA",
    "license": {
      "name": "其他协议",
      "url": "https://mp.weixin.qq.com/s/7kv3i_YEs7x9_9IrCDYvBA"
    }
  },
  {
    "id": "opposans",
    "name": "OPlusSans",
    "files": [
      "opposans/OPlusSans3-ExtraLight.ttf",
      "opposans/OPlusSans3-Light.ttf",
      "opposans/OPlusSans3-Regular.ttf",
      "opposans/OPlusSans3-Medium.ttf",
      "opposans/OPlusSans3-Bold.ttf"
    ],
    "desc": "OPlusSans(原名 OPPOSans)允许个人或企业免费使用,含商业用途,版权归 OPPO 广东移动通信有限公司所有。",
    "official": "https://www.coloros.com/index/newsDetail?id=72",
    "license": {
      "name": "其他协议",
      "url": "https://www.coloros.com/index/newsDetail?id=72"
    }
  },
  {
    "id": "sarasa-gothic",
    "name": "更纱黑体",
    "files": [
      "sarasa-gothic/SarasaGothicSC-Light.ttf",
      "sarasa-gothic/SarasaGothicSC-Regular.ttf",
      "sarasa-gothic/SarasaGothicSC-SemiBold.ttf",
      "sarasa-gothic/SarasaGothicSC-Bold.ttf"
    ],
    "desc": "更纱黑体使用全宽引号和比例数字。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-ui",
    "name": "更纱黑体 UI",
    "files": [
      "sarasa-ui/SarasaUiSC-Light.ttf",
      "sarasa-ui/SarasaUiSC-Regular.ttf",
      "sarasa-ui/SarasaUiSC-SemiBold.ttf",
      "sarasa-ui/SarasaUiSC-Bold.ttf"
    ],
    "desc": "更纱黑体 UI 使用缩进引号和等宽数字。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-mono",
    "name": "等距更纱黑体",
    "files": [
      "sarasa-mono/SarasaMonoSC-Light.ttf",
      "sarasa-mono/SarasaMonoSC-Regular.ttf",
      "sarasa-mono/SarasaMonoSC-SemiBold.ttf",
      "sarasa-mono/SarasaMonoSC-Bold.ttf"
    ],
    "desc": "等距更纱黑体使用等宽西文《Iosevka》。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-slab",
    "name": "等距更纱黑体 Slab",
    "files": [
      "sarasa-slab/SarasaMonoSlabSC-Light.ttf",
      "sarasa-slab/SarasaMonoSlabSC-Regular.ttf",
      "sarasa-slab/SarasaMonoSlabSC-SemiBold.ttf",
      "sarasa-slab/SarasaMonoSlabSC-Bold.ttf"
    ],
    "desc": "等距更纱黑体 Slab 使用等宽西文《Iosevka Slab》。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-gothic-cl",
    "name": "更纱黑体 CL 旧字形",
    "files": [
      "sarasa-gothic-cl/SarasaGothicCL-Light.ttf",
      "sarasa-gothic-cl/SarasaGothicCL-Regular.ttf",
      "sarasa-gothic-cl/SarasaGothicCL-SemiBold.ttf",
      "sarasa-gothic-cl/SarasaGothicCL-Bold.ttf"
    ],
    "desc": "更纱黑体使用全宽引号和比例数字。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-ui-cl",
    "name": "更纱黑体 UI CL 旧字形",
    "files": [
      "sarasa-ui-cl/SarasaUiCL-Light.ttf",
      "sarasa-ui-cl/SarasaUiCL-Regular.ttf",
      "sarasa-ui-cl/SarasaUiCL-SemiBold.ttf",
      "sarasa-ui-cl/SarasaUiCL-Bold.ttf"
    ],
    "desc": "更纱黑体 UI 使用缩进引号和等宽数字。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-mono-cl",
    "name": "等距更纱黑体 CL 旧字形",
    "files": [
      "sarasa-mono-cl/SarasaMonoCL-Light.ttf",
      "sarasa-mono-cl/SarasaMonoCL-Regular.ttf",
      "sarasa-mono-cl/SarasaMonoCL-SemiBold.ttf",
      "sarasa-mono-cl/SarasaMonoCL-Bold.ttf"
    ],
    "desc": "等距更纱黑体使用等宽西文《Iosevka》。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "sarasa-slab-cl",
    "name": "等距更纱黑体 Slab CL 旧字形",
    "files": [
      "sarasa-slab-cl/SarasaMonoSlabCL-Light.ttf",
      "sarasa-slab-cl/SarasaMonoSlabCL-Regular.ttf",
      "sarasa-slab-cl/SarasaMonoSlabCL-SemiBold.ttf",
      "sarasa-slab-cl/SarasaMonoSlabCL-Bold.ttf"
    ],
    "desc": "等距更纱黑体 Slab 使用等宽西文《Iosevka Slab》。",
    "official": "https://github.com/be5invis/Sarasa-Gothic",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "ysxxk",
    "name": "演示夏行楷",
    "files": [
      "ysxxk/ysxxk.ttf"
    ],
    "desc": "「演示夏行楷」是 Keynote 研究所的人生哥制作发布的一款毛笔字体。字稿作者是刘锡栋:中国漓江书画艺术家协会理事丨北京中国书画研究院研究员丨中国民族硬笔书法家协会会员丨中国楹联学会会员丨黑龙江楹联家协会会员丨高级政工师,已退休 该字体简体中文行楷,包含标准的 6763 个字符。",
    "official": "https://mp.weixin.qq.com/s/CRnRsYu8ymlG9_oK6wmBag",
    "license": {
      "name": "其他协议",
      "url": "https://mp.weixin.qq.com/s/CRnRsYu8ymlG9_oK6wmBag"
    }
  },
  {
    "id": "ysfxt",
    "name": "演示佛系体",
    "files": [
      "ysfxt/ysfxt.ttf"
    ],
    "desc": "「演示佛系体」是由一生酷爱书法的纪国才老先生,在 80 岁这年亲手写了一套独具风格的字体,并授权 Keynote 研究所 和 秋叶 PPT 面向全社会联合发布,全渠道免费商用!",
    "official": "https://mp.weixin.qq.com/s/iWn8SWH5ymBKmsGiHe8Yfw",
    "license": {
      "name": "其他协议",
      "url": "https://mp.weixin.qq.com/s/iWn8SWH5ymBKmsGiHe8Yfw"
    }
  },
  {
    "id": "ysqhk",
    "name": "演示秋鸿楷",
    "files": [
      "ysqhk/ysqhk.ttf"
    ],
    "desc": "「演示秋鸿楷」是 Keynote 研究所的人生哥制作发布的一款毛笔字体。字稿的作者是叶运鹏:高中教师丨辽宁人丨 98 年加入农民书画家协会。该字体简体中文楷书,包含标准的 6763 个字符。",
    "official": "https://mp.weixin.qq.com/s/CRnRsYu8ymlG9_oK6wmBag",
    "license": {
      "name": "其他协议",
      "url": "https://mp.weixin.qq.com/s/CRnRsYu8ymlG9_oK6wmBag"
    }
  },
  {
    "id": "yscfk",
    "name": "演示春风楷",
    "files": [
      "yscfk/yscfk.ttf"
    ],
    "desc": "「演示春风楷」是 Keynote 研究所的人生哥制作发布的一款毛笔字体。字稿的作者是徐占海,军人出身,1983 年入伍。每日笔耕不辍练习写字。该字体简体中文楷书,包含标准的 6763 个字符。",
    "official": "https://mp.weixin.qq.com/s/CRnRsYu8ymlG9_oK6wmBag",
    "license": {
      "name": "其他协议",
      "url": "https://mp.weixin.qq.com/s/CRnRsYu8ymlG9_oK6wmBag"
    }
  },
  {
    "id": "ysyrxk",
    "name": "演示悠然小楷",
    "files": [
      "ysyrxk/ysyrxk.ttf"
    ],
    "desc": "「演示悠然小楷」是秋叶 PPT 联合 keynote 研究所推出的一款书法字体,字稿的作者是孟祥媛,一位还在大学读书的书法专业学生。初看「演示悠然小楷」,可能并不觉得惊艳,再品,却会发现透着质朴、率真的气息。正如尚在象牙塔中的作者本人,那是未经雕琢的拙朴书生气。接下来,一起体会悠然小楷的这股「拙气」。悠然小楷笔画分明,结构清晰,没有过度的连笔和飞白,对阅读识别更为友好;小楷字形较小,天然拥有更大的字间距,即便作为长段文字使用,阅读上也不会有太大视觉压力;悠然小楷的笔画力度分布均衡,起收有序,没有太过强烈的对比,自然沉劲而不漂浮;在小楷的基础上有些行楷的影子,为字体增添了灵动,但又有克制,形成停而不断、笔断意连之态;部分笔画细节可能并不完美,不够顺滑,但这份未经雕琢,又何尝不是一种难得的拙朴;所以见过很多大开大合的书法字体后,再见悠然小楷,可能没有很惊艳之感。但艳丽与喧嚣并不一定代表力量,沉劲入骨更难能可贵",
    "official": "https://mp.weixin.qq.com/s/Q1lAIre4yJ-Zlf2CD82EPA",
    "license": {
      "name": "其他协议",
      "url": "https://mp.weixin.qq.com/s/Q1lAIre4yJ-Zlf2CD82EPA"
    }
  },
  {
    "id": "cyroithb",
    "name": "Cyroit HB",
    "files": [
      "cyroithb/CyroitHB-Regular.ttf",
      "cyroithb/CyroitHB-Bold.ttf"
    ],
    "desc": "全角英数や半角カナが判別しやすい、文字間隔調整機能付き等幅フォント。",
    "official": "https://github.com/omonomo/Cyroit",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "advocateancientrounded",
    "name": "尙古圆体",
    "files": [
      "advocateancientrounded/ShangguRoundST-Light.ttf",
      "advocateancientrounded/ShangguRoundST-Regular.ttf",
      "advocateancientrounded/ShangguRoundST-Medium.ttf",
      "advocateancientrounded/ShangguRoundST-Bold.ttf"
    ],
    "desc": "基于思源的传承字形(旧字形)字体。",
    "official": "https://github.com/GuiWonder/Shanggu",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "fanthinkgrotesk",
    "name": "繁 Think 黑",
    "files": [
      "fanthinkgrotesk/FanThinkGrotesk-Thin.otf",
      "fanthinkgrotesk/FanThinkGrotesk-ExtraLight.otf",
      "fanthinkgrotesk/FanThinkGrotesk-Light.otf",
      "fanthinkgrotesk/FanThinkGrotesk-Text.otf",
      "fanthinkgrotesk/FanThinkGrotesk-Medium.otf",
      "fanthinkgrotesk/FanThinkGrotesk-SemiBold.otf",
      "fanthinkgrotesk/FanThinkGrotesk-Bold.otf"
    ],
    "desc": "繁 Think 黑是一套基於 IBM Plex Sans TC 的自動簡轉繁字體。簡轉繁代碼來自 GuiWonder。",
    "official": "https://github.com/pkj-l/FanThinkGrotesk",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "ipagothic",
    "name": "IPAGothic",
    "files": [
      "ipagothic/ipag.ttf"
    ],
    "desc": "应 IPA 许可证要求,增加 IPA 原版字体以允许用户“替换回原始字体”。",
    "official": "https://moji.or.jp/ipafont/ipa00303/",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "ipamincho",
    "name": "IPAMincho",
    "files": [
      "ipamincho/ipam.ttf"
    ],
    "desc": "应 IPA 许可证要求,增加 IPA 原版字体以允许用户“替换回原始字体”。",
    "official": "https://moji.or.jp/ipafont/ipa00303/",
    "license": {
      "name": "IPA Font License 1.0",
      "url": "https://moji.or.jp/ipafont/license/"
    }
  },
  {
    "id": "atkinson",
    "name": "Atkinson Hyperlegible Next",
    "files": [
      "atkinson/AtkinsonHyperlegibleNext-ExtraLight.ttf",
      "atkinson/AtkinsonHyperlegibleNext-Light.ttf",
      "atkinson/AtkinsonHyperlegibleNext-Regular.ttf",
      "atkinson/AtkinsonHyperlegibleNext-Medium.ttf",
      "atkinson/AtkinsonHyperlegibleNext-SemiBold.ttf",
      "atkinson/AtkinsonHyperlegibleNext-Bold.ttf",
      "atkinson/AtkinsonHyperlegibleNext-ExtraBold.ttf"
    ],
    "desc": "Atkinson Hyperlegible, named after the founder of the Braille Institute, has been developed specifically to increase legibility for readers with low vision, and to improve comprehension.",
    "official": "https://www.brailleinstitute.org/freefont/",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "lexend",
    "name": "Lexend Deca",
    "files": [
      "lexend/LexendDeca-Thin.ttf",
      "lexend/LexendDeca-ExtraLight.ttf",
      "lexend/LexendDeca-Light.ttf",
      "lexend/LexendDeca-Regular.ttf",
      "lexend/LexendDeca-Medium.ttf",
      "lexend/LexendDeca-SemiBold.ttf",
      "lexend/LexendDeca-Bold.ttf",
      "lexend/LexendDeca-ExtraBold.ttf",
      "lexend/LexendDeca-Black.ttf"
    ],
    "desc": "Lexend is a variable typeface designed by Bonnie Shaver-Troup and Thomas Jockin in 2018. Applying the Shaver-Troup Individually Optimal Text Formation Factors, studies have found readers instantaneously improve their reading fluency.",
    "official": "https://www.lexend.com/",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  },
  {
    "id": "playpen",
    "name": "Playpen Sans",
    "files": [
      "playpen/PlaypenSans-Thin.ttf",
      "playpen/PlaypenSans-ExtraLight.ttf",
      "playpen/PlaypenSans-Light.ttf",
      "playpen/PlaypenSans-Regular.ttf",
      "playpen/PlaypenSans-Medium.ttf",
      "playpen/PlaypenSans-SemiBold.ttf",
      "playpen/PlaypenSans-Bold.ttf",
      "playpen/PlaypenSans-ExtraBold.ttf"
    ],
    "desc": "Playpen Sans is one of the font families produced by TypeTogether after more than two years of primary research into handwriting education for Latin-based languages. It has seven automatic alternates for each character and a built-in shuffler that both ensures variation and avoids repetitive shapes in close proximity. This feature adds to the overall organic, spontaneous, and authentic feel of the handwritten style.",
    "official": "https://github.com/TypeTogether/Playpen-Sans",
    "license": {
      "name": "SIL OFL 1.1",
      "url": "https://openfontlicense.org/open-font-license-official-text/"
    }
  }
]

================================================
FILE: simple_live_app/assets/io.github.SlotSun.Slive.desktop
================================================
[Desktop Entry]
Type=Application
Name=Slive
GenericName=Livestream Player
Icon=io.github.SlotSun.Slive
Exec=io.github.SlotSun.Slive %U
Categories=AudioVideo;Audio;Video;Network
Keywords=Livestream;Video
StartupNotify=true


================================================
FILE: simple_live_app/assets/io.github.SlotSun.Slive.metainfo.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
  <id>io.github.SlotSun.Slive</id>
  <launchable type="desktop-id">io.github.SlotSun.Slive.desktop</launchable>
  <name>Slive</name>
  <developer id="io.github.slotsun">
    <name>SlotSun</name>
  </developer>
  <summary>Watch live streams simply</summary>
  <summary xml:lang="zh_CN">我就默默看你表演</summary>
  <metadata_license>CC0-1.0</metadata_license>
  <project_license>GPL-3.0</project_license>
  <url type="homepage">https://github.com/SlotSun/dart_simple_live/</url>
  <url type="bugtracker">https://github.com/SlotSun/dart_simple_live/issues</url>
  <description>
    <p>Slive is a lightweight and user-friendly application for watching live streams across multiple platforms, offering a seamless watching experience with support for popular streaming services.</p>
    <p xml:lang="zh_CN">Slive 是一款轻量级且用户友好的直播观看应用,支持多个主流直播平台,提供流畅的观看体验。</p>
    <p>Slive support platforms:</p>
    <p xml:lang="zh_CN">支持直播平台:</p>
    <ul>
        <li>Huya</li>
        <li xml:lang="zh_CN">虎牙</li>
        <li>Douyu</li>
        <li xml:lang="zh_CN">斗鱼</li>
        <li>Bilibili</li>
        <li xml:lang="zh_CN">哔哩哔哩</li>
        <li>Douyin</li>
        <li xml:lang="zh_CN">抖音</li>
    </ul>
  </description>
  <screenshots>
    <screenshot type="default">
      <caption>Light Mode</caption>
      <image type="source">https://raw.githubusercontent.com/SlotSun/dart_simple_live/v1.7.18/assets/screenshot_light.jpg</image>
    </screenshot>
    <screenshot type="default">
      <caption>Dark Mode</caption>
      <image type="source">https://raw.githubusercontent.com/SlotSun/dart_simple_live/v1.7.18/assets/screenshot_dark.jpg</image>
    </screenshot>
  </screenshots>
  <releases>
    <release version="1.8.7" date="2026-02-06">
      <description>
        <p>- 一个非常重要的过渡版本 </p>
        <p>- 修复huya搜索 @GH4NG </p>
        <p>- 引入Firebase </p>
        <p>- 大量数据错误和潜在问题修复 </p>
        <p>- 一些细节调整  </p>
        <p>- 关于linux的一系列修复 @pugaizai </p>
        <p>- tips: ios和macos用户请到action更新测试或者下载上游仓库版本</p>
      </description>
    </release>
  </releases>
  <content_rating type="oars-1.1"/>
  <update_contact>i@pugai.life</update_contact>
</component>


================================================
FILE: simple_live_app/assets/io.github.SlotSun.dart_simple_live.desktop
================================================
[Desktop Entry]
Type=Application
Name=Slive
GenericName=Livestream Player
Icon=io.github.SlotSun.dart_simple_live
Exec=Slive %U
Categories=AudioVideo;Audio;Video;Network
Keywords=Livestream;Video
StartupNotify=true


================================================
FILE: simple_live_app/assets/io.github.SlotSun.dart_simple_live.metainfo.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
  <id>io.github.SlotSun.dart_simple_live</id>
  <launchable type="desktop-id">io.github.SlotSun.dart_simple_live.desktop</launchable>
  <name>Slive</name>
  <developer id="io.github.slotsun">
    <name>SlotSun</name>
  </developer>
  <summary>Watch live streams simply</summary>
  <summary xml:lang="zh_CN">我就默默看你表演</summary>
  <metadata_license>CC0-1.0</metadata_license>
  <project_license>GPL-3.0</project_license>
  <url type="homepage">https://github.com/SlotSun/dart_simple_live/</url>
  <url type="bugtracker">https://github.com/SlotSun/dart_simple_live/issues</url>
  <description>
    <p>Slive is a lightweight and user-friendly application for watching live streams across multiple platforms, offering a seamless watching experience with support for popular streaming services.</p>
    <p xml:lang="zh_CN">Slive 是一款轻量级且用户友好的直播观看应用,支持多个主流直播平台,提供流畅的观看体验。</p>
    <p>Slive support platforms:</p>
    <p xml:lang="zh_CN">支持直播平台:</p>
    <ul>
        <li>Huya</li>
        <li xml:lang="zh_CN">虎牙</li>
        <li>Douyu</li>
        <li xml:lang="zh_CN">斗鱼</li>
        <li>Bilibili</li>
        <li xml:lang="zh_CN">哔哩哔哩</li>
        <li>Douyin</li>
        <li xml:lang="zh_CN">抖音</li>
    </ul>
  </description>
  <screenshots>
    <screenshot type="default">
      <caption>Light Mode</caption>
      <image type="source">https://raw.githubusercontent.com/SlotSun/dart_simple_live/v1.7.18/assets/screenshot_light.jpg</image>
    </screenshot>
    <screenshot type="default">
      <caption>Dark Mode</caption>
      <image type="source">https://raw.githubusercontent.com/SlotSun/dart_simple_live/v1.7.18/assets/screenshot_dark.jpg</image>
    </screenshot>
  </screenshots>
  <releases>
    <release version="1.8.4" date="2025-12-18">
      <description>
        <p>### 已修改包名slotsun.slive,相关事宜请查看 #93 </p>
        <p>- fix:huya </p>
        <p>- 优化弹幕去重功能 </p>
        <p>- 关于linux的一系列修复 @pugaizai</p>
        <p>- fix: 一些代码和逻辑错误</p>
        <p>- tips: ios和macos用户请到action更新测试或者下载上游仓库版本</p>
      </description>
    </release>
  </releases>
  <content_rating type="oars-1.1"/>
  <update_contact>i@pugai.life</update_contact>
</component>


================================================
FILE: simple_live_app/assets/lotties/empty.json
================================================
{"v":"4.7.0","fr":25,"ip":0,"op":50,"w":120,"h":120,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ruoi","ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.967]},"o":{"x":[0.167],"y":[0.033]},"n":["0p833_0p967_0p167_0p033"],"t":35,"s":[100],"e":[0]},{"t":49}]},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0,"y":0},"n":"0p833_0p833_0_0","t":0,"s":[57.361,61.016,0],"e":[57.699,41.796,0],"to":[-4.67500305175781,-4.12800598144531,0],"ti":[-13.9099960327148,5.27300262451172,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.219,"s":[57.699,41.796,0],"e":[79.084,33.982,0],"to":[12.8159942626953,-4.85800170898438,0],"ti":[-4.54498291015625,3.73400115966797,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19.445,"s":[79.084,33.982,0],"e":[59.691,9.121,0],"to":[6.61601257324219,-5.43799591064453,0],"ti":[20.0290069580078,1.20700073242188,0]},{"t":35}]},"a":{"a":0,"k":[60.531,10.945,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.994,0],[0,-0.994],[0.995,0],[0,0.994]],"o":[[0.995,0],[0,0.994],[-0.994,0],[0,-0.994]],"v":[[-0.001,-1.801],[1.801,-0.001],[-0.001,1.801],[-1.801,-0.001]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[62.4,13.144],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.422,0],[0,-1.422],[1.421,0],[0,1.422]],"o":[[1.421,0],[0,1.422],[-1.422,0],[0,-1.422]],"v":[[0.001,-2.574],[2.574,0],[0.001,2.574],[-2.574,0]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0.7},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[64.145,9.606],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.996,0],[0,-1.996],[1.996,0],[0,1.996]],"o":[[1.996,0],[0,1.996],[-1.996,0],[0,-1.996]],"v":[[0,-3.614],[3.614,0],[0,3.614],[-3.614,0]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0.7},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[57.957,10.552],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group"},{"ty":"tr","p":{"a":0,"k":[60.531,10.941],"ix":2},"a":{"a":0,"k":[60.531,10.941],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ruoi","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.967]},"o":{"x":[0.167],"y":[0.033]},"n":["0p833_0p967_0p167_0p033"],"t":35,"s":[100],"e":[0]},{"t":49}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[-0.75,-0.75,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-13.91,5.273],[-4.545,3.734],[20.029,1.207]],"o":[[-4.675,-4.128],[12.816,-4.858],[6.616,-5.438],[0,0]],"v":[[-7.383,24.76],[-7.046,5.54],[14.34,-2.273],[-3.178,-24.76]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.34901960784313724,0.3686274509803922,0.4,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":2,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":2.028}},{"n":"g","nm":"gap","v":{"a":0,"k":2.028}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[67.87,37.631],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.953]},"o":{"x":[0.167],"y":[0.033]},"n":["0p833_0p953_0p167_0p033"],"t":0,"s":[0],"e":[100]},{"t":35}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"}],"ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"im_emptyBox Outlines","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[60,60,0]},"a":{"a":0,"k":[60,60,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.001,-16.607],[-32.143,-0.002],[-0.001,16.607],[32.144,-0.002]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.8,0.82,0.851,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[60,55.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.856,-23.249],[0,-16.605],[-12.857,-23.249],[-45,-6.641],[-32.144,0.001],[-45,6.645],[-12.857,23.249],[0,16.609],[12.856,23.249],[45,6.645],[32.143,0.001],[45,-6.641]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.9372549019607843,0.9372549019607843,0.9372549019607843,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[60,55.748],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.072,24.171],[16.072,11.312],[16.072,-24.171],[-16.072,-24.171]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.9529411764705882,0.9529411764705882,0.9529411764705882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[76.072,83.33],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-32.143,-24.171],[-32.143,11.311],[-0.001,24.171],[32.144,11.311],[32.144,-24.171]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.8,0.82,0.851,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[60,83.33],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group"},{"ty":"tr","p":{"a":0,"k":[60,60.186],"ix":2},"a":{"a":0,"k":[60,60.186],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":50,"st":0,"bm":0,"sr":1}]}

================================================
FILE: simple_live_app/assets/lotties/error.json
================================================
{"v":"5.8.1","fr":29.9700012207031,"ip":0,"op":301.000012259981,"w":1080,"h":900,"nm":"Composition 1","ddd":0,"assets":[{"id":"comp_0","nm":"Nuage","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Calque de forme 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[54,54],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Tracé d'ellipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-22,-239],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544.675,315.475,0],"ix":2,"l":2},"a":{"a":0,"k":[-54.5,-226.5,0],"ix":1,"l":2},"s":{"a":0,"k":[80,80,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[31,31],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Tracé d'ellipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-54.5,-226.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Calque de forme 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[31,31],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Tracé d'ellipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-54.5,-226.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Calque de forme 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-26,-216],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0}]},{"id":"comp_1","nm":"éolienne","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Hélices","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.137],"y":[1]},"o":{"x":[0.567],"y":[0]},"t":1,"s":[0]},{"t":300.00001221925,"s":[1440]}],"ix":10},"p":{"a":0,"k":[800,440,0],"ix":2,"l":2},"a":{"a":0,"k":[800,440,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Socle eolienne","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[264.75,-95],[257,-95],[242,252],[288,251]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0}]},{"id":"comp_2","nm":"Hélices","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Calque de forme 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-239.6,"ix":10},"p":{"a":0,"k":[803,442,0],"ix":2,"l":2},"a":{"a":0,"k":[263,-98,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-122.747,"ix":10},"p":{"a":0,"k":[803,442,0],"ix":2,"l":2},"a":{"a":0,"k":[263,-98,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Calque de forme 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[803,442,0],"ix":2,"l":2},"a":{"a":0,"k":[263,-98,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Calque de forme 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800.5,439.5,0],"ix":2,"l":2},"a":{"a":0,"k":[266.5,-94.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27,27],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Tracé d'ellipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[266.5,-94.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0}]},{"id":"comp_3","nm":"plot base","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Calque de forme 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[541,387.5,0],"ix":2,"l":2},"a":{"a":0,"k":[1,-152.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13,-223],[-13,-223],[-52,-82],[54,-82]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,502,0],"ix":2,"l":2},"a":{"a":0,"k":[0,-38,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[58,-56],[-59,-56],[-70,-20],[70,-20]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Calque de forme 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[539.75,606.25,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.25,66.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[256.5,28.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.7647058823529411,0.3215686274509804,0.23137254901960785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.25,66.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Calque de forme 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,572,0],"ix":2,"l":2},"a":{"a":0,"k":[0,32,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[78,3],[-76,3],[-93,60],[93,61]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0}]},{"id":"comp_4","nm":"Tree","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Calque de forme 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-171.5,-79.5],[-152.5,-45]],"c":false},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980451995,0.84313731474,0.84313731474,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-154.5,-23.5],[-137.5,-48.5]],"c":false},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980451995,0.84313731474,0.84313731474,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Calque de forme 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[386,620,0],"ix":2,"l":2},"a":{"a":0,"k":[-154,80,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-154,256],[-154,-96]],"c":false},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.844306078144,0.844306078144,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Calque de forme 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[384,475,0],"ix":2,"l":2},"a":{"a":0,"k":[-156,-65,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[96,222],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":62,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019667682,0.949019667682,0.949019667682,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156,-65],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0}]},{"id":"comp_5","nm":"ground","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Calque de forme 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[515,795.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-273.5,78,0],"ix":1,"l":2},"s":{"a":0,"k":[662,317,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[59,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2371,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.133333333333,0.145098039216,0.235294132607,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-273.5,78],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[817,795.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-273.5,78,0],"ix":1,"l":2},"s":{"a":0,"k":[78,317,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[59,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2371,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.133333333333,0.145098039216,0.235294132607,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-273.5,78],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Calque de forme 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[752,795.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-273.5,78,0],"ix":1,"l":2},"s":{"a":0,"k":[89,317,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[59,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2371,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.133333333333,0.145098039216,0.235294132607,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-273.5,78],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Calque de forme 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[270,795.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-273.5,78,0],"ix":1,"l":2},"s":{"a":0,"k":[102,317,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[59,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2371,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.133333333333,0.145098039216,0.235294132607,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-273.5,78],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Nuage","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":234,"s":[100]},{"t":299.00001217852,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.284,"y":1},"o":{"x":0.387,"y":0},"t":0,"s":[704,380,0],"to":[-36.667,0,0],"ti":[36.667,0,0]},{"t":299.00001217852,"s":[484,380,0]}],"ix":2,"l":2},"a":{"a":0,"k":[514,308,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.5,-0.5],[0,0.5],[0,-1],[0,-0.5],[0,0],[0.5,-0.5],[0,0],[0.5,-0.5],[-0.5,-0.5]],"o":[[-19,-5],[-34,-13],[-18.5,1.5],[-17,10.5],[0,0],[17,-19.5],[6.5,-4],[-3.5,-13],[11.5,-19.5]],"v":[[263.5,176],[242.5,196],[218,213],[209.5,232.5],[215,254.5],[297,253.5],[289.5,225],[294,210],[271.5,204]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.83137254902,0.821591725069,0.821591725069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"éolienne","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[804,796,0],"ix":2,"l":2},"a":{"a":0,"k":[804,796,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"plot base","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":7.368,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14.736,"s":[-5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22.264,"s":[4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29.633,"s":[-2]},{"t":37.0000015070409,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[540,792,0],"to":[0,-2.667,0],"ti":[0,2,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":7.368,"s":[540,776,0],"to":[0,-2,0],"ti":[0,-1.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14.736,"s":[540,780,0],"to":[0,1.333,0],"ti":[0,-1.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":22.264,"s":[540,784,0],"to":[0,1.333,0],"ti":[0,-2,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29.633,"s":[540,788,0],"to":[0,2,0],"ti":[0,-1.333,0]},{"t":37.0000015070409,"s":[540,796,0]}],"ix":2,"l":2},"a":{"a":0,"k":[540,616,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"éolienne","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[670,796,0],"ix":2,"l":2},"a":{"a":0,"k":[804,796,0],"ix":1,"l":2},"s":{"a":0,"k":[63,63,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Tree","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[280,790,0],"ix":2,"l":2},"a":{"a":0,"k":[384,790,0],"ix":1,"l":2},"s":{"a":0,"k":[82,82,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Tree","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Arbuste","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.5,-0.5],[0,0.5],[0,-1],[0,-0.5],[0,0],[0.5,-0.5],[0,0],[0.5,-0.5],[-0.5,-0.5]],"o":[[-19,-5],[-34,-13],[-18.5,1.5],[-17,10.5],[0,0],[17,-19.5],[6.5,-4],[-3.5,-13],[11.5,-19.5]],"v":[[263.5,176],[242.5,196],[218,213],[209.5,232.5],[215,254.5],[297,253.5],[289.5,225],[294,210],[271.5,204]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960784314,0.901960784314,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"ground","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Nuage","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":234,"s":[100]},{"t":299.00001217852,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[193,606,0],"to":[56.5,0,0],"ti":[-56.5,0,0]},{"t":299.00001217852,"s":[532,606,0]}],"ix":2,"l":2},"a":{"a":0,"k":[514,308,0],"ix":1,"l":2},"s":{"a":0,"k":[60,60,100],"ix":6,"l":2}},"ao":0,"w":1080,"h":900,"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Calque de forme 6","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[572,712,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[784,628],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Tracé rectangulaire 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.909803921569,0.909803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-36,-234],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Calque de forme 5","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,716,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[728,728],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Tracé d'ellipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470588235,0.976470588235,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8,-140],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630.000025660426,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":1,"nm":"Blanc uni 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1080,"sh":900,"ip":0,"op":630.000025660426,"st":0,"bm":0}],"markers":[]}

================================================
FILE: simple_live_app/assets/lotties/loadding.json
================================================
{
    "v": "5.5.8",
    "fr": 50,
    "ip": 0,
    "op": 147,
    "w": 800,
    "h": 600,
    "nm": "Paperplane",
    "ddd": 0,
    "assets": [
        {
            "id": "comp_0",
            "layers": [
                {
                    "ddd": 0,
                    "ind": 1,
                    "ty": 4,
                    "nm": "planete Outlines - Group 4",
                    "sr": 1,
                    "ks": {
                        "o": {
                            "a": 1,
                            "k": [
                                {
                                    "i": {
                                        "x": [
                                            0.833
                                        ],
                                        "y": [
                                            0.833
                                        ]
                                    },
                                    "o": {
                                        "x": [
                                            0.167
                                        ],
                                        "y": [
                                            0.167
                                        ]
                                    },
                                    "t": 0,
                                    "s": [
                                        0
                                    ]
                                },
                                {
                                    "i": {
                                        "x": [
                                            0.833
                                        ],
                                        "y": [
                                            0.833
                                        ]
                                    },
                                    "o": {
                                        "x": [
                                            0.167
                                        ],
                                        "y": [
                                            0.167
                                        ]
                                    },
                                    "t": 38,
                                    "s": [
                                        50
                                    ]
                                },
                                {
                                    "i": {
                                        "x": [
                                            0.833
                                        ],
                                        "y": [
                                            0.833
                                        ]
                                    },
                                    "o": {
                                        "x": [
                                            0.167
                                        ],
                                        "y": [
                                            0.167
                                        ]
                                    },
                                    "t": 88,
                                    "s": [
                                        50
                                    ]
                                },
                                {
                                    "t": 120,
                                    "s": [
                                        0
                                    ]
                                }
                            ],
                            "ix": 11
                        },
                        "r": {
                            "a": 0,
                            "k": 0,
                            "ix": 10
                        },
                        "p": {
                            "a": 1,
                            "k": [
                                {
                                    "i": {
                                        "x": 0.833,
                                        "y": 0.833
                                    },
                                    "o": {
                                        "x": 0.167,
                                        "y": 0.167
                                    },
                                    "t": 0,
                                    "s": [
                                        468.336,
                                        323.378,
                                        0
                                    ],
                                    "to": [
                                        -29,
                                        0,
                                        0
                                    ],
                                    "ti": [
                                        29,
                                        0,
                                        0
                                    ]
                                },
     
Download .txt
gitextract_7g62ejnc/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yml
│   │   ├── config.yml
│   │   └── feature.yml
│   └── workflows/
│       ├── docs-deploy.yaml
│       ├── pr.yaml
│       ├── publish_app_dev.yaml
│       ├── publish_app_release.yml
│       └── publish_tv_app_release.yaml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets/
│   ├── app_version.json
│   ├── tv_app_version.json
│   └── update-linux-metainfo.dart
├── docs/
│   ├── .gitignore
│   ├── .vitepress/
│   │   └── config.mts
│   ├── README.md
│   ├── contributing.md
│   ├── index.md
│   ├── package.json
│   └── user.md
├── flatpak/
│   ├── flatpak-manifest.yaml
│   └── libplacebo-python-3.14.patch
├── simple_live_app/
│   ├── .fvmrc
│   ├── .gitignore
│   ├── .metadata
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── android/
│   │   ├── .gitignore
│   │   ├── app/
│   │   │   ├── build.gradle.kts
│   │   │   ├── google-services.json
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── debug/
│   │   │       │   └── AndroidManifest.xml
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── kotlin/
│   │   │       │   │   └── com/
│   │   │       │   │       └── slotsun/
│   │   │       │   │           └── slive/
│   │   │       │   │               └── MainActivity.kt
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   ├── ic_launcher_background.xml
│   │   │       │       │   ├── ic_launcher_foreground.xml
│   │   │       │       │   ├── ic_launcher_monochrome.xml
│   │   │       │       │   └── launch_background.xml
│   │   │       │       ├── drawable-v21/
│   │   │       │       │   └── launch_background.xml
│   │   │       │       ├── mipmap-anydpi-v26/
│   │   │       │       │   ├── ic_launcher.xml
│   │   │       │       │   └── ic_launcher_round.xml
│   │   │       │       ├── values/
│   │   │       │       │   ├── ic_launcher_background.xml
│   │   │       │       │   └── styles.xml
│   │   │       │       ├── values-night/
│   │   │       │       │   └── styles.xml
│   │   │       │       └── xml/
│   │   │       │           └── network_security_config.xml
│   │   │       └── profile/
│   │   │           └── AndroidManifest.xml
│   │   ├── build.gradle.kts
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   └── settings.gradle.kts
│   ├── assets/
│   │   ├── fonts/
│   │   │   └── fonts-manifest.json
│   │   ├── io.github.SlotSun.Slive.desktop
│   │   ├── io.github.SlotSun.Slive.metainfo.xml
│   │   ├── io.github.SlotSun.dart_simple_live.desktop
│   │   ├── io.github.SlotSun.dart_simple_live.metainfo.xml
│   │   ├── lotties/
│   │   │   ├── empty.json
│   │   │   ├── error.json
│   │   │   └── loadding.json
│   │   └── statement.txt
│   ├── distribute_options.yaml
│   ├── flutter_rust_bridge.yaml
│   ├── integration_test/
│   │   └── simple_test.dart
│   ├── ios/
│   │   ├── .gitignore
│   │   ├── Flutter/
│   │   │   ├── AppFrameworkInfo.plist
│   │   │   ├── Debug.xcconfig
│   │   │   └── Release.xcconfig
│   │   ├── Podfile
│   │   ├── Runner/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── LaunchImage.imageset/
│   │   │   │       ├── Contents.json
│   │   │   │       └── README.md
│   │   │   ├── Base.lproj/
│   │   │   │   ├── LaunchScreen.storyboard
│   │   │   │   └── Main.storyboard
│   │   │   ├── Info.plist
│   │   │   └── Runner-Bridging-Header.h
│   │   ├── Runner.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   ├── project.xcworkspace/
│   │   │   │   ├── contents.xcworkspacedata
│   │   │   │   └── xcshareddata/
│   │   │   │       ├── IDEWorkspaceChecks.plist
│   │   │   │       └── WorkspaceSettings.xcsettings
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── Runner.xcscheme
│   │   └── Runner.xcworkspace/
│   │       ├── contents.xcworkspacedata
│   │       └── xcshareddata/
│   │           ├── IDEWorkspaceChecks.plist
│   │           └── WorkspaceSettings.xcsettings
│   ├── lib/
│   │   ├── app/
│   │   │   ├── app_style.dart
│   │   │   ├── constant.dart
│   │   │   ├── controller/
│   │   │   │   ├── app_settings_controller.dart
│   │   │   │   └── base_controller.dart
│   │   │   ├── custom_throttle.dart
│   │   │   ├── event_bus.dart
│   │   │   ├── log.dart
│   │   │   ├── sites.dart
│   │   │   ├── utils/
│   │   │   │   ├── archive.dart
│   │   │   │   ├── document.dart
│   │   │   │   ├── duration_2_str_utils.dart
│   │   │   │   ├── dynamic_filter.dart
│   │   │   │   ├── dynamic_sort.dart
│   │   │   │   ├── listen_fourth_button.dart
│   │   │   │   ├── permission_handler.dart
│   │   │   │   ├── sandbox.dart
│   │   │   │   ├── string_normalizer.dart
│   │   │   │   └── url_parse.dart
│   │   │   └── utils.dart
│   │   ├── firebase_options.dart
│   │   ├── icons/
│   │   │   └── live_icons.dart
│   │   ├── main.dart
│   │   ├── models/
│   │   │   ├── account/
│   │   │   │   ├── bilibili_user_info_page.dart
│   │   │   │   └── douyin_user_info.dart
│   │   │   ├── db/
│   │   │   │   ├── follow_user.dart
│   │   │   │   ├── follow_user.g.dart
│   │   │   │   ├── follow_user_tag.dart
│   │   │   │   ├── follow_user_tag.g.dart
│   │   │   │   ├── history.dart
│   │   │   │   └── history.g.dart
│   │   │   ├── font_model.dart
│   │   │   ├── fonts_model.dart
│   │   │   ├── sync_client_info_model.dart
│   │   │   └── version_model.dart
│   │   ├── modules/
│   │   │   ├── category/
│   │   │   │   ├── category_controller.dart
│   │   │   │   ├── category_list_controller.dart
│   │   │   │   ├── category_list_view.dart
│   │   │   │   ├── category_page.dart
│   │   │   │   └── detail/
│   │   │   │       ├── category_detail_controller.dart
│   │   │   │       └── category_detail_page.dart
│   │   │   ├── follow_user/
│   │   │   │   ├── follow_app_setting/
│   │   │   │   │   ├── follow_app_settings_controller.dart
│   │   │   │   │   └── follow_app_settings_page.dart
│   │   │   │   ├── follow_info_setting/
│   │   │   │   │   ├── follow_info_controller.dart
│   │   │   │   │   ├── follow_info_page.dart
│   │   │   │   │   └── readme.md
│   │   │   │   ├── follow_user_controller.dart
│   │   │   │   └── follow_user_page.dart
│   │   │   ├── home/
│   │   │   │   ├── home_controller.dart
│   │   │   │   ├── home_list_controller.dart
│   │   │   │   ├── home_list_view.dart
│   │   │   │   └── home_page.dart
│   │   │   ├── indexed/
│   │   │   │   ├── indexed_controller.dart
│   │   │   │   └── indexed_page.dart
│   │   │   ├── live_room/
│   │   │   │   ├── danmu/
│   │   │   │   │   └── danmaku_mask.dart
│   │   │   │   ├── live_room_controller.dart
│   │   │   │   ├── live_room_page.dart
│   │   │   │   └── player/
│   │   │   │       ├── player_controller.dart
│   │   │   │       └── player_controls.dart
│   │   │   ├── mine/
│   │   │   │   ├── account/
│   │   │   │   │   ├── account_controller.dart
│   │   │   │   │   ├── account_page.dart
│   │   │   │   │   └── bilibili/
│   │   │   │   │       ├── qr_login_controller.dart
│   │   │   │   │       ├── qr_login_page.dart
│   │   │   │   │       ├── web_login_controller.dart
│   │   │   │   │       └── web_login_page.dart
│   │   │   │   ├── history/
│   │   │   │   │   ├── history_controller.dart
│   │   │   │   │   └── history_page.dart
│   │   │   │   ├── mine_page.dart
│   │   │   │   └── parse/
│   │   │   │       ├── parse_controller.dart
│   │   │   │       └── parse_page.dart
│   │   │   ├── other/
│   │   │   │   └── debug_log_page.dart
│   │   │   ├── search/
│   │   │   │   ├── douyin/
│   │   │   │   │   ├── douyin_search_controller.dart
│   │   │   │   │   └── douyin_search_view.dart
│   │   │   │   ├── search_controller.dart
│   │   │   │   ├── search_list_controller.dart
│   │   │   │   ├── search_list_view.dart
│   │   │   │   └── search_page.dart
│   │   │   ├── settings/
│   │   │   │   ├── appstyle_settings/
│   │   │   │   │   ├── appstyle_setting_contorller.dart
│   │   │   │   │   └── appstyle_setting_page.dart
│   │   │   │   ├── auto_exit_settings_page.dart
│   │   │   │   ├── danmu_settings_page.dart
│   │   │   │   ├── danmu_shield/
│   │   │   │   │   ├── danmu_shield_controller.dart
│   │   │   │   │   └── danmu_shield_page.dart
│   │   │   │   ├── indexed_settings/
│   │   │   │   │   ├── indexed_settings_controller.dart
│   │   │   │   │   └── indexed_settings_page.dart
│   │   │   │   ├── other/
│   │   │   │   │   ├── other_settings_controller.dart
│   │   │   │   │   └── other_settings_page.dart
│   │   │   │   └── play_settings_page.dart
│   │   │   └── sync/
│   │   │       ├── local_sync/
│   │   │       │   ├── device/
│   │   │       │   │   ├── sync_device_controller.dart
│   │   │       │   │   └── sync_device_page.dart
│   │   │       │   ├── local_sync_controller.dart
│   │   │       │   ├── local_sync_page.dart
│   │   │       │   └── scan_qr/
│   │   │       │       ├── sync_scan_qr_controller.dart
│   │   │       │       └── sync_scan_qr_page.dart
│   │   │       ├── remote_sync/
│   │   │       │   ├── room/
│   │   │       │   │   ├── remote_sync_room_controller.dart
│   │   │       │   │   └── remote_sync_room_page.dart
│   │   │       │   └── webdav/
│   │   │       │       ├── remote_sync_webdav_config_page.dart
│   │   │       │       ├── remote_sync_webdav_controller.dart
│   │   │       │       └── remote_sync_webdav_page.dart
│   │   │       └── sync_page.dart
│   │   ├── requests/
│   │   │   ├── common_request.dart
│   │   │   ├── custom_log_interceptor.dart
│   │   │   ├── http_client.dart
│   │   │   ├── http_error.dart
│   │   │   ├── sync_client_request.dart
│   │   │   └── webdav_client.dart
│   │   ├── routes/
│   │   │   ├── app_analytics_observer.dart
│   │   │   ├── app_navigation.dart
│   │   │   ├── app_pages.dart
│   │   │   └── route_path.dart
│   │   ├── services/
│   │   │   ├── bilibili_account_service.dart
│   │   │   ├── core_api_service.dart
│   │   │   ├── db_service.dart
│   │   │   ├── douyin_account_service.dart
│   │   │   ├── firebase_service.dart
│   │   │   ├── follow_service.dart
│   │   │   ├── history_service.dart
│   │   │   ├── local_storage_service.dart
│   │   │   ├── migration_service.dart
│   │   │   ├── signalr_service.dart
│   │   │   ├── sync_service.dart
│   │   │   └── window_service.dart
│   │   ├── src/
│   │   │   └── rust/
│   │   │       ├── api/
│   │   │       │   ├── danmaku_mask.dart
│   │   │       │   └── simple.dart
│   │   │       ├── frb_generated.dart
│   │   │       ├── frb_generated.io.dart
│   │   │       └── frb_generated.web.dart
│   │   └── widgets/
│   │       ├── desktop_refresh_button.dart
│   │       ├── filter_button.dart
│   │       ├── follow_user_item.dart
│   │       ├── keep_alive_wrapper.dart
│   │       ├── live_room_card.dart
│   │       ├── net_image.dart
│   │       ├── none_border_circular_textfield.dart
│   │       ├── page_grid_view.dart
│   │       ├── page_list_view.dart
│   │       ├── rectangular_indicator.dart
│   │       ├── settings/
│   │       │   ├── settings_action.dart
│   │       │   ├── settings_card.dart
│   │       │   ├── settings_menu.dart
│   │       │   ├── settings_menu_check.dart
│   │       │   ├── settings_number.dart
│   │       │   └── settings_switch.dart
│   │       ├── shadow_card.dart
│   │       ├── status/
│   │       │   ├── app_empty_widget.dart
│   │       │   ├── app_error_widget.dart
│   │       │   └── app_loadding_widget.dart
│   │       ├── superchat_card.dart
│   │       └── ui/
│   │           └── after_post_frame.dart
│   ├── linux/
│   │   ├── .gitignore
│   │   ├── CMakeLists.txt
│   │   ├── flutter/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── generated_plugin_registrant.cc
│   │   │   ├── generated_plugin_registrant.h
│   │   │   └── generated_plugins.cmake
│   │   ├── packaging/
│   │   │   ├── aur/
│   │   │   │   └── slive.desktop
│   │   │   └── deb/
│   │   │       └── make_config.yaml
│   │   └── runner/
│   │       ├── CMakeLists.txt
│   │       ├── main.cc
│   │       ├── my_application.cc
│   │       └── my_application.h
│   ├── macos/
│   │   ├── .gitignore
│   │   ├── Flutter/
│   │   │   ├── Flutter-Debug.xcconfig
│   │   │   ├── Flutter-Release.xcconfig
│   │   │   └── GeneratedPluginRegistrant.swift
│   │   ├── Podfile
│   │   ├── Runner/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── Contents.json
│   │   │   ├── Base.lproj/
│   │   │   │   └── MainMenu.xib
│   │   │   ├── Configs/
│   │   │   │   ├── AppInfo.xcconfig
│   │   │   │   ├── Debug.xcconfig
│   │   │   │   ├── Release.xcconfig
│   │   │   │   └── Warnings.xcconfig
│   │   │   ├── DebugProfile.entitlements
│   │   │   ├── Info.plist
│   │   │   ├── MainFlutterWindow.swift
│   │   │   └── Release.entitlements
│   │   ├── Runner.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   ├── project.xcworkspace/
│   │   │   │   └── xcshareddata/
│   │   │   │       └── IDEWorkspaceChecks.plist
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── Runner.xcscheme
│   │   ├── Runner.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   ├── RunnerTests/
│   │   │   └── RunnerTests.swift
│   │   └── packaging/
│   │       └── dmg/
│   │           └── make_config.yaml
│   ├── pubspec.yaml
│   ├── rust/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── api/
│   │       │   ├── danmaku_mask.rs
│   │       │   ├── mod.rs
│   │       │   └── simple.rs
│   │       ├── frb_generated.rs
│   │       └── lib.rs
│   ├── rust_builder/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── android/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── settings.gradle
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── AndroidManifest.xml
│   │   ├── cargokit/
│   │   │   ├── .gitignore
│   │   │   ├── LICENSE
│   │   │   ├── README
│   │   │   ├── build_pod.sh
│   │   │   ├── build_tool/
│   │   │   │   ├── README.md
│   │   │   │   ├── analysis_options.yaml
│   │   │   │   ├── bin/
│   │   │   │   │   └── build_tool.dart
│   │   │   │   ├── lib/
│   │   │   │   │   ├── build_tool.dart
│   │   │   │   │   └── src/
│   │   │   │   │       ├── android_environment.dart
│   │   │   │   │       ├── artifacts_provider.dart
│   │   │   │   │       ├── build_cmake.dart
│   │   │   │   │       ├── build_gradle.dart
│   │   │   │   │       ├── build_pod.dart
│   │   │   │   │       ├── build_tool.dart
│   │   │   │   │       ├── builder.dart
│   │   │   │   │       ├── cargo.dart
│   │   │   │   │       ├── crate_hash.dart
│   │   │   │   │       ├── environment.dart
│   │   │   │   │       ├── logging.dart
│   │   │   │   │       ├── options.dart
│   │   │   │   │       ├── precompile_binaries.dart
│   │   │   │   │       ├── rustup.dart
│   │   │   │   │       ├── target.dart
│   │   │   │   │       ├── util.dart
│   │   │   │   │       └── verify_binaries.dart
│   │   │   │   ├── pubspec.lock
│   │   │   │   └── pubspec.yaml
│   │   │   ├── cmake/
│   │   │   │   ├── cargokit.cmake
│   │   │   │   └── resolve_symlinks.ps1
│   │   │   ├── gradle/
│   │   │   │   └── plugin.gradle
│   │   │   ├── run_build_tool.cmd
│   │   │   └── run_build_tool.sh
│   │   ├── ios/
│   │   │   ├── Classes/
│   │   │   │   └── dummy_file.c
│   │   │   └── rust_lib_simple_live_app.podspec
│   │   ├── linux/
│   │   │   └── CMakeLists.txt
│   │   ├── macos/
│   │   │   ├── Classes/
│   │   │   │   └── dummy_file.c
│   │   │   └── rust_lib_simple_live_app.podspec
│   │   ├── pubspec.yaml
│   │   └── windows/
│   │       ├── .gitignore
│   │       └── CMakeLists.txt
│   ├── shorebird.yaml
│   ├── test/
│   │   ├── tool_test.dart
│   │   └── widget_test.dart
│   ├── test_driver/
│   │   └── integration_test.dart
│   └── windows/
│       ├── .gitignore
│       ├── CMakeLists.txt
│       ├── flutter/
│       │   ├── CMakeLists.txt
│       │   ├── generated_plugin_registrant.cc
│       │   ├── generated_plugin_registrant.h
│       │   └── generated_plugins.cmake
│       ├── packaging/
│       │   ├── exe/
│       │   │   ├── ChineseSimplified.isl
│       │   │   └── make_config.yaml
│       │   └── msix/
│       │       └── make_config.yaml
│       └── runner/
│           ├── CMakeLists.txt
│           ├── Runner.rc
│           ├── flutter_window.cpp
│           ├── flutter_window.h
│           ├── main.cpp
│           ├── resource.h
│           ├── runner.exe.manifest
│           ├── utils.cpp
│           ├── utils.h
│           ├── win32_window.cpp
│           └── win32_window.h
├── simple_live_console/
│   ├── .fvmrc
│   ├── .gitignore
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── bin/
│   │   └── simple_live_console.dart
│   ├── pubspec.yaml
│   └── test/
│       └── all_live_console_test.dart
├── simple_live_core/
│   ├── .fvmrc
│   ├── .gitattributes
│   ├── .gitignore
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── assets/
│   │   └── js/
│   │       ├── a_bogus.js
│   │       └── douyin-webmssdk.js
│   ├── example/
│   │   └── simple_live_core_example.dart
│   ├── lib/
│   │   ├── simple_live_core.dart
│   │   └── src/
│   │       ├── common/
│   │       │   ├── binary_writer.dart
│   │       │   ├── convert_helper.dart
│   │       │   ├── core_error.dart
│   │       │   ├── core_log.dart
│   │       │   ├── custom_interceptor.dart
│   │       │   ├── douyin/
│   │       │   │   ├── abogus.dart
│   │       │   │   ├── douyinRequestParams.dart
│   │       │   │   └── douyin_utils.dart
│   │       │   ├── http_client.dart
│   │       │   ├── js_engine.dart
│   │       │   └── web_socket_util.dart
│   │       ├── danmaku/
│   │       │   ├── bilibili_danmaku.dart
│   │       │   ├── douyin_danmaku.dart
│   │       │   ├── douyu_danmaku.dart
│   │       │   ├── huya_danmaku.dart
│   │       │   ├── proto/
│   │       │   │   ├── douyin.pb.dart
│   │       │   │   ├── douyin.pbenum.dart
│   │       │   │   ├── douyin.pbjson.dart
│   │       │   │   └── douyin.proto
│   │       │   └── twitch_danmaku.dart
│   │       ├── interface/
│   │       │   ├── live_danmaku.dart
│   │       │   └── live_site.dart
│   │       ├── model/
│   │       │   ├── live_anchor_item.dart
│   │       │   ├── live_category.dart
│   │       │   ├── live_category_result.dart
│   │       │   ├── live_message.dart
│   │       │   ├── live_play_quality.dart
│   │       │   ├── live_play_url.dart
│   │       │   ├── live_room_detail.dart
│   │       │   ├── live_room_item.dart
│   │       │   ├── live_search_result.dart
│   │       │   └── tars/
│   │       │       ├── get_cdn_token_ex_req.dart
│   │       │       ├── get_cdn_token_ex_resp.dart
│   │       │       ├── get_cdn_token_req.dart
│   │       │       ├── get_cdn_token_resp.dart
│   │       │       ├── huya_danmaku.dart
│   │       │       ├── tar2dart.dart
│   │       │       └── types.dart
│   │       └── platforms/
│   │           ├── bilibili/
│   │           │   └── bilibili_site.dart
│   │           ├── douyin/
│   │           │   ├── abogus.dart
│   │           │   ├── douyin_request_params.dart
│   │           │   ├── douyin_site.dart
│   │           │   └── douyin_utils.dart
│   │           ├── douyu/
│   │           │   └── douyu_site.dart
│   │           ├── huya/
│   │           │   ├── huya_site.dart
│   │           │   └── utils.dart
│   │           ├── readme.md
│   │           └── twitch/
│   │               ├── models.dart
│   │               └── twitch_site.dart
│   ├── packages/
│   │   └── tars_dart/
│   │       ├── .gitignore
│   │       ├── CHANGELOG.md
│   │       ├── LICENSE
│   │       ├── README.md
│   │       ├── analysis_options.yaml
│   │       ├── lib/
│   │       │   └── tars/
│   │       │       ├── codec/
│   │       │       │   ├── tars_decode_exception.dart
│   │       │       │   ├── tars_deep_copyable.dart
│   │       │       │   ├── tars_displayer.dart
│   │       │       │   ├── tars_encode_exception.dart
│   │       │       │   ├── tars_input_stream.dart
│   │       │       │   ├── tars_output_stream.dart
│   │       │       │   └── tars_struct.dart
│   │       │       ├── net/
│   │       │       │   └── base_tars_http.dart
│   │       │       └── tup/
│   │       │           ├── basic_class_type_util.dart
│   │       │           ├── const.dart
│   │       │           ├── object_create_exception.dart
│   │       │           ├── request_packet.dart
│   │       │           ├── tars_uni_packet.dart
│   │       │           ├── tup_response.dart
│   │       │           ├── tup_result_exception.dart
│   │       │           ├── uni_attribute.dart
│   │       │           ├── uni_packet.dart
│   │       │           └── write_buffer.dart
│   │       └── pubspec.yaml
│   ├── pubspec.yaml
│   └── test/
│       ├── douyu_sc.json
│       └── simple_live_core_test.dart
└── simple_live_tv_app/
    ├── .fvmrc
    ├── .gitignore
    ├── .metadata
    ├── README.md
    ├── analysis_options.yaml
    ├── android/
    │   ├── .gitignore
    │   ├── app/
    │   │   ├── build.gradle.kts
    │   │   ├── proguard-rules.pro
    │   │   └── src/
    │   │       ├── debug/
    │   │       │   └── AndroidManifest.xml
    │   │       ├── main/
    │   │       │   ├── AndroidManifest.xml
    │   │       │   ├── java/
    │   │       │   │   └── com/
    │   │       │   │       └── bgylde/
    │   │       │   │           └── live/
    │   │       │   │               └── MainActivity.java
    │   │       │   ├── kotlin/
    │   │       │   │   └── com/
    │   │       │   │       └── xycz/
    │   │       │   │           └── simple_live_tv/
    │   │       │   │               └── MainActivity.kt
    │   │       │   └── res/
    │   │       │       ├── drawable/
    │   │       │       │   └── launch_background.xml
    │   │       │       ├── drawable-v21/
    │   │       │       │   └── launch_background.xml
    │   │       │       ├── mipmap-anydpi-v26/
    │   │       │       │   └── ic_banner.xml
    │   │       │       ├── values/
    │   │       │       │   ├── ic_banner_background.xml
    │   │       │       │   └── styles.xml
    │   │       │       ├── values-night/
    │   │       │       │   └── styles.xml
    │   │       │       └── xml/
    │   │       │           └── network_security_config.xml
    │   │       └── profile/
    │   │           └── AndroidManifest.xml
    │   ├── build.gradle.kts
    │   ├── gradle/
    │   │   └── wrapper/
    │   │       └── gradle-wrapper.properties
    │   ├── gradle.properties
    │   └── settings.gradle.kts
    ├── assets/
    │   ├── lotties/
    │   │   ├── empty.json
    │   │   ├── error.json
    │   │   └── loadding.json
    │   └── statement.txt
    ├── lib/
    │   ├── app/
    │   │   ├── app_error.dart
    │   │   ├── app_focus_node.dart
    │   │   ├── app_style.dart
    │   │   ├── base_focus_model.dart
    │   │   ├── constant.dart
    │   │   ├── controller/
    │   │   │   ├── app_settings_controller.dart
    │   │   │   └── base_controller.dart
    │   │   ├── event_bus.dart
    │   │   ├── log.dart
    │   │   ├── sites.dart
    │   │   └── utils.dart
    │   ├── main.dart
    │   ├── models/
    │   │   ├── account/
    │   │   │   └── bilibili_user_info_page.dart
    │   │   ├── db/
    │   │   │   ├── follow_user.dart
    │   │   │   ├── follow_user.g.dart
    │   │   │   ├── history.dart
    │   │   │   └── history.g.dart
    │   │   ├── follow_user_item.dart
    │   │   └── version_model.dart
    │   ├── modules/
    │   │   ├── account/
    │   │   │   └── bilibili/
    │   │   │       ├── qr_login_controller.dart
    │   │   │       └── qr_login_page.dart
    │   │   ├── agreement/
    │   │   │   └── agreement_page.dart
    │   │   ├── category/
    │   │   │   ├── category_controller.dart
    │   │   │   ├── category_page.dart
    │   │   │   └── detail/
    │   │   │       ├── category_detail_controller.dart
    │   │   │       └── category_detail_page.dart
    │   │   ├── follow_user/
    │   │   │   └── follow_user_page.dart
    │   │   ├── history/
    │   │   │   ├── history_controller.dart
    │   │   │   └── history_page.dart
    │   │   ├── home/
    │   │   │   ├── home_controller.dart
    │   │   │   └── home_page.dart
    │   │   ├── hot_live/
    │   │   │   ├── hot_live_controller.dart
    │   │   │   └── hot_live_page.dart
    │   │   ├── live_room/
    │   │   │   ├── live_room_controller.dart
    │   │   │   ├── live_room_page.dart
    │   │   │   └── player/
    │   │   │       ├── player_controller.dart
    │   │   │       └── player_controls.dart
    │   │   ├── search/
    │   │   │   ├── anchor/
    │   │   │   │   ├── search_anchor_controller.dart
    │   │   │   │   └── search_anchor_page.dart
    │   │   │   └── room/
    │   │   │       ├── search_room_controller.dart
    │   │   │       └── search_room_page.dart
    │   │   ├── settings/
    │   │   │   ├── settings_controller.dart
    │   │   │   └── settings_page.dart
    │   │   └── sync/
    │   │       ├── sync_controller.dart
    │   │       └── sync_page.dart
    │   ├── requests/
    │   │   ├── common_request.dart
    │   │   ├── custom_log_interceptor.dart
    │   │   ├── http_client.dart
    │   │   └── http_error.dart
    │   ├── routes/
    │   │   ├── app_navigation.dart
    │   │   ├── app_pages.dart
    │   │   └── route_path.dart
    │   ├── services/
    │   │   ├── bilibili_account_service.dart
    │   │   ├── db_service.dart
    │   │   ├── follow_user_service.dart
    │   │   ├── local_storage_service.dart
    │   │   ├── signalr_service.dart
    │   │   └── sync_service.dart
    │   └── widgets/
    │       ├── app_scaffold.dart
    │       ├── button/
    │       │   ├── highlight_button.dart
    │       │   ├── highlight_list_tile.dart
    │       │   └── home_big_button.dart
    │       ├── card/
    │       │   ├── anchor_card.dart
    │       │   └── live_room_card.dart
    │       ├── highlight_widget.dart
    │       ├── keep_alive_wrapper.dart
    │       ├── net_image.dart
    │       ├── page_grid_view.dart
    │       ├── rectangular_indicator.dart
    │       ├── settings_item_widget.dart
    │       └── status/
    │           ├── app_empty_widget.dart
    │           ├── app_error_widget.dart
    │           └── app_loadding_widget.dart
    ├── pubspec.yaml
    ├── test/
    │   └── widget_test.dart
    └── windows/
        ├── .gitignore
        ├── CMakeLists.txt
        ├── flutter/
        │   ├── CMakeLists.txt
        │   ├── generated_plugin_registrant.cc
        │   ├── generated_plugin_registrant.h
        │   └── generated_plugins.cmake
        └── runner/
            ├── CMakeLists.txt
            ├── Runner.rc
            ├── flutter_window.cpp
            ├── flutter_window.h
            ├── main.cpp
            ├── resource.h
            ├── runner.exe.manifest
            ├── utils.cpp
            ├── utils.h
            ├── win32_window.cpp
            └── win32_window.h
Download .txt
Showing preview only (282K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3656 symbols across 332 files)

FILE: assets/update-linux-metainfo.dart
  function _xmlEscape (line 4) | String _xmlEscape(String s)
  function main (line 11) | void main()

FILE: simple_live_app/integration_test/simple_test.dart
  function main (line 6) | void main()

FILE: simple_live_app/lib/app/app_style.dart
  class AppColors (line 5) | class AppColors {
  class AppStyle (line 19) | class AppStyle {
    method light (line 20) | ThemeData light({String? fontFamily})
    method darkTheme (line 42) | ThemeData darkTheme({String? fontFamily})

FILE: simple_live_app/lib/app/constant.dart
  class Constant (line 4) | class Constant {
  class HomePageItem (line 38) | class HomePageItem {
  type DownloadState (line 49) | enum DownloadState {
  type SortMethod (line 56) | enum SortMethod {
  function fromStore (line 66) | SortMethod fromStore(String? v)

FILE: simple_live_app/lib/app/controller/app_settings_controller.dart
  class AppSettingsController (line 11) | class AppSettingsController extends GetxController {
    method onInit (line 25) | void onInit()
    method initSiteSort (line 196) | void initSiteSort()
    method initHomeSort (line 216) | void initHomeSort()
    method setNoFirstRun (line 236) | void setNoFirstRun()
    method setHardwareDecode (line 246) | void setHardwareDecode(bool e)
    method setChatTextSize (line 254) | void setChatTextSize(double e)
    method setChatTextGap (line 261) | void setChatTextGap(double e)
    method setChatBubbleStyle (line 268) | void setChatBubbleStyle(bool e)
    method setDanmuSize (line 276) | void setDanmuSize(double e)
    method setDanmuSpeed (line 283) | void setDanmuSpeed(double e)
    method setDanmuArea (line 290) | void setDanmuArea(double e)
    method setDanmuOpacity (line 297) | void setDanmuOpacity(double e)
    method setDanmuEnable (line 304) | void setDanmuEnable(bool e)
    method setDanmakuMaskEnable (line 311) | void setDanmakuMaskEnable(bool e)
    method setDanmuStrokeWidth (line 319) | void setDanmuStrokeWidth(double e)
    method setDanmuFontWeight (line 327) | void setDanmuFontWeight(int e)
    method setQualityLevel (line 335) | void setQualityLevel(int level)
    method setQualityLevelCellular (line 343) | void setQualityLevelCellular(int level)
    method setAutoExitEnable (line 351) | void setAutoExitEnable(bool e)
    method setAutoExitDuration (line 359) | void setAutoExitDuration(int e)
    method setRoomAutoExitDuration (line 367) | void setRoomAutoExitDuration(int e)
    method setPlayerCompatMode (line 375) | void setPlayerCompatMode(bool e)
    method setPlayerBufferSize (line 383) | void setPlayerBufferSize(int e)
    method setPlayerAutoPause (line 391) | void setPlayerAutoPause(bool e)
    method setAutoFullScreen (line 399) | void setAutoFullScreen(bool e)
    method addShieldList (line 407) | void addShieldList(String e)
    method removeShieldList (line 412) | void removeShieldList(String e)
    method clearShieldList (line 417) | Future clearShieldList()
    method setScaleMode (line 422) | void setScaleMode(int value)
    method setSiteSort (line 432) | void setSiteSort(List<String> e)
    method setHomeSort (line 442) | void setHomeSort(List<String> e)
    method setPlayerVolume (line 452) | void setPlayerVolume(double value)
    method setPIPHideDanmu (line 462) | void setPIPHideDanmu(bool e)
    method setDanmuTopMargin (line 469) | void setDanmuTopMargin(double e)
    method setDanmuBottomMargin (line 477) | void setDanmuBottomMargin(double e)
    method setDanmuTextNormalization (line 486) | void setDanmuTextNormalization(bool e)
    method setDanmuMaxFrequency (line 494) | void setDanmuMaxFrequency(int e)
    method setDanmuFrequencyControl (line 502) | void setDanmuFrequencyControl(bool e)
    method setDanmuWindowMs (line 510) | void setDanmuWindowMs(int e)
    method setBiliBiliLoginTip (line 518) | void setBiliBiliLoginTip(bool e)
    method setLogEnable (line 526) | void setLogEnable(bool e)
    method setFirebaseEnable (line 533) | void setFirebaseEnable(bool e)
    method setCustomPlayerOutput (line 540) | void setCustomPlayerOutput(bool e)
    method setVideoOutputDriver (line 548) | void setVideoOutputDriver(String e)
    method setAudioOutputDriver (line 556) | void setAudioOutputDriver(String e)
    method setVideoHardwareDecoder (line 564) | void setVideoHardwareDecoder(String e)
    method setVideoDoubleBuffering (line 572) | void setVideoDoubleBuffering(bool e)
    method setAutoUpdateFollowEnable (line 580) | void setAutoUpdateFollowEnable(bool e)
    method setAutoUpdateFollowDuration (line 588) | void setAutoUpdateFollowDuration(int e)
    method setUpdateFollowThreadCount (line 596) | void setUpdateFollowThreadCount(int e)
    method setPlayerForceHttps (line 604) | void setPlayerForceHttps(bool e)
    method setDouyinHlsFirst (line 612) | void setDouyinHlsFirst(bool e)
    method setFollowSortMethod (line 620) | void setFollowSortMethod(SortMethod e)
    method setFollowStyleNotGrid (line 628) | void setFollowStyleNotGrid(bool e)

FILE: simple_live_app/lib/app/controller/base_controller.dart
  class BaseController (line 11) | class BaseController extends GetxController {
    method handleError (line 34) | void handleError(Object exception, {bool showPageError = false})
    method exceptionToString (line 46) | String exceptionToString(Object exception)
    method onLogin (line 50) | void onLogin()
    method onLogout (line 51) | void onLogout()
  class BasePageController (line 54) | class BasePageController<T> extends BaseController {
    method refreshData (line 64) | Future refreshData()
    method loadData (line 70) | Future loadData()
    method getData (line 105) | Future<List<T>> getData(int page, int pageSize)
    method scrollToTopOrRefresh (line 109) | void scrollToTopOrRefresh()

FILE: simple_live_app/lib/app/custom_throttle.dart
  class DelayedThrottle (line 5) | class DelayedThrottle {
    method invoke (line 12) | void invoke(Future Function() longCostFunc)

FILE: simple_live_app/lib/app/event_bus.dart
  class EventBus (line 6) | class EventBus {
    method emit (line 23) | void emit<T>(String name, T data)
    method listen (line 33) | StreamSubscription<dynamic> listen(String name, Function(dynamic)? onD...

FILE: simple_live_app/lib/app/log.dart
  class Log (line 12) | class Log {
    method initWriter (line 14) | void initWriter()
    method disposeWriter (line 18) | void disposeWriter()
    method writeLog (line 23) | void writeLog(Object content, [Level level = Level.info])
    method addDebugLog (line 30) | void addDebugLog(String content, Color? color)
    method d (line 57) | void d(String message, [bool writeFile = true])
    method i (line 65) | void i(String message, [bool writeFile = true])
    method e (line 74) | void e(String message, StackTrace stackTrace,
    method w (line 83) | void w(String message, [bool writeFile = true])
    method logPrint (line 91) | void logPrint(dynamic obj, [bool writeFile = true])
  class LogFileWriter (line 105) | class LogFileWriter {
    method initFile (line 113) | void initFile()
    method write (line 124) | void write(String content)
    method close (line 129) | Future close()
    method writeSystemInfo (line 133) | void writeSystemInfo()
  class DebugLogModel (line 157) | class DebugLogModel {

FILE: simple_live_app/lib/app/sites.dart
  class Sites (line 8) | class Sites {
  class Site (line 55) | class Site {

FILE: simple_live_app/lib/app/utils.dart
  type TextValidate (line 18) | typedef TextValidate = bool Function(String text);
  class Utils (line 20) | class Utils {
    method parseTime (line 27) | String parseTime(DateTime? dt)
    method showAlertDialog (line 51) | Future<bool> showAlertDialog(
    method showMessageDialog (line 93) | Future<bool> showMessageDialog(String content,
    method showRightDialog (line 113) | void showRightDialog({
    method hideRightDialog (line 183) | void hideRightDialog()
    method showBottomSheet (line 187) | Future showBottomSheet({
    method showEditTextDialog (line 229) | Future<String?> showEditTextDialog(
    method showOptionDialog (line 281) | Future<T?> showOptionDialog<T>(
    method showInformationHelpDialog (line 312) | Future<T?> showInformationHelpDialog<T>({
    method showStatement (line 334) | Future showStatement()
    method showMapOptionDialog (line 349) | Future<T?> showMapOptionDialog<T>(
    method checkUpdate (line 380) | void checkUpdate({bool showMsg = false})
    method parseVersion (line 443) | int parseVersion(String version)
    method onlineToString (line 452) | String onlineToString(int num)
    method checkPhotoPermission (line 460) | Future<bool> checkPhotoPermission()
    method checkStorgePermission (line 486) | Future<bool> checkStorgePermission()
    method convertHexColor (line 516) | Color convertHexColor(String hexColor)
    method copyToClipboard (line 541) | void copyToClipboard(String text)
    method getClipboard (line 552) | Future<String?> getClipboard()
    method isRegexFormat (line 567) | bool isRegexFormat(String keyword)
    method removeRegexFormat (line 573) | String removeRegexFormat(String keyword)
    method parseFileSize (line 577) | String parseFileSize(int size)

FILE: simple_live_app/lib/app/utils/archive.dart
  function addDirectoryToArchive (line 7) | void addDirectoryToArchive(String dirPath, String parentPath)
  function add (line 22) | void add<T>(String name, T raw)

FILE: simple_live_app/lib/app/utils/document.dart
  function clear (line 7) | Future<void> clear()
  function clearSync (line 31) | void clearSync()

FILE: simple_live_app/lib/app/utils/duration_2_str_utils.dart
  function toDuration (line 3) | Duration toDuration()
  function toHMSString (line 19) | String toHMSString()

FILE: simple_live_app/lib/app/utils/dynamic_filter.dart
  type LogicalOperator (line 4) | enum LogicalOperator { and, or }
  type FilterOperator (line 7) | enum FilterOperator {
  class Condition (line 18) | class Condition {
  class Mappable (line 43) | abstract class Mappable {
    method toMap (line 45) | Map<String, dynamic> toMap()
  class Filterable (line 52) | abstract class Filterable {
    method evaluate (line 55) | bool evaluate(Condition condition)
  function dynamicFilter (line 73) | List<T> dynamicFilter<T extends Mappable>(
  function check (line 85) | bool check(Condition c)
  function checkConditionOnMap (line 122) | bool checkConditionOnMap(Map<String, dynamic> itemMap, Condition condition)
  function _isComparable (line 182) | bool _isComparable(dynamic a, dynamic b)

FILE: simple_live_app/lib/app/utils/dynamic_sort.dart
  class SortCondition (line 3) | class SortCondition<T> {
  function dynamicSort (line 15) | List<T> dynamicSort(List<SortCondition<T>> sortConditions)

FILE: simple_live_app/lib/app/utils/listen_fourth_button.dart
  class FourthButtonTapGestureRecognizer (line 6) | class FourthButtonTapGestureRecognizer extends BaseTapGestureRecognizer {
    method handleTapDown (line 10) | void handleTapDown({required PointerDownEvent down})
    method handleTapCancel (line 27) | void handleTapCancel(
    method handleTapUp (line 33) | void handleTapUp(

FILE: simple_live_app/lib/app/utils/permission_handler.dart
  function openAppSettings (line 22) | Future<bool> openAppSettings()
  function onDeniedCallback (line 45) | Permission onDeniedCallback(FutureOr<void>? Function()? callback)
  function onGrantedCallback (line 51) | Permission onGrantedCallback(FutureOr<void>? Function()? callback)
  function onPermanentlyDeniedCallback (line 57) | Permission onPermanentlyDeniedCallback(FutureOr<void>? Function()? callb...
  function onRestrictedCallback (line 63) | Permission onRestrictedCallback(FutureOr<void>? Function()? callback)
  function onLimitedCallback (line 69) | Permission onLimitedCallback(FutureOr<void>? Function()? callback)
  function onProvisionalCallback (line 75) | Permission onProvisionalCallback(FutureOr<void>? Function()? callback)
  function request (line 107) | Future<PermissionStatus> request()
  function request (line 199) | Future<Map<Permission, PermissionStatus>> request()

FILE: simple_live_app/lib/app/utils/sandbox.dart
  function runningInSandbox (line 4) | bool runningInSandbox()

FILE: simple_live_app/lib/app/utils/string_normalizer.dart
  function normalize (line 18) | String normalize()

FILE: simple_live_app/lib/app/utils/url_parse.dart
  class UrlParse (line 6) | class UrlParse {
    method parse (line 15) | Future<List> parse(String url)
    method _getLocation (line 73) | Future<String> _getLocation(String url)

FILE: simple_live_app/lib/firebase_options.dart
  class DefaultFirebaseOptions (line 4) | class DefaultFirebaseOptions {

FILE: simple_live_app/lib/icons/live_icons.dart
  class LiveIcons (line 6) | class LiveIcons {
  class _PreviewIcon (line 15) | class _PreviewIcon {
  class LiveIconsPreview (line 23) | class LiveIconsPreview extends StatelessWidget {
    method build (line 32) | Widget build(BuildContext context)

FILE: simple_live_app/lib/main.dart
  function main (line 46) | void main()
  function initWindow (line 75) | Future initWindow()
  function initServices (line 83) | Future initServices()
  function initCoreLog (line 125) | void initCoreLog()
  class MyApp (line 150) | class MyApp extends StatelessWidget {
    method build (line 154) | Widget build(BuildContext context)

FILE: simple_live_app/lib/models/account/bilibili_user_info_page.dart
  function asT (line 3) | T? asT<T>(dynamic value)
  class BiliBiliUserInfoModel (line 10) | class BiliBiliUserInfoModel {
    method toString (line 44) | String toString()
    method toJson (line 48) | Map<String, dynamic> toJson()

FILE: simple_live_app/lib/models/account/douyin_user_info.dart
  function asT (line 3) | T? asT<T>(dynamic value)
  class DouyinUserInfoModel (line 10) | class DouyinUserInfoModel {
    method toString (line 38) | String toString()
    method toJson (line 42) | Map<String, dynamic> toJson()

FILE: simple_live_app/lib/models/db/follow_user.dart
  class FollowUser (line 7) | @HiveType(typeId: 1)
    method toJson (line 76) | Map<String, dynamic> toJson()
    method toMap (line 90) | Map<String, dynamic> toMap()

FILE: simple_live_app/lib/models/db/follow_user.g.dart
  class FollowUserAdapter (line 9) | class FollowUserAdapter extends TypeAdapter<FollowUser> {
    method read (line 14) | FollowUser read(BinaryReader reader)
    method write (line 34) | void write(BinaryWriter writer, FollowUser obj)

FILE: simple_live_app/lib/models/db/follow_user_tag.dart
  class FollowUserTag (line 5) | @HiveType(typeId: 3)
    method toJson (line 32) | Map<String, dynamic> toJson()
    method copyWith (line 40) | FollowUserTag copyWith({

FILE: simple_live_app/lib/models/db/follow_user_tag.g.dart
  class FollowUserTagAdapter (line 9) | class FollowUserTagAdapter extends TypeAdapter<FollowUserTag> {
    method read (line 14) | FollowUserTag read(BinaryReader reader)
    method write (line 27) | void write(BinaryWriter writer, FollowUserTag obj)

FILE: simple_live_app/lib/models/db/history.dart
  class History (line 7) | @HiveType(typeId: 2)
    method toJson (line 53) | Map<String, dynamic> toJson()
    method toMap (line 64) | Map<String, dynamic> toMap()

FILE: simple_live_app/lib/models/db/history.g.dart
  class HistoryAdapter (line 9) | class HistoryAdapter extends TypeAdapter<History> {
    method read (line 14) | History read(BinaryReader reader)
    method write (line 31) | void write(BinaryWriter writer, History obj)

FILE: simple_live_app/lib/models/font_model.dart
  class FontModel (line 1) | class FontModel {
    method toJson (line 36) | Map<String, dynamic> toJson()
  class FontLicense (line 58) | class FontLicense {
    method toJson (line 74) | Map<String, dynamic> toJson()

FILE: simple_live_app/lib/models/fonts_model.dart
  function asT (line 1) | T? asT<T>(dynamic value)
  class FontsModel (line 7) | class FontsModel{

FILE: simple_live_app/lib/models/sync_client_info_model.dart
  function asT (line 3) | T? asT<T>(dynamic value)
  class SyncClientInfoModel (line 10) | class SyncClientInfoModel {
    method toString (line 34) | String toString()
    method toJson (line 38) | Map<String, dynamic> toJson()

FILE: simple_live_app/lib/models/version_model.dart
  function asT (line 3) | T? asT<T>(dynamic value)
  class VersionModel (line 10) | class VersionModel {
    method toString (line 31) | String toString()
    method toJson (line 35) | Map<String, dynamic> toJson()

FILE: simple_live_app/lib/modules/category/category_controller.dart
  class CategoryController (line 11) | class CategoryController extends GetxController
    method onInit (line 20) | void onInit()
    method refreshOrScrollTop (line 36) | void refreshOrScrollTop()
    method onClose (line 45) | void onClose()

FILE: simple_live_app/lib/modules/category/category_list_controller.dart
  class CategoryListController (line 6) | class CategoryListController extends BasePageController<AppLiveCategory> {
    method getData (line 11) | Future<List<AppLiveCategory>> getData(int page, int pageSize)
  class AppLiveCategory (line 18) | class AppLiveCategory extends LiveCategory {

FILE: simple_live_app/lib/modules/category/category_list_view.dart
  class CategoryListView (line 14) | class CategoryListView extends StatelessWidget {
    method build (line 20) | Widget build(BuildContext context)
    method buildSubCategory (line 81) | Widget buildSubCategory(LiveSubCategory item)
    method buildShowMore (line 107) | Widget buildShowMore(AppLiveCategory item)

FILE: simple_live_app/lib/modules/category/category_page.dart
  class CategoryPage (line 8) | class CategoryPage extends GetView<CategoryController> {
    method build (line 12) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/category/detail/category_detail_controller.dart
  class CategoryDetailController (line 5) | class CategoryDetailController extends BasePageController<LiveRoomItem> {
    method getData (line 14) | Future<List<LiveRoomItem>> getData(int page, int pageSize)

FILE: simple_live_app/lib/modules/category/detail/category_detail_page.dart
  class CategoryDetailPage (line 10) | class CategoryDetailPage extends GetView<CategoryDetailController> {
    method build (line 14) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/follow_user/follow_app_setting/follow_app_settings_controller.dart
  class FollowAppSettingsController (line 19) | class FollowAppSettingsController extends BaseController {
    method onInit (line 30) | void onInit()
    method updateTagList (line 36) | void updateTagList()
    method removeTag (line 40) | Future removeTag(FollowUserTag tag)
    method addTag (line 46) | void addTag(String tag)
    method updateTag (line 51) | Future<void> updateTag(FollowUserTag followUserTag)
    method updateTagName (line 55) | void updateTagName(FollowUserTag followUserTag, String newTagName)
    method updateTagOrder (line 70) | Future<void> updateTagOrder(int oldIndex, int newIndex)
    method followDataCheck (line 81) | Future<void> followDataCheck()
    method showTagsManager (line 87) | void showTagsManager()
    method editTagDialog (line 147) | void editTagDialog(String title, {FollowUserTag? followUserTag})
    method cleanFollow (line 226) | Future<void> cleanFollow(List<FollowUser> cleanPool)
    method buildAutoCleanPool (line 246) | List<FollowUser> buildAutoCleanPool()

FILE: simple_live_app/lib/modules/follow_user/follow_app_setting/follow_app_settings_page.dart
  class FollowSettingsPage (line 14) | class FollowSettingsPage extends GetView<FollowAppSettingsController> {
    method build (line 18) | Widget build(BuildContext context)
    method fileImportAndExportBuild (line 170) | Widget fileImportAndExportBuild()
    method setTimer (line 199) | void setTimer(BuildContext context)

FILE: simple_live_app/lib/modules/follow_user/follow_info_setting/follow_info_controller.dart
  class FollowInfoController (line 15) | class FollowInfoController extends BasePageController<FollowUser> {
    method onInit (line 29) | void onInit()
    method _initTagOptions (line 43) | void _initTagOptions()
    method _initMigrationSites (line 62) | void _initMigrationSites()
    method changeTag (line 74) | void changeTag(FollowUserTag newTag)
    method updateRemark (line 82) | void updateRemark(String newRemark)
    method pasteFromClipboard (line 90) | Future<void> pasteFromClipboard()
    method parseAndMigrate (line 97) | Future<void> parseAndMigrate()
    method refreshData (line 153) | Future<void> refreshData()
    method _migrateTo (line 161) | Future<void> _migrateTo(Site targetSite, String targetRoomId)

FILE: simple_live_app/lib/modules/follow_user/follow_info_setting/follow_info_page.dart
  class FollowInfoPage (line 9) | class FollowInfoPage extends GetView<FollowInfoController> {
    method build (line 13) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/follow_user/follow_user_controller.dart
  class FollowUserController (line 18) | class FollowUserController extends BasePageController<FollowUser> {
    method onInit (line 49) | void onInit()
    method refreshData (line 70) | Future refreshData()
    method getData (line 77) | Future<List<FollowUser>> getData(int page, int pageSize)
    method updateTagList (line 93) | void updateTagList()
    method filterData (line 103) | void filterData()
    method showFollowStyleDialog (line 117) | Future<void> showFollowStyleDialog()
    method showSortDialog (line 129) | Future<void> showSortDialog()
    method setFilterMode (line 144) | void setFilterMode(FollowUserTag tag)
    method removeFollow (line 149) | void removeFollow(FollowUser follow)
    method updateFollow (line 167) | void updateFollow(FollowUser follow)
    method setFollowTag (line 171) | void setFollowTag(FollowUser follow, FollowUserTag targetTag)
    method updateTag (line 176) | Future<void> updateTag(FollowUserTag followUserTag)
    method showBottomMenu (line 181) | void showBottomMenu(FollowUser item)
    method setFollowTagDialog (line 209) | void setFollowTagDialog(FollowUser follow)
    method onClose (line 300) | void onClose()

FILE: simple_live_app/lib/modules/follow_user/follow_user_page.dart
  class FollowUserPage (line 19) | class FollowUserPage extends GetView<FollowUserController> {
    method build (line 23) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/home/home_controller.dart
  class HomeController (line 11) | class HomeController extends GetxController
    method onInit (line 22) | void onInit()
    method refreshOrScrollTop (line 38) | void refreshOrScrollTop()
    method toSearch (line 46) | void toSearch()
    method onClose (line 51) | void onClose()

FILE: simple_live_app/lib/modules/home/home_list_controller.dart
  class HomeListController (line 5) | class HomeListController extends BasePageController<LiveRoomItem> {
    method getData (line 10) | Future<List<LiveRoomItem>> getData(int page, int pageSize)

FILE: simple_live_app/lib/modules/home/home_list_view.dart
  class HomeListView (line 10) | class HomeListView extends StatelessWidget {
    method build (line 15) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/home/home_page.dart
  class HomePage (line 8) | class HomePage extends GetView<HomeController> {
    method build (line 12) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/indexed/indexed_controller.dart
  class IndexedController (line 16) | class IndexedController extends GetxController {
    method setIndex (line 27) | void setIndex(int i)
    method onInit (line 58) | void onInit()
    method showFirstRun (line 67) | void showFirstRun()

FILE: simple_live_app/lib/modules/indexed/indexed_page.dart
  class IndexedPage (line 7) | class IndexedPage extends GetView<IndexedController> {
    method build (line 11) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/live_room/danmu/danmaku_mask.dart
  class DanmakuMask (line 9) | class DanmakuMask {
    method _normalize (line 39) | String _normalize(String text)
    method _shiftIfNeeded (line 48) | void _shiftIfNeeded(int nowMs)
    method _adaptWindow (line 66) | void _adaptWindow()
    method allowList (line 81) | List<bool> allowList(List<String> texts, int nowMs)
    method reset (line 115) | void reset()
    method _editDistance (line 127) | int _editDistance(String a, String b)
  class IsolateDanmakuMask (line 157) | class IsolateDanmakuMask {
    method create (line 167) | Future<IsolateDanmakuMask> create({
    method _init (line 187) | Future<void> _init({
    method allowList (line 227) | Future<List<bool>> allowList(List<String> texts, int nowMs)
    method reset (line 235) | void reset()
    method dispose (line 239) | void dispose()
  function _danmakuIsolateEntryPoint (line 246) | void _danmakuIsolateEntryPoint(List<dynamic> initialMessage)

FILE: simple_live_app/lib/modules/live_room/live_room_controller.dart
  class LiveRoomController (line 35) | class LiveRoomController extends PlayerController with WidgetsBindingObs...
    method onInit (line 118) | void onInit()
    method _initDanmakuMask (line 135) | void _initDanmakuMask()
    method _processDanmakuBuffer (line 155) | void _processDanmakuBuffer()
    method scrollListener (line 205) | void scrollListener()
    method initAutoExit (line 213) | void initAutoExit()
    method setAutoExit (line 225) | void setAutoExit()
    method refreshRoom (line 257) | void refreshRoom()
    method chatScrollToBottom (line 266) | void chatScrollToBottom()
    method initDanmau (line 277) | void initDanmau()
    method onWSMessage (line 284) | void onWSMessage(LiveMessage msg)
    method addSysMsg (line 342) | void addSysMsg(String msg)
    method onWSClose (line 354) | void onWSClose(String msg)
    method onWSReady (line 359) | void onWSReady()
    method loadData (line 364) | void loadData()
    method getPlayQualites (line 428) | void getPlayQualites()
    method getQualityLevel (line 459) | Future<int> getQualityLevel()
    method getPlayUrl (line 473) | Future<void> getPlayUrl()
    method changePlayLine (line 492) | void changePlayLine(int index)
    method initPlaylist (line 499) | void initPlaylist()
    method setPlayer (line 517) | void setPlayer()
    method mediaEnd (line 525) | void mediaEnd()
    method mediaError (line 552) | void mediaError(String error)
    method getSuperChatMessage (line 577) | void getSuperChatMessage()
    method removeSuperChats (line 589) | void removeSuperChats()
    method addHistory (line 595) | void addHistory()
    method followUser (line 612) | void followUser()
    method removeFollowUser (line 635) | void removeFollowUser()
    method share (line 649) | void share()
    method copyUrl (line 656) | void copyUrl()
    method visitWebLive (line 664) | Future<void> visitWebLive()
    method showDanmuSettingsSheet (line 674) | void showDanmuSettingsSheet()
    method showVolumeSlider (line 692) | void showVolumeSlider(BuildContext targetContext)
    method showQualitySheet (line 724) | void showQualitySheet()
    method showPlayUrlsSheet (line 748) | void showPlayUrlsSheet()
    method showPlayerSettingsSheet (line 775) | void showPlayerSettingsSheet()
    method showDanmuShield (line 824) | void showDanmuShield()
    method addKeyword (line 827) | void addKeyword()
    method showFollowUserSheet (line 902) | void showFollowUserSheet()
    method showAutoExitSheet (line 948) | void showAutoExitSheet()
    method openNaviteAPP (line 1016) | void openNaviteAPP()
    method resetRoom (line 1045) | void resetRoom(Site site, String roomId)
    method copyErrorDetail (line 1071) | void copyErrorDetail()
    method didChangeAppLifecycleState (line 1082) | void didChangeAppLifecycleState(AppLifecycleState state)
    method onClose (line 1105) | void onClose()

FILE: simple_live_app/lib/modules/live_room/live_room_page.dart
  class LiveRoomPage (line 27) | class LiveRoomPage extends GetView<LiveRoomController> {
    method build (line 31) | Widget build(BuildContext context)
    method buildPageUI (line 113) | Widget buildPageUI()
    method buildPhoneUI (line 131) | Widget buildPhoneUI(BuildContext context)
    method buildTabletUI (line 145) | Widget buildTabletUI(BuildContext context)
    method buildMediaPlayer (line 241) | Widget buildMediaPlayer()
    method buildUserProfile (line 289) | Widget buildUserProfile(BuildContext context)
    method buildBottomActions (line 376) | Widget buildBottomActions(BuildContext context)
    method buildMessageArea (line 435) | Widget buildMessageArea()
    method buildMessageItem (line 519) | Widget buildMessageItem(LiveMessage message)
    method buildSuperChats (line 595) | Widget buildSuperChats()
    method buildSettings (line 616) | Widget buildSettings()
    method buildFollowList (line 717) | Widget buildFollowList()
    method buildAppbarActions (line 759) | List<Widget> buildAppbarActions(BuildContext context)
    method showMore (line 770) | void showMore()
    method parseDuration (line 890) | String parseDuration(int sec)

FILE: simple_live_app/lib/modules/live_room/player/player_controller.dart
  function initializePlayer (line 43) | Future<void> initializePlayer()
  function hideControls (line 166) | void hideControls()
  function setLockState (line 171) | void setLockState()
  function showControls (line 181) | void showControls()
  function resetHideControlsTimer (line 188) | void resetHideControlsTimer()
  function updateScaleMode (line 199) | void updateScaleMode()
  function initDanmakuController (line 229) | void initDanmakuController(DanmakuController e)
  function updateDanmuOption (line 233) | void updateDanmuOption(DanmakuOption? option)
  function disposeDanmakuController (line 238) | void disposeDanmakuController()
  function addDanmaku (line 242) | void addDanmaku(List<DanmakuContentItem> items)
  function initSystem (line 259) | void initSystem()
  function resetSystem (line 272) | Future resetSystem()
  function enterFullScreen (line 294) | void enterFullScreen()
  function exitFull (line 315) | void exitFull()
  function enterSmallWindow (line 337) | void enterSmallWindow()
  function exitSmallWindow (line 366) | void exitSmallWindow()
  function setLandscapeOrientation (line 380) | Future setLandscapeOrientation()
  function setPortraitOrientation (line 392) | Future setPortraitOrientation()
  function beforeIOS16 (line 401) | Future<bool> beforeIOS16()
  function saveScreenshot (line 412) | Future saveScreenshot()
  function enablePIP (line 463) | Future enablePIP()
  function onTap (line 509) | void onTap()
  function onEnter (line 518) | void onEnter(PointerEnterEvent event)
  function onExit (line 524) | void onExit(PointerExitEvent event)
  function onHover (line 530) | void onHover(PointerHoverEvent event, BuildContext context)
  function onDoubleTap (line 542) | void onDoubleTap(TapDownDetails details)
  function onVerticalDragStart (line 562) | void onVerticalDragStart(DragStartDetails details)
  function onVerticalDragUpdate (line 591) | void onVerticalDragUpdate(DragUpdateDetails e)
  function setGestureVolume (line 613) | void setGestureVolume(double dy)
  function _convertVolume (line 641) | int _convertVolume(int volume)
  function _realSetVolume (line 645) | Future _realSetVolume(int volume)
  function setGestureBrightness (line 650) | void setGestureBrightness(double dy)
  function onVerticalDragEnd (line 677) | void onVerticalDragEnd(DragEndDetails details)
  class PlayerController (line 688) | class PlayerController extends BaseController
    method onInit (line 696) | void onInit()
    method initStream (line 712) | void initStream()
    method disposeStream (line 765) | void disposeStream()
    method mediaEnd (line 776) | void mediaEnd()
    method mediaError (line 780) | void mediaError(String error)
    method toggleOSDStats (line 785) | Future<void> toggleOSDStats()
    method showDebugInfo (line 795) | void showDebugInfo()
    method onClose (line 899) | void onClose()

FILE: simple_live_app/lib/modules/live_room/player/player_controls.dart
  function playerControls (line 21) | Widget playerControls(
  function buildFullControls (line 40) | Widget buildFullControls(
  function buildLockButton (line 376) | Widget buildLockButton(LiveRoomController controller)
  function buildControls (line 403) | Widget buildControls(
  function buildDanmuView (line 599) | Widget buildDanmuView(VideoState videoState, LiveRoomController controller)
  function showLinesInfo (line 634) | void showLinesInfo(LiveRoomController controller)
  function showQualitesInfo (line 686) | void showQualitesInfo(LiveRoomController controller)
  function showDanmakuSettings (line 717) | void showDanmakuSettings(LiveRoomController controller)
  function showPlayerSettings (line 737) | void showPlayerSettings(LiveRoomController controller)
  function showFollowUser (line 804) | void showFollowUser(LiveRoomController controller)

FILE: simple_live_app/lib/modules/mine/account/account_controller.dart
  class AccountController (line 10) | class AccountController extends GetxController {
    method bilibiliTap (line 11) | void bilibiliTap()
    method bilibiliLogin (line 23) | void bilibiliLogin()
    method doCookieLogin (line 67) | void doCookieLogin()
    method douyinTap (line 81) | void douyinTap()

FILE: simple_live_app/lib/modules/mine/account/account_page.dart
  class AccountPage (line 8) | class AccountPage extends GetView<AccountController> {
    method build (line 12) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/mine/account/bilibili/qr_login_controller.dart
  type QRStatus (line 9) | enum QRStatus {
  class BiliBiliQRLoginController (line 17) | class BiliBiliQRLoginController extends GetxController {
    method onInit (line 19) | void onInit()
    method loadQRCode (line 37) | void loadQRCode()
    method startPoll (line 58) | void startPoll()
    method pollQRStatus (line 67) | void pollQRStatus()
    method onClose (line 107) | void onClose()

FILE: simple_live_app/lib/modules/mine/account/bilibili/qr_login_page.dart
  class BiliBiliQRLoginPage (line 7) | class BiliBiliQRLoginPage extends GetView<BiliBiliQRLoginController> {
    method build (line 11) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/mine/account/bilibili/web_login_controller.dart
  class BiliBiliWebLoginController (line 8) | class BiliBiliWebLoginController extends BaseController {
    method onWebViewCreated (line 11) | void onWebViewCreated(InAppWebViewController controller)
    method toQRLogin (line 20) | void toQRLogin()
    method onLoadStop (line 25) | void onLoadStop(InAppWebViewController controller, Uri? uri)
    method logined (line 34) | Future<bool> logined()

FILE: simple_live_app/lib/modules/mine/account/bilibili/web_login_page.dart
  class BiliBiliWebLoginPage (line 6) | class BiliBiliWebLoginPage extends GetView<BiliBiliWebLoginController> {
    method build (line 10) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/mine/history/history_controller.dart
  class HistoryController (line 6) | class HistoryController extends BasePageController<History> {
    method getData (line 8) | Future<List<History>> getData(int page, int pageSize)
    method clean (line 15) | void clean()
    method removeItem (line 24) | void removeItem(History item)

FILE: simple_live_app/lib/modules/mine/history/history_page.dart
  class HistoryPage (line 11) | class HistoryPage extends GetView<HistoryController> {
    method build (line 15) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/mine/mine_page.dart
  class MinePage (line 13) | class MinePage extends StatelessWidget {
    method build (line 17) | Widget build(BuildContext context)
    method _buildCard (line 274) | Widget _buildCard(BuildContext context, {required List<Widget> children})

FILE: simple_live_app/lib/modules/mine/parse/parse_controller.dart
  class ParseController (line 9) | class ParseController extends GetxController {
    method jumpToRoom (line 13) | void jumpToRoom(String e)
    method getPlayUrl (line 34) | void getPlayUrl(String e)

FILE: simple_live_app/lib/modules/mine/parse/parse_page.dart
  class ParsePage (line 7) | class ParsePage extends GetView<ParseController> {
    method build (line 11) | Widget build(BuildContext context)
    method buildCard (line 117) | Widget buildCard({required BuildContext context, required Widget child})

FILE: simple_live_app/lib/modules/other/debug_log_page.dart
  class DebugLogPage (line 10) | class DebugLogPage extends StatelessWidget {
    method build (line 14) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/search/douyin/douyin_search_controller.dart
  class DouyinSearchController (line 12) | class DouyinSearchController extends BaseController {
    method onWebViewCreated (line 15) | void onWebViewCreated(InAppWebViewController controller)
    method reloadWebView (line 32) | void reloadWebView()
    method onLoadStop (line 47) | void onLoadStop(InAppWebViewController controller, Uri? uri)
    method onLoadStart (line 51) | void onLoadStart(InAppWebViewController controller, Uri? uri)
    method onCreateWindow (line 55) | Future<bool?> onCreateWindow(InAppWebViewController controller,
    method openBrowser (line 73) | void openBrowser()

FILE: simple_live_app/lib/modules/search/douyin/douyin_search_view.dart
  class DouyinSearchView (line 13) | class DouyinSearchView extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/search/search_controller.dart
  class AppSearchController (line 9) | class AppSearchController extends GetxController
    method onInit (line 46) | void onInit()
    method doSearch (line 61) | void doSearch()
    method onClose (line 86) | void onClose()

FILE: simple_live_app/lib/modules/search/search_list_controller.dart
  class SearchListController (line 5) | class SearchListController extends BasePageController {
    method refreshData (line 16) | Future refreshData()
    method getData (line 24) | Future<List> getData(int page, int pageSize)
    method clear (line 38) | void clear()

FILE: simple_live_app/lib/modules/search/search_list_view.dart
  class SearchListView (line 13) | class SearchListView extends StatelessWidget {
    method build (line 19) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/search/search_page.dart
  class SearchPage (line 8) | class SearchPage extends GetView<AppSearchController> {
    method build (line 12) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/settings/appstyle_settings/appstyle_setting_contorller.dart
  class AppStyleSettingController (line 19) | class AppStyleSettingController extends GetxController {
    method init (line 33) | Future<void> init()
    method fontDelete (line 43) | Future<void> fontDelete()
    method fontReset (line 61) | void fontReset()
    method changeFontFamily (line 71) | void changeFontFamily()
    method onFontSelected (line 78) | Future<void> onFontSelected(FontModel fontModel)
    method downloadFont (line 90) | Future<void> downloadFont()
    method userFontInit (line 133) | Future<void> userFontInit()
    method loadFont (line 163) | Future<void> loadFont(String fontName)
    method fontDownloadCheck (line 177) | Future<bool> fontDownloadCheck(String fontName)
    method fetchFonts (line 185) | Future<void> fetchFonts()
    method setIsDynamic (line 202) | void setIsDynamic(bool e)
    method changeTheme (line 207) | void changeTheme()
    method setTheme (line 240) | void setTheme(int i)
    method setStyleColor (line 248) | void setStyleColor(int e)

FILE: simple_live_app/lib/modules/settings/appstyle_settings/appstyle_setting_page.dart
  class AppStyleSettingPage (line 10) | class AppStyleSettingPage extends GetView<AppStyleSettingController> {
    method trailingBuild (line 13) | Widget trailingBuild({required Widget widget})
    method build (line 46) | Widget build(BuildContext context)
  function _floatToInt8 (line 236) | int _floatToInt8(double x)

FILE: simple_live_app/lib/modules/settings/auto_exit_settings_page.dart
  class AutoExitSettingsPage (line 9) | class AutoExitSettingsPage extends GetView<AppSettingsController> {
    method build (line 13) | Widget build(BuildContext context)
    method setTimer (line 61) | void setTimer(BuildContext context)

FILE: simple_live_app/lib/modules/settings/danmu_settings_page.dart
  class DanmuSettingsPage (line 12) | class DanmuSettingsPage extends StatelessWidget {
    method build (line 16) | Widget build(BuildContext context)
  class DanmuSettingsView (line 31) | class DanmuSettingsView extends GetView<AppSettingsController> {
    method build (line 42) | Widget build(BuildContext context)
    method updateDanmuOption (line 305) | void updateDanmuOption(DanmakuOption? option)

FILE: simple_live_app/lib/modules/settings/danmu_shield/danmu_shield_controller.dart
  class DanmuShieldController (line 7) | class DanmuShieldController extends BaseController {
    method add (line 11) | void add()
    method remove (line 21) | void remove(String item)

FILE: simple_live_app/lib/modules/settings/danmu_shield/danmu_shield_page.dart
  class DanmuShieldPage (line 6) | class DanmuShieldPage extends GetView<DanmuShieldController> {
    method build (line 10) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/settings/indexed_settings/indexed_settings_controller.dart
  class IndexedSettingsController (line 4) | class IndexedSettingsController extends GetxController {
    method onInit (line 8) | void onInit()
    method updateSiteSort (line 14) | void updateSiteSort(int oldIndex, int newIndex)
    method updateHomeSort (line 24) | void updateHomeSort(int oldIndex, int newIndex)

FILE: simple_live_app/lib/modules/settings/indexed_settings/indexed_settings_page.dart
  class IndexedSettingsPage (line 9) | class IndexedSettingsPage extends GetView<IndexedSettingsController> {
    method build (line 13) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/settings/other/other_settings_controller.dart
  class OtherSettingsController (line 18) | class OtherSettingsController extends BaseController {
    method onInit (line 89) | void onInit()
    method setFirebaseEnable (line 94) | void setFirebaseEnable(bool e)
    method setLogEnable (line 99) | void setLogEnable(bool e)
    method loadLogFiles (line 111) | void loadLogFiles()
    method cleanLog (line 129) | void cleanLog()
    method shareLogFile (line 143) | void shareLogFile(LogFileModel item)
    method saveLogFile (line 147) | void saveLogFile(LogFileModel item)
    method exportConfig (line 160) | void exportConfig()
    method importConfig (line 201) | void importConfig()
    method resetDefaultConfig (line 233) | void resetDefaultConfig()
  class LogFileModel (line 244) | class LogFileModel {

FILE: simple_live_app/lib/modules/settings/other/other_settings_page.dart
  class OtherSettingsPage (line 15) | class OtherSettingsPage extends GetView<OtherSettingsController> {
    method build (line 19) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/settings/play_settings_page.dart
  class PlaySettingsPage (line 12) | class PlaySettingsPage extends GetView<AppSettingsController> {
    method build (line 16) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/sync/local_sync/device/sync_device_controller.dart
  class SyncDeviceController (line 14) | class SyncDeviceController extends BaseController {
    method showOverlayDialog (line 20) | Future<bool> showOverlayDialog()
    method syncFollowAndTag (line 30) | void syncFollowAndTag()
    method syncHistory (line 50) | void syncHistory()
    method syncBlockedWord (line 66) | void syncBlockedWord()
    method syncBiliAccount (line 82) | void syncBiliAccount()

FILE: simple_live_app/lib/modules/sync/local_sync/device/sync_device_page.dart
  class SyncDevicePage (line 8) | class SyncDevicePage extends GetView<SyncDeviceController> {
    method build (line 12) | Widget build(BuildContext context)
    method buildIcon (line 75) | Widget buildIcon()

FILE: simple_live_app/lib/modules/sync/local_sync/local_sync_controller.dart
  class LocalSyncController (line 17) | class LocalSyncController extends BaseController {
    method onInit (line 22) | void onInit()
    method initConnect (line 28) | void initConnect()
    method connect (line 38) | void connect()
    method connectClient (line 64) | void connectClient(SyncClinet client)
    method toScanQr (line 76) | void toScanQr()
    method showPickerAddress (line 91) | void showPickerAddress(List<String> addressList)
    method showInfo (line 111) | void showInfo()

FILE: simple_live_app/lib/modules/sync/local_sync/local_sync_page.dart
  class LocalSyncPage (line 11) | class LocalSyncPage extends GetView<LocalSyncController> {
    method build (line 15) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/sync/local_sync/scan_qr/sync_scan_qr_controller.dart
  class SyncScanQRControlelr (line 12) | class SyncScanQRControlelr extends BaseController {
    method onQRViewCreated (line 17) | void onQRViewCreated(QRViewController controller)
    method showPickerAddress (line 52) | void showPickerAddress(List<String> addressList)
    method onClose (line 74) | void onClose()

FILE: simple_live_app/lib/modules/sync/local_sync/scan_qr/sync_scan_qr_page.dart
  class SyncScanQRPage (line 6) | class SyncScanQRPage extends GetView<SyncScanQRControlelr> {
    method build (line 10) | Widget build(BuildContext context)
  class ScanRectangle (line 43) | class ScanRectangle extends StatefulWidget {
    method createState (line 47) | State<ScanRectangle> createState()
  class _ScanRectangleState (line 50) | class _ScanRectangleState extends State<ScanRectangle>
    method initState (line 56) | void initState()
    method build (line 75) | Widget build(BuildContext context)
    method dispose (line 106) | void dispose()

FILE: simple_live_app/lib/modules/sync/remote_sync/room/remote_sync_room_controller.dart
  class RemoteSyncRoomController (line 21) | class RemoteSyncRoomController extends BaseController {
    method onInit (line 42) | void onInit()
    method connect (line 47) | void connect()
    method createRoom (line 59) | void createRoom()
    method _startTimer (line 75) | void _startTimer()
    method joinRoom (line 87) | void joinRoom(String roomId)
    method listenSignalR (line 100) | void listenSignalR()
    method onReceiveFavorite (line 124) | void onReceiveFavorite(bool overlay, String data)
    method onReceiveHistory (line 143) | void onReceiveHistory(bool overlay, String data)
    method onReceiveShieldWord (line 168) | void onReceiveShieldWord(bool overlay, String data)
    method onReceiveBiliAccount (line 185) | void onReceiveBiliAccount(bool overlay, String data)
    method showOverlayDialog (line 198) | Future<bool> showOverlayDialog()
    method syncFollow (line 208) | void syncFollow()
    method syncHistory (line 239) | void syncHistory()
    method syncBlockedWord (line 268) | void syncBlockedWord()
    method syncBiliAccount (line 298) | void syncBiliAccount()
    method showQRInfo (line 331) | void showQRInfo()
    method onClose (line 359) | void onClose()

FILE: simple_live_app/lib/modules/sync/remote_sync/room/remote_sync_room_page.dart
  class RemoteSyncRoomPage (line 10) | class RemoteSyncRoomPage extends GetView<RemoteSyncRoomController> {
    method build (line 14) | Widget build(BuildContext context)
    method buildIcon (line 273) | Widget buildIcon(String platform)

FILE: simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_config_page.dart
  class RemoteSyncWebDAVConfigPage (line 10) | class RemoteSyncWebDAVConfigPage extends StatefulWidget {
    method createState (line 14) | State<RemoteSyncWebDAVConfigPage> createState()
  class _RemoteSyncWebDAVConfigPageState (line 18) | class _RemoteSyncWebDAVConfigPageState
    method initState (line 25) | void initState()
    method dispose (line 33) | void dispose()
    method build (line 41) | Widget build(BuildContext context)

FILE: simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_controller.dart
  class RemoteSyncWebDAVController (line 30) | class RemoteSyncWebDAVController extends BaseController {
    method onInit (line 57) | void onInit()
    method setWebDavBackupDirectory (line 62) | void setWebDavBackupDirectory({required String newDirectory})
    method doWebDAVInit (line 88) | void doWebDAVInit()
    method checkIsLogin (line 130) | Future<void> checkIsLogin()
    method doWebDAVLogin (line 142) | void doWebDAVLogin(
    method onLogout (line 165) | Future<void> onLogout()
    method doWebDAVUpload (line 179) | Future<void> doWebDAVUpload()
    method _backupData (line 203) | Future<List<int>> _backupData()
    method doWebDAVRecovery (line 279) | void doWebDAVRecovery()
    method _recovery (line 309) | Future<void> _recovery(ArchiveFile file)
    method changePasswordVisible (line 412) | void changePasswordVisible()
    method changeIsSyncFollows (line 416) | void changeIsSyncFollows()
    method changeIsSyncHistories (line 420) | void changeIsSyncHistories()
    method changeIsSyncBlockWord (line 424) | void changeIsSyncBlockWord()
    method changeIsSyncAccount (line 428) | void changeIsSyncAccount()
    method changeIsSyncSetting (line 432) | void changeIsSyncSetting()

FILE: simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_page.dart
  class RemoteSyncWebDAVPage (line 10) | class RemoteSyncWebDAVPage extends GetView<RemoteSyncWebDAVController> {
    method build (line 14) | Widget build(BuildContext context)
    method showSetting (line 97) | void showSetting()
    method _showEditBackupDirectory (line 160) | void _showEditBackupDirectory()

FILE: simple_live_app/lib/modules/sync/sync_page.dart
  class SyncPage (line 10) | class SyncPage extends StatelessWidget {
    method build (line 14) | Widget build(BuildContext context)

FILE: simple_live_app/lib/requests/common_request.dart
  class CommonRequest (line 7) | class CommonRequest {
    method checkUpdate (line 8) | Future<VersionModel> checkUpdate()
    method checkUpdateGitMirror (line 17) | Future<VersionModel> checkUpdateGitMirror()
    method checkUpdateJsDelivr (line 31) | Future<VersionModel> checkUpdateJsDelivr()

FILE: simple_live_app/lib/requests/custom_log_interceptor.dart
  class CustomLogInterceptor (line 6) | class CustomLogInterceptor extends Interceptor {
    method onRequest (line 8) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
    method onError (line 15) | void onError(DioException err, ErrorInterceptorHandler handler)
    method onResponse (line 48) | void onResponse(Response response, ResponseInterceptorHandler handler)
    method _maskHeader (line 72) | String _maskHeader(Map<String, dynamic> header)

FILE: simple_live_app/lib/requests/http_client.dart
  class HttpClient (line 7) | class HttpClient {
    method getText (line 31) | Future<String> getText(
    method getJson (line 64) | Future<dynamic> getJson(
    method get (line 97) | Future<Response<dynamic>> get(
    method postJson (line 131) | Future<dynamic> postJson(
    method head (line 170) | Future<Response> head(
    method download (line 204) | Future<File> download(

FILE: simple_live_app/lib/requests/http_error.dart
  class HttpError (line 1) | class HttpError extends Error {
    method toString (line 13) | String toString()
    method statusCodeToString (line 21) | String statusCodeToString(int statusCode)

FILE: simple_live_app/lib/requests/sync_client_request.dart
  class SyncClientRequest (line 5) | class SyncClientRequest {
    method getClientInfo (line 6) | Future<SyncClientInfoModel> getClientInfo(SyncClinet client)
    method syncFollow (line 13) | Future<bool> syncFollow(
    method syncTag (line 34) | Future<bool> syncTag(
    method syncHistory (line 55) | Future<bool> syncHistory(
    method syncBlockedWord (line 76) | Future<bool> syncBlockedWord(
    method syncBiliAccount (line 97) | Future<bool> syncBiliAccount(SyncClinet client, String cookie)

FILE: simple_live_app/lib/requests/webdav_client.dart
  class DAVClient (line 7) | class DAVClient {
    method _ping (line 33) | Future<bool> _ping()
    method backup (line 44) | Future<bool> backup(Uint8List data)
    method recovery (line 55) | Future<List<int>> recovery()

FILE: simple_live_app/lib/routes/app_analytics_observer.dart
  class AppAnalyticsObserver (line 5) | class AppAnalyticsObserver extends NavigatorObserver {
    method _log (line 9) | void _log(Route<dynamic>? route)
    method didPush (line 26) | void didPush(Route route, Route? previousRoute)
    method didPop (line 32) | void didPop(Route route, Route? previousRoute)
    method didReplace (line 38) | void didReplace({Route? newRoute, Route? oldRoute})

FILE: simple_live_app/lib/routes/app_navigation.dart
  class AppNavigator (line 20) | class AppNavigator {
    method toCategoryDetail (line 22) | void toCategoryDetail(
    method toLiveRoomDetail (line 28) | void toLiveRoomDetail(
    method toBiliBiliLogin (line 60) | Future toBiliBiliLogin()
    method toSyncDevice (line 69) | Future toSyncDevice(
    method toFollowInfo (line 81) | void toFollowInfo(FollowUser follow)

FILE: simple_live_app/lib/routes/app_pages.dart
  class AppPages (line 53) | class AppPages {

FILE: simple_live_app/lib/routes/route_path.dart
  class RoutePath (line 2) | class RoutePath {

FILE: simple_live_app/lib/services/bilibili_account_service.dart
  class BiliBiliAccountService (line 13) | class BiliBiliAccountService extends GetxService {
    method onInit (line 24) | void onInit()
    method loadUserInfo (line 32) | Future loadUserInfo()
    method setSite (line 57) | void setSite()
    method setCookie (line 63) | void setCookie(String cookie)
    method logout (line 70) | void logout()

FILE: simple_live_app/lib/services/core_api_service.dart
  class CoreApiBuilder (line 39) | class CoreApiBuilder {
    method site (line 47) | CoreApiBuilder site(String site)
    method room (line 52) | CoreApiBuilder room(String roomId)
    method func (line 57) | CoreApiBuilder func(String funcName)
    method param (line 62) | CoreApiBuilder param(String key, dynamic value)
    method params (line 67) | CoreApiBuilder params(Map<String, dynamic> params)
    method build (line 72) | Future<Map<String, dynamic>> build()
  class CoreDispatcher (line 89) | class CoreDispatcher {
    method dispatch (line 90) | Future<Map<String, dynamic>> dispatch({
  class CoreApiService (line 106) | class CoreApiService extends GetxService {
    method exampleUsage (line 110) | void exampleUsage()

FILE: simple_live_app/lib/services/db_service.dart
  class DBService (line 11) | class DBService extends GetxService {
    method init (line 17) | Future init()
    method clearFollowTag (line 23) | Future<void> clearFollowTag()
    method getFollowTagExist (line 27) | bool getFollowTagExist(String id)
    method getFollowTagList (line 31) | List<FollowUserTag> getFollowTagList()
    method updateFollowTag (line 35) | Future updateFollowTag(FollowUserTag followTag)
    method addFollowTag (line 39) | Future<FollowUserTag> addFollowTag(String tag)
    method deleteFollowTag (line 51) | Future deleteFollowTag(String id)
    method getFollowTag (line 55) | FollowUserTag? getFollowTag(String tag)
    method getFollowTagExistByTag (line 60) | bool getFollowTagExistByTag(String tag)
    method getFollowExist (line 64) | bool getFollowExist(String id)
    method getFollowList (line 68) | List<FollowUser> getFollowList()
    method addFollow (line 72) | Future addFollow(FollowUser follow)
    method deleteFollow (line 76) | Future deleteFollow(String id)
    method getHistory (line 80) | History? getHistory(String id)
    method addOrUpdateHistory (line 87) | Future addOrUpdateHistory(History history)
    method delHistory (line 91) | Future delHistory(String id)
    method getHistories (line 95) | List<History> getHistories()

FILE: simple_live_app/lib/services/douyin_account_service.dart
  class DouyinAccountService (line 12) | class DouyinAccountService extends GetxService {
    method onInit (line 21) | void onInit()
    method _setSiteHlsFirst (line 33) | void _setSiteHlsFirst()
    method loadUserInfo (line 37) | Future loadUserInfo()
    method _setSiteCookie (line 57) | void _setSiteCookie()
    method setCookie (line 65) | void setCookie(String cookie)
    method logout (line 71) | void logout()

FILE: simple_live_app/lib/services/firebase_service.dart
  class FirebaseService (line 10) | class FirebaseService extends GetxService {
    method setCrashlytics (line 20) | Future<void> setCrashlytics(bool enable)

FILE: simple_live_app/lib/services/follow_service.dart
  class FollowService (line 29) | class FollowService extends GetxService {
    method onInit (line 69) | void onInit()
    method updateTagName (line 81) | void updateTagName(FollowUserTag followUserTag, String newTagName)
    method updateFollowUserTag (line 94) | Future<void> updateFollowUserTag(FollowUserTag tag)
    method addFollowUserTag (line 104) | Future<void> addFollowUserTag(String tag)
    method removeFollowUserTag (line 114) | Future removeFollowUserTag(FollowUserTag tag)
    method getAllTagList (line 128) | void getAllTagList()
    method getTagOptionsWithAll (line 134) | List<FollowUserTag> getTagOptionsWithAll()
    method setFollowTag (line 142) | void setFollowTag(FollowUser item, FollowUserTag targetTag)
    method filterDataByTag (line 181) | void filterDataByTag(FollowUserTag tag)
    method updateFollowTagOrder (line 204) | Future<void> updateFollowTagOrder(FollowUserTag oldTag,FollowUserTag n...
    method addFollow (line 211) | void addFollow(FollowUser follow)
    method removeFollowUser (line 225) | Future<void> removeFollowUser(String id)
    method getFollowExist (line 230) | bool getFollowExist(String id)
    method updateFollowHistory (line 235) | void updateFollowHistory(History history)
    method initTimer (line 247) | void initTimer()
    method loadData (line 266) | Future<void> loadData({bool updateStatus = true, int? cycle})
    method multiRoundPriority (line 285) | void multiRoundPriority()
    method startUpdateStatus (line 334) | void startUpdateStatus({int? cycle})
    method updateLiveInformation (line 387) | Future updateLiveInformation(FollowUser item)
    method filterData (line 409) | void filterData()
    method liveListSort (line 416) | void liveListSort()
    method listSortByMethod (line 422) | void listSortByMethod(List<FollowUser> list, SortMethod sortMethod)
    method exportFile (line 464) | void exportFile()
    method inputFile (line 498) | void inputFile()
    method exportText (line 523) | void exportText()
    method inputText (line 559) | void inputText()
    method generateJson (line 611) | String generateJson()
    method inputJson (line 631) | Future inputJson(String content)
    method followUserAllDataCheck (line 651) | Future<void> followUserAllDataCheck()
    method onClose (line 691) | void onClose()

FILE: simple_live_app/lib/services/history_service.dart
  class HistoryService (line 12) | class HistoryService extends GetxService {
    method start (line 24) | void start(History history)
    method reset (line 33) | void reset(String roomId)
    method stop (line 43) | void stop()
    method _loadHistory (line 55) | void _loadHistory(History history)
    method _updateHistory (line 66) | void _updateHistory()
    method getHistoryDuration (line 82) | String getHistoryDuration({required String followUserId})

FILE: simple_live_app/lib/services/local_storage_service.dart
  class LocalStorageService (line 5) | class LocalStorageService extends GetxService {
    method init (line 219) | Future init()
    method getValue (line 228) | T getValue<T>(dynamic key, T defaultValue)
    method getNullValue (line 239) | T? getNullValue<T>(dynamic key, T? defaultValue)
    method setValue (line 250) | Future setValue<T>(dynamic key, T value)
    method removeValue (line 255) | Future removeValue<T>(dynamic key)
    method flush (line 260) | Future flush()

FILE: simple_live_app/lib/services/migration_service.dart
  class MigrationService (line 13) | class MigrationService {
    method migrateData (line 15) | Future migrateData()
    method migrateDataByVersion (line 56) | Future<void> migrateDataByVersion()

FILE: simple_live_app/lib/services/signalr_service.dart
  type SignalRConnectionState (line 8) | enum SignalRConnectionState {
  class SignalRService (line 14) | class SignalRService {
    method connect (line 54) | Future<void> connect()
    method _listen (line 71) | void _listen()
    method disconnect (line 93) | Future<void> disconnect()
    method createRoom (line 99) | Future<Resp<String>> createRoom()
    method joinRoom (line 111) | Future<Resp> joinRoom(String roomId)
    method sendContent (line 123) | Future<Resp> sendContent({
    method dispose (line 137) | void dispose()
  class Resp (line 150) | class Resp<T> {
  class RoomUser (line 172) | class RoomUser {

FILE: simple_live_app/lib/services/sync_service.dart
  class SyncService (line 24) | class SyncService extends GetxService {
    method onInit (line 41) | void onInit()
    method listenUDP (line 50) | void listenUDP()
    method listenUdp (line 55) | void listenUdp(Datagram? datagram)
    method sendHello (line 93) | void sendHello()
    method sendInfo (line 107) | void sendInfo()
    method getDeviceName (line 130) | Future<String> getDeviceName()
    method refreshClients (line 151) | void refreshClients()
    method getLocalIP (line 159) | Future<String> getLocalIP()
    method initServer (line 190) | void initServer()
    method _helloRequest (line 223) | shelf.Response _helloRequest(shelf.Request request)
    method _infoRequest (line 233) | Future<shelf.Response> _infoRequest(shelf.Request request)
    method _syncFollowUserReuqest (line 246) | Future<shelf.Response> _syncFollowUserReuqest(shelf.Request request)
    method _syncFollowUserTagRequest (line 277) | Future<shelf.Response> _syncFollowUserTagRequest(
    method _syncHistoryReuqest (line 309) | Future<shelf.Response> _syncHistoryReuqest(shelf.Request request)
    method _syncBlockedWordReuqest (line 346) | Future<shelf.Response> _syncBlockedWordReuqest(shelf.Request request)
    method _syncBiliAccountReuqest (line 373) | Future<shelf.Response> _syncBiliAccountReuqest(shelf.Request request)
    method toJsonResponse (line 394) | shelf.Response toJsonResponse(Map<String, dynamic> data)
    method onClose (line 405) | void onClose()
  class SyncClinet (line 413) | class SyncClinet {

FILE: simple_live_app/lib/services/window_service.dart
  class WindowService (line 8) | class WindowService extends GetxService implements WindowListener {
    method init (line 17) | Future<void> init()
    method resize (line 30) | Future<void> resize()
    method onWindowBlur (line 44) | void onWindowBlur()
    method onWindowClose (line 47) | void onWindowClose()
    method onWindowDocked (line 54) | void onWindowDocked()
    method onWindowEnterFullScreen (line 57) | void onWindowEnterFullScreen()
    method onWindowEvent (line 60) | void onWindowEvent(String eventName)
    method onWindowFocus (line 63) | void onWindowFocus()
    method onWindowLeaveFullScreen (line 66) | void onWindowLeaveFullScreen()
    method onWindowMaximize (line 69) | void onWindowMaximize()
    method onWindowMinimize (line 72) | void onWindowMinimize()
    method onWindowMove (line 75) | Future<void> onWindowMove()
    method onWindowMoved (line 78) | Future<void> onWindowMoved()
    method onWindowResize (line 86) | Future<void> onWindowResize()
    method onWindowResized (line 89) | Future<void> onWindowResized()
    method onWindowRestore (line 97) | void onWindowRestore()
    method onWindowUndocked (line 100) | void onWindowUndocked()
    method onWindowUnmaximize (line 103) | void onWindowUnmaximize()
    method _saveBounds (line 105) | void _saveBounds(Rect bounds)

FILE: simple_live_app/lib/src/rust/api/danmaku_mask.dart
  class DanmakuMask (line 12) | abstract class DanmakuMask implements RustOpaqueInterface {
    method allowListBatch (line 15) | Future<Uint8List> allowListBatch(
    method dispose (line 19) | void dispose()
    method reset (line 38) | void reset()

FILE: simple_live_app/lib/src/rust/frb_generated.dart
  class RustLib (line 15) | class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLib...
    method init (line 22) | Future<void> init({
    method initMock (line 38) | void initMock({
    method dispose (line 50) | void dispose()
    method executeRustInitializers (line 61) | Future<void> executeRustInitializers()
  class RustLibApi (line 83) | abstract class RustLibApi extends BaseApi {
    method crateApiDanmakuMaskDanmakuMaskAllowListBatch (line 84) | Future<Uint8List> crateApiDanmakuMaskDanmakuMaskAllowListBatch(
    method crateApiDanmakuMaskDanmakuMaskDispose (line 89) | void crateApiDanmakuMaskDanmakuMaskDispose({required DanmakuMask that})
    method crateApiDanmakuMaskDanmakuMaskNew (line 91) | DanmakuMask crateApiDanmakuMaskDanmakuMaskNew(
    method crateApiDanmakuMaskDanmakuMaskReset (line 99) | void crateApiDanmakuMaskDanmakuMaskReset({required DanmakuMask that})
    method crateApiSimpleInitApp (line 101) | Future<void> crateApiSimpleInitApp()
  class RustLibApiImpl (line 112) | class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
    method crateApiDanmakuMaskDanmakuMaskAllowListBatch (line 121) | Future<Uint8List> crateApiDanmakuMaskDanmakuMaskAllowListBatch(
    method crateApiDanmakuMaskDanmakuMaskDispose (line 152) | void crateApiDanmakuMaskDanmakuMaskDispose({required DanmakuMask that})
    method crateApiDanmakuMaskDanmakuMaskNew (line 177) | DanmakuMask crateApiDanmakuMaskDanmakuMaskNew(
    method crateApiDanmakuMaskDanmakuMaskReset (line 227) | void crateApiDanmakuMaskDanmakuMaskReset({required DanmakuMask that})
    method crateApiSimpleInitApp (line 252) | Future<void> crateApiSimpleInitApp()
    method dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 283) | DanmakuMask
    method dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 291) | DanmakuMask
    method dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 299) | DanmakuMask
    method dco_decode_String (line 307) | String dco_decode_String(dynamic raw)
    method dco_decode_bool (line 313) | bool dco_decode_bool(dynamic raw)
    method dco_decode_list_String (line 319) | List<String> dco_decode_list_String(dynamic raw)
    method dco_decode_list_prim_u_8_strict (line 325) | Uint8List dco_decode_list_prim_u_8_strict(dynamic raw)
    method dco_decode_u_16 (line 331) | int dco_decode_u_16(dynamic raw)
    method dco_decode_u_32 (line 337) | int dco_decode_u_32(dynamic raw)
    method dco_decode_u_64 (line 343) | BigInt dco_decode_u_64(dynamic raw)
    method dco_decode_u_8 (line 349) | int dco_decode_u_8(dynamic raw)
    method dco_decode_unit (line 355) | void dco_decode_unit(dynamic raw)
    method dco_decode_usize (line 361) | BigInt dco_decode_usize(dynamic raw)
    method sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 367) | DanmakuMask
    method sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 376) | DanmakuMask
    method sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 385) | DanmakuMask
    method sse_decode_String (line 394) | String sse_decode_String(SseDeserializer deserializer)
    method sse_decode_bool (line 401) | bool sse_decode_bool(SseDeserializer deserializer)
    method sse_decode_list_String (line 407) | List<String> sse_decode_list_String(SseDeserializer deserializer)
    method sse_decode_list_prim_u_8_strict (line 419) | Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer)
    method sse_decode_u_16 (line 426) | int sse_decode_u_16(SseDeserializer deserializer)
    method sse_decode_u_32 (line 432) | int sse_decode_u_32(SseDeserializer deserializer)
    method sse_decode_u_64 (line 438) | BigInt sse_decode_u_64(SseDeserializer deserializer)
    method sse_decode_u_8 (line 444) | int sse_decode_u_8(SseDeserializer deserializer)
    method sse_decode_unit (line 450) | void sse_decode_unit(SseDeserializer deserializer)
    method sse_decode_usize (line 455) | BigInt sse_decode_usize(SseDeserializer deserializer)
    method sse_decode_i_32 (line 461) | int sse_decode_i_32(SseDeserializer deserializer)
    method sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 467) | void
    method sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 476) | void
    method sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 486) | void
    method sse_encode_String (line 495) | void sse_encode_String(String self, SseSerializer serializer)
    method sse_encode_bool (line 501) | void sse_encode_bool(bool self, SseSerializer serializer)
    method sse_encode_list_String (line 507) | void sse_encode_list_String(List<String> self, SseSerializer serializer)
    method sse_encode_list_prim_u_8_strict (line 516) | void sse_encode_list_prim_u_8_strict(
    method sse_encode_u_16 (line 524) | void sse_encode_u_16(int self, SseSerializer serializer)
    method sse_encode_u_32 (line 530) | void sse_encode_u_32(int self, SseSerializer serializer)
    method sse_encode_u_64 (line 536) | void sse_encode_u_64(BigInt self, SseSerializer serializer)
    method sse_encode_u_8 (line 542) | void sse_encode_u_8(int self, SseSerializer serializer)
    method sse_encode_unit (line 548) | void sse_encode_unit(void self, SseSerializer serializer)
    method sse_encode_usize (line 553) | void sse_encode_usize(BigInt self, SseSerializer serializer)
    method sse_encode_i_32 (line 559) | void sse_encode_i_32(int self, SseSerializer serializer)
  class DanmakuMaskImpl (line 565) | @sealed
    method allowListBatch (line 586) | Future<Uint8List> allowListBatch(
    method dispose (line 591) | void dispose()
    method reset (line 596) | void reset()

FILE: simple_live_app/lib/src/rust/frb_generated.io.dart
  class RustLibApiImplPlatform (line 13) | abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
    method dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 26) | DanmakuMask
    method dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 31) | DanmakuMask
    method dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 36) | DanmakuMask
    method dco_decode_String (line 41) | String dco_decode_String(dynamic raw)
    method dco_decode_bool (line 44) | bool dco_decode_bool(dynamic raw)
    method dco_decode_list_String (line 47) | List<String> dco_decode_list_String(dynamic raw)
    method dco_decode_list_prim_u_8_strict (line 50) | Uint8List dco_decode_list_prim_u_8_strict(dynamic raw)
    method dco_decode_u_16 (line 53) | int dco_decode_u_16(dynamic raw)
    method dco_decode_u_32 (line 56) | int dco_decode_u_32(dynamic raw)
    method dco_decode_u_64 (line 59) | BigInt dco_decode_u_64(dynamic raw)
    method dco_decode_u_8 (line 62) | int dco_decode_u_8(dynamic raw)
    method dco_decode_unit (line 65) | void dco_decode_unit(dynamic raw)
    method dco_decode_usize (line 68) | BigInt dco_decode_usize(dynamic raw)
    method sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 71) | DanmakuMask
    method sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 76) | DanmakuMask
    method sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 81) | DanmakuMask
    method sse_decode_String (line 86) | String sse_decode_String(SseDeserializer deserializer)
    method sse_decode_bool (line 89) | bool sse_decode_bool(SseDeserializer deserializer)
    method sse_decode_list_String (line 92) | List<String> sse_decode_list_String(SseDeserializer deserializer)
    method sse_decode_list_prim_u_8_strict (line 95) | Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer)
    method sse_decode_u_16 (line 98) | int sse_decode_u_16(SseDeserializer deserializer)
    method sse_decode_u_32 (line 101) | int sse_decode_u_32(SseDeserializer deserializer)
    method sse_decode_u_64 (line 104) | BigInt sse_decode_u_64(SseDeserializer deserializer)
    method sse_decode_u_8 (line 107) | int sse_decode_u_8(SseDeserializer deserializer)
    method sse_decode_unit (line 110) | void sse_decode_unit(SseDeserializer deserializer)
    method sse_decode_usize (line 113) | BigInt sse_decode_usize(SseDeserializer deserializer)
    method sse_decode_i_32 (line 116) | int sse_decode_i_32(SseDeserializer deserializer)
    method sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 119) | void
    method sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 124) | void
    method sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 129) | void
    method sse_encode_String (line 134) | void sse_encode_String(String self, SseSerializer serializer)
    method sse_encode_bool (line 137) | void sse_encode_bool(bool self, SseSerializer serializer)
    method sse_encode_list_String (line 140) | void sse_encode_list_String(List<String> self, SseSerializer serializer)
    method sse_encode_list_prim_u_8_strict (line 143) | void sse_encode_list_prim_u_8_strict(
    method sse_encode_u_16 (line 147) | void sse_encode_u_16(int self, SseSerializer serializer)
    method sse_encode_u_32 (line 150) | void sse_encode_u_32(int self, SseSerializer serializer)
    method sse_encode_u_64 (line 153) | void sse_encode_u_64(BigInt self, SseSerializer serializer)
    method sse_encode_u_8 (line 156) | void sse_encode_u_8(int self, SseSerializer serializer)
    method sse_encode_unit (line 159) | void sse_encode_unit(void self, SseSerializer serializer)
    method sse_encode_usize (line 162) | void sse_encode_usize(BigInt self, SseSerializer serializer)
    method sse_encode_i_32 (line 165) | void sse_encode_i_32(int self, SseSerializer serializer)
  class RustLibWire (line 170) | class RustLibWire implements BaseWire {
    method rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 182) | void
    method rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 198) | void

FILE: simple_live_app/lib/src/rust/frb_generated.web.dart
  class RustLibApiImplPlatform (line 19) | abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
    method dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 31) | DanmakuMask dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_ge...
    method dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 33) | DanmakuMask dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_g...
    method dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 35) | DanmakuMask dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRust...
    method dco_decode_String (line 37) | String dco_decode_String(dynamic raw)
    method dco_decode_bool (line 39) | bool dco_decode_bool(dynamic raw)
    method dco_decode_list_String (line 41) | List<String> dco_decode_list_String(dynamic raw)
    method dco_decode_list_prim_u_8_strict (line 43) | Uint8List dco_decode_list_prim_u_8_strict(dynamic raw)
    method dco_decode_u_16 (line 45) | int dco_decode_u_16(dynamic raw)
    method dco_decode_u_32 (line 47) | int dco_decode_u_32(dynamic raw)
    method dco_decode_u_64 (line 49) | BigInt dco_decode_u_64(dynamic raw)
    method dco_decode_u_8 (line 51) | int dco_decode_u_8(dynamic raw)
    method dco_decode_unit (line 53) | void dco_decode_unit(dynamic raw)
    method dco_decode_usize (line 55) | BigInt dco_decode_usize(dynamic raw)
    method sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 57) | DanmakuMask sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_ge...
    method sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 59) | DanmakuMask sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_g...
    method sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 61) | DanmakuMask sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRust...
    method sse_decode_String (line 63) | String sse_decode_String(SseDeserializer deserializer)
    method sse_decode_bool (line 65) | bool sse_decode_bool(SseDeserializer deserializer)
    method sse_decode_list_String (line 67) | List<String> sse_decode_list_String(SseDeserializer deserializer)
    method sse_decode_list_prim_u_8_strict (line 69) | Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer)
    method sse_decode_u_16 (line 71) | int sse_decode_u_16(SseDeserializer deserializer)
    method sse_decode_u_32 (line 73) | int sse_decode_u_32(SseDeserializer deserializer)
    method sse_decode_u_64 (line 75) | BigInt sse_decode_u_64(SseDeserializer deserializer)
    method sse_decode_u_8 (line 77) | int sse_decode_u_8(SseDeserializer deserializer)
    method sse_decode_unit (line 79) | void sse_decode_unit(SseDeserializer deserializer)
    method sse_decode_usize (line 81) | BigInt sse_decode_usize(SseDeserializer deserializer)
    method sse_decode_i_32 (line 83) | int sse_decode_i_32(SseDeserializer deserializer)
    method sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 85) | void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generated...
    method sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 87) | void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generate...
    method sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 89) | void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpa...
    method sse_encode_String (line 91) | void sse_encode_String(String self, SseSerializer serializer)
    method sse_encode_bool (line 93) | void sse_encode_bool(bool self, SseSerializer serializer)
    method sse_encode_list_String (line 95) | void sse_encode_list_String(List<String> self, SseSerializer serializer)
    method sse_encode_list_prim_u_8_strict (line 97) | void sse_encode_list_prim_u_8_strict(Uint8List self, SseSerializer ser...
    method sse_encode_u_16 (line 99) | void sse_encode_u_16(int self, SseSerializer serializer)
    method sse_encode_u_32 (line 101) | void sse_encode_u_32(int self, SseSerializer serializer)
    method sse_encode_u_64 (line 103) | void sse_encode_u_64(BigInt self, SseSerializer serializer)
    method sse_encode_u_8 (line 105) | void sse_encode_u_8(int self, SseSerializer serializer)
    method sse_encode_unit (line 107) | void sse_encode_unit(void self, SseSerializer serializer)
    method sse_encode_usize (line 109) | void sse_encode_usize(BigInt self, SseSerializer serializer)
    method sse_encode_i_32 (line 111) | void sse_encode_i_32(int self, SseSerializer serializer)
  class RustLibWire (line 118) | class RustLibWire implements BaseWire {
    method rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 121) | void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor...
    method rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 123) | void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor...
  function rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 128) | void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_g...
  function rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 130) | void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_g...

FILE: simple_live_app/lib/widgets/desktop_refresh_button.dart
  class DesktopRefreshButton (line 4) | class DesktopRefreshButton extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/filter_button.dart
  class FilterButton (line 4) | class FilterButton extends StatelessWidget {
    method build (line 16) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/follow_user_item.dart
  class FollowUserItem (line 10) | class FollowUserItem extends StatelessWidget {
    method build (line 26) | Widget build(BuildContext context)
    method getStatus (line 134) | String getStatus(int status)

FILE: simple_live_app/lib/widgets/keep_alive_wrapper.dart
  class KeepAliveWrapper (line 3) | class KeepAliveWrapper extends StatefulWidget {
    method createState (line 9) | State<KeepAliveWrapper> createState()
  class _KeepAliveWrapperState (line 12) | class _KeepAliveWrapperState extends State<KeepAliveWrapper>
    method build (line 15) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/live_room_card.dart
  class LiveRoomCard (line 10) | class LiveRoomCard extends StatelessWidget {
    method build (line 17) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/net_image.dart
  class NetImage (line 4) | class NetImage extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/none_border_circular_textfield.dart
  class NoneBorderCircularTextField (line 3) | class NoneBorderCircularTextField extends StatelessWidget {
    method build (line 49) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/page_grid_view.dart
  class PageGridView (line 12) | class PageGridView extends StatelessWidget {
    method build (line 37) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/page_list_view.dart
  type IndexedWidgetBuilder (line 12) | typedef IndexedWidgetBuilder = Widget Function(BuildContext context, int...
  class PageListView (line 14) | class PageListView extends StatelessWidget {
    method build (line 36) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/rectangular_indicator.dart
  class RectangularIndicator (line 5) | class RectangularIndicator extends Decoration {
    method createBoxPainter (line 45) | MyCustomPainter createBoxPainter([VoidCallback? onChanged])
  class MyCustomPainter (line 62) | class MyCustomPainter extends BoxPainter {
    method paint (line 89) | void paint(Canvas canvas, Offset offset, ImageConfiguration configurat...

FILE: simple_live_app/lib/widgets/settings/settings_action.dart
  class SettingsAction (line 5) | class SettingsAction extends StatelessWidget {
    method build (line 22) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/settings/settings_card.dart
  class SettingsCard (line 4) | class SettingsCard extends StatelessWidget {
    method build (line 9) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/settings/settings_menu.dart
  class SettingsMenu (line 5) | class SettingsMenu<T> extends StatelessWidget {
    method build (line 24) | Widget build(BuildContext context)
    method openMenu (line 62) | void openMenu(BuildContext context)

FILE: simple_live_app/lib/widgets/settings/settings_menu_check.dart
  class _MenuCheckController (line 7) | class _MenuCheckController<T> extends GetxController {
    method toggle (line 13) | void toggle(T item)
  class SettingsMenuCheck (line 22) | class SettingsMenuCheck<T> extends StatelessWidget {
    method build (line 50) | Widget build(BuildContext context)
    method _handleTap (line 92) | Future<void> _handleTap()
    method _openMenu (line 119) | void _openMenu(

FILE: simple_live_app/lib/widgets/settings/settings_number.dart
  class SettingsNumber (line 5) | class SettingsNumber extends StatelessWidget {
    method build (line 28) | Widget build(BuildContext context)
    method openSilder (line 103) | void openSilder(BuildContext context)

FILE: simple_live_app/lib/widgets/settings/settings_switch.dart
  class SettingsSwitch (line 4) | class SettingsSwitch extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/shadow_card.dart
  class ShadowCard (line 5) | class ShadowCard extends StatelessWidget {
    method build (line 19) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/status/app_empty_widget.dart
  class AppEmptyWidget (line 5) | class AppEmptyWidget extends StatelessWidget {
    method build (line 10) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/status/app_error_widget.dart
  class AppErrorWidget (line 5) | class AppErrorWidget extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/status/app_loadding_widget.dart
  class AppLoaddingWidget (line 6) | class AppLoaddingWidget extends StatelessWidget {
    method build (line 10) | Widget build(BuildContext context)

FILE: simple_live_app/lib/widgets/superchat_card.dart
  class SuperChatCard (line 9) | class SuperChatCard extends StatefulWidget {
    method createState (line 19) | State<SuperChatCard> createState()
  class _SuperChatCardState (line 22) | class _SuperChatCardState extends State<SuperChatCard> {
    method initState (line 28) | void initState()
    method timerCallback (line 39) | void timerCallback(Timer e)
    method build (line 52) | Widget build(BuildContext context)
    method dispose (line 122) | void dispose()

FILE: simple_live_app/lib/widgets/ui/after_post_frame.dart
  function initState (line 7) | void initState()
  function afterFirstFrame (line 15) | void afterFirstFrame(void Function() callback)

FILE: simple_live_app/linux/flutter/generated_plugin_registrant.cc
  function fl_register_plugins (line 18) | void fl_register_plugins(FlPluginRegistry* registry) {

FILE: simple_live_app/linux/runner/main.cc
  function main (line 3) | int main(int argc, char** argv) {

FILE: simple_live_app/linux/runner/my_application.cc
  type _MyApplication (line 14) | struct _MyApplication {
  function first_frame_cb (line 22) | static void first_frame_cb(MyApplication* self, FlView *view)
  function my_application_activate (line 28) | static void my_application_activate(GApplication* application) {
  function gboolean (line 99) | static gboolean my_application_local_command_line(GApplication* applicat...
  function my_application_startup (line 118) | static void my_application_startup(GApplication* application) {
  function my_application_shutdown (line 127) | static void my_application_shutdown(GApplication* application) {
  function my_application_dispose (line 136) | static void my_application_dispose(GObject* object) {
  function my_application_class_init (line 142) | static void my_application_class_init(MyApplicationClass* klass) {
  function my_application_init (line 150) | static void my_application_init(MyApplication* self) {}
  function MyApplication (line 152) | MyApplication* my_application_new() {

FILE: simple_live_app/rust/src/api/danmaku_mask.rs
  type DanmakuMask (line 7) | pub struct DanmakuMask {
    method new (line 33) | pub fn new(
    method normalize (line 70) | fn normalize(&self, text: &str) -> String {
    method shift_if_needed (line 85) | fn shift_if_needed(&mut self, now_ms: u64) {
    method adapt_window (line 114) | fn adapt_window(&mut self) {
    method reset (line 135) | pub fn reset(&mut self) {
    method dispose (line 147) | pub fn dispose(self){
    method allow_list_batch (line 156) | pub fn allow_list_batch(

FILE: simple_live_app/rust/src/api/simple.rs
  function init_app (line 2) | pub fn init_app() {

FILE: simple_live_app/rust/src/frb_generated.rs
  constant FLUTTER_RUST_BRIDGE_CODEGEN_VERSION (line 40) | pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1";
  constant FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH (line 41) | pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -154082...
  function wire__crate__api__danmaku_mask__DanmakuMask_allow_list_batch_impl (line 49) | fn wire__crate__api__danmaku_mask__DanmakuMask_allow_list_batch_impl(
  function wire__crate__api__danmaku_mask__DanmakuMask_dispose_impl (line 106) | fn wire__crate__api__danmaku_mask__DanmakuMask_dispose_impl(
  function wire__crate__api__danmaku_mask__DanmakuMask_new_impl (line 138) | fn wire__crate__api__danmaku_mask__DanmakuMask_new_impl(
  function wire__crate__api__danmaku_mask__DanmakuMask_reset_impl (line 180) | fn wire__crate__api__danmaku_mask__DanmakuMask_reset_impl(
  function wire__crate__api__simple__init_app_impl (line 228) | fn wire__crate__api__simple__init_app_impl(
  method sse_decode (line 273) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 285) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 293) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 301) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 308) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 320) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 332) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 339) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 346) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 353) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 360) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 365) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  method sse_decode (line 372) | fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::Sse...
  function pde_ffi_dispatcher_primary_impl (line 377) | fn pde_ffi_dispatcher_primary_impl(
  function pde_ffi_dispatcher_sync_impl (line 397) | fn pde_ffi_dispatcher_sync_impl(
  function into_dart (line 416) | fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
  method into_into_dart (line 424) | fn into_into_dart(self) -> FrbWrapper<DanmakuMask> {
  method sse_encode (line 431) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 440) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 449) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 456) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 463) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 473) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 483) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 490) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 497) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 504) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 511) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 516) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  method sse_encode (line 526) | fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated:...
  function frbgen_simple_live_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 551) | pub extern "C" fn frbgen_simple_live_app_rust_arc_increment_strong_count...
  function frbgen_simple_live_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 558) | pub extern "C" fn frbgen_simple_live_app_rust_arc_decrement_strong_count...
  function rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 590) | pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor...
  function rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDanmakuMask (line 597) | pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor...

FILE: simple_live_app/rust_builder/cargokit/build_tool/bin/build_tool.dart
  function main (line 6) | void main(List<String> arguments)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/build_tool.dart
  function runMain (line 6) | Future<void> runMain(List<String> args)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/android_environment.dart
  class AndroidEnvironment (line 15) | class AndroidEnvironment {
    method clangLinkerWrapper (line 24) | void clangLinkerWrapper(List<String> args)
    method ndkIsInstalled (line 57) | bool ndkIsInstalled()
    method installNdk (line 63) | void installNdk({
    method buildEnvironment (line 84) | Future<Map<String, String>> buildEnvironment()
    method _libGccWorkaround (line 170) | String _libGccWorkaround(String buildDir, Version ndkVersion)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart
  class Artifact (line 18) | class Artifact {
  class ArtifactProvider (line 47) | class ArtifactProvider {
    method getArtifacts (line 56) | Future<Map<Target, List<Artifact>>> getArtifacts(List<Target> targets)
    method _getPrecompiledArtifacts (line 99) | Future<Map<Target, List<Artifact>>> _getPrecompiledArtifacts(
    method _get (line 163) | Future<Response> _get(Uri url, {Map<String, String>? headers})
    method _tryDownloadArtifacts (line 184) | Future<void> _tryDownloadArtifacts({
  type AritifactType (line 221) | enum AritifactType {
  function artifactTypeForTarget (line 226) | AritifactType artifactTypeForTarget(Target target)
  function getArtifactNames (line 234) | List<String> getArtifactNames({

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart
  class BuildCMake (line 14) | class BuildCMake {
    method build (line 19) | Future<void> build()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart
  class BuildGradle (line 17) | class BuildGradle {
    method build (line 22) | Future<void> build()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/build_pod.dart
  class BuildPod (line 15) | class BuildPod {
    method build (line 20) | Future<void> build()
    method performLipo (line 36) | void performLipo(String targetFile, Iterable<String> sourceFiles)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/build_tool.dart
  class BuildCommand (line 25) | abstract class BuildCommand extends Command {
    method runBuildCommand (line 26) | Future<void> runBuildCommand(CargokitUserOptions options)
    method run (line 29) | Future<void> run()
  class BuildPodCommand (line 41) | class BuildPodCommand extends BuildCommand {
    method runBuildCommand (line 49) | Future<void> runBuildCommand(CargokitUserOptions options)
  class BuildGradleCommand (line 55) | class BuildGradleCommand extends BuildCommand {
    method runBuildCommand (line 63) | Future<void> runBuildCommand(CargokitUserOptions options)
  class BuildCMakeCommand (line 69) | class BuildCMakeCommand extends BuildCommand {
    method runBuildCommand (line 77) | Future<void> runBuildCommand(CargokitUserOptions options)
  class GenKeyCommand (line 83) | class GenKeyCommand extends Command {
    method run (line 91) | void run()
  class PrecompileBinariesCommand (line 100) | class PrecompileBinariesCommand extends Command {
    method run (line 151) | Future<void> run()
  class VerifyBinariesCommand (line 207) | class VerifyBinariesCommand extends Command {
    method run (line 225) | Future<void> run()
  function runMain (line 234) | Future<void> runMain(List<String> args)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/builder.dart
  type BuildConfiguration (line 18) | enum BuildConfiguration {
  class BuildException (line 33) | class BuildException implements Exception {
    method toString (line 39) | String toString()
  class BuildEnvironment (line 44) | class BuildEnvironment {
    method parseBuildConfiguration (line 70) | BuildConfiguration parseBuildConfiguration(String value)
    method fromEnvironment (line 83) | BuildEnvironment fromEnvironment({
  class RustBuilder (line 109) | class RustBuilder {
    method prepare (line 118) | void prepare(
    method build (line 139) | Future<String> build()
    method _buildEnvironment (line 169) | Future<Map<String, String>> _buildEnvironment()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/cargo.dart
  class ManifestException (line 9) | class ManifestException {
    method toString (line 16) | String toString()
  class CrateInfo (line 25) | class CrateInfo {
    method parseManifest (line 30) | CrateInfo parseManifest(String manifest, {final String? fileName})
    method load (line 43) | CrateInfo load(String manifestDir)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart
  class CrateHash (line 13) | class CrateHash {
    method compute (line 20) | String compute(String manifestDir, {String? tempStorage})
    method _compute (line 32) | String _compute()
    method _computeQuickHash (line 54) | String _computeQuickHash(List<File> files)
    method _computeHash (line 72) | String _computeHash(List<File> files)
    method addTextFile (line 76) | void addTextFile(File file)
    method getFiles (line 101) | List<File> getFiles()
    method addFile (line 108) | void addFile(String relative)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/environment.dart
  function resolveSymlink (line 7) | String resolveSymlink()
  class Environment (line 10) | class Environment {
    method _getEnv (line 52) | String _getEnv(String key)
    method _getEnvPath (line 60) | String _getEnvPath(String key)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/logging.dart
  function _log (line 13) | void _log(LogRecord rec)
  function initLogging (line 34) | void initLogging()
  function enableVerboseLogging (line 50) | void enableVerboseLogging()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/options.dart
  class SourceSpanException (line 21) | class SourceSpanException implements Exception {
    method toString (line 44) | String toString({Object? color})
  type Toolchain (line 50) | enum Toolchain {
  class CargoBuildOptions (line 56) | class CargoBuildOptions {
    method _toolchainFromNode (line 65) | Toolchain _toolchainFromNode(YamlNode node)
    method parse (line 78) | CargoBuildOptions parse(YamlNode node)
  class PrecompiledBinaries (line 117) | class PrecompiledBinaries {
    method _publicKeyFromHex (line 126) | PublicKey _publicKeyFromHex(String key, SourceSpan? span)
    method parse (line 135) | PrecompiledBinaries parse(YamlNode node)
  class CargokitCrateOptions (line 167) | class CargokitCrateOptions {
    method parse (line 176) | CargokitCrateOptions parse(YamlNode node)
    method load (line 219) | CargokitCrateOptions load({
  class CargokitUserOptions (line 233) | class CargokitUserOptions {
    method defaultUsePrecompiledBinaries (line 236) | bool defaultUsePrecompiledBinaries()
    method parse (line 249) | CargokitUserOptions parse(YamlNode node)
    method load (line 285) | CargokitUserOptions load()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart
  class PrecompileBinaries (line 21) | class PrecompileBinaries {
    method fileName (line 44) | String fileName(Target target, String name)
    method signatureFileName (line 48) | String signatureFileName(Target target, String name)
    method run (line 52) | Future<void> run()
    method _getOrCreateRelease (line 176) | Future<Release> _getOrCreateRelease({

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/rustup.dart
  class _Toolchain (line 11) | class _Toolchain {
  class Rustup (line 21) | class Rustup {
    method installedTargets (line 22) | List<String>? installedTargets(String toolchain)
    method installToolchain (line 27) | void installToolchain(String toolchain)
    method installTarget (line 34) | void installTarget(
    method _installedTargets (line 53) | List<String>? _installedTargets(String toolchain)
    method _getInstalledToolchains (line 58) | List<_Toolchain> _getInstalledToolchains()
    method extractToolchainName (line 59) | String extractToolchainName(String line)
    method _getInstalledTargets (line 87) | List<String> _getInstalledTargets(String toolchain)
    method installRustSrcForNightly (line 105) | void installRustSrcForNightly()
    method executablePath (line 117) | String? executablePath()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/target.dart
  class Target (line 10) | class Target {
    method forFlutterName (line 84) | Target? forFlutterName(String flutterName)
    method forDarwin (line 88) | Target? forDarwin({
    method forRustTriple (line 97) | Target? forRustTriple(String triple)
    method androidTargets (line 101) | List<Target> androidTargets()
    method buildableTargets (line 108) | List<Target> buildableTargets()
    method toString (line 130) | String toString()

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/util.dart
  class CommandFailedException (line 15) | class CommandFailedException implements Exception {
    method toString (line 27) | String toString()
  class TestRunCommandArgs (line 43) | class TestRunCommandArgs {
  class TestRunCommandResult (line 65) | class TestRunCommandResult {
  function runCommand (line 81) | ProcessResult runCommand(
  class RustupNotFoundException (line 131) | class RustupNotFoundException implements Exception {
    method toString (line 133) | String toString()
    method hasHomebrewRustInPath (line 150) | bool hasHomebrewRustInPath()
  function _resolveExecutable (line 162) | String _resolveExecutable(String executable)

FILE: simple_live_app/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart
  class VerifyBinaries (line 16) | class VerifyBinaries {
    method run (line 23) | Future<void> run()

FILE: simple_live_app/test/tool_test.dart
  function testPinyin (line 4) | void testPinyin()
  function main (line 12) | void main()

FILE: simple_live_app/test/widget_test.dart
  function main (line 13) | void main()

FILE: simple_live_app/test_driver/integration_test.dart
  function main (line 3) | Future<void> main()

FILE: simple_live_app/windows/flutter/generated_plugin_registrant.cc
  function RegisterPlugins (line 23) | void RegisterPlugins(flutter::PluginRegistry* registry) {

FILE: simple_live_app/windows/runner/flutter_window.cpp
  function LRESULT (line 50) | LRESULT

FILE: simple_live_app/windows/runner/flutter_window.h
  function class (line 12) | class FlutterWindow : public Win32Window {

FILE: simple_live_app/windows/runner/main.cpp
  function wWinMain (line 8) | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,

FILE: simple_live_app/windows/runner/utils.cpp
  function CreateAndAttachConsole (line 10) | void CreateAndAttachConsole() {
  function GetCommandLineArguments (line 24) | std::vector<std::string> GetCommandLineArguments() {
  function Utf8FromUtf16 (line 44) | std::string Utf8FromUtf16(const wchar_t* utf16_string) {

FILE: simple_live_app/windows/runner/win32_window.cpp
  function Scale (line 36) | int Scale(int source, double scale_factor) {
  function EnableFullDpiSupportIfAvailable (line 42) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
  class WindowClassRegistrar (line 59) | class WindowClassRegistrar {
    method WindowClassRegistrar (line 64) | static WindowClassRegistrar* GetInstance() {
    method WindowClassRegistrar (line 80) | WindowClassRegistrar() = default;
  function wchar_t (line 89) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
  function LRESULT (line 157) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
  function LRESULT (line 176) | LRESULT
  function Win32Window (line 236) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
  function RECT (line 252) | RECT Win32Window::GetClientArea() {
  function HWND (line 258) | HWND Win32Window::GetHandle() {

FILE: simple_live_app/windows/runner/win32_window.h
  type Size (line 21) | struct Size {

FILE: simple_live_console/bin/simple_live_console.dart
  function main (line 5) | void main(List<String> arguments)
  function printHelp (line 36) | void printHelp()
  function printInfo (line 41) | Future printInfo(String url)
  function printDanmaku (line 73) | Future printDanmaku(String url)
  function parseUrl (line 100) | List parseUrl(String url)

FILE: simple_live_console/test/all_live_console_test.dart
  function main (line 3) | void main()

FILE: simple_live_core/assets/js/a_bogus.js
  function rc4_encrypt (line 2) | function rc4_encrypt(plaintext, key) {
  function le (line 30) | function le(e, r) {
  function de (line 34) | function de(e) {
  function pe (line 38) | function pe(e, r, t, n) {
  function he (line 43) | function he(e, r, t, n) {
  function reset (line 48) | function reset() {
  function write (line 61) | function write(e) {
  function sum (line 85) | function sum(e, t) {
  function _compress (line 112) | function _compress(t) {
  function _fill (line 152) | function _fill() {
  function SM3 (line 166) | function SM3() {
  function result_encrypt (line 178) | function result_encrypt(long_str, num = null) {
  function get_long_int (line 226) | function get_long_int(round, long_str) {
  function gener_random (line 231) | function gener_random(random, option) {
  function generate_rc4_bb_str (line 241) | function generate_rc4_bb_str(url_search_params, user_agent, window_env_s...
  function generate_random_str (line 405) | function generate_random_str() {
  function generate_a_bogus (line 413) | function generate_a_bogus(url_search_params, user_agent) {

FILE: simple_live_core/assets/js/douyin-webmssdk.js
  function w_0x25f3 (line 33) | function w_0x25f3(_0x545d0a, _0xb73ac6) {
  function w_0x42f5 (line 60) | function w_0x42f5() {
  function w_0x5c3140 (line 69) | function w_0x5c3140(_0x41676a, _0x3f9548, _0x39b0b8) {
  function _0x137ba2 (line 405) | function _0x137ba2(_0x383b51) {
  function _0x59d886 (line 472) | function _0x59d886(_0x53e3a8, _0x594492) {
  function _0x1d9867 (line 477) | function _0x1d9867(_0x38463f, _0x559d1b, _0x1b2c54, _0x595501) {
  function _0x43bce4 (line 523) | function _0x43bce4(_0x282431, _0x336297) {
  function _0x26f5a8 (line 549) | function _0x26f5a8(_0x4a45da, _0x3cff50) {
  function _0x2bb58f (line 559) | function _0x2bb58f(_0x256829, _0x48125d, _0x3ef27c, _0x2a2bd4, _0x3688dc...
  function _0x1fca4f (line 616) | function _0x1fca4f(_0x322983, _0x544667) {
  function _0x525dc3 (line 622) | function _0x525dc3(_0x3ef577) {
  function _0x3ccc16 (line 628) | function _0x3ccc16(_0x56cd04, _0x56ab29) {
  function _0x32dfd4 (line 634) | function _0x32dfd4(_0x43869e, _0x434307) {
  function _0x372120 (line 650) | function _0x372120(_0x40b476) {
  function _0x481bfe (line 656) | function _0x481bfe(_0x40006c, _0xdbd444, _0x2c21df, _0x2a4c98, _0x438b52...
  function _0xa6bc9e (line 736) | function _0xa6bc9e(_0x4ceb2c, _0x1b99e7, _0xa8afec, _0x19fdc6, _0x501635) {
  function _0x3657e2 (line 765) | function _0x3657e2(_0x27f72c, _0x8206e1) {
  function _0x5f3676 (line 775) | function _0x5f3676(_0x5c13b5, _0x4779ee, _0x3479c8, _0x3cb840) {
  function _0x51be3f (line 803) | function _0x51be3f(_0x44772e, _0x5243ca, _0x398fa6) {
  function _0x281b3b (line 815) | function _0x281b3b() {
  function _0x4ab133 (line 1066) | function _0x4ab133(_0x538caa, _0x1dca3a, _0x362c83) {
  function _0x4591cd (line 1070) | function _0x4591cd() {
  function _0x49af1f (line 1324) | function _0x49af1f(_0x3a86ea, _0x270f72, _0x219a67) {
  function _0x3e4ff5 (line 1328) | function _0x3e4ff5(_0x5b206b, _0xdfb3e7) {
  function _0x19207d (line 1338) | function _0x19207d(_0x45ced6, _0xcee03f) {
  function _0x151762 (line 1344) | function _0x151762(_0x535a19, _0x4e0a69, _0x270f96, _0x52f7e9, _0x23d388...
  function _0x15eb90 (line 1433) | function _0x15eb90(_0x202051, _0x1c2373) {
  function _0x45d8b1 (line 1439) | function _0x45d8b1(_0x2ad532, _0x423791) {
  function _0xed525b (line 1445) | function _0xed525b(_0x522a86, _0x4177e1) {
  function _0x244c39 (line 1460) | function _0x244c39(_0x17683) {
  function _0x48532c (line 1467) | function _0x48532c(_0x5503e0) {
  function _0x23e6b (line 1474) | function _0x23e6b(_0x5cf198, _0x5646db, _0x26f9f9, _0x37f54b, _0x47565f,...
  function _0x754898 (line 1555) | function _0x754898(_0x2bd2c5, _0x2c3dcd, _0x119780) {
  function _0xdfc9aa (line 1587) | function _0xdfc9aa(_0x18680e, _0x994303) {
  function _0x2258b9 (line 1597) | function _0x2258b9(_0x31d7ec, _0x22dcdb) {
  function _0x499d65 (line 1625) | function _0x499d65(_0x2be690, _0x428d43, _0x381e26, _0x409a13) {
  function _0x63f01f (line 1634) | function _0x63f01f(_0x5fd149) {
  function _0x278b9f (line 1675) | function _0x278b9f(_0x12b945) {
  function _0x3d6fc9 (line 1689) | function _0x3d6fc9(_0x4d37b6) {
  function _0x81c36b (line 1734) | function _0x81c36b(_0x305287) {
  function _0x37e1e2 (line 1738) | function _0x37e1e2(_0x3127ce) {
  function _0x564673 (line 1745) | function _0x564673(_0x18bd7c, _0x51fb0f, _0x2103c5, _0x5f4619) {
  function _0x19d66a (line 1755) | function _0x19d66a(_0x14c297, _0x128d38) {
  function _0x376fd5 (line 1791) | function _0x376fd5(_0x233550, _0x1b337f) {
  function _0x2e4b86 (line 1803) | function _0x2e4b86(_0x760974, _0x438efa, _0x37a20b, _0x52b279) {
  function _0x3a3eb5 (line 1835) | function _0x3a3eb5(_0x4619be, _0x3fc822) {
  function _0x4ee2dd (line 1849) | function _0x4ee2dd(_0xf371f0) {
  function _0x385d19 (line 1863) | function _0x385d19() {
  function _0x1db123 (line 2353) | function _0x1db123(_0x149c27) {
  function _0x34d29a (line 2365) | function _0x34d29a() {
  function _0x2772ab (line 2435) | function _0x2772ab(_0x17b93c) {
  function _0x125e01 (line 2440) | function _0x125e01(_0x221f1a) {
  function _0x8a0370 (line 2448) | function _0x8a0370(_0x1ac7e2, _0x440b38, _0x4611ac, _0x1f79f3, _0x26eb95...
  function _0x50daaa (line 2459) | function _0x50daaa(_0x10de0d) {
  function _0x297d3d (line 2483) | function _0x297d3d(_0xd86983, _0x45590a) {
  function _0x96f358 (line 2489) | function _0x96f358(_0x217e4a, _0x156410) {
  function _0x55cd8a (line 2500) | function _0x55cd8a(_0x174a54, _0x5e25eb, _0x465e50) {
  function _0x58d8c2 (line 2510) | function _0x58d8c2(_0x5634d7, _0x53515c) {
  function _0x40ff51 (line 2527) | function _0x40ff51(_0x254aaa, _0x287254) {
  function _0x4a7824 (line 2537) | function _0x4a7824(_0x26784f, _0x47795a, _0x26a673) {
  function _0x36f54f (line 2548) | function _0x36f54f() {
  function _0x5f346f (line 2562) | function _0x5f346f(_0x2ab8ef) {
  function _0x5dda7d (line 2578) | function _0x5dda7d(_0x46427b, _0x4b68de) {
  function _0x3879ac (line 2595) | function _0x3879ac(_0x40738f, _0x3ddb1f) {
  function _0x22af63 (line 2602) | function _0x22af63(_0x26c4e4) {
  function _0x2e2f47 (line 2611) | function _0x2e2f47(_0x24c757, _0x1d9d80) {
  function _0x3390dc (line 2621) | function _0x3390dc() {
  function _0x920a3d (line 2638) | function _0x920a3d(_0x35e7ab, _0x5cbd00, _0x53ced5) {
  function _0x5cb0d7 (line 2651) | function _0x5cb0d7(_0x6e2f2f) {
  function _0x16f283 (line 2656) | function _0x16f283(_0x11646e) {
  function _0x8f6e33 (line 2690) | function _0x8f6e33(_0xca4201, _0x572889) {
  function _0x2ea366 (line 2695) | function _0x2ea366(_0x4da731) {
  function _0x1629e6 (line 2702) | function _0x1629e6(_0xb8ec58) {
  function _0x2c9158 (line 2714) | function _0x2c9158(_0x2f5c3e, _0x55c9ff) {
  function _0x374736 (line 2737) | function _0x374736(_0x2d130b, _0x324593) {
  function _0x206199 (line 2743) | function _0x206199(_0x607e62) {
  function _0x2bfa3e (line 2749) | function _0x2bfa3e(_0x161463, _0x2ff4d5) {
  function _0x2a28e9 (line 2760) | function _0x2a28e9(_0x2cdf2e, _0x74ac11) {
  function _0x58f550 (line 2774) | function _0x58f550(_0x94e938) {
  function _0xf3b17 (line 2781) | function _0xf3b17(_0x7b2cf6, _0x347c9f) {
  function _0x17b234 (line 2790) | function _0x17b234(_0x33316f) {
  function _0x2b3a8b (line 2804) | function _0x2b3a8b(_0x409fbb, _0x508825) {
  function _0x33bfa4 (line 2810) | function _0x33bfa4() {
  function _0x5b010c (line 2823) | function _0x5b010c(_0x878ee0, _0x27a5c4, _0x35cb40, _0x14e9ba) {
  function _0x2732a4 (line 2846) | function _0x2732a4(_0x24a602, _0x194547, _0x16a7b5, _0x8913b1, _0x531d0d) {
  function _0x281bf3 (line 2853) | function _0x281bf3(_0x4564b4, _0x1f4153) {
  function _0x2d5f0c (line 2863) | function _0x2d5f0c(_0x18863e, _0x13e8d4) {
  function _0x246229 (line 2870) | function _0x246229(_0x5e71a0) {
  function _0x5db7bf (line 2875) | function _0x5db7bf(_0x51f915) {
  function _0x2275f4 (line 2879) | function _0x2275f4(_0x42246e) {
  function _0x516c2b (line 2884) | function _0x516c2b() {
  function _0xab4ac9 (line 2887) | function _0xab4ac9(_0xcde017) {
  function _0x5b377b (line 2891) | function _0x5b377b(_0x5f4fa5, _0x2f492b) {
  function _0x5096de (line 2895) | function _0x5096de(_0x3b53c6, _0x3225c3) {
  function _0x1dff6c (line 2899) | function _0x1dff6c(_0x3a7a63, _0x147620) {
  function _0x5c885 (line 2903) | function _0x5c885(_0x3953c0) {
  function _0x534083 (line 2907) | function _0x534083(_0x3396cf) {
  function _0x1ccd19 (line 2911) | function _0x1ccd19(_0x15e4f0) {
  function _0x1ae312 (line 2917) | function _0x1ae312(_0x4bfad0) {
  function _0x4bbf4b (line 2923) | function _0x4bbf4b(_0x33a831, _0x181a3c, _0x135270) {
  function _0x1853c6 (line 2932) | function _0x1853c6(_0x3086ca) {
  function _0x525331 (line 2938) | function _0x525331(_0x1ceb3f, _0x38a668) {
  function _0x537c83 (line 2949) | function _0x537c83(_0x1cc46a, _0xca9940) {
  function _0x542337 (line 2957) | function _0x542337() {
  function _0x25b697 (line 2962) | function _0x25b697() {
  function _0x350075 (line 2966) | function _0x350075(_0x189dc6, _0x3f6be9) {
  function _0x37af30 (line 3023) | function _0x37af30(_0x37ea9e, _0x2388a0) {
  function _0x5362e1 (line 3046) | function _0x5362e1(_0x4cd55f) {
  function _0x4ad3b0 (line 3056) | function _0x4ad3b0(_0x460146, _0x32cf07) {
  function _0x32e885 (line 3070) | function _0x32e885(_0x225644) {
  function _0xf47dc3 (line 3076) | function _0xf47dc3(_0x1d62a3, _0xeb8470) {
  function _0x9d8dd5 (line 3081) | function _0x9d8dd5(_0x238b59, _0x206a18, _0x4378c6, _0x532e73) {
  function _0x271739 (line 3091) | function _0x271739(_0xb876c5, _0x285720, _0x361de9, _0x52c079, _0x38a76d) {
  function _0x2ca065 (line 3131) | function _0x2ca065(_0x4c2f2d) {
  function _0x33f649 (line 3136) | function _0x33f649(_0x59611c, _0xb8c4c1) {
  function _0x4c53b8 (line 3143) | function _0x4c53b8(_0x467264, _0x1c39b3) {
  function _0xf01d58 (line 3148) | function _0xf01d58(_0x248ad, _0xd514dd, _0x4ffcbe) {
  function _0x3ff428 (line 3154) | function _0x3ff428(_0x59a12f, _0x2e6e68) {
  function _0x3feef3 (line 3159) | function _0x3feef3(_0x76bca3, _0x49ed2b, _0xf40042) {
  function _0x46f318 (line 3166) | function _0x46f318(_0x2345ad, _0x29e732, _0x5d3874) {
  function _0x3d490a (line 3173) | function _0x3d490a(_0x421876, _0x556ee1, _0x489ccf, _0x32c792) {
  function _0x1f2159 (line 3180) | function _0x1f2159(_0x3c139e, _0xf1d93, _0xa6753b) {
  function _0x2fcc7b (line 3185) | function _0x2fcc7b() {
  function _0x1de0ff (line 3190) | function _0x1de0ff(_0x35f1cc, _0x2cd6a2) {
  function _0x30760d (line 3195) | function _0x30760d(_0x26c16c, _0x3bf250, _0x4bb532) {
  function _0x1af7ca (line 3206) | function _0x1af7ca(_0x38569e, _0x4d9da9) {
  function _0x153ad5 (line 3221) | function _0x153ad5(_0x361a17, _0x4bf341, _0x38ef34) {
  function _0x3fbf28 (line 3228) | function _0x3fbf28(_0x1609bf, _0x372dbd) {
  function _0x234ff5 (line 3233) | function _0x234ff5(_0x5dcf40, _0xa0e3be) {
  function _0x3cd893 (line 3239) | function _0x3cd893(_0x4d4ac2, _0x117b1a, _0x13ebad, _0x227002) {
  function _0xdaf8f6 (line 3256) | function _0xdaf8f6() {
  function _0x210308 (line 3491) | function _0x210308(_0x5bae0) {
  function _0x3b2c5d (line 3522) | function _0x3b2c5d(_0x1d2cd7, _0x5043bf) {
  function _0x872852 (line 3527) | function _0x872852(_0x11fd7b) {
  function _0x51f3b5 (line 3553) | function _0x51f3b5(_0x3b7753) {
  function _0x3f9244 (line 3558) | function _0x3f9244(_0x197382) {
  function _0x22df7b (line 3563) | function _0x22df7b(_0x1a9e0b, _0x4c3aa6) {
  function _0x44a779 (line 3571) | function _0x44a779(_0x290bd9, _0x3c4184, _0x356c04) {
  function _0x227cd9 (line 3578) | function _0x227cd9(_0x44aab6, _0x47792b) {
  function _0x41d2eb (line 3584) | function _0x41d2eb(_0x2d54de, _0x30b42b, _0x3cc210) {
  function _0x4fd04a (line 3589) | function _0x4fd04a(_0x1b36b3, _0x1a6559) {
  function _0x4fb313 (line 3595) | function _0x4fb313() {
  function _0x4e4f66 (line 3599) | function _0x4e4f66(_0x9f7990) {
  function _0x598972 (line 3649) | function _0x598972(_0x215b45, _0x2d7329) {
  function _0x24dc34 (line 3660) | function _0x24dc34(_0x3e96bb) {
  function _0x1f42cb (line 3670) | function _0x1f42cb(_0x247ee6, _0x28501b) {
  function _0x2ecc5a (line 3681) | function _0x2ecc5a(_0x5893e4) {
  function _0x3bc8d3 (line 3741) | function _0x3bc8d3(_0x14565d) {
  function _0x3abc0b (line 3746) | function _0x3abc0b(_0x1ca7bd) {
  function _0x41ace1 (line 3751) | function _0x41ace1(_0x2b7455) {
  function _0x3e9554 (line 3756) | function _0x3e9554(_0x22797e) {
  function _0x56409e (line 3776) | function _0x56409e(_0x362d96) {
  function _0x171dc9 (line 3785) | function _0x171dc9(_0x5983b9) {
  function _0x22f902 (line 3864) | function _0x22f902(_0xad0da7) {
  function _0x5dd467 (line 4048) | function _0x5dd467(_0x2e8eb5) {
  function _0x176a57 (line 4059) | function _0x176a57() {
  function _0x1230e7 (line 4064) | function _0x1230e7() {
  function _0xf8ccf1 (line 4068) | function _0xf8ccf1() {
  function _0x30c916 (line 4073) | function _0x30c916() {
  function _0x5af46a (line 4078) | function _0x5af46a(_0xeaff35) {
  function _0x325f58 (line 4082) | function _0x325f58(_0x3fdcb7, _0x2838bc) {
  function _0x53b77d (line 4105) | function _0x53b77d(_0x357347) {
  function _0x3ed707 (line 4128) | function _0x3ed707() {
  function _0x328bde (line 4150) | function _0x328bde(_0xacb410, _0x4ed7bd, _0x49d137) {
  function _0x389396 (line 4170) | function _0x389396(_0x49fdfd, _0x32eedf) {
  function _0x3262d3 (line 4179) | function _0x3262d3(_0xb01975) {
  function _0xb5350b (line 4184) | function _0xb5350b(_0x1289f5) {
  function _0x33f406 (line 4206) | function _0x33f406(_0x4b5fb5) {
  function _0x4da136 (line 4212) | function _0x4da136(_0x620f42) {
  function _0x75d5b3 (line 4237) | function _0x75d5b3(_0x5a0afa, _0x1ccbbd) {
  function _0x183951 (line 4253) | function _0x183951(_0x15f4d9, _0x59200b) {
  function _0x25c901 (line 4263) | function _0x25c901(_0x431b9d) {
  function _0x38d33e (line 4267) | function _0x38d33e(_0x1aed31, _0x212e8a, _0x427b15, _0x8fcd39, _0x4eaad6...
  function _0x231484 (line 4271) | function _0x231484(_0xefe811) {
  function _0x3d58e7 (line 4277) | function _0x3d58e7(_0x5e28f2, _0x468b52) {
  function _0x4aaf04 (line 4293) | function _0x4aaf04(_0x33a7ba, _0x386196) {
  function _0x532596 (line 4308) | function _0x532596(_0x2394ed) {
  function _0x45fbef (line 4340) | function _0x45fbef(_0x316827, _0x2a039f) {
  function _0x25bfe1 (line 4383) | function _0x25bfe1(_0x5ad020, _0x1001f1) {
  function _0x31dfb5 (line 4434) | function _0x31dfb5(_0x360a73, _0xe765ba) {
  function _0xdda738 (line 4440) | function _0xdda738(_0x21d8ce, _0x4bf3f9) {
  function _0x4bb829 (line 4447) | function _0x4bb829(_0x1f763e, _0x47e9cd) {
  function _0x39dfe4 (line 4453) | function _0x39dfe4() {
  function _0x1b4bf1 (line 4473) | function _0x1b4bf1() {
  function _0x532cd9 (line 4505) | function _0x532cd9() {
  function _0x3391fc (line 4524) | function _0x3391fc() {
  function _0x21fa28 (line 4542) | function _0x21fa28() {
  function _0x49b1d7 (line 4556) | function _0x49b1d7(_0x4f4807) {
  function _0x462256 (line 4585) | function _0x462256() {
  function _0x3cee0e (line 4602) | function _0x3cee0e() {
  function _0x1f9824 (line 4616) | function _0x1f9824() {
  function _0x30412e (line 4639) | function _0x30412e() {
  function _0x28e2ec (line 4656) | function _0x28e2ec() {
  function _0x5863d1 (line 4672) | function _0x5863d1() {
  function _0x2a900b (line 4715) | function _0x2a900b(_0x29489b) {
  function _0x246aeb (line 4723) | function _0x246aeb(_0x1b02ae, _0x32abc9) {
  function _0x184783 (line 4730) | function _0x184783(_0x9867bc, _0x21d0e6) {
  function _0xf119da (line 4737) | function _0xf119da(_0x57529f, _0x19340f) {
  function _0x53f850 (line 4751) | function _0x53f850(_0x450920) {
  function _0x446110 (line 4757) | function _0x446110(_0xc80785) {
  function _0x3a1cf3 (line 4771) | function _0x3a1cf3(_0x8af04, _0xe4b509) {
  function _0x20b77a (line 4780) | function _0x20b77a(_0x3745f1) {
  function _0x483e03 (line 4788) | function _0x483e03(_0x44c650) {
  function _0x4bae98 (line 4797) | function _0x4bae98() {
  function _0x275e5a (line 4806) | function _0x275e5a() {
  function _0x4fdb47 (line 4814) | function _0x4fdb47() {
  function _0x1afbc2 (line 4823) | function _0x1afbc2() {
  function _0xc6f828 (line 4827) | function _0xc6f828(_0x23a724) {
  function _0x18b4be (line 4847) | function _0x18b4be() {
  function _0x1a39c4 (line 4856) | function _0x1a39c4() {
  function _0x130155 (line 4866) | function _0x130155() {
  function _0x2a76f8 (line 4872) | function _0x2a76f8() {
  function _0x3da279 (line 4878) | function _0x3da279() {
  function _0x299f3a (line 4898) | function _0x299f3a() {
  function _0xbe842b (line 4916) | function _0xbe842b() {
  function _0x4649a1 (line 4920) | function _0x4649a1() {
  function _0x487576 (line 4931) | function _0x487576() {
  function _0x4f323e (line 4947) | function _0x4f323e() {
  function _0x5090f5 (line 4994) | function _0x5090f5() {
  function _0x468d57 (line 5003) | function _0x468d57() {
  function _0x5bbaf0 (line 5008) | function _0x5bbaf0() {
  function _0x2e02ca (line 5065) | function _0x2e02ca() {
  function _0x2e2fa0 (line 5075) | function _0x2e2fa0(_0x1a6938) {
  function _0x178d7c (line 5080) | function _0x178d7c() {
  function _0x3c0a68 (line 5087) | function _0x3c0a68(_0x449fe8, _0x5ede0c) {
  function _0x4072ad (line 5115) | function _0x4072ad(_0x18cd85) {
  function _0x5c0cdd (line 5131) | function _0x5c0cdd(_0x380d2b, _0x1c644a) {
  function _0x1c3b6d (line 5157) | function _0x1c3b6d(_0x20f8c9) {
  function _0x20cbf3 (line 5232) | function _0x20cbf3(_0x38a8fe, _0x406d4b, _0x2e7a9b) {
  function _0x5e5a64 (line 5295) | function _0x5e5a64(_0x27ec41, _0x4e1246) {
  function _0x2a6ac2 (line 5307) | function _0x2a6ac2() {
  function _0x226933 (line 5312) | function _0x226933() {
  function _0x1e5a7f (line 5317) | function _0x1e5a7f() {
  function _0x11a1d6 (line 5322) | function _0x11a1d6() {
  function _0x39c3d8 (line 5334) | function _0x39c3d8(_0xc6dcf6) {
  function _0x425568 (line 5346) | function _0x425568() {
  function _0x18707d (line 5378) | function _0x18707d() {
  function _0x572e48 (line 5391) | function _0x572e48() {
  function _0x5646fa (line 5425) | function _0x5646fa(_0x29e841) {
  function _0x6bc4ae (line 5439) | function _0x6bc4ae(_0x4e8b7c) {
  function _0x5b890d (line 5442) | function _0x5b890d(_0x592717) {
  function _0x16f345 (line 5445) | function _0x16f345(_0x1a40af) {
  function _0x361214 (line 5448) | function _0x361214(_0x426175) {
  function _0xc35122 (line 5451) | function _0xc35122(_0xe69c60, _0x3e14a1, _0x2d525a) {
  function _0x4df596 (line 5458) | function _0x4df596(_0x14c951, _0x4c06b0) {
  function _0x29a5ac (line 5469) | function _0x29a5ac(_0x1a16de, _0x1af868, _0x2e45c3, _0x2a9bcc) {
  function _0x32af0e (line 5474) | function _0x32af0e(_0x58e2fa, _0x35c6ef, _0x5ce009, _0xba3041, _0x20e80f) {
  function _0x2cd488 (line 5488) | function _0x2cd488(_0x751be6, _0x4c12d4) {
  function _0x4a2daf (line 5495) | function _0x4a2daf(_0x1ea426, _0x5a460b) {
  function _0x34f60a (line 5503) | function _0x34f60a(_0x1e7505) {
  function _0x3d13cf (line 5511) | function _0x3d13cf(_0x3480fd) {
  function _0x21db29 (line 5520) | function _0x21db29(_0x584f42, _0xde0f43) {
  function _0x641e3d (line 5543) | function _0x641e3d(_0x21dbac, _0x4a67ec) {
  function _0x18a9f7 (line 5575) | function _0x18a9f7() {
  function _0x26e186 (line 5588) | function _0x26e186() {
  function _0x9c0be2 (line 5612) | function _0x9c0be2(_0x232ed8, _0x432cf8) {
  function _0x1d26db (line 5623) | function _0x1d26db(_0x261f4b, _0x3c3c83, _0x131716) {
  function _0x450b73 (line 5652) | function _0x450b73(_0xd6648d) {
  function _0x58c311 (line 5696) | function _0x58c311() {
  function _0x1dbe74 (line 5709) | function _0x1dbe74() {
  function _0x3dcfd5 (line 5720) | function _0x3dcfd5(_0x1f9f7e) {
  function _0x56114b (line 5739) | function _0x56114b(_0x35e1c1) {
  function _0x19d89b (line 5753) | function _0x19d89b(_0x39a86c) {
  function _0x42fe9b (line 5772) | function _0x42fe9b(_0x320405) {
  function _0x3ea7d6 (line 5777) | function _0x3ea7d6(_0xbdd4a6) {
  function _0x52f064 (line 5788) | function _0x52f064(_0x2031c9, _0x5a5379, _0xb6ab78) {
  function _0x26d461 (line 5805) | function _0x26d461() {
  function _0x5047d8 (line 5833) | function _0x5047d8() {
  function _0x4145f8 (line 5837) | function _0x4145f8(_0x30c511, _0x35c283) {
  function _0x1633f2 (line 5852) | function _0x1633f2(_0x48f290, _0x504655, _0x4fa808, _0x1a5c57, _0x3a4737) {
  function _0x34c70a (line 5880) | function _0x34c70a(_0xf6b3d0, _0x289075, _0x2c48ed) {
  function _0x11233a (line 5887) | function _0x11233a(_0x34d47b, _0x1b3ba5, _0x55dcd4) {
  function _0x5c2014 (line 5894) | function _0x5c2014(_0x1fa689) {
  function _0x3c875d (line 5907) | function _0x3c875d(_0x17e2b2, _0x1e7967) {
  function _0x4b49f3 (line 5916) | function _0x4b49f3(_0xe64465) {
  function _0x26151b (line 5921) | function _0x26151b(_0x51896f, _0x3a647f, _0x2db6f6) {
  function _0xc38697 (line 5925) | function _0xc38697(_0x5bf566, _0x20667e) {
  function _0x538c80 (line 5929) | function _0x538c80(_0x213380, _0x5bb06d, _0x2807a8, _0x2bbe8d, _0x43c759...
  function _0x8edc3d (line 5956) | function _0x8edc3d(_0x22218f, _0x1e70b9) {
  function _0x556182 (line 6022) | function _0x556182(_0x5e8c32) {
  function _0x5141ac (line 6027) | function _0x5141ac() {
  function _0x50686a (line 6032) | function _0x50686a(_0x193aca) {
  function _0x2195cd (line 6037) | function _0x2195cd(_0x383b5f, _0x4a7858) {
  function _0xdc4d4c (line 6049) | function _0xdc4d4c(_0x3c0aaa) {
  function _0x241339 (line 6061) | function _0x241339() {
  function _0x5011f8 (line 6066) | function _0x5011f8() {
  function _0x58210c (line 6071) | function _0x58210c(_0x4d43be, _0x3faa08, _0x3d51f5) {
  function _0x3a2b92 (line 6097) | function _0x3a2b92() {
  function _0x5abc93 (line 6114) | function _0x5abc93() {
  function _0x5d3845 (line 6121) | function _0x5d3845() {
  function _0x573065 (line 6161) | function _0x573065() {
  function _0x47f354 (line 6167) | function _0x47f354() {
  function _0x58bcf8 (line 6182) | function _0x58bcf8() {
  function _0x75957 (line 6211) | function _0x75957() {
  function _0x1555d9 (line 6231) | function _0x1555d9() {
  function _0x1f01ce (line 6238) | function _0x1f01ce(_0x371dd1) {
  function _0x3ffe15 (line 6251) | function _0x3ffe15() {
  function _0x252788 (line 6260) | function _0x252788(_0x468bb4, _0x392758, _0x269720) {
  function _0x484054 (line 6273) | function _0x484054() {
  function _0x491716 (line 6295) | function _0x491716() {
  function _0x2d2578 (line 6311) | function _0x2d2578() {
  function _0x5c328e (line 6360) | function _0x5c328e() {
  function _0x25a792 (line 6470) | function _0x25a792(_0x2f25f2) {
  function _0xd287a1 (line 6475) | function _0xd287a1(_0x35260d) {
  function _0x2b13af (line 6481) | function _0x2b13af(_0x52c947) {
  function _0x1958a5 (line 6494) | function _0x1958a5(_0x42413b, _0x5e3de6) {
  function _0x288415 (line 6506) | function _0x288415(_0x5a419e) {
  function _0x6a7375 (line 6512) | function _0x6a7375(_0x2a9a57) {
  function _0x7d8404 (line 6520) | function _0x7d8404(_0x34967f) {
  function _0x3af1be (line 6525) | function _0x3af1be() {
  function _0x415adb (line 6600) | function _0x415adb() {
  function _0x1d82ac (line 6605) | function _0x1d82ac() {
  function _0xb48e77 (line 6693) | function _0xb48e77(_0x29caaf, _0xa4ab82) {
  function _0x1294ff (line 6723) | function _0x1294ff(_0x1475ff, _0x5700d1, _0x563b6f) {
  function _0x45e0e9 (line 6742) | function _0x45e0e9(_0x2d3284, _0xb8d78) {
  function _0x344a4d (line 6757) | function _0x344a4d() {
  function _0x3f720d (line 6785) | function _0x3f720d() {
  function _0x3bfecb (line 6791) | function _0x3bfecb(_0x4b21ed) {
  function _0x43f5a3 (line 6803) | function _0x43f5a3(_0x5a985f) {
  function _0x53ee31 (line 6815) | function _0x53ee31(_0x817028) {
  function _0x3498af (line 6885) | function _0x3498af(_0x3e9bb9) {
  function _0x59992f (line 6888) | function _0x59992f(_0x10dd97) {
  function _0x39d569 (line 6894) | function _0x39d569(_0x51ab06) {
  function _0x32e4a6 (line 6902) | function _0x32e4a6() {
  function _0x1be1e1 (line 6907) | function _0x1be1e1(_0x58db04) {
  function _0x4de7ef (line 6920) | function _0x4de7ef() {
  function _0x3ff3f1 (line 6937) | function _0x3ff3f1() {
  function _0x4c727e (line 6941) | function _0x4c727e() {
  function _0x5b850b (line 6954) | function _0x5b850b() {
  function _0x498349 (line 6963) | function _0x498349(_0x5efcd6) {
  function _0x475194 (line 6967) | function _0x475194(_0x56e1e3) {
  function _0x4a4111 (line 6972) | function _0x4a4111(_0x2ba688, _0x1e135c) {
  function _0x271dea (line 6977) | function _0x271dea(_0x20563e) {
  function _0x3a4a1a (line 6981) | function _0x3a4a1a(_0x5b82b5) {
  function _0x3f0a66 (line 6986) | function _0x3f0a66(_0x53e069) {
  function get_sign (line 7028) | function get_sign(md5) {

FILE: simple_live_core/example/simple_live_core_example.dart
  function main (line 9) | void main()
  function testHuyaReq (line 48) | void testHuyaReq()
  function sendReq (line 63) | void sendReq()
  function testHuyaResp (line 90) | void testHuyaResp()

FILE: simple_live_core/lib/src/common/binary_writer.dart
  class BinaryWriter (line 3) | class BinaryWriter {
    method writeBytes (line 9) | void writeBytes(List<int> list)
    method writeInt (line 14) | void writeInt(int value, int len, {Endian endian = Endian.big})
    method writeDouble (line 35) | void writeDouble(double value, int len, {Endian endian = Endian.big})
  class BinaryReader (line 51) | class BinaryReader {
    method read (line 59) | int read()
    method readInt (line 69) | int readInt(int len, {Endian endian = Endian.big})
    method readByte (line 98) | int readByte({Endian endian = Endian.big})
    method readShort (line 104) | int readShort({Endian endian = Endian.big})
    method readInt32 (line 110) | int readInt32({Endian endian = Endian.big})
    method readLong (line 116) | int readLong({Endian endian = Endian.big})
    method readBytes (line 123) | Uint8List readBytes(int len)
    method readFloat (line 134) | double readFloat(int len, {Endian endian = Endian.big})

FILE: simple_live_core/lib/src/common/convert_helper.dart
  function asT (line 1) | T? asT<T>(dynamic value)

FILE: simple_live_core/lib/src/common/core_error.dart
  class CoreError (line 1) | class CoreError extends Error {
    method toString (line 13) | String toString()
    method statusCodeToString (line 21) | String statusCodeToString(int statusCode)

FILE: simple_live_core/lib/src/common/core_log.dart
  type RequestLogType (line 3) | enum RequestLogType {
  class CoreLog (line 16) | class CoreLog {
    method d (line 34) | void d(String message)
    method i (line 44) | void i(String message)
    method e (line 54) | void e(String message, StackTrace stackTrace)
    method error (line 65) | void error(Object e)
    method w (line 79) | void w(String message)

FILE: simple_live_core/lib/src/common/custom_interceptor.dart
  class CustomInterceptor (line 5) | class CustomInterceptor extends Interceptor {
    method onRequest (line 7) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
    method onError (line 25) | void onError(DioException err, ErrorInterceptorHandler handler)
    method onResponse (line 51) | void onResponse(Response response, ResponseInterceptorHandler handler)

FILE: simple_live_core/lib/src/common/douyin/abogus.dart
  class StringProcessor (line 6) | class StringProcessor {
    method toCharStr (line 7) | String toCharStr(List<int> codes)
    method toOrdArray (line 11) | List<int> toOrdArray(String s)
    method jsShiftRight (line 15) | int jsShiftRight(int val, int n)
    method generateRandomBytes (line 19) | String generateRandomBytes({int length = 3})
    method generateByteSequence (line 20) | List<String> generateByteSequence()
  class CryptoUtility (line 39) | class CryptoUtility {
    method sm3ToArray (line 64) | List<int> sm3ToArray(dynamic inputData)
    method addSalt (line 81) | String addSalt(String param)
    method processParam (line 85) | dynamic processParam(dynamic param, bool addSaltFlag)
    method paramsToArray (line 92) | List<int> paramsToArray(dynamic param, {bool addSalt = true})
    method transformBytes (line 97) | String transformBytes(List<int> bytesList)
    method base64Encode (line 135) | String base64Encode(String inputString, {int selectedAlphabet = 0})
    method abogusEncode (line 156) | String abogusEncode(String abogusBytesStr, int selectedAlphabet)
    method rc4Encrypt (line 187) | Uint8List rc4Encrypt(Uint8List key, String plaintext)
  class BrowserFingerprintGenerator (line 214) | class BrowserFingerprintGenerator {
    method generateFingerprint (line 215) | String generateFingerprint({String browserType = "Edge"})
    method generateChromeFingerprint (line 225) | String generateChromeFingerprint()
    method generateFirefoxFingerprint (line 226) | String generateFirefoxFingerprint()
    method generateSafariFingerprint (line 227) | String generateSafariFingerprint()
    method generateEdgeFingerprint (line 228) | String generateEdgeFingerprint()
    method _generateFingerprint (line 230) | String _generateFingerprint({required String platform})
  class ABogus (line 249) | class ABogus {
    method encodeData (line 299) | String encodeData(String data, {int alphabetIndex = 0})
    method generateAbogus (line 303) | List<String> generateAbogus(String params, {String body = ""})

FILE: simple_live_core/lib/src/common/douyin/douyin_utils.dart
  class DouyinUtils (line 10) | class DouyinUtils {
    method getMSToken (line 12) | String getMSToken({int randomLength = 184})
    method buildRequestUrl (line 23) | buildRequestUrl(String baseUrl, Map<String, dynamic> params)
    method get_ttwid_webid (line 45) | Future<Map<String, String>> get_ttwid_webid({required String req_url})

FILE: simple_live_core/lib/src/common/http_client.dart
  class HttpClient (line 6) | class HttpClient {
    method getText (line 30) | Future<String> getText(
    method getJson (line 63) | Future<dynamic> getJson(
    method postJson (line 97) | Future<dynamic> postJson(
    method head (line 136) | Future<Response> head(

FILE: simple_live_core/lib/src/common/js_engine.dart
  class JsEngine (line 5) | class JsEngine {
    method init (line 8) | void init({int stackSize = 1024 * 1024})
    method evaluate (line 22) | dynamic evaluate(String code)
    method loadJSFile (line 31) | Future<void> loadJSFile(String path)
    method dispose (line 40) | void dispose()

FILE: simple_live_core/lib/src/common/web_socket_util.dart
  type SocketStatus (line 5) | enum SocketStatus {
  class WebScoketUtils (line 11) | class WebScoketUtils {
    method connect (line 63) | void connect({bool retry = false})
    method ready (line 88) | void ready()
    method initHeartBeat (line 101) | void initHeartBeat()
    method receiveMessage (line 110) | void receiveMessage(dynamic data)
    method onError (line 116) | void onError(Object e, StackTrace s)
    method onDone (line 121) | void onDone()
    method sendMessage (line 129) | void sendMessage(dynamic message)
    method close (line 135) | void close()
    method reconnect (line 149) | void reconnect()

FILE: simple_live_core/lib/src/danmaku/bilibili_danmaku.dart
  class BiliBiliDanmakuArgs (line 13) | class BiliBiliDanmakuArgs {
    method toString (line 29) | String toString()
  class BiliBiliDanmaku (line 41) | class BiliBiliDanmaku implements LiveDanmaku {
    method start (line 57) | Future start(dynamic args)
    method joinRoom (line 87) | void joinRoom(BiliBiliDanmakuArgs args)
    method heartbeat (line 104) | void heartbeat()
    method stop (line 112) | Future stop()
    method encodeData (line 118) | List<int> encodeData(String msg, int action)
    method decodeMessage (line 146) | void decodeMessage(List<int> data)
    method parseMessage (line 187) | void parseMessage(String jsonMessage)
    method readInt (line 241) | int readInt(List<int> buffer, int start, int len)

FILE: simple_live_core/lib/src/danmaku/douyin_danmaku.dart
  class DouyinDanmakuArgs (line 13) | class DouyinDanmakuArgs {
    method toString (line 27) | String toString()
  class DouyinDanmaku (line 37) | class DouyinDanmaku implements LiveDanmaku {
    method start (line 52) | Future start(dynamic args)
    method heartbeat (line 129) | void heartbeat()
    method decodeMessage (line 135) | void decodeMessage(List<int> args)
    method unPackWebcastChatMessage (line 156) | void unPackWebcastChatMessage(List<int> payload)
    method unPackWebcastRoomUserSeqMessage (line 172) | void unPackWebcastRoomUserSeqMessage(List<int> payload)
    method sendAck (line 186) | void sendAck(dynamic logId, String internalExt)
    method joinRoom (line 194) | void joinRoom(dynamic args)
    method stop (line 201) | Future stop()
    method getSignature (line 213) | Future<String> getSignature(String roomId, String uniqueId)

FILE: simple_live_core/lib/src/danmaku/douyu_danmaku.dart
  class DouyuDanmaku (line 10) | class DouyuDanmaku implements LiveDanmaku {
    method start (line 25) | Future start(dynamic args)
    method joinRoom (line 49) | void joinRoom(String roomId)
    method heartbeat (line 57) | void heartbeat()
    method stop (line 63) | Future stop()
    method decodeMessage (line 69) | void decodeMessage(List<int> data)
    method serializeDouyu (line 156) | List<int> serializeDouyu(String body)
    method deserializeDouyu (line 179) | String? deserializeDouyu(List<int> buffer)
    method sttToJObject (line 201) | dynamic sttToJObject(String str)
    method unscapeSlashAt (line 231) | String unscapeSlashAt(String str)
    method getColor (line 235) | LiveMessageColor getColor(int type)

FILE: simple_live_core/lib/src/danmaku/huya_danmaku.dart
  class HuyaDanmakuArgs (line 11) | class HuyaDanmakuArgs {
    method toString (line 21) | String toString()
  class HuyaDanmaku (line 30) | class HuyaDanmaku implements LiveDanmaku {
    method start (line 49) | Future start(dynamic args)
    method joinRoom (line 74) | void joinRoom()
    method getJoinData (line 80) | List<int> getJoinData(int ayyuid, int tid, int sid)
    method heartbeat (line 103) | void heartbeat()
    method stop (line 108) | Future stop()
    method decodeMessage (line 114) | void decodeMessage(List<int> data)

FILE: simple_live_core/lib/src/danmaku/proto/douyin.pb.dart
  class Response (line 24) | class Response extends $pb.GeneratedMessage {
    method clone (line 96) | Response clone()
    method copyWith (line 98) | Response copyWith(void Function(Response) updates)
    method create (line 105) | Response create()
    method createEmptyInstance (line 107) | Response createEmptyInstance()
    method getDefault (line 109) | Response getDefault()
    method hasCursor (line 121) | $core.bool hasCursor()
    method clearCursor (line 123) | void clearCursor()
    method hasFetchInterval (line 130) | $core.bool hasFetchInterval()
    method clearFetchInterval (line 132) | void clearFetchInterval()
    method hasNow (line 139) | $core.bool hasNow()
    method clearNow (line 141) | void clearNow()
    method hasInternalExt (line 148) | $core.bool hasInternalExt()
    method clearInternalExt (line 150) | void clearInternalExt()
    method hasFetchType (line 157) | $core.bool hasFetchType()
    method clearFetchType (line 159) | void clearFetchType()
    method hasHeartbeatDuration (line 169) | $core.bool hasHeartbeatDuration()
    method clearHeartbeatDuration (line 171) | void clearHeartbeatDuration()
    method hasNeedAck (line 178) | $core.bool hasNeedAck()
    method clearNeedAck (line 180) | void clearNeedAck()
    method hasPushServer (line 187) | $core.bool hasPushServer()
    method clearPushServer (line 189) | void clearPushServer()
    method hasLiveCursor (line 196) | $core.bool hasLiveCursor()
    method clearLiveCursor (line 198) | void clearLiveCursor()
    method hasHistoryNoMore (line 205) | $core.bool hasHistoryNoMore()
    method clearHistoryNoMore (line 207) | void clearHistoryNoMore()
  class Message (line 210) | class Message extends $pb.GeneratedMessage {
    method clone (line 258) | Message clone()
    method copyWith (line 260) | Message copyWith(void Function(Message) updates)
    method create (line 267) | Message create()
    method createEmptyInstance (line 269) | Message createEmptyInstance()
    method getDefault (line 271) | Message getDefault()
    method hasMethod (line 280) | $core.bool hasMethod()
    method clearMethod (line 282) | void clearMethod()
    method hasPayload (line 289) | $core.bool hasPayload()
    method clearPayload (line 291) | void clearPayload()
    method hasMsgId (line 298) | $core.bool hasMsgId()
    method clearMsgId (line 300) | void clearMsgId()
    method hasMsgType (line 307) | $core.bool hasMsgType()
    method clearMsgType (line 309) | void clearMsgType()
    method hasOffset (line 316) | $core.bool hasOffset()
    method clearOffset (line 318) | void clearOffset()
    method hasNeedWrdsStore (line 325) | $core.bool hasNeedWrdsStore()
    method clearNeedWrdsStore (line 327) | void clearNeedWrdsStore()
    method hasWrdsVersion (line 334) | $core.bool hasWrdsVersion()
    method clearWrdsVersion (line 336) | void clearWrdsVersion()
    method hasWrdsSubKey (line 343) | $core.bool hasWrdsSubKey()
    method clearWrdsSubKey (line 345) | void clearWrdsSubKey()
  class ChatMessage (line 349) | class ChatMessage extends $pb.GeneratedMessage {
    method clone (line 449) | ChatMessage clone()
    method copyWith (line 451) | ChatMessage copyWith(void Function(ChatMessage) updates)
    method create (line 459) | ChatMessage create()
    method createEmptyInstance (line 461) | ChatMessage createEmptyInstance()
    method getDefault (line 463) | ChatMessage getDefault()
    method hasCommon (line 472) | $core.bool hasCommon()
    method clearCommon (line 474) | void clearCommon()
    method ensureCommon (line 476) | Common ensureCommon()
    method hasUser (line 483) | $core.bool hasUser()
    method clearUser (line 485) | void clearUser()
    method ensureUser (line 487) | User ensureUser()
    method hasContent (line 494) | $core.bool hasContent()
    method clearContent (line 496) | void clearContent()
    method hasVisibleToSender (line 503) | $core.bool hasVisibleToSender()
    method clearVisibleToSender (line 505) | void clearVisibleToSender()
    method hasBackgroundImage (line 512) | $core.bool hasBackgroundImage()
    method clearBackgroundImage (line 514) | void clearBackgroundImage()
    method ensureBackgroundImage (line 516) | Image ensureBackgroundImage()
    method hasFullScreenTextColor (line 523) | $core.bool hasFullScreenTextColor()
    method clearFullScreenTextColor (line 525) | void clearFullScreenTextColor()
    method hasBackgroundImageV2 (line 532) | $core.bool hasBackgroundImageV2()
    method clearBackgroundImageV2 (line 534) | void clearBackgroundImageV2()
    method ensureBackgroundImageV2 (line 536) | Image ensureBackgroundImageV2()
    method hasPublicAreaCommon (line 543) | $core.bool hasPublicAreaCommon()
    method clearPublicAreaCommon (line 545) | void clearPublicAreaCommon()
    method ensurePublicAreaCommon (line 547) | PublicAreaCommon ensurePublicAreaCommon()
    method hasGiftImage (line 554) | $core.bool hasGiftImage()
    method clearGiftImage (line 556) | void clearGiftImage()
    method ensureGiftImage (line 558) | Image ensureGiftImage()
    method hasAgreeMsgId (line 565) | $core.bool hasAgreeMsgId()
    method clearAgreeMsgId (line 567) | void clearAgreeMsgId()
    method hasPriorityLevel (line 574) | $core.bool hasPriorityLevel()
    method clearPriorityLevel (line 576) | void clearPriorityLevel()
    method hasLandscapeAreaCommon (line 583) | $core.bool hasLandscapeAreaCommon()
    method clearLandscapeAreaCommon (line 585) | void clearLandscapeAreaCommon()
    method ensureLandscapeAreaCommon (line 587) | LandscapeAreaCommon ensureLandscapeAreaCommon()
    method hasEventTime (line 594) | $core.bool hasEventTime()
    method clearEventTime (line 596) | void clearEventTime()
    method hasSendReview (line 603) | $core.bool hasSendReview()
    method clearSendReview (line 605) | void clearSendReview()
    method hasFromIntercom (line 612) | $core.bool hasFromIntercom()
    method clearFromIntercom (line 614) | void clearFromIntercom()
    method hasIntercomHideUserCard (line 621) | $core.bool hasIntercomHideUserCard()
    method clearIntercomHideUserCard (line 623) | void clearIntercomHideUserCard()
    method hasChatBy (line 631) | $core.bool hasChatBy()
    method clearChatBy (line 633) | void clearChatBy()
    method hasIndividualChatPriority (line 640) | $core.bool hasIndividualChatPriority()
    method clearIndividualChatPriority (line 642) | void clearIndividualChatPriority()
    method hasRtfContent (line 649) | $core.bool hasRtfContent()
    method clearRtfContent (line 651) | void clearRtfContent()
    method ensureRtfContent (line 653) | Text ensureRtfContent()
  class LandscapeAreaCommon (line 656) | class LandscapeAreaCommon extends $pb.GeneratedMessage {
    method clone (line 701) | LandscapeAreaCommon clone()
    method copyWith (line 703) | LandscapeAreaCommon copyWith(void Function(LandscapeAreaCommon) updates)
    method create (line 711) | LandscapeAreaCommon create()
    method createEmptyInstance (line 713) | LandscapeAreaCommon createEmptyInstance()
    method getDefault (line 715) | LandscapeAreaCommon getDefault()
    method hasShowHead (line 724) | $core.bool hasShowHead()
    method clearShowHead (line 726) | void clearShowHead()
    method hasShowNickname (line 733) | $core.bool hasShowNickname()
    method clearShowNickname (line 735) | void clearShowNickname()
    method hasShowFontColor (line 742) | $core.bool hasShowFontColor()
    method clearShowFontColor (line 744) | void clearShowFontColor()
  class RoomUserSeqMessage (line 753) | class RoomUserSeqMessage extends $pb.GeneratedMessage {
    method clone (line 825) | RoomUserSeqMessage clone()
    method copyWith (line 827) | RoomUserSeqMessage copyWith(void Function(RoomUserSeqMessage) updates)
    method create (line 835) | RoomUserSeqMessage create()
    method createEmptyInstance (line 837) | RoomUserSeqMessage createEmptyInstance()
    method getDefault (line 839) | RoomUserSeqMessage getDefault()
    method hasCommon (line 848) | $core.bool hasCommon()
    method clearCommon (line 850) | void clearCommon()
    method ensureCommon (line 852) | Common ensureCommon()
    method hasTotal (line 862) | $core.bool hasTotal()
    method clearTotal (line 864) | void clearTotal()
    method hasPopStr (line 871) | $core.bool hasPopStr()
    method clearPopStr (line 873) | void clearPopStr()
    method hasPopularity (line 883) | $core.bool hasPopularity()
    method clearPopularity (line 885) | void clearPopularity()
    method hasTotalUser (line 892) | $core.bool hasTotalUser()
    method clearTotalUser (line 894) | void clearTotalUser()
    method hasTotalUserStr (line 901) | $core.bool hasTotalUserStr()
    method clearTotalUserStr (line 903) | void clearTotalUserStr()
    method hasTotalStr (line 910) | $core.bool hasTotalStr()
    method clearTotalStr (line 912) | void clearTotalStr()
    method hasOnlineUserForAnchor (line 919) | $core.bool hasOnlineUserForAnchor()
    method clearOnlineUserForAnchor (line 921) | void clearOnlineUserForAnchor()
    method hasTotalPvForAnchor (line 928) | $core.bool hasTotalPvForAnchor()
    method clearTotalPvForAnchor (line 930) | void clearTotalPvForAnchor()
    method hasUpRightStatsStr (line 937) | $core.bool hasUpRightStatsStr()
    method clearUpRightStatsStr (line 939) | void clearUpRightStatsStr()
    method hasUpRightStatsStrComplete (line 946) | $core.bool hasUpRightStatsStrComplete()
    method clearUpRightStatsStrComplete (line 948) | void clearUpRightStatsStrComplete()
  class CommonTextMessage (line 951) | class CommonTextMessage extends $pb.GeneratedMessage {
    method clone (line 983) | CommonTextMessage clone()
    method copyWith (line 985) | CommonTextMessage copyWith(void Function(CommonTextMessage) updates)
    method create (line 993) | CommonTextMessage create()
    method createEmptyInstance (line 995) | CommonTextMessage createEmptyInstance()
    method getDefault (line 997) | CommonTextMessage getDefault()
    method hasCommon (line 1006) | $core.bool hasCommon()
    method clearCommon (line 1008) | void clearCommon()
    method ensureCommon (line 1010) | Common ensureCommon()
    method hasUser (line 1017) | $core.bool hasUser()
    method clearUser (line 1019) | void clearUser()
    method ensureUser (line 1021) | User ensureUser()
    method hasScene (line 1028) | $core.bool hasScene()
    method clearScene (line 1030) | void clearScene()
  class UpdateFanTicketMessage (line 1033) | class UpdateFanTicketMessage extends $pb.GeneratedMessage {
    method clone (line 1073) | UpdateFanTicketMessage clone()
    method copyWith (line 1075) | UpdateFanTicketMessage copyWith(
    method create (line 1084) | UpdateFanTicketMessage create()
    method createEmptyInstance (line 1086) | UpdateFanTicketMessage createEmptyInstance()
    method getDefault (line 1088) | UpdateFanTicketMessage getDefault()
    method hasCommon (line 1097) | $core.bool hasCommon()
    method clearCommon (line 1099) | void clearCommon()
    method ensureCommon (line 1101) | Common ensureCommon()
    method hasRoomFanTicketCountText (line 1108) | $core.bool hasRoomFanTicketCountText()
    method clearRoomFanTicketCountText (line 1110) | void clearRoomFanTicketCountText()
    method hasRoomFanTicketCount (line 1117) | $core.bool hasRoomFanTicketCount()
    method clearRoomFanTicketCount (line 1119) | void clearRoomFanTicketCount()
    method hasForceUpdate (line 1126) | $core.bool hasForceUpdate()
    method clearForceUpdate (line 1128) | void clearForceUpdate()
  class RoomUserSeqMessageContributor (line 1131) | class RoomUserSeqMessageContributor extends $pb.GeneratedMessage {
    method clone (line 1179) | RoomUserSeqMessageContributor clone()
    method copyWith (line 1181) | RoomUserSeqMessageContributor copyWith(
    method create (line 1191) | RoomUserSeqMessageContributor create()
    method createEmptyInstance (line 1194) | RoomUserSeqMessageContributor createEmptyInstance()
    method getDefault (line 1196) | RoomUserSeqMessageContributor getDefault()
    method hasScore (line 1205) | $core.bool hasScore()
    method clearScore (line 1207) | void clearScore()
    method hasUser (line 1214) | $core.bool hasUser()
    method clearUser (line 1216) | void clearUser()
    method ensureUser (line 1218) | User ensureUser()
    method hasRank (line 1225) | $core.bool hasRank()
    method clearRank (line 1227) | void clearRank()
    method hasDelta (line 1234) | $core.bool hasDelta()
    method clearDelta (line 1236) | void clearDelta()
    method hasIsHidden (line 1243) | $core.bool hasIsHidden()
    method clearIsHidden (line 1245) | void clearIsHidden()
    method hasScoreDescription (line 1252) | $core.bool hasScoreDescription()
    method clearScoreDescription (line 1254) | void clearScoreDescription()
    method hasExactlyScore (line 1261) | $core.bool hasExactlyScore()
    method clearExactlyScore (line 1263) | void clearExactlyScore()
  class GiftMessage (line 1267) | class GiftMessage extends $pb.GeneratedMessage {
    method clone (line 1427) | GiftMessage clone()
    method copyWith (line 1429) | GiftMessage copyWith(void Function(GiftMessage) updates)
    method create (line 1437) | GiftMessage create()
    method createEmptyInstance (line 1439) | GiftMessage createEmptyInstance()
    method getDefault (line 1441) | GiftMessage getDefault()
    method hasCommon (line 1450) | $core.bool hasCommon()
    method clearCommon (line 1452) | void clearCommon()
    method ensureCommon (line 1454) | Common ensureCommon()
    method hasGiftId (line 1461) | $core.bool hasGiftId()
    method clearGiftId (line 1463) | void clearGiftId()
    method hasFanTicketCount (line 1470) | $core.bool hasFanTicketCount()
    method clearFanTicketCount (line 1472) | void clearFanTicketCount()
    method hasGroupCount (line 1479) | $core.bool hasGroupCount()
    method clearGroupCount (line 1481) | void clearGroupCount()
    method hasRepeatCount (line 1488) | $core.bool hasRepeatCount()
    method clearRepeatCount (line 1490) | void clearRepeatCount()
    method hasComboCount (line 1497) | $core.bool hasComboCount()
    method clearComboCount (line 1499) | void clearComboCount()
    method hasUser (line 1506) | $core.bool hasUser()
    method clearUser (line 1508) | void clearUser()
    method ensureUser (line 1510) | User ensureUser()
    method hasToUser (line 1517) | $core.bool hasToUser()
    method clearToUser (line 1519) | void clearToUser()
    method ensureToUser (line 1521) | User ensureToUser()
    method hasRepeatEnd (line 1528) | $core.bool hasRepeatEnd()
    method clearRepeatEnd (line 1530) | void clearRepeatEnd()
    method hasTextEffect (line 1537) | $core.bool hasTextEffect()
    method clearTextEffect (line 1539) | void clearTextEffect()
    method ensureTextEffect (line 1541) | TextEffect ensureTextEffect()
    method hasGroupId (line 1548) | $core.bool hasGroupId()
    method clearGroupId (line 1550) | void clearGroupId()
    method hasIncomeTaskgifts (line 1557) | $core.bool hasIncomeTaskgifts()
    method clearIncomeTaskgifts (line 1559) | void clearIncomeTaskgifts()
    method hasRoomFanTicketCount (line 1566) | $core.bool hasRoomFanTicketCount()
    method clearRoomFanTicketCount (line 1568) | void clearRoomFanTicketCount()
    method hasPriority (line 1575) | $core.bool hasPriority()
    method clearPriority (line 1577) | void clearPriority()
    method ensurePriority (line 1579) | GiftIMPriority ensurePriority()
    method hasGift (line 1586) | $core.bool hasGift()
    method clearGift (line 1588) | void clearGift()
    method ensureGift (line 1590) | GiftStruct ensureGift()
    method hasLogId (line 1597) | $core.bool hasLogId()
    method clearLogId (line 1599) | void clearLogId()
    method hasSendType (line 1606) | $core.bool hasSendType()
    method clearSendType (line 1608) | void clearSendType()
    method hasPublicAreaCommon (line 1615) | $core.bool hasPublicAreaCommon()
    method clearPublicAreaCommon (line 1617) | void clearPublicAreaCommon()
    method ensurePublicAreaCommon (line 1619) | PublicAreaCommon ensurePublicAreaCommon()
    method hasTrayDisplayText (line 1626) | $core.bool hasTrayDisplayText()
    method clearTrayDisplayText (line 1628) | void clearTrayDisplayText()
    method ensureTrayDisplayText (line 1630) | Text ensureTrayDisplayText()
    method hasBannedDisplayEffects (line 1637) | $core.bool hasBannedDisplayEffects()
    method clearBannedDisplayEffects (line 1639) | void clearBannedDisplayEffects()
    method hasDisplayForSelf (line 1648) | $core.bool hasDisplayForSelf()
    method clearDisplayForSelf (line 1650) | void clearDisplayForSelf()
    method hasInteractGiftInfo (line 1657) | $core.bool hasInteractGiftInfo()
    method clearInteractGiftInfo (line 1659) | void clearInteractGiftInfo()
    method hasDiyItemInfo (line 1666) | $core.bool hasDiyItemInfo()
    method clearDiyItemInfo (line 1668) | void clearDiyItemInfo()
    method hasTotalCount (line 1678) | $core.bool hasTotalCount()
    method clearTotalCount (line 1680) | void clearTotalCount()
    method hasClientGiftSource (line 1687) | $core.bool hasClientGiftSource()
    method clearClientGiftSource (line 1689) | void clearClientGiftSource()
    method hasSendTime (line 1700) | $core.bool hasSendTime()
    method clearSendTime (line 1702) | void clearSendTime()
    method hasForceDisplayEffects (line 1709) | $core.bool hasForceDisplayEffects()
    method clearForceDisplayEffects (line 1711) | void clearForceDisplayEffects()
    method hasTraceId (line 1718) | $core.bool hasTraceId()
    method clearTraceId (line 1720) | void clearTraceId()
    method hasEffectDisplayTs (line 1727) | $core.bool hasEffectDisplayTs()
    method clearEffectDisplayTs (line 1729) | void clearEffectDisplayTs()
  class GiftStruct (line 1732) | class GiftStruct extends $pb.GeneratedMessage {
    method clone (line 1825) | GiftStruct clone()
    method copyWith (line 1827) | GiftStruct copyWith(void Function(GiftStruct) updates)
    method create (line 1834) | GiftStruct create()
    method createEmptyInstance (line 1836) | GiftStruct createEmptyInstance()
    method getDefault (line 1838) | GiftStruct getDefault()
    method hasImage (line 1847) | $core.bool hasImage()
    method clearImage (line 1849) | void clearImage()
    method ensureImage (line 1851) | Image ensureImage()
    method hasDescribe (line 1858) | $core.bool hasDescribe()
    method clearDescribe (line 1860) | void clearDescribe()
    method hasNotify (line 1867) | $core.bool hasNotify()
    method clearNotify (line 1869) | void clearNotify()
    method hasDuration (line 1876) | $core.bool hasDuration()
    method clearDuration (line 1878) | void clearDuration()
    method hasId (line 1885) | $core.bool hasId()
    method clearId (line 1887) | void clearId()
    method hasForLinkmic (line 1895) | $core.bool hasForLinkmic()
    method clearForLinkmic (line 1897) | void clearForLinkmic()
    method hasDoodle (line 1904) | $core.bool hasDoodle()
    method clearDoodle (line 1906) | void clearDoodle()
    method hasForFansclub (line 1913) | $core.bool hasForFansclub()
    method clearForFansclub (line 1915) | void clearForFansclub()
    method hasCombo (line 1922) | $core.bool hasCombo()
    method clearCombo (line 1924) | void clearCombo()
    method hasType (line 1931) | $core.bool hasType()
    method clearType (line 1933) | void clearType()
    method hasDiamondCount (line 1940) | $core.bool hasDiamondCount()
    method clearDiamondCount (line 1942) | void clearDiamondCount()
    method hasIsDisplayedOnPanel (line 1949) | $core.bool hasIsDisplayedOnPanel()
    method clearIsDisplayedOnPanel (line 1951) | void clearIsDisplayedOnPanel()
    method hasPrimaryEffectId (line 1958) | $core.bool hasPrimaryEffectId()
    method clearPrimaryEffectId (line 1960) | void clearPrimaryEffectId()
    method hasGiftLabelIcon (line 1967) | $core.bool hasGiftLabelIcon()
    method clearGiftLabelIcon (line 1969) | void clearGiftLabelIcon()
    method ensureGiftLabelIcon (line 1971) | Image ensureGiftLabelIcon()
    method hasName (line 1978) | $core.bool hasName()
    method clearName (line 1980) | void clearName()
    method hasRegion (line 1987) | $core.bool hasRegion()
    method clearRegion (line 1989) | void clearRegion()
    method hasManual (line 1996) | $core.bool hasManual()
    method clearManual (line 1998) | void clearManual()
    method hasForCustom (line 2005) | $core.bool hasForCustom()
    method clearForCustom (line 2007) | void clearForCustom()
    method hasIcon (line 2015) | $core.bool hasIcon()
    method clearIcon (line 2017) | void clearIcon()
    method ensureIcon (line 2019) | Image ensureIcon()
    method hasActionType (line 2026) | $core.bool hasActionType()
    method clearActionType (line 2028) | void clearActionType()
  class GiftIMPriority (line 2031) | class GiftIMPriority extends $pb.GeneratedMessage {
    method clone (line 2069) | GiftIMPriority clone()
    method copyWith (line 2071) | GiftIMPriority copyWith(void Function(GiftIMPriority) updates)
    method create (line 2079) | GiftIMPriority create()
    method createEmptyInstance (line 2081) | GiftIMPriority createEmptyInstance()
    method getDefault (line 2083) | GiftIMPriority getDefault()
    method hasSelfQueuePriority (line 2095) | $core.bool hasSelfQueuePriority()
    method clearSelfQueuePriority (line 2097) | void clearSelfQueuePriority()
    method hasPriority (line 2104) | $core.bool hasPriority()
    method clearPriority (line 2106) | void clearPriority()
  class TextEffect (line 2109) | class TextEffect extends $pb.GeneratedMessage {
    method clone (line 2140) | TextEffect clone()
    method copyWith (line 2142) | TextEffect copyWith(void Function(TextEffect) updates)
    method create (line 2149) | TextEffect create()
    method createEmptyInstance (line 2151) | TextEffect createEmptyInstance()
    method getDefault (line 2153) | TextEffect getDefault()
    method hasPortrait (line 2162) | $core.bool hasPortrait()
    method clearPortrait (line 2164) | void clearPortrait()
    method ensurePortrait (line 2166) | TextEffectDetail ensurePortrait()
    method hasLandscape (line 2173) | $core.bool hasLandscape()
    method clearLandscape (line 2175) | void clearLandscape()
    method ensureLandscape (line 2177) | TextEffectDetail ensureLandscape()
  class TextEffectDetail (line 2180) | class TextEffectDetail extends $pb.GeneratedMessage {
    method clone (line 2254) | TextEffectDetail clone()
    method copyWith (line 2256) | TextEffectDetail copyWith(void Function(TextEffectDetail) updates)
    method create (line 2264) | TextEffectDetail create()
    method createEmptyInstance (line 2266) | TextEffectDetail createEmptyInstance()
    method getDefault (line 2268) | TextEffectDetail getDefault()
    method hasText (line 2277) | $core.bool hasText()
    method clearText (line 2279) | void clearText()
    method ensureText (line 2281) | Text ensureText()
    method hasTextFontSize (line 2288) | $core.bool hasTextFontSize()
    method clearTextFontSize (line 2290) | void clearTextFontSize()
    method hasBackground (line 2297) | $core.bool hasBackground()
    method clearBackground (line 2299) | void clearBackground()
    method ensureBackground (line 2301) | Image ensureBackground()
    method hasStart (line 2308) | $core.bool hasStart()
    method clearStart (line 2310) | void clearStart()
    method hasDuration (line 2317) | $core.bool hasDuration()
    method clearDuration (line 2319) | void clearDuration()
    method hasX (line 2326) | $core.bool hasX()
    method clearX (line 2328) | void clearX()
    method hasY (line 2335) | $core.bool hasY()
    method clearY (line 2337) | void clearY()
    method hasWidth (line 2344) | $core.bool hasWidth()
    method clearWidth (line 2346) | void clearWidth()
    method hasHeight (line 2353) | $core.bool hasHeight()
    method clearHeight (line 2355) | void clearHeight()
    method hasShadowDx (line 2362) | $core.bool hasShadowDx()
    method clearShadowDx (line 2364) | void clearShadowDx()
    method hasShadowDy (line 2371) | $core.bool hasShadowDy()
    method clearShadowDy (line 2373) | void clearShadowDy()
    method hasShadowRadius (line 2380) | $core.bool hasShadowRadius()
    method clearShadowRadius (line 2382) | void clearShadowRadius()
    method hasShadowColor (line 2389) | $core.bool hasShadowColor()
    method clearShadowColor (line 2391) | void clearShadowColor()
    method hasStrokeColor (line 2398) | $core.bool hasStrokeColor()
    method clearStrokeColor (line 2400) | void clearStrokeColor()
    method hasStrokeWidth (line 2407) | $core.bool hasStrokeWidth()
    method clearStrokeWidth (line 2409) | void clearStrokeWidth()
  class MemberMessage (line 2413) | class MemberMessage extends $pb.GeneratedMessage {
    method clone (line 2521) | MemberMessage clone()
    method copyWith (line 2523) | MemberMessage copyWith(void Function(MemberMessage) updates)
    method create (line 2531) | MemberMessage create()
    method createEmptyInstance (line 2533) | MemberMessage createEmptyInstance()
    method getDefault (line 2535) | MemberMessage getDefault()
    method hasCommon (line 2544) | $core.bool hasCommon()
    method clearCommon (line 2546) | void clearCommon()
    method ensureCommon (line 2548) | Common ensureCommon()
    method hasUser (line 2555) | $core.bool hasUser()
    method clearUser (line 2557) | void clearUser()
    method ensureUser (line 2559) | User ensureUser()
    method hasMemberCount (line 2566) | $core.bool hasMemberCount()
    method clearMemberCount (line 2568) | void clearMemberCount()
    method hasOperator (line 2575) | $core.bool hasOperator()
    method clearOperator (line 2577) | void clearOperator()
    method ensureOperator (line 2579) | User ensureOperator()
    method hasIsSetToAdmin (line 2586) | $core.bool hasIsSetToAdmin()
    method clearIsSetToAdmin (line 2588) | void clearIsSetToAdmin()
    method hasIsTopUser (line 2595) | $core.bool hasIsTopUser()
    method clearIsTopUser (line 2597) | void clearIsTopUser()
    method hasRankScore (line 2604) | $core.bool hasRankScore()
    method clearRankScore (line 2606) | void clearRankScore()
    method hasTopUserNo (line 2613) | $core.bool hasTopUserNo()
    method clearTopUserNo (line 2615) | void clearTopUserNo()
    method hasEnterType (line 2622) | $core.bool hasEnterType()
    method clearEnterType (line 2624) | void clearEnterType()
    method hasAction (line 2631) | $core.bool hasAction()
    method clearAction (line 2633) | void clearAction()
    method hasActionDescription (line 2640) | $core.bool hasActionDescription()
    method clearActionDescription (line 2642) | void clearActionDescription()
    method hasUserId (line 2649) | $core.bool hasUserId()
    method clearUserId (line 2651) | void clearUserId()
    method hasEffectConfig (line 2658) | $core.bool hasEffectConfig()
    method clearEffectConfig (line 2660) | void clearEffectConfig()
    method ensureEffectConfig (line 2662) | EffectConfig ensureEffectConfig()
    method hasPopStr (line 2669) | $core.bool hasPopStr()
    method clearPopStr (line 2671) | void clearPopStr()
    method hasEnterEffectConfig (line 2678) | $core.bool hasEnterEffectConfig()
    method clearEnterEffectConfig (line 2680) | void clearEnterEffectConfig()
    method ensureEnterEffectConfig (line 2682) | EffectConfig ensureEnterEffectConfig()
    method hasBackgroundImage (line 2689) | $core.bool hasBackgroundImage()
    method clearBackgroundImage (line 2691) | void clearBackgroundImage()
    method ensureBackgroundImage (line 2693) | Image ensureBackgroundImage()
    method hasBackgroundImageV2 (line 2700) | $core.bool hasBackgroundImageV2()
    method clearBackgroundImageV2 (line 2702) | void clearBackgroundImageV2()
    method ensureBackgroundImageV2 (line 2704) | Image ensureBackgroundImageV2()
    method hasAnchorDisplayText (line 2711) | $core.bool hasAnchorDisplayText()
    method clearAnchorDisplayText (line 2713) | void clearAnchorDisplayText()
    method ensureAnchorDisplayText (line 2715) | Text ensureAnchorDisplayText()
    method hasPublicAreaCommon (line 2722) | $core.bool hasPublicAreaCommon()
    method clearPublicAreaCommon (line 2724) | void clearPublicAreaCommon()
    method ensurePublicAreaCommon (line 2726) | PublicAreaCommon ensurePublicAreaCommon()
    method hasUserEnterTipType (line 2733) | $core.bool hasUserEnterTipType()
    method clearUserEnterTipType (line 2735) | void clearUserEnterTipType()
    method hasAnchorEnterTipType (line 2742) | $core.bool hasAnchorEnterTipType()
    method clearAnchorEnterTipType (line 2744) | void clearAnchorEnterTipType()
  class PublicAreaCommon (line 2747) | class PublicAreaCommon extends $pb.GeneratedMessage {
    method clone (line 2785) | PublicAreaCommon clone()
    method copyWith (line 2787) | PublicAreaCommon copyWith(void Function(PublicAreaCommon) updates)
    method create (line 2795) | PublicAreaCommon create()
    method createEmptyInstance (line 2797) | PublicAreaCommon createEmptyInstance()
    method getDefault (line 2799) | PublicAreaCommon getDefault()
    method hasUserLabel (line 2808) | $core.bool hasUserLabel()
    method clearUserLabel (line 2810) | void clearUserLabel()
    method ensureUserLabel (line 2812) | Image ensureUserLabel()
    method hasUserConsumeInRoom (line 2819) | $core.bool hasUserConsumeInRoom()
    method clearUserConsumeInRoom (line 2821) | void clearUserConsumeInRoom()
    method hasUserSendGiftCntInRoom (line 2828) | $core.bool hasUserSendGiftCntInRoom()
    method clearUserSendGiftCntInRoom (line 2830) | void clearUserSendGiftCntInRoom()
  class EffectConfig (line 2833) | class EffectConfig extends $pb.GeneratedMessage {
    method clone (line 2956) | EffectConfig clone()
    method copyWith (line 2958) | EffectConfig copyWith(void Function(EffectConfig) updates)
    method create (line 2966) | EffectConfig create()
    method createEmptyInstance (line 2968) | EffectConfig createEmptyInstance()
    method getDefault (line 2970) | EffectConfig getDefault()
    method hasType (line 2979) | $core.bool hasType()
    method clearType (line 2981) | void clearType()
    method hasIcon (line 2988) | $core.bool hasIcon()
    method clearIcon (line 2990) | void clearIcon()
    method ensureIcon (line 2992) | Image ensureIcon()
    method hasAvatarPos (line 2999) | $core.bool hasAvatarPos()
    method clearAvatarPos (line 3001) | void clearAvatarPos()
    method hasText (line 3008) | $core.bool hasText()
    method clearText (line 3010) | void clearText()
    method ensureText (line 3012) | Text ensureText()
    method hasTextIcon (line 3019) | $core.bool hasTextIcon()
    method clearTextIcon (line 3021) | void clearTextIcon()
    method ensureTextIcon (line 3023) | Image ensureTextIcon()
    method hasStayTime (line 3030) | $core.bool hasStayTime()
    method clearStayTime (line 3032) | void clearStayTime()
    method hasAnimAssetId (line 3039) | $core.bool hasAnimAssetId()
    method clearAnimAssetId (line 3041) | void clearAnimAssetId()
    method hasBadge (line 3048) | $core.bool hasBadge()
    method clearBadge (line 3050) | void clearBadge()
    method ensureBadge (line 3052) | Image ensureBadge()
    method hasTextIconOverlay (line 3062) | $core.bool hasTextIconOverlay()
    method clearTextIconOverlay (line 3064) | void clearTextIconOverlay()
    method ensureTextIconOverlay (line 3066) | Image ensureTextIconOverlay()
    method hasAnimatedBadge (line 3073) | $core.bool hasAnimatedBadge()
    method clearAnimatedBadge (line 3075) | void clearAnimatedBadge()
    method ensureAnimatedBadge (line 3077) | Image ensureAnimatedBadge()
    method hasHasSweepLight (line 3084) | $core.bool hasHasSweepLight()
    method clearHasSweepLight (line 3086) | void clearHasSweepLight()
    method hasCenterAnimAssetId (line 3096) | $core.bool hasCenterAnimAssetId()
    method clearCenterAnimAssetId (line 3098) | void clearCenterAnimAssetId()
    method hasDynamicImage (line 3105) | $core.bool hasDynamicImage()
    method clearDynamicImage (line 3107) | void clearDynamicImage()
    method ensureDynamicImage (line 3109) | Image ensureDynamicImage()
    method hasMp4AnimAssetId (line 3119) | $core.bool hasMp4AnimAssetId()
    method clearMp4AnimAssetId (line 3121) | void clearMp4AnimAssetId()
    method hasPriority (line 3128) | $core.bool hasPriority()
    method clearPriority (line 3130) | void clearPriority()
    method hasMaxWaitTime (line 3137) | $core.bool hasMaxWaitTime()
    method clearMaxWaitTime (line 3139) | void clearMaxWaitTime()
    method hasDressId (line 3146) | $core.bool hasDressId()
    method clearDressId (line 3148) | void clearDressId()
    method hasAlignment (line 3155) | $core.bool hasAlignment()
    method clearAlignment (line 3157) | void clearAlignment()
    method hasAlignmentOffset (line 3164) | $core.bool hasAlignmentOffset()
    method clearAlignmentOffset (line 3166) | void clearAlignmentOffset()
  class Text (line 3169) | class Text extends $pb.GeneratedMessage {
    method clone (line 3206) | Text clone()
    method copyWith (line 3208) | Text copyWith(void Function(Text) updates)
    method create (line 3215) | Text create()
    method createEmptyInstance (line 3217) | Text createEmptyInstance()
    method getDefault (line 3219) | Text getDefault()
    method hasKey (line 3228) | $core.bool hasKey()
    method clearKey (line 3230) | void clearKey()
    method hasDefaultPatter (line 3237) | $core.bool hasDefaultPatter()
    method clearDefaultPatter (line 3239) | void clearDefaultPatter()
    method hasDefaultFormat (line 3246) | $core.bool hasDefaultFormat()
    method clearDefaultFormat (line 3248) | void clearDefaultFormat()
    method ensureDefaultFormat (line 3250) | TextFormat ensureDefaultFormat()
  class TextPiece (line 3256) | class TextPiece extends $pb.GeneratedMessage {
    method clone (line 3309) | TextPiece clone()
    method copyWith (line 3311) | TextPiece copyWith(void Function(TextPiece) updates)
    method create (line 3318) | TextPiece create()
    method createEmptyInstance (line 3320) | TextPiece createEmptyInstance()
    method getDefault (line 3322) | TextPiece getDefault()
    method hasType (line 3331) | $core.bool hasType()
    method clearType (line 3333) | void clearType()
    method hasFormat (line 3340) | $core.bool hasFormat()
    method clearFormat (line 3342) | void clearFormat()
    method ensureFormat (line 3344) | TextFormat ensureFormat()
    method hasStringValue (line 3351) | $core.bool hasStringValue()
    method clearStringValue (line 3353) | void clearStringValue()
    method hasUserValue (line 3360) | $core.bool hasUserValue()
    method clearUserValue (line 3362) | void clearUserValue()
    method ensureUserValue (line 3364) | TextPieceUser ensureUserValue()
    method hasGiftValue (line 3371) | $core.bool hasGiftValue()
    method clearGiftValue (line 3373) | void clearGiftValue()
    method ensureGiftValue (line 3375) | TextPieceGift ensureGiftValue()
    method hasHeartValue (line 3382) | $core.bool hasHeartValue()
    method clearHeartValue (line 3384) | void clearHeartValue()
    method ensureHeartValue (line 3386) | TextPieceHeart ensureHeartValue()
    method hasPatternRefValue (line 3393) | $core.bool hasPatternRefValue()
    method clearPatternRefValue (line 3395) | void clearPatternRefValue()
    method ensurePatternRefValue (line 3397) | TextPiecePatternRef ensurePatternRefValue()
    method hasImageValue (line 3404) | $core.bool hasImageValue()
    method clearImageValue (line 3406) | void clearImageValue()
    method ensureImageValue (line 3408) | TextPieceImage ensureImageValue()
  class TextPieceImage (line 3411) | class TextPieceImage extends $pb.GeneratedMessage {
    method clone (line 3441) | TextPieceImage clone()
    method copyWith (line 3443) | TextPieceImage copyWith(void Function(TextPieceImage) updates)
    method create (line 3451) | TextPieceImage create()
    method createEmptyInstance (line 3453) | TextPieceImage createEmptyInstance()
    method getDefault (line 3455) | TextPieceImage getDefault()
    method hasImage (line 3464) | $core.bool hasImage()
    method clearImage (line 3466) | void clearImage()
    method ensureImage (line 3468) | Image ensureImage()
    method hasScalingRate (line 3475) | $core.bool hasScalingRate()
    method clearScalingRate (line 3477) | void clearScalingRate()
  class TextPiecePatternRef (line 3480) | class TextPiecePatternRef extends $pb.GeneratedMessage {
    method clone (line 3510) | TextPiecePatternRef clone()
    method copyWith (line 3512) | TextPiecePatternRef copyWith(void Function(TextPiecePatternRef) updates)
    method create (line 3520) | TextPiecePatternRef create()
    method createEmptyInstance (line 3522) | TextPiecePatternRef createEmptyInstance()
    method getDefault (line 3524) | TextPiecePatternRef getDefault()
    method hasKey (line 3533) | $core.bool hasKey()
    method clearKey (line 3535) | void clearKey()
    method hasDefaultPattern (line 3542) | $core.bool hasDefaultPattern()
    method clearDefaultPattern (line 3544) | void clearDefaultPattern()
  class TextPieceHeart (line 3547) | class TextPieceHeart extends $pb.GeneratedMessage {
    method clone (line 3573) | TextPieceHeart clone()
    method copyWith (line 3575) | TextPieceHeart copyWith(void Function(TextPieceHeart) updates)
    method create (line 3583) | TextPieceHeart create()
    method createEmptyInstance (line 3585) | TextPieceHeart createEmptyInstance()
    method getDefault (line 3587) | TextPieceHeart getDefault()
    method hasColor (line 3596) | $core.bool hasColor()
    method clearColor (line 3598) | void clearColor()
  class TextPieceGift (line 3601) | class TextPieceGift extends $pb.GeneratedMessage {
    method clone (line 3632) | TextPieceGift clone()
    method copyWith (line 3634) | TextPieceGift copyWith(void Function(TextPieceGift) updates)
    method create (line 3642) | TextPieceGift create()
    method createEmptyInstance (line 3644) | TextPieceGift createEmptyInstance()
    method getDefault (line 3646) | TextPieceGift getDefault()
    method hasGiftId (line 3655) | $core.bool hasGiftId()
    method clearGiftId (line 3657) | void clearGiftId()
    method hasNameRef (line 3664) | $core.bool hasNameRef()
    method clearNameRef (line 3666) | void clearNameRef()
    method ensureNameRef (line 3668) | PatternRef ensureNameRef()
  class PatternRef (line 3671) | class PatternRef extends $pb.GeneratedMessage {
    method clone (line 3701) | PatternRef clone()
    method copyWith (line 3703) | PatternRef copyWith(void Function(PatternRef) updates)
    method create (line 3710) | PatternRef create()
    method createEmptyInstance (line 3712) | PatternRef createEmptyInstance()
    method getDefault (line 3714) | PatternRef getDefault()
    method hasKey (line 3723) | $core.bool hasKey()
    method clearKey (line 3725) | void clearKey()
    method hasDefaultPattern (line 3732) | $core.bool hasDefaultPattern()
    method clearDefaultPattern (line 3734) | void clearDefaultPattern()
  class TextPieceUser (line 3737) | class TextPieceUser extends $pb.GeneratedMessage {
    method clone (line 3766) | TextPieceUser clone()
    method copyWith (line 3768) | TextPieceUser copyWith(void Function(TextPieceUser) updates)
    method create (line 3776) | TextPieceUser create()
    method createEmptyInstance (line 3778) | TextPieceUser createEmptyInstance()
    method getDefault (line 3780) | TextPieceUser getDefault()
    method hasUser (line 3789) | $core.bool hasUser()
    method clearUser (line 3791) | void clearUser()
    method ensureUser (line 3793) | User ensureUser()
    method hasWithColon (line 3800) | $core.bool hasWithColon()
    method clearWithColon (line 3802) | void clearWithColon()
  class TextFormat (line 3805) | class TextFormat extends $pb.GeneratedMessage {
    method clone (line 3856) | TextFormat clone()
    method copyWith (line 3858) | TextFormat copyWith(void Function(TextFormat) updates)
    method create (line 3865) | TextFormat create()
    method createEmptyInstance (line 3867) | TextFormat createEmptyInstance()
    method getDefault (line 3869) | TextFormat getDefault()
    method hasColor (line 3878) | $core.bool hasColor()
    method clearColor (line 3880) | void clearColor()
    method hasBold (line 3887) | $core.bool hasBold()
    method clearBold (line 3889) | void clearBold()
    method hasItalic (line 3896) | $core.bool hasItalic()
    method clearItalic (line 3898) | void clearItalic()
    method hasWeight (line 3905) | $core.bool hasWeight()
    method clearWeight (line 3907) | void clearWeight()
    method hasItalicAngle (line 3914) | $core.bool hasItalicAngle()
    method clearItalicAngle (line 3916) | void clearItalicAngle()
    method hasFontSize (line 3923) | $core.bool hasFontSize()
    method clearFontSize (line 3925) | void clearFontSize()
    method hasUseHeighLightColor (line 3932) | $core.bool hasUseHeighLightColor()
    method clearUseHeighLightColor (line 3934) | void clearUseHeighLightColor()
    method hasUseRemoteClor (line 3941) | $core.bool hasUseRemoteClor()
    method clearUseRemoteClor (line 3943) | void clearUseRemoteClor()
  class LikeMessage (line 3947) | class LikeMessage extends $pb.GeneratedMessage {
    method clone (line 4012) | LikeMessage clone()
    method copyWith (line 4014) | LikeMessage copyWith(void Function(LikeMessage) updates)
    method create (line 4022) | LikeMessage create()
    method createEmptyInstance (line 4024) | LikeMessage createEmptyInstance()
    method getDefault (line 4026) | LikeMessage getDefault()
    method hasCommon (line 4035) | $core.bool hasCommon()
    method clearCommon (line 4037) | void clearCommon()
    method ensureCommon (line 4039) | Common ensureCommon()
    method hasCount (line 4046) | $core.bool hasCount()
    method clearCount (line 4048) | void clearCount()
    method hasTotal (line 4055) | $core.bool hasTotal()
    method clearTotal (line 4057) | void clearTotal()
    method hasColor (line 4064) | $core.bool hasColor()
    method clearColor (line 4066) | void clearColor()
    method hasUser (line 4073) | $core.bool hasUser()
    method clearUser (line 4075) | void clearUser()
    method ensureUser (line 4077) | User ensureUser()
    method hasIcon (line 4084) | $core.bool hasIcon()
    method clearIcon (line 4086) | void clearIcon()
    method hasDoubleLikeDetail (line 4093) | $core.bool hasDoubleLikeDetail()
    method clearDoubleLikeDetail (line 4095) | void clearDoubleLikeDetail()
    method ensureDoubleLikeDetail (line 4097) | DoubleLikeDetail ensureDoubleLikeDetail()
    method hasDisplayControlInfo (line 4104) | $core.bool hasDisplayControlInfo()
    method clearDisplayControlInfo (line 4106) | void clearDisplayControlInfo()
    method ensureDisplayControlInfo (line 4108) | DisplayControlInfo ensureDisplayControlInfo()
    method hasLinkmicGuestUid (line 4115) | $core.bool hasLinkmicGuestUid()
    method clearLinkmicGuestUid (line 4117) | void clearLinkmicGuestUid()
    method hasScene (line 4124) | $core.bool hasScene()
    method clearScene (line 4126) | void clearScene()
    method hasPicoDisplayInfo (line 4133) | $core.bool hasPicoDisplayInfo()
    method clearPicoDisplayInfo (line 4135) | void clearPicoDisplayInfo()
    method ensurePicoDisplayInfo (line 4137) | PicoDisplayInfo ensurePicoDisplayInfo()
  class SocialMessage (line 4140) | class SocialMessage extends $pb.GeneratedMessage {
    method clone (line 4190) | SocialMessage clone()
    method copyWith (line 4192) | SocialMessage copyWith(void Function(SocialMessage) updates)
    method create (line 4200) | SocialMessage create()
    method createEmptyInstance (line 4202) | SocialMessage createEmptyInstance()
    method getDefault (line 4204) | SocialMessage getDefault()
    method hasCommon (line 4213) | $core.bool hasCommon()
    method clearCommon (line 4215) | void clearCommon()
    method ensureCommon (line 4217) | Common ensureCommon()
    method hasUser (line 4224) | $core.bool hasUser()
    method clearUser (line 4226) | void clearUser()
    method ensureUser (line 4228) | User ensureUser()
    method hasShareType (line 4235) | $core.bool hasShareType()
    method clearShareType (line 4237) | void clearShareType()
    method hasAction (line 4244) | $core.bool hasAction()
    method clearAction (line 4246) | void clearAction()
    method hasShareTarget (line 4253) | $core.bool hasShareTarget()
    method clearShareTarget (line 4255) | void clearShareTarget()
    method hasFollowCount (line 4262) | $core.bool hasFollowCount()
    method clearFollowCount (line 4264) | void clearFollowCount()
    method hasPublicAreaCommon (line 4271) | $core.bool hasPublicAreaCommon()
    method clearPublicAreaCommon (line 4273) | void clearPublicAreaCommon()
    method ensurePublicAreaCommon (line 4275) | PublicAreaCommon ensurePublicAreaCommon()
  class PicoDisplayInfo (line 4278) | class PicoDisplayInfo extends $pb.GeneratedMessage {
    method clone (line 4316) | PicoDisplayInfo clone()
    method copyWith (line 4318) | PicoDisplayInfo copyWith(void Function(PicoDisplayInfo) updates)
    method create (line 4326) | PicoDisplayInfo create()
    method createEmptyInstance (line 4328) | PicoDisplayInfo createEmptyInstance()
    method getDefault (line 4330) | PicoDisplayInfo getDefault()
    method hasComboSumCount (line 4339) | $core.bool hasComboSumCount()
    method clearComboSumCount (line 4341) | void clearComboSumCount()
    method hasEmoji (line 4348) | $core.bool hasEmoji()
    method clearEmoji (line 4350) | void clearEmoji()
    method hasEmojiIcon (line 4357) | $core.bool hasEmojiIcon()
    method clearEmojiIcon (line 4359) | void clearEmojiIcon()
    method ensureEmojiIcon (line 4361) | Image ensureEmojiIcon()
    method hasEmojiText (line 4368) | $core.bool hasEmojiText()
    method clearEmojiText (line 4370) | void clearEmojiText()
  class DoubleLikeDetail (line 4373) | class DoubleLikeDetail extends $pb.GeneratedMessage {
    method clone (line 4411) | DoubleLikeDetail clone()
    method copyWith (line 4413) | DoubleLikeDetail copyWith(void Function(DoubleLikeDetail) updates)
    method create (line 4421) | DoubleLikeDetail create()
    method createEmptyInstance (line 4423) | DoubleLikeDetail createEmptyInstance()
    method getDefault (line 4425) | DoubleLikeDetail getDefault()
    method hasDoubleFlag (line 4434) | $core.bool hasDoubleFlag()
    method clearDoubleFlag (line 4436) | void clearDoubleFlag()
    method hasSeqId (line 4443) | $core.bool hasSeqId()
    method clearSeqId (line 4445) | void clearSeqId()
    method hasRenewalsNum (line 4452) | $core.bool hasRenewalsNum()
    method clearRenewalsNum (line 4454) | void clearRenewalsNum()
    method hasTriggersNum (line 4461) | $core.bool hasTriggersNum()
    method clearTriggersNum (line 4463) | void clearTriggersNum()
  class DisplayControlInfo (line 4466) | class DisplayControlInfo extends $pb.GeneratedMessage {
    method clone (line 4495) | DisplayControlInfo clone()
    method copyWith (line 4497) | DisplayControlInfo copyWith(void Function(DisplayControlInfo) updates)
    method create (line 4505) | DisplayControlInfo create()
    method createEmptyInstance (line 4507) | DisplayControlInfo createEmptyInstance()
    method getDefault (line 4509) | DisplayControlInfo getDefault()
    method hasShowText (line 4518) | $core.bool hasShowText()
    method clearShowText (line 4520) | void clearShowText()
    method hasShowIcons (line 4527) | $core.bool hasShowIcons()
    method clearShowIcons (line 4529) | void clearShowIcons()
  class EpisodeChatMessage (line 4532) | class EpisodeChatMessage extends $pb.GeneratedMessage {
    method clone (line 4582) | EpisodeChatMessage clone()
    method copyWith (line 4584) | EpisodeChatMessage copyWith(void Function(EpisodeChatMessage) updates)
    method create (line 4592) | EpisodeChatMessage create()
    method createEmptyInstance (line 4594) | EpisodeChatMessage createEmptyInstance()
    method getDefault (line 4596) | EpisodeChatMessage getDefault()
    method hasCommon (line 4605) | $core.bool hasCommon()
    method clearCommon (line 4607) | void clearCommon()
    method ensureCommon (line 4609) | Message ensureCommon()
    method hasUser (line 4616) | $core.bool hasUser()
    method clearUser (line 4618) | void clearUser()
    method ensureUser (line 4620) | User ensureUser()
    method hasContent (line 4627) | $core.bool hasContent()
    method clearContent (line 4629) | void clearContent()
    method hasVisibleToSende (line 4636) | $core.bool hasVisibleToSende()
    method clearVisibleToSende (line 4638) | void clearVisibleToSende()
    method hasGiftImage (line 4647) | $core.bool hasGiftImage()
    method clearGiftImage (line 4649) | void clearGiftImage()
    method ensureGiftImage (line 4651) | Image ensureGiftImage()
    method hasAgreeMsgId (line 4658) | $core.bool hasAgreeMsgId()
    method clearAgreeMsgId (line 4660) | void clearAgreeMsgId()
  class MatchAgainstScoreMessage (line 4666) | class MatchAgainstScoreMessage extends $pb.GeneratedMessage {
    method clone (line 4704) | MatchAgainstScoreMessage clone()
    method copyWith (line 4706) | MatchAgainstScoreMessage copyWith(
    method create (line 4715) | MatchAgainstScoreMessage create()
    method createEmptyInstance (line 4717) | MatchAgainstScoreMessage createEmptyInstance()
    method getDefault (line 4719) | MatchAgainstScoreMessage getDefault()
    method hasCommon (line 4728) | $core.bool hasCommon()
    method clearCommon (line 4730) | void clearCommon()
    method ensureCommon (line 4732) | Common ensureCommon()
    method hasAgainst (line 4739) | $core.bool hasAgainst()
    method clearAgainst (line 4741) | void clearAgainst()
    method ensureAgainst (line 4743) | Against ensureAgainst()
    method hasMatchStatus (line 4750) | $core.bool hasMatchStatus()
    method clearMatchStatus (line 4752) | void clearMatchStatus()
    method hasDisplayStatus (line 4759) | $core.bool hasDisplayStatus()
    method clearDisplayStatus (line 4761) | void clearDisplayStatus()
  class Against (line 4764) | class Against extends $pb.GeneratedMessage {
    method clone (line 4859) | Against clone()
    method copyWith (line 4861) | Against copyWith(void Function(Against) updates)
    method create (line 4868) | Against create()
    method createEmptyInstance (line 4870) | Against createEmptyInstance()
    method getDefault (line 4872) | Against getDefault()
    method hasLeftName (line 4881) | $core.bool hasLeftName()
    method clearLeftName (line 4883) | void clearLeftName()
    method hasLeftLogo (line 4890) | $core.bool hasLeftLogo()
    method clearLeftLogo (line 4892) | void clearLeftLogo()
    method ensureLeftLogo (line 4894) | Image ensureLeftLogo()
    method hasLeftGoal (line 4901) | $core.bool hasLeftGoal()
    method clearLeftGoal (line 4903) | void clearLeftGoal()
    method hasRightName (line 4912) | $core.bool hasRightName()
    method clearRightName (line 4914) | void clearRightName()
    method hasRightLogo (line 4921) | $core.bool hasRightLogo()
    method clearRightLogo (line 4923) | void clearRightLogo()
    method ensureRightLogo (line 4925) | Image ensureRightLogo()
    method hasRightGoal (line 4932) | $core.bool hasRightGoal()
    method clearRightGoal (line 4934) | void clearRightGoal()
    method hasTimestamp (line 4943) | $core.bool hasTimestamp()
    method clearTimestamp (line 4945) | void clearTimestamp()
    method hasVersion (line 4952) | $core.bool hasVersion()
    method clearVersion (line 4954) | void clearVersion()
    method hasLeftTeamId (line 4961) | $core.bool hasLeftTeamId()
    method clearLeftTeamId (line 4963) | void clearLeftTeamId()
    method hasRightTeamId (line 4970) | $core.bool hasRightTeamId()
    method clearRightTeamId (line 4972) | void clearRightTeamId()
    method hasDiffSei2absSecond (line 4979) | $core.bool hasDiffSei2absSecond()
    method clearDiffSei2absSecond (line 4981) | void clearDiffSei2absSecond()
    method hasFinalGoalStage (line 4988) | $core.bool hasFinalGoalStage()
    method clearFinalGoalStage (line 4990) | void clearFinalGoalStage()
    method hasCurrentGoalStage (line 4997) | $core.bool hasCurrentGoalStage()
    method clearCurrentGoalStage (line 4999) | void clearCurrentGoalStage()
    method hasLeftScoreAddition (line 5006) | $core.bool hasLeftScoreAddition()
    method clearLeftScoreAddition (line 5008) | void clearLeftScoreAddition()
    method hasRightScoreAddition (line 5015) | $core.bool hasRightScoreAddition()
    method clearRightScoreAddition (line 5017) | void clearRightScoreAddition()
    method hasLeftGoalInt (line 5024) | $core.bool hasLeftGoalInt()
    method clearLeftGoalInt (line 5026) | void clearLeftGoalInt()
    method hasRightGoalInt (line 5033) | $core.bool hasRightGoalInt()
    method clearRightGoalInt (line 5035) | void clearRightGoalInt()
  class Common (line 5038) | class Common extends $pb.GeneratedMessage {
    method clone (line 5150) | Common clone()
    method copyWith (line 5152) | Common copyWith(void Function(Common) updates)
    method create (line 5159) | Common create()
    method createEmptyInstance (line 5161) | Common createEmptyInstance()
    method getDefault (line 5163) | Common getDefault()
    method hasMethod (line 5172) | $core.bool hasMethod()
    method clearMethod (line 5174) | void clearMethod()
    method hasMsgId (line 5181) | $core.bool hasMsgId()
    method clearMsgId (line 5183) | void clearMsgId()
    method hasRoomId (line 5190) | $core.bool hasRoomId()
    method clearRoomId (line 5192) | void clearRoomId()
    method hasCreateTime (line 5199) | $core.bool hasCreateTime()
    method clearCreateTime (line 5201) | void clearCreateTime()
    method hasMonitor (line 5208) | $core.bool hasMonitor()
    method clearMonitor (line 5210) | void clearMonitor()
    method hasIsShowMsg (line 5217) | $core.bool hasIsShowMsg()
    method clearIsShowMsg (line 5219) | void clearIsShowMsg()
    method hasDescribe (line 5226) | $core.bool hasDescribe()
    method clearDescribe (line 5228) | void clearDescribe()
    method hasFoldType (line 5236) | $core.bool hasFoldType()
    method clearFoldType (line 5238) | void clearFoldType()
    method hasAnchorFoldType (line 5245) | $core.bool hasAnchorFoldType()
    method clearAnchorFoldType (line 5247) | void clearAnchorFoldType()
    method hasPriorityScore (line 5254) | $core.bool hasPriorityScore()
    method clearPriorityScore (line 5256) | void clearPriorityScore()
    method hasLogId (line 5263) | $core.bool hasLogId()
    method clearLogId (line 5265) | void clearLogId()
    method hasMsgProcessFilterK (line 5272) | $core.bool hasMsgProcessFilterK()
    method clearMsgProcessFilterK (line 5274) | void clearMsgProcessFilterK()
    method hasMsgProcessFilterV (line 5281) | $core.bool hasMsgProcessFilterV()
    method clearMsgProcessFilterV (line 5283) | void clearMsgProcessFilterV()
    method hasUser (line 5290) | $core.bool hasUser()
    method clearUser (line 5292) | void clearUser()
    method ensureUser (line 5294) | User ensureUser()
    method hasAnchorFoldTypeV2 (line 5302) | $core.bool hasAnchorFoldTypeV2()
    method clearAnchorFoldTypeV2 (line 5304) | void clearAnchorFoldTypeV2()
    method hasProcessAtSeiTimeMs (line 5311) | $core.bool hasProcessAtSeiTimeMs()
    method clearProcessAtSeiTimeMs (line 5313) | void clearProcessAtSeiTimeMs()
    method hasRandomDispatchMs (line 5320) | $core.bool hasRandomDispatchMs()
    method clearRandomDispatchMs (line 5322) | void clearRandomDispatchMs()
    method hasIsDispatch (line 5329) | $core.bool hasIsDispatch()
    method clearIsDispatch (line 5331) | void clearIsDispatch()
    method hasChannelId (line 5338) | $core.bool hasChannelId()
    method clearChannelId (line 5340) | void clearChannelId()
    method hasDiffSei2absSecond (line 5347) | $core.bool hasDiffSei2absSecond()
    method clearDiffSei2absSecond (line 5349) | void clearDiffSei2absSecond()
    method hasAnchorFoldDuration (line 5356) | $core.bool hasAnchorFoldDuration()
    method clearAnchorFoldDuration (line 5358) | void clearAnchorFoldDuration()
  class User (line 5361) | class User extends $pb.GeneratedMessage {
    method clone (line 5503) | User clone()
    method copyWith (line 5505) | User copyWith(void Function(User) updates)
    method create (line 5512) | User create()
    method createEmptyInstance (line 5514) | User createEmptyInstance()
    method getDefault (line 5516) | User getDefault()
    method hasId (line 5525) | $core.bool hasId()
    method clearId (line 5527) | void clearId()
    method hasShortId (line 5534) | $core.bool hasShortId()
    method clearShortId (line 5536) | void clearShortId()
    method hasNickName (line 5543) | $core.bool hasNickName()
    method clearNickName (line 5545) | void clearNickName()
    method hasGender (line 5552) | $core.bool hasGender()
    method clearGender (line 5554) | void clearGender()
    method hasSignature (line 5561) | $core.bool hasSignature()
    method clearSignature (line 5563) | void clearSignature()
    method hasLevel (line 5570) | $core.bool hasLevel()
    method clearLevel (line 5572) | void clearLevel()
    method hasBirthday (line 5579) | $core.bool hasBirthday()
    method clearBirthday (line 5581) | void clearBirthday()
    method hasTelephone (line 5588) | $core.bool hasTelephone()
    method clearTelephone (line 5590) | void clearTelephone()
    method hasAvatarThumb (line 5597) | $core.bool hasAvatarThumb()
    method clearAvatarThumb (line 5599) | void clearAvatarThumb()
    method ensureAvatarThumb (line 5601) | Image ensureAvatarThumb()
    method hasAvatarMedium (line 5608) | $core.bool hasAvatarMedium()
    method clearAvatarMedium (line 5610) | void clearAvatarMedium()
    method ensureAvatarMedium (line 5612) | Image ensureAvatarMedium()
    method hasAvatarLarge (line 5619) | $core.bool hasAvatarLarge()
    method clearAvatarLarge (line 5621) | void clearAvatarLarge()
    method ensureAvatarLarge (line 5623) | Image ensureAvatarLarge()
    method hasVerified (line 5630) | $core.bool hasVerified()
    method clearVerified (line 5632) | void clearVerified()
    method hasExperience (line 5639) | $core.bool hasExperience()
    method clearExperience (line 5641) | void clearExperience()
    method hasCity (line 5648) | $core.bool hasCity()
    method clearCity (line 5650) | void clearCity()
    method hasStatus (line 5657) | $core.bool hasStatus()
    method clearStatus (line 5659) | void clearStatus()
    method hasCreateTime (line 5666) | $core.bool has
Condensed preview — 561 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,071K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "chars": 1981,
    "preview": "name: BUG报告\ntitle: \"[BUG] 请填写简短易读的标题\"\ndescription: \"使用过程中遇到了BUG\"\nassignees: SlotSun\nlabels:\n  - \"bug\"\nbody:\n  - type: ch"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.yml",
    "chars": 1036,
    "preview": "name: 功能请求\r\ntitle: \"[Feature] 请填写简短易读的标题\"\r\ndescription: \"请求开发新的功能/优化某项功能\"\r\nassignees: SlotSun\r\nlabels:\r\n  - \"enhancement"
  },
  {
    "path": ".github/workflows/docs-deploy.yaml",
    "chars": 1350,
    "preview": "name: docs-deploy\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - 'master'\n    paths:\n      - 'docs/**'\n\n# 设置 G"
  },
  {
    "path": ".github/workflows/pr.yaml",
    "chars": 6302,
    "preview": "name: PR Check\n\non:\n  pull_request:\n    branches:\n      - main\n      - dev\n\njobs:\n  build-mac-ios-android:\n    runs-on: "
  },
  {
    "path": ".github/workflows/publish_app_dev.yaml",
    "chars": 11637,
    "preview": "name: app-build-action-dev\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - 'dev'\n\n# If previous workflow is stil"
  },
  {
    "path": ".github/workflows/publish_app_release.yml",
    "chars": 12650,
    "preview": "name: app-build-action-release\n# 推送 Tag 时触发\non:\n  workflow_dispatch: # 允许手动触发\n  push:\n    tags:\n      - \"v*\"\njobs:\n  # 打"
  },
  {
    "path": ".github/workflows/publish_tv_app_release.yaml",
    "chars": 3186,
    "preview": "name: app-tv-build-action-release\n# 手动触发\non:\n  workflow_dispatch:\njobs:\n  build-tv:\n    runs-on: macos-latest\n    permis"
  },
  {
    "path": ".gitignore",
    "chars": 164,
    "preview": "simple_live_app/.vscode/settings.json\nsimple_live_tv_app/.vscode/settings.json\n.idea/\n.vscode/\n.vercel/\n.flatpak-builder"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4085,
    "preview": "# 开发贡献指南 / Contributing Guide\n\n感谢你对 Slive 的关注!欢迎各种形式的贡献,无论是修复 bug、添加新功能、改进文档还是提出建议。\n## 贡献须知\n- 因为一些原因,**dev** 作为Github Fl"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 1729,
    "preview": "\n\n<p align=\"center\">\n    <img width=\"128\" src=\"/assets/logo.png\" alt=\"Simple Live logo\">\n</p>\n<h2 align=\"center\">Slive</"
  },
  {
    "path": "assets/app_version.json",
    "chars": 327,
    "preview": "{\n    \"version\": \"1.8.7\",\n    \"version_num\": 10807,\n    \"version_desc\": \"- 一个非常重要的过渡版本 \\n- 修复huya搜索 @GH4NG \\n- 引入Firebas"
  },
  {
    "path": "assets/tv_app_version.json",
    "chars": 187,
    "preview": "{\n    \"version\": \"1.5.0\",\n    \"version_num\": 10500,\n    \"version_desc\": \"- 永远的1.5.0\",\n    \"prerelease\":true,\n    \"downlo"
  },
  {
    "path": "assets/update-linux-metainfo.dart",
    "chars": 1703,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nString _xmlEscape(String s) => s\n    .replaceAll('&', '&amp;')\n    .replaceAll"
  },
  {
    "path": "docs/.gitignore",
    "chars": 36,
    "preview": "/node_modules\n.idea\n.vitepress/cache"
  },
  {
    "path": "docs/.vitepress/config.mts",
    "chars": 733,
    "preview": "import { defineConfig } from 'vitepress'\n\n// https://vitepress.dev/reference/site-config\nexport default defineConfig({\n "
  },
  {
    "path": "docs/README.md",
    "chars": 103,
    "preview": "# Slive Docs\n\n基于 VitePress\n\n## 部署\n\n安装依赖\n\n```shell\npnpm install\n```\n\n运行\n\n```shell\npnpm run docs:dev\n```\n"
  },
  {
    "path": "docs/contributing.md",
    "chars": 4085,
    "preview": "# 开发贡献指南 / Contributing Guide\n\n感谢你对 Slive 的关注!欢迎各种形式的贡献,无论是修复 bug、添加新功能、改进文档还是提出建议。\n## 贡献须知\n- 因为一些原因,**dev** 作为Github Fl"
  },
  {
    "path": "docs/index.md",
    "chars": 448,
    "preview": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: \"Slive Docs\"\n  text: \"我就默默看你表演"
  },
  {
    "path": "docs/package.json",
    "chars": 291,
    "preview": "{\n  \"name\": \"Slive Docs\",\n  \"version\": \"1.0.0\",\n  \"devDependencies\": {\n    \"vitepress\": \"2.0.0-alpha.15\"\n  },\n  \"scripts"
  },
  {
    "path": "docs/user.md",
    "chars": 1005,
    "preview": "# 用户指南 / User Guide\n\n# 必知必看\n## 提交问题前必知必看\n- 随着用户数增多,问题反馈数增多,作者时间有限不能逐个回复还请见谅\n- 与之伴生的是,很多人不能正确反馈问题导致作者不能明确复现并定位问题,浪费了作者有限的"
  },
  {
    "path": "flatpak/flatpak-manifest.yaml",
    "chars": 2761,
    "preview": "app-id: io.github.SlotSun.Slive\nruntime: org.freedesktop.Platform\nruntime-version: '25.08'\nsdk: org.freedesktop.Sdk\nsdk-"
  },
  {
    "path": "flatpak/libplacebo-python-3.14.patch",
    "chars": 998,
    "preview": "From 12509c0f1ee8c22ae163017f0a5e7b8a9d983a17 Mon Sep 17 00:00:00 2001\nFrom: Nicolas Chauvet <kwizart@gmail.com>\nDate: T"
  },
  {
    "path": "simple_live_app/.fvmrc",
    "chars": 25,
    "preview": "{\n  \"flutter\": \"3.38.6\"\n}"
  },
  {
    "path": "simple_live_app/.gitignore",
    "chars": 815,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.build/\n.buildlog/\n.history\n.svn/\n.swiftpm/\nmigrate_working_d"
  },
  {
    "path": "simple_live_app/.metadata",
    "chars": 966,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "simple_live_app/README.md",
    "chars": 43,
    "preview": "# simple_live_app\n\n基于核心库实现的Flutter APP客户端。\n"
  },
  {
    "path": "simple_live_app/analysis_options.yaml",
    "chars": 1593,
    "preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
  },
  {
    "path": "simple_live_app/android/.gitignore",
    "chars": 265,
    "preview": "gradle-wrapper.jar\n/app/build/\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.jav"
  },
  {
    "path": "simple_live_app/android/app/build.gradle.kts",
    "chars": 2453,
    "preview": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\nimport java.util.Properties\nimport java.io.FileInputStream\n\nplugins {\n "
  },
  {
    "path": "simple_live_app/android/app/google-services.json",
    "chars": 637,
    "preview": "{\n  \"project_info\": {\n    \"project_number\": \"000000000000\",\n    \"project_id\": \"com-slotsun-slive\",\n    \"storage_bucket\":"
  },
  {
    "path": "simple_live_app/android/app/proguard-rules.pro",
    "chars": 41,
    "preview": "-keep class org.videolan.libvlc.** { *; }"
  },
  {
    "path": "simple_live_app/android/app/src/debug/AndroidManifest.xml",
    "chars": 378,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for d"
  },
  {
    "path": "simple_live_app/android/app/src/main/AndroidManifest.xml",
    "chars": 2878,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n   <uses-permission android:name=\"android.permissi"
  },
  {
    "path": "simple_live_app/android/app/src/main/kotlin/com/slotsun/slive/MainActivity.kt",
    "chars": 119,
    "preview": "package com.slotsun.slive\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity : FlutterActivity()\n"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 339,
    "preview": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/ic_launcher_"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/drawable/ic_launcher_foreground.xml",
    "chars": 2513,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "simple_live_app/android/app/src/main/res/drawable/ic_launcher_monochrome.xml",
    "chars": 2119,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "simple_live_app/android/app/src/main/res/drawable/launch_background.xml",
    "chars": 434,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/drawable-v21/launch_background.xml",
    "chars": 438,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/values/ic_launcher_background.xml",
    "chars": 120,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#206CA1</color>\n</resources>"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/values/styles.xml",
    "chars": 1080,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/values-night/styles.xml",
    "chars": 1074,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/xml/network_security_config.xml",
    "chars": 145,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"true\" />\n</"
  },
  {
    "path": "simple_live_app/android/app/src/profile/AndroidManifest.xml",
    "chars": 378,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for d"
  },
  {
    "path": "simple_live_app/android/build.gradle.kts",
    "chars": 537,
    "preview": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nval newBuildDir: Directory =\n    rootP"
  },
  {
    "path": "simple_live_app/android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 201,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
  },
  {
    "path": "simple_live_app/android/gradle.properties",
    "chars": 166,
    "preview": "org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError\nandroid"
  },
  {
    "path": "simple_live_app/android/settings.gradle.kts",
    "chars": 992,
    "preview": "pluginManagement {\n    val flutterSdkPath =\n        run {\n            val properties = java.util.Properties()\n          "
  },
  {
    "path": "simple_live_app/assets/fonts/fonts-manifest.json",
    "chars": 27305,
    "preview": "[\n  {\n    \"id\": \"judousansui\",\n    \"name\": \"句读黑体 UI Hans\",\n    \"files\": [\n      \"judousansui/JudouSansUiHans-ExtraLight"
  },
  {
    "path": "simple_live_app/assets/io.github.SlotSun.Slive.desktop",
    "chars": 222,
    "preview": "[Desktop Entry]\nType=Application\nName=Slive\nGenericName=Livestream Player\nIcon=io.github.SlotSun.Slive\nExec=io.github.Sl"
  },
  {
    "path": "simple_live_app/assets/io.github.SlotSun.Slive.metainfo.xml",
    "chars": 2205,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop\">\n  <id>io.github.SlotSun.Slive</id>\n  <launchable type="
  },
  {
    "path": "simple_live_app/assets/io.github.SlotSun.dart_simple_live.desktop",
    "chars": 215,
    "preview": "[Desktop Entry]\nType=Application\nName=Slive\nGenericName=Livestream Player\nIcon=io.github.SlotSun.dart_simple_live\nExec=S"
  },
  {
    "path": "simple_live_app/assets/io.github.SlotSun.dart_simple_live.metainfo.xml",
    "chars": 2212,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop\">\n  <id>io.github.SlotSun.dart_simple_live</id>\n  <launc"
  },
  {
    "path": "simple_live_app/assets/lotties/empty.json",
    "chars": 9011,
    "preview": "{\"v\":\"4.7.0\",\"fr\":25,\"ip\":0,\"op\":50,\"w\":120,\"h\":120,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,"
  },
  {
    "path": "simple_live_app/assets/lotties/error.json",
    "chars": 31327,
    "preview": "{\"v\":\"5.8.1\",\"fr\":29.9700012207031,\"ip\":0,\"op\":301.000012259981,\"w\":1080,\"h\":900,\"nm\":\"Composition 1\",\"ddd\":0,\"assets\":["
  },
  {
    "path": "simple_live_app/assets/lotties/loadding.json",
    "chars": 82689,
    "preview": "{\n    \"v\": \"5.5.8\",\n    \"fr\": 50,\n    \"ip\": 0,\n    \"op\": 147,\n    \"w\": 800,\n    \"h\": 600,\n    \"nm\": \"Paperplane\",\n    \"d"
  },
  {
    "path": "simple_live_app/assets/statement.txt",
    "chars": 628,
    "preview": "在使用本软件之前,请您仔细阅读以下内容,并确保您充分理解并同意以下条款:\n1、本软件为开源软件,您可以免费获取并使用该软件。\n2、本软件完全基于您个人意愿使用,您应该对自己的使用行为和所有结果承担全部责任。\n3、本软件仅供学习交流、科研等非"
  },
  {
    "path": "simple_live_app/distribute_options.yaml",
    "chars": 19,
    "preview": "output: build/dist/"
  },
  {
    "path": "simple_live_app/flutter_rust_bridge.yaml",
    "chars": 65,
    "preview": "rust_input: crate::api\nrust_root: rust/\ndart_output: lib/src/rust"
  },
  {
    "path": "simple_live_app/integration_test/simple_test.dart",
    "chars": 529,
    "preview": "import 'package:flutter_test/flutter_test.dart';\nimport 'package:simple_live_app/main.dart';\nimport 'package:simple_live"
  },
  {
    "path": "simple_live_app/ios/.gitignore",
    "chars": 569,
    "preview": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/De"
  },
  {
    "path": "simple_live_app/ios/Flutter/AppFrameworkInfo.plist",
    "chars": 774,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "simple_live_app/ios/Flutter/Debug.xcconfig",
    "chars": 107,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/ios/Flutter/Release.xcconfig",
    "chars": 109,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/ios/Podfile",
    "chars": 2735,
    "preview": "# Uncomment this line to define a global platform for your project\nplatform :ios, '15.0'\n\n# CocoaPods analytics sends ne"
  },
  {
    "path": "simple_live_app/ios/Runner/AppDelegate.swift",
    "chars": 540,
    "preview": "import UIKit\nimport Flutter\n\n@main\n@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {\n  overri"
  },
  {
    "path": "simple_live_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2940,
    "preview": "{\n    \"images\": [\n        {\n            \"size\": \"20x20\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-20"
  },
  {
    "path": "simple_live_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "chars": 391,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "simple_live_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "chars": 336,
    "preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
  },
  {
    "path": "simple_live_app/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "chars": 2377,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "simple_live_app/ios/Runner/Base.lproj/Main.storyboard",
    "chars": 1605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "simple_live_app/ios/Runner/Info.plist",
    "chars": 2654,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "simple_live_app/ios/Runner/Runner-Bridging-Header.h",
    "chars": 38,
    "preview": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/project.pbxproj",
    "chars": 23274,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "chars": 3221,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "simple_live_app/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "chars": 224,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodepr"
  },
  {
    "path": "simple_live_app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "simple_live_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "simple_live_app/lib/app/app_style.dart",
    "chars": 6264,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/get.dart';\n\nclass Ap"
  },
  {
    "path": "simple_live_app/lib/app/constant.dart",
    "chars": 1576,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:remixicon/remixicon.dart';\n\nclass Constant {\n  static const Stri"
  },
  {
    "path": "simple_live_app/lib/app/controller/app_settings_controller.dart",
    "chars": 18357,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/g"
  },
  {
    "path": "simple_live_app/lib/app/controller/base_controller.dart",
    "chars": 2785,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/widgets.dart';\n\nimport 'package:simple_live_app/app/log.dart';\n\nimport 'pa"
  },
  {
    "path": "simple_live_app/lib/app/custom_throttle.dart",
    "chars": 707,
    "preview": "/// 这个类的目的是简化 throttle 的操作,以便更好的理解代码\n/// 主要作用:节流,如果在很短时间内都会调用同一个方法,除了第一个方法有用以外\n/// 剩下的方法将会被舍弃,在 [eachDelayMilli] 时间后,才会允"
  },
  {
    "path": "simple_live_app/lib/app/event_bus.dart",
    "chars": 929,
    "preview": "import 'dart:async';\n\nimport 'package:simple_live_app/app/log.dart';\n\n/// 全局事件\nclass EventBus {\n  /// 点击了底部导航\n  static c"
  },
  {
    "path": "simple_live_app/lib/app/log.dart",
    "chars": 4599,
    "preview": "import 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/foundation.dart';\nim"
  },
  {
    "path": "simple_live_app/lib/app/sites.dart",
    "chars": 1833,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/c"
  },
  {
    "path": "simple_live_app/lib/app/utils/archive.dart",
    "chars": 882,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:archive/archive_io.dart';\nimport 'package:path/path.dart';\n\next"
  },
  {
    "path": "simple_live_app/lib/app/utils/document.dart",
    "chars": 1284,
    "preview": "import 'dart:io';\n\nimport 'package:simple_live_app/app/log.dart';\n\n// 扩展 Directory 类,添加清空文件夹的功能并验证是否为文件夹\nextension Direc"
  },
  {
    "path": "simple_live_app/lib/app/utils/duration_2_str_utils.dart",
    "chars": 913,
    "preview": "extension DurationStringExtensions on String {\n  /// 将 \"HH:MM:SS\" 格式的字符串转换为 Duration\n  Duration toDuration() {\n    final"
  },
  {
    "path": "simple_live_app/lib/app/utils/dynamic_filter.dart",
    "chars": 4794,
    "preview": "import 'package:simple_live_app/app/log.dart';\n\n// 定义筛选条件之间的逻辑关系\nenum LogicalOperator { and, or }\n\n// 定义支持的筛选比较运算符\nenum "
  },
  {
    "path": "simple_live_app/lib/app/utils/dynamic_sort.dart",
    "chars": 738,
    "preview": "import 'package:simple_live_app/app/utils/dynamic_filter.dart';\n/// 排序条件\nclass SortCondition<T> {\n  final Comparable Fu"
  },
  {
    "path": "simple_live_app/lib/app/utils/listen_fourth_button.dart",
    "chars": 976,
    "preview": "import 'package:flutter/gestures.dart';\n\n/// 鼠标侧键点击手势识别器\n/// - https://github.com/flutter/flutter/issues/115641\n/// - ht"
  },
  {
    "path": "simple_live_app/lib/app/utils/permission_handler.dart",
    "chars": 7773,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:permission_handler_platform_interface/pe"
  },
  {
    "path": "simple_live_app/lib/app/utils/sandbox.dart",
    "chars": 361,
    "preview": "import 'dart:io';\n\n/// Returns `true` if the app is running in a sandbox, eg. Flatpak, Snap, Docker, Podman.\nbool runnin"
  },
  {
    "path": "simple_live_app/lib/app/utils/string_normalizer.dart",
    "chars": 687,
    "preview": "extension StringNormalizer on String {\n  static final Map<String, String> _toneMap = {\n    // a\n    'ā': 'a', 'á': 'a',"
  },
  {
    "path": "simple_live_app/lib/app/utils/url_parse.dart",
    "chars": 2732,
    "preview": "import 'package:dio/dio.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/l"
  },
  {
    "path": "simple_live_app/lib/app/utils.dart",
    "chars": 16095,
    "preview": "import 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/services.dart';\nimpo"
  },
  {
    "path": "simple_live_app/lib/firebase_options.dart",
    "chars": 1862,
    "preview": "import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;\nimport 'package:flutter/foundation.dart'\n    sho"
  },
  {
    "path": "simple_live_app/lib/icons/live_icons.dart",
    "chars": 1739,
    "preview": "//  This file is automatically generated. DO NOT EDIT, all your changes would be lost.\n//  https://pub.dartlang.org/pack"
  },
  {
    "path": "simple_live_app/lib/main.dart",
    "chars": 10514,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:dynamic_color/dynamic_color.dart';\nimport 'package:firebase_core"
  },
  {
    "path": "simple_live_app/lib/models/account/bilibili_user_info_page.dart",
    "chars": 1224,
    "preview": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass Bil"
  },
  {
    "path": "simple_live_app/lib/models/account/douyin_user_info.dart",
    "chars": 1052,
    "preview": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass Dou"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user.dart",
    "chars": 1906,
    "preview": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\nimport 'package:simple_live_app/app/utils/dynamic_filter"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user.g.dart",
    "chars": 1799,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'follow_user.dart';\n\n// *********************************************"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user_tag.dart",
    "chars": 872,
    "preview": "import 'package:hive/hive.dart';\n\npart 'follow_user_tag.g.dart';\n\n@HiveType(typeId: 3)\nclass FollowUserTag {\n  @HiveFiel"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user_tag.g.dart",
    "chars": 1220,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'follow_user_tag.dart';\n\n// *****************************************"
  },
  {
    "path": "simple_live_app/lib/models/db/history.dart",
    "chars": 1485,
    "preview": "import 'package:hive/hive.dart';\nimport 'package:simple_live_app/app/utils/duration_2_str_utils.dart';\nimport 'package:s"
  },
  {
    "path": "simple_live_app/lib/models/db/history.g.dart",
    "chars": 1520,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'history.dart';\n\n// *************************************************"
  },
  {
    "path": "simple_live_app/lib/models/font_model.dart",
    "chars": 1797,
    "preview": "class FontModel {\n  final String id;\n  final String name;\n  final List<String> files;\n  final String desc;\n  final Strin"
  },
  {
    "path": "simple_live_app/lib/models/fonts_model.dart",
    "chars": 327,
    "preview": "T? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\nclass FontsModel{\n  String versio"
  },
  {
    "path": "simple_live_app/lib/models/sync_client_info_model.dart",
    "chars": 954,
    "preview": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass Syn"
  },
  {
    "path": "simple_live_app/lib/models/version_model.dart",
    "chars": 926,
    "preview": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass Ver"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_controller.dart",
    "chars": 1345,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_liv"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_list_controller.dart",
    "chars": 1029,
    "preview": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:sim"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_list_view.dart",
    "chars": 4124,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_easyrefresh/easy_refresh.dart';\n\nimport 'package:get/get"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_page.dart",
    "chars": 1585,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/category/detail/category_detail_controller.dart",
    "chars": 590,
    "preview": "import 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\ni"
  },
  {
    "path": "simple_live_app/lib/modules/category/detail/category_detail_page.dart",
    "chars": 1199,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.da"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_app_setting/follow_app_settings_controller.dart",
    "chars": 9566,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'packag"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_app_setting/follow_app_settings_page.dart",
    "chars": 7926,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimpor"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_info_setting/follow_info_controller.dart",
    "chars": 6689,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_info_setting/follow_info_page.dart",
    "chars": 9267,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_info_setting/readme.md",
    "chars": 39,
    "preview": "## 关注信息管理界面\n - 修改主播名\n - 迁移直播间功能\n - 修改标签"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_user_controller.dart",
    "chars": 9271,
    "preview": "// ignore_for_file: invalid_use_of_protected_member\n\nimport 'dart:async';\n\nimport 'package:flutter/material.dart';\nimpor"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_user_page.dart",
    "chars": 7781,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_controller.dart",
    "chars": 1440,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_list_controller.dart",
    "chars": 479,
    "preview": "import 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\ni"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_list_view.dart",
    "chars": 1124,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.da"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_page.dart",
    "chars": 1670,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/indexed/indexed_controller.dart",
    "chars": 2284,
    "preview": "import 'package:flutter/widgets.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/constant.dart"
  },
  {
    "path": "simple_live_app/lib/modules/indexed/indexed_page.dart",
    "chars": 2769,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/danmu/danmaku_mask.dart",
    "chars": 7221,
    "preview": "import 'dart:async';\nimport 'dart:isolate';\nimport 'dart:math';\n\n// 通过滑动窗口、分桶、哈希去重的弹幕屏蔽器\n// 原理类似于mask,单位时间内已有弹幕占据过滤矩阵,过滤"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/live_room_controller.dart",
    "chars": 31806,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:connectivit"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/live_room_page.dart",
    "chars": 29421,
    "preview": "import 'dart:io';\n\nimport 'package:floating/floating.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/player/player_controller.dart",
    "chars": 25555,
    "preview": "import 'dart:async';\nimport 'dart:io';\nimport 'package:auto_orientation_v2/auto_orientation_v2.dart';\nimport 'package:de"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/player/player_controls.dart",
    "chars": 28063,
    "preview": "import 'dart:io';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:flutter/gestures.dart';\nimport 'p"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/account_controller.dart",
    "chars": 3070,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_ap"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/account_page.dart",
    "chars": 2641,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/qr_login_controller.dart",
    "chars": 2716,
    "preview": "import 'dart:async';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nim"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/qr_login_page.dart",
    "chars": 2815,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimpo"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/web_login_controller.dart",
    "chars": 1540,
    "preview": "import 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_l"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/web_login_page.dart",
    "chars": 1583,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package"
  },
  {
    "path": "simple_live_app/lib/modules/mine/history/history_controller.dart",
    "chars": 825,
    "preview": "import 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/utils.dart';\ni"
  },
  {
    "path": "simple_live_app/lib/modules/mine/history/history_page.dart",
    "chars": 3504,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/mine/mine_page.dart",
    "chars": 9666,
    "preview": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart'"
  },
  {
    "path": "simple_live_app/lib/modules/mine/parse/parse_controller.dart",
    "chars": 3275,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flu"
  },
  {
    "path": "simple_live_app/lib/modules/mine/parse/parse_page.dart",
    "chars": 4604,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport"
  },
  {
    "path": "simple_live_app/lib/modules/other/debug_log_page.dart",
    "chars": 1829,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:path_provider/"
  },
  {
    "path": "simple_live_app/lib/modules/search/douyin/douyin_search_controller.dart",
    "chars": 2116,
    "preview": "import 'dart:io';\n\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:get/get.dart';\nimpor"
  },
  {
    "path": "simple_live_app/lib/modules/search/douyin/douyin_search_view.dart",
    "chars": 3461,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dar"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_controller.dart",
    "chars": 2434,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_liv"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_list_controller.dart",
    "chars": 920,
    "preview": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:sim"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_list_view.dart",
    "chars": 3430,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.da"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_page.dart",
    "chars": 3443,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/settings/appstyle_settings/appstyle_setting_contorller.dart",
    "chars": 8290,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart"
  },
  {
    "path": "simple_live_app/lib/modules/settings/appstyle_settings/appstyle_setting_page.dart",
    "chars": 8668,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/settings/auto_exit_settings_page.dart",
    "chars": 2725,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/settings/danmu_settings_page.dart",
    "chars": 9974,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dar"
  },
  {
    "path": "simple_live_app/lib/modules/settings/danmu_shield/danmu_shield_controller.dart",
    "chars": 826,
    "preview": "import 'package:flutter/widgets.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:"
  },
  {
    "path": "simple_live_app/lib/modules/settings/danmu_shield/danmu_shield_page.dart",
    "chars": 2607,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/settings/indexed_settings/indexed_settings_controller.dart",
    "chars": 1059,
    "preview": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\n\nclass Inde"
  },
  {
    "path": "simple_live_app/lib/modules/settings/indexed_settings/indexed_settings_page.dart",
    "chars": 2990,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dar"
  },
  {
    "path": "simple_live_app/lib/modules/settings/other/other_settings_controller.dart",
    "chars": 7410,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:file_picker/file_pic"
  },
  {
    "path": "simple_live_app/lib/modules/settings/other/other_settings_page.dart",
    "chars": 8796,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remi"
  },
  {
    "path": "simple_live_app/lib/modules/settings/play_settings_page.dart",
    "chars": 8382,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_ap"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/device/sync_device_controller.dart",
    "chars": 3305,
    "preview": "import 'dart:convert';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:simple_live_app"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/device/sync_device_page.dart",
    "chars": 3095,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/local_sync_controller.dart",
    "chars": 4435,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.da"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/local_sync_page.dart",
    "chars": 4201,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remi"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/scan_qr/sync_scan_qr_controller.dart",
    "chars": 2214,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog."
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/scan_qr/sync_scan_qr_page.dart",
    "chars": 2797,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_code_scanner_plus/qr_code_scan"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/room/remote_sync_room_controller.dart",
    "chars": 10400,
    "preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialo"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/room/remote_sync_room_page.dart",
    "chars": 10601,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_config_page.dart",
    "chars": 6070,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flu"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_controller.dart",
    "chars": 14852,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:isolate';\nimport 'dart:typed_data';\n\nimport 'package:archive/archi"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_page.dart",
    "chars": 6567,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport"
  },
  {
    "path": "simple_live_app/lib/modules/sync/sync_page.dart",
    "chars": 2876,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package"
  },
  {
    "path": "simple_live_app/lib/requests/common_request.dart",
    "chars": 1270,
    "preview": "import 'dart:convert';\n\nimport 'package:simple_live_app/models/version_model.dart';\nimport 'package:simple_live_app/requ"
  },
  {
    "path": "simple_live_app/lib/requests/custom_log_interceptor.dart",
    "chars": 2741,
    "preview": "import 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:simple_live_app/app/log.dart';\n"
  },
  {
    "path": "simple_live_app/lib/requests/http_client.dart",
    "chars": 6266,
    "preview": "import 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:simple_live_app/requests/custom_log_interceptor.dart';"
  },
  {
    "path": "simple_live_app/lib/requests/http_error.dart",
    "chars": 780,
    "preview": "class HttpError extends Error {\n  /// 错误码\n  final int statusCode;\n\n  /// 错误信息\n  final String message;\n\n  HttpError(\n    "
  },
  {
    "path": "simple_live_app/lib/requests/sync_client_request.dart",
    "chars": 2587,
    "preview": "import 'package:simple_live_app/models/sync_client_info_model.dart';\nimport 'package:simple_live_app/requests/http_clien"
  },
  {
    "path": "simple_live_app/lib/requests/webdav_client.dart",
    "chars": 1364,
    "preview": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:webdav_cl"
  },
  {
    "path": "simple_live_app/lib/routes/app_analytics_observer.dart",
    "chars": 1055,
    "preview": "import 'package:firebase_analytics/firebase_analytics.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:s"
  },
  {
    "path": "simple_live_app/lib/routes/app_navigation.dart",
    "chars": 2598,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dar"
  },
  {
    "path": "simple_live_app/lib/routes/app_pages.dart",
    "chars": 9217,
    "preview": "// ignore_for_file: prefer_inlined_adds\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/modules/category"
  },
  {
    "path": "simple_live_app/lib/routes/route_path.dart",
    "chars": 1822,
    "preview": "/// 路由路径\nclass RoutePath {\n  /// 首页\n  static const kIndex = \"/index\";\n\n  /// 搜索\n  static const kSearch = \"/search\";\n\n  /"
  },
  {
    "path": "simple_live_app/lib/services/bilibili_account_service.dart",
    "chars": 2357,
    "preview": "import 'dart:io';\n\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:flutter_smart_dialog"
  },
  {
    "path": "simple_live_app/lib/services/core_api_service.dart",
    "chars": 2853,
    "preview": "// 用于解耦simple_live_core\n// 候选方案,目前项目强耦合core,需要逐步剥离\nimport 'package:get/get.dart';\n\n/// api:\n/// 获取All-Sites: getAllSites"
  },
  {
    "path": "simple_live_app/lib/services/db_service.dart",
    "chars": 2676,
    "preview": "import 'dart:async';\n\nimport 'package:fractional_indexing_dart/fractional_indexing_dart.dart';\nimport 'package:get/get.d"
  },
  {
    "path": "simple_live_app/lib/services/douyin_account_service.dart",
    "chars": 2381,
    "preview": "import 'dart:io';\n\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:flutter_smart_dialog"
  },
  {
    "path": "simple_live_app/lib/services/firebase_service.dart",
    "chars": 1060,
    "preview": "// only for Android\nimport 'dart:ui';\n\nimport 'package:firebase_analytics/firebase_analytics.dart';\nimport 'package:fir"
  },
  {
    "path": "simple_live_app/lib/services/follow_service.dart",
    "chars": 20827,
    "preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:file_picker/file_picker.dart';\nimport 'pa"
  }
]

// ... and 361 more files (download for full content)

About this extraction

This page contains the full source code of the SlotSun/dart_simple_live GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 561 files (2.7 MB), approximately 744.3k tokens, and a symbol index with 3656 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!